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