[{"data":1,"prerenderedAt":7865},["ShallowReactive",2],{"wiki-notes":3},[4,208,224,2229,3719,3871],{"id":5,"title":6,"body":7,"category":195,"date":196,"description":197,"draft":198,"extension":199,"featured":198,"meta":200,"navigation":201,"path":202,"seo":203,"stem":204,"tags":205,"type":206,"__hash__":207},"content\u002Fwiki\u002Fai-agent\u002Fclaude-code-install.md","Claude Code Install",{"type":8,"value":9,"toc":191},"minimark",[10,14,31,36,39,73,76,162,166,175,178,187],[11,12,13],"p",{},"资料",[15,16,17],"blockquote",{},[11,18,19,26],{},[20,21,25],"a",{"href":22,"rel":23},"https:\u002F\u002Fwww.runoob.com\u002Fclaude-code\u002Fclaude-code-install.html",[24],"nofollow","菜鸟教程 - Claude Code 安装",[20,27,30],{"href":28,"rel":29},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fzh-CN\u002Fquickstart#native-install-recommended",[24],"Claude Code 官方文档 - 快速开始",[32,33,35],"h2",{"id":34},"一安装-claude","一、安装 claude",[11,37,38],{},"使用官方命令行安装",[40,41,46],"pre",{"className":42,"code":43,"language":44,"meta":45,"style":45},"language-bash shiki shiki-themes github-light github-dark","curl -fsSL https:\u002F\u002Fclaude.ai\u002Finstall.sh | bash\n","bash","",[47,48,49],"code",{"__ignoreMap":45},[50,51,54,58,62,66,70],"span",{"class":52,"line":53},"line",1,[50,55,57],{"class":56},"sScJk","curl",[50,59,61],{"class":60},"sj4cs"," -fsSL",[50,63,65],{"class":64},"sZZnC"," https:\u002F\u002Fclaude.ai\u002Finstall.sh",[50,67,69],{"class":68},"szBVR"," |",[50,71,72],{"class":56}," bash\n",[11,74,75],{},"安装完成后若使用fish,需要添加`PATH",[40,77,79],{"className":42,"code":78,"language":44,"meta":45,"style":45},"# install path\nls ~\u002F.local\u002Fbin\n# add claude path to fish\nfish_add_path ~\u002F.local\u002Fbin\n# update fish\nsource ~\u002F.config\u002Ffish\u002Fconfig.fish\n#check version\nclaude --version\n#显示\n2.1.150 (Claude Code)\n",[47,80,81,87,96,102,110,116,125,131,140,146],{"__ignoreMap":45},[50,82,83],{"class":52,"line":53},[50,84,86],{"class":85},"sJ8bj","# install path\n",[50,88,90,93],{"class":52,"line":89},2,[50,91,92],{"class":56},"ls",[50,94,95],{"class":64}," ~\u002F.local\u002Fbin\n",[50,97,99],{"class":52,"line":98},3,[50,100,101],{"class":85},"# add claude path to fish\n",[50,103,105,108],{"class":52,"line":104},4,[50,106,107],{"class":56},"fish_add_path",[50,109,95],{"class":64},[50,111,113],{"class":52,"line":112},5,[50,114,115],{"class":85},"# update fish\n",[50,117,119,122],{"class":52,"line":118},6,[50,120,121],{"class":60},"source",[50,123,124],{"class":64}," ~\u002F.config\u002Ffish\u002Fconfig.fish\n",[50,126,128],{"class":52,"line":127},7,[50,129,130],{"class":85},"#check version\n",[50,132,134,137],{"class":52,"line":133},8,[50,135,136],{"class":56},"claude",[50,138,139],{"class":60}," --version\n",[50,141,143],{"class":52,"line":142},9,[50,144,145],{"class":85},"#显示\n",[50,147,149,152,156,159],{"class":52,"line":148},10,[50,150,151],{"class":56},"2.1.150",[50,153,155],{"class":154},"sVt8B"," (Claude ",[50,157,158],{"class":64},"Code",[50,160,161],{"class":154},")\n",[32,163,165],{"id":164},"安装cc-switch","安装CC switch",[15,167,168],{},[11,169,170],{},[20,171,174],{"href":172,"rel":173},"https:\u002F\u002Fccswitch.io\u002Fzh\u002F",[24],"CC Switch 官网",[11,176,177],{},"deepseek接入cc",[15,179,180],{},[11,181,182],{},[20,183,186],{"href":184,"rel":185},"https:\u002F\u002Fapi-docs.deepseek.com\u002Fzh-cn\u002Fquick_start\u002Fagent_integrations\u002Fclaude_code",[24],"DeepSeek API 文档 - Claude Code 集成",[188,189,190],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":45,"searchDepth":104,"depth":104,"links":192},[193,194],{"id":34,"depth":89,"text":35},{"id":164,"depth":89,"text":165},"AI Agent","2026-08-01","安装Claude Code 简易方式",false,"md",{},true,"\u002Fwiki\u002Fai-agent\u002Fclaude-code-install",{"title":6,"description":197},"wiki\u002Fai-agent\u002Fclaude-code-install",[195],"wiki","wFuq035X-fOKCL1To6aFxYsDdbGqlfD3LI4AO2_wi4c",{"id":209,"title":210,"body":211,"category":215,"date":216,"description":217,"draft":198,"extension":199,"featured":198,"meta":218,"navigation":201,"path":219,"seo":220,"stem":221,"tags":222,"type":206,"__hash__":223},"content\u002Fwiki\u002Flinux\u002Fgit-6d8bf7c.md","Git使用方法",{"type":8,"value":212,"toc":213},[],{"title":45,"searchDepth":104,"depth":104,"links":214},[],"Linux","2026-08-19","Git仓库的简单使用方法",{},"\u002Fwiki\u002Flinux\u002Fgit-6d8bf7c",{"title":210,"description":217},"wiki\u002Flinux\u002Fgit-6d8bf7c",[215],"LbyDd4lBEpIhIw8HOPEWR3dv9Gwr1ADtIN7FuMigvIE",{"id":225,"title":226,"body":227,"category":215,"date":196,"description":2222,"draft":198,"extension":199,"featured":198,"meta":2223,"navigation":201,"path":2224,"seo":2225,"stem":2226,"tags":2227,"type":206,"__hash__":2228},"content\u002Fwiki\u002Flinux\u002Flinux-1f4000d.md","我的Linux踩坑记",{"type":8,"value":228,"toc":2186},[229,235,240,247,250,253,259,263,266,270,338,342,410,416,420,426,430,437,441,444,451,487,491,511,516,630,635,638,641,648,683,686,1179,1183,1208,1213,1218,1221,1227,1234,1237,1243,1248,1250,1253,1258,1262,1266,1273,1277,1284,1288,1294,1378,1384,1387,1391,1397,1400,1404,1774,1778,1817,1914,1954,1958,1962,1966,1978,1981,1987,1992,1995,2032,2034,2065,2069,2076,2080,2084,2096,2183],[32,230,232],{"id":231},"kubuntu系列",[233,234,231],"strong",{},[236,237,239],"h3",{"id":238},"_1安装软件","1.安装软件",[11,241,242],{},[243,244],"img",{"alt":245,"src":246},"738","https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=NzBhYzgzOTMwOTBlYjViZjM5Mzk2MWNhZTBhNDRhMzRfWHp2Q3RqYU1wUWUzZmo4Skk5Njk4c2Q3WGQ4ZVcyTklfVG9rZW46Q3piUWJGQmJTb3RoYUN4QnpqTmNwRUVqbmJoXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[11,248,249],{},"用 gdebi-gtk",[11,251,252],{},"卸载软件：",[11,254,255],{},[243,256],{"alt":257,"src":258},"612","https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=NjY2MjJiMTczNWY0NWUwZTNkMWU1NDU2OWNmODYzYjNfdTBQWmZPZ3VtVDU4WG1XaGZpSGVFN2pDRUpXaG9oRHVfVG9rZW46TXBDbWJVbVBnb2pEVHp4bHRVaWMzQ0JGbjRBXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[236,260,262],{"id":261},"_2代理问题","2.代理问题",[11,264,265],{},"（clash开隧道模式，记得开服务模式，直接解决）",[236,267,269],{"id":268},"_3root权限访问文件夹","3.root权限访问文件夹",[40,271,275],{"className":272,"code":273,"language":274,"meta":45,"style":45},"language-Bash shiki shiki-themes github-light github-dark","sudo nautilus\n#更改root密码：\nsudo passwd root\n#进入root：\nsu -    \n#输入密码：666    \n#退出root：\nsu user_name\nexit\n","Bash",[47,276,277,285,290,300,305,316,321,326,333],{"__ignoreMap":45},[50,278,279,282],{"class":52,"line":53},[50,280,281],{"class":56},"sudo",[50,283,284],{"class":64}," nautilus\n",[50,286,287],{"class":52,"line":89},[50,288,289],{"class":85},"#更改root密码：\n",[50,291,292,294,297],{"class":52,"line":98},[50,293,281],{"class":56},[50,295,296],{"class":64}," passwd",[50,298,299],{"class":64}," root\n",[50,301,302],{"class":52,"line":104},[50,303,304],{"class":85},"#进入root：\n",[50,306,307,310,313],{"class":52,"line":112},[50,308,309],{"class":56},"su",[50,311,312],{"class":64}," -",[50,314,315],{"class":154},"    \n",[50,317,318],{"class":52,"line":118},[50,319,320],{"class":85},"#输入密码：666    \n",[50,322,323],{"class":52,"line":127},[50,324,325],{"class":85},"#退出root：\n",[50,327,328,330],{"class":52,"line":133},[50,329,309],{"class":56},[50,331,332],{"class":64}," user_name\n",[50,334,335],{"class":52,"line":142},[50,336,337],{"class":60},"exit\n",[236,339,341],{"id":340},"_4linux安装vmware","4.linux安装VMware",[40,343,345],{"className":272,"code":344,"language":274,"meta":45,"style":45},"##安装依赖\nsudo apt update \nsudo apt install build-essential linux-headers-generic\n##从官网下载软件包\n##安装VMware\nchmod +x VMware-Workstation-Full-17.5.1-23298084.x86_64.bundle \nsudo .\u002FVMware-Workstation-Full-17.5.1-23298084.x86_64.bundle\n",[47,346,347,352,365,380,385,390,403],{"__ignoreMap":45},[50,348,349],{"class":52,"line":53},[50,350,351],{"class":85},"##安装依赖\n",[50,353,354,356,359,362],{"class":52,"line":89},[50,355,281],{"class":56},[50,357,358],{"class":64}," apt",[50,360,361],{"class":64}," update",[50,363,364],{"class":154}," \n",[50,366,367,369,371,374,377],{"class":52,"line":98},[50,368,281],{"class":56},[50,370,358],{"class":64},[50,372,373],{"class":64}," install",[50,375,376],{"class":64}," build-essential",[50,378,379],{"class":64}," linux-headers-generic\n",[50,381,382],{"class":52,"line":104},[50,383,384],{"class":85},"##从官网下载软件包\n",[50,386,387],{"class":52,"line":112},[50,388,389],{"class":85},"##安装VMware\n",[50,391,392,395,398,401],{"class":52,"line":118},[50,393,394],{"class":56},"chmod",[50,396,397],{"class":64}," +x",[50,399,400],{"class":64}," VMware-Workstation-Full-17.5.1-23298084.x86_64.bundle",[50,402,364],{"class":154},[50,404,405,407],{"class":52,"line":127},[50,406,281],{"class":56},[50,408,409],{"class":64}," .\u002FVMware-Workstation-Full-17.5.1-23298084.x86_64.bundle\n",[11,411,412],{},[243,413],{"alt":414,"src":415},"597","https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=NGRhMTA3NDEyYmU4YzgwNmIwYTQ0N2U2OWMyOGMwZTVfVWw4dDlscXUybzIyampNWHdGZzJWbFBzT3lXR1BlUWNfVG9rZW46WWc1NWI5YmZRb202UWp4ejJpTWN3QXpSbklkXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[236,417,419],{"id":418},"_5串口助手","5.串口助手",[11,421,422],{},[243,423],{"alt":424,"src":425},"601","https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=YjJmODg0NTFiMzE5MWNhNjEzM2UwMDhhZTU1NDUwNDJfeWlWR2RGeDRPelk4RmJtRnA0SmdCS2llazRNNms1cXFfVG9rZW46VmNGNWI2Z2Jmb3VlS3N4UnZHWmNMZ3AwbjVnXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[236,427,429],{"id":428},"_6kubuntu2404-lts无法安装clash缺少依赖的问题","6.kubuntu24.04 LTS无法安装clash，缺少依赖的问题",[11,431,432,433],{},"使用以下网站解决问题：",[20,434,435],{"href":435,"rel":436},"https:\u002F\u002Fwww.clashverge.dev\u002Ffaq\u002Flinux.html",[24],[236,438,440],{"id":439},"_7安装显卡驱动之后亮度调节问题","7.安装显卡驱动之后亮度调节问题",[11,442,443],{},"1.按照学长的方法更改xorg无效",[11,445,446,447,450],{},"2.安装 ",[47,448,449],{},"xbacklight","：（有效）",[40,452,454],{"className":272,"code":453,"language":274,"meta":45,"style":45},"#安装\nsudo apt install xbacklight\n#设置调节亮度\nxbacklight -set 50\n",[47,455,456,461,472,477],{"__ignoreMap":45},[50,457,458],{"class":52,"line":53},[50,459,460],{"class":85},"#安装\n",[50,462,463,465,467,469],{"class":52,"line":89},[50,464,281],{"class":56},[50,466,358],{"class":64},[50,468,373],{"class":64},[50,470,471],{"class":64}," xbacklight\n",[50,473,474],{"class":52,"line":98},[50,475,476],{"class":85},"#设置调节亮度\n",[50,478,479,481,484],{"class":52,"line":104},[50,480,449],{"class":56},[50,482,483],{"class":60}," -set",[50,485,486],{"class":60}," 50\n",[236,488,490],{"id":489},"_8kubuntu2404-windows硬盘分区挂载失败问题","8.kubuntu24.04 windows硬盘分区挂载失败问题：",[40,492,494],{"className":272,"code":493,"language":274,"meta":45,"style":45},"#查找有哪些分区\nsudo fdisk -l\n",[47,495,496,501],{"__ignoreMap":45},[50,497,498],{"class":52,"line":53},[50,499,500],{"class":85},"#查找有哪些分区\n",[50,502,503,505,508],{"class":52,"line":89},[50,504,281],{"class":56},[50,506,507],{"class":64}," fdisk",[50,509,510],{"class":60}," -l\n",[11,512,513],{},[243,514],{"alt":45,"src":515},"https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=NTQ1YmI1NjllOGQ0NzAyMDVkYmYwNTJiZDA5YjgyODVfanZFTXc3WldpcEdQNThhOGkwcGdNVGtXbjU0Z1hxQ3BfVG9rZW46THp1M2JtZjE5b3lWTHp4SVdWZGNDbHVWbmlkXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[40,517,519],{"className":272,"code":518,"language":274,"meta":45,"style":45},"#使用以下命令来修复文件系统，如果是 ntfs 文件系统，可以使用以下命令\nsudo ntfsfix \u002Fdev\u002Fnvme0n1p4\n#确保你安装了正确的文件系统支持工具。例如，如果文件系统是 ntfs，需要安装 ntfs-3g\nsudo apt install ntfs-3g\n#完成上述步骤后，尝试重新挂载分区\n#分区一般挂载在media\u002Fxiaofangtongxue目录下，先创建挂载文件夹\nsudo mkdir -p \"\u002Fmedia\u002Fxiaofangtongxue\u002FText and Game\"\n#尝试挂载\nsudo mount \u002Fdev\u002Fnvme0n1p4 \"\u002Fmedia\u002Fxiaofangtongxue\u002FText and Game\"\n#检查是否挂载\ndf -h | grep \"\u002Fmedia\u002Fxiaofangtongxue\u002FText and Game\"\n#取消挂载\nsudo umount \u002Fmedia\u002Fxiaofangtongxue\u002FWIN_C\n",[47,520,521,526,536,541,552,557,562,575,580,592,597,613,619],{"__ignoreMap":45},[50,522,523],{"class":52,"line":53},[50,524,525],{"class":85},"#使用以下命令来修复文件系统，如果是 ntfs 文件系统，可以使用以下命令\n",[50,527,528,530,533],{"class":52,"line":89},[50,529,281],{"class":56},[50,531,532],{"class":64}," ntfsfix",[50,534,535],{"class":64}," \u002Fdev\u002Fnvme0n1p4\n",[50,537,538],{"class":52,"line":98},[50,539,540],{"class":85},"#确保你安装了正确的文件系统支持工具。例如，如果文件系统是 ntfs，需要安装 ntfs-3g\n",[50,542,543,545,547,549],{"class":52,"line":104},[50,544,281],{"class":56},[50,546,358],{"class":64},[50,548,373],{"class":64},[50,550,551],{"class":64}," ntfs-3g\n",[50,553,554],{"class":52,"line":112},[50,555,556],{"class":85},"#完成上述步骤后，尝试重新挂载分区\n",[50,558,559],{"class":52,"line":118},[50,560,561],{"class":85},"#分区一般挂载在media\u002Fxiaofangtongxue目录下，先创建挂载文件夹\n",[50,563,564,566,569,572],{"class":52,"line":127},[50,565,281],{"class":56},[50,567,568],{"class":64}," mkdir",[50,570,571],{"class":60}," -p",[50,573,574],{"class":64}," \"\u002Fmedia\u002Fxiaofangtongxue\u002FText and Game\"\n",[50,576,577],{"class":52,"line":133},[50,578,579],{"class":85},"#尝试挂载\n",[50,581,582,584,587,590],{"class":52,"line":142},[50,583,281],{"class":56},[50,585,586],{"class":64}," mount",[50,588,589],{"class":64}," \u002Fdev\u002Fnvme0n1p4",[50,591,574],{"class":64},[50,593,594],{"class":52,"line":148},[50,595,596],{"class":85},"#检查是否挂载\n",[50,598,600,603,606,608,611],{"class":52,"line":599},11,[50,601,602],{"class":56},"df",[50,604,605],{"class":60}," -h",[50,607,69],{"class":68},[50,609,610],{"class":56}," grep",[50,612,574],{"class":64},[50,614,616],{"class":52,"line":615},12,[50,617,618],{"class":85},"#取消挂载\n",[50,620,622,624,627],{"class":52,"line":621},13,[50,623,281],{"class":56},[50,625,626],{"class":64}," umount",[50,628,629],{"class":64}," \u002Fmedia\u002Fxiaofangtongxue\u002FWIN_C\n",[11,631,632],{},[243,633],{"alt":45,"src":634},"https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=MGYxYmQ4M2ZkNmY2NDVkNzQ2ZDk3MzZmMzhkMmU3MTVfR1N6eTYybUtxTkxSdDBibmlsb1o5Y01uSHhpWXRwbHBfVG9rZW46SzBoRmJOcWx1b0dUaER4bUVWQWNSYnVobk9QXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[11,636,637],{},"挂载成功！！！",[11,639,640],{},"但是此时每次开机时磁盘需要重新挂载，解决方法如下：",[11,642,643,644,647],{},"要使分区在每次启动时自动挂载，可以通过编辑 ",[47,645,646],{},"\u002Fetc\u002Ffstab"," 文件来实现。请按以下步骤操作：",[40,649,651],{"className":272,"code":650,"language":274,"meta":45,"style":45},"#使用以下命令获取分区的 UUID：\nsudo blkid \u002Fdev\u002Fnvme1n1p4\nsudo vim \u002Fetc\u002Ffstab\n#更改   UUID=xxxx-xxxx  \u002Fmedia\u002Fxiaofangtongxue\u002FText\\040and\\040Game  ntfs  defaults,rw  0  0\n",[47,652,653,658,668,678],{"__ignoreMap":45},[50,654,655],{"class":52,"line":53},[50,656,657],{"class":85},"#使用以下命令获取分区的 UUID：\n",[50,659,660,662,665],{"class":52,"line":89},[50,661,281],{"class":56},[50,663,664],{"class":64}," blkid",[50,666,667],{"class":64}," \u002Fdev\u002Fnvme1n1p4\n",[50,669,670,672,675],{"class":52,"line":98},[50,671,281],{"class":56},[50,673,674],{"class":64}," vim",[50,676,677],{"class":64}," \u002Fetc\u002Ffstab\n",[50,679,680],{"class":52,"line":104},[50,681,682],{"class":85},"#更改   UUID=xxxx-xxxx  \u002Fmedia\u002Fxiaofangtongxue\u002FText\\040and\\040Game  ntfs  defaults,rw  0  0\n",[11,684,685],{},"挂载成功后但是无法写入文件只可以读取，解决方法如下：",[40,687,689],{"className":272,"code":688,"language":274,"meta":45,"style":45},"#取消分区挂载\nsudo umount \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Game\n#出现错误，发现被占用\numount: \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Game: target is busy.\nlsof +D \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Game    #列出正在运行的文件\n\nCOMMAND    PID            USER   FD   TYPE DEVICE SIZE\u002FOFF  NODE NAME \nwpsclouds 3437 xiaofangtongxue  cwd    DIR  259,7     4096 90582 \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Game\u002FAA_study\n_resource\u002FC++\u002F24二纳作业\u002F第一次考核\n\n#使用keil杀死\nkill -9 3437\nlsof +D \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Game    #什么都不出现极为正确\n#继续挂载\nsudo mount -t ntfs-3g -o rw \u002Fdev\u002Fnvme0n1p4 \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Ga\nme\n\n#出现问题\nThe disk contains an unclean file system (0, 0). \nMetadata kept in Windows cache, refused to mount. \nFalling back to read-only mount because the NTFS partition is in an \nunsafe state. Please resume and shutdown Windows fully (no hibernation \nor fast restarting.) \nCould not mount read-write, trying read-only\n\nsudo ntfsfix \u002Fdev\u002Fnvme0n1p4    #进行修复\nNTFS partition \u002Fdev\u002Fnvme0n1p4 was processed successfully.     #完成\n\nsudo mount -t ntfs-3g -o rw \u002Fdev\u002Fnvme0n1p4 \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Ga\nme                                  #重新挂载，实现读写功能\nmount | grep nvme0n1p4              #检查挂载\n\u002Fdev\u002Fnvme0n1p4 on \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Game type fuseblk (rw,relatime,user_id=0,group_id=0,allow_ot\nher,blksize=4096)                   #正确使用\n",[47,690,691,696,705,710,727,741,746,777,806,811,815,820,831,842,848,872,878,883,889,922,951,987,1021,1036,1056,1061,1073,1095,1100,1119,1128,1144,1164],{"__ignoreMap":45},[50,692,693],{"class":52,"line":53},[50,694,695],{"class":85},"#取消分区挂载\n",[50,697,698,700,702],{"class":52,"line":89},[50,699,281],{"class":56},[50,701,626],{"class":64},[50,703,704],{"class":64}," \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Game\n",[50,706,707],{"class":52,"line":98},[50,708,709],{"class":85},"#出现错误，发现被占用\n",[50,711,712,715,718,721,724],{"class":52,"line":104},[50,713,714],{"class":56},"umount:",[50,716,717],{"class":64}," \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Game:",[50,719,720],{"class":64}," target",[50,722,723],{"class":64}," is",[50,725,726],{"class":64}," busy.\n",[50,728,729,732,735,738],{"class":52,"line":112},[50,730,731],{"class":56},"lsof",[50,733,734],{"class":64}," +D",[50,736,737],{"class":64}," \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Game",[50,739,740],{"class":85},"    #列出正在运行的文件\n",[50,742,743],{"class":52,"line":118},[50,744,745],{"emptyLinePlaceholder":201},"\n",[50,747,748,751,754,757,760,763,766,769,772,775],{"class":52,"line":127},[50,749,750],{"class":56},"COMMAND",[50,752,753],{"class":64},"    PID",[50,755,756],{"class":64},"            USER",[50,758,759],{"class":64},"   FD",[50,761,762],{"class":64},"   TYPE",[50,764,765],{"class":64}," DEVICE",[50,767,768],{"class":64}," SIZE\u002FOFF",[50,770,771],{"class":64},"  NODE",[50,773,774],{"class":64}," NAME",[50,776,364],{"class":154},[50,778,779,782,785,788,791,794,797,800,803],{"class":52,"line":133},[50,780,781],{"class":56},"wpsclouds",[50,783,784],{"class":60}," 3437",[50,786,787],{"class":64}," xiaofangtongxue",[50,789,790],{"class":64},"  cwd",[50,792,793],{"class":64},"    DIR",[50,795,796],{"class":64},"  259,7",[50,798,799],{"class":60},"     4096",[50,801,802],{"class":60}," 90582",[50,804,805],{"class":64}," \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Game\u002FAA_study\n",[50,807,808],{"class":52,"line":142},[50,809,810],{"class":56},"_resource\u002FC++\u002F24二纳作业\u002F第一次考核\n",[50,812,813],{"class":52,"line":148},[50,814,745],{"emptyLinePlaceholder":201},[50,816,817],{"class":52,"line":599},[50,818,819],{"class":85},"#使用keil杀死\n",[50,821,822,825,828],{"class":52,"line":615},[50,823,824],{"class":60},"kill",[50,826,827],{"class":60}," -9",[50,829,830],{"class":60}," 3437\n",[50,832,833,835,837,839],{"class":52,"line":621},[50,834,731],{"class":56},[50,836,734],{"class":64},[50,838,737],{"class":64},[50,840,841],{"class":85},"    #什么都不出现极为正确\n",[50,843,845],{"class":52,"line":844},14,[50,846,847],{"class":85},"#继续挂载\n",[50,849,851,853,855,858,861,864,867,869],{"class":52,"line":850},15,[50,852,281],{"class":56},[50,854,586],{"class":64},[50,856,857],{"class":60}," -t",[50,859,860],{"class":64}," ntfs-3g",[50,862,863],{"class":60}," -o",[50,865,866],{"class":64}," rw",[50,868,589],{"class":64},[50,870,871],{"class":64}," \u002Fmedia\u002Fxiaofangtongxue\u002FText_and_Ga\n",[50,873,875],{"class":52,"line":874},16,[50,876,877],{"class":56},"me\n",[50,879,881],{"class":52,"line":880},17,[50,882,745],{"emptyLinePlaceholder":201},[50,884,886],{"class":52,"line":885},18,[50,887,888],{"class":85},"#出现问题\n",[50,890,892,895,898,901,904,907,910,913,916,919],{"class":52,"line":891},19,[50,893,894],{"class":56},"The",[50,896,897],{"class":64}," disk",[50,899,900],{"class":64}," contains",[50,902,903],{"class":64}," an",[50,905,906],{"class":64}," unclean",[50,908,909],{"class":64}," file",[50,911,912],{"class":64}," system",[50,914,915],{"class":154}," (0, ",[50,917,918],{"class":60},"0",[50,920,921],{"class":154},"). \n",[50,923,925,928,931,934,937,940,943,946,949],{"class":52,"line":924},20,[50,926,927],{"class":56},"Metadata",[50,929,930],{"class":64}," kept",[50,932,933],{"class":64}," in",[50,935,936],{"class":64}," Windows",[50,938,939],{"class":64}," cache,",[50,941,942],{"class":64}," refused",[50,944,945],{"class":64}," to",[50,947,948],{"class":64}," mount.",[50,950,364],{"class":154},[50,952,954,957,960,962,965,967,970,973,976,979,981,983,985],{"class":52,"line":953},21,[50,955,956],{"class":56},"Falling",[50,958,959],{"class":64}," back",[50,961,945],{"class":64},[50,963,964],{"class":64}," read-only",[50,966,586],{"class":64},[50,968,969],{"class":64}," because",[50,971,972],{"class":64}," the",[50,974,975],{"class":64}," NTFS",[50,977,978],{"class":64}," partition",[50,980,723],{"class":64},[50,982,933],{"class":64},[50,984,903],{"class":64},[50,986,364],{"class":154},[50,988,990,993,996,999,1002,1005,1008,1010,1013,1016,1019],{"class":52,"line":989},22,[50,991,992],{"class":56},"unsafe",[50,994,995],{"class":64}," state.",[50,997,998],{"class":64}," Please",[50,1000,1001],{"class":64}," resume",[50,1003,1004],{"class":64}," and",[50,1006,1007],{"class":64}," shutdown",[50,1009,936],{"class":64},[50,1011,1012],{"class":64}," fully",[50,1014,1015],{"class":154}," (no ",[50,1017,1018],{"class":64},"hibernation",[50,1020,364],{"class":154},[50,1022,1024,1027,1030,1033],{"class":52,"line":1023},23,[50,1025,1026],{"class":56},"or",[50,1028,1029],{"class":64}," fast",[50,1031,1032],{"class":64}," restarting.",[50,1034,1035],{"class":154},") \n",[50,1037,1039,1042,1045,1047,1050,1053],{"class":52,"line":1038},24,[50,1040,1041],{"class":56},"Could",[50,1043,1044],{"class":64}," not",[50,1046,586],{"class":64},[50,1048,1049],{"class":64}," read-write,",[50,1051,1052],{"class":64}," trying",[50,1054,1055],{"class":64}," read-only\n",[50,1057,1059],{"class":52,"line":1058},25,[50,1060,745],{"emptyLinePlaceholder":201},[50,1062,1064,1066,1068,1070],{"class":52,"line":1063},26,[50,1065,281],{"class":56},[50,1067,532],{"class":64},[50,1069,589],{"class":64},[50,1071,1072],{"class":85},"    #进行修复\n",[50,1074,1076,1079,1081,1083,1086,1089,1092],{"class":52,"line":1075},27,[50,1077,1078],{"class":56},"NTFS",[50,1080,978],{"class":64},[50,1082,589],{"class":64},[50,1084,1085],{"class":64}," was",[50,1087,1088],{"class":64}," processed",[50,1090,1091],{"class":64}," successfully.",[50,1093,1094],{"class":85},"     #完成\n",[50,1096,1098],{"class":52,"line":1097},28,[50,1099,745],{"emptyLinePlaceholder":201},[50,1101,1103,1105,1107,1109,1111,1113,1115,1117],{"class":52,"line":1102},29,[50,1104,281],{"class":56},[50,1106,586],{"class":64},[50,1108,857],{"class":60},[50,1110,860],{"class":64},[50,1112,863],{"class":60},[50,1114,866],{"class":64},[50,1116,589],{"class":64},[50,1118,871],{"class":64},[50,1120,1122,1125],{"class":52,"line":1121},30,[50,1123,1124],{"class":56},"me",[50,1126,1127],{"class":85},"                                  #重新挂载，实现读写功能\n",[50,1129,1131,1134,1136,1138,1141],{"class":52,"line":1130},31,[50,1132,1133],{"class":56},"mount",[50,1135,69],{"class":68},[50,1137,610],{"class":56},[50,1139,1140],{"class":64}," nvme0n1p4",[50,1142,1143],{"class":85},"              #检查挂载\n",[50,1145,1147,1150,1153,1155,1158,1161],{"class":52,"line":1146},32,[50,1148,1149],{"class":56},"\u002Fdev\u002Fnvme0n1p4",[50,1151,1152],{"class":64}," on",[50,1154,737],{"class":64},[50,1156,1157],{"class":64}," type",[50,1159,1160],{"class":64}," fuseblk",[50,1162,1163],{"class":154}," (rw,relatime,user_id=0,group_id=0,allow_ot\n",[50,1165,1167,1170,1173,1176],{"class":52,"line":1166},33,[50,1168,1169],{"class":56},"her,blksize",[50,1171,1172],{"class":64},"=4096",[50,1174,1175],{"class":154},")                   ",[50,1177,1178],{"class":85},"#正确使用\n",[236,1180,1182],{"id":1181},"_9qq音乐在kubuntu2404闪退问题","9.QQ音乐在kubuntu24.04闪退问题",[40,1184,1186],{"className":272,"code":1185,"language":274,"meta":45,"style":45},"sudo vi \u002Fusr\u002Fshare\u002Fapplications\u002Fqqmusic.desktop\n#找到Exec=\u002Fopt\u002Fqqmusic\u002Fqqmusic %U\n#在后面加上--no-sandbox\n",[47,1187,1188,1198,1203],{"__ignoreMap":45},[50,1189,1190,1192,1195],{"class":52,"line":53},[50,1191,281],{"class":56},[50,1193,1194],{"class":64}," vi",[50,1196,1197],{"class":64}," \u002Fusr\u002Fshare\u002Fapplications\u002Fqqmusic.desktop\n",[50,1199,1200],{"class":52,"line":89},[50,1201,1202],{"class":85},"#找到Exec=\u002Fopt\u002Fqqmusic\u002Fqqmusic %U\n",[50,1204,1205],{"class":52,"line":98},[50,1206,1207],{"class":85},"#在后面加上--no-sandbox\n",[11,1209,1210],{},[243,1211],{"alt":45,"src":1212},"https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=NmI4OTVmZDIyMjJjOTE4NTE1OGE3ZDViNjc1MDRkNGVfb3JWM01wRkRKVm1rZTFZT3dKRmhuRmZmbHRoTDBiUjlfVG9rZW46Q0xZUmJxQlpXb0tvNW94bXJRSWNRcFkybmNnXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[11,1214,1215],{},[243,1216],{"alt":45,"src":1217},"https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=NGI4NjVjZTZhN2I4NGIzY2RlMjFiYTQ2NTM1ZGFlYTJfTEl6UllIb3VJYkhJZ1JzcmUyQlVNZ3drQ3lzMjNQNHBfVG9rZW46R29WbmJwc1Nib0ZTQXV4c0xsQmNKRGp3bjZmXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[11,1219,1220],{},"成功解决！",[236,1222,1224],{"id":1223},"_10-权限不足导致无法访问",[233,1225,1226],{},"10. 权限不足导致无法访问",[1228,1229,1231],"h4",{"id":1230},"原因",[233,1232,1233],{},"原因：",[11,1235,1236],{},"挂载点或磁盘上的文件权限不足，导致普通用户无法进入。",[1228,1238,1240],{"id":1239},"解决方法修改挂载点权限",[233,1241,1242],{},"解决方法：修改挂载点权限",[11,1244,1245],{},[233,1246,1247],{},"方法一：将挂载点所有权改为当前用户",[11,1249,44],{},[11,1251,1252],{},"复制代码",[11,1254,1255],{},[47,1256,1257],{},"sudo chown -R $USER:$USER \u002Fmnt\u002Fyour_mount_point",[32,1259,1261],{"id":1260},"fedora-系列","Fedora 系列",[236,1263,1265],{"id":1264},"_1fedora-update","1.Fedora Update",[11,1267,1268],{},[20,1269,1272],{"href":1270,"rel":1271},"https:\u002F\u002Fwww.sysgeek.cn\u002Fupgrade-fedora-to-latest-release\u002F",[24],"Fedora 升级系统版本",[236,1274,1276],{"id":1275},"_2-linux-下的bilibili客户端","2. linux 下的bilibili客户端",[11,1278,1279],{},[20,1280,1283],{"href":1281,"rel":1282},"https:\u002F\u002Fgithub.com\u002Fmsojocs\u002Fbilibili-linux",[24],"bilibili",[236,1285,1287],{"id":1286},"_3-很多软件安装之后不显示中文字体多半是没有安装","3. 很多软件安装之后不显示中文字体,多半是没有安装",[11,1289,1290],{},[243,1291],{"alt":1292,"src":1293},"378","https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=OWE4NDUyNjVlZmRkOGZlNTlmNTE5MDk3NmMyOGQ4ZGVfMWRwUmI2dFM2SXRoM2IzWmFNZVRSN1Y3bDhtYUxUQzFfVG9rZW46V2MyRmI1N0Vwb2FIZm94akNxRGNJQVczbmxyXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[40,1295,1297],{"className":272,"code":1296,"language":274,"meta":45,"style":45},"#安装中文字体\nsudo dnf install google-noto-sans-cjk-ttc-fonts google-noto-serif-cjk-ttc-fonts \\\nadobe-source-han-sans-cn-fonts adobe-source-han-serif-cn-fonts \\\nwqy-zenhei-fonts wqy-microhei-fonts\n#刷新字体\nfc-cache -fv\n#确认系统字体能找到中文覆盖\nfc-list :lang=zh | wc -l\n#返回的数字大于0说明成功\n",[47,1298,1299,1304,1322,1332,1340,1345,1353,1358,1373],{"__ignoreMap":45},[50,1300,1301],{"class":52,"line":53},[50,1302,1303],{"class":85},"#安装中文字体\n",[50,1305,1306,1308,1311,1313,1316,1319],{"class":52,"line":89},[50,1307,281],{"class":56},[50,1309,1310],{"class":64}," dnf",[50,1312,373],{"class":64},[50,1314,1315],{"class":64}," google-noto-sans-cjk-ttc-fonts",[50,1317,1318],{"class":64}," google-noto-serif-cjk-ttc-fonts",[50,1320,1321],{"class":60}," \\\n",[50,1323,1324,1327,1330],{"class":52,"line":98},[50,1325,1326],{"class":154},"adobe-source-han-sans-cn-fonts ",[50,1328,1329],{"class":64},"adobe-source-han-serif-cn-fonts",[50,1331,1321],{"class":60},[50,1333,1334,1337],{"class":52,"line":104},[50,1335,1336],{"class":154},"wqy-zenhei-fonts ",[50,1338,1339],{"class":64},"wqy-microhei-fonts\n",[50,1341,1342],{"class":52,"line":112},[50,1343,1344],{"class":85},"#刷新字体\n",[50,1346,1347,1350],{"class":52,"line":118},[50,1348,1349],{"class":56},"fc-cache",[50,1351,1352],{"class":60}," -fv\n",[50,1354,1355],{"class":52,"line":127},[50,1356,1357],{"class":85},"#确认系统字体能找到中文覆盖\n",[50,1359,1360,1363,1366,1368,1371],{"class":52,"line":133},[50,1361,1362],{"class":56},"fc-list",[50,1364,1365],{"class":64}," :lang=zh",[50,1367,69],{"class":68},[50,1369,1370],{"class":56}," wc",[50,1372,510],{"class":60},[50,1374,1375],{"class":52,"line":142},[50,1376,1377],{"class":85},"#返回的数字大于0说明成功\n",[11,1379,1380],{},[243,1381],{"alt":1382,"src":1383},"422","https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=YTk4ZmNmOTdiOWQ3NWJlYmI1NGNlMmUxMTYyMmEyODlfT0lFdVZsbTk2Q2owT01STnVUY0xTTXhVSDc5eWtTeHhfVG9rZW46R1kxNmJnYnp1b2V1T0R4ZkFxTmNzYUhBbmpkXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[11,1385,1386],{},"成功解决!",[236,1388,1390],{"id":1389},"_4-vscode配置-symbols-nerd-font-mono字体","4.  vscode配置 Symbols Nerd Font Mono字体",[11,1392,1393],{},[243,1394],{"alt":1395,"src":1396},"769","https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=MDEzMDkzNDk0N2RlYzIwMmIwYTM2MDFiNzk2MmM3MzNfajNxU3dFSkZkZnhkZm8wTjNVdkRiN3p6VFo5U0Y1bE1fVG9rZW46T3lHNWJVVDk5bzg2T1J4RWxzYmNONXR2bjBmXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[32,1398,1399],{"id":1399},"适用于所有linux系列",[236,1401,1403],{"id":1402},"_1-更改文件所有者","1. 更改文件所有者",[40,1405,1407],{"className":272,"code":1406,"language":274,"meta":45,"style":45},"ls -l  #查看文件所有者\ntotal 36 \ndrwxr-xr-x. 4 xiaofang xiaofang 4096 Oct 24 16:26 base_driver_pkg \ndrwxr-xr-x. 3 xiaofang xiaofang 4096 Oct 24 16:26 base_interfaces \ndrwxr-xr-x. 4 xiaofang xiaofang 4096 Oct 24 16:26 localization_pkg \ndrwxr-xr-x. 3 xiaofang xiaofang 4096 Oct 24 16:26 my_map_server \ndrwxr-xr-x. 4 xiaofang xiaofang 4096 Oct 24 16:26 my_slam_toolbox \ndrwxrwxrwx. 4 root     root     4096 Oct 25 19:26 navigation2_config \n\nsudo chown $USER:$USER navigation2_config\u002F  #更改为当前用户所有\nsudo chown -R $USER:$USER folder_name #递归修改\nls -l \ntotal 36 \ndrwxr-xr-x. 4 xiaofang xiaofang 4096 Oct 24 16:26 base_driver_pkg \ndrwxr-xr-x. 3 xiaofang xiaofang 4096 Oct 24 16:26 base_interfaces \ndrwxr-xr-x. 4 xiaofang xiaofang 4096 Oct 24 16:26 localization_pkg \ndrwxr-xr-x. 3 xiaofang xiaofang 4096 Oct 24 16:26 my_map_server \ndrwxr-xr-x. 4 xiaofang xiaofang 4096 Oct 24 16:26 my_slam_toolbox \ndrwxrwxrwx. 4 xiaofang xiaofang 4096 Oct 25 19:26 navigation2_config\n \n",[47,1408,1409,1419,1429,1459,1483,1506,1529,1552,1580,1584,1606,1627,1635,1643,1665,1687,1709,1731,1753],{"__ignoreMap":45},[50,1410,1411,1413,1416],{"class":52,"line":53},[50,1412,92],{"class":56},[50,1414,1415],{"class":60}," -l",[50,1417,1418],{"class":85},"  #查看文件所有者\n",[50,1420,1421,1424,1427],{"class":52,"line":89},[50,1422,1423],{"class":56},"total",[50,1425,1426],{"class":60}," 36",[50,1428,364],{"class":154},[50,1430,1431,1434,1437,1440,1442,1445,1448,1451,1454,1457],{"class":52,"line":98},[50,1432,1433],{"class":56},"drwxr-xr-x.",[50,1435,1436],{"class":60}," 4",[50,1438,1439],{"class":64}," xiaofang",[50,1441,1439],{"class":64},[50,1443,1444],{"class":60}," 4096",[50,1446,1447],{"class":64}," Oct",[50,1449,1450],{"class":60}," 24",[50,1452,1453],{"class":64}," 16:26",[50,1455,1456],{"class":64}," base_driver_pkg",[50,1458,364],{"class":154},[50,1460,1461,1463,1466,1468,1470,1472,1474,1476,1478,1481],{"class":52,"line":104},[50,1462,1433],{"class":56},[50,1464,1465],{"class":60}," 3",[50,1467,1439],{"class":64},[50,1469,1439],{"class":64},[50,1471,1444],{"class":60},[50,1473,1447],{"class":64},[50,1475,1450],{"class":60},[50,1477,1453],{"class":64},[50,1479,1480],{"class":64}," base_interfaces",[50,1482,364],{"class":154},[50,1484,1485,1487,1489,1491,1493,1495,1497,1499,1501,1504],{"class":52,"line":112},[50,1486,1433],{"class":56},[50,1488,1436],{"class":60},[50,1490,1439],{"class":64},[50,1492,1439],{"class":64},[50,1494,1444],{"class":60},[50,1496,1447],{"class":64},[50,1498,1450],{"class":60},[50,1500,1453],{"class":64},[50,1502,1503],{"class":64}," localization_pkg",[50,1505,364],{"class":154},[50,1507,1508,1510,1512,1514,1516,1518,1520,1522,1524,1527],{"class":52,"line":118},[50,1509,1433],{"class":56},[50,1511,1465],{"class":60},[50,1513,1439],{"class":64},[50,1515,1439],{"class":64},[50,1517,1444],{"class":60},[50,1519,1447],{"class":64},[50,1521,1450],{"class":60},[50,1523,1453],{"class":64},[50,1525,1526],{"class":64}," my_map_server",[50,1528,364],{"class":154},[50,1530,1531,1533,1535,1537,1539,1541,1543,1545,1547,1550],{"class":52,"line":127},[50,1532,1433],{"class":56},[50,1534,1436],{"class":60},[50,1536,1439],{"class":64},[50,1538,1439],{"class":64},[50,1540,1444],{"class":60},[50,1542,1447],{"class":64},[50,1544,1450],{"class":60},[50,1546,1453],{"class":64},[50,1548,1549],{"class":64}," my_slam_toolbox",[50,1551,364],{"class":154},[50,1553,1554,1557,1559,1562,1565,1567,1569,1572,1575,1578],{"class":52,"line":133},[50,1555,1556],{"class":56},"drwxrwxrwx.",[50,1558,1436],{"class":60},[50,1560,1561],{"class":64}," root",[50,1563,1564],{"class":64},"     root",[50,1566,799],{"class":60},[50,1568,1447],{"class":64},[50,1570,1571],{"class":60}," 25",[50,1573,1574],{"class":64}," 19:26",[50,1576,1577],{"class":64}," navigation2_config",[50,1579,364],{"class":154},[50,1581,1582],{"class":52,"line":142},[50,1583,745],{"emptyLinePlaceholder":201},[50,1585,1586,1588,1591,1594,1597,1600,1603],{"class":52,"line":148},[50,1587,281],{"class":56},[50,1589,1590],{"class":64}," chown",[50,1592,1593],{"class":154}," $USER",[50,1595,1596],{"class":64},":",[50,1598,1599],{"class":154},"$USER ",[50,1601,1602],{"class":64},"navigation2_config\u002F",[50,1604,1605],{"class":85},"  #更改为当前用户所有\n",[50,1607,1608,1610,1612,1615,1617,1619,1621,1624],{"class":52,"line":599},[50,1609,281],{"class":56},[50,1611,1590],{"class":64},[50,1613,1614],{"class":60}," -R",[50,1616,1593],{"class":154},[50,1618,1596],{"class":64},[50,1620,1599],{"class":154},[50,1622,1623],{"class":64},"folder_name",[50,1625,1626],{"class":85}," #递归修改\n",[50,1628,1629,1631,1633],{"class":52,"line":615},[50,1630,92],{"class":56},[50,1632,1415],{"class":60},[50,1634,364],{"class":154},[50,1636,1637,1639,1641],{"class":52,"line":621},[50,1638,1423],{"class":56},[50,1640,1426],{"class":60},[50,1642,364],{"class":154},[50,1644,1645,1647,1649,1651,1653,1655,1657,1659,1661,1663],{"class":52,"line":844},[50,1646,1433],{"class":56},[50,1648,1436],{"class":60},[50,1650,1439],{"class":64},[50,1652,1439],{"class":64},[50,1654,1444],{"class":60},[50,1656,1447],{"class":64},[50,1658,1450],{"class":60},[50,1660,1453],{"class":64},[50,1662,1456],{"class":64},[50,1664,364],{"class":154},[50,1666,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685],{"class":52,"line":850},[50,1668,1433],{"class":56},[50,1670,1465],{"class":60},[50,1672,1439],{"class":64},[50,1674,1439],{"class":64},[50,1676,1444],{"class":60},[50,1678,1447],{"class":64},[50,1680,1450],{"class":60},[50,1682,1453],{"class":64},[50,1684,1480],{"class":64},[50,1686,364],{"class":154},[50,1688,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707],{"class":52,"line":874},[50,1690,1433],{"class":56},[50,1692,1436],{"class":60},[50,1694,1439],{"class":64},[50,1696,1439],{"class":64},[50,1698,1444],{"class":60},[50,1700,1447],{"class":64},[50,1702,1450],{"class":60},[50,1704,1453],{"class":64},[50,1706,1503],{"class":64},[50,1708,364],{"class":154},[50,1710,1711,1713,1715,1717,1719,1721,1723,1725,1727,1729],{"class":52,"line":880},[50,1712,1433],{"class":56},[50,1714,1465],{"class":60},[50,1716,1439],{"class":64},[50,1718,1439],{"class":64},[50,1720,1444],{"class":60},[50,1722,1447],{"class":64},[50,1724,1450],{"class":60},[50,1726,1453],{"class":64},[50,1728,1526],{"class":64},[50,1730,364],{"class":154},[50,1732,1733,1735,1737,1739,1741,1743,1745,1747,1749,1751],{"class":52,"line":885},[50,1734,1433],{"class":56},[50,1736,1436],{"class":60},[50,1738,1439],{"class":64},[50,1740,1439],{"class":64},[50,1742,1444],{"class":60},[50,1744,1447],{"class":64},[50,1746,1450],{"class":60},[50,1748,1453],{"class":64},[50,1750,1549],{"class":64},[50,1752,364],{"class":154},[50,1754,1755,1757,1759,1761,1763,1765,1767,1769,1771],{"class":52,"line":891},[50,1756,1556],{"class":56},[50,1758,1436],{"class":60},[50,1760,1439],{"class":64},[50,1762,1439],{"class":64},[50,1764,1444],{"class":60},[50,1766,1447],{"class":64},[50,1768,1571],{"class":60},[50,1770,1574],{"class":64},[50,1772,1773],{"class":64}," navigation2_config\n",[236,1775,1777],{"id":1776},"_2-创建软件图标","2. 创建软件图标",[40,1779,1781],{"className":272,"code":1780,"language":274,"meta":45,"style":45},"cd ~\u002F.local\u002Fshare\u002Fapplications\u002F\ntouch .\u002Fqqmusic.desktop\nvim .\u002Fqqmusic.desktop\nsudo chmod +x .\u002Fqqmusic.desktop\n",[47,1782,1783,1791,1799,1806],{"__ignoreMap":45},[50,1784,1785,1788],{"class":52,"line":53},[50,1786,1787],{"class":60},"cd",[50,1789,1790],{"class":64}," ~\u002F.local\u002Fshare\u002Fapplications\u002F\n",[50,1792,1793,1796],{"class":52,"line":89},[50,1794,1795],{"class":56},"touch",[50,1797,1798],{"class":64}," .\u002Fqqmusic.desktop\n",[50,1800,1801,1804],{"class":52,"line":98},[50,1802,1803],{"class":56},"vim",[50,1805,1798],{"class":64},[50,1807,1808,1810,1813,1815],{"class":52,"line":104},[50,1809,281],{"class":56},[50,1811,1812],{"class":64}," chmod",[50,1814,397],{"class":64},[50,1816,1798],{"class":64},[40,1818,1820],{"className":272,"code":1819,"language":274,"meta":45,"style":45},"[Desktop Entry]\nName=QQ音乐\nExec=\u002Fhome\u002Ftungchiahui\u002FUserFloder\u002FApplications\u002Fqqmusic\u002Fqqmusic-1.1.7.AppImage\nIcon=\u002Fhome\u002Ftungchiahui\u002FUserFloder\u002FApplications\u002Fqqmusic\u002FQQ_Music2023.svg\nType=Application\nCategories=Audio;Music;Player;\nComment=QQ Music Client for Linux\n",[47,1821,1822,1827,1838,1848,1858,1868,1892],{"__ignoreMap":45},[50,1823,1824],{"class":52,"line":53},[50,1825,1826],{"class":154},"[Desktop Entry]\n",[50,1828,1829,1832,1835],{"class":52,"line":89},[50,1830,1831],{"class":154},"Name",[50,1833,1834],{"class":68},"=",[50,1836,1837],{"class":64},"QQ音乐\n",[50,1839,1840,1843,1845],{"class":52,"line":98},[50,1841,1842],{"class":154},"Exec",[50,1844,1834],{"class":68},[50,1846,1847],{"class":64},"\u002Fhome\u002Ftungchiahui\u002FUserFloder\u002FApplications\u002Fqqmusic\u002Fqqmusic-1.1.7.AppImage\n",[50,1849,1850,1853,1855],{"class":52,"line":104},[50,1851,1852],{"class":154},"Icon",[50,1854,1834],{"class":68},[50,1856,1857],{"class":64},"\u002Fhome\u002Ftungchiahui\u002FUserFloder\u002FApplications\u002Fqqmusic\u002FQQ_Music2023.svg\n",[50,1859,1860,1863,1865],{"class":52,"line":112},[50,1861,1862],{"class":154},"Type",[50,1864,1834],{"class":68},[50,1866,1867],{"class":64},"Application\n",[50,1869,1870,1873,1875,1878,1881,1884,1886,1889],{"class":52,"line":118},[50,1871,1872],{"class":154},"Categories",[50,1874,1834],{"class":68},[50,1876,1877],{"class":64},"Audio",[50,1879,1880],{"class":154},";",[50,1882,1883],{"class":56},"Music",[50,1885,1880],{"class":154},[50,1887,1888],{"class":56},"Player",[50,1890,1891],{"class":154},";\n",[50,1893,1894,1897,1899,1902,1905,1908,1911],{"class":52,"line":127},[50,1895,1896],{"class":154},"Comment",[50,1898,1834],{"class":68},[50,1900,1901],{"class":64},"QQ",[50,1903,1904],{"class":56}," Music",[50,1906,1907],{"class":64}," Client",[50,1909,1910],{"class":64}," for",[50,1912,1913],{"class":64}," Linux\n",[40,1915,1917],{"className":272,"code":1916,"language":274,"meta":45,"style":45},"Utility（实用工具）\nDevelopment（开发工具）\nGraphics（图形设计）\nAudioVideo（影音）\nEducation（教育）\nNetwork（网络）\nOffice（办公）\n",[47,1918,1919,1924,1929,1934,1939,1944,1949],{"__ignoreMap":45},[50,1920,1921],{"class":52,"line":53},[50,1922,1923],{"class":56},"Utility（实用工具）\n",[50,1925,1926],{"class":52,"line":89},[50,1927,1928],{"class":56},"Development（开发工具）\n",[50,1930,1931],{"class":52,"line":98},[50,1932,1933],{"class":56},"Graphics（图形设计）\n",[50,1935,1936],{"class":52,"line":104},[50,1937,1938],{"class":56},"AudioVideo（影音）\n",[50,1940,1941],{"class":52,"line":112},[50,1942,1943],{"class":56},"Education（教育）\n",[50,1945,1946],{"class":52,"line":118},[50,1947,1948],{"class":56},"Network（网络）\n",[50,1950,1951],{"class":52,"line":127},[50,1952,1953],{"class":56},"Office（办公）\n",[32,1955,1957],{"id":1956},"linux美化与体验优化","Linux美化与体验优化",[236,1959,1961],{"id":1960},"_1-终端美化","1. 终端美化",[1228,1963,1965],{"id":1964},"_11美化提示符-使用starship","1.1美化提示符 （使用starship）",[1967,1968,1969],"ol",{},[1970,1971,1972,1973],"li",{},"下载好字体还有配置文件\n",[20,1974,1977],{"href":1975,"rel":1976},"https:\u002F\u002Fstarship.rs\u002F",[24],"starship",[11,1979,1980],{},"按照官方配置即可",[11,1982,1983],{},[243,1984],{"alt":1985,"src":1986},"569","https:\u002F\u002Fsdutvincirobot.feishu.cn\u002Fspace\u002Fapi\u002Fbox\u002Fstream\u002Fdownload\u002Fasynccode\u002F?code=NmVkMGI5ZGJhNmIzZTc1NjU1OGEzZDQyYWZlNTczOTRfd01rM0tVQWtORUNoSmIydHV1Um5yN1pFeUNNeHVFeWFfVG9rZW46T3plUWIyS3RHb1JFdUV4VWYzb2NwVnJibmpmXzE3ODQ2NDc0NDU6MTc4NDY1MTA0NV9WNA&add_watermark=true&scene_type=CCM",[1967,1988,1989],{"start":89},[1970,1990,1991],{},"编辑当前shell的配置文件\n例如:",[11,1993,1994],{},"fish",[40,1996,2000],{"className":1997,"code":1998,"language":1999,"meta":45,"style":45},"language-Shell shiki shiki-themes github-light github-dark","vim ~\u002F.config\u002Ffish\u002Fconfig.fish\n\n#写入\nstarship init fish | source\n","Shell",[47,2001,2002,2008,2012,2017],{"__ignoreMap":45},[50,2003,2004,2006],{"class":52,"line":53},[50,2005,1803],{"class":56},[50,2007,124],{"class":64},[50,2009,2010],{"class":52,"line":89},[50,2011,745],{"emptyLinePlaceholder":201},[50,2013,2014],{"class":52,"line":98},[50,2015,2016],{"class":85},"#写入\n",[50,2018,2019,2021,2024,2027,2029],{"class":52,"line":104},[50,2020,1977],{"class":56},[50,2022,2023],{"class":64}," init",[50,2025,2026],{"class":64}," fish",[50,2028,69],{"class":68},[50,2030,2031],{"class":60}," source\n",[11,2033,44],{},[40,2035,2037],{"className":272,"code":2036,"language":274,"meta":45,"style":45},"vim ~\u002F.bashrc \n\neval \"$(starship init bash)\"\n",[47,2038,2039,2048,2052],{"__ignoreMap":45},[50,2040,2041,2043,2046],{"class":52,"line":53},[50,2042,1803],{"class":56},[50,2044,2045],{"class":64}," ~\u002F.bashrc",[50,2047,364],{"class":154},[50,2049,2050],{"class":52,"line":89},[50,2051,745],{"emptyLinePlaceholder":201},[50,2053,2054,2057,2060,2062],{"class":52,"line":98},[50,2055,2056],{"class":60},"eval",[50,2058,2059],{"class":64}," \"$(",[50,2061,1977],{"class":56},[50,2063,2064],{"class":64}," init bash)\"\n",[236,2066,2068],{"id":2067},"_2终端文件显示","2.终端文件显示",[11,2070,2071],{},[20,2072,2075],{"href":2073,"rel":2074},"https:\u002F\u002Fyazi-rs.github.io\u002Fdocs\u002Fquick-start",[24],"使用yazi",[236,2077,2079],{"id":2078},"_3wayland-窗口管理器美化-niri-dms","3.Wayland 窗口管理器美化 NiRi DMS",[1228,2081,2083],{"id":2082},"obs在niri下无法录制屏幕的问题","OBS在niri下无法录制屏幕的问题",[2085,2086,2087,2093],"ul",{},[1970,2088,2089,2090],{},"原因：原来在KDE下面，转到niri之后缺少驱动 ",[47,2091,2092],{},"xdg-desktop-portal-gnome",[1970,2094,2095],{},"解决方法:重新安装这个驱动",[40,2097,2099],{"className":42,"code":2098,"language":44,"meta":45,"style":45},"#install service\nsudo dnf install xdg-desktop-portal-gnome\n#reboot service\nsystemctl --user restart xdg-desktop-portal\nsystemctl --user restart xdg-desktop-portal-gnome\n#查看状态  显示active即可\nsystemctl --user status xdg-desktop-portal-gnome\n#彻底关闭OBS\nflatpak kill com.obsproject.Studio\n#重新打开就有啦\n",[47,2100,2101,2106,2117,2122,2136,2146,2151,2162,2167,2178],{"__ignoreMap":45},[50,2102,2103],{"class":52,"line":53},[50,2104,2105],{"class":85},"#install service\n",[50,2107,2108,2110,2112,2114],{"class":52,"line":89},[50,2109,281],{"class":56},[50,2111,1310],{"class":64},[50,2113,373],{"class":64},[50,2115,2116],{"class":64}," xdg-desktop-portal-gnome\n",[50,2118,2119],{"class":52,"line":98},[50,2120,2121],{"class":85},"#reboot service\n",[50,2123,2124,2127,2130,2133],{"class":52,"line":104},[50,2125,2126],{"class":56},"systemctl",[50,2128,2129],{"class":60}," --user",[50,2131,2132],{"class":64}," restart",[50,2134,2135],{"class":64}," xdg-desktop-portal\n",[50,2137,2138,2140,2142,2144],{"class":52,"line":112},[50,2139,2126],{"class":56},[50,2141,2129],{"class":60},[50,2143,2132],{"class":64},[50,2145,2116],{"class":64},[50,2147,2148],{"class":52,"line":118},[50,2149,2150],{"class":85},"#查看状态  显示active即可\n",[50,2152,2153,2155,2157,2160],{"class":52,"line":127},[50,2154,2126],{"class":56},[50,2156,2129],{"class":60},[50,2158,2159],{"class":64}," status",[50,2161,2116],{"class":64},[50,2163,2164],{"class":52,"line":133},[50,2165,2166],{"class":85},"#彻底关闭OBS\n",[50,2168,2169,2172,2175],{"class":52,"line":142},[50,2170,2171],{"class":56},"flatpak",[50,2173,2174],{"class":64}," kill",[50,2176,2177],{"class":64}," com.obsproject.Studio\n",[50,2179,2180],{"class":52,"line":148},[50,2181,2182],{"class":85},"#重新打开就有啦\n",[188,2184,2185],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":45,"searchDepth":104,"depth":104,"links":2187},[2188,2203,2209,2213],{"id":231,"depth":89,"text":231,"children":2189},[2190,2191,2192,2193,2194,2195,2196,2197,2198,2199],{"id":238,"depth":98,"text":239},{"id":261,"depth":98,"text":262},{"id":268,"depth":98,"text":269},{"id":340,"depth":98,"text":341},{"id":418,"depth":98,"text":419},{"id":428,"depth":98,"text":429},{"id":439,"depth":98,"text":440},{"id":489,"depth":98,"text":490},{"id":1181,"depth":98,"text":1182},{"id":1223,"depth":98,"text":1226,"children":2200},[2201,2202],{"id":1230,"depth":104,"text":1233},{"id":1239,"depth":104,"text":1242},{"id":1260,"depth":89,"text":1261,"children":2204},[2205,2206,2207,2208],{"id":1264,"depth":98,"text":1265},{"id":1275,"depth":98,"text":1276},{"id":1286,"depth":98,"text":1287},{"id":1389,"depth":98,"text":1390},{"id":1399,"depth":89,"text":1399,"children":2210},[2211,2212],{"id":1402,"depth":98,"text":1403},{"id":1776,"depth":98,"text":1777},{"id":1956,"depth":89,"text":1957,"children":2214},[2215,2218,2219],{"id":1960,"depth":98,"text":1961,"children":2216},[2217],{"id":1964,"depth":104,"text":1965},{"id":2067,"depth":98,"text":2068},{"id":2078,"depth":98,"text":2079,"children":2220},[2221],{"id":2082,"depth":104,"text":2083},"记录学习Linux过程中踩过的各种坑",{},"\u002Fwiki\u002Flinux\u002Flinux-1f4000d",{"title":226,"description":2222},"wiki\u002Flinux\u002Flinux-1f4000d",[215],"-GMqlCHh9LjzR-5MW1M4ua0h1OoLNPCYN9UbYCJgDHU",{"id":2230,"title":2231,"body":2232,"category":215,"date":216,"description":3712,"draft":198,"extension":199,"featured":198,"meta":3713,"navigation":201,"path":3714,"seo":3715,"stem":3716,"tags":3717,"type":206,"__hash__":3718},"content\u002Fwiki\u002Flinux\u002Fniri-dms-using-clue\u002Fdms-keys.md","DMS keys",{"type":8,"value":2233,"toc":3700},[2234,2239,2283,2287,2419,2422,2426,2645,2649,2798,2802,3138,3142,3294,3298,3427,3431,3599,3603,3633,3635,3639],[2235,2236,2238],"h1",{"id":2237},"niri-dms-自定义快捷键指南","🎹 niri + DMS 自定义快捷键指南",[15,2240,2241,2248],{},[11,2242,2243,2244,2247],{},"💡 ",[233,2245,2246],{},"提示","：",[2085,2249,2250,2265,2272],{},[1970,2251,2252,2253,2256,2257,2260,2261,2264],{},"配置中的 ",[47,2254,2255],{},"Mod"," 与 ",[47,2258,2259],{},"Super"," 等效，默认对应键盘 ",[233,2262,2263],{},"Win 键","。",[1970,2266,2267,2268,2271],{},"所有快捷键已按你提供的 ",[47,2269,2270],{},"binds {}"," 区块逐行解析，无默认值假设。",[1970,2273,2274,2275,2278,2279,2282],{},"修改保存后，按 ",[47,2276,2277],{},"Mod+Shift+R"," 或终端执行 ",[47,2280,2281],{},"niri msg action reload-config"," 热重载。",[32,2284,2286],{"id":2285},"️-核心键位变更提示-你的自定义布局","⚠️ 核心键位变更提示 (你的自定义布局)",[2288,2289,2290,2307],"table",{},[2291,2292,2293],"thead",{},[2294,2295,2296,2301,2304],"tr",{},[2297,2298,2300],"th",{"align":2299},"left","原默认行为",[2297,2302,2303],{"align":2299},"你的新绑定",[2297,2305,2306],{"align":2299},"说明",[2308,2309,2310,2329,2347,2365,2383,2401],"tbody",{},[2294,2311,2312,2319,2324],{},[2313,2314,2315,2318],"td",{"align":2299},[47,2316,2317],{},"Mod+K"," 焦点上移",[2313,2320,2321],{"align":2299},[47,2322,2323],{},"focus-workspace-down",[2313,2325,2326],{"align":2299},[233,2327,2328],{},"K 现用于切换下一工作区",[2294,2330,2331,2337,2342],{},[2313,2332,2333,2336],{"align":2299},[47,2334,2335],{},"Mod+U"," 工作区下移",[2313,2338,2339],{"align":2299},[47,2340,2341],{},"focus-window-up",[2313,2343,2344],{"align":2299},[233,2345,2346],{},"U 现用于同列窗口上移",[2294,2348,2349,2355,2360],{},[2313,2350,2351,2354],{"align":2299},[47,2352,2353],{},"Mod+H"," 焦点左移",[2313,2356,2357],{"align":2299},[47,2358,2359],{},"focus-window-down",[2313,2361,2362],{"align":2299},[233,2363,2364],{},"H 现用于同列窗口下移",[2294,2366,2367,2373,2378],{},[2313,2368,2369,2372],{"align":2299},[47,2370,2371],{},"Mod+J"," 焦点下移",[2313,2374,2375],{"align":2299},[47,2376,2377],{},"focus-column-left",[2313,2379,2380],{"align":2299},[233,2381,2382],{},"J 现用于焦点左移列",[2294,2384,2385,2391,2396],{},[2313,2386,2387,2390],{"align":2299},[47,2388,2389],{},"Mod+Shift+H"," 列左移",[2313,2392,2393],{"align":2299},[47,2394,2395],{},"move-window-down",[2313,2397,2398],{"align":2299},[233,2399,2400],{},"Shift+H 现用于窗口下移",[2294,2402,2403,2409,2414],{},[2313,2404,2405,2408],{"align":2299},[47,2406,2407],{},"Mod+Shift+J"," 窗口下移",[2313,2410,2411],{"align":2299},[47,2412,2413],{},"move-column-left",[2313,2415,2416],{"align":2299},[233,2417,2418],{},"Shift+J 现用于整列左移",[2420,2421],"hr",{},[32,2423,2425],{"id":2424},"️-系统与-dms-桌面交互","🖥️ 系统与 DMS 桌面交互",[2288,2427,2428,2441],{},[2291,2429,2430],{},[2294,2431,2432,2435,2438],{},[2297,2433,2434],{"align":2299},"快捷键",[2297,2436,2437],{"align":2299},"功能",[2297,2439,2440],{"align":2299},"备注",[2308,2442,2443,2456,2469,2482,2495,2508,2521,2534,2547,2560,2573,2590,2606,2619,2632],{},[2294,2444,2445,2450,2453],{},[2313,2446,2447],{"align":2299},[47,2448,2449],{},"Mod+Space",[2313,2451,2452],{"align":2299},"应用启动器 (Spotlight)",[2313,2454,2455],{"align":2299},"全局搜索与启动应用",[2294,2457,2458,2463,2466],{},[2313,2459,2460],{"align":2299},[47,2461,2462],{},"Mod+,",[2313,2464,2465],{"align":2299},"系统设置",[2313,2467,2468],{"align":2299},"打开 DMS 配置面板",[2294,2470,2471,2476,2479],{},[2313,2472,2473],{"align":2299},[47,2474,2475],{},"Mod+N",[2313,2477,2478],{"align":2299},"通知中心",[2313,2480,2481],{"align":2299},"查看\u002F清除桌面通知",[2294,2483,2484,2489,2492],{},[2313,2485,2486],{"align":2299},[47,2487,2488],{},"Mod+V",[2313,2490,2491],{"align":2299},"剪贴板管理器",[2313,2493,2494],{"align":2299},"历史粘贴板记录",[2294,2496,2497,2502,2505],{},[2313,2498,2499],{"align":2299},[47,2500,2501],{},"Mod+Shift+N",[2313,2503,2504],{"align":2299},"记事本",[2313,2506,2507],{"align":2299},"快速临时笔记",[2294,2509,2510,2515,2518],{},[2313,2511,2512],{"align":2299},[47,2513,2514],{},"Mod+Shift+W",[2313,2516,2517],{"align":2299},"窗口规则编辑器",[2313,2519,2520],{"align":2299},"自定义应用浮动\u002F固定策略",[2294,2522,2523,2528,2531],{},[2313,2524,2525],{"align":2299},[47,2526,2527],{},"Mod+Y",[2313,2529,2530],{"align":2299},"壁纸管理",[2313,2532,2533],{"align":2299},"浏览与切换壁纸",[2294,2535,2536,2541,2544],{},[2313,2537,2538],{"align":2299},[47,2539,2540],{},"Super+X",[2313,2542,2543],{"align":2299},"电源菜单",[2313,2545,2546],{"align":2299},"关机\u002F重启\u002F注销\u002F休眠",[2294,2548,2549,2554,2557],{},[2313,2550,2551],{"align":2299},[47,2552,2553],{},"Mod+Shift+E",[2313,2555,2556],{"align":2299},"退出 niri",[2313,2558,2559],{"align":2299},"结束当前图形会话",[2294,2561,2562,2567,2570],{},[2313,2563,2564],{"align":2299},[47,2565,2566],{},"Mod+Alt+L",[2313,2568,2569],{"align":2299},"锁屏",[2313,2571,2572],{"align":2299},"锁定屏幕并待机",[2294,2574,2575,2584,2587],{},[2313,2576,2577,2580,2581],{"align":2299},[47,2578,2579],{},"Mod+M"," \u002F ",[47,2582,2583],{},"Ctrl+Alt+Del",[2313,2585,2586],{"align":2299},"任务管理器",[2313,2588,2589],{"align":2299},"进程监控与资源管理",[2294,2591,2592,2600,2603],{},[2313,2593,2594,2580,2597],{"align":2299},[47,2595,2596],{},"Mod+D",[47,2598,2599],{},"Mod+Tab",[2313,2601,2602],{"align":2299},"总览视图 (Overview)",[2313,2604,2605],{"align":2299},"查看所有工作区与窗口缩略图",[2294,2607,2608,2613,2616],{},[2313,2609,2610],{"align":2299},[47,2611,2612],{},"Mod+Esc",[2313,2614,2615],{"align":2299},"快捷键拦截开关",[2313,2617,2618],{"align":2299},"允许当前应用独占组合键",[2294,2620,2621,2626,2629],{},[2313,2622,2623],{"align":2299},[47,2624,2625],{},"Mod+Shift+\u002F",[2313,2627,2628],{"align":2299},"显示快捷键提示",[2313,2630,2631],{"align":2299},"屏幕浮层显示可用快捷键",[2294,2633,2634,2639,2642],{},[2313,2635,2636],{"align":2299},[47,2637,2638],{},"Ctrl+Shift+R",[2313,2640,2641],{"align":2299},"重命名工作区",[2313,2643,2644],{"align":2299},"自定义工作区名称标签",[32,2646,2648],{"id":2647},"工作区-workspace-导航","📂 工作区 (Workspace) 导航",[2288,2650,2651,2661],{},[2291,2652,2653],{},[2294,2654,2655,2657,2659],{},[2297,2656,2434],{"align":2299},[2297,2658,2437],{"align":2299},[2297,2660,2440],{"align":2299},[2308,2662,2663,2680,2699,2719,2734,2749,2763,2781],{},[2294,2664,2665,2674,2677],{},[2313,2666,2667,2670,2671],{"align":2299},[47,2668,2669],{},"Mod+1"," ~ ",[47,2672,2673],{},"9",[2313,2675,2676],{"align":2299},"跳转至指定工作区",[2313,2678,2679],{"align":2299},"快速切换 1~9 号",[2294,2681,2682,2693,2696],{},[2313,2683,2684,2580,2687,2580,2690],{"align":2299},[47,2685,2686],{},"Mod+I",[47,2688,2689],{},"PageUp",[47,2691,2692],{},"滚轮上",[2313,2694,2695],{"align":2299},"上一工作区",[2313,2697,2698],{"align":2299},"纵向向上滚动",[2294,2700,2701,2711,2714],{},[2313,2702,2703,2580,2705,2580,2708],{"align":2299},[47,2704,2317],{},[47,2706,2707],{},"PageDown",[47,2709,2710],{},"滚轮下",[2313,2712,2713],{"align":2299},"下一工作区",[2313,2715,2716],{"align":2299},[233,2717,2718],{},"⚠️ 你的自定义：K 切工作区",[2294,2720,2721,2728,2731],{},[2313,2722,2723,2670,2726],{"align":2299},[47,2724,2725],{},"Mod+Shift+1",[47,2727,2673],{},[2313,2729,2730],{"align":2299},"当前列移至指定工作区",[2313,2732,2733],{"align":2299},"批量迁移窗口组",[2294,2735,2736,2743,2746],{},[2313,2737,2738,2580,2741],{"align":2299},[47,2739,2740],{},"Mod+Shift+I",[47,2742,2689],{},[2313,2744,2745],{"align":2299},"工作区顺序上移",[2313,2747,2748],{"align":2299},"调整纵向排列",[2294,2750,2751,2758,2761],{},[2313,2752,2753,2580,2756],{"align":2299},[47,2754,2755],{},"Mod+Shift+K",[47,2757,2707],{},[2313,2759,2760],{"align":2299},"工作区顺序下移",[2313,2762,2748],{"align":2299},[2294,2764,2765,2775,2778],{},[2313,2766,2767,2580,2770,2580,2773],{"align":2299},[47,2768,2769],{},"Mod+Ctrl+I",[47,2771,2772],{},"Up",[47,2774,2692],{},[2313,2776,2777],{"align":2299},"列移至上一工作区",[2313,2779,2780],{"align":2299},"带窗口跨区移动",[2294,2782,2783,2793,2796],{},[2313,2784,2785,2580,2788,2580,2791],{"align":2299},[47,2786,2787],{},"Mod+Ctrl+K",[47,2789,2790],{},"Down",[47,2792,2710],{},[2313,2794,2795],{"align":2299},"列移至下一工作区",[2313,2797,2780],{"align":2299},[32,2799,2801],{"id":2800},"窗口与列-column-布局控制","🪟 窗口与列 (Column) 布局控制",[2288,2803,2804,2814],{},[2291,2805,2806],{},[2294,2807,2808,2810,2812],{},[2297,2809,2434],{"align":2299},[2297,2811,2437],{"align":2299},[2297,2813,2440],{"align":2299},[2308,2815,2816,2829,2842,2855,2868,2881,2894,2907,2919,2932,2945,2958,2971,2984,2997,3013,3026,3042,3057,3072,3087,3100,3112,3125],{},[2294,2817,2818,2823,2826],{},[2313,2819,2820],{"align":2299},[47,2821,2822],{},"Mod+Q",[2313,2824,2825],{"align":2299},"关闭当前窗口",[2313,2827,2828],{"align":2299},"安全退出",[2294,2830,2831,2836,2839],{},[2313,2832,2833],{"align":2299},[47,2834,2835],{},"Mod+Shift+T",[2313,2837,2838],{"align":2299},"切换浮动\u002F平铺",[2313,2840,2841],{"align":2299},"脱离平铺自由拖拽",[2294,2843,2844,2849,2852],{},[2313,2845,2846],{"align":2299},[47,2847,2848],{},"Mod+Shift+V",[2313,2850,2851],{"align":2299},"焦点切换浮\u002F平",[2313,2853,2854],{"align":2299},"快速跳转两类窗口",[2294,2856,2857,2862,2865],{},[2313,2858,2859],{"align":2299},[47,2860,2861],{},"Mod+Shift+F",[2313,2863,2864],{"align":2299},"窗口全屏",[2313,2866,2867],{"align":2299},"切换焦点窗口全屏",[2294,2869,2870,2875,2878],{},[2313,2871,2872],{"align":2299},[47,2873,2874],{},"Mod+F",[2313,2876,2877],{"align":2299},"最大化当前列",[2313,2879,2880],{"align":2299},"列占满垂直空间",[2294,2882,2883,2888,2891],{},[2313,2884,2885],{"align":2299},[47,2886,2887],{},"Mod+W",[2313,2889,2890],{"align":2299},"切换列标签页模式",[2313,2892,2893],{"align":2299},"多窗口堆叠为 Tab",[2294,2895,2896,2901,2904],{},[2313,2897,2898],{"align":2299},[47,2899,2900],{},"Mod+R",[2313,2902,2903],{"align":2299},"切换预设列宽",[2313,2905,2906],{"align":2299},"循环 30%\u002F50%\u002F70%",[2294,2908,2909,2913,2916],{},[2313,2910,2911],{"align":2299},[47,2912,2277],{},[2313,2914,2915],{"align":2299},"切换预设窗口高度",[2313,2917,2918],{"align":2299},"循环高度比例",[2294,2920,2921,2926,2929],{},[2313,2922,2923],{"align":2299},[47,2924,2925],{},"Mod+C",[2313,2927,2928],{"align":2299},"居中当前列",[2313,2930,2931],{"align":2299},"水平居中",[2294,2933,2934,2939,2942],{},[2313,2935,2936],{"align":2299},[47,2937,2938],{},"Mod+Ctrl+C",[2313,2940,2941],{"align":2299},"居中可见列",[2313,2943,2944],{"align":2299},"所有可见列整体居中",[2294,2946,2947,2952,2955],{},[2313,2948,2949],{"align":2299},[47,2950,2951],{},"Mod+Ctrl+Home",[2313,2953,2954],{"align":2299},"列移至最左",[2313,2956,2957],{"align":2299},"工作区起始位置",[2294,2959,2960,2965,2968],{},[2313,2961,2962],{"align":2299},[47,2963,2964],{},"Mod+Ctrl+End",[2313,2966,2967],{"align":2299},"列移至最右",[2313,2969,2970],{"align":2299},"工作区末尾位置",[2294,2972,2973,2978,2981],{},[2313,2974,2975],{"align":2299},[47,2976,2977],{},"Mod+Ctrl+F",[2313,2979,2980],{"align":2299},"列宽扩展至可用",[2313,2982,2983],{"align":2299},"填满左右空白",[2294,2985,2986,2991,2994],{},[2313,2987,2988],{"align":2299},[47,2989,2990],{},"Mod+Ctrl+R",[2313,2992,2993],{"align":2299},"重置窗口高度",[2313,2995,2996],{"align":2299},"恢复默认比例",[2294,2998,2999,3007,3010],{},[2313,3000,3001,2580,3004],{"align":2299},[47,3002,3003],{},"Mod+[",[47,3005,3006],{},"]",[2313,3008,3009],{"align":2299},"窗口吞入\u002F排出列",[2313,3011,3012],{"align":2299},"合并到左\u002F右相邻列",[2294,3014,3015,3020,3023],{},[2313,3016,3017],{"align":2299},[47,3018,3019],{},"Mod+.",[2313,3021,3022],{"align":2299},"窗口独立成新列",[2313,3024,3025],{"align":2299},"从当前列拆分",[2294,3027,3028,3036,3039],{},[2313,3029,3030,2580,3033],{"align":2299},[47,3031,3032],{},"Mod+=",[47,3034,3035],{},"-",[2313,3037,3038],{"align":2299},"列宽 ±10%",[2313,3040,3041],{"align":2299},"精细调整宽度",[2294,3043,3044,3051,3054],{},[2313,3045,3046,2580,3049],{"align":2299},[47,3047,3048],{},"Mod+Shift+=",[47,3050,3035],{},[2313,3052,3053],{"align":2299},"窗口高度 ±10%",[2313,3055,3056],{"align":2299},"精细调整高度",[2294,3058,3059,3066,3069],{},[2313,3060,3061,2580,3064],{"align":2299},[47,3062,3063],{},"Mod+Shift+Left",[47,3065,2692],{},[2313,3067,3068],{"align":2299},"整列左移",[2313,3070,3071],{"align":2299},"列及内部窗口左移",[2294,3073,3074,3081,3084],{},[2313,3075,3076,2580,3079],{"align":2299},[47,3077,3078],{},"Mod+Shift+Right",[47,3080,2710],{},[2313,3082,3083],{"align":2299},"整列右移",[2313,3085,3086],{"align":2299},"列及内部窗口右移",[2294,3088,3089,3094,3097],{},[2313,3090,3091],{"align":2299},[47,3092,3093],{},"Mod+Shift+Down",[2313,3095,3096],{"align":2299},"窗口在列内下移",[2313,3098,3099],{"align":2299},"调整同列上下顺序",[2294,3101,3102,3107,3110],{},[2313,3103,3104],{"align":2299},[47,3105,3106],{},"Mod+Shift+Up",[2313,3108,3109],{"align":2299},"窗口在列内上移",[2313,3111,3099],{"align":2299},[2294,3113,3114,3119,3122],{},[2313,3115,3116],{"align":2299},[47,3117,3118],{},"Mod+Ctrl+Shift+滚轮上\u002F下",[2313,3120,3121],{"align":2299},"滚轮快移左\u002F右列",[2313,3123,3124],{"align":2299},"加速列位置调整",[2294,3126,3127,3132,3135],{},[2313,3128,3129],{"align":2299},[47,3130,3131],{},"Mod+Ctrl+滚轮左\u002F右",[2313,3133,3134],{"align":2299},"滚轮移左\u002F右列",[2313,3136,3137],{"align":2299},"基础列移动",[32,3139,3141],{"id":3140},"焦点与导航-你的自定义映射","🎯 焦点与导航 (你的自定义映射)",[2288,3143,3144,3154],{},[2291,3145,3146],{},[2294,3147,3148,3150,3152],{},[2297,3149,2434],{"align":2299},[2297,3151,2437],{"align":2299},[2297,3153,2440],{"align":2299},[2308,3155,3156,3170,3183,3197,3216,3231,3243,3255,3268,3281],{},[2294,3157,3158,3162,3165],{},[2313,3159,3160],{"align":2299},[47,3161,2353],{},[2313,3163,3164],{"align":2299},"焦点下移窗口",[2313,3166,3167],{"align":2299},[233,3168,3169],{},"⚠️ 你的自定义",[2294,3171,3172,3176,3179],{},[2313,3173,3174],{"align":2299},[47,3175,2335],{},[2313,3177,3178],{"align":2299},"焦点上移窗口",[2313,3180,3181],{"align":2299},[233,3182,3169],{},[2294,3184,3185,3189,3192],{},[2313,3186,3187],{"align":2299},[47,3188,2371],{},[2313,3190,3191],{"align":2299},"焦点左移列",[2313,3193,3194],{"align":2299},[233,3195,3196],{},"️ 你的自定义",[2294,3198,3199,3210,3213],{},[2313,3200,3201,2580,3204,2580,3207],{"align":2299},[47,3202,3203],{},"Mod+L",[47,3205,3206],{},"Right",[47,3208,3209],{},"滚轮右",[2313,3211,3212],{"align":2299},"焦点右移列",[2313,3214,3215],{"align":2299},"向右切换列焦点",[2294,3217,3218,3226,3228],{},[2313,3219,3220,2580,3223],{"align":2299},[47,3221,3222],{},"Mod+Left",[47,3224,3225],{},"滚轮左",[2313,3227,3191],{"align":2299},[2313,3229,3230],{"align":2299},"向左切换列焦点",[2294,3232,3233,3238,3240],{},[2313,3234,3235],{"align":2299},[47,3236,3237],{},"Mod+Down",[2313,3239,3164],{"align":2299},[2313,3241,3242],{"align":2299},"同列向下切换",[2294,3244,3245,3250,3252],{},[2313,3246,3247],{"align":2299},[47,3248,3249],{},"Mod+Up",[2313,3251,3178],{"align":2299},[2313,3253,3254],{"align":2299},"同列向上切换",[2294,3256,3257,3262,3265],{},[2313,3258,3259],{"align":2299},[47,3260,3261],{},"Mod+Home",[2313,3263,3264],{"align":2299},"焦点跳至第一列",[2313,3266,3267],{"align":2299},"快速回顶部",[2294,3269,3270,3275,3278],{},[2313,3271,3272],{"align":2299},[47,3273,3274],{},"Mod+End",[2313,3276,3277],{"align":2299},"焦点跳至最后一列",[2313,3279,3280],{"align":2299},"快速跳尾部",[2294,3282,3283,3288,3291],{},[2313,3284,3285],{"align":2299},[47,3286,3287],{},"Mod+Shift+滚轮上\u002F下",[2313,3289,3290],{"align":2299},"滚轮快切左\u002F右列焦点",[2313,3292,3293],{"align":2299},"加速焦点移动",[32,3295,3297],{"id":3296},"️-多显示器-monitor-控制","🖥️ 多显示器 (Monitor) 控制",[2288,3299,3300,3310],{},[2291,3301,3302],{},[2294,3303,3304,3306,3308],{},[2297,3305,2434],{"align":2299},[2297,3307,2437],{"align":2299},[2297,3309,2440],{"align":2299},[2308,3311,3312,3325,3339,3352,3366,3382,3397,3412],{},[2294,3313,3314,3319,3322],{},[2313,3315,3316],{"align":2299},[47,3317,3318],{},"Mod+Ctrl+Left",[2313,3320,3321],{"align":2299},"焦点切至左侧显示器",[2313,3323,3324],{"align":2299},"跨屏跳转",[2294,3326,3327,3332,3335],{},[2313,3328,3329],{"align":2299},[47,3330,3331],{},"Mod+Ctrl+H",[2313,3333,3334],{"align":2299},"焦点切至下方显示器",[2313,3336,3337],{"align":2299},[233,3338,3169],{},[2294,3340,3341,3345,3348],{},[2313,3342,3343],{"align":2299},[47,3344,2787],{},[2313,3346,3347],{"align":2299},"焦点切至上方显示器",[2313,3349,3350],{"align":2299},[233,3351,3169],{},[2294,3353,3354,3361,3364],{},[2313,3355,3356,2580,3359],{"align":2299},[47,3357,3358],{},"Mod+Ctrl+L",[47,3360,3206],{},[2313,3362,3363],{"align":2299},"焦点切至右侧显示器",[2313,3365,3324],{"align":2299},[2294,3367,3368,3376,3379],{},[2313,3369,3370,2580,3373],{"align":2299},[47,3371,3372],{},"Mod+Shift+Ctrl+Left",[47,3374,3375],{},"H",[2313,3377,3378],{"align":2299},"列移至左\u002F下显示器",[2313,3380,3381],{"align":2299},"窗口跨屏移动",[2294,3383,3384,3392,3395],{},[2313,3385,3386,2580,3389],{"align":2299},[47,3387,3388],{},"Mod+Shift+Ctrl+Right",[47,3390,3391],{},"L",[2313,3393,3394],{"align":2299},"列移至右\u002F右显示器",[2313,3396,3381],{"align":2299},[2294,3398,3399,3407,3410],{},[2313,3400,3401,2580,3404],{"align":2299},[47,3402,3403],{},"Mod+Shift+Ctrl+Up",[47,3405,3406],{},"K",[2313,3408,3409],{"align":2299},"列移至上\u002F上显示器",[2313,3411,3381],{"align":2299},[2294,3413,3414,3422,3425],{},[2313,3415,3416,2580,3419],{"align":2299},[47,3417,3418],{},"Mod+Shift+Ctrl+Down",[47,3420,3421],{},"J",[2313,3423,3424],{"align":2299},"列移至下\u002F下显示器",[2313,3426,3381],{"align":2299},[32,3428,3430],{"id":3429},"截图媒体与硬件按键","📸 截图、媒体与硬件按键",[2288,3432,3433,3443],{},[2291,3434,3435],{},[2294,3436,3437,3439,3441],{},[2297,3438,2434],{"align":2299},[2297,3440,2437],{"align":2299},[2297,3442,2440],{"align":2299},[2308,3444,3445,3461,3477,3493,3506,3519,3532,3545,3558,3571,3586],{},[2294,3446,3447,3455,3458],{},[2313,3448,3449,2580,3452],{"align":2299},[47,3450,3451],{},"Print",[47,3453,3454],{},"XF86Launch1",[2313,3456,3457],{"align":2299},"区域截图",[2313,3459,3460],{"align":2299},"鼠标框选截图",[2294,3462,3463,3471,3474],{},[2313,3464,3465,2580,3468],{"align":2299},[47,3466,3467],{},"Ctrl+Print",[47,3469,3470],{},"Ctrl+XF86Launch1",[2313,3472,3473],{"align":2299},"截取当前屏幕",[2313,3475,3476],{"align":2299},"全屏截图",[2294,3478,3479,3487,3490],{},[2313,3480,3481,2580,3484],{"align":2299},[47,3482,3483],{},"Alt+Print",[47,3485,3486],{},"Alt+XF86Launch1",[2313,3488,3489],{"align":2299},"截取当前窗口",[2313,3491,3492],{"align":2299},"仅焦点窗口",[2294,3494,3495,3500,3503],{},[2313,3496,3497],{"align":2299},[47,3498,3499],{},"Mod+Shift+P",[2313,3501,3502],{"align":2299},"关闭显示器电源",[2313,3504,3505],{"align":2299},"硬件级息屏",[2294,3507,3508,3513,3516],{},[2313,3509,3510],{"align":2299},[47,3511,3512],{},"XF86AudioMute",[2313,3514,3515],{"align":2299},"系统静音",[2313,3517,3518],{"align":2299},"全局音频静音",[2294,3520,3521,3526,3529],{},[2313,3522,3523],{"align":2299},[47,3524,3525],{},"XF86AudioMicMute",[2313,3527,3528],{"align":2299},"麦克风静音",[2313,3530,3531],{"align":2299},"硬件麦克风开关",[2294,3533,3534,3539,3542],{},[2313,3535,3536],{"align":2299},[47,3537,3538],{},"XF86AudioLower\u002FRaiseVolume",[2313,3540,3541],{"align":2299},"系统音量 ±3%",[2313,3543,3544],{"align":2299},"调整主音量",[2294,3546,3547,3552,3555],{},[2313,3548,3549],{"align":2299},[47,3550,3551],{},"Ctrl+XF86AudioLower\u002FRaiseVolume",[2313,3553,3554],{"align":2299},"媒体音量 ±3%",[2313,3556,3557],{"align":2299},"调整播放器音量",[2294,3559,3560,3565,3568],{},[2313,3561,3562],{"align":2299},[47,3563,3564],{},"XF86AudioPlay\u002FPause",[2313,3566,3567],{"align":2299},"播放 \u002F 暂停",[2313,3569,3570],{"align":2299},"媒体控制",[2294,3572,3573,3581,3584],{},[2313,3574,3575,2580,3578],{"align":2299},[47,3576,3577],{},"XF86AudioNext",[47,3579,3580],{},"Prev",[2313,3582,3583],{"align":2299},"下一曲 \u002F 上一曲",[2313,3585,3570],{"align":2299},[2294,3587,3588,3593,3596],{},[2313,3589,3590],{"align":2299},[47,3591,3592],{},"XF86MonBrightnessUp\u002FDown",[2313,3594,3595],{"align":2299},"屏幕亮度 ±5%",[2313,3597,3598],{"align":2299},"调整显示器亮度",[32,3600,3602],{"id":3601},"️-开发与快捷启动","🛠️ 开发与快捷启动",[2288,3604,3605,3615],{},[2291,3606,3607],{},[2294,3608,3609,3611,3613],{},[2297,3610,2434],{"align":2299},[2297,3612,2437],{"align":2299},[2297,3614,2440],{"align":2299},[2308,3616,3617],{},[2294,3618,3619,3624,3627],{},[2313,3620,3621],{"align":2299},[47,3622,3623],{},"Mod+T",[2313,3625,3626],{"align":2299},"打开终端",[2313,3628,3629,3630],{"align":2299},"默认启动 ",[47,3631,3632],{},"kitty",[2420,3634],{},[236,3636,3638],{"id":3637},"使用建议","📌 使用建议",[1967,3640,3641,3651,3667,3673],{},[1970,3642,3643,3646,3647,3650],{},[233,3644,3645],{},"肌肉记忆重塑","：你的 ",[47,3648,3649],{},"H\u002FJ\u002FK\u002FU"," 布局已完全自定义，建议打印此表贴于显示器旁，3~5 天即可形成新反射。",[1970,3652,3653,3656,3657,3659,3660,3662,3663,3666],{},[233,3654,3655],{},"冲突排查","：若 ",[47,3658,2317],{}," 或 ",[47,3661,2353],{}," 无响应，检查输入法（IBus\u002FFcitx）是否占用了相同组合键。可在输入法设置中关闭全局快捷键，或临时改用 ",[47,3664,3665],{},"Mod+Ctrl+字母"," 避开。",[1970,3668,3669,3672],{},[233,3670,3671],{},"滚轮辅助","：niri 原生支持滚轮切换工作区\u002F列，适合快速浏览；精细窗口操作建议保留键盘。",[1970,3674,3675,3678,3679,3682,3683,3659,3686,3689,3690,3693,3694,3696,3697,2264],{},[233,3676,3677],{},"持续迭代","：后续如需绑定 ",[47,3680,3681],{},"msim","、",[47,3684,3685],{},"ros2",[47,3687,3688],{},"yazi"," 快捷启动，直接在 ",[47,3691,3692],{},"~\u002F.config\u002Fniri\u002Fconfig.kdl"," 的 ",[47,3695,2270],{}," 末尾追加：",[47,3698,3699],{},"Mod+新键 { spawn \"你的命令\"; }",{"title":45,"searchDepth":104,"depth":104,"links":3701},[3702,3703,3704,3705,3706,3707,3708,3709],{"id":2285,"depth":89,"text":2286},{"id":2424,"depth":89,"text":2425},{"id":2647,"depth":89,"text":2648},{"id":2800,"depth":89,"text":2801},{"id":3140,"depth":89,"text":3141},{"id":3296,"depth":89,"text":3297},{"id":3429,"depth":89,"text":3430},{"id":3601,"depth":89,"text":3602,"children":3710},[3711],{"id":3637,"depth":98,"text":3638},"DMS 快捷键",{},"\u002Fwiki\u002Flinux\u002Fniri-dms-using-clue\u002Fdms-keys",{"title":2231,"description":3712},"wiki\u002Flinux\u002Fniri-dms-using-clue\u002Fdms-keys",[215],"pl82cOt2TJPmkJ3dgQCVIBinL8jbtgoN_CG_G_gYQy4",{"id":3720,"title":3721,"body":3722,"category":215,"date":196,"description":3864,"draft":198,"extension":199,"featured":198,"meta":3865,"navigation":201,"path":3866,"seo":3867,"stem":3868,"tags":3869,"type":206,"__hash__":3870},"content\u002Fwiki\u002Flinux\u002Fyazi-d6f0b09.md","Yazi食用方法",{"type":8,"value":3723,"toc":3860},[3724,3728,3732,3775,3779],[2235,3725,3727],{"id":3726},"yazi简易使用方式","🦆yazi简易使用方式",[32,3729,3731],{"id":3730},"一yazi操作类","一、yazi操作类",[2288,3733,3734,3745],{},[2291,3735,3736],{},[2294,3737,3738,3741,3743],{},[2297,3739,3740],{"align":2299},"操作",[2297,3742,2434],{"align":2299},[2297,3744],{},[2308,3746,3747,3763],{},[2294,3748,3749,3752,3761],{},[2313,3750,3751],{"align":2299},"打开yazi",[2313,3753,3754,3757,3758,3760],{"align":2299},[47,3755,3756],{},"y","（或者",[47,3759,3688],{},"）",[2313,3762],{},[2294,3764,3765,3768,3773],{},[2313,3766,3767],{"align":2299},"关闭yazi",[2313,3769,3770],{"align":2299},[47,3771,3772],{},"q",[2313,3774],{},[32,3776,3778],{"id":3777},"二文件操作类","二、文件操作类",[2288,3780,3781,3791],{},[2291,3782,3783],{},[2294,3784,3785,3787,3789],{},[2297,3786,3740],{"align":2299},[2297,3788,2434],{"align":2299},[2297,3790],{},[2308,3792,3793,3806,3819,3833,3846],{},[2294,3794,3795,3800,3804],{},[2313,3796,3797],{"align":2299},[233,3798,3799],{},"创建文件",[2313,3801,3802],{"align":2299},[47,3803,20],{},[2313,3805],{},[2294,3807,3808,3813,3817],{},[2313,3809,3810],{"align":2299},[233,3811,3812],{},"复制文件",[2313,3814,3815],{"align":2299},[47,3816,3756],{},[2313,3818],{},[2294,3820,3821,3826,3831],{},[2313,3822,3823],{"align":2299},[233,3824,3825],{},"剪贴文件",[2313,3827,3828],{"align":2299},[47,3829,3830],{},"x",[2313,3832],{},[2294,3834,3835,3840,3844],{},[2313,3836,3837],{"align":2299},[233,3838,3839],{},"粘贴文件",[2313,3841,3842],{"align":2299},[47,3843,11],{},[2313,3845],{},[2294,3847,3848,3853,3858],{},[2313,3849,3850],{"align":2299},[233,3851,3852],{},"查找文件",[2313,3854,3855],{"align":2299},[47,3856,3857],{},"z",[2313,3859],{},{"title":45,"searchDepth":104,"depth":104,"links":3861},[3862,3863],{"id":3730,"depth":89,"text":3731},{"id":3777,"depth":89,"text":3778},"最美味的食材往往有着最朴素的烹饪方法",{},"\u002Fwiki\u002Flinux\u002Fyazi-d6f0b09",{"title":3721,"description":3864},"wiki\u002Flinux\u002Fyazi-d6f0b09",[215],"B5Ck4m6PCAxllBEUvqxiZMYvr_hcx9GVI6vTJqMCWRs",{"id":3872,"title":3873,"body":3874,"category":7857,"date":216,"description":7858,"draft":198,"extension":199,"featured":198,"meta":7859,"navigation":201,"path":7860,"seo":7861,"stem":7862,"tags":7863,"type":206,"__hash__":7864},"content\u002Fwiki\u002Frobotics\u002Fmujoco\u002Fmujoco-28267cc.md","Mujoco学习记录",{"type":8,"value":3875,"toc":7836},[3876,3884,3892,3900,3904,3909,3992,3996,4009,4229,4232,4280,4288,4295,4301,4380,4383,4401,4405,4408,4488,4491,4576,4597,4601,4605,4622,4657,4661,4665,4669,4672,4698,4702,4886,4891,6492,6497,7222,7226,7249,7506,7511,7601,7610,7760,7763,7767,7770,7778,7833],[11,3877,3878,3879],{},"📖参考资料：\nMujoco官网：",[20,3880,3883],{"href":3881,"rel":3882},"https:\u002F\u002Fmujoco.readthedocs.io\u002Fen\u002Fstable\u002Foverview.html",[24],"MuJoCo 官方文档",[11,3885,3886,3887],{},"学习连接: ",[20,3888,3891],{"href":3889,"rel":3890},"https:\u002F\u002Fgithub.com\u002FAlbusgive\u002Fmujoco_learning\u002Ftree\u002Fmain",[24],"MuJoCo 学习参考",[11,3893,3894,3895],{},"学习视频链接",[20,3896,3899],{"href":3897,"rel":3898},"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1wMdHYVEnx?vd_source=6bb9dc8d77886fc937032b139ad7debc",[24],"【教程】2025新版mujoco建模与仿真",[32,3901,3903],{"id":3902},"一环境安装","一、环境安装",[11,3905,3906,2247],{},[233,3907,3908],{},"MuJoCo 常见有三种安装方式，按使用场景选择即可",[2288,3910,3911,3927],{},[2291,3912,3913],{},[2294,3914,3915,3918,3921,3924],{},[2297,3916,3917],{},"安装方式",[2297,3919,3920],{},"优点",[2297,3922,3923],{},"缺点",[2297,3925,3926],{},"适合场景",[2308,3928,3929,3950,3968,3982],{},[2294,3930,3931,3934,3944,3947],{},[2313,3932,3933],{},"官方 Release 二进制",[2313,3935,3936,3937,3682,3940,3943],{},"安装简单，包含 ",[47,3938,3939],{},"simulate",[47,3941,3942],{},"compile"," 等工具，适合 C\u002FC++ 开发",[2313,3945,3946],{},"需要手动配置环境变量；平台和架构必须匹配",[2313,3948,3949],{},"使用官方示例、C\u002FC++、命令行工具",[2294,3951,3952,3959,3962,3965],{},[2313,3953,3954,3955,3958],{},"Python ",[47,3956,3957],{},"pip"," 包",[2313,3960,3961],{},"安装最快，自动携带 MuJoCo 动态库；便于与 Gymnasium、强化学习库结合",[2313,3963,3964],{},"不提供完整的源码和桌面工具；主要面向 Python",[2313,3966,3967],{},"Python 仿真、强化学习、快速验证",[2294,3969,3970,3973,3976,3979],{},[2313,3971,3972],{},"源码编译",[2313,3974,3975],{},"可修改源码、启用调试和自定义编译选项",[2313,3977,3978],{},"编译时间长，依赖多，维护成本高",[2313,3980,3981],{},"修改 MuJoCo 内核、底层开发、贡献代码",[2294,3983,3984,3986,3988,3990],{},[2313,3985],{},[2313,3987],{},[2313,3989],{},[2313,3991],{},[236,3993,3995],{"id":3994},"_11-下载官方release版本","1.1 下载官方Release版本",[11,3997,3998,3999,4004,4005],{},"MuJoCo 的官方二进制 Release 可从 ",[20,4000,4003],{"href":4001,"rel":4002},"https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fmujoco\u002Freleases",[24],"GitHub Releases"," 下载。以下以 Linux x86_64 为例（版本号请替换为 Release 页面中的最新版本）：\n",[243,4006],{"alt":4007,"src":4008},"633","\u002Ffongtszho.web\u002Fwiki-assets\u002Fpictures-1786633819387106425.png",[40,4010,4012],{"className":42,"code":4011,"language":44,"meta":45,"style":45},"# Ubuntu\u002FDebian 依赖\nsudo apt update\nsudo apt install -y libglfw3 libglew2.2 libosmesa6 libxrandr2 libxinerama1 libxcursor1\n\n# Fedora 依赖（与上面的 apt 命令二选一）\nsudo dnf install -y glfw glew libglvnd-glx mesa-libOSMesa libXrandr libXinerama libXcursor\n\n# 下载并解压官方 Release\ncd ~\u002FApplications\nwget https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fmujoco\u002Freleases\u002Fdownload\u002F3.7.0\u002Fmujoco-3.7.0-linux-x86_64.tar.gz\ntar -xzf mujoco-3.7.0-linux-x86_64.tar.gz\n\n# 配置环境变量（也可将下面三行写入 ~\u002F.bashrc）\nexport MUJOCO_HOME=\"$HOME\u002FApplications\u002Fmujoco-3.7.0\"\nexport PATH=\"$MUJOCO_HOME\u002Fbin:$PATH\"\nexport LD_LIBRARY_PATH=\"$MUJOCO_HOME\u002Fbin:${LD_LIBRARY_PATH:-}\"\n\n# 4. 验证安装：查看版本并启动官方模拟器\ncompile -h\nsimulate\n",[47,4013,4014,4019,4028,4057,4061,4066,4097,4101,4106,4113,4121,4132,4136,4141,4160,4183,4208,4212,4217,4224],{"__ignoreMap":45},[50,4015,4016],{"class":52,"line":53},[50,4017,4018],{"class":85},"# Ubuntu\u002FDebian 依赖\n",[50,4020,4021,4023,4025],{"class":52,"line":89},[50,4022,281],{"class":56},[50,4024,358],{"class":64},[50,4026,4027],{"class":64}," update\n",[50,4029,4030,4032,4034,4036,4039,4042,4045,4048,4051,4054],{"class":52,"line":98},[50,4031,281],{"class":56},[50,4033,358],{"class":64},[50,4035,373],{"class":64},[50,4037,4038],{"class":60}," -y",[50,4040,4041],{"class":64}," libglfw3",[50,4043,4044],{"class":64}," libglew2.2",[50,4046,4047],{"class":64}," libosmesa6",[50,4049,4050],{"class":64}," libxrandr2",[50,4052,4053],{"class":64}," libxinerama1",[50,4055,4056],{"class":64}," libxcursor1\n",[50,4058,4059],{"class":52,"line":104},[50,4060,745],{"emptyLinePlaceholder":201},[50,4062,4063],{"class":52,"line":112},[50,4064,4065],{"class":85},"# Fedora 依赖（与上面的 apt 命令二选一）\n",[50,4067,4068,4070,4072,4074,4076,4079,4082,4085,4088,4091,4094],{"class":52,"line":118},[50,4069,281],{"class":56},[50,4071,1310],{"class":64},[50,4073,373],{"class":64},[50,4075,4038],{"class":60},[50,4077,4078],{"class":64}," glfw",[50,4080,4081],{"class":64}," glew",[50,4083,4084],{"class":64}," libglvnd-glx",[50,4086,4087],{"class":64}," mesa-libOSMesa",[50,4089,4090],{"class":64}," libXrandr",[50,4092,4093],{"class":64}," libXinerama",[50,4095,4096],{"class":64}," libXcursor\n",[50,4098,4099],{"class":52,"line":127},[50,4100,745],{"emptyLinePlaceholder":201},[50,4102,4103],{"class":52,"line":133},[50,4104,4105],{"class":85},"# 下载并解压官方 Release\n",[50,4107,4108,4110],{"class":52,"line":142},[50,4109,1787],{"class":60},[50,4111,4112],{"class":64}," ~\u002FApplications\n",[50,4114,4115,4118],{"class":52,"line":148},[50,4116,4117],{"class":56},"wget",[50,4119,4120],{"class":64}," https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fmujoco\u002Freleases\u002Fdownload\u002F3.7.0\u002Fmujoco-3.7.0-linux-x86_64.tar.gz\n",[50,4122,4123,4126,4129],{"class":52,"line":599},[50,4124,4125],{"class":56},"tar",[50,4127,4128],{"class":60}," -xzf",[50,4130,4131],{"class":64}," mujoco-3.7.0-linux-x86_64.tar.gz\n",[50,4133,4134],{"class":52,"line":615},[50,4135,745],{"emptyLinePlaceholder":201},[50,4137,4138],{"class":52,"line":621},[50,4139,4140],{"class":85},"# 配置环境变量（也可将下面三行写入 ~\u002F.bashrc）\n",[50,4142,4143,4146,4149,4151,4154,4157],{"class":52,"line":844},[50,4144,4145],{"class":68},"export",[50,4147,4148],{"class":154}," MUJOCO_HOME",[50,4150,1834],{"class":68},[50,4152,4153],{"class":64},"\"",[50,4155,4156],{"class":154},"$HOME",[50,4158,4159],{"class":64},"\u002FApplications\u002Fmujoco-3.7.0\"\n",[50,4161,4162,4164,4167,4169,4171,4174,4177,4180],{"class":52,"line":850},[50,4163,4145],{"class":68},[50,4165,4166],{"class":154}," PATH",[50,4168,1834],{"class":68},[50,4170,4153],{"class":64},[50,4172,4173],{"class":154},"$MUJOCO_HOME",[50,4175,4176],{"class":64},"\u002Fbin:",[50,4178,4179],{"class":154},"$PATH",[50,4181,4182],{"class":64},"\"\n",[50,4184,4185,4187,4190,4192,4194,4196,4199,4202,4205],{"class":52,"line":874},[50,4186,4145],{"class":68},[50,4188,4189],{"class":154}," LD_LIBRARY_PATH",[50,4191,1834],{"class":68},[50,4193,4153],{"class":64},[50,4195,4173],{"class":154},[50,4197,4198],{"class":64},"\u002Fbin:${",[50,4200,4201],{"class":154},"LD_LIBRARY_PATH",[50,4203,4204],{"class":68},":-",[50,4206,4207],{"class":64},"}\"\n",[50,4209,4210],{"class":52,"line":880},[50,4211,745],{"emptyLinePlaceholder":201},[50,4213,4214],{"class":52,"line":885},[50,4215,4216],{"class":85},"# 4. 验证安装：查看版本并启动官方模拟器\n",[50,4218,4219,4221],{"class":52,"line":891},[50,4220,3942],{"class":56},[50,4222,4223],{"class":60}," -h\n",[50,4225,4226],{"class":52,"line":924},[50,4227,4228],{"class":56},"simulate\n",[11,4230,4231],{},"如果希望每次打开终端都自动生效，将环境变量追加到 shell 配置文件：",[40,4233,4235],{"className":42,"code":4234,"language":44,"meta":45,"style":45},"cat >> ~\u002F.bashrc \u003C\u003C'EOF'\nexport MUJOCO_HOME=\"$HOME\u002FApplications\u002Fmujoco-3.7.0\"\nexport PATH=\"$MUJOCO_HOME\u002Fbin:$PATH\"\nexport LD_LIBRARY_PATH=\"$MUJOCO_HOME\u002Fbin:${LD_LIBRARY_PATH:-}\"\nEOF\nsource ~\u002F.bashrc\n",[47,4236,4237,4253,4258,4263,4268,4273],{"__ignoreMap":45},[50,4238,4239,4242,4245,4247,4250],{"class":52,"line":53},[50,4240,4241],{"class":56},"cat",[50,4243,4244],{"class":68}," >>",[50,4246,2045],{"class":64},[50,4248,4249],{"class":68}," \u003C\u003C",[50,4251,4252],{"class":64},"'EOF'\n",[50,4254,4255],{"class":52,"line":89},[50,4256,4257],{"class":64},"export MUJOCO_HOME=\"$HOME\u002FApplications\u002Fmujoco-3.7.0\"\n",[50,4259,4260],{"class":52,"line":98},[50,4261,4262],{"class":64},"export PATH=\"$MUJOCO_HOME\u002Fbin:$PATH\"\n",[50,4264,4265],{"class":52,"line":104},[50,4266,4267],{"class":64},"export LD_LIBRARY_PATH=\"$MUJOCO_HOME\u002Fbin:${LD_LIBRARY_PATH:-}\"\n",[50,4269,4270],{"class":52,"line":112},[50,4271,4272],{"class":64},"EOF\n",[50,4274,4275,4277],{"class":52,"line":118},[50,4276,121],{"class":60},[50,4278,4279],{"class":64}," ~\u002F.bashrc\n",[11,4281,4282,4283,3682,4285,4287],{},"说明：Release 压缩包已经包含 MuJoCo 的运行库和 ",[47,4284,3939],{},[47,4286,3942],{}," 等工具，不需要再编译源码。若使用 ARM64、macOS 或 Windows，请在 Releases 页面选择对应平台的压缩包，并相应调整解压目录和动态库环境变量。",[236,4289,4291,4292,4294],{"id":4290},"_12-使用-python-pip-安装","1.2 使用 Python ",[47,4293,3957],{}," 安装",[11,4296,4297,4298,2247],{},"MuJoCo 官方 Python 绑定会自动下载并管理对应的 MuJoCo 二进制库，通常不需要手动设置 ",[47,4299,4300],{},"MUJOCO_HOME",[40,4302,4304],{"className":42,"code":4303,"language":44,"meta":45,"style":45},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate                 # Fedora\u002FUbuntu\npython -m pip install --upgrade pip\npython -m pip install mujoco\n\n# 验证\npython -c \"import mujoco; print(mujoco.__version__)\"\n",[47,4305,4306,4320,4330,4348,4361,4365,4370],{"__ignoreMap":45},[50,4307,4308,4311,4314,4317],{"class":52,"line":53},[50,4309,4310],{"class":56},"python3",[50,4312,4313],{"class":60}," -m",[50,4315,4316],{"class":64}," venv",[50,4318,4319],{"class":64}," .venv\n",[50,4321,4322,4324,4327],{"class":52,"line":89},[50,4323,121],{"class":60},[50,4325,4326],{"class":64}," .venv\u002Fbin\u002Factivate",[50,4328,4329],{"class":85},"                 # Fedora\u002FUbuntu\n",[50,4331,4332,4335,4337,4340,4342,4345],{"class":52,"line":98},[50,4333,4334],{"class":56},"python",[50,4336,4313],{"class":60},[50,4338,4339],{"class":64}," pip",[50,4341,373],{"class":64},[50,4343,4344],{"class":60}," --upgrade",[50,4346,4347],{"class":64}," pip\n",[50,4349,4350,4352,4354,4356,4358],{"class":52,"line":104},[50,4351,4334],{"class":56},[50,4353,4313],{"class":60},[50,4355,4339],{"class":64},[50,4357,373],{"class":64},[50,4359,4360],{"class":64}," mujoco\n",[50,4362,4363],{"class":52,"line":112},[50,4364,745],{"emptyLinePlaceholder":201},[50,4366,4367],{"class":52,"line":118},[50,4368,4369],{"class":85},"# 验证\n",[50,4371,4372,4374,4377],{"class":52,"line":127},[50,4373,4334],{"class":56},[50,4375,4376],{"class":60}," -c",[50,4378,4379],{"class":64}," \"import mujoco; print(mujoco.__version__)\"\n",[11,4381,4382],{},"如果使用 Gymnasium 等强化学习环境，可一并安装：",[40,4384,4386],{"className":42,"code":4385,"language":44,"meta":45,"style":45},"python -m pip install \"gymnasium[mujoco]\"\n",[47,4387,4388],{"__ignoreMap":45},[50,4389,4390,4392,4394,4396,4398],{"class":52,"line":53},[50,4391,4334],{"class":56},[50,4393,4313],{"class":60},[50,4395,4339],{"class":64},[50,4397,373],{"class":64},[50,4399,4400],{"class":64}," \"gymnasium[mujoco]\"\n",[236,4402,4404],{"id":4403},"_13-从源码编译","1.3 从源码编译",[11,4406,4407],{},"源码编译适合需要修改 MuJoCo 内核或进行底层调试的场景。先安装 Git、CMake、C\u002FC++ 编译器及图形依赖：",[40,4409,4411],{"className":42,"code":4410,"language":44,"meta":45,"style":45},"# Ubuntu\u002FDebian\nsudo apt update\nsudo apt install -y git cmake build-essential libglfw3-dev libglew-dev libosmesa6-dev\n\n# Fedora\nsudo dnf install -y git cmake gcc-c++ glfw-devel glew-devel mesa-libOSMesa-devel\n",[47,4412,4413,4418,4426,4453,4457,4462],{"__ignoreMap":45},[50,4414,4415],{"class":52,"line":53},[50,4416,4417],{"class":85},"# Ubuntu\u002FDebian\n",[50,4419,4420,4422,4424],{"class":52,"line":89},[50,4421,281],{"class":56},[50,4423,358],{"class":64},[50,4425,4027],{"class":64},[50,4427,4428,4430,4432,4434,4436,4439,4442,4444,4447,4450],{"class":52,"line":98},[50,4429,281],{"class":56},[50,4431,358],{"class":64},[50,4433,373],{"class":64},[50,4435,4038],{"class":60},[50,4437,4438],{"class":64}," git",[50,4440,4441],{"class":64}," cmake",[50,4443,376],{"class":64},[50,4445,4446],{"class":64}," libglfw3-dev",[50,4448,4449],{"class":64}," libglew-dev",[50,4451,4452],{"class":64}," libosmesa6-dev\n",[50,4454,4455],{"class":52,"line":104},[50,4456,745],{"emptyLinePlaceholder":201},[50,4458,4459],{"class":52,"line":112},[50,4460,4461],{"class":85},"# Fedora\n",[50,4463,4464,4466,4468,4470,4472,4474,4476,4479,4482,4485],{"class":52,"line":118},[50,4465,281],{"class":56},[50,4467,1310],{"class":64},[50,4469,373],{"class":64},[50,4471,4038],{"class":60},[50,4473,4438],{"class":64},[50,4475,4441],{"class":64},[50,4477,4478],{"class":64}," gcc-c++",[50,4480,4481],{"class":64}," glfw-devel",[50,4483,4484],{"class":64}," glew-devel",[50,4486,4487],{"class":64}," mesa-libOSMesa-devel\n",[11,4489,4490],{},"然后从官方仓库编译：",[40,4492,4494],{"className":42,"code":4493,"language":44,"meta":45,"style":45},"git clone https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fmujoco.git\ncd mujoco\ncmake -S . -B build -DCMAKE_BUILD_TYPE=Release\ncmake --build build -j\"$(nproc)\"\n\n# 可选：运行测试\nctest --test-dir build --output-on-failure\n",[47,4495,4496,4507,4513,4533,4554,4558,4563],{"__ignoreMap":45},[50,4497,4498,4501,4504],{"class":52,"line":53},[50,4499,4500],{"class":56},"git",[50,4502,4503],{"class":64}," clone",[50,4505,4506],{"class":64}," https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fmujoco.git\n",[50,4508,4509,4511],{"class":52,"line":89},[50,4510,1787],{"class":60},[50,4512,4360],{"class":64},[50,4514,4515,4518,4521,4524,4527,4530],{"class":52,"line":98},[50,4516,4517],{"class":56},"cmake",[50,4519,4520],{"class":60}," -S",[50,4522,4523],{"class":64}," .",[50,4525,4526],{"class":60}," -B",[50,4528,4529],{"class":64}," build",[50,4531,4532],{"class":60}," -DCMAKE_BUILD_TYPE=Release\n",[50,4534,4535,4537,4540,4542,4545,4548,4551],{"class":52,"line":104},[50,4536,4517],{"class":56},[50,4538,4539],{"class":60}," --build",[50,4541,4529],{"class":64},[50,4543,4544],{"class":60}," -j",[50,4546,4547],{"class":64},"\"$(",[50,4549,4550],{"class":56},"nproc",[50,4552,4553],{"class":64},")\"\n",[50,4555,4556],{"class":52,"line":112},[50,4557,745],{"emptyLinePlaceholder":201},[50,4559,4560],{"class":52,"line":118},[50,4561,4562],{"class":85},"# 可选：运行测试\n",[50,4564,4565,4568,4571,4573],{"class":52,"line":127},[50,4566,4567],{"class":56},"ctest",[50,4569,4570],{"class":60}," --test-dir",[50,4572,4529],{"class":64},[50,4574,4575],{"class":60}," --output-on-failure\n",[11,4577,4578,4579,4582,4583,3682,4586,4589,4590,4593,4594,4596],{},"源码构建完成后，可将 ",[47,4580,4581],{},"build","（或安装后的 ",[47,4584,4585],{},"bin",[47,4587,4588],{},"lib"," 目录）加入 ",[47,4591,4592],{},"PATH"," 和 ",[47,4595,4201],{},"；具体目录以当前版本的 CMake 输出为准。",[32,4598,4600],{"id":4599},"二搭建机器人模型","二、搭建机器人模型",[236,4602,4604],{"id":4603},"_21-使用sw转urdfurdf转mjcf","2.1  使用SW转URDF,URDF转MJCF",[2085,4606,4607,4619],{},[1970,4608,4609,4610,4615],{},"SW ->URDF\n详情请见Vinvi战队ROS2教程",[20,4611,4614],{"href":4612,"rel":4613},"https:\u002F\u002Fwww.sdutvincirobot.top\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0900-ke-shi-hua-ping-tai-rviz2-yu-urdf-jian-mo-yu-yan#sw2urdf",[24],"ROS2机器人操作系统教程",[243,4616],{"alt":4617,"src":4618},"730","\u002Ffongtszho.web\u002Fwiki-assets\u002Fpictures-pasted-image-20260721235907.png",[1970,4620,4621],{},"URDF->MJCF",[40,4623,4625],{"className":42,"code":4624,"language":44,"meta":45,"style":45},"#调用\n\u002Fmujoco安装路径\u002Fbin\u002Fcompile \u002Fyou_URDF_file_path  \u002FMJCF_path\n#示例\n\u002Fhome\u002Fxiaofang\u002FApplications\u002Fmujoco-3.7.0\u002Fbin\u002Fcompile \u002Fyou_URDF_file_path  \u002FMJCF_path\n",[47,4626,4627,4632,4643,4648],{"__ignoreMap":45},[50,4628,4629],{"class":52,"line":53},[50,4630,4631],{"class":85},"#调用\n",[50,4633,4634,4637,4640],{"class":52,"line":89},[50,4635,4636],{"class":56},"\u002Fmujoco安装路径\u002Fbin\u002Fcompile",[50,4638,4639],{"class":64}," \u002Fyou_URDF_file_path",[50,4641,4642],{"class":64},"  \u002FMJCF_path\n",[50,4644,4645],{"class":52,"line":98},[50,4646,4647],{"class":85},"#示例\n",[50,4649,4650,4653,4655],{"class":52,"line":104},[50,4651,4652],{"class":56},"\u002Fhome\u002Fxiaofang\u002FApplications\u002Fmujoco-3.7.0\u002Fbin\u002Fcompile",[50,4654,4639],{"class":64},[50,4656,4642],{"class":64},[32,4658,4660],{"id":4659},"三使用c开发","三、使用C++开发",[236,4662,4664],{"id":4663},"main-运行方式","main 运行方式",[1228,4666,4668],{"id":4667},"_1-使用官方的-bassiccc","1. 使用官方的 bassic.cc",[11,4670,4671],{},"打开模型",[40,4673,4677],{"className":4674,"code":4675,"language":4676,"meta":45,"style":45},"language-c++ shiki shiki-themes github-light github-dark","\u002F\u002F模型打开\nchar error[1000] = \"Could not load binary model\";\n\nm = mj_loadXML(\"..\u002Fmodels\u002Fcar.xml\", 0, error, 1000);\n","c++",[47,4678,4679,4684,4689,4693],{"__ignoreMap":45},[50,4680,4681],{"class":52,"line":53},[50,4682,4683],{},"\u002F\u002F模型打开\n",[50,4685,4686],{"class":52,"line":89},[50,4687,4688],{},"char error[1000] = \"Could not load binary model\";\n",[50,4690,4691],{"class":52,"line":98},[50,4692,745],{"emptyLinePlaceholder":201},[50,4694,4695],{"class":52,"line":104},[50,4696,4697],{},"m = mj_loadXML(\"..\u002Fmodels\u002Fcar.xml\", 0, error, 1000);\n",[1228,4699,4701],{"id":4700},"_2-使用ai改造的maincc-更加简洁只有基本的配置","2. 使用AI改造的main.cc （更加简洁，只有基本的配置）",[40,4703,4705],{"className":4674,"code":4704,"language":4676,"meta":45,"style":45},"\u002F\u002Fmaoi.cc\n\n#include \"simulator\u002Fsimulator.h\"\n#include \"control\u002Fcontrol.h\"\n\nint main()\n\n{\n\n    Simulator sim;\n    \n    \u002F\u002F 1. 加载模型\n    if (!sim.load_model(\"..\u002Fmodels\u002Fmodel.xml\"))\n    \n    return 1;\n    \n    \u002F\u002F 2. 初始化窗口和可视化\n    if (!sim.init_visual(1200, 900, \"WheelLeg Demo\"))\n    \n    return 1;\n    \n    \u002F\u002F 3. 设置相机跟踪\n    sim.set_camera_track(\"base_link\", 2.0);\n    \n    \u002F\u002F 4. 初始化控制器（手柄\u002FIMU\u002FPID）\n    CarController controller;\n    \n    controller.Init(sim.model(), sim.data());\n    \n    \u002F\u002F 5. 进入主循环\n    sim.run([&](mjModel* m, mjData* d) {\n    \n    controller.Main_Control_Update();\n    \n    });\n    return 0;\n\n}\n",[47,4706,4707,4712,4716,4721,4726,4730,4735,4739,4744,4748,4753,4757,4762,4767,4771,4776,4780,4785,4790,4794,4798,4802,4807,4812,4816,4821,4826,4830,4835,4839,4844,4849,4853,4858,4863,4869,4875,4880],{"__ignoreMap":45},[50,4708,4709],{"class":52,"line":53},[50,4710,4711],{},"\u002F\u002Fmaoi.cc\n",[50,4713,4714],{"class":52,"line":89},[50,4715,745],{"emptyLinePlaceholder":201},[50,4717,4718],{"class":52,"line":98},[50,4719,4720],{},"#include \"simulator\u002Fsimulator.h\"\n",[50,4722,4723],{"class":52,"line":104},[50,4724,4725],{},"#include \"control\u002Fcontrol.h\"\n",[50,4727,4728],{"class":52,"line":112},[50,4729,745],{"emptyLinePlaceholder":201},[50,4731,4732],{"class":52,"line":118},[50,4733,4734],{},"int main()\n",[50,4736,4737],{"class":52,"line":127},[50,4738,745],{"emptyLinePlaceholder":201},[50,4740,4741],{"class":52,"line":133},[50,4742,4743],{},"{\n",[50,4745,4746],{"class":52,"line":142},[50,4747,745],{"emptyLinePlaceholder":201},[50,4749,4750],{"class":52,"line":148},[50,4751,4752],{},"    Simulator sim;\n",[50,4754,4755],{"class":52,"line":599},[50,4756,315],{},[50,4758,4759],{"class":52,"line":615},[50,4760,4761],{},"    \u002F\u002F 1. 加载模型\n",[50,4763,4764],{"class":52,"line":621},[50,4765,4766],{},"    if (!sim.load_model(\"..\u002Fmodels\u002Fmodel.xml\"))\n",[50,4768,4769],{"class":52,"line":844},[50,4770,315],{},[50,4772,4773],{"class":52,"line":850},[50,4774,4775],{},"    return 1;\n",[50,4777,4778],{"class":52,"line":874},[50,4779,315],{},[50,4781,4782],{"class":52,"line":880},[50,4783,4784],{},"    \u002F\u002F 2. 初始化窗口和可视化\n",[50,4786,4787],{"class":52,"line":885},[50,4788,4789],{},"    if (!sim.init_visual(1200, 900, \"WheelLeg Demo\"))\n",[50,4791,4792],{"class":52,"line":891},[50,4793,315],{},[50,4795,4796],{"class":52,"line":924},[50,4797,4775],{},[50,4799,4800],{"class":52,"line":953},[50,4801,315],{},[50,4803,4804],{"class":52,"line":989},[50,4805,4806],{},"    \u002F\u002F 3. 设置相机跟踪\n",[50,4808,4809],{"class":52,"line":1023},[50,4810,4811],{},"    sim.set_camera_track(\"base_link\", 2.0);\n",[50,4813,4814],{"class":52,"line":1038},[50,4815,315],{},[50,4817,4818],{"class":52,"line":1058},[50,4819,4820],{},"    \u002F\u002F 4. 初始化控制器（手柄\u002FIMU\u002FPID）\n",[50,4822,4823],{"class":52,"line":1063},[50,4824,4825],{},"    CarController controller;\n",[50,4827,4828],{"class":52,"line":1075},[50,4829,315],{},[50,4831,4832],{"class":52,"line":1097},[50,4833,4834],{},"    controller.Init(sim.model(), sim.data());\n",[50,4836,4837],{"class":52,"line":1102},[50,4838,315],{},[50,4840,4841],{"class":52,"line":1121},[50,4842,4843],{},"    \u002F\u002F 5. 进入主循环\n",[50,4845,4846],{"class":52,"line":1130},[50,4847,4848],{},"    sim.run([&](mjModel* m, mjData* d) {\n",[50,4850,4851],{"class":52,"line":1146},[50,4852,315],{},[50,4854,4855],{"class":52,"line":1166},[50,4856,4857],{},"    controller.Main_Control_Update();\n",[50,4859,4861],{"class":52,"line":4860},34,[50,4862,315],{},[50,4864,4866],{"class":52,"line":4865},35,[50,4867,4868],{},"    });\n",[50,4870,4872],{"class":52,"line":4871},36,[50,4873,4874],{},"    return 0;\n",[50,4876,4878],{"class":52,"line":4877},37,[50,4879,745],{"emptyLinePlaceholder":201},[50,4881,4883],{"class":52,"line":4882},38,[50,4884,4885],{},"}\n",[11,4887,4888],{},[47,4889,4890],{},"simulator.cpp",[40,4892,4894],{"className":4674,"code":4893,"language":4676,"meta":45,"style":45},"#include \"simulator\u002Fsimulator.h\"\n\n#include \u003Ciostream>\n\n  \n\nSimulator::~Simulator()\n\n{\n\n\u002F\u002F 确保 OpenGL 上下文活跃再释放 MuJoCo 渲染资源\n\nif (window_) glfwMakeContextCurrent(window_);\n\nif (visual_ready_) mjr_freeContext(&con_);\n\nif (visual_ready_) mjv_freeScene(&scn_);\n\nif (d_) mj_deleteData(d_);\n\nif (m_) mj_deleteModel(m_);\n\nif (window_) glfwDestroyWindow(window_);\n\n\u002F\u002F Linux + NVIDIA 下 glfwTerminate 可能崩溃，仅 macOS\u002FWindows 调用\n\n#if defined(__APPLE__) || defined(_WIN32)\n\nif (window_) glfwTerminate();\n\n#endif\n\n}\n\n  \n\n\u002F\u002F ==================== 模型加载 ====================\n\nbool Simulator::load_model(const char* xml_path)\n\n{\n\nchar error[1000] = \"Could not load binary model\";\n\nm_ = mj_loadXML(xml_path, nullptr, error, sizeof(error));\n\nif (!m_) {\n\nstd::cerr \u003C\u003C \"[ERROR] 模型加载失败: \" \u003C\u003C error \u003C\u003C std::endl;\n\nreturn false;\n\n}\n\nd_ = mj_makeData(m_);\n\nreturn true;\n\n}\n\n  \n\n\u002F\u002F ==================== 可视化初始化 ====================\n\nbool Simulator::init_visual(int width, int height, const char* title)\n\n{\n\nif (!glfwInit()) {\n\nstd::cerr \u003C\u003C \"[ERROR] GLFW 初始化失败\" \u003C\u003C std::endl;\n\nreturn false;\n\n}\n\n  \n\nwindow_ = glfwCreateWindow(width, height, title, nullptr, nullptr);\n\nif (!window_) {\n\nstd::cerr \u003C\u003C \"[ERROR] 窗口创建失败\" \u003C\u003C std::endl;\n\nreturn false;\n\n}\n\n  \n\nglfwMakeContextCurrent(window_);\n\nglfwSwapInterval(1);\n\n  \n\n\u002F\u002F 通过 user pointer 绑定实例，供静态回调转发\n\nglfwSetWindowUserPointer(window_, this);\n\n  \n\n\u002F\u002F 注册回调\n\nglfwSetKeyCallback(window_, key_cb);\n\nglfwSetMouseButtonCallback(window_, mouse_cb);\n\nglfwSetCursorPosCallback(window_, move_cb);\n\nglfwSetScrollCallback(window_, scroll_cb);\n\n  \n\n\u002F\u002F MuJoCo 可视化初始化\n\nmjv_defaultCamera(&cam_);\n\nmjv_defaultOption(&opt_);\n\nmjv_defaultScene(&scn_);\n\nmjr_defaultContext(&con_);\n\n  \n\nmjv_makeScene(m_, &scn_, 2000);\n\nmjr_makeContext(m_, &con_, mjFONTSCALE_150);\n\n  \n\nvisual_ready_ = true;\n\nreturn true;\n\n}\n\n  \n\n\u002F\u002F ==================== 相机 ====================\n\nvoid Simulator::set_camera_track(const char* body_name, double distance)\n\n{\n\ncam_.type = mjCAMERA_TRACKING;\n\ncam_.trackbodyid = mj_name2id(m_, mjOBJ_BODY, body_name);\n\ncam_.distance = distance;\n\n}\n\n  \n\n\u002F\u002F ==================== 主循环 ====================\n\nvoid Simulator::run(std::function\u003Cvoid(mjModel*, mjData*)> update)\n\n{\n\nwhile (!glfwWindowShouldClose(window_))\n\n{\n\n\u002F\u002F 仿真：每帧跑 1\u002F60 秒\n\nmjtNum sim_start = d_->time;\n\nwhile (d_->time - sim_start \u003C 1.0 \u002F 60.0)\n\n{\n\nif (update) update(m_, d_);\n\nmj_step(m_, d_);\n\n}\n\n  \n\n\u002F\u002F 渲染\n\nmjrRect viewport = {0, 0, 0, 0};\n\nglfwGetFramebufferSize(window_, &viewport.width, &viewport.height);\n\n  \n\nmjv_updateScene(m_, d_, &opt_, nullptr, &cam_, mjCAT_ALL, &scn_);\n\nmjr_render(viewport, &scn_, &con_);\n\nglfwSwapBuffers(window_);\n\nglfwPollEvents();\n\n}\n\n}\n\n  \n\n\u002F\u002F ==================== 键盘回调 ====================\n\nvoid Simulator::on_key(int key, int act)\n\n{\n\n\u002F\u002F 转发给外部处理器\n\nif (key_handler_) key_handler_(key, act);\n\n  \n\n\u002F\u002F Backspace 重置仿真\n\nif (act == GLFW_PRESS && key == GLFW_KEY_BACKSPACE) {\n\nmj_resetData(m_, d_);\n\nmj_forward(m_, d_);\n\n}\n\n}\n\n  \n\n\u002F\u002F ==================== 鼠标按键回调 ====================\n\nvoid Simulator::on_mouse_button(int button, int act)\n\n{\n\nbtn_left_ = (glfwGetMouseButton(window_, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS);\n\nbtn_middle_ = (glfwGetMouseButton(window_, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS);\n\nbtn_right_ = (glfwGetMouseButton(window_, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS);\n\n  \n\nglfwGetCursorPos(window_, &lastx_, &lasty_);\n\n}\n\n  \n\n\u002F\u002F ==================== 鼠标移动回调 ====================\n\nvoid Simulator::on_mouse_move(double xpos, double ypos)\n\n{\n\nif (!btn_left_ && !btn_middle_ && !btn_right_) return;\n\n  \n\ndouble dx = xpos - lastx_;\n\ndouble dy = ypos - lasty_;\n\nlastx_ = xpos;\n\nlasty_ = ypos;\n\n  \n\nint width, height;\n\nglfwGetWindowSize(window_, &width, &height);\n\n  \n\nbool shift = (glfwGetKey(window_, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS ||\n\nglfwGetKey(window_, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS);\n\n  \n\nmjtMouse action;\n\nif (btn_right_) action = shift ? mjMOUSE_MOVE_H : mjMOUSE_MOVE_V;\n\nelse if (btn_left_) action = shift ? mjMOUSE_ROTATE_H : mjMOUSE_ROTATE_V;\n\nelse action = mjMOUSE_ZOOM;\n\n  \n\nmjv_moveCamera(m_, action, dx \u002F height, dy \u002F height, &scn_, &cam_);\n\n}\n\n  \n\n\u002F\u002F ==================== 滚轮回调 ====================\n\nvoid Simulator::on_scroll(double xoffset, double yoffset)\n\n{\n\nmjv_moveCamera(m_, mjMOUSE_ZOOM, 0, -0.05 * yoffset, &scn_, &cam_);\n\n}\n",[47,4895,4896,4900,4904,4909,4913,4918,4922,4927,4931,4935,4939,4944,4948,4953,4957,4962,4966,4971,4975,4980,4984,4989,4993,4998,5002,5007,5011,5016,5020,5025,5029,5034,5038,5042,5046,5050,5054,5059,5063,5069,5074,5079,5084,5089,5094,5100,5105,5111,5116,5122,5127,5133,5138,5143,5148,5154,5159,5165,5170,5175,5180,5185,5190,5196,5201,5207,5212,5217,5222,5228,5233,5239,5244,5249,5254,5259,5264,5269,5274,5280,5285,5291,5296,5302,5307,5312,5317,5322,5327,5332,5337,5343,5348,5354,5359,5364,5369,5375,5380,5386,5391,5396,5401,5407,5412,5418,5423,5429,5434,5440,5445,5451,5456,5461,5466,5472,5477,5483,5488,5494,5499,5505,5510,5516,5521,5526,5531,5537,5542,5548,5553,5558,5563,5569,5574,5579,5584,5589,5594,5599,5604,5610,5615,5621,5626,5631,5636,5642,5647,5653,5658,5664,5669,5674,5679,5684,5689,5695,5700,5706,5711,5716,5721,5727,5732,5737,5742,5748,5753,5759,5764,5770,5775,5780,5785,5791,5796,5802,5807,5812,5817,5822,5827,5833,5838,5844,5849,5855,5860,5865,5870,5876,5881,5887,5892,5898,5903,5909,5914,5919,5924,5929,5934,5939,5944,5950,5955,5961,5966,5971,5976,5982,5987,5993,5998,6003,6008,6014,6019,6025,6030,6036,6041,6047,6052,6057,6062,6067,6072,6077,6082,6088,6093,6099,6104,6109,6114,6120,6125,6131,6136,6142,6147,6152,6157,6163,6168,6173,6178,6183,6188,6194,6199,6205,6210,6215,6220,6226,6231,6236,6241,6247,6252,6258,6263,6269,6274,6280,6285,6290,6295,6301,6306,6312,6317,6322,6327,6333,6338,6344,6349,6354,6359,6365,6370,6376,6381,6387,6392,6398,6403,6408,6413,6419,6424,6429,6434,6439,6444,6450,6455,6461,6466,6471,6476,6482,6487],{"__ignoreMap":45},[50,4897,4898],{"class":52,"line":53},[50,4899,4720],{},[50,4901,4902],{"class":52,"line":89},[50,4903,745],{"emptyLinePlaceholder":201},[50,4905,4906],{"class":52,"line":98},[50,4907,4908],{},"#include \u003Ciostream>\n",[50,4910,4911],{"class":52,"line":104},[50,4912,745],{"emptyLinePlaceholder":201},[50,4914,4915],{"class":52,"line":112},[50,4916,4917],{},"  \n",[50,4919,4920],{"class":52,"line":118},[50,4921,745],{"emptyLinePlaceholder":201},[50,4923,4924],{"class":52,"line":127},[50,4925,4926],{},"Simulator::~Simulator()\n",[50,4928,4929],{"class":52,"line":133},[50,4930,745],{"emptyLinePlaceholder":201},[50,4932,4933],{"class":52,"line":142},[50,4934,4743],{},[50,4936,4937],{"class":52,"line":148},[50,4938,745],{"emptyLinePlaceholder":201},[50,4940,4941],{"class":52,"line":599},[50,4942,4943],{},"\u002F\u002F 确保 OpenGL 上下文活跃再释放 MuJoCo 渲染资源\n",[50,4945,4946],{"class":52,"line":615},[50,4947,745],{"emptyLinePlaceholder":201},[50,4949,4950],{"class":52,"line":621},[50,4951,4952],{},"if (window_) glfwMakeContextCurrent(window_);\n",[50,4954,4955],{"class":52,"line":844},[50,4956,745],{"emptyLinePlaceholder":201},[50,4958,4959],{"class":52,"line":850},[50,4960,4961],{},"if (visual_ready_) mjr_freeContext(&con_);\n",[50,4963,4964],{"class":52,"line":874},[50,4965,745],{"emptyLinePlaceholder":201},[50,4967,4968],{"class":52,"line":880},[50,4969,4970],{},"if (visual_ready_) mjv_freeScene(&scn_);\n",[50,4972,4973],{"class":52,"line":885},[50,4974,745],{"emptyLinePlaceholder":201},[50,4976,4977],{"class":52,"line":891},[50,4978,4979],{},"if (d_) mj_deleteData(d_);\n",[50,4981,4982],{"class":52,"line":924},[50,4983,745],{"emptyLinePlaceholder":201},[50,4985,4986],{"class":52,"line":953},[50,4987,4988],{},"if (m_) mj_deleteModel(m_);\n",[50,4990,4991],{"class":52,"line":989},[50,4992,745],{"emptyLinePlaceholder":201},[50,4994,4995],{"class":52,"line":1023},[50,4996,4997],{},"if (window_) glfwDestroyWindow(window_);\n",[50,4999,5000],{"class":52,"line":1038},[50,5001,745],{"emptyLinePlaceholder":201},[50,5003,5004],{"class":52,"line":1058},[50,5005,5006],{},"\u002F\u002F Linux + NVIDIA 下 glfwTerminate 可能崩溃，仅 macOS\u002FWindows 调用\n",[50,5008,5009],{"class":52,"line":1063},[50,5010,745],{"emptyLinePlaceholder":201},[50,5012,5013],{"class":52,"line":1075},[50,5014,5015],{},"#if defined(__APPLE__) || defined(_WIN32)\n",[50,5017,5018],{"class":52,"line":1097},[50,5019,745],{"emptyLinePlaceholder":201},[50,5021,5022],{"class":52,"line":1102},[50,5023,5024],{},"if (window_) glfwTerminate();\n",[50,5026,5027],{"class":52,"line":1121},[50,5028,745],{"emptyLinePlaceholder":201},[50,5030,5031],{"class":52,"line":1130},[50,5032,5033],{},"#endif\n",[50,5035,5036],{"class":52,"line":1146},[50,5037,745],{"emptyLinePlaceholder":201},[50,5039,5040],{"class":52,"line":1166},[50,5041,4885],{},[50,5043,5044],{"class":52,"line":4860},[50,5045,745],{"emptyLinePlaceholder":201},[50,5047,5048],{"class":52,"line":4865},[50,5049,4917],{},[50,5051,5052],{"class":52,"line":4871},[50,5053,745],{"emptyLinePlaceholder":201},[50,5055,5056],{"class":52,"line":4877},[50,5057,5058],{},"\u002F\u002F ==================== 模型加载 ====================\n",[50,5060,5061],{"class":52,"line":4882},[50,5062,745],{"emptyLinePlaceholder":201},[50,5064,5066],{"class":52,"line":5065},39,[50,5067,5068],{},"bool Simulator::load_model(const char* xml_path)\n",[50,5070,5072],{"class":52,"line":5071},40,[50,5073,745],{"emptyLinePlaceholder":201},[50,5075,5077],{"class":52,"line":5076},41,[50,5078,4743],{},[50,5080,5082],{"class":52,"line":5081},42,[50,5083,745],{"emptyLinePlaceholder":201},[50,5085,5087],{"class":52,"line":5086},43,[50,5088,4688],{},[50,5090,5092],{"class":52,"line":5091},44,[50,5093,745],{"emptyLinePlaceholder":201},[50,5095,5097],{"class":52,"line":5096},45,[50,5098,5099],{},"m_ = mj_loadXML(xml_path, nullptr, error, sizeof(error));\n",[50,5101,5103],{"class":52,"line":5102},46,[50,5104,745],{"emptyLinePlaceholder":201},[50,5106,5108],{"class":52,"line":5107},47,[50,5109,5110],{},"if (!m_) {\n",[50,5112,5114],{"class":52,"line":5113},48,[50,5115,745],{"emptyLinePlaceholder":201},[50,5117,5119],{"class":52,"line":5118},49,[50,5120,5121],{},"std::cerr \u003C\u003C \"[ERROR] 模型加载失败: \" \u003C\u003C error \u003C\u003C std::endl;\n",[50,5123,5125],{"class":52,"line":5124},50,[50,5126,745],{"emptyLinePlaceholder":201},[50,5128,5130],{"class":52,"line":5129},51,[50,5131,5132],{},"return false;\n",[50,5134,5136],{"class":52,"line":5135},52,[50,5137,745],{"emptyLinePlaceholder":201},[50,5139,5141],{"class":52,"line":5140},53,[50,5142,4885],{},[50,5144,5146],{"class":52,"line":5145},54,[50,5147,745],{"emptyLinePlaceholder":201},[50,5149,5151],{"class":52,"line":5150},55,[50,5152,5153],{},"d_ = mj_makeData(m_);\n",[50,5155,5157],{"class":52,"line":5156},56,[50,5158,745],{"emptyLinePlaceholder":201},[50,5160,5162],{"class":52,"line":5161},57,[50,5163,5164],{},"return true;\n",[50,5166,5168],{"class":52,"line":5167},58,[50,5169,745],{"emptyLinePlaceholder":201},[50,5171,5173],{"class":52,"line":5172},59,[50,5174,4885],{},[50,5176,5178],{"class":52,"line":5177},60,[50,5179,745],{"emptyLinePlaceholder":201},[50,5181,5183],{"class":52,"line":5182},61,[50,5184,4917],{},[50,5186,5188],{"class":52,"line":5187},62,[50,5189,745],{"emptyLinePlaceholder":201},[50,5191,5193],{"class":52,"line":5192},63,[50,5194,5195],{},"\u002F\u002F ==================== 可视化初始化 ====================\n",[50,5197,5199],{"class":52,"line":5198},64,[50,5200,745],{"emptyLinePlaceholder":201},[50,5202,5204],{"class":52,"line":5203},65,[50,5205,5206],{},"bool Simulator::init_visual(int width, int height, const char* title)\n",[50,5208,5210],{"class":52,"line":5209},66,[50,5211,745],{"emptyLinePlaceholder":201},[50,5213,5215],{"class":52,"line":5214},67,[50,5216,4743],{},[50,5218,5220],{"class":52,"line":5219},68,[50,5221,745],{"emptyLinePlaceholder":201},[50,5223,5225],{"class":52,"line":5224},69,[50,5226,5227],{},"if (!glfwInit()) {\n",[50,5229,5231],{"class":52,"line":5230},70,[50,5232,745],{"emptyLinePlaceholder":201},[50,5234,5236],{"class":52,"line":5235},71,[50,5237,5238],{},"std::cerr \u003C\u003C \"[ERROR] GLFW 初始化失败\" \u003C\u003C std::endl;\n",[50,5240,5242],{"class":52,"line":5241},72,[50,5243,745],{"emptyLinePlaceholder":201},[50,5245,5247],{"class":52,"line":5246},73,[50,5248,5132],{},[50,5250,5252],{"class":52,"line":5251},74,[50,5253,745],{"emptyLinePlaceholder":201},[50,5255,5257],{"class":52,"line":5256},75,[50,5258,4885],{},[50,5260,5262],{"class":52,"line":5261},76,[50,5263,745],{"emptyLinePlaceholder":201},[50,5265,5267],{"class":52,"line":5266},77,[50,5268,4917],{},[50,5270,5272],{"class":52,"line":5271},78,[50,5273,745],{"emptyLinePlaceholder":201},[50,5275,5277],{"class":52,"line":5276},79,[50,5278,5279],{},"window_ = glfwCreateWindow(width, height, title, nullptr, nullptr);\n",[50,5281,5283],{"class":52,"line":5282},80,[50,5284,745],{"emptyLinePlaceholder":201},[50,5286,5288],{"class":52,"line":5287},81,[50,5289,5290],{},"if (!window_) {\n",[50,5292,5294],{"class":52,"line":5293},82,[50,5295,745],{"emptyLinePlaceholder":201},[50,5297,5299],{"class":52,"line":5298},83,[50,5300,5301],{},"std::cerr \u003C\u003C \"[ERROR] 窗口创建失败\" \u003C\u003C std::endl;\n",[50,5303,5305],{"class":52,"line":5304},84,[50,5306,745],{"emptyLinePlaceholder":201},[50,5308,5310],{"class":52,"line":5309},85,[50,5311,5132],{},[50,5313,5315],{"class":52,"line":5314},86,[50,5316,745],{"emptyLinePlaceholder":201},[50,5318,5320],{"class":52,"line":5319},87,[50,5321,4885],{},[50,5323,5325],{"class":52,"line":5324},88,[50,5326,745],{"emptyLinePlaceholder":201},[50,5328,5330],{"class":52,"line":5329},89,[50,5331,4917],{},[50,5333,5335],{"class":52,"line":5334},90,[50,5336,745],{"emptyLinePlaceholder":201},[50,5338,5340],{"class":52,"line":5339},91,[50,5341,5342],{},"glfwMakeContextCurrent(window_);\n",[50,5344,5346],{"class":52,"line":5345},92,[50,5347,745],{"emptyLinePlaceholder":201},[50,5349,5351],{"class":52,"line":5350},93,[50,5352,5353],{},"glfwSwapInterval(1);\n",[50,5355,5357],{"class":52,"line":5356},94,[50,5358,745],{"emptyLinePlaceholder":201},[50,5360,5362],{"class":52,"line":5361},95,[50,5363,4917],{},[50,5365,5367],{"class":52,"line":5366},96,[50,5368,745],{"emptyLinePlaceholder":201},[50,5370,5372],{"class":52,"line":5371},97,[50,5373,5374],{},"\u002F\u002F 通过 user pointer 绑定实例，供静态回调转发\n",[50,5376,5378],{"class":52,"line":5377},98,[50,5379,745],{"emptyLinePlaceholder":201},[50,5381,5383],{"class":52,"line":5382},99,[50,5384,5385],{},"glfwSetWindowUserPointer(window_, this);\n",[50,5387,5389],{"class":52,"line":5388},100,[50,5390,745],{"emptyLinePlaceholder":201},[50,5392,5394],{"class":52,"line":5393},101,[50,5395,4917],{},[50,5397,5399],{"class":52,"line":5398},102,[50,5400,745],{"emptyLinePlaceholder":201},[50,5402,5404],{"class":52,"line":5403},103,[50,5405,5406],{},"\u002F\u002F 注册回调\n",[50,5408,5410],{"class":52,"line":5409},104,[50,5411,745],{"emptyLinePlaceholder":201},[50,5413,5415],{"class":52,"line":5414},105,[50,5416,5417],{},"glfwSetKeyCallback(window_, key_cb);\n",[50,5419,5421],{"class":52,"line":5420},106,[50,5422,745],{"emptyLinePlaceholder":201},[50,5424,5426],{"class":52,"line":5425},107,[50,5427,5428],{},"glfwSetMouseButtonCallback(window_, mouse_cb);\n",[50,5430,5432],{"class":52,"line":5431},108,[50,5433,745],{"emptyLinePlaceholder":201},[50,5435,5437],{"class":52,"line":5436},109,[50,5438,5439],{},"glfwSetCursorPosCallback(window_, move_cb);\n",[50,5441,5443],{"class":52,"line":5442},110,[50,5444,745],{"emptyLinePlaceholder":201},[50,5446,5448],{"class":52,"line":5447},111,[50,5449,5450],{},"glfwSetScrollCallback(window_, scroll_cb);\n",[50,5452,5454],{"class":52,"line":5453},112,[50,5455,745],{"emptyLinePlaceholder":201},[50,5457,5459],{"class":52,"line":5458},113,[50,5460,4917],{},[50,5462,5464],{"class":52,"line":5463},114,[50,5465,745],{"emptyLinePlaceholder":201},[50,5467,5469],{"class":52,"line":5468},115,[50,5470,5471],{},"\u002F\u002F MuJoCo 可视化初始化\n",[50,5473,5475],{"class":52,"line":5474},116,[50,5476,745],{"emptyLinePlaceholder":201},[50,5478,5480],{"class":52,"line":5479},117,[50,5481,5482],{},"mjv_defaultCamera(&cam_);\n",[50,5484,5486],{"class":52,"line":5485},118,[50,5487,745],{"emptyLinePlaceholder":201},[50,5489,5491],{"class":52,"line":5490},119,[50,5492,5493],{},"mjv_defaultOption(&opt_);\n",[50,5495,5497],{"class":52,"line":5496},120,[50,5498,745],{"emptyLinePlaceholder":201},[50,5500,5502],{"class":52,"line":5501},121,[50,5503,5504],{},"mjv_defaultScene(&scn_);\n",[50,5506,5508],{"class":52,"line":5507},122,[50,5509,745],{"emptyLinePlaceholder":201},[50,5511,5513],{"class":52,"line":5512},123,[50,5514,5515],{},"mjr_defaultContext(&con_);\n",[50,5517,5519],{"class":52,"line":5518},124,[50,5520,745],{"emptyLinePlaceholder":201},[50,5522,5524],{"class":52,"line":5523},125,[50,5525,4917],{},[50,5527,5529],{"class":52,"line":5528},126,[50,5530,745],{"emptyLinePlaceholder":201},[50,5532,5534],{"class":52,"line":5533},127,[50,5535,5536],{},"mjv_makeScene(m_, &scn_, 2000);\n",[50,5538,5540],{"class":52,"line":5539},128,[50,5541,745],{"emptyLinePlaceholder":201},[50,5543,5545],{"class":52,"line":5544},129,[50,5546,5547],{},"mjr_makeContext(m_, &con_, mjFONTSCALE_150);\n",[50,5549,5551],{"class":52,"line":5550},130,[50,5552,745],{"emptyLinePlaceholder":201},[50,5554,5556],{"class":52,"line":5555},131,[50,5557,4917],{},[50,5559,5561],{"class":52,"line":5560},132,[50,5562,745],{"emptyLinePlaceholder":201},[50,5564,5566],{"class":52,"line":5565},133,[50,5567,5568],{},"visual_ready_ = true;\n",[50,5570,5572],{"class":52,"line":5571},134,[50,5573,745],{"emptyLinePlaceholder":201},[50,5575,5577],{"class":52,"line":5576},135,[50,5578,5164],{},[50,5580,5582],{"class":52,"line":5581},136,[50,5583,745],{"emptyLinePlaceholder":201},[50,5585,5587],{"class":52,"line":5586},137,[50,5588,4885],{},[50,5590,5592],{"class":52,"line":5591},138,[50,5593,745],{"emptyLinePlaceholder":201},[50,5595,5597],{"class":52,"line":5596},139,[50,5598,4917],{},[50,5600,5602],{"class":52,"line":5601},140,[50,5603,745],{"emptyLinePlaceholder":201},[50,5605,5607],{"class":52,"line":5606},141,[50,5608,5609],{},"\u002F\u002F ==================== 相机 ====================\n",[50,5611,5613],{"class":52,"line":5612},142,[50,5614,745],{"emptyLinePlaceholder":201},[50,5616,5618],{"class":52,"line":5617},143,[50,5619,5620],{},"void Simulator::set_camera_track(const char* body_name, double distance)\n",[50,5622,5624],{"class":52,"line":5623},144,[50,5625,745],{"emptyLinePlaceholder":201},[50,5627,5629],{"class":52,"line":5628},145,[50,5630,4743],{},[50,5632,5634],{"class":52,"line":5633},146,[50,5635,745],{"emptyLinePlaceholder":201},[50,5637,5639],{"class":52,"line":5638},147,[50,5640,5641],{},"cam_.type = mjCAMERA_TRACKING;\n",[50,5643,5645],{"class":52,"line":5644},148,[50,5646,745],{"emptyLinePlaceholder":201},[50,5648,5650],{"class":52,"line":5649},149,[50,5651,5652],{},"cam_.trackbodyid = mj_name2id(m_, mjOBJ_BODY, body_name);\n",[50,5654,5656],{"class":52,"line":5655},150,[50,5657,745],{"emptyLinePlaceholder":201},[50,5659,5661],{"class":52,"line":5660},151,[50,5662,5663],{},"cam_.distance = distance;\n",[50,5665,5667],{"class":52,"line":5666},152,[50,5668,745],{"emptyLinePlaceholder":201},[50,5670,5672],{"class":52,"line":5671},153,[50,5673,4885],{},[50,5675,5677],{"class":52,"line":5676},154,[50,5678,745],{"emptyLinePlaceholder":201},[50,5680,5682],{"class":52,"line":5681},155,[50,5683,4917],{},[50,5685,5687],{"class":52,"line":5686},156,[50,5688,745],{"emptyLinePlaceholder":201},[50,5690,5692],{"class":52,"line":5691},157,[50,5693,5694],{},"\u002F\u002F ==================== 主循环 ====================\n",[50,5696,5698],{"class":52,"line":5697},158,[50,5699,745],{"emptyLinePlaceholder":201},[50,5701,5703],{"class":52,"line":5702},159,[50,5704,5705],{},"void Simulator::run(std::function\u003Cvoid(mjModel*, mjData*)> update)\n",[50,5707,5709],{"class":52,"line":5708},160,[50,5710,745],{"emptyLinePlaceholder":201},[50,5712,5714],{"class":52,"line":5713},161,[50,5715,4743],{},[50,5717,5719],{"class":52,"line":5718},162,[50,5720,745],{"emptyLinePlaceholder":201},[50,5722,5724],{"class":52,"line":5723},163,[50,5725,5726],{},"while (!glfwWindowShouldClose(window_))\n",[50,5728,5730],{"class":52,"line":5729},164,[50,5731,745],{"emptyLinePlaceholder":201},[50,5733,5735],{"class":52,"line":5734},165,[50,5736,4743],{},[50,5738,5740],{"class":52,"line":5739},166,[50,5741,745],{"emptyLinePlaceholder":201},[50,5743,5745],{"class":52,"line":5744},167,[50,5746,5747],{},"\u002F\u002F 仿真：每帧跑 1\u002F60 秒\n",[50,5749,5751],{"class":52,"line":5750},168,[50,5752,745],{"emptyLinePlaceholder":201},[50,5754,5756],{"class":52,"line":5755},169,[50,5757,5758],{},"mjtNum sim_start = d_->time;\n",[50,5760,5762],{"class":52,"line":5761},170,[50,5763,745],{"emptyLinePlaceholder":201},[50,5765,5767],{"class":52,"line":5766},171,[50,5768,5769],{},"while (d_->time - sim_start \u003C 1.0 \u002F 60.0)\n",[50,5771,5773],{"class":52,"line":5772},172,[50,5774,745],{"emptyLinePlaceholder":201},[50,5776,5778],{"class":52,"line":5777},173,[50,5779,4743],{},[50,5781,5783],{"class":52,"line":5782},174,[50,5784,745],{"emptyLinePlaceholder":201},[50,5786,5788],{"class":52,"line":5787},175,[50,5789,5790],{},"if (update) update(m_, d_);\n",[50,5792,5794],{"class":52,"line":5793},176,[50,5795,745],{"emptyLinePlaceholder":201},[50,5797,5799],{"class":52,"line":5798},177,[50,5800,5801],{},"mj_step(m_, d_);\n",[50,5803,5805],{"class":52,"line":5804},178,[50,5806,745],{"emptyLinePlaceholder":201},[50,5808,5810],{"class":52,"line":5809},179,[50,5811,4885],{},[50,5813,5815],{"class":52,"line":5814},180,[50,5816,745],{"emptyLinePlaceholder":201},[50,5818,5820],{"class":52,"line":5819},181,[50,5821,4917],{},[50,5823,5825],{"class":52,"line":5824},182,[50,5826,745],{"emptyLinePlaceholder":201},[50,5828,5830],{"class":52,"line":5829},183,[50,5831,5832],{},"\u002F\u002F 渲染\n",[50,5834,5836],{"class":52,"line":5835},184,[50,5837,745],{"emptyLinePlaceholder":201},[50,5839,5841],{"class":52,"line":5840},185,[50,5842,5843],{},"mjrRect viewport = {0, 0, 0, 0};\n",[50,5845,5847],{"class":52,"line":5846},186,[50,5848,745],{"emptyLinePlaceholder":201},[50,5850,5852],{"class":52,"line":5851},187,[50,5853,5854],{},"glfwGetFramebufferSize(window_, &viewport.width, &viewport.height);\n",[50,5856,5858],{"class":52,"line":5857},188,[50,5859,745],{"emptyLinePlaceholder":201},[50,5861,5863],{"class":52,"line":5862},189,[50,5864,4917],{},[50,5866,5868],{"class":52,"line":5867},190,[50,5869,745],{"emptyLinePlaceholder":201},[50,5871,5873],{"class":52,"line":5872},191,[50,5874,5875],{},"mjv_updateScene(m_, d_, &opt_, nullptr, &cam_, mjCAT_ALL, &scn_);\n",[50,5877,5879],{"class":52,"line":5878},192,[50,5880,745],{"emptyLinePlaceholder":201},[50,5882,5884],{"class":52,"line":5883},193,[50,5885,5886],{},"mjr_render(viewport, &scn_, &con_);\n",[50,5888,5890],{"class":52,"line":5889},194,[50,5891,745],{"emptyLinePlaceholder":201},[50,5893,5895],{"class":52,"line":5894},195,[50,5896,5897],{},"glfwSwapBuffers(window_);\n",[50,5899,5901],{"class":52,"line":5900},196,[50,5902,745],{"emptyLinePlaceholder":201},[50,5904,5906],{"class":52,"line":5905},197,[50,5907,5908],{},"glfwPollEvents();\n",[50,5910,5912],{"class":52,"line":5911},198,[50,5913,745],{"emptyLinePlaceholder":201},[50,5915,5917],{"class":52,"line":5916},199,[50,5918,4885],{},[50,5920,5922],{"class":52,"line":5921},200,[50,5923,745],{"emptyLinePlaceholder":201},[50,5925,5927],{"class":52,"line":5926},201,[50,5928,4885],{},[50,5930,5932],{"class":52,"line":5931},202,[50,5933,745],{"emptyLinePlaceholder":201},[50,5935,5937],{"class":52,"line":5936},203,[50,5938,4917],{},[50,5940,5942],{"class":52,"line":5941},204,[50,5943,745],{"emptyLinePlaceholder":201},[50,5945,5947],{"class":52,"line":5946},205,[50,5948,5949],{},"\u002F\u002F ==================== 键盘回调 ====================\n",[50,5951,5953],{"class":52,"line":5952},206,[50,5954,745],{"emptyLinePlaceholder":201},[50,5956,5958],{"class":52,"line":5957},207,[50,5959,5960],{},"void Simulator::on_key(int key, int act)\n",[50,5962,5964],{"class":52,"line":5963},208,[50,5965,745],{"emptyLinePlaceholder":201},[50,5967,5969],{"class":52,"line":5968},209,[50,5970,4743],{},[50,5972,5974],{"class":52,"line":5973},210,[50,5975,745],{"emptyLinePlaceholder":201},[50,5977,5979],{"class":52,"line":5978},211,[50,5980,5981],{},"\u002F\u002F 转发给外部处理器\n",[50,5983,5985],{"class":52,"line":5984},212,[50,5986,745],{"emptyLinePlaceholder":201},[50,5988,5990],{"class":52,"line":5989},213,[50,5991,5992],{},"if (key_handler_) key_handler_(key, act);\n",[50,5994,5996],{"class":52,"line":5995},214,[50,5997,745],{"emptyLinePlaceholder":201},[50,5999,6001],{"class":52,"line":6000},215,[50,6002,4917],{},[50,6004,6006],{"class":52,"line":6005},216,[50,6007,745],{"emptyLinePlaceholder":201},[50,6009,6011],{"class":52,"line":6010},217,[50,6012,6013],{},"\u002F\u002F Backspace 重置仿真\n",[50,6015,6017],{"class":52,"line":6016},218,[50,6018,745],{"emptyLinePlaceholder":201},[50,6020,6022],{"class":52,"line":6021},219,[50,6023,6024],{},"if (act == GLFW_PRESS && key == GLFW_KEY_BACKSPACE) {\n",[50,6026,6028],{"class":52,"line":6027},220,[50,6029,745],{"emptyLinePlaceholder":201},[50,6031,6033],{"class":52,"line":6032},221,[50,6034,6035],{},"mj_resetData(m_, d_);\n",[50,6037,6039],{"class":52,"line":6038},222,[50,6040,745],{"emptyLinePlaceholder":201},[50,6042,6044],{"class":52,"line":6043},223,[50,6045,6046],{},"mj_forward(m_, d_);\n",[50,6048,6050],{"class":52,"line":6049},224,[50,6051,745],{"emptyLinePlaceholder":201},[50,6053,6055],{"class":52,"line":6054},225,[50,6056,4885],{},[50,6058,6060],{"class":52,"line":6059},226,[50,6061,745],{"emptyLinePlaceholder":201},[50,6063,6065],{"class":52,"line":6064},227,[50,6066,4885],{},[50,6068,6070],{"class":52,"line":6069},228,[50,6071,745],{"emptyLinePlaceholder":201},[50,6073,6075],{"class":52,"line":6074},229,[50,6076,4917],{},[50,6078,6080],{"class":52,"line":6079},230,[50,6081,745],{"emptyLinePlaceholder":201},[50,6083,6085],{"class":52,"line":6084},231,[50,6086,6087],{},"\u002F\u002F ==================== 鼠标按键回调 ====================\n",[50,6089,6091],{"class":52,"line":6090},232,[50,6092,745],{"emptyLinePlaceholder":201},[50,6094,6096],{"class":52,"line":6095},233,[50,6097,6098],{},"void Simulator::on_mouse_button(int button, int act)\n",[50,6100,6102],{"class":52,"line":6101},234,[50,6103,745],{"emptyLinePlaceholder":201},[50,6105,6107],{"class":52,"line":6106},235,[50,6108,4743],{},[50,6110,6112],{"class":52,"line":6111},236,[50,6113,745],{"emptyLinePlaceholder":201},[50,6115,6117],{"class":52,"line":6116},237,[50,6118,6119],{},"btn_left_ = (glfwGetMouseButton(window_, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS);\n",[50,6121,6123],{"class":52,"line":6122},238,[50,6124,745],{"emptyLinePlaceholder":201},[50,6126,6128],{"class":52,"line":6127},239,[50,6129,6130],{},"btn_middle_ = (glfwGetMouseButton(window_, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS);\n",[50,6132,6134],{"class":52,"line":6133},240,[50,6135,745],{"emptyLinePlaceholder":201},[50,6137,6139],{"class":52,"line":6138},241,[50,6140,6141],{},"btn_right_ = (glfwGetMouseButton(window_, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS);\n",[50,6143,6145],{"class":52,"line":6144},242,[50,6146,745],{"emptyLinePlaceholder":201},[50,6148,6150],{"class":52,"line":6149},243,[50,6151,4917],{},[50,6153,6155],{"class":52,"line":6154},244,[50,6156,745],{"emptyLinePlaceholder":201},[50,6158,6160],{"class":52,"line":6159},245,[50,6161,6162],{},"glfwGetCursorPos(window_, &lastx_, &lasty_);\n",[50,6164,6166],{"class":52,"line":6165},246,[50,6167,745],{"emptyLinePlaceholder":201},[50,6169,6171],{"class":52,"line":6170},247,[50,6172,4885],{},[50,6174,6176],{"class":52,"line":6175},248,[50,6177,745],{"emptyLinePlaceholder":201},[50,6179,6181],{"class":52,"line":6180},249,[50,6182,4917],{},[50,6184,6186],{"class":52,"line":6185},250,[50,6187,745],{"emptyLinePlaceholder":201},[50,6189,6191],{"class":52,"line":6190},251,[50,6192,6193],{},"\u002F\u002F ==================== 鼠标移动回调 ====================\n",[50,6195,6197],{"class":52,"line":6196},252,[50,6198,745],{"emptyLinePlaceholder":201},[50,6200,6202],{"class":52,"line":6201},253,[50,6203,6204],{},"void Simulator::on_mouse_move(double xpos, double ypos)\n",[50,6206,6208],{"class":52,"line":6207},254,[50,6209,745],{"emptyLinePlaceholder":201},[50,6211,6213],{"class":52,"line":6212},255,[50,6214,4743],{},[50,6216,6218],{"class":52,"line":6217},256,[50,6219,745],{"emptyLinePlaceholder":201},[50,6221,6223],{"class":52,"line":6222},257,[50,6224,6225],{},"if (!btn_left_ && !btn_middle_ && !btn_right_) return;\n",[50,6227,6229],{"class":52,"line":6228},258,[50,6230,745],{"emptyLinePlaceholder":201},[50,6232,6234],{"class":52,"line":6233},259,[50,6235,4917],{},[50,6237,6239],{"class":52,"line":6238},260,[50,6240,745],{"emptyLinePlaceholder":201},[50,6242,6244],{"class":52,"line":6243},261,[50,6245,6246],{},"double dx = xpos - lastx_;\n",[50,6248,6250],{"class":52,"line":6249},262,[50,6251,745],{"emptyLinePlaceholder":201},[50,6253,6255],{"class":52,"line":6254},263,[50,6256,6257],{},"double dy = ypos - lasty_;\n",[50,6259,6261],{"class":52,"line":6260},264,[50,6262,745],{"emptyLinePlaceholder":201},[50,6264,6266],{"class":52,"line":6265},265,[50,6267,6268],{},"lastx_ = xpos;\n",[50,6270,6272],{"class":52,"line":6271},266,[50,6273,745],{"emptyLinePlaceholder":201},[50,6275,6277],{"class":52,"line":6276},267,[50,6278,6279],{},"lasty_ = ypos;\n",[50,6281,6283],{"class":52,"line":6282},268,[50,6284,745],{"emptyLinePlaceholder":201},[50,6286,6288],{"class":52,"line":6287},269,[50,6289,4917],{},[50,6291,6293],{"class":52,"line":6292},270,[50,6294,745],{"emptyLinePlaceholder":201},[50,6296,6298],{"class":52,"line":6297},271,[50,6299,6300],{},"int width, height;\n",[50,6302,6304],{"class":52,"line":6303},272,[50,6305,745],{"emptyLinePlaceholder":201},[50,6307,6309],{"class":52,"line":6308},273,[50,6310,6311],{},"glfwGetWindowSize(window_, &width, &height);\n",[50,6313,6315],{"class":52,"line":6314},274,[50,6316,745],{"emptyLinePlaceholder":201},[50,6318,6320],{"class":52,"line":6319},275,[50,6321,4917],{},[50,6323,6325],{"class":52,"line":6324},276,[50,6326,745],{"emptyLinePlaceholder":201},[50,6328,6330],{"class":52,"line":6329},277,[50,6331,6332],{},"bool shift = (glfwGetKey(window_, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS ||\n",[50,6334,6336],{"class":52,"line":6335},278,[50,6337,745],{"emptyLinePlaceholder":201},[50,6339,6341],{"class":52,"line":6340},279,[50,6342,6343],{},"glfwGetKey(window_, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS);\n",[50,6345,6347],{"class":52,"line":6346},280,[50,6348,745],{"emptyLinePlaceholder":201},[50,6350,6352],{"class":52,"line":6351},281,[50,6353,4917],{},[50,6355,6357],{"class":52,"line":6356},282,[50,6358,745],{"emptyLinePlaceholder":201},[50,6360,6362],{"class":52,"line":6361},283,[50,6363,6364],{},"mjtMouse action;\n",[50,6366,6368],{"class":52,"line":6367},284,[50,6369,745],{"emptyLinePlaceholder":201},[50,6371,6373],{"class":52,"line":6372},285,[50,6374,6375],{},"if (btn_right_) action = shift ? mjMOUSE_MOVE_H : mjMOUSE_MOVE_V;\n",[50,6377,6379],{"class":52,"line":6378},286,[50,6380,745],{"emptyLinePlaceholder":201},[50,6382,6384],{"class":52,"line":6383},287,[50,6385,6386],{},"else if (btn_left_) action = shift ? mjMOUSE_ROTATE_H : mjMOUSE_ROTATE_V;\n",[50,6388,6390],{"class":52,"line":6389},288,[50,6391,745],{"emptyLinePlaceholder":201},[50,6393,6395],{"class":52,"line":6394},289,[50,6396,6397],{},"else action = mjMOUSE_ZOOM;\n",[50,6399,6401],{"class":52,"line":6400},290,[50,6402,745],{"emptyLinePlaceholder":201},[50,6404,6406],{"class":52,"line":6405},291,[50,6407,4917],{},[50,6409,6411],{"class":52,"line":6410},292,[50,6412,745],{"emptyLinePlaceholder":201},[50,6414,6416],{"class":52,"line":6415},293,[50,6417,6418],{},"mjv_moveCamera(m_, action, dx \u002F height, dy \u002F height, &scn_, &cam_);\n",[50,6420,6422],{"class":52,"line":6421},294,[50,6423,745],{"emptyLinePlaceholder":201},[50,6425,6427],{"class":52,"line":6426},295,[50,6428,4885],{},[50,6430,6432],{"class":52,"line":6431},296,[50,6433,745],{"emptyLinePlaceholder":201},[50,6435,6437],{"class":52,"line":6436},297,[50,6438,4917],{},[50,6440,6442],{"class":52,"line":6441},298,[50,6443,745],{"emptyLinePlaceholder":201},[50,6445,6447],{"class":52,"line":6446},299,[50,6448,6449],{},"\u002F\u002F ==================== 滚轮回调 ====================\n",[50,6451,6453],{"class":52,"line":6452},300,[50,6454,745],{"emptyLinePlaceholder":201},[50,6456,6458],{"class":52,"line":6457},301,[50,6459,6460],{},"void Simulator::on_scroll(double xoffset, double yoffset)\n",[50,6462,6464],{"class":52,"line":6463},302,[50,6465,745],{"emptyLinePlaceholder":201},[50,6467,6469],{"class":52,"line":6468},303,[50,6470,4743],{},[50,6472,6474],{"class":52,"line":6473},304,[50,6475,745],{"emptyLinePlaceholder":201},[50,6477,6479],{"class":52,"line":6478},305,[50,6480,6481],{},"mjv_moveCamera(m_, mjMOUSE_ZOOM, 0, -0.05 * yoffset, &scn_, &cam_);\n",[50,6483,6485],{"class":52,"line":6484},306,[50,6486,745],{"emptyLinePlaceholder":201},[50,6488,6490],{"class":52,"line":6489},307,[50,6491,4885],{},[11,6493,6494],{},[47,6495,6496],{},"simulator.h",[40,6498,6500],{"className":4674,"code":6499,"language":4676,"meta":45,"style":45},"#pragma once\n\n#include \u003Cfunctional>\n#include \u003Cmujoco\u002Fmujoco.h>\n#include \u003CGLFW\u002Fglfw3.h>\n\n  \n\nclass Simulator {\n\npublic:\n\nSimulator() = default;\n\n~Simulator();\n\n  \n\n\u002F\u002F 禁止拷贝\n\nSimulator(const Simulator&) = delete;\n\nSimulator& operator=(const Simulator&) = delete;\n\n  \n\n\u002F** 加载模型，失败返回 false *\u002F\n\nbool load_model(const char* xml_path);\n\n  \n\n\u002F** 初始化窗口和可视化 *\u002F\n\nbool init_visual(int width, int height, const char* title);\n\n  \n\n\u002F** 设置相机跟踪的 body *\u002F\n\nvoid set_camera_track(const char* body_name, double distance = 2.0);\n\n  \n\n\u002F** 注册额外的按键回调（在 Backspace 重置之后调用） *\u002F\n\nvoid set_key_handler(std::function\u003Cvoid(int key, int act)> handler) { key_handler_ = handler; }\n\n  \n\n\u002F** 进入主循环，每帧调用 update(m, d) *\u002F\n\nvoid run(std::function\u003Cvoid(mjModel*, mjData*)> update = nullptr);\n\n  \n\n\u002F** 模型和数据访问 *\u002F\n\nmjModel* model() { return m_; }\n\nmjData* data() { return d_; }\n\n  \n\nprivate:\n\n\u002F\u002F 实例回调（由静态函数转发）\n\nvoid on_key(int key, int act);\n\nvoid on_mouse_button(int button, int act);\n\nvoid on_mouse_move(double xpos, double ypos);\n\nvoid on_scroll(double xoffset, double yoffset);\n\n  \n\n\u002F** 获取当前 viewport *\u002F\n\nmjrRect get_viewport();\n\n  \n\n\u002F\u002F 静态 GLFW 回调，通过 user pointer 转发到实例\n\nstatic void key_cb(GLFWwindow* w, int k, int s, int a, int m) {\n\nauto* self = static_cast\u003CSimulator*>(glfwGetWindowUserPointer(w));\n\nself->on_key(k, a);\n\n}\n\nstatic void mouse_cb(GLFWwindow* w, int b, int a, int m) {\n\nauto* self = static_cast\u003CSimulator*>(glfwGetWindowUserPointer(w));\n\nself->on_mouse_button(b, a);\n\n}\n\nstatic void move_cb(GLFWwindow* w, double x, double y) {\n\nauto* self = static_cast\u003CSimulator*>(glfwGetWindowUserPointer(w));\n\nself->on_mouse_move(x, y);\n\n}\n\nstatic void scroll_cb(GLFWwindow* w, double xo, double yo) {\n\nauto* self = static_cast\u003CSimulator*>(glfwGetWindowUserPointer(w));\n\nself->on_scroll(xo, yo);\n\n}\n\n  \n\nbool visual_ready_ = false;\n\n  \n\nmjModel* m_ = nullptr;\n\nmjData* d_ = nullptr;\n\n  \n\nmjvCamera cam_{};\n\nmjvOption opt_{};\n\nmjvScene scn_{};\n\nmjrContext con_{};\n\nGLFWwindow* window_ = nullptr;\n\n  \n\n\u002F\u002F 外部回调\n\nstd::function\u003Cvoid(int, int)> key_handler_;\n\n  \n\n\u002F\u002F 鼠标状态\n\nbool btn_left_ = false, btn_middle_ = false, btn_right_ = false;\n\ndouble lastx_ = 0, lasty_ = 0;\n\n  \n\n\u002F\u002F 暂停 & 拖拽加力\n\nbool paused_ = false;\n\nbool perturb_active_ = false;\n\nmjvPerturb pert_{};\n\n};\n",[47,6501,6502,6507,6511,6516,6521,6526,6530,6534,6538,6543,6547,6552,6556,6561,6565,6570,6574,6578,6582,6587,6591,6596,6600,6605,6609,6613,6617,6622,6626,6631,6635,6639,6643,6648,6652,6657,6661,6665,6669,6674,6678,6683,6687,6691,6695,6700,6704,6709,6713,6717,6721,6726,6730,6735,6739,6743,6747,6752,6756,6761,6765,6770,6774,6778,6782,6787,6791,6796,6800,6805,6809,6814,6818,6823,6827,6832,6836,6840,6844,6849,6853,6858,6862,6866,6870,6875,6879,6884,6888,6893,6897,6902,6906,6910,6914,6919,6923,6927,6931,6936,6940,6944,6948,6953,6957,6961,6965,6970,6974,6978,6982,6987,6991,6995,6999,7004,7008,7012,7016,7020,7024,7029,7033,7037,7041,7046,7050,7055,7059,7063,7067,7072,7076,7081,7085,7090,7094,7099,7103,7108,7112,7116,7120,7125,7129,7134,7138,7142,7146,7151,7155,7160,7164,7169,7173,7177,7181,7186,7190,7195,7199,7204,7208,7213,7217],{"__ignoreMap":45},[50,6503,6504],{"class":52,"line":53},[50,6505,6506],{},"#pragma once\n",[50,6508,6509],{"class":52,"line":89},[50,6510,745],{"emptyLinePlaceholder":201},[50,6512,6513],{"class":52,"line":98},[50,6514,6515],{},"#include \u003Cfunctional>\n",[50,6517,6518],{"class":52,"line":104},[50,6519,6520],{},"#include \u003Cmujoco\u002Fmujoco.h>\n",[50,6522,6523],{"class":52,"line":112},[50,6524,6525],{},"#include \u003CGLFW\u002Fglfw3.h>\n",[50,6527,6528],{"class":52,"line":118},[50,6529,745],{"emptyLinePlaceholder":201},[50,6531,6532],{"class":52,"line":127},[50,6533,4917],{},[50,6535,6536],{"class":52,"line":133},[50,6537,745],{"emptyLinePlaceholder":201},[50,6539,6540],{"class":52,"line":142},[50,6541,6542],{},"class Simulator {\n",[50,6544,6545],{"class":52,"line":148},[50,6546,745],{"emptyLinePlaceholder":201},[50,6548,6549],{"class":52,"line":599},[50,6550,6551],{},"public:\n",[50,6553,6554],{"class":52,"line":615},[50,6555,745],{"emptyLinePlaceholder":201},[50,6557,6558],{"class":52,"line":621},[50,6559,6560],{},"Simulator() = default;\n",[50,6562,6563],{"class":52,"line":844},[50,6564,745],{"emptyLinePlaceholder":201},[50,6566,6567],{"class":52,"line":850},[50,6568,6569],{},"~Simulator();\n",[50,6571,6572],{"class":52,"line":874},[50,6573,745],{"emptyLinePlaceholder":201},[50,6575,6576],{"class":52,"line":880},[50,6577,4917],{},[50,6579,6580],{"class":52,"line":885},[50,6581,745],{"emptyLinePlaceholder":201},[50,6583,6584],{"class":52,"line":891},[50,6585,6586],{},"\u002F\u002F 禁止拷贝\n",[50,6588,6589],{"class":52,"line":924},[50,6590,745],{"emptyLinePlaceholder":201},[50,6592,6593],{"class":52,"line":953},[50,6594,6595],{},"Simulator(const Simulator&) = delete;\n",[50,6597,6598],{"class":52,"line":989},[50,6599,745],{"emptyLinePlaceholder":201},[50,6601,6602],{"class":52,"line":1023},[50,6603,6604],{},"Simulator& operator=(const Simulator&) = delete;\n",[50,6606,6607],{"class":52,"line":1038},[50,6608,745],{"emptyLinePlaceholder":201},[50,6610,6611],{"class":52,"line":1058},[50,6612,4917],{},[50,6614,6615],{"class":52,"line":1063},[50,6616,745],{"emptyLinePlaceholder":201},[50,6618,6619],{"class":52,"line":1075},[50,6620,6621],{},"\u002F** 加载模型，失败返回 false *\u002F\n",[50,6623,6624],{"class":52,"line":1097},[50,6625,745],{"emptyLinePlaceholder":201},[50,6627,6628],{"class":52,"line":1102},[50,6629,6630],{},"bool load_model(const char* xml_path);\n",[50,6632,6633],{"class":52,"line":1121},[50,6634,745],{"emptyLinePlaceholder":201},[50,6636,6637],{"class":52,"line":1130},[50,6638,4917],{},[50,6640,6641],{"class":52,"line":1146},[50,6642,745],{"emptyLinePlaceholder":201},[50,6644,6645],{"class":52,"line":1166},[50,6646,6647],{},"\u002F** 初始化窗口和可视化 *\u002F\n",[50,6649,6650],{"class":52,"line":4860},[50,6651,745],{"emptyLinePlaceholder":201},[50,6653,6654],{"class":52,"line":4865},[50,6655,6656],{},"bool init_visual(int width, int height, const char* title);\n",[50,6658,6659],{"class":52,"line":4871},[50,6660,745],{"emptyLinePlaceholder":201},[50,6662,6663],{"class":52,"line":4877},[50,6664,4917],{},[50,6666,6667],{"class":52,"line":4882},[50,6668,745],{"emptyLinePlaceholder":201},[50,6670,6671],{"class":52,"line":5065},[50,6672,6673],{},"\u002F** 设置相机跟踪的 body *\u002F\n",[50,6675,6676],{"class":52,"line":5071},[50,6677,745],{"emptyLinePlaceholder":201},[50,6679,6680],{"class":52,"line":5076},[50,6681,6682],{},"void set_camera_track(const char* body_name, double distance = 2.0);\n",[50,6684,6685],{"class":52,"line":5081},[50,6686,745],{"emptyLinePlaceholder":201},[50,6688,6689],{"class":52,"line":5086},[50,6690,4917],{},[50,6692,6693],{"class":52,"line":5091},[50,6694,745],{"emptyLinePlaceholder":201},[50,6696,6697],{"class":52,"line":5096},[50,6698,6699],{},"\u002F** 注册额外的按键回调（在 Backspace 重置之后调用） *\u002F\n",[50,6701,6702],{"class":52,"line":5102},[50,6703,745],{"emptyLinePlaceholder":201},[50,6705,6706],{"class":52,"line":5107},[50,6707,6708],{},"void set_key_handler(std::function\u003Cvoid(int key, int act)> handler) { key_handler_ = handler; }\n",[50,6710,6711],{"class":52,"line":5113},[50,6712,745],{"emptyLinePlaceholder":201},[50,6714,6715],{"class":52,"line":5118},[50,6716,4917],{},[50,6718,6719],{"class":52,"line":5124},[50,6720,745],{"emptyLinePlaceholder":201},[50,6722,6723],{"class":52,"line":5129},[50,6724,6725],{},"\u002F** 进入主循环，每帧调用 update(m, d) *\u002F\n",[50,6727,6728],{"class":52,"line":5135},[50,6729,745],{"emptyLinePlaceholder":201},[50,6731,6732],{"class":52,"line":5140},[50,6733,6734],{},"void run(std::function\u003Cvoid(mjModel*, mjData*)> update = nullptr);\n",[50,6736,6737],{"class":52,"line":5145},[50,6738,745],{"emptyLinePlaceholder":201},[50,6740,6741],{"class":52,"line":5150},[50,6742,4917],{},[50,6744,6745],{"class":52,"line":5156},[50,6746,745],{"emptyLinePlaceholder":201},[50,6748,6749],{"class":52,"line":5161},[50,6750,6751],{},"\u002F** 模型和数据访问 *\u002F\n",[50,6753,6754],{"class":52,"line":5167},[50,6755,745],{"emptyLinePlaceholder":201},[50,6757,6758],{"class":52,"line":5172},[50,6759,6760],{},"mjModel* model() { return m_; }\n",[50,6762,6763],{"class":52,"line":5177},[50,6764,745],{"emptyLinePlaceholder":201},[50,6766,6767],{"class":52,"line":5182},[50,6768,6769],{},"mjData* data() { return d_; }\n",[50,6771,6772],{"class":52,"line":5187},[50,6773,745],{"emptyLinePlaceholder":201},[50,6775,6776],{"class":52,"line":5192},[50,6777,4917],{},[50,6779,6780],{"class":52,"line":5198},[50,6781,745],{"emptyLinePlaceholder":201},[50,6783,6784],{"class":52,"line":5203},[50,6785,6786],{},"private:\n",[50,6788,6789],{"class":52,"line":5209},[50,6790,745],{"emptyLinePlaceholder":201},[50,6792,6793],{"class":52,"line":5214},[50,6794,6795],{},"\u002F\u002F 实例回调（由静态函数转发）\n",[50,6797,6798],{"class":52,"line":5219},[50,6799,745],{"emptyLinePlaceholder":201},[50,6801,6802],{"class":52,"line":5224},[50,6803,6804],{},"void on_key(int key, int act);\n",[50,6806,6807],{"class":52,"line":5230},[50,6808,745],{"emptyLinePlaceholder":201},[50,6810,6811],{"class":52,"line":5235},[50,6812,6813],{},"void on_mouse_button(int button, int act);\n",[50,6815,6816],{"class":52,"line":5241},[50,6817,745],{"emptyLinePlaceholder":201},[50,6819,6820],{"class":52,"line":5246},[50,6821,6822],{},"void on_mouse_move(double xpos, double ypos);\n",[50,6824,6825],{"class":52,"line":5251},[50,6826,745],{"emptyLinePlaceholder":201},[50,6828,6829],{"class":52,"line":5256},[50,6830,6831],{},"void on_scroll(double xoffset, double yoffset);\n",[50,6833,6834],{"class":52,"line":5261},[50,6835,745],{"emptyLinePlaceholder":201},[50,6837,6838],{"class":52,"line":5266},[50,6839,4917],{},[50,6841,6842],{"class":52,"line":5271},[50,6843,745],{"emptyLinePlaceholder":201},[50,6845,6846],{"class":52,"line":5276},[50,6847,6848],{},"\u002F** 获取当前 viewport *\u002F\n",[50,6850,6851],{"class":52,"line":5282},[50,6852,745],{"emptyLinePlaceholder":201},[50,6854,6855],{"class":52,"line":5287},[50,6856,6857],{},"mjrRect get_viewport();\n",[50,6859,6860],{"class":52,"line":5293},[50,6861,745],{"emptyLinePlaceholder":201},[50,6863,6864],{"class":52,"line":5298},[50,6865,4917],{},[50,6867,6868],{"class":52,"line":5304},[50,6869,745],{"emptyLinePlaceholder":201},[50,6871,6872],{"class":52,"line":5309},[50,6873,6874],{},"\u002F\u002F 静态 GLFW 回调，通过 user pointer 转发到实例\n",[50,6876,6877],{"class":52,"line":5314},[50,6878,745],{"emptyLinePlaceholder":201},[50,6880,6881],{"class":52,"line":5319},[50,6882,6883],{},"static void key_cb(GLFWwindow* w, int k, int s, int a, int m) {\n",[50,6885,6886],{"class":52,"line":5324},[50,6887,745],{"emptyLinePlaceholder":201},[50,6889,6890],{"class":52,"line":5329},[50,6891,6892],{},"auto* self = static_cast\u003CSimulator*>(glfwGetWindowUserPointer(w));\n",[50,6894,6895],{"class":52,"line":5334},[50,6896,745],{"emptyLinePlaceholder":201},[50,6898,6899],{"class":52,"line":5339},[50,6900,6901],{},"self->on_key(k, a);\n",[50,6903,6904],{"class":52,"line":5345},[50,6905,745],{"emptyLinePlaceholder":201},[50,6907,6908],{"class":52,"line":5350},[50,6909,4885],{},[50,6911,6912],{"class":52,"line":5356},[50,6913,745],{"emptyLinePlaceholder":201},[50,6915,6916],{"class":52,"line":5361},[50,6917,6918],{},"static void mouse_cb(GLFWwindow* w, int b, int a, int m) {\n",[50,6920,6921],{"class":52,"line":5366},[50,6922,745],{"emptyLinePlaceholder":201},[50,6924,6925],{"class":52,"line":5371},[50,6926,6892],{},[50,6928,6929],{"class":52,"line":5377},[50,6930,745],{"emptyLinePlaceholder":201},[50,6932,6933],{"class":52,"line":5382},[50,6934,6935],{},"self->on_mouse_button(b, a);\n",[50,6937,6938],{"class":52,"line":5388},[50,6939,745],{"emptyLinePlaceholder":201},[50,6941,6942],{"class":52,"line":5393},[50,6943,4885],{},[50,6945,6946],{"class":52,"line":5398},[50,6947,745],{"emptyLinePlaceholder":201},[50,6949,6950],{"class":52,"line":5403},[50,6951,6952],{},"static void move_cb(GLFWwindow* w, double x, double y) {\n",[50,6954,6955],{"class":52,"line":5409},[50,6956,745],{"emptyLinePlaceholder":201},[50,6958,6959],{"class":52,"line":5414},[50,6960,6892],{},[50,6962,6963],{"class":52,"line":5420},[50,6964,745],{"emptyLinePlaceholder":201},[50,6966,6967],{"class":52,"line":5425},[50,6968,6969],{},"self->on_mouse_move(x, y);\n",[50,6971,6972],{"class":52,"line":5431},[50,6973,745],{"emptyLinePlaceholder":201},[50,6975,6976],{"class":52,"line":5436},[50,6977,4885],{},[50,6979,6980],{"class":52,"line":5442},[50,6981,745],{"emptyLinePlaceholder":201},[50,6983,6984],{"class":52,"line":5447},[50,6985,6986],{},"static void scroll_cb(GLFWwindow* w, double xo, double yo) {\n",[50,6988,6989],{"class":52,"line":5453},[50,6990,745],{"emptyLinePlaceholder":201},[50,6992,6993],{"class":52,"line":5458},[50,6994,6892],{},[50,6996,6997],{"class":52,"line":5463},[50,6998,745],{"emptyLinePlaceholder":201},[50,7000,7001],{"class":52,"line":5468},[50,7002,7003],{},"self->on_scroll(xo, yo);\n",[50,7005,7006],{"class":52,"line":5474},[50,7007,745],{"emptyLinePlaceholder":201},[50,7009,7010],{"class":52,"line":5479},[50,7011,4885],{},[50,7013,7014],{"class":52,"line":5485},[50,7015,745],{"emptyLinePlaceholder":201},[50,7017,7018],{"class":52,"line":5490},[50,7019,4917],{},[50,7021,7022],{"class":52,"line":5496},[50,7023,745],{"emptyLinePlaceholder":201},[50,7025,7026],{"class":52,"line":5501},[50,7027,7028],{},"bool visual_ready_ = false;\n",[50,7030,7031],{"class":52,"line":5507},[50,7032,745],{"emptyLinePlaceholder":201},[50,7034,7035],{"class":52,"line":5512},[50,7036,4917],{},[50,7038,7039],{"class":52,"line":5518},[50,7040,745],{"emptyLinePlaceholder":201},[50,7042,7043],{"class":52,"line":5523},[50,7044,7045],{},"mjModel* m_ = nullptr;\n",[50,7047,7048],{"class":52,"line":5528},[50,7049,745],{"emptyLinePlaceholder":201},[50,7051,7052],{"class":52,"line":5533},[50,7053,7054],{},"mjData* d_ = nullptr;\n",[50,7056,7057],{"class":52,"line":5539},[50,7058,745],{"emptyLinePlaceholder":201},[50,7060,7061],{"class":52,"line":5544},[50,7062,4917],{},[50,7064,7065],{"class":52,"line":5550},[50,7066,745],{"emptyLinePlaceholder":201},[50,7068,7069],{"class":52,"line":5555},[50,7070,7071],{},"mjvCamera cam_{};\n",[50,7073,7074],{"class":52,"line":5560},[50,7075,745],{"emptyLinePlaceholder":201},[50,7077,7078],{"class":52,"line":5565},[50,7079,7080],{},"mjvOption opt_{};\n",[50,7082,7083],{"class":52,"line":5571},[50,7084,745],{"emptyLinePlaceholder":201},[50,7086,7087],{"class":52,"line":5576},[50,7088,7089],{},"mjvScene scn_{};\n",[50,7091,7092],{"class":52,"line":5581},[50,7093,745],{"emptyLinePlaceholder":201},[50,7095,7096],{"class":52,"line":5586},[50,7097,7098],{},"mjrContext con_{};\n",[50,7100,7101],{"class":52,"line":5591},[50,7102,745],{"emptyLinePlaceholder":201},[50,7104,7105],{"class":52,"line":5596},[50,7106,7107],{},"GLFWwindow* window_ = nullptr;\n",[50,7109,7110],{"class":52,"line":5601},[50,7111,745],{"emptyLinePlaceholder":201},[50,7113,7114],{"class":52,"line":5606},[50,7115,4917],{},[50,7117,7118],{"class":52,"line":5612},[50,7119,745],{"emptyLinePlaceholder":201},[50,7121,7122],{"class":52,"line":5617},[50,7123,7124],{},"\u002F\u002F 外部回调\n",[50,7126,7127],{"class":52,"line":5623},[50,7128,745],{"emptyLinePlaceholder":201},[50,7130,7131],{"class":52,"line":5628},[50,7132,7133],{},"std::function\u003Cvoid(int, int)> key_handler_;\n",[50,7135,7136],{"class":52,"line":5633},[50,7137,745],{"emptyLinePlaceholder":201},[50,7139,7140],{"class":52,"line":5638},[50,7141,4917],{},[50,7143,7144],{"class":52,"line":5644},[50,7145,745],{"emptyLinePlaceholder":201},[50,7147,7148],{"class":52,"line":5649},[50,7149,7150],{},"\u002F\u002F 鼠标状态\n",[50,7152,7153],{"class":52,"line":5655},[50,7154,745],{"emptyLinePlaceholder":201},[50,7156,7157],{"class":52,"line":5660},[50,7158,7159],{},"bool btn_left_ = false, btn_middle_ = false, btn_right_ = false;\n",[50,7161,7162],{"class":52,"line":5666},[50,7163,745],{"emptyLinePlaceholder":201},[50,7165,7166],{"class":52,"line":5671},[50,7167,7168],{},"double lastx_ = 0, lasty_ = 0;\n",[50,7170,7171],{"class":52,"line":5676},[50,7172,745],{"emptyLinePlaceholder":201},[50,7174,7175],{"class":52,"line":5681},[50,7176,4917],{},[50,7178,7179],{"class":52,"line":5686},[50,7180,745],{"emptyLinePlaceholder":201},[50,7182,7183],{"class":52,"line":5691},[50,7184,7185],{},"\u002F\u002F 暂停 & 拖拽加力\n",[50,7187,7188],{"class":52,"line":5697},[50,7189,745],{"emptyLinePlaceholder":201},[50,7191,7192],{"class":52,"line":5702},[50,7193,7194],{},"bool paused_ = false;\n",[50,7196,7197],{"class":52,"line":5708},[50,7198,745],{"emptyLinePlaceholder":201},[50,7200,7201],{"class":52,"line":5713},[50,7202,7203],{},"bool perturb_active_ = false;\n",[50,7205,7206],{"class":52,"line":5718},[50,7207,745],{"emptyLinePlaceholder":201},[50,7209,7210],{"class":52,"line":5723},[50,7211,7212],{},"mjvPerturb pert_{};\n",[50,7214,7215],{"class":52,"line":5729},[50,7216,745],{"emptyLinePlaceholder":201},[50,7218,7219],{"class":52,"line":5734},[50,7220,7221],{},"};\n",[1228,7223,7225],{"id":7224},"_3-使用官方的simulator拥有官方的simulator界面按钮","3. 使用官方的simulator（拥有官方的simulator界面按钮）",[1967,7227,7228,7243],{},[1970,7229,7230,7231,7234,7235,7238,7239],{},"将simulator文件夹下的所有文件复制到自己的工程文件下面",[47,7232,7233],{},"src\u002F","  除了",[47,7236,7237],{},"cmake\u002F"," 文件夹之外的文件\n",[243,7240],{"alt":7241,"src":7242},"598","\u002Ffongtszho.web\u002Fwiki-assets\u002Fpictures-pasted-image-20260721231329.png",[1970,7244,7245,7246],{},"更改",[47,7247,7248],{},"CMakeListst.txt",[40,7250,7253],{"className":7251,"code":7252,"language":4517,"meta":45,"style":45},"language-cmake shiki shiki-themes github-light github-dark","cmake_minimum_required(VERSION 3.20)\nproject(工程名 LANGUAGES CXX)\n\n# C++17\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n# MuJoCo 安装目录（此处替换为自己的安装目录）\nset(MUJOCO_PATH \"\u002Fhome\u002Fxiaofang\u002FApplications\u002Fmujoco-3.7.0\")\n\ninclude_directories(\n    ${MUJOCO_PATH}\u002Finclude\n)\n\nlink_directories(\n    ${MUJOCO_PATH}\u002Flib\n)\n\nset(MUJOCO_LIB\n    ${MUJOCO_PATH}\u002Flib\u002Flibmujoco.so\n)\n\n# 官方 Simulator 源码\nfile(GLOB SIMULATOR_SRC\n${CMAKE_CURRENT_SOURCE_DIR}\u002Fsrc\u002Fsimulator\u002F*.cc\n)\n# 用户控制代码\nset(USER_SRC\nsrc\u002Fcontrol\u002Fcontrol.cpp\nsrc\u002Fcontrol\u002Fpid.cpp\nsrc\u002Fsensors\u002Fimu.cpp\n)\n\n# 最终程序\nadd_executable(WheelLeg\n${SIMULATOR_SRC}\n${USER_SRC}\n)\n\ntarget_include_directories(WheelLeg PRIVATE\n\n${CMAKE_SOURCE_DIR}\u002Finclude\n${CMAKE_CURRENT_SOURCE_DIR}\u002Fsrc\u002Fsimulator\n${MUJOCO_PATH}\u002Finclude\n\n)\n\ntarget_link_libraries(WheelLeg\n\n${MUJOCO_LIB}\nglfw\nGL\nGLU\n)\n",[47,7254,7255,7260,7265,7269,7274,7279,7284,7289,7294,7299,7303,7308,7313,7317,7321,7326,7331,7335,7339,7344,7349,7353,7357,7362,7367,7372,7376,7381,7386,7391,7396,7401,7405,7409,7414,7419,7424,7429,7433,7437,7442,7446,7451,7456,7461,7465,7469,7473,7478,7482,7487,7492,7497,7502],{"__ignoreMap":45},[50,7256,7257],{"class":52,"line":53},[50,7258,7259],{},"cmake_minimum_required(VERSION 3.20)\n",[50,7261,7262],{"class":52,"line":89},[50,7263,7264],{},"project(工程名 LANGUAGES CXX)\n",[50,7266,7267],{"class":52,"line":98},[50,7268,745],{"emptyLinePlaceholder":201},[50,7270,7271],{"class":52,"line":104},[50,7272,7273],{},"# C++17\n",[50,7275,7276],{"class":52,"line":112},[50,7277,7278],{},"set(CMAKE_CXX_STANDARD 17)\n",[50,7280,7281],{"class":52,"line":118},[50,7282,7283],{},"set(CMAKE_CXX_STANDARD_REQUIRED ON)\n",[50,7285,7286],{"class":52,"line":127},[50,7287,7288],{},"set(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n",[50,7290,7291],{"class":52,"line":133},[50,7292,7293],{},"# MuJoCo 安装目录（此处替换为自己的安装目录）\n",[50,7295,7296],{"class":52,"line":142},[50,7297,7298],{},"set(MUJOCO_PATH \"\u002Fhome\u002Fxiaofang\u002FApplications\u002Fmujoco-3.7.0\")\n",[50,7300,7301],{"class":52,"line":148},[50,7302,745],{"emptyLinePlaceholder":201},[50,7304,7305],{"class":52,"line":599},[50,7306,7307],{},"include_directories(\n",[50,7309,7310],{"class":52,"line":615},[50,7311,7312],{},"    ${MUJOCO_PATH}\u002Finclude\n",[50,7314,7315],{"class":52,"line":621},[50,7316,161],{},[50,7318,7319],{"class":52,"line":844},[50,7320,745],{"emptyLinePlaceholder":201},[50,7322,7323],{"class":52,"line":850},[50,7324,7325],{},"link_directories(\n",[50,7327,7328],{"class":52,"line":874},[50,7329,7330],{},"    ${MUJOCO_PATH}\u002Flib\n",[50,7332,7333],{"class":52,"line":880},[50,7334,161],{},[50,7336,7337],{"class":52,"line":885},[50,7338,745],{"emptyLinePlaceholder":201},[50,7340,7341],{"class":52,"line":891},[50,7342,7343],{},"set(MUJOCO_LIB\n",[50,7345,7346],{"class":52,"line":924},[50,7347,7348],{},"    ${MUJOCO_PATH}\u002Flib\u002Flibmujoco.so\n",[50,7350,7351],{"class":52,"line":953},[50,7352,161],{},[50,7354,7355],{"class":52,"line":989},[50,7356,745],{"emptyLinePlaceholder":201},[50,7358,7359],{"class":52,"line":1023},[50,7360,7361],{},"# 官方 Simulator 源码\n",[50,7363,7364],{"class":52,"line":1038},[50,7365,7366],{},"file(GLOB SIMULATOR_SRC\n",[50,7368,7369],{"class":52,"line":1058},[50,7370,7371],{},"${CMAKE_CURRENT_SOURCE_DIR}\u002Fsrc\u002Fsimulator\u002F*.cc\n",[50,7373,7374],{"class":52,"line":1063},[50,7375,161],{},[50,7377,7378],{"class":52,"line":1075},[50,7379,7380],{},"# 用户控制代码\n",[50,7382,7383],{"class":52,"line":1097},[50,7384,7385],{},"set(USER_SRC\n",[50,7387,7388],{"class":52,"line":1102},[50,7389,7390],{},"src\u002Fcontrol\u002Fcontrol.cpp\n",[50,7392,7393],{"class":52,"line":1121},[50,7394,7395],{},"src\u002Fcontrol\u002Fpid.cpp\n",[50,7397,7398],{"class":52,"line":1130},[50,7399,7400],{},"src\u002Fsensors\u002Fimu.cpp\n",[50,7402,7403],{"class":52,"line":1146},[50,7404,161],{},[50,7406,7407],{"class":52,"line":1166},[50,7408,745],{"emptyLinePlaceholder":201},[50,7410,7411],{"class":52,"line":4860},[50,7412,7413],{},"# 最终程序\n",[50,7415,7416],{"class":52,"line":4865},[50,7417,7418],{},"add_executable(WheelLeg\n",[50,7420,7421],{"class":52,"line":4871},[50,7422,7423],{},"${SIMULATOR_SRC}\n",[50,7425,7426],{"class":52,"line":4877},[50,7427,7428],{},"${USER_SRC}\n",[50,7430,7431],{"class":52,"line":4882},[50,7432,161],{},[50,7434,7435],{"class":52,"line":5065},[50,7436,745],{"emptyLinePlaceholder":201},[50,7438,7439],{"class":52,"line":5071},[50,7440,7441],{},"target_include_directories(WheelLeg PRIVATE\n",[50,7443,7444],{"class":52,"line":5076},[50,7445,745],{"emptyLinePlaceholder":201},[50,7447,7448],{"class":52,"line":5081},[50,7449,7450],{},"${CMAKE_SOURCE_DIR}\u002Finclude\n",[50,7452,7453],{"class":52,"line":5086},[50,7454,7455],{},"${CMAKE_CURRENT_SOURCE_DIR}\u002Fsrc\u002Fsimulator\n",[50,7457,7458],{"class":52,"line":5091},[50,7459,7460],{},"${MUJOCO_PATH}\u002Finclude\n",[50,7462,7463],{"class":52,"line":5096},[50,7464,745],{"emptyLinePlaceholder":201},[50,7466,7467],{"class":52,"line":5102},[50,7468,161],{},[50,7470,7471],{"class":52,"line":5107},[50,7472,745],{"emptyLinePlaceholder":201},[50,7474,7475],{"class":52,"line":5113},[50,7476,7477],{},"target_link_libraries(WheelLeg\n",[50,7479,7480],{"class":52,"line":5118},[50,7481,745],{"emptyLinePlaceholder":201},[50,7483,7484],{"class":52,"line":5124},[50,7485,7486],{},"${MUJOCO_LIB}\n",[50,7488,7489],{"class":52,"line":5129},[50,7490,7491],{},"glfw\n",[50,7493,7494],{"class":52,"line":5135},[50,7495,7496],{},"GL\n",[50,7498,7499],{"class":52,"line":5140},[50,7500,7501],{},"GLU\n",[50,7503,7504],{"class":52,"line":5145},[50,7505,161],{},[1967,7507,7508],{"start":98},[1970,7509,7510],{},"更改官方main.cc",[40,7512,7514],{"className":4674,"code":7513,"language":4676,"meta":45,"style":45},"\nvoid PhysicsLoop(mj::Simulate& sim) {\n...\n    #在这里面加入用户循环控制程序入口 例如\n    carController.Main_Control_Update(m, d);\n    mj_step(m, d);\n...\n}\n\nvoid PhysicsThread(mj::Simulate* sim, const char* filename){\n...\n\nmj_forward(m, d);\n\n\u002F\u002F在这里加入用户控制器的初始化\ncarController.Init(m);\n\n...\n}\n\n\n",[47,7515,7516,7520,7525,7530,7535,7540,7545,7549,7553,7557,7562,7566,7570,7575,7579,7584,7589,7593,7597],{"__ignoreMap":45},[50,7517,7518],{"class":52,"line":53},[50,7519,745],{"emptyLinePlaceholder":201},[50,7521,7522],{"class":52,"line":89},[50,7523,7524],{},"void PhysicsLoop(mj::Simulate& sim) {\n",[50,7526,7527],{"class":52,"line":98},[50,7528,7529],{},"...\n",[50,7531,7532],{"class":52,"line":104},[50,7533,7534],{},"    #在这里面加入用户循环控制程序入口 例如\n",[50,7536,7537],{"class":52,"line":112},[50,7538,7539],{},"    carController.Main_Control_Update(m, d);\n",[50,7541,7542],{"class":52,"line":118},[50,7543,7544],{},"    mj_step(m, d);\n",[50,7546,7547],{"class":52,"line":127},[50,7548,7529],{},[50,7550,7551],{"class":52,"line":133},[50,7552,4885],{},[50,7554,7555],{"class":52,"line":142},[50,7556,745],{"emptyLinePlaceholder":201},[50,7558,7559],{"class":52,"line":148},[50,7560,7561],{},"void PhysicsThread(mj::Simulate* sim, const char* filename){\n",[50,7563,7564],{"class":52,"line":599},[50,7565,7529],{},[50,7567,7568],{"class":52,"line":615},[50,7569,745],{"emptyLinePlaceholder":201},[50,7571,7572],{"class":52,"line":621},[50,7573,7574],{},"mj_forward(m, d);\n",[50,7576,7577],{"class":52,"line":844},[50,7578,745],{"emptyLinePlaceholder":201},[50,7580,7581],{"class":52,"line":850},[50,7582,7583],{},"\u002F\u002F在这里加入用户控制器的初始化\n",[50,7585,7586],{"class":52,"line":874},[50,7587,7588],{},"carController.Init(m);\n",[50,7590,7591],{"class":52,"line":880},[50,7592,745],{"emptyLinePlaceholder":201},[50,7594,7595],{"class":52,"line":885},[50,7596,7529],{},[50,7598,7599],{"class":52,"line":891},[50,7600,4885],{},[1967,7602,7603],{"start":104},[1970,7604,7605,7606,7609],{},"启动方式 （此处使用fish）\n新建 ",[47,7607,7608],{},"scripts\u002Frun.fish"," 写入以下内容",[40,7611,7613],{"className":42,"code":7612,"language":44,"meta":45,"style":45},"#!\u002Fusr\u002Fbin\u002Fenv fish\ncd ..\u002Fbuild\necho \"========== Build ==========\"\n\nmake\n\nor begin\n\necho \"编译失败\"\n\nexit 1\n\nend\n\necho \"========== Run ==========\"\n#启动程序，设置环境变量以启用 NVIDIA GPU 的渲染加速\n\nenv \\\n\n__NV_PRIME_RENDER_OFFLOAD=1 \\\n\n__GLX_VENDOR_LIBRARY_NAME=nvidia \\\n\nMUJOCO_GL=egl \\\n\n..\u002Fbuild\u002FWheelLeg ..\u002Fmodels\u002Fmodel.xml\n\n",[47,7614,7615,7620,7627,7635,7639,7644,7648,7655,7659,7666,7670,7678,7682,7687,7691,7698,7703,7707,7714,7718,7726,7730,7737,7741,7748,7752],{"__ignoreMap":45},[50,7616,7617],{"class":52,"line":53},[50,7618,7619],{"class":85},"#!\u002Fusr\u002Fbin\u002Fenv fish\n",[50,7621,7622,7624],{"class":52,"line":89},[50,7623,1787],{"class":60},[50,7625,7626],{"class":64}," ..\u002Fbuild\n",[50,7628,7629,7632],{"class":52,"line":98},[50,7630,7631],{"class":60},"echo",[50,7633,7634],{"class":64}," \"========== Build ==========\"\n",[50,7636,7637],{"class":52,"line":104},[50,7638,745],{"emptyLinePlaceholder":201},[50,7640,7641],{"class":52,"line":112},[50,7642,7643],{"class":56},"make\n",[50,7645,7646],{"class":52,"line":118},[50,7647,745],{"emptyLinePlaceholder":201},[50,7649,7650,7652],{"class":52,"line":127},[50,7651,1026],{"class":56},[50,7653,7654],{"class":64}," begin\n",[50,7656,7657],{"class":52,"line":133},[50,7658,745],{"emptyLinePlaceholder":201},[50,7660,7661,7663],{"class":52,"line":142},[50,7662,7631],{"class":60},[50,7664,7665],{"class":64}," \"编译失败\"\n",[50,7667,7668],{"class":52,"line":148},[50,7669,745],{"emptyLinePlaceholder":201},[50,7671,7672,7675],{"class":52,"line":599},[50,7673,7674],{"class":60},"exit",[50,7676,7677],{"class":60}," 1\n",[50,7679,7680],{"class":52,"line":615},[50,7681,745],{"emptyLinePlaceholder":201},[50,7683,7684],{"class":52,"line":621},[50,7685,7686],{"class":68},"end\n",[50,7688,7689],{"class":52,"line":844},[50,7690,745],{"emptyLinePlaceholder":201},[50,7692,7693,7695],{"class":52,"line":850},[50,7694,7631],{"class":60},[50,7696,7697],{"class":64}," \"========== Run ==========\"\n",[50,7699,7700],{"class":52,"line":874},[50,7701,7702],{"class":85},"#启动程序，设置环境变量以启用 NVIDIA GPU 的渲染加速\n",[50,7704,7705],{"class":52,"line":880},[50,7706,745],{"emptyLinePlaceholder":201},[50,7708,7709,7712],{"class":52,"line":885},[50,7710,7711],{"class":56},"env",[50,7713,1321],{"class":60},[50,7715,7716],{"class":52,"line":891},[50,7717,745],{"emptyLinePlaceholder":201},[50,7719,7720,7723],{"class":52,"line":924},[50,7721,7722],{"class":154},"__NV_PRIME_RENDER_OFFLOAD=1 ",[50,7724,7725],{"class":60},"\\\n",[50,7727,7728],{"class":52,"line":953},[50,7729,745],{"emptyLinePlaceholder":201},[50,7731,7732,7735],{"class":52,"line":989},[50,7733,7734],{"class":154},"__GLX_VENDOR_LIBRARY_NAME=nvidia ",[50,7736,7725],{"class":60},[50,7738,7739],{"class":52,"line":1023},[50,7740,745],{"emptyLinePlaceholder":201},[50,7742,7743,7746],{"class":52,"line":1038},[50,7744,7745],{"class":154},"MUJOCO_GL=egl ",[50,7747,7725],{"class":60},[50,7749,7750],{"class":52,"line":1058},[50,7751,745],{"emptyLinePlaceholder":201},[50,7753,7754,7757],{"class":52,"line":1063},[50,7755,7756],{"class":154},"..\u002Fbuild\u002FWheelLeg ",[50,7758,7759],{"class":64},"..\u002Fmodels\u002Fmodel.xml\n",[236,7761,7762],{"id":7762},"问题专项",[1228,7764,7766],{"id":7765},"一解决方针启动卡顿问题","一、解决方针启动卡顿问题",[11,7768,7769],{},"（此处使用fish，bash等其他shell同理）",[2085,7771,7772,7775],{},[1970,7773,7774],{},"原因:没有使用nvidia显卡启动仿真",[1970,7776,7777],{},"新建run.fish在里面写运行程序的脚本",[40,7779,7781],{"className":42,"code":7780,"language":44,"meta":45,"style":45},"#!\u002Fusr\u002Fbin\u002Fenv fish\nenv \\\n\n__NV_PRIME_RENDER_OFFLOAD=1 \\\n\n__GLX_VENDOR_LIBRARY_NAME=nvidia \\\n\nMUJOCO_GL=glx \\\n\n..\u002Fbuild\u002Fdemo编译后生成的可执行文件\n",[47,7782,7783,7787,7793,7797,7803,7807,7813,7817,7824,7828],{"__ignoreMap":45},[50,7784,7785],{"class":52,"line":53},[50,7786,7619],{"class":85},[50,7788,7789,7791],{"class":52,"line":89},[50,7790,7711],{"class":56},[50,7792,1321],{"class":60},[50,7794,7795],{"class":52,"line":98},[50,7796,745],{"emptyLinePlaceholder":201},[50,7798,7799,7801],{"class":52,"line":104},[50,7800,7722],{"class":154},[50,7802,7725],{"class":60},[50,7804,7805],{"class":52,"line":112},[50,7806,745],{"emptyLinePlaceholder":201},[50,7808,7809,7811],{"class":52,"line":118},[50,7810,7734],{"class":154},[50,7812,7725],{"class":60},[50,7814,7815],{"class":52,"line":127},[50,7816,745],{"emptyLinePlaceholder":201},[50,7818,7819,7822],{"class":52,"line":133},[50,7820,7821],{"class":154},"MUJOCO_GL=glx ",[50,7823,7725],{"class":60},[50,7825,7826],{"class":52,"line":142},[50,7827,745],{"emptyLinePlaceholder":201},[50,7829,7830],{"class":52,"line":148},[50,7831,7832],{"class":154},"..\u002Fbuild\u002Fdemo编译后生成的可执行文件\n",[188,7834,7835],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":45,"searchDepth":104,"depth":104,"links":7837},[7838,7844,7847],{"id":3902,"depth":89,"text":3903,"children":7839},[7840,7841,7843],{"id":3994,"depth":98,"text":3995},{"id":4290,"depth":98,"text":7842},"1.2 使用 Python pip 安装",{"id":4403,"depth":98,"text":4404},{"id":4599,"depth":89,"text":4600,"children":7845},[7846],{"id":4603,"depth":98,"text":4604},{"id":4659,"depth":89,"text":4660,"children":7848},[7849,7854],{"id":4663,"depth":98,"text":4664,"children":7850},[7851,7852,7853],{"id":4667,"depth":104,"text":4668},{"id":4700,"depth":104,"text":4701},{"id":7224,"depth":104,"text":7225},{"id":7762,"depth":98,"text":7762,"children":7855},[7856],{"id":7765,"depth":104,"text":7766},"Robotics","记录学习Mujoco的过程",{},"\u002Fwiki\u002Frobotics\u002Fmujoco\u002Fmujoco-28267cc",{"title":3873,"description":7858},"wiki\u002Frobotics\u002Fmujoco\u002Fmujoco-28267cc",[7857],"LEfWDKC0Jw8Kesro5Rwz_s1q8L3S1WlYhOmowiYc24I",1792730445742]