[{"data":1,"prerenderedAt":2936},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-igngz2gzsim":3,"wiki-doc-items-2023-12-30-ros2-tutorial":2515,"wiki:author-members":2924},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":122,"chapterOrder":2502,"date":2503,"description":115,"docKey":2504,"docRoot":2505,"docTitle":2506,"extension":2507,"isWikiDoc":2508,"isWikiIndex":2509,"meta":2510,"navigation":2508,"path":2511,"seo":2512,"stem":2513,"wikiDepth":122,"__hash__":2514},"wiki\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-Igngz2gzsim.md","将Ign Gazebo迁移至Gz Sim",[7],"董佳辉",{"type":9,"value":10,"toc":2499},"minimark",[11,15,22,38,52,55,58,61,102,106,109,141,144,180,183,233,237,243,256,261,264,299,302,441,445,448,478,481,509,512,610,614,617,672,675,721,724,740,744,747,751,753,772,775,793,796,804,808,811,830,833,851,858,864,867,874,901,904,1048,1051,1188,1197,1209,1216,1221,1226,1230,1243,1246,1270,1273,1292,1295,1369,1372,1406,1409,1503,1507,1513,1586,1589,1609,1613,1624,1721,1724,1742,1746,1749,1768,1771,1789,1792,1810,1817,1825,1843,1846,1864,1867,1928,1931,1950,1953,1957,1991,1995,2022,2026,2043,2052,2056,2079,2083,2111,2114,2147,2150,2153,2156,2162,2165,2171,2175,2178,2191,2193,2206,2210,2212,2233,2236,2283,2286,2321,2325,2328,2334,2341,2345,2348,2364,2379,2382,2411,2415,2418,2424,2427,2430,2433,2471,2474,2492,2495],[12,13,5],"h3",{"id":14},"将ign-gazebo迁移至gz-sim",[16,17,18],"p",{},[19,20,21],"strong",{},"（即 ROS2 Humble 迁移至 ROS2 Jazzy 及之后版本。只用 Humble 的工程也建议看一下，因为很多写法会影响以后升级。）",[16,23,24,25,29,30,33,34,37],{},"ROS2 Humble 时代，新版 Gazebo 仍经常使用 Ignition \u002F Ign Gazebo 的命名，例如命令是 ",[26,27,28],"code",{},"ign gazebo","，ROS 包名常见 ",[26,31,32],{},"ros_ign_*","，插件文件名常见 ",[26,35,36],{},"ignition-gazebo-xxx-system","。",[16,39,40,41,44,45,48,49,37],{},"到了 ROS2 Jazzy，官方搭配的是 Gazebo Harmonic。此时命名体系基本切换为 Gazebo \u002F Gz Sim，例如命令变成 ",[26,42,43],{},"gz sim","，ROS 包名改成 ",[26,46,47],{},"ros_gz_*","，插件文件名改成 ",[26,50,51],{},"gz-sim-xxx-system",[16,53,54],{},"所以从 Humble 迁移到 Jazzy 时，兼容性问题最大的地方通常就是 Gazebo。界面和功能看起来差不多，但代码里大量名字不互通，需要把 Ignition 时代的命名迁移到 Gz Sim \u002F Gazebo Harmonic 写法。",[16,56,57],{},"可以简单理解为：大部分迁移不是功能重写，而是命名体系、插件名、launch 包名、SDF 标签和环境变量的迁移。",[16,59,60],{},"官方参考：",[62,63,64,74,81,88,95],"ul",{},[65,66,67,68],"li",{},"Gazebo Harmonic 迁移说明：",[69,70,71],"a",{"href":71,"rel":72},"https:\u002F\u002Fgazebosim.org\u002Fdocs\u002Fharmonic\u002Fmigration_from_ignition\u002F",[73],"nofollow",[65,75,76,77],{},"Gazebo Fuel 模型引用示例：",[69,78,79],{"href":79,"rel":80},"https:\u002F\u002Fgazebosim.org\u002Fdocs\u002Fharmonic\u002Ffuel_insert\u002F",[73],[65,82,83,84],{},"Gazebo Sensors 示例：",[69,85,86],{"href":86,"rel":87},"https:\u002F\u002Fgazebosim.org\u002Fdocs\u002Fharmonic\u002Fsensors\u002F",[73],[65,89,90,91],{},"ROS2 Gazebo Classic 迁移到新 Gazebo 的说明：",[69,92,93],{"href":93,"rel":94},"https:\u002F\u002Fgazebosim.org\u002Fdocs\u002Fharmonic\u002Fmigrating_gazebo_classic_ros2_packages\u002F",[73],[65,96,97,98],{},"SDFormat Sensor 规范：",[69,99,100],{"href":100,"rel":101},"https:\u002F\u002Fsdformat.org\u002Fspec",[73],[103,104,105],"h4",{"id":105},"迁移前先搜索旧写法",[16,107,108],{},"在工程根目录执行：",[110,111,116],"pre",{"className":112,"code":113,"language":114,"meta":115,"style":115},"language-bash shiki shiki-themes github-light github-dark","rg -n -i \"ignition|ignition-gazebo|libignition|ros_ign|ign_args|ign_version|fuel.ignitionrobotics|ignition_frame_id|\u003Cignition-gui>|ign gazebo|ign topic|alwaysOn\" src\n","bash","",[26,117,118],{"__ignoreMap":115},[119,120,123,127,131,134,138],"span",{"class":121,"line":122},"line",1,[119,124,126],{"class":125},"sScJk","rg",[119,128,130],{"class":129},"sj4cs"," -n",[119,132,133],{"class":129}," -i",[119,135,137],{"class":136},"sZZnC"," \"ignition|ignition-gazebo|libignition|ros_ign|ign_args|ign_version|fuel.ignitionrobotics|ignition_frame_id|\u003Cignition-gui>|ign gazebo|ign topic|alwaysOn\"",[119,139,140],{"class":136}," src\n",[16,142,143],{},"重点检查这些文件：",[62,145,146,152,162,168,174],{},[65,147,148,151],{},[26,149,150],{},"*.sdf","：world、model、GUI、插件、Fuel URL 通常在这里。",[65,153,154,157,158,161],{},[26,155,156],{},"*.urdf.xacro"," \u002F ",[26,159,160],{},"*.urdf","：机器人插件、传感器标签通常在这里。",[65,163,164,167],{},[26,165,166],{},"*.launch.py","：Gazebo 启动包、启动参数、桥接 topic 通常在这里。",[65,169,170,173],{},[26,171,172],{},"package.xml","：运行依赖通常在这里。",[65,175,176,179],{},[26,177,178],{},"CMakeLists.txt","：安装目录和编译依赖通常在这里。",[16,181,182],{},"建议修改时加成对中文注释，方便以后知道从哪里开始、到哪里结束：",[110,184,188],{"className":185,"code":186,"language":187,"meta":115,"style":115},"language-xml shiki shiki-themes github-light github-dark","\u003C!-- Jazzy 迁移开始：说明这里为什么要改。 -->\n\u003Cplugin filename=\"gz-sim-physics-system\" name=\"gz::sim::systems::Physics\"\u002F>\n\u003C!-- Jazzy 迁移结束：说明这里已经改成什么写法。 -->\n","xml",[26,189,190,196,227],{"__ignoreMap":115},[119,191,192],{"class":121,"line":122},[119,193,195],{"class":194},"sJ8bj","\u003C!-- Jazzy 迁移开始：说明这里为什么要改。 -->\n",[119,197,199,203,207,210,213,216,219,221,224],{"class":121,"line":198},2,[119,200,202],{"class":201},"sVt8B","\u003C",[119,204,206],{"class":205},"s9eBZ","plugin",[119,208,209],{"class":125}," filename",[119,211,212],{"class":201},"=",[119,214,215],{"class":136},"\"gz-sim-physics-system\"",[119,217,218],{"class":125}," name",[119,220,212],{"class":201},[119,222,223],{"class":136},"\"gz::sim::systems::Physics\"",[119,225,226],{"class":201},"\u002F>\n",[119,228,230],{"class":121,"line":229},3,[119,231,232],{"class":194},"\u003C!-- Jazzy 迁移结束：说明这里已经改成什么写法。 -->\n",[103,234,236],{"id":235},"sdf文件","SDF文件",[16,238,239],{},[240,241],"img",{"alt":115,"src":242},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1741.webp",[16,244,245,246,157,249,252,253,37],{},"根据官方迁移说明，普通命名通常把 ",[26,247,248],{},"ignition",[26,250,251],{},"ign"," 换成 ",[26,254,255],{},"gz",[16,257,258],{},[240,259],{"alt":115,"src":260},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1742.webp",[16,262,263],{},"插件要按新命名修改，例如：",[62,265,266,275,284,292],{},[65,267,268,271,272],{},[26,269,270],{},"ignition::gazebo"," 命名空间改为 ",[26,273,274],{},"gz::sim",[65,276,277,280,281],{},[26,278,279],{},"ignition::"," 改为 ",[26,282,283],{},"gz::",[65,285,286,280,289],{},[26,287,288],{},"ignition-gazebo-XXX-system",[26,290,291],{},"gz-sim-XXX-system",[65,293,294,280,297],{},[26,295,296],{},"libignition-gazebo-XXX-system.so",[26,298,291],{},[16,300,301],{},"常见替换表：",[303,304,305,322],"table",{},[306,307,308],"thead",{},[309,310,311,316,319],"tr",{},[312,313,315],"th",{"align":314},"left","Humble \u002F Ignition 写法",[312,317,318],{"align":314},"Jazzy \u002F Gazebo Harmonic 写法",[312,320,321],{"align":314},"示例场景",[323,324,325,341,354,369,382,397,411,426],"tbody",{},[309,326,327,333,338],{},[328,329,330],"td",{"align":314},[26,331,332],{},"ignition-gazebo-*",[328,334,335],{"align":314},[26,336,337],{},"gz-sim-*",[328,339,340],{"align":314},"插件文件名",[309,342,343,348,352],{},[328,344,345],{"align":314},[26,346,347],{},"libignition-gazebo-*.so",[328,349,350],{"align":314},[26,351,337],{},[328,353,340],{"align":314},[309,355,356,361,366],{},[328,357,358],{"align":314},[26,359,360],{},"ignition::gazebo::*",[328,362,363],{"align":314},[26,364,365],{},"gz::sim::*",[328,367,368],{"align":314},"插件命名空间",[309,370,371,375,379],{},[328,372,373],{"align":314},[26,374,32],{},[328,376,377],{"align":314},[26,378,47],{},[328,380,381],{"align":314},"ROS-Gazebo 包名",[309,383,384,389,394],{},[328,385,386],{"align":314},[26,387,388],{},"ign_args",[328,390,391],{"align":314},[26,392,393],{},"gz_args",[328,395,396],{"align":314},"launch 参数",[309,398,399,404,409],{},[328,400,401],{"align":314},[26,402,403],{},"ign_version",[328,405,406],{"align":314},[26,407,408],{},"gz_version",[328,410,396],{"align":314},[309,412,413,418,423],{},[328,414,415],{"align":314},[26,416,417],{},"IGN_GAZEBO_RESOURCE_PATH",[328,419,420],{"align":314},[26,421,422],{},"GZ_SIM_RESOURCE_PATH",[328,424,425],{"align":314},"模型\u002F资源路径",[309,427,428,433,438],{},[328,429,430],{"align":314},[26,431,432],{},"fuel.ignitionrobotics.org",[328,434,435],{"align":314},[26,436,437],{},"fuel.gazebosim.org",[328,439,440],{"align":314},"Gazebo Fuel URL",[442,443,444],"h5",{"id":444},"系统插件",[16,446,447],{},"旧写法：",[110,449,451],{"className":185,"code":450,"language":187,"meta":115,"style":115},"\u003Cplugin filename=\"libignition-gazebo-physics-system.so\"\n        name=\"ignition::gazebo::systems::Physics\"\u002F>\n",[26,452,453,466],{"__ignoreMap":115},[119,454,455,457,459,461,463],{"class":121,"line":122},[119,456,202],{"class":201},[119,458,206],{"class":205},[119,460,209],{"class":125},[119,462,212],{"class":201},[119,464,465],{"class":136},"\"libignition-gazebo-physics-system.so\"\n",[119,467,468,471,473,476],{"class":121,"line":198},[119,469,470],{"class":125},"        name",[119,472,212],{"class":201},[119,474,475],{"class":136},"\"ignition::gazebo::systems::Physics\"",[119,477,226],{"class":201},[16,479,480],{},"Jazzy \u002F Gazebo Harmonic 写法：",[110,482,484],{"className":185,"code":483,"language":187,"meta":115,"style":115},"\u003Cplugin filename=\"gz-sim-physics-system\"\n        name=\"gz::sim::systems::Physics\"\u002F>\n",[26,485,486,499],{"__ignoreMap":115},[119,487,488,490,492,494,496],{"class":121,"line":122},[119,489,202],{"class":201},[119,491,206],{"class":205},[119,493,209],{"class":125},[119,495,212],{"class":201},[119,497,498],{"class":136},"\"gz-sim-physics-system\"\n",[119,500,501,503,505,507],{"class":121,"line":198},[119,502,470],{"class":125},[119,504,212],{"class":201},[119,506,223],{"class":136},[119,508,226],{"class":201},[16,510,511],{},"常见系统插件：",[303,513,514,524],{},[306,515,516],{},[309,517,518,521],{},[312,519,520],{"align":314},"旧插件",[312,522,523],{"align":314},"新插件",[323,525,526,538,550,562,574,586,598],{},[309,527,528,533],{},[328,529,530],{"align":314},[26,531,532],{},"ignition-gazebo-physics-system",[328,534,535],{"align":314},[26,536,537],{},"gz-sim-physics-system",[309,539,540,545],{},[328,541,542],{"align":314},[26,543,544],{},"ignition-gazebo-sensors-system",[328,546,547],{"align":314},[26,548,549],{},"gz-sim-sensors-system",[309,551,552,557],{},[328,553,554],{"align":314},[26,555,556],{},"ignition-gazebo-scene-broadcaster-system",[328,558,559],{"align":314},[26,560,561],{},"gz-sim-scene-broadcaster-system",[309,563,564,569],{},[328,565,566],{"align":314},[26,567,568],{},"ignition-gazebo-user-commands-system",[328,570,571],{"align":314},[26,572,573],{},"gz-sim-user-commands-system",[309,575,576,581],{},[328,577,578],{"align":314},[26,579,580],{},"ignition-gazebo-contact-system",[328,582,583],{"align":314},[26,584,585],{},"gz-sim-contact-system",[309,587,588,593],{},[328,589,590],{"align":314},[26,591,592],{},"ignition-gazebo-diff-drive-system",[328,594,595],{"align":314},[26,596,597],{},"gz-sim-diff-drive-system",[309,599,600,605],{},[328,601,602],{"align":314},[26,603,604],{},"ignition-gazebo-joint-state-publisher-system",[328,606,607],{"align":314},[26,608,609],{},"gz-sim-joint-state-publisher-system",[442,611,613],{"id":612},"gui-标签","GUI 标签",[16,615,616],{},"旧版 Gazebo GUI 配置可能写：",[110,618,620],{"className":185,"code":619,"language":187,"meta":115,"style":115},"\u003Cignition-gui>\n  \u003Cproperty type=\"string\" key=\"state\">docked\u003C\u002Fproperty>\n\u003C\u002Fignition-gui>\n",[26,621,622,632,663],{"__ignoreMap":115},[119,623,624,626,629],{"class":121,"line":122},[119,625,202],{"class":201},[119,627,628],{"class":205},"ignition-gui",[119,630,631],{"class":201},">\n",[119,633,634,637,640,643,645,648,651,653,656,659,661],{"class":121,"line":198},[119,635,636],{"class":201},"  \u003C",[119,638,639],{"class":205},"property",[119,641,642],{"class":125}," type",[119,644,212],{"class":201},[119,646,647],{"class":136},"\"string\"",[119,649,650],{"class":125}," key",[119,652,212],{"class":201},[119,654,655],{"class":136},"\"state\"",[119,657,658],{"class":201},">docked\u003C\u002F",[119,660,639],{"class":205},[119,662,631],{"class":201},[119,664,665,668,670],{"class":121,"line":229},[119,666,667],{"class":201},"\u003C\u002F",[119,669,628],{"class":205},[119,671,631],{"class":201},[16,673,674],{},"Jazzy \u002F Gazebo Harmonic 改成：",[110,676,678],{"className":185,"code":677,"language":187,"meta":115,"style":115},"\u003Cgz-gui>\n  \u003Cproperty type=\"string\" key=\"state\">docked\u003C\u002Fproperty>\n\u003C\u002Fgz-gui>\n",[26,679,680,689,713],{"__ignoreMap":115},[119,681,682,684,687],{"class":121,"line":122},[119,683,202],{"class":201},[119,685,686],{"class":205},"gz-gui",[119,688,631],{"class":201},[119,690,691,693,695,697,699,701,703,705,707,709,711],{"class":121,"line":198},[119,692,636],{"class":201},[119,694,639],{"class":205},[119,696,642],{"class":125},[119,698,212],{"class":201},[119,700,647],{"class":136},[119,702,650],{"class":125},[119,704,212],{"class":201},[119,706,655],{"class":136},[119,708,658],{"class":201},[119,710,639],{"class":205},[119,712,631],{"class":201},[119,714,715,717,719],{"class":121,"line":229},[119,716,667],{"class":201},[119,718,686],{"class":205},[119,720,631],{"class":201},[16,722,723],{},"可以用下面命令检查：",[110,725,727],{"className":112,"code":726,"language":114,"meta":115,"style":115},"rg -n \"\u003Cignition-gui>|\u003C\u002Fignition-gui>\" src\n",[26,728,729],{"__ignoreMap":115},[119,730,731,733,735,738],{"class":121,"line":122},[119,732,126],{"class":125},[119,734,130],{"class":129},[119,736,737],{"class":136}," \"\u003Cignition-gui>|\u003C\u002Fignition-gui>\"",[119,739,140],{"class":136},[103,741,743],{"id":742},"urdf-xacro-里的-gazebo-传感器","URDF \u002F Xacro 里的 Gazebo 传感器",[16,745,746],{},"传感器部分是 Jazzy 迁移时最容易留下 warning 的地方。",[442,748,750],{"id":749},"alwayson-改为-always_on","alwaysOn 改为 always_on",[16,752,447],{},[110,754,756],{"className":185,"code":755,"language":187,"meta":115,"style":115},"\u003CalwaysOn>true\u003C\u002FalwaysOn>\n",[26,757,758],{"__ignoreMap":115},[119,759,760,762,765,768,770],{"class":121,"line":122},[119,761,202],{"class":201},[119,763,764],{"class":205},"alwaysOn",[119,766,767],{"class":201},">true\u003C\u002F",[119,769,764],{"class":205},[119,771,631],{"class":201},[16,773,774],{},"Jazzy \u002F SDF 标准写法：",[110,776,778],{"className":185,"code":777,"language":187,"meta":115,"style":115},"\u003Calways_on>true\u003C\u002Falways_on>\n",[26,779,780],{"__ignoreMap":115},[119,781,782,784,787,789,791],{"class":121,"line":122},[119,783,202],{"class":201},[119,785,786],{"class":205},"always_on",[119,788,767],{"class":201},[119,790,786],{"class":205},[119,792,631],{"class":201},[16,794,795],{},"如果不改，Gazebo 可能会提示：",[110,797,802],{"className":798,"code":800,"language":801,"meta":115},[799],"language-text","XML Element[alwaysOn], child of element[sensor], not defined in SDF.\n","text",[26,803,800],{"__ignoreMap":115},[442,805,807],{"id":806},"ignition_frame_id-gz_frame_id-与-pose-relative_to","ignition_frame_id \u002F gz_frame_id 与 pose relative_to",[16,809,810],{},"旧写法可能是：",[110,812,814],{"className":185,"code":813,"language":187,"meta":115,"style":115},"\u003Cignition_frame_id>laser\u003C\u002Fignition_frame_id>\n",[26,815,816],{"__ignoreMap":115},[119,817,818,820,823,826,828],{"class":121,"line":122},[119,819,202],{"class":201},[119,821,822],{"class":205},"ignition_frame_id",[119,824,825],{"class":201},">laser\u003C\u002F",[119,827,822],{"class":205},[119,829,631],{"class":201},[16,831,832],{},"有些 Gazebo ROS 迁移文档里会看到：",[110,834,836],{"className":185,"code":835,"language":187,"meta":115,"style":115},"\u003Cgz_frame_id>laser\u003C\u002Fgz_frame_id>\n",[26,837,838],{"__ignoreMap":115},[119,839,840,842,845,847,849],{"class":121,"line":122},[119,841,202],{"class":201},[119,843,844],{"class":205},"gz_frame_id",[119,846,825],{"class":201},[119,848,844],{"class":205},[119,850,631],{"class":201},[16,852,853,854,857],{},"但是在当前 ROS2 Jazzy \u002F Gazebo Harmonic 工具链里，URDF 转 SDF 通常会输出 SDF 1.11，而 SDF 1.11 没有标准 ",[26,855,856],{},"\u003Cgz_frame_id>"," 元素。因此启动时可能会出现：",[110,859,862],{"className":860,"code":861,"language":801,"meta":115},[799],"XML Element[gz_frame_id], child of element[sensor], not defined in SDF. Copying[gz_frame_id] as children of [sensor].\n",[26,863,861],{"__ignoreMap":115},[16,865,866],{},"但是这个警告说实话，是警告，但实际上这个标签是生效的，必须要使用这个标签，请忽略那些警告。",[16,868,869,870,873],{},"然后你也可以再加上一个下面这个",[26,871,872],{},"pose relative_to","标签，这是官方示例里给的。",[110,875,877],{"className":185,"code":876,"language":187,"meta":115,"style":115},"\u003Cpose relative_to=\"laser\">0 0 0 0 0 0\u003C\u002Fpose>\n",[26,878,879],{"__ignoreMap":115},[119,880,881,883,886,889,891,894,897,899],{"class":121,"line":122},[119,882,202],{"class":201},[119,884,885],{"class":205},"pose",[119,887,888],{"class":125}," relative_to",[119,890,212],{"class":201},[119,892,893],{"class":136},"\"laser\"",[119,895,896],{"class":201},">0 0 0 0 0 0\u003C\u002F",[119,898,885],{"class":205},[119,900,631],{"class":201},[16,902,903],{},"相机示例：",[110,905,907],{"className":185,"code":906,"language":187,"meta":115,"style":115},"\u003Csensor name=\"cam_link\" type=\"camera\">\n  \u003Cupdate_rate>10.0\u003C\u002Fupdate_rate>\n  \u003Calways_on>true\u003C\u002Falways_on>\n  \u003Cpose relative_to=\"camera\">0 0 0 0 0 0\u003C\u002Fpose>\n  \u003Cgz_frame_id>camera\u003C\u002Fgz_frame_id>\n  \u003Ctopic>\u002Fimage_raw\u003C\u002Ftopic>\n  \u003Ccamera name=\"my_camera\">\n    ...\n  \u003C\u002Fcamera>\n\u003C\u002Fsensor>\n",[26,908,909,932,946,958,977,991,1006,1023,1029,1039],{"__ignoreMap":115},[119,910,911,913,916,918,920,923,925,927,930],{"class":121,"line":122},[119,912,202],{"class":201},[119,914,915],{"class":205},"sensor",[119,917,218],{"class":125},[119,919,212],{"class":201},[119,921,922],{"class":136},"\"cam_link\"",[119,924,642],{"class":125},[119,926,212],{"class":201},[119,928,929],{"class":136},"\"camera\"",[119,931,631],{"class":201},[119,933,934,936,939,942,944],{"class":121,"line":198},[119,935,636],{"class":201},[119,937,938],{"class":205},"update_rate",[119,940,941],{"class":201},">10.0\u003C\u002F",[119,943,938],{"class":205},[119,945,631],{"class":201},[119,947,948,950,952,954,956],{"class":121,"line":229},[119,949,636],{"class":201},[119,951,786],{"class":205},[119,953,767],{"class":201},[119,955,786],{"class":205},[119,957,631],{"class":201},[119,959,961,963,965,967,969,971,973,975],{"class":121,"line":960},4,[119,962,636],{"class":201},[119,964,885],{"class":205},[119,966,888],{"class":125},[119,968,212],{"class":201},[119,970,929],{"class":136},[119,972,896],{"class":201},[119,974,885],{"class":205},[119,976,631],{"class":201},[119,978,980,982,984,987,989],{"class":121,"line":979},5,[119,981,636],{"class":201},[119,983,844],{"class":205},[119,985,986],{"class":201},">camera\u003C\u002F",[119,988,844],{"class":205},[119,990,631],{"class":201},[119,992,994,996,999,1002,1004],{"class":121,"line":993},6,[119,995,636],{"class":201},[119,997,998],{"class":205},"topic",[119,1000,1001],{"class":201},">\u002Fimage_raw\u003C\u002F",[119,1003,998],{"class":205},[119,1005,631],{"class":201},[119,1007,1009,1011,1014,1016,1018,1021],{"class":121,"line":1008},7,[119,1010,636],{"class":201},[119,1012,1013],{"class":205},"camera",[119,1015,218],{"class":125},[119,1017,212],{"class":201},[119,1019,1020],{"class":136},"\"my_camera\"",[119,1022,631],{"class":201},[119,1024,1026],{"class":121,"line":1025},8,[119,1027,1028],{"class":201},"    ...\n",[119,1030,1032,1035,1037],{"class":121,"line":1031},9,[119,1033,1034],{"class":201},"  \u003C\u002F",[119,1036,1013],{"class":205},[119,1038,631],{"class":201},[119,1040,1042,1044,1046],{"class":121,"line":1041},10,[119,1043,667],{"class":201},[119,1045,915],{"class":205},[119,1047,631],{"class":201},[16,1049,1050],{},"雷达示例：",[110,1052,1054],{"className":185,"code":1053,"language":187,"meta":115,"style":115},"\u003Csensor name=\"gpu_lidar\" type=\"gpu_lidar\">\n  \u003Ctopic>scan\u003C\u002Ftopic>\n  \u003Cupdate_rate>30\u003C\u002Fupdate_rate>\n  \u003Calways_on>true\u003C\u002Falways_on>\n  \u003Cvisualize>true\u003C\u002Fvisualize>\n  \u003Cpose relative_to=\"laser\">0 0 0 0 0 0\u003C\u002Fpose>\n  \u003Cgz_frame_id>laser\u003C\u002Fgz_frame_id>\n  \u003Clidar>\n    ...\n  \u003C\u002Flidar>\n\u003C\u002Fsensor>\n",[26,1055,1056,1077,1090,1103,1115,1128,1146,1158,1167,1171,1179],{"__ignoreMap":115},[119,1057,1058,1060,1062,1064,1066,1069,1071,1073,1075],{"class":121,"line":122},[119,1059,202],{"class":201},[119,1061,915],{"class":205},[119,1063,218],{"class":125},[119,1065,212],{"class":201},[119,1067,1068],{"class":136},"\"gpu_lidar\"",[119,1070,642],{"class":125},[119,1072,212],{"class":201},[119,1074,1068],{"class":136},[119,1076,631],{"class":201},[119,1078,1079,1081,1083,1086,1088],{"class":121,"line":198},[119,1080,636],{"class":201},[119,1082,998],{"class":205},[119,1084,1085],{"class":201},">scan\u003C\u002F",[119,1087,998],{"class":205},[119,1089,631],{"class":201},[119,1091,1092,1094,1096,1099,1101],{"class":121,"line":229},[119,1093,636],{"class":201},[119,1095,938],{"class":205},[119,1097,1098],{"class":201},">30\u003C\u002F",[119,1100,938],{"class":205},[119,1102,631],{"class":201},[119,1104,1105,1107,1109,1111,1113],{"class":121,"line":960},[119,1106,636],{"class":201},[119,1108,786],{"class":205},[119,1110,767],{"class":201},[119,1112,786],{"class":205},[119,1114,631],{"class":201},[119,1116,1117,1119,1122,1124,1126],{"class":121,"line":979},[119,1118,636],{"class":201},[119,1120,1121],{"class":205},"visualize",[119,1123,767],{"class":201},[119,1125,1121],{"class":205},[119,1127,631],{"class":201},[119,1129,1130,1132,1134,1136,1138,1140,1142,1144],{"class":121,"line":993},[119,1131,636],{"class":201},[119,1133,885],{"class":205},[119,1135,888],{"class":125},[119,1137,212],{"class":201},[119,1139,893],{"class":136},[119,1141,896],{"class":201},[119,1143,885],{"class":205},[119,1145,631],{"class":201},[119,1147,1148,1150,1152,1154,1156],{"class":121,"line":1008},[119,1149,636],{"class":201},[119,1151,844],{"class":205},[119,1153,825],{"class":201},[119,1155,844],{"class":205},[119,1157,631],{"class":201},[119,1159,1160,1162,1165],{"class":121,"line":1025},[119,1161,636],{"class":201},[119,1163,1164],{"class":205},"lidar",[119,1166,631],{"class":201},[119,1168,1169],{"class":121,"line":1031},[119,1170,1028],{"class":201},[119,1172,1173,1175,1177],{"class":121,"line":1041},[119,1174,1034],{"class":201},[119,1176,1164],{"class":205},[119,1178,631],{"class":201},[119,1180,1182,1184,1186],{"class":121,"line":1181},11,[119,1183,667],{"class":201},[119,1185,915],{"class":205},[119,1187,631],{"class":201},[16,1189,1190,1191,1193,1194,1196],{},"注意：",[26,1192,872],{}," 和 ",[26,1195,844],{}," 不是同一个概念。",[62,1198,1199,1204],{},[65,1200,1201,1203],{},[26,1202,872],{},"：表示传感器的位姿相对于哪个 link\u002Fframe，解决“传感器放在哪里”的问题。",[65,1205,1206,1208],{},[26,1207,844],{},"：尝试指定传感器消息里的 frame id，解决“消息 header.frame_id 写什么”的问题。",[16,1210,1211,1212,1193,1214,37],{},"建议同时采用 ",[26,1213,872],{},[26,1215,856],{},[16,1217,1218],{},[240,1219],{"alt":115,"src":1220},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1743.webp",[16,1222,1223],{},[240,1224],{"alt":115,"src":1225},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1744.webp",[103,1227,1229],{"id":1228},"launch-文件","Launch 文件",[16,1231,1232,1233,1236,1237,157,1240,37],{},"Jazzy 使用 ",[26,1234,1235],{},"ros_gz_sim"," 启动 Gazebo，不再使用旧的 ",[26,1238,1239],{},"ros_ign_gazebo",[26,1241,1242],{},"ros_ign",[16,1244,1245],{},"旧思路常见是：",[110,1247,1251],{"className":1248,"code":1249,"language":1250,"meta":115,"style":115},"language-python shiki shiki-themes github-light github-dark","pkg_ros_ign_gazebo = get_package_share_directory(\"ros_ign_gazebo\")\n","python",[26,1252,1253],{"__ignoreMap":115},[119,1254,1255,1258,1261,1264,1267],{"class":121,"line":122},[119,1256,1257],{"class":201},"pkg_ros_ign_gazebo ",[119,1259,212],{"class":1260},"szBVR",[119,1262,1263],{"class":201}," get_package_share_directory(",[119,1265,1266],{"class":136},"\"ros_ign_gazebo\"",[119,1268,1269],{"class":201},")\n",[16,1271,1272],{},"Jazzy 推荐：",[110,1274,1276],{"className":1248,"code":1275,"language":1250,"meta":115,"style":115},"pkg_ros_gz_sim = get_package_share_directory(\"ros_gz_sim\")\n",[26,1277,1278],{"__ignoreMap":115},[119,1279,1280,1283,1285,1287,1290],{"class":121,"line":122},[119,1281,1282],{"class":201},"pkg_ros_gz_sim ",[119,1284,212],{"class":1260},[119,1286,1263],{"class":201},[119,1288,1289],{"class":136},"\"ros_gz_sim\"",[119,1291,1269],{"class":201},[16,1293,1294],{},"启动 Gazebo 的 launch 写法：",[110,1296,1298],{"className":1248,"code":1297,"language":1250,"meta":115,"style":115},"gz_sim = IncludeLaunchDescription(\n    PythonLaunchDescriptionSource(\n        os.path.join(pkg_ros_gz_sim, \"launch\", \"gz_sim.launch.py\")),\n    launch_arguments={\n        \"gz_args\": \"-r \" + world_file\n    }.items(),\n)\n",[26,1299,1300,1310,1315,1332,1343,1360,1365],{"__ignoreMap":115},[119,1301,1302,1305,1307],{"class":121,"line":122},[119,1303,1304],{"class":201},"gz_sim ",[119,1306,212],{"class":1260},[119,1308,1309],{"class":201}," IncludeLaunchDescription(\n",[119,1311,1312],{"class":121,"line":198},[119,1313,1314],{"class":201},"    PythonLaunchDescriptionSource(\n",[119,1316,1317,1320,1323,1326,1329],{"class":121,"line":229},[119,1318,1319],{"class":201},"        os.path.join(pkg_ros_gz_sim, ",[119,1321,1322],{"class":136},"\"launch\"",[119,1324,1325],{"class":201},", ",[119,1327,1328],{"class":136},"\"gz_sim.launch.py\"",[119,1330,1331],{"class":201},")),\n",[119,1333,1334,1338,1340],{"class":121,"line":960},[119,1335,1337],{"class":1336},"s4XuR","    launch_arguments",[119,1339,212],{"class":1260},[119,1341,1342],{"class":201},"{\n",[119,1344,1345,1348,1351,1354,1357],{"class":121,"line":979},[119,1346,1347],{"class":136},"        \"gz_args\"",[119,1349,1350],{"class":201},": ",[119,1352,1353],{"class":136},"\"-r \"",[119,1355,1356],{"class":1260}," +",[119,1358,1359],{"class":201}," world_file\n",[119,1361,1362],{"class":121,"line":993},[119,1363,1364],{"class":201},"    }.items(),\n",[119,1366,1367],{"class":121,"line":1008},[119,1368,1269],{"class":201},[16,1370,1371],{},"注意参数名也要改：",[303,1373,1374,1384],{},[306,1375,1376],{},[309,1377,1378,1381],{},[312,1379,1380],{"align":314},"Humble \u002F Ignition",[312,1382,1383],{"align":314},"Jazzy \u002F Gazebo Harmonic",[323,1385,1386,1396],{},[309,1387,1388,1392],{},[328,1389,1390],{"align":314},[26,1391,388],{},[328,1393,1394],{"align":314},[26,1395,393],{},[309,1397,1398,1402],{},[328,1399,1400],{"align":314},[26,1401,403],{},[328,1403,1404],{"align":314},[26,1405,408],{},[16,1407,1408],{},"如果要 spawn URDF \u002F robot_description，Jazzy 使用：",[110,1410,1412],{"className":1248,"code":1411,"language":1250,"meta":115,"style":115},"spawn = Node(\n    package=\"ros_gz_sim\",\n    executable=\"create\",\n    arguments=[\n        \"-name\", \"mycar\",\n        \"-topic\", \"\u002Frobot_description\",\n    ],\n    output=\"screen\",\n)\n",[26,1413,1414,1424,1436,1448,1458,1470,1482,1487,1499],{"__ignoreMap":115},[119,1415,1416,1419,1421],{"class":121,"line":122},[119,1417,1418],{"class":201},"spawn ",[119,1420,212],{"class":1260},[119,1422,1423],{"class":201}," Node(\n",[119,1425,1426,1429,1431,1433],{"class":121,"line":198},[119,1427,1428],{"class":1336},"    package",[119,1430,212],{"class":1260},[119,1432,1289],{"class":136},[119,1434,1435],{"class":201},",\n",[119,1437,1438,1441,1443,1446],{"class":121,"line":229},[119,1439,1440],{"class":1336},"    executable",[119,1442,212],{"class":1260},[119,1444,1445],{"class":136},"\"create\"",[119,1447,1435],{"class":201},[119,1449,1450,1453,1455],{"class":121,"line":960},[119,1451,1452],{"class":1336},"    arguments",[119,1454,212],{"class":1260},[119,1456,1457],{"class":201},"[\n",[119,1459,1460,1463,1465,1468],{"class":121,"line":979},[119,1461,1462],{"class":136},"        \"-name\"",[119,1464,1325],{"class":201},[119,1466,1467],{"class":136},"\"mycar\"",[119,1469,1435],{"class":201},[119,1471,1472,1475,1477,1480],{"class":121,"line":993},[119,1473,1474],{"class":136},"        \"-topic\"",[119,1476,1325],{"class":201},[119,1478,1479],{"class":136},"\"\u002Frobot_description\"",[119,1481,1435],{"class":201},[119,1483,1484],{"class":121,"line":1008},[119,1485,1486],{"class":201},"    ],\n",[119,1488,1489,1492,1494,1497],{"class":121,"line":1025},[119,1490,1491],{"class":1336},"    output",[119,1493,212],{"class":1260},[119,1495,1496],{"class":136},"\"screen\"",[119,1498,1435],{"class":201},[119,1500,1501],{"class":121,"line":1031},[119,1502,1269],{"class":201},[103,1504,1506],{"id":1505},"ros-和-gazebo-消息桥接","ROS 和 Gazebo 消息桥接",[16,1508,1232,1509,1512],{},[26,1510,1511],{},"ros_gz_bridge","：",[110,1514,1516],{"className":1248,"code":1515,"language":1250,"meta":115,"style":115},"bridge = Node(\n    package=\"ros_gz_bridge\",\n    executable=\"parameter_bridge\",\n    arguments=[\n        \"\u002Fcmd_vel@geometry_msgs\u002Fmsg\u002FTwist@gz.msgs.Twist\",\n        \"\u002Fscan@sensor_msgs\u002Fmsg\u002FLaserScan@gz.msgs.LaserScan\",\n        \"\u002Fimage_raw@sensor_msgs\u002Fmsg\u002FImage@gz.msgs.Image\",\n    ],\n)\n",[26,1517,1518,1527,1538,1549,1557,1564,1571,1578,1582],{"__ignoreMap":115},[119,1519,1520,1523,1525],{"class":121,"line":122},[119,1521,1522],{"class":201},"bridge ",[119,1524,212],{"class":1260},[119,1526,1423],{"class":201},[119,1528,1529,1531,1533,1536],{"class":121,"line":198},[119,1530,1428],{"class":1336},[119,1532,212],{"class":1260},[119,1534,1535],{"class":136},"\"ros_gz_bridge\"",[119,1537,1435],{"class":201},[119,1539,1540,1542,1544,1547],{"class":121,"line":229},[119,1541,1440],{"class":1336},[119,1543,212],{"class":1260},[119,1545,1546],{"class":136},"\"parameter_bridge\"",[119,1548,1435],{"class":201},[119,1550,1551,1553,1555],{"class":121,"line":960},[119,1552,1452],{"class":1336},[119,1554,212],{"class":1260},[119,1556,1457],{"class":201},[119,1558,1559,1562],{"class":121,"line":979},[119,1560,1561],{"class":136},"        \"\u002Fcmd_vel@geometry_msgs\u002Fmsg\u002FTwist@gz.msgs.Twist\"",[119,1563,1435],{"class":201},[119,1565,1566,1569],{"class":121,"line":993},[119,1567,1568],{"class":136},"        \"\u002Fscan@sensor_msgs\u002Fmsg\u002FLaserScan@gz.msgs.LaserScan\"",[119,1570,1435],{"class":201},[119,1572,1573,1576],{"class":121,"line":1008},[119,1574,1575],{"class":136},"        \"\u002Fimage_raw@sensor_msgs\u002Fmsg\u002FImage@gz.msgs.Image\"",[119,1577,1435],{"class":201},[119,1579,1580],{"class":121,"line":1025},[119,1581,1486],{"class":201},[119,1583,1584],{"class":121,"line":1031},[119,1585,1269],{"class":201},[16,1587,1588],{},"检查点：",[62,1590,1591,1596,1602],{},[65,1592,1593,1594],{},"ROS 包名用 ",[26,1595,1511],{},[65,1597,1598,1599],{},"Gazebo 消息命名空间用 ",[26,1600,1601],{},"gz.msgs.*",[65,1603,1604,1605,1608],{},"如果 topic 没有桥出来，先执行 ",[26,1606,1607],{},"gz topic -l"," 看 Gazebo 侧真实 topic 名称，再改 bridge 参数",[103,1610,1612],{"id":1611},"packagexml-依赖","package.xml 依赖",[16,1614,1615,1616,1193,1618,1620,1621,1623],{},"如果 launch 文件里用了 ",[26,1617,1235],{},[26,1619,1511],{},"，",[26,1622,172],{}," 也要声明运行依赖：",[110,1625,1627],{"className":185,"code":1626,"language":187,"meta":115,"style":115},"\u003Cexec_depend>ros_gz_sim\u003C\u002Fexec_depend>\n\u003Cexec_depend>ros_gz_bridge\u003C\u002Fexec_depend>\n\u003Cexec_depend>geometry_msgs\u003C\u002Fexec_depend>\n\u003Cexec_depend>nav_msgs\u003C\u002Fexec_depend>\n\u003Cexec_depend>tf2_msgs\u003C\u002Fexec_depend>\n\u003Cexec_depend>sensor_msgs\u003C\u002Fexec_depend>\n\u003Cexec_depend>rosgraph_msgs\u003C\u002Fexec_depend>\n",[26,1628,1629,1643,1656,1669,1682,1695,1708],{"__ignoreMap":115},[119,1630,1631,1633,1636,1639,1641],{"class":121,"line":122},[119,1632,202],{"class":201},[119,1634,1635],{"class":205},"exec_depend",[119,1637,1638],{"class":201},">ros_gz_sim\u003C\u002F",[119,1640,1635],{"class":205},[119,1642,631],{"class":201},[119,1644,1645,1647,1649,1652,1654],{"class":121,"line":198},[119,1646,202],{"class":201},[119,1648,1635],{"class":205},[119,1650,1651],{"class":201},">ros_gz_bridge\u003C\u002F",[119,1653,1635],{"class":205},[119,1655,631],{"class":201},[119,1657,1658,1660,1662,1665,1667],{"class":121,"line":229},[119,1659,202],{"class":201},[119,1661,1635],{"class":205},[119,1663,1664],{"class":201},">geometry_msgs\u003C\u002F",[119,1666,1635],{"class":205},[119,1668,631],{"class":201},[119,1670,1671,1673,1675,1678,1680],{"class":121,"line":960},[119,1672,202],{"class":201},[119,1674,1635],{"class":205},[119,1676,1677],{"class":201},">nav_msgs\u003C\u002F",[119,1679,1635],{"class":205},[119,1681,631],{"class":201},[119,1683,1684,1686,1688,1691,1693],{"class":121,"line":979},[119,1685,202],{"class":201},[119,1687,1635],{"class":205},[119,1689,1690],{"class":201},">tf2_msgs\u003C\u002F",[119,1692,1635],{"class":205},[119,1694,631],{"class":201},[119,1696,1697,1699,1701,1704,1706],{"class":121,"line":993},[119,1698,202],{"class":201},[119,1700,1635],{"class":205},[119,1702,1703],{"class":201},">sensor_msgs\u003C\u002F",[119,1705,1635],{"class":205},[119,1707,631],{"class":201},[119,1709,1710,1712,1714,1717,1719],{"class":121,"line":1008},[119,1711,202],{"class":201},[119,1713,1635],{"class":205},[119,1715,1716],{"class":201},">rosgraph_msgs\u003C\u002F",[119,1718,1635],{"class":205},[119,1720,631],{"class":201},[16,1722,1723],{},"如果还启动 RViz，也补：",[110,1725,1727],{"className":185,"code":1726,"language":187,"meta":115,"style":115},"\u003Cexec_depend>rviz2\u003C\u002Fexec_depend>\n",[26,1728,1729],{"__ignoreMap":115},[119,1730,1731,1733,1735,1738,1740],{"class":121,"line":122},[119,1732,202],{"class":201},[119,1734,1635],{"class":205},[119,1736,1737],{"class":201},">rviz2\u003C\u002F",[119,1739,1635],{"class":205},[119,1741,631],{"class":201},[103,1743,1745],{"id":1744},"fuel-url-和模型路径","Fuel URL 和模型路径",[16,1747,1748],{},"旧 Fuel URL（实际上旧的链接也生效，被重定向到新链接了）：",[110,1750,1752],{"className":185,"code":1751,"language":187,"meta":115,"style":115},"\u003Curi>https:\u002F\u002Ffuel.ignitionrobotics.org\u002F1.0\u002Fopenrobotics\u002Fmodels\u002FPlayground\u003C\u002Furi>\n",[26,1753,1754],{"__ignoreMap":115},[119,1755,1756,1758,1761,1764,1766],{"class":121,"line":122},[119,1757,202],{"class":201},[119,1759,1760],{"class":205},"uri",[119,1762,1763],{"class":201},">https:\u002F\u002Ffuel.ignitionrobotics.org\u002F1.0\u002Fopenrobotics\u002Fmodels\u002FPlayground\u003C\u002F",[119,1765,1760],{"class":205},[119,1767,631],{"class":201},[16,1769,1770],{},"新 Fuel URL：",[110,1772,1774],{"className":185,"code":1773,"language":187,"meta":115,"style":115},"\u003Curi>https:\u002F\u002Ffuel.gazebosim.org\u002F1.0\u002Fopenrobotics\u002Fmodels\u002FPlayground\u003C\u002Furi>\n",[26,1775,1776],{"__ignoreMap":115},[119,1777,1778,1780,1782,1785,1787],{"class":121,"line":122},[119,1779,202],{"class":201},[119,1781,1760],{"class":205},[119,1783,1784],{"class":201},">https:\u002F\u002Ffuel.gazebosim.org\u002F1.0\u002Fopenrobotics\u002Fmodels\u002FPlayground\u003C\u002F",[119,1786,1760],{"class":205},[119,1788,631],{"class":201},[16,1790,1791],{},"本地模型路径不要盲目改。例如：",[110,1793,1795],{"className":185,"code":1794,"language":187,"meta":115,"style":115},"\u003Curi>file:\u002F\u002F\u002Fhome\u002Fxxx\u002FROS_WS\u002Fign_models\u002Fbed\u003C\u002Furi>\n",[26,1796,1797],{"__ignoreMap":115},[119,1798,1799,1801,1803,1806,1808],{"class":121,"line":122},[119,1800,202],{"class":201},[119,1802,1760],{"class":205},[119,1804,1805],{"class":201},">file:\u002F\u002F\u002Fhome\u002Fxxx\u002FROS_WS\u002Fign_models\u002Fbed\u003C\u002F",[119,1807,1760],{"class":205},[119,1809,631],{"class":201},[16,1811,1812,1813,1816],{},"这里的 ",[26,1814,1815],{},"ign_models"," 可能只是自己建的文件夹名，不是 Gazebo API 名称。只要这个目录真实存在，就可以保留。",[16,1818,1819,1820,1822,1823,1512],{},"如果想改成更通用的模型路径，可以设置下面这个宏，宏从",[26,1821,417],{},"修改为",[26,1824,422],{},[110,1826,1828],{"className":112,"code":1827,"language":114,"meta":115,"style":115},"export GZ_SIM_RESOURCE_PATH=\u002Fpath\u002Fto\u002Fmodel_parent\n",[26,1829,1830],{"__ignoreMap":115},[119,1831,1832,1835,1838,1840],{"class":121,"line":122},[119,1833,1834],{"class":1260},"export",[119,1836,1837],{"class":201}," GZ_SIM_RESOURCE_PATH",[119,1839,212],{"class":1260},[119,1841,1842],{"class":201},"\u002Fpath\u002Fto\u002Fmodel_parent\n",[16,1844,1845],{},"然后 SDF 中写：",[110,1847,1849],{"className":185,"code":1848,"language":187,"meta":115,"style":115},"\u003Curi>model:\u002F\u002Fbed\u003C\u002Furi>\n",[26,1850,1851],{"__ignoreMap":115},[119,1852,1853,1855,1857,1860,1862],{"class":121,"line":122},[119,1854,202],{"class":201},[119,1856,1760],{"class":205},[119,1858,1859],{"class":201},">model:\u002F\u002Fbed\u003C\u002F",[119,1861,1760],{"class":205},[119,1863,631],{"class":201},[103,1865,1866],{"id":1866},"命令行迁移",[303,1868,1869,1879],{},[306,1870,1871],{},[309,1872,1873,1876],{},[312,1874,1875],{"align":314},"Humble \u002F Ignition 命令",[312,1877,1878],{"align":314},"Jazzy \u002F Gazebo Harmonic 命令",[323,1880,1881,1893,1905,1916],{},[309,1882,1883,1888],{},[328,1884,1885],{"align":314},[26,1886,1887],{},"ign gazebo world.sdf",[328,1889,1890],{"align":314},[26,1891,1892],{},"gz sim world.sdf",[309,1894,1895,1900],{},[328,1896,1897],{"align":314},[26,1898,1899],{},"ign gazebo -r world.sdf",[328,1901,1902],{"align":314},[26,1903,1904],{},"gz sim -r world.sdf",[309,1906,1907,1912],{},[328,1908,1909],{"align":314},[26,1910,1911],{},"ign topic -l",[328,1913,1914],{"align":314},[26,1915,1607],{},[309,1917,1918,1923],{},[328,1919,1920],{"align":314},[26,1921,1922],{},"ign topic -e -t \u002Fscan",[328,1924,1925],{"align":314},[26,1926,1927],{},"gz topic -e -t \u002Fscan",[16,1929,1930],{},"ROS launch 仍然用：",[110,1932,1934],{"className":112,"code":1933,"language":114,"meta":115,"style":115},"ros2 launch 包名 launch文件.py\n",[26,1935,1936],{"__ignoreMap":115},[119,1937,1938,1941,1944,1947],{"class":121,"line":122},[119,1939,1940],{"class":125},"ros2",[119,1942,1943],{"class":136}," launch",[119,1945,1946],{"class":136}," 包名",[119,1948,1949],{"class":136}," launch文件.py\n",[103,1951,1952],{"id":1952},"迁移后的验证顺序",[442,1954,1956],{"id":1955},"_1-检查-xml-sdf-是否合法","1. 检查 XML \u002F SDF 是否合法",[110,1958,1960],{"className":112,"code":1959,"language":114,"meta":115,"style":115},"xmllint --noout src\u002Fdemo_gazebo_sim\u002Fworld\u002Fhouse.sdf\nxmllint --noout src\u002Fdemo_gazebo_sim\u002Fworld\u002Fvisualize_lidar.sdf\nxmllint --noout src\u002Fmycar_description\u002Furdf\u002Fxacro\u002Fgazebo_sensor.urdf.xacro\n",[26,1961,1962,1973,1982],{"__ignoreMap":115},[119,1963,1964,1967,1970],{"class":121,"line":122},[119,1965,1966],{"class":125},"xmllint",[119,1968,1969],{"class":129}," --noout",[119,1971,1972],{"class":136}," src\u002Fdemo_gazebo_sim\u002Fworld\u002Fhouse.sdf\n",[119,1974,1975,1977,1979],{"class":121,"line":198},[119,1976,1966],{"class":125},[119,1978,1969],{"class":129},[119,1980,1981],{"class":136}," src\u002Fdemo_gazebo_sim\u002Fworld\u002Fvisualize_lidar.sdf\n",[119,1983,1984,1986,1988],{"class":121,"line":229},[119,1985,1966],{"class":125},[119,1987,1969],{"class":129},[119,1989,1990],{"class":136}," src\u002Fmycar_description\u002Furdf\u002Fxacro\u002Fgazebo_sensor.urdf.xacro\n",[442,1992,1994],{"id":1993},"_2-检查-xacro-是否能生成-urdf","2. 检查 xacro 是否能生成 URDF",[110,1996,1998],{"className":112,"code":1997,"language":114,"meta":115,"style":115},"source \u002Fopt\u002Fros\u002Fjazzy\u002Fsetup.bash\nxacro src\u002Fmycar_description\u002Furdf\u002Fxacro\u002Fcar.urdf.xacro -o \u002Ftmp\u002Fcar_check.urdf\n",[26,1999,2000,2008],{"__ignoreMap":115},[119,2001,2002,2005],{"class":121,"line":122},[119,2003,2004],{"class":129},"source",[119,2006,2007],{"class":136}," \u002Fopt\u002Fros\u002Fjazzy\u002Fsetup.bash\n",[119,2009,2010,2013,2016,2019],{"class":121,"line":198},[119,2011,2012],{"class":125},"xacro",[119,2014,2015],{"class":136}," src\u002Fmycar_description\u002Furdf\u002Fxacro\u002Fcar.urdf.xacro",[119,2017,2018],{"class":129}," -o",[119,2020,2021],{"class":136}," \u002Ftmp\u002Fcar_check.urdf\n",[442,2023,2025],{"id":2024},"_3-检查-gazebo-转-sdf-是否还有-warning","3. 检查 Gazebo 转 SDF 是否还有 warning",[110,2027,2029],{"className":112,"code":2028,"language":114,"meta":115,"style":115},"gz sdf -p \u002Ftmp\u002Fcar_check.urdf\n",[26,2030,2031],{"__ignoreMap":115},[119,2032,2033,2035,2038,2041],{"class":121,"line":122},[119,2034,255],{"class":125},[119,2036,2037],{"class":136}," sdf",[119,2039,2040],{"class":129}," -p",[119,2042,2021],{"class":136},[16,2044,2045,2046,2048,2049,2051],{},"如果还有 ",[26,2047,844],{}," 或 ",[26,2050,764],{}," warning，就回到传感器部分继续改。",[442,2053,2055],{"id":2054},"_4-构建工程","4. 构建工程",[110,2057,2059],{"className":112,"code":2058,"language":114,"meta":115,"style":115},"colcon build --symlink-install\nsource install\u002Fsetup.bash\n",[26,2060,2061,2072],{"__ignoreMap":115},[119,2062,2063,2066,2069],{"class":121,"line":122},[119,2064,2065],{"class":125},"colcon",[119,2067,2068],{"class":136}," build",[119,2070,2071],{"class":129}," --symlink-install\n",[119,2073,2074,2076],{"class":121,"line":198},[119,2075,2004],{"class":129},[119,2077,2078],{"class":136}," install\u002Fsetup.bash\n",[442,2080,2082],{"id":2081},"_5-启动-gazebo","5. 启动 Gazebo",[110,2084,2086],{"className":112,"code":2085,"language":114,"meta":115,"style":115},"ros2 launch demo_gazebo_sim gazebo_sim_world.launch.py\nros2 launch demo_gazebo_sim gazebo_sim_robot_world.launch.py\n",[26,2087,2088,2100],{"__ignoreMap":115},[119,2089,2090,2092,2094,2097],{"class":121,"line":122},[119,2091,1940],{"class":125},[119,2093,1943],{"class":136},[119,2095,2096],{"class":136}," demo_gazebo_sim",[119,2098,2099],{"class":136}," gazebo_sim_world.launch.py\n",[119,2101,2102,2104,2106,2108],{"class":121,"line":198},[119,2103,1940],{"class":125},[119,2105,1943],{"class":136},[119,2107,2096],{"class":136},[119,2109,2110],{"class":136}," gazebo_sim_robot_world.launch.py\n",[16,2112,2113],{},"也可以只跑 Gazebo server 做快速检查：",[110,2115,2117],{"className":112,"code":2116,"language":114,"meta":115,"style":115},"gz sim -s -r -v 2 src\u002Fdemo_gazebo_sim\u002Fworld\u002Fhouse.sdf --iterations 1\n",[26,2118,2119],{"__ignoreMap":115},[119,2120,2121,2123,2126,2129,2132,2135,2138,2141,2144],{"class":121,"line":122},[119,2122,255],{"class":125},[119,2124,2125],{"class":136}," sim",[119,2127,2128],{"class":129}," -s",[119,2130,2131],{"class":129}," -r",[119,2133,2134],{"class":129}," -v",[119,2136,2137],{"class":129}," 2",[119,2139,2140],{"class":136}," src\u002Fdemo_gazebo_sim\u002Fworld\u002Fhouse.sdf",[119,2142,2143],{"class":129}," --iterations",[119,2145,2146],{"class":129}," 1\n",[103,2148,2149],{"id":2149},"常见错误排查",[442,2151,2152],{"id":2152},"插件找不到",[16,2154,2155],{},"检查是否还写着：",[110,2157,2160],{"className":2158,"code":2159,"language":801,"meta":115},[799],"ignition-gazebo-*\nlibignition-gazebo-*.so\nignition::gazebo::systems::*\n",[26,2161,2159],{"__ignoreMap":115},[16,2163,2164],{},"Jazzy 应该改成：",[110,2166,2169],{"className":2167,"code":2168,"language":801,"meta":115},[799],"gz-sim-*-system\ngz::sim::systems::*\n",[26,2170,2168],{"__ignoreMap":115},[442,2172,2174],{"id":2173},"gui-标签-warning","GUI 标签 warning",[16,2176,2177],{},"检查是否还有：",[110,2179,2181],{"className":185,"code":2180,"language":187,"meta":115,"style":115},"\u003Cignition-gui>\n",[26,2182,2183],{"__ignoreMap":115},[119,2184,2185,2187,2189],{"class":121,"line":122},[119,2186,202],{"class":201},[119,2188,628],{"class":205},[119,2190,631],{"class":201},[16,2192,2164],{},[110,2194,2196],{"className":185,"code":2195,"language":187,"meta":115,"style":115},"\u003Cgz-gui>\n",[26,2197,2198],{"__ignoreMap":115},[119,2199,2200,2202,2204],{"class":121,"line":122},[119,2201,202],{"class":201},[119,2203,686],{"class":205},[119,2205,631],{"class":201},[442,2207,2209],{"id":2208},"传感器-warning","传感器 warning",[16,2211,2177],{},[110,2213,2215],{"className":185,"code":2214,"language":187,"meta":115,"style":115},"\u003CalwaysOn>\n\u003Cignition_frame_id>\n",[26,2216,2217,2225],{"__ignoreMap":115},[119,2218,2219,2221,2223],{"class":121,"line":122},[119,2220,202],{"class":201},[119,2222,764],{"class":205},[119,2224,631],{"class":201},[119,2226,2227,2229,2231],{"class":121,"line":198},[119,2228,202],{"class":201},[119,2230,822],{"class":205},[119,2232,631],{"class":201},[16,2234,2235],{},"建议改成：",[110,2237,2239],{"className":185,"code":2238,"language":187,"meta":115,"style":115},"\u003Calways_on>true\u003C\u002Falways_on>\n\u003Cpose relative_to=\"laser\">0 0 0 0 0 0\u003C\u002Fpose>\n\u003Cgz_frame_id>laser\u003C\u002Fgz_frame_id>\n",[26,2240,2241,2253,2271],{"__ignoreMap":115},[119,2242,2243,2245,2247,2249,2251],{"class":121,"line":122},[119,2244,202],{"class":201},[119,2246,786],{"class":205},[119,2248,767],{"class":201},[119,2250,786],{"class":205},[119,2252,631],{"class":201},[119,2254,2255,2257,2259,2261,2263,2265,2267,2269],{"class":121,"line":198},[119,2256,202],{"class":201},[119,2258,885],{"class":205},[119,2260,888],{"class":125},[119,2262,212],{"class":201},[119,2264,893],{"class":136},[119,2266,896],{"class":201},[119,2268,885],{"class":205},[119,2270,631],{"class":201},[119,2272,2273,2275,2277,2279,2281],{"class":121,"line":229},[119,2274,202],{"class":201},[119,2276,844],{"class":205},[119,2278,825],{"class":201},[119,2280,844],{"class":205},[119,2282,631],{"class":201},[16,2284,2285],{},"或：",[110,2287,2289],{"className":185,"code":2288,"language":187,"meta":115,"style":115},"\u003Cpose relative_to=\"camera\">0 0 0 0 0 0\u003C\u002Fpose>\n\u003Cgz_frame_id>camera\u003C\u002Fgz_frame_id>\n",[26,2290,2291,2309],{"__ignoreMap":115},[119,2292,2293,2295,2297,2299,2301,2303,2305,2307],{"class":121,"line":122},[119,2294,202],{"class":201},[119,2296,885],{"class":205},[119,2298,888],{"class":125},[119,2300,212],{"class":201},[119,2302,929],{"class":136},[119,2304,896],{"class":201},[119,2306,885],{"class":205},[119,2308,631],{"class":201},[119,2310,2311,2313,2315,2317,2319],{"class":121,"line":198},[119,2312,202],{"class":201},[119,2314,844],{"class":205},[119,2316,986],{"class":201},[119,2318,844],{"class":205},[119,2320,631],{"class":201},[442,2322,2324],{"id":2323},"robot_state_publisher-的-kdl-根-link-惯性警告","robot_state_publisher 的 KDL 根 link 惯性警告",[16,2326,2327],{},"如果日志出现：",[110,2329,2332],{"className":2330,"code":2331,"language":801,"meta":115},[799],"The root link base_footprint has an inertia specified in the URDF, but KDL does not support a root link with an inertia.\n",[26,2333,2331],{"__ignoreMap":115},[16,2335,2336,2337,2340],{},"说明 URDF 根 link 带了 ",[26,2338,2339],{},"\u003Cinertial>","，KDL 不支持。",[442,2342,2344],{"id":2343},"改了-xacro-但日志仍显示旧内容","改了 xacro 但日志仍显示旧内容",[16,2346,2347],{},"先确认旧 launch 已经停止：",[110,2349,2351],{"className":112,"code":2350,"language":114,"meta":115,"style":115},"pgrep -af \"gazebo|gz sim|robot_state_publisher|parameter_bridge\"\n",[26,2352,2353],{"__ignoreMap":115},[119,2354,2355,2358,2361],{"class":121,"line":122},[119,2356,2357],{"class":125},"pgrep",[119,2359,2360],{"class":129}," -af",[119,2362,2363],{"class":136}," \"gazebo|gz sim|robot_state_publisher|parameter_bridge\"\n",[16,2365,2366,2367,2370,2371,2374,2375,2378],{},"如果旧的 ",[26,2368,2369],{},"robot_state_publisher"," 还在，同一个 ROS graph 里 ",[26,2372,2373],{},"ros_gz_sim create"," 可能会从旧的 ",[26,2376,2377],{},"\u002Frobot_description"," 拿模型。",[16,2380,2381],{},"停止旧进程后重新构建、source、启动：",[110,2383,2385],{"className":112,"code":2384,"language":114,"meta":115,"style":115},"colcon build --symlink-install\nsource install\u002Fsetup.bash\nros2 launch demo_gazebo_sim gazebo_sim_robot_world.launch.py\n",[26,2386,2387,2395,2401],{"__ignoreMap":115},[119,2388,2389,2391,2393],{"class":121,"line":122},[119,2390,2065],{"class":125},[119,2392,2068],{"class":136},[119,2394,2071],{"class":129},[119,2396,2397,2399],{"class":121,"line":198},[119,2398,2004],{"class":129},[119,2400,2078],{"class":136},[119,2402,2403,2405,2407,2409],{"class":121,"line":229},[119,2404,1940],{"class":125},[119,2406,1943],{"class":136},[119,2408,2096],{"class":136},[119,2410,2110],{"class":136},[442,2412,2414],{"id":2413},"qstandardpaths-libegl-warning","QStandardPaths \u002F libEGL warning",[16,2416,2417],{},"如果日志里只剩：",[110,2419,2422],{"className":2420,"code":2421,"language":801,"meta":115},[799],"QStandardPaths: runtime directory '\u002Frun\u002Fuser\u002F1000' is not owned by UID 0\nlibEGL warning: egl: failed to create dri2 screen\n",[26,2423,2421],{"__ignoreMap":115},[16,2425,2426],{},"这通常不是 Gazebo 迁移错误，而是用 root 启动 GUI 或显卡渲染环境导致的 warning。建议用普通用户运行 ROS\u002FGazebo，或者检查显卡驱动、Mesa、EGL 环境。",[103,2428,2429],{"id":2429},"最后再扫一遍旧引用",[16,2431,2432],{},"功能性旧引用检查：",[110,2434,2436],{"className":112,"code":2435,"language":114,"meta":115,"style":115},"rg -n \"filename=['\\\"](lib)?ignition|name=['\\\"]ignition::gazebo|\u003Cignition-gui>|\u003C\u002Fignition-gui>|\u003Cignition_frame_id>|\u003C\u002Fignition_frame_id>|\u003Cgz_frame_id>|\u003C\u002Fgz_frame_id>|fuel\\\\.ignitionrobotics\\\\.org|ros_ign|ign_args|ign_version|alwaysOn\" src\n",[26,2437,2438],{"__ignoreMap":115},[119,2439,2440,2442,2444,2447,2450,2453,2455,2458,2461,2464,2466,2469],{"class":121,"line":122},[119,2441,126],{"class":125},[119,2443,130],{"class":129},[119,2445,2446],{"class":136}," \"filename=['",[119,2448,2449],{"class":129},"\\\"",[119,2451,2452],{"class":136},"](lib)?ignition|name=['",[119,2454,2449],{"class":129},[119,2456,2457],{"class":136},"]ignition::gazebo|\u003Cignition-gui>|\u003C\u002Fignition-gui>|\u003Cignition_frame_id>|\u003C\u002Fignition_frame_id>|\u003Cgz_frame_id>|\u003C\u002Fgz_frame_id>|fuel",[119,2459,2460],{"class":129},"\\\\",[119,2462,2463],{"class":136},".ignitionrobotics",[119,2465,2460],{"class":129},[119,2467,2468],{"class":136},".org|ros_ign|ign_args|ign_version|alwaysOn\"",[119,2470,140],{"class":136},[16,2472,2473],{},"官方文档提醒的误替换检查：",[110,2475,2477],{"className":112,"code":2476,"language":114,"meta":115,"style":115},"rg -n -i \"gz-gazebo|gzition|an gz\" src\n",[26,2478,2479],{"__ignoreMap":115},[119,2480,2481,2483,2485,2487,2490],{"class":121,"line":122},[119,2482,126],{"class":125},[119,2484,130],{"class":129},[119,2486,133],{"class":129},[119,2488,2489],{"class":136}," \"gz-gazebo|gzition|an gz\"",[119,2491,140],{"class":136},[16,2493,2494],{},"如果只在中文注释或教程里搜到旧写法，而功能代码里没有，一般就迁移干净了。",[2496,2497,2498],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .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}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":115,"searchDepth":198,"depth":198,"links":2500},[2501],{"id":14,"depth":229,"text":5},"1100-0400","2023-12-30","2023-12-30-ros2-tutorial","\u002Fwiki\u002F2023-12-30-ros2-tutorial","Ros2 Tutorial","md",true,false,{},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-igngz2gzsim",{"title":5,"description":115},"wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-Igngz2gzsim","MdFj-IQQ3-1WyY-F0EB6IAonNznSBG-FdAiviJ3enPQ",[2516,2523,2529,2535,2541,2547,2553,2559,2565,2571,2577,2583,2589,2595,2597,2603,2609,2615,2621,2627,2633,2639,2645,2651,2657,2663,2669,2675,2681,2687,2693,2699,2705,2711,2717,2722,2728,2733,2739,2745,2751,2757,2763,2769,2775,2781,2787,2793,2799,2805,2811,2817,2823,2829,2835,2841,2847,2853,2859,2865,2871,2877,2883,2889,2895,2901,2907,2913,2919],{"path":2517,"stem":2518,"title":2519,"authors":2520,"date":2503,"chapterOrder":2521,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0100-ros2-jie-shao","wiki\u002F2023-12-30-ros2-tutorial\u002F0100-ROS2介绍","ROS2介绍",[7],"0100",0,{"path":2524,"stem":2525,"title":2526,"authors":2527,"date":2503,"chapterOrder":2528,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0200-ru-men-cao-zuo","wiki\u002F2023-12-30-ros2-tutorial\u002F0200-入门操作","入门操作",[7],"0200",{"path":2530,"stem":2531,"title":2532,"authors":2533,"date":2503,"chapterOrder":2534,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0300-gong-zuo-kong-jian-yu-gong-neng-bao","wiki\u002F2023-12-30-ros2-tutorial\u002F0300-工作空间与功能包","工作空间与功能包",[7],"0300",{"path":2536,"stem":2537,"title":2538,"authors":2539,"date":2503,"chapterOrder":2540,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0400-si-da-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F0400-四大通信","四大通信",[7],"0400",{"path":2542,"stem":2543,"title":2544,"authors":2545,"date":2503,"chapterOrder":2546,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0500-ros2-qi-ta-tong-xin-ji-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F0500-ROS2其他通信机制","ROS2其他通信机制",[7],"0500",{"path":2548,"stem":2549,"title":2550,"authors":2551,"date":2503,"chapterOrder":2552,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0600-launch","wiki\u002F2023-12-30-ros2-tutorial\u002F0600-Launch","Launch",[7],"0600",{"path":2554,"stem":2555,"title":2556,"authors":2557,"date":2503,"chapterOrder":2558,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0700-hui-su-rosbag2","wiki\u002F2023-12-30-ros2-tutorial\u002F0700-回溯rosbag2","回溯rosbag2",[7],"0700",{"path":2560,"stem":2561,"title":2562,"authors":2563,"date":2503,"chapterOrder":2564,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0800-zuo-biao-bian-huan-tf","wiki\u002F2023-12-30-ros2-tutorial\u002F0800-坐标变换TF","坐标变换TF",[7],"0800",{"path":2566,"stem":2567,"title":2568,"authors":2569,"date":2503,"chapterOrder":2570,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0900-ke-shi-hua-ping-tai-rviz2-yu-urdf-jian-mo-yu-yan","wiki\u002F2023-12-30-ros2-tutorial\u002F0900-可视化平台RVIZ2与URDF建模语言","可视化平台RVIZ2与URDF建模语言",[7],"0900",{"path":2572,"stem":2573,"title":2574,"authors":2575,"date":2503,"chapterOrder":2576,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1000-stage-ros2-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1000-Stage_Ros2仿真平台","Stage_Ros2仿真平台",[7],"1000",{"path":2578,"stem":2579,"title":2580,"authors":2581,"date":2503,"chapterOrder":2582,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-gazeboclassic","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-GazeboClassic","Gezebo Classic",[7],"1100-0100",{"path":2584,"stem":2585,"title":2586,"authors":2587,"date":2503,"chapterOrder":2588,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-ignitiongazebo","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-IgnitionGazebo","Ignition Gazebo（Gazebo Fortress）",[7],"1100-0200",{"path":2590,"stem":2591,"title":2592,"authors":2593,"date":2503,"chapterOrder":2594,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-gazebosim","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-GazeboSim","Gz Sim（Gazebo Harmonic）",[7],"1100-0300",{"path":2511,"stem":2513,"title":5,"authors":2596,"date":2503,"chapterOrder":2502,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},[7],{"path":2598,"stem":2599,"title":2600,"authors":2601,"date":2503,"chapterOrder":2602,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-gezebo-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-Gezebo仿真平台","Gezebo仿真平台",[7],"1100",{"path":2604,"stem":2605,"title":2606,"authors":2607,"date":2503,"chapterOrder":2608,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-humble-ban-ben","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-Humble版本","Humble导航仿真",[7],"1200-0100",{"path":2610,"stem":2611,"title":2612,"authors":2613,"date":2503,"chapterOrder":2614,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-jazzy-ban-ben","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-Jazzy版本","Jazzy导航仿真",[7],"1200-0200",{"path":2616,"stem":2617,"title":2618,"authors":2619,"date":2503,"chapterOrder":2620,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-humble2jazzy","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-Humble2Jazzy","Humble与Jazzy导航的差异",[7],"1200-0300",{"path":2622,"stem":2623,"title":2624,"authors":2625,"date":2503,"chapterOrder":2626,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-you-xian-zhuang-tai-ji-fsm","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-有限状态机FSM","有限状态机（Finite State Machine）",[7],"1200-0400-0100",{"path":2628,"stem":2629,"title":2630,"authors":2631,"date":2503,"chapterOrder":2632,"chapterDepth":229,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-ji-ben-gai-nian","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-基本概念","基本概念",[7],"1200-0400-0200-0100",{"path":2634,"stem":2635,"title":2636,"authors":2637,"date":2503,"chapterOrder":2638,"chapterDepth":229,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-kong-zhi-yu-zhuang-shi-gui-ze","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-控制与装饰规则","控制与装饰规则",[7],"1200-0400-0200-0200",{"path":2640,"stem":2641,"title":2642,"authors":2643,"date":2503,"chapterOrder":2644,"chapterDepth":229,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0300-di-yi-ge-wan-zheng-cheng-xu","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0300-第一个完整程序","第一个完整程序",[7],"1200-0400-0200-0300",{"path":2646,"stem":2647,"title":2648,"authors":2649,"date":2503,"chapterOrder":2650,"chapterDepth":229,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0400-jie-dian-zhi-jian-chuan-shu-ju","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0400-节点之间传数据","节点之间传数据",[7],"1200-0400-0200-0400",{"path":2652,"stem":2653,"title":2654,"authors":2655,"date":2503,"chapterOrder":2656,"chapterDepth":229,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0500-chi-xu-ren-wu-yu-zhong-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0500-持续任务与中止","持续任务与中止",[7],"1200-0400-0200-0500",{"path":2658,"stem":2659,"title":2660,"authors":2661,"date":2503,"chapterOrder":2662,"chapterDepth":229,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0600-zu-he-shi-ji-ren-wu","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0600-组合实际任务","组合实际任务",[7],"1200-0400-0200-0600",{"path":2664,"stem":2665,"title":2666,"authors":2667,"date":2503,"chapterOrder":2668,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-xing-wei-shu-bt","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-行为树BT","行为树（BehaviorTree.CPP）",[7],"1200-0400-0200",{"path":2670,"stem":2671,"title":2672,"authors":2673,"date":2503,"chapterOrder":2674,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-fsm-yu-bt","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-FSM与BT","有限状态机FSM与行为树BT",[7],"1200-0400",{"path":2676,"stem":2677,"title":2678,"authors":2679,"date":2503,"chapterOrder":2680,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-机器人导航Navigation2(仿真篇)","机器人导航Navigation2(仿真篇)",[7],"1200",{"path":2682,"stem":2683,"title":2684,"authors":2685,"date":2503,"chapterOrder":2686,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-Boost.Aiso","Boost.Asio库",[7],"1300-0100-0100",{"path":2688,"stem":2689,"title":2690,"authors":2691,"date":2503,"chapterOrder":2692,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2_serial_driver","ROS2 Serial Driver库",[7],"1300-0100-0200",{"path":2694,"stem":2695,"title":2696,"authors":2697,"date":2503,"chapterOrder":2698,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-chuan-kou-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-串口通信","UART串口通信",[7],"1300-0100",{"path":2700,"stem":2701,"title":2702,"authors":2703,"date":2503,"chapterOrder":2704,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","SocketCAN",[7],"1300-0200-0100",{"path":2706,"stem":2707,"title":2708,"authors":2709,"date":2503,"chapterOrder":2710,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2-socketcan","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2_socketcan","ROS2_SocketCAN",[7],"1300-0200-0200",{"path":2712,"stem":2713,"title":2714,"authors":2715,"date":2503,"chapterOrder":2716,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-can-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-CAN通信","CAN通信",[7],"1300-0200",{"path":2718,"stem":2719,"title":2684,"authors":2720,"date":2503,"chapterOrder":2721,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-Boost.Aiso",[7],"1300-0300-0100",{"path":2723,"stem":2724,"title":2725,"authors":2726,"date":2503,"chapterOrder":2727,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-tcp-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-TCP通信","TCP通信",[7],"1300-0300",{"path":2729,"stem":2730,"title":2684,"authors":2731,"date":2503,"chapterOrder":2732,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-Boost.Aiso",[7],"1300-0400-0100",{"path":2734,"stem":2735,"title":2736,"authors":2737,"date":2503,"chapterOrder":2738,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-udp-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-UDP通信","UDP通信",[7],"1300-0400",{"path":2740,"stem":2741,"title":2742,"authors":2743,"date":2503,"chapterOrder":2744,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-linux-ying-jian-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-Linux硬件通信","Linux硬件通信",[7],"1300",{"path":2746,"stem":2747,"title":2748,"authors":2749,"date":2503,"chapterOrder":2750,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-ji-qi-ren-zu-cheng","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-机器人组成","机器人组成",[7],"1400-0100",{"path":2752,"stem":2753,"title":2754,"authors":2755,"date":2503,"chapterOrder":2756,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-yuan-cheng-kai-fa-ssh","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-远程开发SSH","远程开发SSH",[7],"1400-0200-0100",{"path":2758,"stem":2759,"title":2760,"authors":2761,"date":2503,"chapterOrder":2762,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-yuan-cheng-fang-wen-zhuo-mian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-远程访问桌面","远程访问桌面",[7],"1400-0200-0200",{"path":2764,"stem":2765,"title":2766,"authors":2767,"date":2503,"chapterOrder":2768,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-gong-kong-ji-zhi-yuan-cheng-kai-fa-huan-jing","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-工控机之远程开发环境","工控机之远程开发环境",[7],"1400-0200",{"path":2770,"stem":2771,"title":2772,"authors":2773,"date":2503,"chapterOrder":2774,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-gong-kong-ji-zhi-wai-jie-usb-she-bei","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-工控机之外接USB设备","工控机之外接USB设备",[7],"1400-0300",{"path":2776,"stem":2777,"title":2778,"authors":2779,"date":2503,"chapterOrder":2780,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-fen-bu-shi-da-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-分布式搭建","分布式搭建",[7],"1400-0400",{"path":2782,"stem":2783,"title":2784,"authors":2785,"date":2503,"chapterOrder":2786,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-you-hua-ri-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-优化日志","优化日志",[7],"1400-0500",{"path":2788,"stem":2789,"title":2790,"authors":2791,"date":2503,"chapterOrder":2792,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-li-cheng-ji-odom","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-里程计Odom","里程计Odom",[7],"1400-0600-0100",{"path":2794,"stem":2795,"title":2796,"authors":2797,"date":2503,"chapterOrder":2798,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-guan-xing-ji-imu","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-惯性计IMU","惯性计IMU",[7],"1400-0600-0200",{"path":2800,"stem":2801,"title":2802,"authors":2803,"date":2503,"chapterOrder":2804,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-ji-guang-lei-da-lidar","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-激光雷达LiDAR","激光雷达LiDAR",[7],"1400-0600-0300",{"path":2806,"stem":2807,"title":2808,"authors":2809,"date":2503,"chapterOrder":2810,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-xiang-ji-camera","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-相机Camera","相机Camera",[7],"1400-0600-0400",{"path":2812,"stem":2813,"title":2814,"authors":2815,"date":2503,"chapterOrder":2816,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-quan-qiu-ding-wei-gnss","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-全球定位GNSS","全球定位GNSS",[7],"1400-0600-0500",{"path":2818,"stem":2819,"title":2820,"authors":2821,"date":2503,"chapterOrder":2822,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-shou-bing-joy","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-手柄joy","手柄JOY",[7],"1400-0600-0600",{"path":2824,"stem":2825,"title":2826,"authors":2827,"date":2503,"chapterOrder":2828,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-jian-pan-kong-zhi-jie-dian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-键盘控制节点","键盘控制节点",[7],"1400-0600-0700",{"path":2830,"stem":2831,"title":2832,"authors":2833,"date":2503,"chapterOrder":2834,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-ying-jian-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-硬件平台","硬件平台",[7],"1400-0600",{"path":2836,"stem":2837,"title":2838,"authors":2839,"date":2503,"chapterOrder":2840,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-zuo-biao-xi-yu-hua-ti-guan-xi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-坐标系与话题关系","坐标系与话题关系",[7],"1400-0700",{"path":2842,"stem":2843,"title":2844,"authors":2845,"date":2503,"chapterOrder":2846,"chapterDepth":229,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-lun-shi-li-cheng-ji-biao-ding","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-轮式里程计标定","轮式里程计标定",[7],"1400-0800-0100-0100",{"path":2848,"stem":2849,"title":2850,"authors":2851,"date":2503,"chapterOrder":2852,"chapterDepth":229,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-lun-shi-li-cheng-ji-yu-imu-rong-he","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-轮式里程计与IMU融合","轮式里程计与IMU融合",[7],"1400-0800-0100-0200",{"path":2854,"stem":2855,"title":2856,"authors":2857,"date":2503,"chapterOrder":2858,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-lun-shi-li-cheng-ji-biao-ding-yu-rong-he","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-轮式里程计标定与融合","轮式里程计标定与融合",[7],"1400-0800-0100",{"path":2860,"stem":2861,"title":2862,"authors":2863,"date":2503,"chapterOrder":2864,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-ji-guang-lei-da-gong-ju","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-激光雷达工具","激光雷达工具",[7],"1400-0800-0200",{"path":2866,"stem":2867,"title":2868,"authors":2869,"date":2503,"chapterOrder":2870,"chapterDepth":198,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-xiang-ji-shi-yong-jin-jie","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-相机使用进阶","相机使用进阶",[7],"1400-0800-0300",{"path":2872,"stem":2873,"title":2874,"authors":2875,"date":2503,"chapterOrder":2876,"chapterDepth":122,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-ying-jian-ping-tai-jin-jie","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-硬件平台进阶","硬件平台进阶",[7],"1400-0800",{"path":2878,"stem":2879,"title":2880,"authors":2881,"date":2503,"chapterOrder":2882,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-ji-qi-ren-ying-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-机器人硬件","机器人硬件",[7],"1400",{"path":2884,"stem":2885,"title":2886,"authors":2887,"date":2503,"chapterOrder":2888,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1500-ros2-control","wiki\u002F2023-12-30-ros2-tutorial\u002F1500-ROS2_Control","ROS2_Control",[7],"1500",{"path":2890,"stem":2891,"title":2892,"authors":2893,"date":2503,"chapterOrder":2894,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1600-moveit2-gong-ye-ji-qi-ren-ji-xie-bi","wiki\u002F2023-12-30-ros2-tutorial\u002F1600-Moveit2工业机器人机械臂","Moveit2工业机器人机械臂",[7],"1600",{"path":2896,"stem":2897,"title":2898,"authors":2899,"date":2503,"chapterOrder":2900,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1700-ji-qi-ren-dao-hang-navigation2-shi-ti-pian","wiki\u002F2023-12-30-ros2-tutorial\u002F1700-机器人导航Navigation2(实体篇)","机器人导航Navigation2(实体篇)",[7],"1700",{"path":2902,"stem":2903,"title":2904,"authors":2905,"date":2503,"chapterOrder":2906,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1800-microros","wiki\u002F2023-12-30-ros2-tutorial\u002F1800-MicroROS","MicroROS",[7],"1800",{"path":2908,"stem":2909,"title":2910,"authors":2911,"date":2503,"chapterOrder":2912,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1900-webots-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1900-Webots仿真平台","Webots仿真平台",[7],"1900",{"path":2914,"stem":2915,"title":2916,"authors":2917,"date":2503,"chapterOrder":2918,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2509},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F2000-opencv","wiki\u002F2023-12-30-ros2-tutorial\u002F2000-OpenCV","OpenCV",[7],"2000",{"path":2505,"stem":2920,"title":2921,"authors":2922,"date":2503,"chapterOrder":2923,"chapterDepth":2522,"docKey":2504,"docRoot":2505,"docTitle":2506,"isWikiDoc":2508,"isWikiIndex":2508},"wiki\u002F2023-12-30-ros2-tutorial\u002Findex","ROS2机器人操作系统教程",[7],null,[2925,2927,2930,2933],{"name":7,"image":2926},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":2928,"image":2929},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":2931,"image":2932},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":2934,"image":2935},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431902193]