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