[{"data":1,"prerenderedAt":2892},["ShallowReactive",2],{"wiki-page-/en-us/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim":3,"wiki-doc-items-/en-us/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim":2524,"language-switcher-data-/en-us/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim":2876,"wiki-i18n-paths-/en-us/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim":2891},{"id":4,"title":5,"body":6,"canonicalPath":2504,"chapter":2505,"chapterSort":2506,"date":2507,"description":114,"docI18nKey":2508,"docKey":2509,"docRoot":2510,"docTitle":2511,"extension":2512,"i18nKey":2513,"isBlogPost":2514,"isWikiDoc":2515,"isWikiIndex":2514,"layout":2516,"legacyPath":2516,"locale":2517,"localeSlug":2518,"meta":2519,"navigation":2515,"path":2504,"seo":2520,"sourcePath":2521,"sourceStem":2513,"stem":2522,"wikiDepth":121,"__hash__":2523},"content/_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-4-Igngz2gzsim.md","Migrate Ign Gazebo to Gz Sim",{"type":7,"value":8,"toc":2501},"minimark",[9,13,20,36,50,53,56,59,100,105,108,140,143,179,182,232,236,242,255,260,263,298,301,440,445,448,478,481,509,512,610,614,617,672,675,721,724,740,744,747,750,752,771,774,791,794,802,806,809,828,831,849,856,862,865,872,899,902,1046,1049,1186,1195,1207,1215,1220,1225,1229,1242,1245,1269,1272,1291,1294,1368,1371,1405,1408,1502,1506,1512,1585,1588,1608,1612,1622,1719,1722,1740,1744,1747,1766,1769,1787,1790,1808,1815,1823,1841,1844,1862,1866,1927,1930,1949,1953,1957,1991,1995,2022,2026,2043,2052,2056,2079,2083,2111,2114,2147,2151,2155,2158,2164,2167,2173,2177,2180,2193,2195,2208,2212,2214,2235,2238,2285,2288,2323,2327,2330,2336,2343,2347,2350,2366,2380,2383,2412,2416,2419,2425,2428,2432,2435,2473,2476,2494,2497],[10,11,5],"h3",{"id":12},"migrate-ign-gazebo-to-gz-sim",[14,15,16],"p",{},[17,18,19],"strong",{},"(Specifically, migrating from ROS2 Humble to ROS2 Jazzy and later versions. Even projects using only Humble are recommended to review this, as many coding practices can affect future upgrades.)",[14,21,22,23,27,28,31,32,35],{},"In the ROS2 Humble era, the new version of Gazebo still frequently uses the Ignition / Ign Gazebo naming, for example the command is ",[24,25,26],"code",{},"ign gazebo",", the ROS package name is commonly ",[24,29,30],{},"ros_ign_*",", and the plugin file name is often ",[24,33,34],{},"ignition-gazebo-xxx-system",".",[14,37,38,39,42,43,46,47,35],{},"With ROS2 Jazzy, the official pairing is Gazebo Harmonic. At this point, the naming system has largely switched to Gazebo / Gz Sim — for example, the command becomes ",[24,40,41],{},"gz sim",", the ROS package name changes to ",[24,44,45],{},"ros_gz_*",", and the plugin file name changes to ",[24,48,49],{},"gz-sim-xxx-system",[14,51,52],{},"So when migrating from Humble to Jazzy, the biggest compatibility issues are usually with Gazebo. The interface and functionality look similar, but many names in the code are not interchangeable, requiring migration from the Ignition-era naming to the Gz Sim / Gazebo Harmonic conventions.",[14,54,55],{},"It can be simply understood as: most of the migration is not about rewriting functionality, but rather migrating the naming system, plugin names, launch package names, SDF tags, and environment variables.",[14,57,58],{},"Official reference:",[60,61,62,72,79,86,93],"ul",{},[63,64,65,66],"li",{},"Gazebo Harmonic Migration Notes: ",[67,68,69],"a",{"href":69,"rel":70},"https://gazebosim.org/docs/harmonic/migration_from_ignition/",[71],"nofollow",[63,73,74,75],{},"Gazebo Fuel Model Reference Example: ",[67,76,77],{"href":77,"rel":78},"https://gazebosim.org/docs/harmonic/fuel_insert/",[71],[63,80,81,82],{},"Gazebo Sensors Example: ",[67,83,84],{"href":84,"rel":85},"https://gazebosim.org/docs/harmonic/sensors/",[71],[63,87,88,89],{},"ROS2 Gazebo Classic Migration Guide to New 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 Specification: ",[67,97,98],{"href":98,"rel":99},"https://sdformat.org/spec",[71],[101,102,104],"h4",{"id":103},"before-migrating-first-search-for-the-old-syntax","Before migrating, first search for the old syntax.",[14,106,107],{},"Run the following command in the project root directory:",[109,110,115],"pre",{"className":111,"code":112,"language":113,"meta":114,"style":114},"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,116,117],{"__ignoreMap":114},[118,119,122,126,130,133,137],"span",{"class":120,"line":121},"line",1,[118,123,125],{"class":124},"sScJk","rg",[118,127,129],{"class":128},"sj4cs"," -n",[118,131,132],{"class":128}," -i",[118,134,136],{"class":135},"sZZnC"," \"ignition|ignition-gazebo|libignition|ros_ign|ign_args|ign_version|fuel.ignitionrobotics|ignition_frame_id|\u003Cignition-gui>|ign gazebo|ign topic|alwaysOn\"",[118,138,139],{"class":135}," src\n",[14,141,142],{},"Focus on checking these files:",[60,144,145,151,161,167,173],{},[63,146,147,150],{},[24,148,149],{},"*.sdf",": world, model, GUI, plugins, and Fuel URL are usually found here.",[63,152,153,156,157,160],{},[24,154,155],{},"*.urdf.xacro"," / ",[24,158,159],{},"*.urdf",": Robot plugins and sensor tags are usually found here.",[63,162,163,166],{},[24,164,165],{},"*.launch.py",": Gazebo launch package, launch parameters, and bridged topics are usually located here.",[63,168,169,172],{},[24,170,171],{},"package.xml",": Runtime dependencies are usually located here.",[63,174,175,178],{},[24,176,177],{},"CMakeLists.txt",": The installation directory and build dependencies are usually located here.",[14,180,181],{},"It is recommended to add paired Chinese comments when making modifications, so that it will be easier to know where to start and where to end in the future.",[109,183,187],{"className":184,"code":185,"language":186,"meta":114,"style":114},"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,188,189,195,226],{"__ignoreMap":114},[118,190,191],{"class":120,"line":121},[118,192,194],{"class":193},"sJ8bj","\u003C!-- Jazzy 迁移开始：说明这里为什么要改。 -->\n",[118,196,198,202,206,209,212,215,218,220,223],{"class":120,"line":197},2,[118,199,201],{"class":200},"sVt8B","\u003C",[118,203,205],{"class":204},"s9eBZ","plugin",[118,207,208],{"class":124}," filename",[118,210,211],{"class":200},"=",[118,213,214],{"class":135},"\"gz-sim-physics-system\"",[118,216,217],{"class":124}," name",[118,219,211],{"class":200},[118,221,222],{"class":135},"\"gz::sim::systems::Physics\"",[118,224,225],{"class":200},"/>\n",[118,227,229],{"class":120,"line":228},3,[118,230,231],{"class":193},"\u003C!-- Jazzy 迁移结束：说明这里已经改成什么写法。 -->\n",[101,233,235],{"id":234},"sdf-file","SDF file",[14,237,238],{},[239,240],"img",{"alt":114,"src":241},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1741.webp",[14,243,244,245,156,248,251,252,35],{},"According to the official migration guide, common naming usually replaces ",[24,246,247],{},"ignition",[24,249,250],{},"ign"," with ",[24,253,254],{},"gz",[14,256,257],{},[239,258],{"alt":114,"src":259},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1742.webp",[14,261,262],{},"The plugin should be renamed according to the new naming convention, for example:",[60,264,265,274,283,291],{},[63,266,267,270,271],{},[24,268,269],{},"ignition::gazebo"," namespace changed to ",[24,272,273],{},"gz::sim",[63,275,276,279,280],{},[24,277,278],{},"ignition::"," changed to ",[24,281,282],{},"gz::",[63,284,285,279,288],{},[24,286,287],{},"ignition-gazebo-XXX-system",[24,289,290],{},"gz-sim-XXX-system",[63,292,293,279,296],{},[24,294,295],{},"libignition-gazebo-XXX-system.so",[24,297,290],{},[14,299,300],{},"Common Replacement Table:",[302,303,304,321],"table",{},[305,306,307],"thead",{},[308,309,310,315,318],"tr",{},[311,312,314],"th",{"align":313},"left","Humble / Ignition syntax",[311,316,317],{"align":313},"Jazzy / Gazebo Harmonic notation",[311,319,320],{"align":313},"Example scenario",[322,323,324,340,353,368,381,396,410,425],"tbody",{},[308,325,326,332,337],{},[327,328,329],"td",{"align":313},[24,330,331],{},"ignition-gazebo-*",[327,333,334],{"align":313},[24,335,336],{},"gz-sim-*",[327,338,339],{"align":313},"Plugin file name",[308,341,342,347,351],{},[327,343,344],{"align":313},[24,345,346],{},"libignition-gazebo-*.so",[327,348,349],{"align":313},[24,350,336],{},[327,352,339],{"align":313},[308,354,355,360,365],{},[327,356,357],{"align":313},[24,358,359],{},"ignition::gazebo::*",[327,361,362],{"align":313},[24,363,364],{},"gz::sim::*",[327,366,367],{"align":313},"Plugin Namespace",[308,369,370,374,378],{},[327,371,372],{"align":313},[24,373,30],{},[327,375,376],{"align":313},[24,377,45],{},[327,379,380],{"align":313},"ROS-Gazebo package name",[308,382,383,388,393],{},[327,384,385],{"align":313},[24,386,387],{},"ign_args",[327,389,390],{"align":313},[24,391,392],{},"gz_args",[327,394,395],{"align":313},"launch parameters",[308,397,398,403,408],{},[327,399,400],{"align":313},[24,401,402],{},"ign_version",[327,404,405],{"align":313},[24,406,407],{},"gz_version",[327,409,395],{"align":313},[308,411,412,417,422],{},[327,413,414],{"align":313},[24,415,416],{},"IGN_GAZEBO_RESOURCE_PATH",[327,418,419],{"align":313},[24,420,421],{},"GZ_SIM_RESOURCE_PATH",[327,423,424],{"align":313},"Model/Resource Path",[308,426,427,432,437],{},[327,428,429],{"align":313},[24,430,431],{},"fuel.ignitionrobotics.org",[327,433,434],{"align":313},[24,435,436],{},"fuel.gazebosim.org",[327,438,439],{"align":313},"Gazebo Fuel URL",[441,442,444],"h5",{"id":443},"system-plugin","System plugin",[14,446,447],{},"Old writing method:",[109,449,451],{"className":184,"code":450,"language":186,"meta":114,"style":114},"\u003Cplugin filename=\"libignition-gazebo-physics-system.so\"\n        name=\"ignition::gazebo::systems::Physics\"/>\n",[24,452,453,466],{"__ignoreMap":114},[118,454,455,457,459,461,463],{"class":120,"line":121},[118,456,201],{"class":200},[118,458,205],{"class":204},[118,460,208],{"class":124},[118,462,211],{"class":200},[118,464,465],{"class":135},"\"libignition-gazebo-physics-system.so\"\n",[118,467,468,471,473,476],{"class":120,"line":197},[118,469,470],{"class":124},"        name",[118,472,211],{"class":200},[118,474,475],{"class":135},"\"ignition::gazebo::systems::Physics\"",[118,477,225],{"class":200},[14,479,480],{},"Writing style for Jazzy / Gazebo Harmonic:",[109,482,484],{"className":184,"code":483,"language":186,"meta":114,"style":114},"\u003Cplugin filename=\"gz-sim-physics-system\"\n        name=\"gz::sim::systems::Physics\"/>\n",[24,485,486,499],{"__ignoreMap":114},[118,487,488,490,492,494,496],{"class":120,"line":121},[118,489,201],{"class":200},[118,491,205],{"class":204},[118,493,208],{"class":124},[118,495,211],{"class":200},[118,497,498],{"class":135},"\"gz-sim-physics-system\"\n",[118,500,501,503,505,507],{"class":120,"line":197},[118,502,470],{"class":124},[118,504,211],{"class":200},[118,506,222],{"class":135},[118,508,225],{"class":200},[14,510,511],{},"Common System Plugins:",[302,513,514,524],{},[305,515,516],{},[308,517,518,521],{},[311,519,520],{"align":313},"old plugin",[311,522,523],{"align":313},"New plugin",[322,525,526,538,550,562,574,586,598],{},[308,527,528,533],{},[327,529,530],{"align":313},[24,531,532],{},"ignition-gazebo-physics-system",[327,534,535],{"align":313},[24,536,537],{},"gz-sim-physics-system",[308,539,540,545],{},[327,541,542],{"align":313},[24,543,544],{},"ignition-gazebo-sensors-system",[327,546,547],{"align":313},[24,548,549],{},"gz-sim-sensors-system",[308,551,552,557],{},[327,553,554],{"align":313},[24,555,556],{},"ignition-gazebo-scene-broadcaster-system",[327,558,559],{"align":313},[24,560,561],{},"gz-sim-scene-broadcaster-system",[308,563,564,569],{},[327,565,566],{"align":313},[24,567,568],{},"ignition-gazebo-user-commands-system",[327,570,571],{"align":313},[24,572,573],{},"gz-sim-user-commands-system",[308,575,576,581],{},[327,577,578],{"align":313},[24,579,580],{},"ignition-gazebo-contact-system",[327,582,583],{"align":313},[24,584,585],{},"gz-sim-contact-system",[308,587,588,593],{},[327,589,590],{"align":313},[24,591,592],{},"ignition-gazebo-diff-drive-system",[327,594,595],{"align":313},[24,596,597],{},"gz-sim-diff-drive-system",[308,599,600,605],{},[327,601,602],{"align":313},[24,603,604],{},"ignition-gazebo-joint-state-publisher-system",[327,606,607],{"align":313},[24,608,609],{},"gz-sim-joint-state-publisher-system",[441,611,613],{"id":612},"gui-tag","GUI tag",[14,615,616],{},"The old version of the Gazebo GUI configuration might be written as:",[109,618,620],{"className":184,"code":619,"language":186,"meta":114,"style":114},"\u003Cignition-gui>\n  \u003Cproperty type=\"string\" key=\"state\">docked\u003C/property>\n\u003C/ignition-gui>\n",[24,621,622,632,663],{"__ignoreMap":114},[118,623,624,626,629],{"class":120,"line":121},[118,625,201],{"class":200},[118,627,628],{"class":204},"ignition-gui",[118,630,631],{"class":200},">\n",[118,633,634,637,640,643,645,648,651,653,656,659,661],{"class":120,"line":197},[118,635,636],{"class":200},"  \u003C",[118,638,639],{"class":204},"property",[118,641,642],{"class":124}," type",[118,644,211],{"class":200},[118,646,647],{"class":135},"\"string\"",[118,649,650],{"class":124}," key",[118,652,211],{"class":200},[118,654,655],{"class":135},"\"state\"",[118,657,658],{"class":200},">docked\u003C/",[118,660,639],{"class":204},[118,662,631],{"class":200},[118,664,665,668,670],{"class":120,"line":228},[118,666,667],{"class":200},"\u003C/",[118,669,628],{"class":204},[118,671,631],{"class":200},[14,673,674],{},"Change \"Jazzy / Gazebo Harmonic\" to:",[109,676,678],{"className":184,"code":677,"language":186,"meta":114,"style":114},"\u003Cgz-gui>\n  \u003Cproperty type=\"string\" key=\"state\">docked\u003C/property>\n\u003C/gz-gui>\n",[24,679,680,689,713],{"__ignoreMap":114},[118,681,682,684,687],{"class":120,"line":121},[118,683,201],{"class":200},[118,685,686],{"class":204},"gz-gui",[118,688,631],{"class":200},[118,690,691,693,695,697,699,701,703,705,707,709,711],{"class":120,"line":197},[118,692,636],{"class":200},[118,694,639],{"class":204},[118,696,642],{"class":124},[118,698,211],{"class":200},[118,700,647],{"class":135},[118,702,650],{"class":124},[118,704,211],{"class":200},[118,706,655],{"class":135},[118,708,658],{"class":200},[118,710,639],{"class":204},[118,712,631],{"class":200},[118,714,715,717,719],{"class":120,"line":228},[118,716,667],{"class":200},[118,718,686],{"class":204},[118,720,631],{"class":200},[14,722,723],{},"You can check it with the following command:",[109,725,727],{"className":111,"code":726,"language":113,"meta":114,"style":114},"rg -n \"\u003Cignition-gui>|\u003C/ignition-gui>\" src\n",[24,728,729],{"__ignoreMap":114},[118,730,731,733,735,738],{"class":120,"line":121},[118,732,125],{"class":124},[118,734,129],{"class":128},[118,736,737],{"class":135}," \"\u003Cignition-gui>|\u003C/ignition-gui>\"",[118,739,139],{"class":135},[101,741,743],{"id":742},"gazebo-sensors-in-urdf-xacro","Gazebo sensors in URDF / Xacro",[14,745,746],{},"The sensor section is the most likely place to leave warnings when migrating to Jazzy.",[441,748,749],{"id":749},"always_on",[14,751,447],{},[109,753,755],{"className":184,"code":754,"language":186,"meta":114,"style":114},"\u003CalwaysOn>true\u003C/alwaysOn>\n",[24,756,757],{"__ignoreMap":114},[118,758,759,761,764,767,769],{"class":120,"line":121},[118,760,201],{"class":200},[118,762,763],{"class":204},"alwaysOn",[118,765,766],{"class":200},">true\u003C/",[118,768,763],{"class":204},[118,770,631],{"class":200},[14,772,773],{},"Jazzy / SDF Standard Format:",[109,775,777],{"className":184,"code":776,"language":186,"meta":114,"style":114},"\u003Calways_on>true\u003C/always_on>\n",[24,778,779],{"__ignoreMap":114},[118,780,781,783,785,787,789],{"class":120,"line":121},[118,782,201],{"class":200},[118,784,749],{"class":204},[118,786,766],{"class":200},[118,788,749],{"class":204},[118,790,631],{"class":200},[14,792,793],{},"If not changed, Gazebo may prompt:",[109,795,800],{"className":796,"code":798,"language":799,"meta":114},[797],"language-text","XML Element[alwaysOn], child of element[sensor], not defined in SDF.\n","text",[24,801,798],{"__ignoreMap":114},[441,803,805],{"id":804},"ignition_frame_id-gz_frame_id-and-pose-relative_to","ignition_frame_id / gz_frame_id and pose relative_to",[14,807,808],{},"The old way of writing might be:",[109,810,812],{"className":184,"code":811,"language":186,"meta":114,"style":114},"\u003Cignition_frame_id>laser\u003C/ignition_frame_id>\n",[24,813,814],{"__ignoreMap":114},[118,815,816,818,821,824,826],{"class":120,"line":121},[118,817,201],{"class":200},[118,819,820],{"class":204},"ignition_frame_id",[118,822,823],{"class":200},">laser\u003C/",[118,825,820],{"class":204},[118,827,631],{"class":200},[14,829,830],{},"Some Gazebo ROS migration documents will mention:",[109,832,834],{"className":184,"code":833,"language":186,"meta":114,"style":114},"\u003Cgz_frame_id>laser\u003C/gz_frame_id>\n",[24,835,836],{"__ignoreMap":114},[118,837,838,840,843,845,847],{"class":120,"line":121},[118,839,201],{"class":200},[118,841,842],{"class":204},"gz_frame_id",[118,844,823],{"class":200},[118,846,842],{"class":204},[118,848,631],{"class":200},[14,850,851,852,855],{},"However, in the current ROS2 Jazzy / Gazebo Harmonic toolchain, converting URDF to SDF typically outputs SDF 1.11, and SDF 1.11 does not have a standard ",[24,853,854],{},"\u003Cgz_frame_id>"," element. Therefore, the following may appear at startup:",[109,857,860],{"className":858,"code":859,"language":799,"meta":114},[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":114},[14,863,864],{},"But honestly, this warning is just a warning — in reality, this tag does take effect and must be used. Please ignore those warnings.",[14,866,867,868,871],{},"Then you can also add the following ",[24,869,870],{},"pose relative_to"," tag, which is provided in the official example.",[109,873,875],{"className":184,"code":874,"language":186,"meta":114,"style":114},"\u003Cpose relative_to=\"laser\">0 0 0 0 0 0\u003C/pose>\n",[24,876,877],{"__ignoreMap":114},[118,878,879,881,884,887,889,892,895,897],{"class":120,"line":121},[118,880,201],{"class":200},[118,882,883],{"class":204},"pose",[118,885,886],{"class":124}," relative_to",[118,888,211],{"class":200},[118,890,891],{"class":135},"\"laser\"",[118,893,894],{"class":200},">0 0 0 0 0 0\u003C/",[118,896,883],{"class":204},[118,898,631],{"class":200},[14,900,901],{},"Camera Example:",[109,903,905],{"className":184,"code":904,"language":186,"meta":114,"style":114},"\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":114},[118,908,909,911,914,916,918,921,923,925,928],{"class":120,"line":121},[118,910,201],{"class":200},[118,912,913],{"class":204},"sensor",[118,915,217],{"class":124},[118,917,211],{"class":200},[118,919,920],{"class":135},"\"cam_link\"",[118,922,642],{"class":124},[118,924,211],{"class":200},[118,926,927],{"class":135},"\"camera\"",[118,929,631],{"class":200},[118,931,932,934,937,940,942],{"class":120,"line":197},[118,933,636],{"class":200},[118,935,936],{"class":204},"update_rate",[118,938,939],{"class":200},">10.0\u003C/",[118,941,936],{"class":204},[118,943,631],{"class":200},[118,945,946,948,950,952,954],{"class":120,"line":228},[118,947,636],{"class":200},[118,949,749],{"class":204},[118,951,766],{"class":200},[118,953,749],{"class":204},[118,955,631],{"class":200},[118,957,959,961,963,965,967,969,971,973],{"class":120,"line":958},4,[118,960,636],{"class":200},[118,962,883],{"class":204},[118,964,886],{"class":124},[118,966,211],{"class":200},[118,968,927],{"class":135},[118,970,894],{"class":200},[118,972,883],{"class":204},[118,974,631],{"class":200},[118,976,978,980,982,985,987],{"class":120,"line":977},5,[118,979,636],{"class":200},[118,981,842],{"class":204},[118,983,984],{"class":200},">camera\u003C/",[118,986,842],{"class":204},[118,988,631],{"class":200},[118,990,992,994,997,1000,1002],{"class":120,"line":991},6,[118,993,636],{"class":200},[118,995,996],{"class":204},"topic",[118,998,999],{"class":200},">/image_raw\u003C/",[118,1001,996],{"class":204},[118,1003,631],{"class":200},[118,1005,1007,1009,1012,1014,1016,1019],{"class":120,"line":1006},7,[118,1008,636],{"class":200},[118,1010,1011],{"class":204},"camera",[118,1013,217],{"class":124},[118,1015,211],{"class":200},[118,1017,1018],{"class":135},"\"my_camera\"",[118,1020,631],{"class":200},[118,1022,1024],{"class":120,"line":1023},8,[118,1025,1026],{"class":200},"    ...\n",[118,1028,1030,1033,1035],{"class":120,"line":1029},9,[118,1031,1032],{"class":200},"  \u003C/",[118,1034,1011],{"class":204},[118,1036,631],{"class":200},[118,1038,1040,1042,1044],{"class":120,"line":1039},10,[118,1041,667],{"class":200},[118,1043,913],{"class":204},[118,1045,631],{"class":200},[14,1047,1048],{},"Radar Example:",[109,1050,1052],{"className":184,"code":1051,"language":186,"meta":114,"style":114},"\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":114},[118,1055,1056,1058,1060,1062,1064,1067,1069,1071,1073],{"class":120,"line":121},[118,1057,201],{"class":200},[118,1059,913],{"class":204},[118,1061,217],{"class":124},[118,1063,211],{"class":200},[118,1065,1066],{"class":135},"\"gpu_lidar\"",[118,1068,642],{"class":124},[118,1070,211],{"class":200},[118,1072,1066],{"class":135},[118,1074,631],{"class":200},[118,1076,1077,1079,1081,1084,1086],{"class":120,"line":197},[118,1078,636],{"class":200},[118,1080,996],{"class":204},[118,1082,1083],{"class":200},">scan\u003C/",[118,1085,996],{"class":204},[118,1087,631],{"class":200},[118,1089,1090,1092,1094,1097,1099],{"class":120,"line":228},[118,1091,636],{"class":200},[118,1093,936],{"class":204},[118,1095,1096],{"class":200},">30\u003C/",[118,1098,936],{"class":204},[118,1100,631],{"class":200},[118,1102,1103,1105,1107,1109,1111],{"class":120,"line":958},[118,1104,636],{"class":200},[118,1106,749],{"class":204},[118,1108,766],{"class":200},[118,1110,749],{"class":204},[118,1112,631],{"class":200},[118,1114,1115,1117,1120,1122,1124],{"class":120,"line":977},[118,1116,636],{"class":200},[118,1118,1119],{"class":204},"visualize",[118,1121,766],{"class":200},[118,1123,1119],{"class":204},[118,1125,631],{"class":200},[118,1127,1128,1130,1132,1134,1136,1138,1140,1142],{"class":120,"line":991},[118,1129,636],{"class":200},[118,1131,883],{"class":204},[118,1133,886],{"class":124},[118,1135,211],{"class":200},[118,1137,891],{"class":135},[118,1139,894],{"class":200},[118,1141,883],{"class":204},[118,1143,631],{"class":200},[118,1145,1146,1148,1150,1152,1154],{"class":120,"line":1006},[118,1147,636],{"class":200},[118,1149,842],{"class":204},[118,1151,823],{"class":200},[118,1153,842],{"class":204},[118,1155,631],{"class":200},[118,1157,1158,1160,1163],{"class":120,"line":1023},[118,1159,636],{"class":200},[118,1161,1162],{"class":204},"lidar",[118,1164,631],{"class":200},[118,1166,1167],{"class":120,"line":1029},[118,1168,1026],{"class":200},[118,1170,1171,1173,1175],{"class":120,"line":1039},[118,1172,1032],{"class":200},[118,1174,1162],{"class":204},[118,1176,631],{"class":200},[118,1178,1180,1182,1184],{"class":120,"line":1179},11,[118,1181,667],{"class":200},[118,1183,913],{"class":204},[118,1185,631],{"class":200},[14,1187,1188,1189,1191,1192,1194],{},"Note: ",[24,1190,870],{}," and ",[24,1193,842],{}," are not the same concept.",[60,1196,1197,1202],{},[63,1198,1199,1201],{},[24,1200,870],{},": Indicates the pose of the sensor relative to which link/frame, addressing the question of \"where the sensor is placed.\"",[63,1203,1204,1206],{},[24,1205,842],{},": Try specifying the frame ID in the sensor message to solve the problem of \"what to write in the message header.frame_id\".",[14,1208,1209,1210,1191,1212,1214],{},"It is recommended to use both ",[24,1211,870],{},[24,1213,854],{}," simultaneously.",[14,1216,1217],{},[239,1218],{"alt":114,"src":1219},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1743.webp",[14,1221,1222],{},[239,1223],{"alt":114,"src":1224},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1744.webp",[101,1226,1228],{"id":1227},"launch-file","Launch file",[14,1230,1231,1232,1235,1236,156,1239,35],{},"Jazzy uses ",[24,1233,1234],{},"ros_gz_sim"," to launch Gazebo, instead of the old ",[24,1237,1238],{},"ros_ign_gazebo",[24,1240,1241],{},"ros_ign",[14,1243,1244],{},"The old approach is often:",[109,1246,1250],{"className":1247,"code":1248,"language":1249,"meta":114,"style":114},"language-python shiki shiki-themes github-light github-dark","pkg_ros_ign_gazebo = get_package_share_directory(\"ros_ign_gazebo\")\n","python",[24,1251,1252],{"__ignoreMap":114},[118,1253,1254,1257,1260,1263,1266],{"class":120,"line":121},[118,1255,1256],{"class":200},"pkg_ros_ign_gazebo ",[118,1258,211],{"class":1259},"szBVR",[118,1261,1262],{"class":200}," get_package_share_directory(",[118,1264,1265],{"class":135},"\"ros_ign_gazebo\"",[118,1267,1268],{"class":200},")\n",[14,1270,1271],{},"Jazzy recommendation:",[109,1273,1275],{"className":1247,"code":1274,"language":1249,"meta":114,"style":114},"pkg_ros_gz_sim = get_package_share_directory(\"ros_gz_sim\")\n",[24,1276,1277],{"__ignoreMap":114},[118,1278,1279,1282,1284,1286,1289],{"class":120,"line":121},[118,1280,1281],{"class":200},"pkg_ros_gz_sim ",[118,1283,211],{"class":1259},[118,1285,1262],{"class":200},[118,1287,1288],{"class":135},"\"ros_gz_sim\"",[118,1290,1268],{"class":200},[14,1292,1293],{},"Launch file syntax for starting Gazebo:",[109,1295,1297],{"className":1247,"code":1296,"language":1249,"meta":114,"style":114},"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,1298,1299,1309,1314,1331,1342,1359,1364],{"__ignoreMap":114},[118,1300,1301,1304,1306],{"class":120,"line":121},[118,1302,1303],{"class":200},"gz_sim ",[118,1305,211],{"class":1259},[118,1307,1308],{"class":200}," IncludeLaunchDescription(\n",[118,1310,1311],{"class":120,"line":197},[118,1312,1313],{"class":200},"    PythonLaunchDescriptionSource(\n",[118,1315,1316,1319,1322,1325,1328],{"class":120,"line":228},[118,1317,1318],{"class":200},"        os.path.join(pkg_ros_gz_sim, ",[118,1320,1321],{"class":135},"\"launch\"",[118,1323,1324],{"class":200},", ",[118,1326,1327],{"class":135},"\"gz_sim.launch.py\"",[118,1329,1330],{"class":200},")),\n",[118,1332,1333,1337,1339],{"class":120,"line":958},[118,1334,1336],{"class":1335},"s4XuR","    launch_arguments",[118,1338,211],{"class":1259},[118,1340,1341],{"class":200},"{\n",[118,1343,1344,1347,1350,1353,1356],{"class":120,"line":977},[118,1345,1346],{"class":135},"        \"gz_args\"",[118,1348,1349],{"class":200},": ",[118,1351,1352],{"class":135},"\"-r \"",[118,1354,1355],{"class":1259}," +",[118,1357,1358],{"class":200}," world_file\n",[118,1360,1361],{"class":120,"line":991},[118,1362,1363],{"class":200},"    }.items(),\n",[118,1365,1366],{"class":120,"line":1006},[118,1367,1268],{"class":200},[14,1369,1370],{},"Note: Parameter names should also be changed:",[302,1372,1373,1383],{},[305,1374,1375],{},[308,1376,1377,1380],{},[311,1378,1379],{"align":313},"Humble / Ignition",[311,1381,1382],{"align":313},"Jazzy / Gazebo Harmonic",[322,1384,1385,1395],{},[308,1386,1387,1391],{},[327,1388,1389],{"align":313},[24,1390,387],{},[327,1392,1393],{"align":313},[24,1394,392],{},[308,1396,1397,1401],{},[327,1398,1399],{"align":313},[24,1400,402],{},[327,1402,1403],{"align":313},[24,1404,407],{},[14,1406,1407],{},"To spawn URDF / robot_description, Jazzy uses:",[109,1409,1411],{"className":1247,"code":1410,"language":1249,"meta":114,"style":114},"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,1412,1413,1423,1435,1447,1457,1469,1481,1486,1498],{"__ignoreMap":114},[118,1414,1415,1418,1420],{"class":120,"line":121},[118,1416,1417],{"class":200},"spawn ",[118,1419,211],{"class":1259},[118,1421,1422],{"class":200}," Node(\n",[118,1424,1425,1428,1430,1432],{"class":120,"line":197},[118,1426,1427],{"class":1335},"    package",[118,1429,211],{"class":1259},[118,1431,1288],{"class":135},[118,1433,1434],{"class":200},",\n",[118,1436,1437,1440,1442,1445],{"class":120,"line":228},[118,1438,1439],{"class":1335},"    executable",[118,1441,211],{"class":1259},[118,1443,1444],{"class":135},"\"create\"",[118,1446,1434],{"class":200},[118,1448,1449,1452,1454],{"class":120,"line":958},[118,1450,1451],{"class":1335},"    arguments",[118,1453,211],{"class":1259},[118,1455,1456],{"class":200},"[\n",[118,1458,1459,1462,1464,1467],{"class":120,"line":977},[118,1460,1461],{"class":135},"        \"-name\"",[118,1463,1324],{"class":200},[118,1465,1466],{"class":135},"\"mycar\"",[118,1468,1434],{"class":200},[118,1470,1471,1474,1476,1479],{"class":120,"line":991},[118,1472,1473],{"class":135},"        \"-topic\"",[118,1475,1324],{"class":200},[118,1477,1478],{"class":135},"\"/robot_description\"",[118,1480,1434],{"class":200},[118,1482,1483],{"class":120,"line":1006},[118,1484,1485],{"class":200},"    ],\n",[118,1487,1488,1491,1493,1496],{"class":120,"line":1023},[118,1489,1490],{"class":1335},"    output",[118,1492,211],{"class":1259},[118,1494,1495],{"class":135},"\"screen\"",[118,1497,1434],{"class":200},[118,1499,1500],{"class":120,"line":1029},[118,1501,1268],{"class":200},[101,1503,1505],{"id":1504},"ros-and-gazebo-message-bridging","ROS and Gazebo Message Bridging",[14,1507,1231,1508,1511],{},[24,1509,1510],{},"ros_gz_bridge",":",[109,1513,1515],{"className":1247,"code":1514,"language":1249,"meta":114,"style":114},"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,1516,1517,1526,1537,1548,1556,1563,1570,1577,1581],{"__ignoreMap":114},[118,1518,1519,1522,1524],{"class":120,"line":121},[118,1520,1521],{"class":200},"bridge ",[118,1523,211],{"class":1259},[118,1525,1422],{"class":200},[118,1527,1528,1530,1532,1535],{"class":120,"line":197},[118,1529,1427],{"class":1335},[118,1531,211],{"class":1259},[118,1533,1534],{"class":135},"\"ros_gz_bridge\"",[118,1536,1434],{"class":200},[118,1538,1539,1541,1543,1546],{"class":120,"line":228},[118,1540,1439],{"class":1335},[118,1542,211],{"class":1259},[118,1544,1545],{"class":135},"\"parameter_bridge\"",[118,1547,1434],{"class":200},[118,1549,1550,1552,1554],{"class":120,"line":958},[118,1551,1451],{"class":1335},[118,1553,211],{"class":1259},[118,1555,1456],{"class":200},[118,1557,1558,1561],{"class":120,"line":977},[118,1559,1560],{"class":135},"        \"/cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist\"",[118,1562,1434],{"class":200},[118,1564,1565,1568],{"class":120,"line":991},[118,1566,1567],{"class":135},"        \"/scan@sensor_msgs/msg/LaserScan@gz.msgs.LaserScan\"",[118,1569,1434],{"class":200},[118,1571,1572,1575],{"class":120,"line":1006},[118,1573,1574],{"class":135},"        \"/image_raw@sensor_msgs/msg/Image@gz.msgs.Image\"",[118,1576,1434],{"class":200},[118,1578,1579],{"class":120,"line":1023},[118,1580,1485],{"class":200},[118,1582,1583],{"class":120,"line":1029},[118,1584,1268],{"class":200},[14,1586,1587],{},"Checkpoint:",[60,1589,1590,1595,1601],{},[63,1591,1592,1593],{},"ROS package name is ",[24,1594,1510],{},[63,1596,1597,1598],{},"Gazebo message namespace uses ",[24,1599,1600],{},"gz.msgs.*",[63,1602,1603,1604,1607],{},"If the topic is not bridged out, first run ",[24,1605,1606],{},"gz topic -l"," to check the actual topic name on the Gazebo side, then modify the bridge parameters.",[101,1609,1611],{"id":1610},"packagexml-dependencies","package.xml dependencies",[14,1613,1614,1615,1191,1617,1324,1619,1621],{},"If the launch file uses ",[24,1616,1234],{},[24,1618,1510],{},[24,1620,171],{}," must also declare a runtime dependency.",[109,1623,1625],{"className":184,"code":1624,"language":186,"meta":114,"style":114},"\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":114},[118,1628,1629,1631,1634,1637,1639],{"class":120,"line":121},[118,1630,201],{"class":200},[118,1632,1633],{"class":204},"exec_depend",[118,1635,1636],{"class":200},">ros_gz_sim\u003C/",[118,1638,1633],{"class":204},[118,1640,631],{"class":200},[118,1642,1643,1645,1647,1650,1652],{"class":120,"line":197},[118,1644,201],{"class":200},[118,1646,1633],{"class":204},[118,1648,1649],{"class":200},">ros_gz_bridge\u003C/",[118,1651,1633],{"class":204},[118,1653,631],{"class":200},[118,1655,1656,1658,1660,1663,1665],{"class":120,"line":228},[118,1657,201],{"class":200},[118,1659,1633],{"class":204},[118,1661,1662],{"class":200},">geometry_msgs\u003C/",[118,1664,1633],{"class":204},[118,1666,631],{"class":200},[118,1668,1669,1671,1673,1676,1678],{"class":120,"line":958},[118,1670,201],{"class":200},[118,1672,1633],{"class":204},[118,1674,1675],{"class":200},">nav_msgs\u003C/",[118,1677,1633],{"class":204},[118,1679,631],{"class":200},[118,1681,1682,1684,1686,1689,1691],{"class":120,"line":977},[118,1683,201],{"class":200},[118,1685,1633],{"class":204},[118,1687,1688],{"class":200},">tf2_msgs\u003C/",[118,1690,1633],{"class":204},[118,1692,631],{"class":200},[118,1694,1695,1697,1699,1702,1704],{"class":120,"line":991},[118,1696,201],{"class":200},[118,1698,1633],{"class":204},[118,1700,1701],{"class":200},">sensor_msgs\u003C/",[118,1703,1633],{"class":204},[118,1705,631],{"class":200},[118,1707,1708,1710,1712,1715,1717],{"class":120,"line":1006},[118,1709,201],{"class":200},[118,1711,1633],{"class":204},[118,1713,1714],{"class":200},">rosgraph_msgs\u003C/",[118,1716,1633],{"class":204},[118,1718,631],{"class":200},[14,1720,1721],{},"If RViz is also launched, add that as well.",[109,1723,1725],{"className":184,"code":1724,"language":186,"meta":114,"style":114},"\u003Cexec_depend>rviz2\u003C/exec_depend>\n",[24,1726,1727],{"__ignoreMap":114},[118,1728,1729,1731,1733,1736,1738],{"class":120,"line":121},[118,1730,201],{"class":200},[118,1732,1633],{"class":204},[118,1734,1735],{"class":200},">rviz2\u003C/",[118,1737,1633],{"class":204},[118,1739,631],{"class":200},[101,1741,1743],{"id":1742},"fuel-url-and-model-path","Fuel URL and model path",[14,1745,1746],{},"Old Fuel URL (the old link actually still works, as it redirects to the new link):",[109,1748,1750],{"className":184,"code":1749,"language":186,"meta":114,"style":114},"\u003Curi>https://fuel.ignitionrobotics.org/1.0/openrobotics/models/Playground\u003C/uri>\n",[24,1751,1752],{"__ignoreMap":114},[118,1753,1754,1756,1759,1762,1764],{"class":120,"line":121},[118,1755,201],{"class":200},[118,1757,1758],{"class":204},"uri",[118,1760,1761],{"class":200},">https://fuel.ignitionrobotics.org/1.0/openrobotics/models/Playground\u003C/",[118,1763,1758],{"class":204},[118,1765,631],{"class":200},[14,1767,1768],{},"New Fuel URL:",[109,1770,1772],{"className":184,"code":1771,"language":186,"meta":114,"style":114},"\u003Curi>https://fuel.gazebosim.org/1.0/openrobotics/models/Playground\u003C/uri>\n",[24,1773,1774],{"__ignoreMap":114},[118,1775,1776,1778,1780,1783,1785],{"class":120,"line":121},[118,1777,201],{"class":200},[118,1779,1758],{"class":204},[118,1781,1782],{"class":200},">https://fuel.gazebosim.org/1.0/openrobotics/models/Playground\u003C/",[118,1784,1758],{"class":204},[118,1786,631],{"class":200},[14,1788,1789],{},"Do not blindly change the local model path. For example:",[109,1791,1793],{"className":184,"code":1792,"language":186,"meta":114,"style":114},"\u003Curi>file:///home/xxx/ROS_WS/ign_models/bed\u003C/uri>\n",[24,1794,1795],{"__ignoreMap":114},[118,1796,1797,1799,1801,1804,1806],{"class":120,"line":121},[118,1798,201],{"class":200},[118,1800,1758],{"class":204},[118,1802,1803],{"class":200},">file:///home/xxx/ROS_WS/ign_models/bed\u003C/",[118,1805,1758],{"class":204},[118,1807,631],{"class":200},[14,1809,1810,1811,1814],{},"The ",[24,1812,1813],{},"ign_models"," here might just be a folder name you created yourself, not a Gazebo API name. As long as this directory actually exists, you can keep it.",[14,1816,1817,1818,1820,1821,1511],{},"If you want to change to a more general model path, you can set the following macro, changing it from ",[24,1819,416],{}," to ",[24,1822,421],{},[109,1824,1826],{"className":111,"code":1825,"language":113,"meta":114,"style":114},"export GZ_SIM_RESOURCE_PATH=/path/to/model_parent\n",[24,1827,1828],{"__ignoreMap":114},[118,1829,1830,1833,1836,1838],{"class":120,"line":121},[118,1831,1832],{"class":1259},"export",[118,1834,1835],{"class":200}," GZ_SIM_RESOURCE_PATH",[118,1837,211],{"class":1259},[118,1839,1840],{"class":200},"/path/to/model_parent\n",[14,1842,1843],{},"Then write in the SDF:",[109,1845,1847],{"className":184,"code":1846,"language":186,"meta":114,"style":114},"\u003Curi>model://bed\u003C/uri>\n",[24,1848,1849],{"__ignoreMap":114},[118,1850,1851,1853,1855,1858,1860],{"class":120,"line":121},[118,1852,201],{"class":200},[118,1854,1758],{"class":204},[118,1856,1857],{"class":200},">model://bed\u003C/",[118,1859,1758],{"class":204},[118,1861,631],{"class":200},[101,1863,1865],{"id":1864},"command-line-migration","Command line migration",[302,1867,1868,1878],{},[305,1869,1870],{},[308,1871,1872,1875],{},[311,1873,1874],{"align":313},"Humble / Ignition commands",[311,1876,1877],{"align":313},"Jazzy / Gazebo Harmonic Commands",[322,1879,1880,1892,1904,1915],{},[308,1881,1882,1887],{},[327,1883,1884],{"align":313},[24,1885,1886],{},"ign gazebo world.sdf",[327,1888,1889],{"align":313},[24,1890,1891],{},"gz sim world.sdf",[308,1893,1894,1899],{},[327,1895,1896],{"align":313},[24,1897,1898],{},"ign gazebo -r world.sdf",[327,1900,1901],{"align":313},[24,1902,1903],{},"gz sim -r world.sdf",[308,1905,1906,1911],{},[327,1907,1908],{"align":313},[24,1909,1910],{},"ign topic -l",[327,1912,1913],{"align":313},[24,1914,1606],{},[308,1916,1917,1922],{},[327,1918,1919],{"align":313},[24,1920,1921],{},"ign topic -e -t /scan",[327,1923,1924],{"align":313},[24,1925,1926],{},"gz topic -e -t /scan",[14,1928,1929],{},"ROS launch is still used:",[109,1931,1933],{"className":111,"code":1932,"language":113,"meta":114,"style":114},"ros2 launch 包名 launch文件.py\n",[24,1934,1935],{"__ignoreMap":114},[118,1936,1937,1940,1943,1946],{"class":120,"line":121},[118,1938,1939],{"class":124},"ros2",[118,1941,1942],{"class":135}," launch",[118,1944,1945],{"class":135}," 包名",[118,1947,1948],{"class":135}," launch文件.py\n",[101,1950,1952],{"id":1951},"verification-sequence-after-migration","Verification sequence after migration",[441,1954,1956],{"id":1955},"_1-check-if-xml-sdf-is-valid","1. Check if XML / SDF is valid",[109,1958,1960],{"className":111,"code":1959,"language":113,"meta":114,"style":114},"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,1961,1962,1973,1982],{"__ignoreMap":114},[118,1963,1964,1967,1970],{"class":120,"line":121},[118,1965,1966],{"class":124},"xmllint",[118,1968,1969],{"class":128}," --noout",[118,1971,1972],{"class":135}," src/demo_gazebo_sim/world/house.sdf\n",[118,1974,1975,1977,1979],{"class":120,"line":197},[118,1976,1966],{"class":124},[118,1978,1969],{"class":128},[118,1980,1981],{"class":135}," src/demo_gazebo_sim/world/visualize_lidar.sdf\n",[118,1983,1984,1986,1988],{"class":120,"line":228},[118,1985,1966],{"class":124},[118,1987,1969],{"class":128},[118,1989,1990],{"class":135}," src/mycar_description/urdf/xacro/gazebo_sensor.urdf.xacro\n",[441,1992,1994],{"id":1993},"_2-check-if-xacro-can-generate-urdf","2. Check if xacro can generate URDF",[109,1996,1998],{"className":111,"code":1997,"language":113,"meta":114,"style":114},"source /opt/ros/jazzy/setup.bash\nxacro src/mycar_description/urdf/xacro/car.urdf.xacro -o /tmp/car_check.urdf\n",[24,1999,2000,2008],{"__ignoreMap":114},[118,2001,2002,2005],{"class":120,"line":121},[118,2003,2004],{"class":128},"source",[118,2006,2007],{"class":135}," /opt/ros/jazzy/setup.bash\n",[118,2009,2010,2013,2016,2019],{"class":120,"line":197},[118,2011,2012],{"class":124},"xacro",[118,2014,2015],{"class":135}," src/mycar_description/urdf/xacro/car.urdf.xacro",[118,2017,2018],{"class":128}," -o",[118,2020,2021],{"class":135}," /tmp/car_check.urdf\n",[441,2023,2025],{"id":2024},"_3-check-if-there-are-still-warnings-when-converting-gazebo-to-sdf","3. Check if there are still warnings when converting Gazebo to SDF",[109,2027,2029],{"className":111,"code":2028,"language":113,"meta":114,"style":114},"gz sdf -p /tmp/car_check.urdf\n",[24,2030,2031],{"__ignoreMap":114},[118,2032,2033,2035,2038,2041],{"class":120,"line":121},[118,2034,254],{"class":124},[118,2036,2037],{"class":135}," sdf",[118,2039,2040],{"class":128}," -p",[118,2042,2021],{"class":135},[14,2044,2045,2046,2048,2049,2051],{},"If there are still ",[24,2047,842],{}," or ",[24,2050,763],{}," warnings, go back to the sensor section and continue making changes.",[441,2053,2055],{"id":2054},"_4-building-the-project","4. Building the Project",[109,2057,2059],{"className":111,"code":2058,"language":113,"meta":114,"style":114},"colcon build --symlink-install\nsource install/setup.bash\n",[24,2060,2061,2072],{"__ignoreMap":114},[118,2062,2063,2066,2069],{"class":120,"line":121},[118,2064,2065],{"class":124},"colcon",[118,2067,2068],{"class":135}," build",[118,2070,2071],{"class":128}," --symlink-install\n",[118,2073,2074,2076],{"class":120,"line":197},[118,2075,2004],{"class":128},[118,2077,2078],{"class":135}," install/setup.bash\n",[441,2080,2082],{"id":2081},"_5-launch-gazebo","5. Launch Gazebo",[109,2084,2086],{"className":111,"code":2085,"language":113,"meta":114,"style":114},"ros2 launch demo_gazebo_sim gazebo_sim_world.launch.py\nros2 launch demo_gazebo_sim gazebo_sim_robot_world.launch.py\n",[24,2087,2088,2100],{"__ignoreMap":114},[118,2089,2090,2092,2094,2097],{"class":120,"line":121},[118,2091,1939],{"class":124},[118,2093,1942],{"class":135},[118,2095,2096],{"class":135}," demo_gazebo_sim",[118,2098,2099],{"class":135}," gazebo_sim_world.launch.py\n",[118,2101,2102,2104,2106,2108],{"class":120,"line":197},[118,2103,1939],{"class":124},[118,2105,1942],{"class":135},[118,2107,2096],{"class":135},[118,2109,2110],{"class":135}," gazebo_sim_robot_world.launch.py\n",[14,2112,2113],{},"You can also run just the Gazebo server for a quick check:",[109,2115,2117],{"className":111,"code":2116,"language":113,"meta":114,"style":114},"gz sim -s -r -v 2 src/demo_gazebo_sim/world/house.sdf --iterations 1\n",[24,2118,2119],{"__ignoreMap":114},[118,2120,2121,2123,2126,2129,2132,2135,2138,2141,2144],{"class":120,"line":121},[118,2122,254],{"class":124},[118,2124,2125],{"class":135}," sim",[118,2127,2128],{"class":128}," -s",[118,2130,2131],{"class":128}," -r",[118,2133,2134],{"class":128}," -v",[118,2136,2137],{"class":128}," 2",[118,2139,2140],{"class":135}," src/demo_gazebo_sim/world/house.sdf",[118,2142,2143],{"class":128}," --iterations",[118,2145,2146],{"class":128}," 1\n",[101,2148,2150],{"id":2149},"common-error-troubleshooting","Common Error Troubleshooting",[441,2152,2154],{"id":2153},"plugin-not-found","Plugin not found",[14,2156,2157],{},"Check if it still says:",[109,2159,2162],{"className":2160,"code":2161,"language":799,"meta":114},[797],"ignition-gazebo-*\nlibignition-gazebo-*.so\nignition::gazebo::systems::*\n",[24,2163,2161],{"__ignoreMap":114},[14,2165,2166],{},"Jazzy should be changed to:",[109,2168,2171],{"className":2169,"code":2170,"language":799,"meta":114},[797],"gz-sim-*-system\ngz::sim::systems::*\n",[24,2172,2170],{"__ignoreMap":114},[441,2174,2176],{"id":2175},"gui-tag-warning","GUI tag warning",[14,2178,2179],{},"Check if there are any remaining:",[109,2181,2183],{"className":184,"code":2182,"language":186,"meta":114,"style":114},"\u003Cignition-gui>\n",[24,2184,2185],{"__ignoreMap":114},[118,2186,2187,2189,2191],{"class":120,"line":121},[118,2188,201],{"class":200},[118,2190,628],{"class":204},[118,2192,631],{"class":200},[14,2194,2166],{},[109,2196,2198],{"className":184,"code":2197,"language":186,"meta":114,"style":114},"\u003Cgz-gui>\n",[24,2199,2200],{"__ignoreMap":114},[118,2201,2202,2204,2206],{"class":120,"line":121},[118,2203,201],{"class":200},[118,2205,686],{"class":204},[118,2207,631],{"class":200},[441,2209,2211],{"id":2210},"sensor-warning","Sensor warning",[14,2213,2179],{},[109,2215,2217],{"className":184,"code":2216,"language":186,"meta":114,"style":114},"\u003CalwaysOn>\n\u003Cignition_frame_id>\n",[24,2218,2219,2227],{"__ignoreMap":114},[118,2220,2221,2223,2225],{"class":120,"line":121},[118,2222,201],{"class":200},[118,2224,763],{"class":204},[118,2226,631],{"class":200},[118,2228,2229,2231,2233],{"class":120,"line":197},[118,2230,201],{"class":200},[118,2232,820],{"class":204},[118,2234,631],{"class":200},[14,2236,2237],{},"Suggestion to change to:",[109,2239,2241],{"className":184,"code":2240,"language":186,"meta":114,"style":114},"\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,2242,2243,2255,2273],{"__ignoreMap":114},[118,2244,2245,2247,2249,2251,2253],{"class":120,"line":121},[118,2246,201],{"class":200},[118,2248,749],{"class":204},[118,2250,766],{"class":200},[118,2252,749],{"class":204},[118,2254,631],{"class":200},[118,2256,2257,2259,2261,2263,2265,2267,2269,2271],{"class":120,"line":197},[118,2258,201],{"class":200},[118,2260,883],{"class":204},[118,2262,886],{"class":124},[118,2264,211],{"class":200},[118,2266,891],{"class":135},[118,2268,894],{"class":200},[118,2270,883],{"class":204},[118,2272,631],{"class":200},[118,2274,2275,2277,2279,2281,2283],{"class":120,"line":228},[118,2276,201],{"class":200},[118,2278,842],{"class":204},[118,2280,823],{"class":200},[118,2282,842],{"class":204},[118,2284,631],{"class":200},[14,2286,2287],{},"or",[109,2289,2291],{"className":184,"code":2290,"language":186,"meta":114,"style":114},"\u003Cpose relative_to=\"camera\">0 0 0 0 0 0\u003C/pose>\n\u003Cgz_frame_id>camera\u003C/gz_frame_id>\n",[24,2292,2293,2311],{"__ignoreMap":114},[118,2294,2295,2297,2299,2301,2303,2305,2307,2309],{"class":120,"line":121},[118,2296,201],{"class":200},[118,2298,883],{"class":204},[118,2300,886],{"class":124},[118,2302,211],{"class":200},[118,2304,927],{"class":135},[118,2306,894],{"class":200},[118,2308,883],{"class":204},[118,2310,631],{"class":200},[118,2312,2313,2315,2317,2319,2321],{"class":120,"line":197},[118,2314,201],{"class":200},[118,2316,842],{"class":204},[118,2318,984],{"class":200},[118,2320,842],{"class":204},[118,2322,631],{"class":200},[441,2324,2326],{"id":2325},"robot_state_publisher-kdl-root-link-inertia-warning","robot_state_publisher KDL root link inertia warning",[14,2328,2329],{},"If the log shows:",[109,2331,2334],{"className":2332,"code":2333,"language":799,"meta":114},[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,2335,2333],{"__ignoreMap":114},[14,2337,2338,2339,2342],{},"The URDF root link includes ",[24,2340,2341],{},"\u003Cinertial>",", which KDL does not support.",[441,2344,2346],{"id":2345},"changed-the-xacro-but-the-log-still-shows-the-old-content","Changed the xacro but the log still shows the old content.",[14,2348,2349],{},"First, confirm that the old launch has been stopped:",[109,2351,2353],{"className":111,"code":2352,"language":113,"meta":114,"style":114},"pgrep -af \"gazebo|gz sim|robot_state_publisher|parameter_bridge\"\n",[24,2354,2355],{"__ignoreMap":114},[118,2356,2357,2360,2363],{"class":120,"line":121},[118,2358,2359],{"class":124},"pgrep",[118,2361,2362],{"class":128}," -af",[118,2364,2365],{"class":135}," \"gazebo|gz sim|robot_state_publisher|parameter_bridge\"\n",[14,2367,2368,2369,2372,2373,2376,2377,35],{},"If the old ",[24,2370,2371],{},"robot_state_publisher"," is still present, ",[24,2374,2375],{},"ros_gz_sim create"," in the same ROS graph might retrieve the model from the old ",[24,2378,2379],{},"/robot_description",[14,2381,2382],{},"After stopping the old process, rebuild, source, and start:",[109,2384,2386],{"className":111,"code":2385,"language":113,"meta":114,"style":114},"colcon build --symlink-install\nsource install/setup.bash\nros2 launch demo_gazebo_sim gazebo_sim_robot_world.launch.py\n",[24,2387,2388,2396,2402],{"__ignoreMap":114},[118,2389,2390,2392,2394],{"class":120,"line":121},[118,2391,2065],{"class":124},[118,2393,2068],{"class":135},[118,2395,2071],{"class":128},[118,2397,2398,2400],{"class":120,"line":197},[118,2399,2004],{"class":128},[118,2401,2078],{"class":135},[118,2403,2404,2406,2408,2410],{"class":120,"line":228},[118,2405,1939],{"class":124},[118,2407,1942],{"class":135},[118,2409,2096],{"class":135},[118,2411,2110],{"class":135},[441,2413,2415],{"id":2414},"qstandardpaths-libegl-warning","QStandardPaths / libEGL warning",[14,2417,2418],{},"If only this remains in the log:",[109,2420,2423],{"className":2421,"code":2422,"language":799,"meta":114},[797],"QStandardPaths: runtime directory '/run/user/1000' is not owned by UID 0\nlibEGL warning: egl: failed to create dri2 screen\n",[24,2424,2422],{"__ignoreMap":114},[14,2426,2427],{},"This is usually not a Gazebo migration error, but a warning caused by launching the GUI or graphics rendering environment as root. It is recommended to run ROS/Gazebo as a regular user, or check the graphics driver, Mesa, and EGL environment.",[101,2429,2431],{"id":2430},"finally-scan-through-the-old-references-one-more-time","Finally, scan through the old references one more time.",[14,2433,2434],{},"Functional Old Reference Check:",[109,2436,2438],{"className":111,"code":2437,"language":113,"meta":114,"style":114},"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,2439,2440],{"__ignoreMap":114},[118,2441,2442,2444,2446,2449,2452,2455,2457,2460,2463,2466,2468,2471],{"class":120,"line":121},[118,2443,125],{"class":124},[118,2445,129],{"class":128},[118,2447,2448],{"class":135}," \"filename=['",[118,2450,2451],{"class":128},"\\\"",[118,2453,2454],{"class":135},"](lib)?ignition|name=['",[118,2456,2451],{"class":128},[118,2458,2459],{"class":135},"]ignition::gazebo|\u003Cignition-gui>|\u003C/ignition-gui>|\u003Cignition_frame_id>|\u003C/ignition_frame_id>|\u003Cgz_frame_id>|\u003C/gz_frame_id>|fuel",[118,2461,2462],{"class":128},"\\\\",[118,2464,2465],{"class":135},".ignitionrobotics",[118,2467,2462],{"class":128},[118,2469,2470],{"class":135},".org|ros_ign|ign_args|ign_version|alwaysOn\"",[118,2472,139],{"class":135},[14,2474,2475],{},"Official documentation reminder for false replacement check:",[109,2477,2479],{"className":111,"code":2478,"language":113,"meta":114,"style":114},"rg -n -i \"gz-gazebo|gzition|an gz\" src\n",[24,2480,2481],{"__ignoreMap":114},[118,2482,2483,2485,2487,2489,2492],{"class":120,"line":121},[118,2484,125],{"class":124},[118,2486,129],{"class":128},[118,2488,132],{"class":128},[118,2490,2491],{"class":135}," \"gz-gazebo|gzition|an gz\"",[118,2493,139],{"class":135},[14,2495,2496],{},"If the old syntax is only found in Chinese comments or tutorials, but not in the functional code, it's generally been fully migrated.",[2498,2499,2500],"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":114,"searchDepth":197,"depth":197,"links":2502},[2503],{"id":12,"depth":228,"text":5},"/en-us/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim","11.4",11040000,"2023-12-30","wiki/2023-12-30-ros2-tutorial","en-us:2023-12-30-ros2-tutorial","/en-us/wiki/2023-12-30-ros2-tutorial","Ros2 Tutorial","md","wiki/2023-12-30-ros2-tutorial/ch11-4-Igngz2gzsim",false,true,null,"en-US","en-us",{},{"title":5,"description":114},"/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-4-Igngz2gzsim","hAggMIKyePMruic4I4Qf7m5j1Qx9xs952cpdOzlmQCA",[2525,2531,2537,2543,2549,2555,2556,2562,2568,2574,2580,2586,2592,2598,2604,2610,2616,2622,2627,2633,2638,2644,2650,2656,2662,2668,2674,2680,2686,2692,2698,2704,2710,2716,2722,2728,2734,2740,2746,2752,2758,2764,2770,2776,2782,2788,2794,2800,2806,2812,2818,2824,2830,2836,2842,2848,2854,2860,2866,2872],{"path":2526,"stem":2527,"title":2528,"date":2507,"chapter":2529,"chapterSort":2530,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch1-ros2-jie-shao","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch1-ROS2介绍","Introduction to ROS2","1",1000000,{"path":2532,"stem":2533,"title":2534,"date":2507,"chapter":2535,"chapterSort":2536,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch10-Stage_Ros2仿真平台","Stage_Ros2 Simulation Platform","10",10000000,{"path":2538,"stem":2539,"title":2540,"date":2507,"chapter":2541,"chapterSort":2542,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch11-1-gazeboclassic","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-1-GazeboClassic","Gezebo Classic","11.1",11010000,{"path":2544,"stem":2545,"title":2546,"date":2507,"chapter":2547,"chapterSort":2548,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch11-2-ignitiongazebo","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-2-IgnitionGazebo","Ignition Gazebo（Gazebo Fortress）","11.2",11020000,{"path":2550,"stem":2551,"title":2552,"date":2507,"chapter":2553,"chapterSort":2554,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch11-3-gazebosim","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-3-GazeboSim","Gz Sim（Gazebo Harmonic）","11.3",11030000,{"path":2504,"stem":2522,"title":5,"date":2507,"chapter":2505,"chapterSort":2506,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},{"path":2557,"stem":2558,"title":2559,"date":2507,"chapter":2560,"chapterSort":2561,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch11-gezebo-fang-zhen-ping-tai","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-Gezebo仿真平台","Gazebo simulation platform","11",11000000,{"path":2563,"stem":2564,"title":2565,"date":2507,"chapter":2566,"chapterSort":2567,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch12-1-Humble版本","Humble Navigation Simulation","12.1",12010000,{"path":2569,"stem":2570,"title":2571,"date":2507,"chapter":2572,"chapterSort":2573,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch12-2-Jazzy版本","Jazzy Navigation Simulation","12.2",12020000,{"path":2575,"stem":2576,"title":2577,"date":2507,"chapter":2578,"chapterSort":2579,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch12-3-humble2jazzy","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch12-3-Humble2Jazzy","Differences in Navigation between Humble and Jazzy","12.3",12030000,{"path":2581,"stem":2582,"title":2583,"date":2507,"chapter":2584,"chapterSort":2585,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch12-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch12-机器人导航Navigation2(仿真篇)","Robot Navigation with Navigation2 (Simulation)","12",12000000,{"path":2587,"stem":2588,"title":2589,"date":2507,"chapter":2590,"chapterSort":2591,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-1-boost-aiso","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-1-Boost.Aiso","Boost.Asio库","13.1.1",13010100,{"path":2593,"stem":2594,"title":2595,"date":2507,"chapter":2596,"chapterSort":2597,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-2-ros2-serial-driver","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-2-ros2_serial_driver","ROS2 Serial Driver Library","13.1.2",13010200,{"path":2599,"stem":2600,"title":2601,"date":2507,"chapter":2602,"chapterSort":2603,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-chuan-kou-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-串口通信","UART serial communication","13.1",13010000,{"path":2605,"stem":2606,"title":2607,"date":2507,"chapter":2608,"chapterSort":2609,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-1-socketcan","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-1-socketcan","SocketCAN","13.2.1",13020100,{"path":2611,"stem":2612,"title":2613,"date":2507,"chapter":2614,"chapterSort":2615,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-2-ros2-socketcan","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-2-ros2_socketcan","ROS2_SocketCAN","13.2.2",13020200,{"path":2617,"stem":2618,"title":2619,"date":2507,"chapter":2620,"chapterSort":2621,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-can-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-CAN通信","CAN communication","13.2",13020000,{"path":2623,"stem":2624,"title":2589,"date":2507,"chapter":2625,"chapterSort":2626,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-3-1-boost-aiso","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-3-1-Boost.Aiso","13.3.1",13030100,{"path":2628,"stem":2629,"title":2630,"date":2507,"chapter":2631,"chapterSort":2632,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-3-tcp-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-3-TCP通信","TCP communication","13.3",13030000,{"path":2634,"stem":2635,"title":2589,"date":2507,"chapter":2636,"chapterSort":2637,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-4-1-boost-aiso","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-4-1-Boost.Aiso","13.4.1",13040100,{"path":2639,"stem":2640,"title":2641,"date":2507,"chapter":2642,"chapterSort":2643,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-4-udp-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-4-UDP通信","UDP communication","13.4",13040000,{"path":2645,"stem":2646,"title":2647,"date":2507,"chapter":2648,"chapterSort":2649,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-linux-ying-jian-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-Linux硬件通信","Linux hardware communication","13",13000000,{"path":2651,"stem":2652,"title":2653,"date":2507,"chapter":2654,"chapterSort":2655,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-1-ji-qi-ren-zu-cheng","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-1-机器人组成","Robot Composition","14.1",14010000,{"path":2657,"stem":2658,"title":2659,"date":2507,"chapter":2660,"chapterSort":2661,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-1-yuan-cheng-kai-fa-ssh","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-1-远程开发SSH","Remote Development SSH","14.2.1",14020100,{"path":2663,"stem":2664,"title":2665,"date":2507,"chapter":2666,"chapterSort":2667,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-2-yuan-cheng-fang-wen-zhuo-mian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-2-远程访问桌面","Remote Desktop Access","14.2.2",14020200,{"path":2669,"stem":2670,"title":2671,"date":2507,"chapter":2672,"chapterSort":2673,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-gong-kong-ji-zhi-yuan-cheng-kai-fa-huan-jing","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-工控机之远程开发环境","Remote Development Environment for Industrial PC","14.2",14020000,{"path":2675,"stem":2676,"title":2677,"date":2507,"chapter":2678,"chapterSort":2679,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-3-gong-kong-ji-zhi-wai-jie-usb-she-bei","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-3-工控机之外接USB设备","External USB Devices for the Industrial PC","14.3",14030000,{"path":2681,"stem":2682,"title":2683,"date":2507,"chapter":2684,"chapterSort":2685,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-4-fen-bu-shi-da-jian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-4-分布式搭建","Distributed setup","14.4",14040000,{"path":2687,"stem":2688,"title":2689,"date":2507,"chapter":2690,"chapterSort":2691,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-5-you-hua-ri-zhi","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-5-优化日志","Optimize logs","14.5",14050000,{"path":2693,"stem":2694,"title":2695,"date":2507,"chapter":2696,"chapterSort":2697,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-1-li-cheng-ji-odom","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-1-里程计Odom","odometry","14.6.1",14060100,{"path":2699,"stem":2700,"title":2701,"date":2507,"chapter":2702,"chapterSort":2703,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-2-guan-xing-ji-imu","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-2-惯性计IMU","Inertial Measurement Unit (IMU)","14.6.2",14060200,{"path":2705,"stem":2706,"title":2707,"date":2507,"chapter":2708,"chapterSort":2709,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-3-ji-guang-lei-da-lidar","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-3-激光雷达LiDAR","LiDAR","14.6.3",14060300,{"path":2711,"stem":2712,"title":2713,"date":2507,"chapter":2714,"chapterSort":2715,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-4-xiang-ji-camera","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-4-相机Camera","Camera","14.6.4",14060400,{"path":2717,"stem":2718,"title":2719,"date":2507,"chapter":2720,"chapterSort":2721,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-5-quan-qiu-ding-wei-gnss","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-5-全球定位GNSS","Global Navigation Satellite System (GNSS)","14.6.5",14060500,{"path":2723,"stem":2724,"title":2725,"date":2507,"chapter":2726,"chapterSort":2727,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-6-shou-bing-joy","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-6-手柄joy","The query \"手柄JOY\" is a bit ambiguous. To help you better, could you please provide more details? For example:","14.6.6",14060600,{"path":2729,"stem":2730,"title":2731,"date":2507,"chapter":2732,"chapterSort":2733,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-7-jian-pan-kong-zhi-jie-dian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-7-键盘控制节点","Keyboard control node","14.6.7",14060700,{"path":2735,"stem":2736,"title":2737,"date":2507,"chapter":2738,"chapterSort":2739,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-ying-jian-ping-tai","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-硬件平台","Hardware platform","14.6",14060000,{"path":2741,"stem":2742,"title":2743,"date":2507,"chapter":2744,"chapterSort":2745,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-7-zuo-biao-xi-yu-hua-ti-guan-xi","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-7-坐标系与话题关系","Coordinate System and Topic Relationship","14.7",14070000,{"path":2747,"stem":2748,"title":2749,"date":2507,"chapter":2750,"chapterSort":2751,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-1-lun-shi-li-cheng-ji-biao-ding","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-1-轮式里程计标定","Wheel odometry calibration","14.8.1.1",14080101,{"path":2753,"stem":2754,"title":2755,"date":2507,"chapter":2756,"chapterSort":2757,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-2-lun-shi-li-cheng-ji-yu-imu-rong-he","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-2-轮式里程计与IMU融合","Fusion of Wheel Odometry and IMU","14.8.1.2",14080102,{"path":2759,"stem":2760,"title":2761,"date":2507,"chapter":2762,"chapterSort":2763,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-lun-shi-li-cheng-ji-biao-ding-yu-rong-he","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-轮式里程计标定与融合","Wheel odometry calibration and fusion","14.8.1",14080100,{"path":2765,"stem":2766,"title":2767,"date":2507,"chapter":2768,"chapterSort":2769,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-2-ji-guang-lei-da-gong-ju","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-2-激光雷达工具","Lidar Tool","14.8.2",14080200,{"path":2771,"stem":2772,"title":2773,"date":2507,"chapter":2774,"chapterSort":2775,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-3-xiang-ji-shi-yong-jin-jie","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-3-相机使用进阶","Advanced Camera Usage","14.8.3",14080300,{"path":2777,"stem":2778,"title":2779,"date":2507,"chapter":2780,"chapterSort":2781,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-ying-jian-ping-tai-jin-jie","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-硬件平台进阶","Advanced Hardware Platform","14.8",14080000,{"path":2783,"stem":2784,"title":2785,"date":2507,"chapter":2786,"chapterSort":2787,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-ji-qi-ren-ying-jian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-机器人硬件","Robot hardware","14",14000000,{"path":2789,"stem":2790,"title":2791,"date":2507,"chapter":2792,"chapterSort":2793,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch15-ros2-control","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch15-ROS2_Control","ROS2_Control","15",15000000,{"path":2795,"stem":2796,"title":2797,"date":2507,"chapter":2798,"chapterSort":2799,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch16-moveit2-gong-ye-ji-qi-ren-ji-xie-bi","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch16-Moveit2工业机器人机械臂","MoveIt2 industrial robot arm","16",16000000,{"path":2801,"stem":2802,"title":2803,"date":2507,"chapter":2804,"chapterSort":2805,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch17-ji-qi-ren-dao-hang-navigation2-shi-ti-pian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch17-机器人导航Navigation2(实体篇)","Robot Navigation with Navigation2 (Physical Robot)","17",17000000,{"path":2807,"stem":2808,"title":2809,"date":2507,"chapter":2810,"chapterSort":2811,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch18-microros","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch18-MicroROS","MicroROS","18",18000000,{"path":2813,"stem":2814,"title":2815,"date":2507,"chapter":2816,"chapterSort":2817,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch19-webots-fang-zhen-ping-tai","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch19-Webots仿真平台","Webots simulation platform","19",19000000,{"path":2819,"stem":2820,"title":2821,"date":2507,"chapter":2822,"chapterSort":2823,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch2-ru-men-cao-zuo","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch2-入门操作","Getting Started","2",2000000,{"path":2825,"stem":2826,"title":2827,"date":2507,"chapter":2828,"chapterSort":2829,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch20-opencv","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch20-OpenCV","OpenCV","20",20000000,{"path":2831,"stem":2832,"title":2833,"date":2507,"chapter":2834,"chapterSort":2835,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch3-gong-zuo-kong-jian-yu-gong-neng-bao","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch3-工作空间与功能包","Workspace and Function Packages","3",3000000,{"path":2837,"stem":2838,"title":2839,"date":2507,"chapter":2840,"chapterSort":2841,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch4-si-da-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch4-四大通信","Four Major Communications","4",4000000,{"path":2843,"stem":2844,"title":2845,"date":2507,"chapter":2846,"chapterSort":2847,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch5-ros2-qi-ta-tong-xin-ji-zhi","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch5-ROS2其他通信机制","ROS2 Other Communication Mechanisms","5",5000000,{"path":2849,"stem":2850,"title":2851,"date":2507,"chapter":2852,"chapterSort":2853,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch6-launch","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch6-Launch","Launch","6",6000000,{"path":2855,"stem":2856,"title":2857,"date":2507,"chapter":2858,"chapterSort":2859,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch7-hui-su-rosbag2","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch7-回溯rosbag2","Replaying rosbag2","7",7000000,{"path":2861,"stem":2862,"title":2863,"date":2507,"chapter":2864,"chapterSort":2865,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch8-zuo-biao-bian-huan-tf","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch8-坐标变换TF","Coordinate Transformation TF","8",8000000,{"path":2867,"stem":2868,"title":2869,"date":2507,"chapter":2870,"chapterSort":2871,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2514},"/en-us/wiki/2023-12-30-ros2-tutorial/ch9-ke-shi-hua-ping-tai-rviz2-yu-urdf-jian-mo-yu-yan","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch9-可视化平台RVIZ2与URDF建模语言","Visualization Platform RVIZ2 and URDF Modeling Language","9",9000000,{"path":2510,"stem":2873,"title":2874,"date":2507,"chapter":2516,"chapterSort":2875,"docKey":2509,"docRoot":2510,"docTitle":2511,"isWikiDoc":2515,"isWikiIndex":2515},"_i18n/en-us/wiki/2023-12-30-ros2-tutorial/index","ROS2 Robot Operating System Tutorial",0,{"variants":2877},[2878,2879,2882,2885,2888],{"path":2504,"localeSlug":2518,"i18nKey":2513},{"path":2880,"localeSlug":2881,"i18nKey":2513},"/zh-hant/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim","zh-hant",{"path":2883,"localeSlug":2884,"i18nKey":2513},"/zh-hk/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim","zh-hk",{"path":2886,"localeSlug":2887,"i18nKey":2513},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim","zh-tw",{"path":2889,"localeSlug":2890,"i18nKey":2513},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim","zh-cn",[2504,2521,2880,2521,2883,2521,2886,2521,2889,2521],1780671800104]