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