[{"data":1,"prerenderedAt":1586},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2026-09-20-dao-hang\u002F0400-0100-linux-yu-mcu-shu-ju-dui-jie":3,"wiki-doc-items-2026-09-20-dao-hang":1350,"wiki:author-members":1574},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":45,"chapterOrder":1338,"date":1339,"description":38,"docKey":1340,"docRoot":1341,"docTitle":1342,"extension":1343,"isWikiDoc":575,"isWikiIndex":1344,"meta":1345,"navigation":575,"path":1346,"seo":1347,"stem":1348,"wikiDepth":45,"__hash__":1349},"wiki\u002Fwiki\u002F2026-09-20-导航\u002F0400-0100-Linux与MCU数据对接.md","Linux与MCU数据对接",[7],"董佳辉",{"type":9,"value":10,"toc":1332},"minimark",[11,15,20,29,32,109,128,131,142,146,150,153,156,164,167,173,176,187,270,273,315,318,377,441,444,450,453,459,462,468,471,474,477,480,486,489,518,521,616,619,622,628,635,641,765,771,778,781,787,794,804,807,810,873,876,896,899,1056,1059,1067,1070,1077,1098,1104,1114,1117,1208,1214,1217,1245,1248,1254,1257,1263,1266,1269,1272,1289,1292,1298,1301,1307,1310,1316,1319,1325,1328],[12,13,5],"h2",{"id":14},"linux与mcu数据对接",[16,17,19],"h3",{"id":18},"linux到mcu的数据","Linux到MCU的数据",[21,22,23,24,28],"p",{},"导航这边主要是下发cmd_vel相关的数据,主要包含vx,vy,wz。这里的wz是wz_navigation，而最终机器人自旋速度是",[25,26,27],"code",{},"wz_final = wz_navigation + wz_spin;","（最终自旋速度 = 导航速度 + 自旋速度）",[21,30,31],{},"而北极熊导航这边是由上位机决定的自旋速度",[33,34,39],"pre",{"className":35,"code":36,"language":37,"meta":38,"style":38},"language-yaml shiki shiki-themes github-light github-dark","fake_vel_transform:\n  ros__parameters:\n    input_cmd_vel_topic: \"cmd_vel_nav2_result\"\n    output_cmd_vel_topic: \"cmd_vel\"\n    cmd_spin_topic: \"cmd_spin\"\n    init_spin_speed: 3.14\n","yaml","",[25,40,41,54,62,75,86,97],{"__ignoreMap":38},[42,43,46,50],"span",{"class":44,"line":45},"line",1,[42,47,49],{"class":48},"s9eBZ","fake_vel_transform",[42,51,53],{"class":52},"sVt8B",":\n",[42,55,57,60],{"class":44,"line":56},2,[42,58,59],{"class":48},"  ros__parameters",[42,61,53],{"class":52},[42,63,65,68,71],{"class":44,"line":64},3,[42,66,67],{"class":48},"    input_cmd_vel_topic",[42,69,70],{"class":52},": ",[42,72,74],{"class":73},"sZZnC","\"cmd_vel_nav2_result\"\n",[42,76,78,81,83],{"class":44,"line":77},4,[42,79,80],{"class":48},"    output_cmd_vel_topic",[42,82,70],{"class":52},[42,84,85],{"class":73},"\"cmd_vel\"\n",[42,87,89,92,94],{"class":44,"line":88},5,[42,90,91],{"class":48},"    cmd_spin_topic",[42,93,70],{"class":52},[42,95,96],{"class":73},"\"cmd_spin\"\n",[42,98,100,103,105],{"class":44,"line":99},6,[42,101,102],{"class":48},"    init_spin_speed",[42,104,70],{"class":52},[42,106,108],{"class":107},"sj4cs","3.14\n",[21,110,111,112,115,116,119,120,123,124,127],{},"这里表示，他把nav2最后给的速度话题设置成了",[25,113,114],{},"cmd_vel_nav2_result","，而经过这个节点融合了自旋速度最后生成了",[25,117,118],{},"cmd_vel","，里面的",[25,121,122],{},"wz","就是",[25,125,126],{},"wz_final","。",[21,129,130],{},"所以我们给下位机下发的是vx,vy,wz_final。",[21,132,133,134,136,137],{},"关于",[25,135,49],{},"的详细说明请看",[138,139,141],"a",{"href":140},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0600-fake-vel-transform","云台系速度转换与底盘自旋",[16,143,145],{"id":144},"mcu到linux的数据","MCU到Linux的数据",[147,148,149],"h4",{"id":149},"总概",[21,151,152],{},"北极熊原版本（大小Yaw）",[21,154,155],{},"以下双yaw结构作为原方案背景保留；YSU当前只有一个实际yaw，填写方式见下面的YSU表格。",[33,157,162],{"className":158,"code":160,"language":161,"meta":38},[159],"language-text","chassis\n  │\n  ├─ gimbal_yaw_odom_joint      绕 Z，可动\n  ▼\ngimbal_yaw_odom\n  │\n  ├─ gimbal_pitch_odom_joint    fixed\n  ▼\ngimbal_pitch_odom\n  │\n  ├─ gimbal_yaw_joint           绕 Z，可动\n  ▼\ngimbal_yaw\n  │\n  ├─ gimbal_pitch_joint         绕 Y，可动\n  ▼\ngimbal_pitch\n","text",[25,163,160],{"__ignoreMap":38},[21,165,166],{},"北极熊官方导航 README 明确把实车串口提供的关节称为：",[33,168,171],{"className":169,"code":170,"language":161,"meta":38},[159],"gimbal_yaw_odom   = 大 yaw\ngimbal_yaw        = 小 yaw\ngimbal_pitch      = pitch\n",[25,172,170],{"__ignoreMap":38},[21,174,175],{},"gimbal_pitch_odom_joint：可以认为就是 0，因为你现在的 description 里它本来就是 fixed。\ngimbal_yaw_odom_joint：上电那一刻可以是 0，但运行时不能固定为 0，前提是咱们有北极熊同样的“大小 yaw”机构。它应该跟着大 yaw 的真实角度更新。",[21,177,178,179,182,183,186],{},"YSU没有大小yaw结构。当前模型把实际yaw放在",[25,180,181],{},"gimbal_yaw_joint","，实际pitch放在",[25,184,185],{},"gimbal_pitch_joint","，两个odom关节固定。下文rel_pitch、rel_yaw分别表示机械相对角relative_pitch、relative_yaw，不是MCU世界IMU姿态。",[188,189,190,206],"table",{},[191,192,193],"thead",{},[194,195,196,200,203],"tr",{},[197,198,199],"th",{},"joint",[197,201,202],{},"当前应填的数据",[197,204,205],{},"相对于谁",[207,208,209,224,242,257],"tbody",{},[194,210,211,216,221],{},[212,213,214],"td",{},[25,215,185],{},[212,217,218],{},[25,219,220],{},"rel_pitch",[212,222,223],{},"实际pitch机构相对yaw机构",[194,225,226,230,235],{},[212,227,228],{},[25,229,181],{},[212,231,232],{},[25,233,234],{},"rel_yaw",[212,236,237,238,241],{},"唯一yaw机构相对底盘",[25,239,240],{},"chassis","，需计入机械零位与方向",[194,243,244,249,254],{},[212,245,246],{},[25,247,248],{},"gimbal_pitch_odom_joint",[212,250,251],{},[25,252,253],{},"0.0",[212,255,256],{},"固定连接；串口四项顺序仍保留这一项",[194,258,259,264,268],{},[212,260,261],{},[25,262,263],{},"gimbal_yaw_odom_joint",[212,265,266],{},[25,267,253],{},[212,269,256],{},[21,271,272],{},"北极熊官方 standard_robot_pp_ros2 实际上有两类 MCU→Linux 数据。",[188,274,275,285],{},[191,276,277],{},[194,278,279,282],{},[197,280,281],{},"问题",[197,283,284],{},"对应数据",[207,286,287,295,303],{},[194,288,289,292],{},[212,290,291],{},"云台在世界里朝哪里？",[212,293,294],{},"世界姿态，例如云台 IMU yaw、导航算出的云台航向",[194,296,297,300],{},[212,298,299],{},"云台与底盘之间转了多少？",[212,301,302],{},"yaw 机械相对角，填入对应 JointState",[194,304,305,308],{},[212,306,307],{},"机器人往哪个方向移动？",[212,309,310,311,314],{},"按约定参考系表达的 ",[25,312,313],{},"vx，vy","，可以是云台方向",[21,316,317],{},"因为底盘要一直小陀螺状态，所以推断一下：",[188,319,320,337],{},[191,321,322],{},[194,323,324,327,331,334],{},[197,325,326],{},"状态",[197,328,330],{"align":329},"right","云台世界朝向",[197,332,333],{"align":329},"底盘世界朝向",[197,335,336],{"align":329},"云台相对底盘角",[207,338,339,351,364],{},[194,340,341,344,347,349],{},[212,342,343],{},"初始",[212,345,346],{"align":329},"0°",[212,348,346],{"align":329},[212,350,346],{"align":329},[194,352,353,356,358,361],{},[212,354,355],{},"底盘转过 90°",[212,357,346],{"align":329},[212,359,360],{"align":329},"90°",[212,362,363],{"align":329},"−90°",[194,365,366,369,371,374],{},[212,367,368],{},"底盘转过 180°",[212,370,346],{"align":329},[212,372,373],{"align":329},"180°",[212,375,376],{"align":329},"−180°",[188,378,379,392],{},[191,380,381],{},[194,382,383,386,389],{},[197,384,385],{"align":329},"输入机械 yaw",[197,387,388],{"align":329},"导航还原的底盘世界 yaw",[197,390,391],{"align":329},"导航中的云台 yaw",[207,393,394,409,425],{},[194,395,396,401,405],{},[212,397,398],{"align":329},[25,399,400],{},"0",[212,402,403],{"align":329},[25,404,400],{},[212,406,407],{"align":329},[25,408,400],{},[194,410,411,416,421],{},[212,412,413],{"align":329},[25,414,415],{},"−π\u002F2",[212,417,418],{"align":329},[25,419,420],{},"+π\u002F2",[212,422,423],{"align":329},[25,424,400],{},[194,426,427,432,437],{},[212,428,429],{"align":329},[25,430,431],{},"−π",[212,433,434],{"align":329},[25,435,436],{},"π",[212,438,439],{"align":329},[25,440,400],{},[21,442,443],{},"而 JointState 记录 0° → −90° → −180°，是为了告诉 TF：底盘与云台的相对关系正在变化。",[33,445,448],{"className":446,"code":447,"language":161,"meta":38},[159],"导航\u002F串口 vx、vy：按云台方向表达\n串口 wz：最终底盘转速\n\nJointState yaw：云台相对底盘的机械角\nJointState pitch：实际 pitch 的机械相对角\n\n云台 IMU RPY：单独保留世界\u002F惯性姿态语义\n",[25,449,447],{"__ignoreMap":38},[21,451,452],{},"第一类是 IMU 数据：",[21,454,455,456,127],{},"yaw，pitch，roll然后Linux 收到以后，发布 ",[25,457,458],{},"sensor_msgs\u002Fmsg\u002FImu",[21,460,461],{},"当前Point-LIO使用MID360的livox\u002Fimu，并不直接读取这段MCU姿态。MCU姿态仍应保留明确的世界／惯性参考系含义，不能直接当作机械关节角。",[33,463,466],{"className":464,"code":465,"language":161,"meta":38},[159],"imu_state\n\nroll       rad\npitch      rad\nyaw        rad\n\nroll_vel   rad\u002Fs\npitch_vel  rad\u002Fs\nyaw_vel    rad\u002Fs\n",[25,467,465],{"__ignoreMap":38},[21,469,470],{},"下面是原串口示例的字段连接记法，是否属于机械相对角需按原驱动核对；YSU当前JointState仍按上表使用rel_pitch、rel_yaw：",[21,472,473],{},"pitch → gimbal_pitch_joint\nyaw   → gimbal_yaw_joint",[21,475,476],{},"第二类是 JointState\u002F云台参考位置数据：",[21,478,479],{},"这个很重要",[33,481,484],{"className":482,"code":483,"language":161,"meta":38},[159],"joint_state\n\npitch_odom   rad\nyaw_odom     rad\n",[25,485,483],{"__ignoreMap":38},[21,487,488],{},"Linux 收到以后并不马上发布，而是保存：",[33,490,494],{"className":491,"code":492,"language":493,"meta":38,"style":38},"language-cpp shiki shiki-themes github-light github-dark","last_gimbal_pitch_odom_joint_ = pitch_odom;\nlast_gimbal_yaw_odom_joint_   = yaw_odom;\n","cpp",[25,495,496,508],{"__ignoreMap":38},[42,497,498,501,505],{"class":44,"line":45},[42,499,500],{"class":52},"last_gimbal_pitch_odom_joint_ ",[42,502,504],{"class":503},"szBVR","=",[42,506,507],{"class":52}," pitch_odom;\n",[42,509,510,513,515],{"class":44,"line":56},[42,511,512],{"class":52},"last_gimbal_yaw_odom_joint_   ",[42,514,504],{"class":503},[42,516,517],{"class":52}," yaw_odom;\n",[21,519,520],{},"以下保留原串口示例的四字段组织方式；字段语义需按原驱动核对，它不是YSU当前的填写方案。世界IMU姿态不能直接填入机械关节角：",[33,522,524],{"className":491,"code":523,"language":493,"meta":38,"style":38},"joint_msg.name = {\n    \"gimbal_pitch_joint\",\n    \"gimbal_yaw_joint\",\n    \"gimbal_pitch_odom_joint\",\n    \"gimbal_yaw_odom_joint\",\n};\n\njoint_msg.position = {\n    imu_pitch,\n    imu_yaw,\n    pitch_odom,\n    yaw_odom,\n};\n",[25,525,526,536,544,551,558,565,570,577,587,593,599,605,611],{"__ignoreMap":38},[42,527,528,531,533],{"class":44,"line":45},[42,529,530],{"class":52},"joint_msg.name ",[42,532,504],{"class":503},[42,534,535],{"class":52}," {\n",[42,537,538,541],{"class":44,"line":56},[42,539,540],{"class":73},"    \"gimbal_pitch_joint\"",[42,542,543],{"class":52},",\n",[42,545,546,549],{"class":44,"line":64},[42,547,548],{"class":73},"    \"gimbal_yaw_joint\"",[42,550,543],{"class":52},[42,552,553,556],{"class":44,"line":77},[42,554,555],{"class":73},"    \"gimbal_pitch_odom_joint\"",[42,557,543],{"class":52},[42,559,560,563],{"class":44,"line":88},[42,561,562],{"class":73},"    \"gimbal_yaw_odom_joint\"",[42,564,543],{"class":52},[42,566,567],{"class":44,"line":99},[42,568,569],{"class":52},"};\n",[42,571,573],{"class":44,"line":572},7,[42,574,576],{"emptyLinePlaceholder":575},true,"\n",[42,578,580,583,585],{"class":44,"line":579},8,[42,581,582],{"class":52},"joint_msg.position ",[42,584,504],{"class":503},[42,586,535],{"class":52},[42,588,590],{"class":44,"line":589},9,[42,591,592],{"class":52},"    imu_pitch,\n",[42,594,596],{"class":44,"line":595},10,[42,597,598],{"class":52},"    imu_yaw,\n",[42,600,602],{"class":44,"line":601},11,[42,603,604],{"class":52},"    pitch_odom,\n",[42,606,608],{"class":44,"line":607},12,[42,609,610],{"class":52},"    yaw_odom,\n",[42,612,614],{"class":44,"line":613},13,[42,615,569],{"class":52},[21,617,618],{},"但是咱们没有大小yaw结构的话：",[21,620,621],{},"但为了尽量不改北极熊后面的 TF \u002F Nav2 （因为这是为了发布TF而用的角度）框架，最合适的兼容方法是：",[33,623,626],{"className":624,"code":625,"language":161,"meta":38},[159],"真实机械 yaw   → gimbal_yaw_joint\n真实机械 pitch → gimbal_pitch_joint\n两个 odom 关节 → fixed，position填0\n",[25,627,625],{"__ignoreMap":38},[21,629,630,631,634],{},"JointState按pitch、yaw、pitch_odom、yaw_odom排序，position为",[25,632,633],{},"{relative_pitch, relative_yaw, 0, 0}","。机械零位、正方向和弧度单位需要上实物核对，世界IMU姿态另按其参考系处理。",[33,636,639],{"className":637,"code":638,"language":161,"meta":38},[159],"chassis\n  │\n  │ gimbal_yaw_odom_joint = fixed\n  ▼\ngimbal_yaw_odom\n  │\n  │ gimbal_pitch_odom_joint = fixed\n  ▼\ngimbal_pitch_odom\n  │\n  │ gimbal_yaw_joint = 唯一实际 yaw\n  ▼\ngimbal_yaw\n  │\n  │ gimbal_pitch_joint = 实际 pitch\n  ▼\ngimbal_pitch\n",[25,640,638],{"__ignoreMap":38},[33,642,644],{"className":491,"code":643,"language":493,"meta":38,"style":38},"      msg_jointstate.name = {\n          \"gimbal_pitch_joint\",      \u002F\u002F 实际pitch\n          \"gimbal_yaw_joint\",        \u002F\u002F 唯一实际yaw\n          \"gimbal_pitch_odom_joint\",   \u002F\u002F 固定层\n          \"gimbal_yaw_odom_joint\"    \u002F\u002F 固定层\n      };\n\n      msg_jointstate.position = {\n                static_cast\u003Cfp64>(rel_pitch),  \u002F\u002F 唯一机械 pitch\n                static_cast\u003Cfp64>(rel_yaw),    \u002F\u002F 唯一机械 yaw\n                0.0,                          \u002F\u002F 固定层\n                0.0                           \u002F\u002F 固定层\n      };\n",[25,645,646,655,667,677,687,695,700,704,713,730,744,754,761],{"__ignoreMap":38},[42,647,648,651,653],{"class":44,"line":45},[42,649,650],{"class":52},"      msg_jointstate.name ",[42,652,504],{"class":503},[42,654,535],{"class":52},[42,656,657,660,663],{"class":44,"line":56},[42,658,659],{"class":73},"          \"gimbal_pitch_joint\"",[42,661,662],{"class":52},",",[42,664,666],{"class":665},"sJ8bj","      \u002F\u002F 实际pitch\n",[42,668,669,672,674],{"class":44,"line":64},[42,670,671],{"class":73},"          \"gimbal_yaw_joint\"",[42,673,662],{"class":52},[42,675,676],{"class":665},"        \u002F\u002F 唯一实际yaw\n",[42,678,679,682,684],{"class":44,"line":77},[42,680,681],{"class":73},"          \"gimbal_pitch_odom_joint\"",[42,683,662],{"class":52},[42,685,686],{"class":665},"   \u002F\u002F 固定层\n",[42,688,689,692],{"class":44,"line":88},[42,690,691],{"class":73},"          \"gimbal_yaw_odom_joint\"",[42,693,694],{"class":665},"    \u002F\u002F 固定层\n",[42,696,697],{"class":44,"line":99},[42,698,699],{"class":52},"      };\n",[42,701,702],{"class":44,"line":572},[42,703,576],{"emptyLinePlaceholder":575},[42,705,706,709,711],{"class":44,"line":579},[42,707,708],{"class":52},"      msg_jointstate.position ",[42,710,504],{"class":503},[42,712,535],{"class":52},[42,714,715,718,721,724,727],{"class":44,"line":589},[42,716,717],{"class":503},"                static_cast\u003C",[42,719,720],{"class":52},"fp64",[42,722,723],{"class":503},">",[42,725,726],{"class":52},"(rel_pitch),",[42,728,729],{"class":665},"  \u002F\u002F 唯一机械 pitch\n",[42,731,732,734,736,738,741],{"class":44,"line":595},[42,733,717],{"class":503},[42,735,720],{"class":52},[42,737,723],{"class":503},[42,739,740],{"class":52},"(rel_yaw),",[42,742,743],{"class":665},"    \u002F\u002F 唯一机械 yaw\n",[42,745,746,749,751],{"class":44,"line":601},[42,747,748],{"class":107},"                0.0",[42,750,662],{"class":52},[42,752,753],{"class":665},"                          \u002F\u002F 固定层\n",[42,755,756,758],{"class":44,"line":607},[42,757,748],{"class":107},[42,759,760],{"class":665},"                           \u002F\u002F 固定层\n",[42,762,763],{"class":44,"line":613},[42,764,699],{"class":52},[33,766,769],{"className":767,"code":768,"language":161,"meta":38},[159],"chassis\n  │\n  │ gimbal_yaw_odom_joint   ← fixed，固定层\n  ▼\ngimbal_yaw_odom\n  │\n  │ gimbal_pitch_odom_joint ← fixed\n  ▼\ngimbal_pitch_odom\n  │\n  │ gimbal_yaw_joint        ← 唯一实际yaw，动态\n  ▼\ngimbal_yaw\n  │\n  │ gimbal_pitch_joint      ← 实际pitch，动态\n  ▼\ngimbal_pitch\n",[25,770,768],{"__ignoreMap":38},[21,772,773,774,777],{},"最后 ",[25,775,776],{},"chassis → gimbal_yaw"," 依然完全正确。",[21,779,780],{},"综上，咱们正真需要的是：",[33,782,785],{"className":783,"code":784,"language":161,"meta":38},[159],"MCU → Linux\n\nroll       rad\npitch      rad\nyaw        rad\njoint_yaw  rad\njoint_pitch rad\n",[25,786,784],{"__ignoreMap":38},[21,788,789,790,793],{},"其中云台 IMU 的 RPY 用来生成 ",[25,791,792],{},"\u002Fserial\u002Fimu"," 的 orientation。",[21,795,796,797,800,801,127],{},"云台电机返回的角度用来",[25,798,799],{},"joint_yaw","和",[25,802,803],{},"joint_pitch",[21,805,806],{},"但其实，如果你的雷达放在Yaw的云台上，其实joint_pitch无所谓，不影响最终的导航，但可能和自瞄有关系。",[21,808,809],{},"单位、方向和零位，可以从当前模型推出：",[188,811,812,822],{},[191,813,814],{},[194,815,816,819],{},[197,817,818],{},"项目",[197,820,821],{},"当前 ROS 模型的约定",[207,823,824,836,847,855,865],{},[194,825,826,829],{},[212,827,828],{},"单位",[212,830,831,835],{},[832,833,834],"strong",{},"rad","；串口节点不会自动把度转成弧度",[194,837,838,841],{},[212,839,840],{},"yaw 正方向",[212,842,843,844],{},"从车顶往下看，",[832,845,846],{},"逆时针为正",[194,848,849,852],{},[212,850,851],{},"yaw 零位",[212,853,854],{},"云台前向与底盘前向对齐",[194,856,857,860],{},[212,858,859],{},"pitch 正方向",[212,861,862],{},[832,863,864],{},"向下俯为正，向上仰为负",[194,866,867,870],{},[212,868,869],{},"pitch 零位",[212,871,872],{},"pitch 机构与 yaw 层坐标轴对齐；不代表坡地时相对世界水平",[21,874,875],{},"咱们需要跟MCU规定好，他需要把云台电机的角度进行转换：",[877,878,879,883,893],"ul",{},[880,881,882],"li",{},"云台朝底盘正方向时为0",[880,884,885,886,889,890],{},"范围必须归一化，",[25,887,888],{},"[-π, π) rad","，也就是 ",[25,891,892],{},"[-180°, 180°)",[880,894,895],{},"旋转方向按照标准坐标系，也就是在某个轴的正方向看，绕他的逆时针为正。",[21,897,898],{},"然后pitch_odom要进行限幅：",[33,900,904],{"className":901,"code":902,"language":903,"meta":38,"style":38},"language-xml shiki shiki-themes github-light github-dark","\u003Cjoint name=\"gimbal_pitch_joint\" type=\"revolute\">\n    ...\n    \u003Caxis>\n        \u003Cxyz>0 1 0\u003C\u002Fxyz>\n        \u003Climit>\n            \u003Ceffort>100\u003C\u002Feffort>\n            \u003Clower>${-3.14*0.25}\u003C\u002Flower>\n            \u003Cupper>${3.14*0.18}\u003C\u002Fupper>\n            \u003Cvelocity>50\u003C\u002Fvelocity>\n        \u003C\u002Flimit>\n    \u003C\u002Faxis>\n\u003C\u002Fjoint>\n","xml",[25,905,906,933,938,948,963,972,987,1001,1015,1029,1038,1047],{"__ignoreMap":38},[42,907,908,911,913,917,919,922,925,927,930],{"class":44,"line":45},[42,909,910],{"class":52},"\u003C",[42,912,199],{"class":48},[42,914,916],{"class":915},"sScJk"," name",[42,918,504],{"class":52},[42,920,921],{"class":73},"\"gimbal_pitch_joint\"",[42,923,924],{"class":915}," type",[42,926,504],{"class":52},[42,928,929],{"class":73},"\"revolute\"",[42,931,932],{"class":52},">\n",[42,934,935],{"class":44,"line":56},[42,936,937],{"class":52},"    ...\n",[42,939,940,943,946],{"class":44,"line":64},[42,941,942],{"class":52},"    \u003C",[42,944,945],{"class":48},"axis",[42,947,932],{"class":52},[42,949,950,953,956,959,961],{"class":44,"line":77},[42,951,952],{"class":52},"        \u003C",[42,954,955],{"class":48},"xyz",[42,957,958],{"class":52},">0 1 0\u003C\u002F",[42,960,955],{"class":48},[42,962,932],{"class":52},[42,964,965,967,970],{"class":44,"line":88},[42,966,952],{"class":52},[42,968,969],{"class":48},"limit",[42,971,932],{"class":52},[42,973,974,977,980,983,985],{"class":44,"line":99},[42,975,976],{"class":52},"            \u003C",[42,978,979],{"class":48},"effort",[42,981,982],{"class":52},">100\u003C\u002F",[42,984,979],{"class":48},[42,986,932],{"class":52},[42,988,989,991,994,997,999],{"class":44,"line":572},[42,990,976],{"class":52},[42,992,993],{"class":48},"lower",[42,995,996],{"class":52},">${-3.14*0.25}\u003C\u002F",[42,998,993],{"class":48},[42,1000,932],{"class":52},[42,1002,1003,1005,1008,1011,1013],{"class":44,"line":579},[42,1004,976],{"class":52},[42,1006,1007],{"class":48},"upper",[42,1009,1010],{"class":52},">${3.14*0.18}\u003C\u002F",[42,1012,1007],{"class":48},[42,1014,932],{"class":52},[42,1016,1017,1019,1022,1025,1027],{"class":44,"line":589},[42,1018,976],{"class":52},[42,1020,1021],{"class":48},"velocity",[42,1023,1024],{"class":52},">50\u003C\u002F",[42,1026,1021],{"class":48},[42,1028,932],{"class":52},[42,1030,1031,1034,1036],{"class":44,"line":595},[42,1032,1033],{"class":52},"        \u003C\u002F",[42,1035,969],{"class":48},[42,1037,932],{"class":52},[42,1039,1040,1043,1045],{"class":44,"line":601},[42,1041,1042],{"class":52},"    \u003C\u002F",[42,1044,945],{"class":48},[42,1046,932],{"class":52},[42,1048,1049,1052,1054],{"class":44,"line":607},[42,1050,1051],{"class":52},"\u003C\u002F",[42,1053,199],{"class":48},[42,1055,932],{"class":52},[21,1057,1058],{},"如果规定机械水平位是0的话，目前：",[877,1060,1061,1064],{},[880,1062,1063],{},"lower：约 −45°，向上仰。",[880,1065,1066],{},"upper：约 +32.4°，向下俯。\n单位都是 rad。",[21,1068,1069],{},"这里只是会限制ROS2里Gazebo的限幅。（真正的限幅应该让MCU端根据机械限位进行限位）",[21,1071,1072,1073,1076],{},"查看",[25,1074,1075],{},"sensor_msgs\u002Fmsg\u002FJointState","：",[33,1078,1082],{"className":1079,"code":1080,"language":1081,"meta":38,"style":38},"language-bash shiki shiki-themes github-light github-dark","ros2 interface show sensor_msgs\u002Fmsg\u002FJointState\n","bash",[25,1083,1084],{"__ignoreMap":38},[42,1085,1086,1089,1092,1095],{"class":44,"line":45},[42,1087,1088],{"class":915},"ros2",[42,1090,1091],{"class":73}," interface",[42,1093,1094],{"class":73}," show",[42,1096,1097],{"class":73}," sensor_msgs\u002Fmsg\u002FJointState\n",[33,1099,1102],{"className":1100,"code":1101,"language":161,"meta":38},[159],"# This is a message that holds data to describe the state of a set of torque controlled joints.\n#\n# The state of each joint (revolute or prismatic) is defined by:\n#  * the position of the joint (rad or m),\n#  * the velocity of the joint (rad\u002Fs or m\u002Fs) and\n#  * the effort that is applied in the joint (Nm or N).\n#\n# Each joint is uniquely identified by its name\n# The header specifies the time at which the joint states were recorded. All the joint states\n# in one message have to be recorded at the same time.\n#\n# This message consists of a multiple arrays, one for each part of the joint state.\n# The goal is to make each of the fields optional. When e.g. your joints have no\n# effort associated with them, you can leave the effort array empty.\n#\n# All arrays in this message should have the same size, or be empty.\n# This is the only way to uniquely associate the joint name with the correct\n# states.\n\nstd_msgs\u002FHeader header\n        builtin_interfaces\u002FTime stamp\n                int32 sec\n                uint32 nanosec\n        string frame_id\n\nstring[] name\nfloat64[] position\nfloat64[] velocity\nfloat64[] effort\n",[25,1103,1101],{"__ignoreMap":38},[21,1105,1106,1107,1109,1110,1113],{},"这个",[25,1108,1075],{},"里的数据主要用于搭配",[25,1111,1112],{},"robot_description","来发布动态TF。",[21,1115,1116],{},"比如：",[33,1118,1120],{"className":901,"code":1119,"language":903,"meta":38,"style":38},"\u003Cjoint name=\"gimbal_yaw_odom_joint\" type=\"revolute\">\n    \u003Cparent>chassis\u003C\u002Fparent>\n    \u003Cchild>gimbal_yaw_odom\u003C\u002Fchild>\n    \u003Caxis>\n        \u003Cxyz>0 0 1\u003C\u002Fxyz>\n    \u003C\u002Faxis>\n\u003C\u002Fjoint>\n",[25,1121,1122,1143,1157,1171,1179,1192,1200],{"__ignoreMap":38},[42,1123,1124,1126,1128,1130,1132,1135,1137,1139,1141],{"class":44,"line":45},[42,1125,910],{"class":52},[42,1127,199],{"class":48},[42,1129,916],{"class":915},[42,1131,504],{"class":52},[42,1133,1134],{"class":73},"\"gimbal_yaw_odom_joint\"",[42,1136,924],{"class":915},[42,1138,504],{"class":52},[42,1140,929],{"class":73},[42,1142,932],{"class":52},[42,1144,1145,1147,1150,1153,1155],{"class":44,"line":56},[42,1146,942],{"class":52},[42,1148,1149],{"class":48},"parent",[42,1151,1152],{"class":52},">chassis\u003C\u002F",[42,1154,1149],{"class":48},[42,1156,932],{"class":52},[42,1158,1159,1161,1164,1167,1169],{"class":44,"line":64},[42,1160,942],{"class":52},[42,1162,1163],{"class":48},"child",[42,1165,1166],{"class":52},">gimbal_yaw_odom\u003C\u002F",[42,1168,1163],{"class":48},[42,1170,932],{"class":52},[42,1172,1173,1175,1177],{"class":44,"line":77},[42,1174,942],{"class":52},[42,1176,945],{"class":48},[42,1178,932],{"class":52},[42,1180,1181,1183,1185,1188,1190],{"class":44,"line":88},[42,1182,952],{"class":52},[42,1184,955],{"class":48},[42,1186,1187],{"class":52},">0 0 1\u003C\u002F",[42,1189,955],{"class":48},[42,1191,932],{"class":52},[42,1193,1194,1196,1198],{"class":44,"line":99},[42,1195,1042],{"class":52},[42,1197,945],{"class":48},[42,1199,932],{"class":52},[42,1201,1202,1204,1206],{"class":44,"line":572},[42,1203,1051],{"class":52},[42,1205,199],{"class":48},[42,1207,932],{"class":52},[33,1209,1212],{"className":1210,"code":1211,"language":161,"meta":38},[159],"父坐标系：chassis\n子坐标系：gimbal_yaw_odom\n转轴：+Z\n",[25,1213,1211],{"__ignoreMap":38},[21,1215,1216],{},"然后咱们发",[33,1218,1220],{"className":491,"code":1219,"language":493,"meta":38,"style":38},"name = \"gimbal_yaw_odom_joint\";\nposition = joint_yaw;\n",[25,1221,1222,1235],{"__ignoreMap":38},[42,1223,1224,1227,1229,1232],{"class":44,"line":45},[42,1225,1226],{"class":52},"name ",[42,1228,504],{"class":503},[42,1230,1231],{"class":73}," \"gimbal_yaw_odom_joint\"",[42,1233,1234],{"class":52},";\n",[42,1236,1237,1240,1242],{"class":44,"line":56},[42,1238,1239],{"class":52},"position ",[42,1241,504],{"class":503},[42,1243,1244],{"class":52}," joint_yaw;\n",[21,1246,1247],{},"robot_state_publisher 就自动算：",[33,1249,1252],{"className":1250,"code":1251,"language":161,"meta":38},[159],"chassis\n   ↓ joint_yaw\ngimbal_yaw_odom\n",[25,1253,1251],{"__ignoreMap":38},[21,1255,1256],{},"并发布动态 TF。",[33,1258,1261],{"className":1259,"code":1260,"language":161,"meta":38},[159],"STM32\n├── joint_yaw\n├── joint_pitch\n│\n│\n▼\nserial_comm\n│\n└── \u002Fserial\u002Fgimbal_joint_state\n          ↓\njoint_state_publisher\n          ↓\n     \u002Fjoint_states\n          ↓\nrobot_state_publisher\n          ↓\n        \u002F**tf**\n",[25,1262,1260],{"__ignoreMap":38},[147,1264,1265],{"id":1265},"这些变量的范围和方向",[21,1267,1268],{},"至于这些角到底怎么定义，重点不是 IMU 的世界系 RPY，而是 joint 自己的坐标轴和零位。",[21,1270,1271],{},"yaw这里：",[33,1273,1275],{"className":901,"code":1274,"language":903,"meta":38,"style":38},"\u003Cxyz>0 0 1\u003C\u002Fxyz>\n",[25,1276,1277],{"__ignoreMap":38},[42,1278,1279,1281,1283,1285,1287],{"class":44,"line":45},[42,1280,910],{"class":52},[42,1282,955],{"class":48},[42,1284,1187],{"class":52},[42,1286,955],{"class":48},[42,1288,932],{"class":52},[21,1290,1291],{},"所以 yaw 是绕父坐标系的 +Z 转。\nROS 采用右手系：",[33,1293,1296],{"className":1294,"code":1295,"language":161,"meta":38},[159],"X 前\nY 左\nZ 上\n",[25,1297,1295],{"__ignoreMap":38},[21,1299,1300],{},"从机器人上方往下看：",[33,1302,1305],{"className":1303,"code":1304,"language":161,"meta":38},[159],"joint_yaw > 0\n",[25,1306,1304],{"__ignoreMap":38},[21,1308,1309],{},"一般就是逆时针转，也就是向左转。\n所以建议你下位机定义：\n云台正对底盘 X+ 前方：",[33,1311,1314],{"className":1312,"code":1313,"language":161,"meta":38},[159],"joint_yaw = 0\n\n向左转：\njoint_yaw > 0\n\n向右转：\njoint_yaw \u003C 0\n",[25,1315,1313],{"__ignoreMap":38},[21,1317,1318],{},"例如：",[33,1320,1323],{"className":1321,"code":1322,"language":161,"meta":38},[159],"正前方      0 rad\n左 90°      +π\u002F2\n右 90°      -π\u002F2\n后方        ±π\n",[25,1324,1322],{"__ignoreMap":38},[21,1326,1327],{},"这个和 ROS 的右手系最自然。",[1329,1330,1331],"style",{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .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}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}",{"title":38,"searchDepth":56,"depth":56,"links":1333},[1334],{"id":14,"depth":56,"text":5,"children":1335},[1336,1337],{"id":18,"depth":64,"text":19},{"id":144,"depth":64,"text":145},"0400-0100","2026-09-20","2026-09-20-dao-hang","\u002Fwiki\u002F2026-09-20-dao-hang","导航","md",false,{},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0400-0100-linux-yu-mcu-shu-ju-dui-jie",{"title":5,"description":38},"wiki\u002F2026-09-20-导航\u002F0400-0100-Linux与MCU数据对接","fyz18gvcOGgwz1AE7NcTeCb0HXgn4rJ_XV6MLMvqkmI",[1351,1358,1364,1370,1376,1382,1388,1394,1400,1402,1408,1414,1420,1426,1432,1438,1444,1450,1456,1461,1467,1473,1479,1485,1491,1497,1503,1509,1515,1521,1527,1533,1539,1545,1551,1557,1563,1569],{"path":1352,"stem":1353,"title":1354,"authors":1355,"date":1339,"chapterOrder":1356,"chapterDepth":1357,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0100-jian-jie","wiki\u002F2026-09-20-导航\u002F0100-简介","简介",[7],"0100",0,{"path":1359,"stem":1360,"title":1361,"authors":1362,"date":1339,"chapterOrder":1363,"chapterDepth":1357,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0200-huan-jing-pei-zhi-yu-yun-xing","wiki\u002F2026-09-20-导航\u002F0200-环境配置与运行","环境配置与运行",[7],"0200",{"path":1365,"stem":1366,"title":1367,"authors":1368,"date":1339,"chapterOrder":1369,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-0100-robot-description","wiki\u002F2026-09-20-导航\u002F0300-0100-robot_description","robot_description（机器人模型与关节定义）",[7],"0300-0100",{"path":1371,"stem":1372,"title":1373,"authors":1374,"date":1339,"chapterOrder":1375,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-0200-mid360-an-zhuang-wei-zhi","wiki\u002F2026-09-20-导航\u002F0300-0200-MID360安装位置","MID360安装位置",[7],"0300-0200",{"path":1377,"stem":1378,"title":1379,"authors":1380,"date":1339,"chapterOrder":1381,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-0300-launch-yu-bao-yi-lai-pei-zhi","wiki\u002F2026-09-20-导航\u002F0300-0300-Launch与包依赖配置","Launch与包依赖配置",[7],"0300-0300",{"path":1383,"stem":1384,"title":1385,"authors":1386,"date":1339,"chapterOrder":1387,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-0400-fang-zhen-shi-jue-you-hua","wiki\u002F2026-09-20-导航\u002F0300-0400-仿真视觉优化","仿真视觉优化（可选）",[7],"0300-0400",{"path":1389,"stem":1390,"title":1391,"authors":1392,"date":1339,"chapterOrder":1393,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-0500-tian-jia-di-tu","wiki\u002F2026-09-20-导航\u002F0300-0500-添加地图","添加地图",[7],"0300-0500",{"path":1395,"stem":1396,"title":1397,"authors":1398,"date":1339,"chapterOrder":1399,"chapterDepth":1357,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0300-ji-qi-ren-mo-xing-yu-fang-zhen","wiki\u002F2026-09-20-导航\u002F0300-机器人模型与仿真","机器人模型与仿真",[7],"0300",{"path":1346,"stem":1348,"title":5,"authors":1401,"date":1339,"chapterOrder":1338,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},[7],{"path":1403,"stem":1404,"title":1405,"authors":1406,"date":1339,"chapterOrder":1407,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0400-0200-chuan-kou-tong-xin","wiki\u002F2026-09-20-导航\u002F0400-0200-串口通信","Serial_Comm（串口通信）",[7],"0400-0200",{"path":1409,"stem":1410,"title":1411,"authors":1412,"date":1339,"chapterOrder":1413,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0400-0300-shou-bing-kong-zhi","wiki\u002F2026-09-20-导航\u002F0400-0300-手柄控制","Joy（手柄控制）",[7],"0400-0300",{"path":1415,"stem":1416,"title":1417,"authors":1418,"date":1339,"chapterOrder":1419,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0400-0400-mid360-yu-tf-lian-tiao","wiki\u002F2026-09-20-导航\u002F0400-0400-MID360与TF联调","MID360与TF联调",[7],"0400-0400",{"path":1421,"stem":1422,"title":1423,"authors":1424,"date":1339,"chapterOrder":1425,"chapterDepth":1357,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0400-ying-jian-dui-jie-yu-kong-zhi","wiki\u002F2026-09-20-导航\u002F0400-硬件对接与控制","硬件对接与控制",[7],"0400",{"path":1427,"stem":1428,"title":1429,"authors":1430,"date":1339,"chapterOrder":1431,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0100-point-lio","wiki\u002F2026-09-20-导航\u002F0500-0100-Point_LIO","Point_LIO（激光与IMU融合里程计，建图与定位算法）",[7],"0500-0100",{"path":1433,"stem":1434,"title":1435,"authors":1436,"date":1339,"chapterOrder":1437,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0200-loam-interface","wiki\u002F2026-09-20-导航\u002F0500-0200-loam_interface","loam_interface（Point-LIO输出的坐标与话题适配）",[7],"0500-0200",{"path":1439,"stem":1440,"title":1441,"authors":1442,"date":1339,"chapterOrder":1443,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0300-sensor-scan-generation","wiki\u002F2026-09-20-导航\u002F0500-0300-sensor_scan_generation","sensor_scan_generation（雷达点云换系与底盘、云台位姿转换）",[7],"0500-0300",{"path":1445,"stem":1446,"title":1447,"authors":1448,"date":1339,"chapterOrder":1449,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0400-terrain-analysis","wiki\u002F2026-09-20-导航\u002F0500-0400-terrain_analysis","terrain_analysis（近场地面与障碍高差分析）",[7],"0500-0400",{"path":1451,"stem":1452,"title":1453,"authors":1454,"date":1339,"chapterOrder":1455,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0500-terrain-analysis-ext","wiki\u002F2026-09-20-导航\u002F0500-0500-terrain_analysis_ext","terrain_analysis_ext（扩展远场地形与近远场结果合并）",[7],"0500-0500",{"path":140,"stem":1457,"title":1458,"authors":1459,"date":1339,"chapterOrder":1460,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"wiki\u002F2026-09-20-导航\u002F0500-0600-fake_vel_transform","fake_vel_transform（云台系速度转换与底盘自旋）",[7],"0500-0600",{"path":1462,"stem":1463,"title":1464,"authors":1465,"date":1339,"chapterOrder":1466,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0700-small-gicp-relocalization","wiki\u002F2026-09-20-导航\u002F0500-0700-small_gicp_relocalization","small_gicp_relocalization（先验点云地图重定位）",[7],"0500-0700",{"path":1468,"stem":1469,"title":1470,"authors":1471,"date":1339,"chapterOrder":1472,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0800-pointcloud-to-laserscan","wiki\u002F2026-09-20-导航\u002F0500-0800-pointcloud_to_laserscan","pointcloud_to_laserscan（三维地形点云转二维扫描）",[7],"0500-0800",{"path":1474,"stem":1475,"title":1476,"authors":1477,"date":1339,"chapterOrder":1478,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-0900-slam-toolbox","wiki\u002F2026-09-20-导航\u002F0500-0900-slam_toolbox","slam_toolbox（二维地图生成与轨迹优化）",[7],"0500-0900",{"path":1480,"stem":1481,"title":1482,"authors":1483,"date":1339,"chapterOrder":1484,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1000-bt-navigator","wiki\u002F2026-09-20-导航\u002F0500-1000-bt_navigator","bt_navigator（行为树导航任务调度）",[7],"0500-1000",{"path":1486,"stem":1487,"title":1488,"authors":1489,"date":1339,"chapterOrder":1490,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1100-controller-server","wiki\u002F2026-09-20-导航\u002F0500-1100-controller_server","controller_server（路径跟踪、进度检查与到达判定）",[7],"0500-1100",{"path":1492,"stem":1493,"title":1494,"authors":1495,"date":1339,"chapterOrder":1496,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1200-local-costmap","wiki\u002F2026-09-20-导航\u002F0500-1200-local_costmap","local_costmap（局部障碍代价地图）",[7],"0500-1200",{"path":1498,"stem":1499,"title":1500,"authors":1501,"date":1339,"chapterOrder":1502,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1300-global-costmap","wiki\u002F2026-09-20-导航\u002F0500-1300-global_costmap","global_costmap（全局规划代价地图）",[7],"0500-1300",{"path":1504,"stem":1505,"title":1506,"authors":1507,"date":1339,"chapterOrder":1508,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1400-map-server","wiki\u002F2026-09-20-导航\u002F0500-1400-map_server","map_server（已有二维地图加载与发布）",[7],"0500-1400",{"path":1510,"stem":1511,"title":1512,"authors":1513,"date":1339,"chapterOrder":1514,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1500-map-saver","wiki\u002F2026-09-20-导航\u002F0500-1500-map_saver","map_saver（二维栅格地图保存）",[7],"0500-1500",{"path":1516,"stem":1517,"title":1518,"authors":1519,"date":1339,"chapterOrder":1520,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1600-planner-server","wiki\u002F2026-09-20-导航\u002F0500-1600-planner_server","planner_server（Theta*全局路径规划）",[7],"0500-1600",{"path":1522,"stem":1523,"title":1524,"authors":1525,"date":1339,"chapterOrder":1526,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1700-smoother-server","wiki\u002F2026-09-20-导航\u002F0500-1700-smoother_server","smoother_server（全局路径平滑）",[7],"0500-1700",{"path":1528,"stem":1529,"title":1530,"authors":1531,"date":1339,"chapterOrder":1532,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1800-behavior-server","wiki\u002F2026-09-20-导航\u002F0500-1800-behavior_server","behavior_server（恢复行为与空闲方向移动）",[7],"0500-1800",{"path":1534,"stem":1535,"title":1536,"authors":1537,"date":1339,"chapterOrder":1538,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-1900-waypoint-follower","wiki\u002F2026-09-20-导航\u002F0500-1900-waypoint_follower","waypoint_follower（逐点导航与到点等待）",[7],"0500-1900",{"path":1540,"stem":1541,"title":1542,"authors":1543,"date":1339,"chapterOrder":1544,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-2000-velocity-smoother","wiki\u002F2026-09-20-导航\u002F0500-2000-velocity_smoother","velocity_smoother（速度限幅与加减速平滑）",[7],"0500-2000",{"path":1546,"stem":1547,"title":1548,"authors":1549,"date":1339,"chapterOrder":1550,"chapterDepth":45,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-2100-pb-teleop-twist-joy-node","wiki\u002F2026-09-20-导航\u002F0500-2100-pb_teleop_twist_joy_node","pb_teleop_twist_joy_node（手柄输入与可替换控制入口）",[7],"0500-2100",{"path":1552,"stem":1553,"title":1554,"authors":1555,"date":1339,"chapterOrder":1556,"chapterDepth":1357,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0500-dao-hang-can-shu","wiki\u002F2026-09-20-导航\u002F0500-导航参数","导航参数",[7],"0500",{"path":1558,"stem":1559,"title":1560,"authors":1561,"date":1339,"chapterOrder":1562,"chapterDepth":1357,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0600-kai-fa-wen-ti-yu-pai-cha","wiki\u002F2026-09-20-导航\u002F0600-开发问题与排查","开发问题与排查",[7],"0600",{"path":1564,"stem":1565,"title":1566,"authors":1567,"date":1339,"chapterOrder":1568,"chapterDepth":1357,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":1344},"\u002Fwiki\u002F2026-09-20-dao-hang\u002F0700-jue-ce","wiki\u002F2026-09-20-导航\u002F0700-决策","决策",[7],"0700",{"path":1341,"stem":1570,"title":1571,"authors":1572,"date":1339,"chapterOrder":1573,"chapterDepth":1357,"docKey":1340,"docRoot":1341,"docTitle":1342,"isWikiDoc":575,"isWikiIndex":575},"wiki\u002F2026-09-20-导航\u002Findex","北极熊导航复现日志",[7],null,[1575,1577,1580,1583],{"name":7,"image":1576},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":1578,"image":1579},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":1581,"image":1582},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":1584,"image":1585},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431905940]