[{"data":1,"prerenderedAt":3942},["ShallowReactive",2],{"wiki-page-/en-us/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai":3,"wiki-doc-items-/en-us/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai":3575,"language-switcher-data-/en-us/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai":3926,"wiki-i18n-paths-/en-us/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai":3941},{"id":4,"title":5,"body":6,"canonicalPath":3556,"chapter":3557,"chapterSort":3558,"date":3559,"description":12,"docI18nKey":3560,"docKey":3561,"docRoot":3562,"docTitle":3563,"extension":3564,"i18nKey":3565,"isBlogPost":3566,"isWikiDoc":359,"isWikiIndex":3566,"layout":3567,"legacyPath":3567,"locale":3568,"localeSlug":3569,"meta":3570,"navigation":359,"path":3556,"seo":3571,"sourcePath":3572,"sourceStem":3565,"stem":3573,"wikiDepth":71,"__hash__":3574},"content/_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch10-Stage_Ros2仿真平台.md","Stage_Ros2 Simulation Platform",{"type":7,"value":8,"toc":3554},"minimark",[9,13,19,27,39,44,51,54,57,107,114,140,147,150,155,161,167,170,189,192,198,202,205,210,213,238,257,285,288,293,303,492,495,503,561,567,572,575,594,599,602,626,629,634,639,644,715,720,782,786,789,794,800,904,907,912,915,920,925,929,1156,1160,1232,1237,1242,1245,1250,1253,1258,1261,1266,1269,1274,1277,1282,1285,1288,1291,1294,1299,1302,1306,1309,1314,1319,1324,1480,1491,1495,1497,1502,1506,1510,1812,1816,1962,1966,1969,1974,1978,2162,2165,2169,2171,2176,2180,2183,2188,2213,2227,2236,2241,2244,2645,2650,2704,2708,2730,2735,2738,2869,2874,2978,2982,3031,3036,3039,3196,3201,3272,3276,3301,3306,3309,3363,3366,3371,3377,3441,3446,3448,3451,3456,3461,3465,3468,3473,3483,3530,3534,3536,3541,3550],[10,11,12],"p",{},"stage_ros2 is a ROS 2 package based on the Stage simulator, used to simulate and control robot behavior in a virtual environment. It provides powerful tools and communication interfaces for developing, testing, and validating robotic systems. With stage_ros2, users can easily create virtual environments, send commands via ROS 2 to control robot motion, and receive sensor data. This package helps users conduct robot development at lower cost and risk, offering an efficient and flexible robot simulation environment.",[10,14,15],{},[16,17,18],"em",{},"Stage User Manual:",[10,20,21],{},[22,23,24],"a",{"href":24,"rel":25},"http://rtv.github.io/Stage/modules.html",[26],"nofollow",[10,28,29,30,34,35,38],{},"(",[31,32,33],"strong",{},"Optional"," — ROS2 has already removed Stage, and ",[31,36,37],{},"Gazebo is a much better alternative",", but learning it won't hurt.)",[40,41,43],"h4",{"id":42},"installation-and-running-of-stage_ros2","Installation and Running of stage_ros2",[45,46,47],"ol",{},[48,49,50],"li",{},"Installation",[10,52,53],{},"Since ROS2 has officially removed Stage, we need to manually install it by compiling from source. A developer has already adapted Stage for the ROS2 version:",[10,55,56],{},"Please first run the following command to install dependencies:",[58,59,64],"pre",{"className":60,"code":61,"language":62,"meta":63,"style":63},"language-bash shiki shiki-themes github-light github-dark","sudo apt-get install git cmake g++ libjpeg8-dev libpng-dev libglu1-mesa-dev libltdl-dev libfltk1.1-dev\n","bash","",[65,66,67],"code",{"__ignoreMap":63},[68,69,72,76,80,83,86,89,92,95,98,101,104],"span",{"class":70,"line":71},"line",1,[68,73,75],{"class":74},"sScJk","sudo",[68,77,79],{"class":78},"sZZnC"," apt-get",[68,81,82],{"class":78}," install",[68,84,85],{"class":78}," git",[68,87,88],{"class":78}," cmake",[68,90,91],{"class":78}," g++",[68,93,94],{"class":78}," libjpeg8-dev",[68,96,97],{"class":78}," libpng-dev",[68,99,100],{"class":78}," libglu1-mesa-dev",[68,102,103],{"class":78}," libltdl-dev",[68,105,106],{"class":78}," libfltk1.1-dev\n",[10,108,109,110,113],{},"Enter the ",[65,111,112],{},"src"," directory of the ROS2 workspace and run the following command to download the relevant repositories:",[58,115,117],{"className":60,"code":116,"language":62,"meta":63,"style":63},"git clone https://github.com/damuxt/Stage.git\ngit clone https://github.com/damuxt/stage_ros2.git\n",[65,118,119,130],{"__ignoreMap":63},[68,120,121,124,127],{"class":70,"line":71},[68,122,123],{"class":74},"git",[68,125,126],{"class":78}," clone",[68,128,129],{"class":78}," https://github.com/damuxt/Stage.git\n",[68,131,133,135,137],{"class":70,"line":132},2,[68,134,123],{"class":74},[68,136,126],{"class":78},[68,138,139],{"class":78}," https://github.com/damuxt/stage_ros2.git\n",[10,141,142,143,146],{},"Enter the workspace directory and use the ",[65,144,145],{},"colcon build"," command to build.",[10,148,149],{},"(This is a third-party author's adaptation for the Humble version, which currently does not support the Jazzy version. Compiling the Jazzy version will result in errors; the author may update it for Jazzy in the future.)",[45,151,152],{"start":132},[48,153,154],{},"Node Description",[10,156,157,160],{},[65,158,159],{},"stage_ros2"," node is one of the core nodes of the stage_ros2 package. It creates a simulation scene by loading a world file, which includes elements such as maps, obstacles, and robots. The world file describes the properties of the virtual environment, and the node builds the corresponding environment based on the descriptions in the file. The stage_ros2 node uses this virtual environment to simulate robot motion, perception, and control. By combining this node with the world file, robot simulation and testing can be carried out.",[45,162,164],{"start":163},3,[48,165,166],{},"Usage",[10,168,169],{},"Under the function package, usage examples are already built in. You can run the following command in the terminal to start the example:",[58,171,173],{"className":60,"code":172,"language":62,"meta":63,"style":63},"ros2 launch stage_ros2 my_house.launch.py\n",[65,174,175],{"__ignoreMap":63},[68,176,177,180,183,186],{"class":70,"line":71},[68,178,179],{"class":74},"ros2",[68,181,182],{"class":78}," launch",[68,184,185],{"class":78}," stage_ros2",[68,187,188],{"class":78}," my_house.launch.py\n",[10,190,191],{},"The simulator and rviz2 will be launched, and in rviz2, relevant information such as odometry, LiDAR, and depth camera can be displayed. The running results are as follows.",[10,193,194],{},[195,196],"img",{"alt":63,"src":197},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1618.webp",[40,199,201],{"id":200},"stage_ros2-simulation-framework-setup","stage_ros2 simulation framework setup",[10,203,204],{},"Starting from this section, we will introduce how to customize a simulation environment using stage_ros2.",[45,206,207],{},[48,208,209],{},"Preparation",[10,211,212],{},"First, create a function package with the following instructions:",[58,214,216],{"className":60,"code":215,"language":62,"meta":63,"style":63},"ros2 pkg create demo_stage_sim --dependencies stage_ros2\n",[65,217,218],{"__ignoreMap":63},[68,219,220,222,225,228,231,235],{"class":70,"line":71},[68,221,179],{"class":74},[68,223,224],{"class":78}," pkg",[68,226,227],{"class":78}," create",[68,229,230],{"class":78}," demo_stage_sim",[68,232,234],{"class":233},"sj4cs"," --dependencies",[68,236,237],{"class":78}," stage_ros2\n",[10,239,240,241,244,245,248,249,252,253,256],{},"Then create the ",[65,242,243],{},"launch",", ",[65,246,247],{},"world",", and ",[65,250,251],{},"config"," directories under the package, and modify the ",[65,254,255],{},"CMakeLists.txt"," file under the package by adding the following code:",[58,258,260],{"className":60,"code":259,"language":62,"meta":63,"style":63},"install(DIRECTORY launch world config DESTINATION share/${PROJECT_NAME})\n",[65,261,262],{"__ignoreMap":63},[68,263,264,267,269,272,275,278,281],{"class":70,"line":71},[68,265,266],{"class":74},"install(DIRECTORY",[68,268,182],{"class":78},[68,270,271],{"class":78}," world",[68,273,274],{"class":78}," config",[68,276,277],{"class":78}," DESTINATION",[68,279,280],{"class":78}," share/",[68,282,284],{"class":283},"sVt8B","${PROJECT_NAME})\n",[10,286,287],{},"Among them, the launch directory is used to store launch files, config is used to store rviz2 configuration files, and world is used to store simulation-related files. In the world directory, please create a new maps directory and copy the image assets from the course supporting materials into it.",[45,289,290],{"start":132},[48,291,292],{},"Build the Code Framework",[10,294,295,296,298,299,302],{},"In the ",[65,297,243],{}," directory of the function package, create a new file named ",[65,300,301],{},"stage_sim.launch.py"," and enter the following content:",[58,304,306],{"className":60,"code":305,"language":62,"meta":63,"style":63},"import os\nfrom ament_index_python.packages import get_package_share_directory\nfrom launch import LaunchDescription\nfrom launch_ros.actions import Node\n\ndef generate_launch_description():\n    this_directory = get_package_share_directory('demo_stage_sim')\nreturn LaunchDescription([\n        Node(\n            package='stage_ros2',\n            executable='stage_ros2',\n            name='stage',\n            parameters=[{\"world_file\": os.path.join(this_directory,'world','sim.world')}],\n        )\n    ])\n",[65,307,308,316,330,341,354,361,376,396,409,415,421,436,449,480,486],{"__ignoreMap":63},[68,309,310,313],{"class":70,"line":71},[68,311,312],{"class":74},"import",[68,314,315],{"class":78}," os\n",[68,317,318,321,324,327],{"class":70,"line":132},[68,319,320],{"class":74},"from",[68,322,323],{"class":78}," ament_index_python.packages",[68,325,326],{"class":78}," import",[68,328,329],{"class":78}," get_package_share_directory\n",[68,331,332,334,336,338],{"class":70,"line":163},[68,333,320],{"class":74},[68,335,182],{"class":78},[68,337,326],{"class":78},[68,339,340],{"class":78}," LaunchDescription\n",[68,342,344,346,349,351],{"class":70,"line":343},4,[68,345,320],{"class":74},[68,347,348],{"class":78}," launch_ros.actions",[68,350,326],{"class":78},[68,352,353],{"class":78}," Node\n",[68,355,357],{"class":70,"line":356},5,[68,358,360],{"emptyLinePlaceholder":359},true,"\n",[68,362,364,367,370,373],{"class":70,"line":363},6,[68,365,366],{"class":74},"def",[68,368,369],{"class":78}," generate_launch_description",[68,371,372],{"class":283},"()",[68,374,375],{"class":78},":\n",[68,377,379,382,385,388,390,393],{"class":70,"line":378},7,[68,380,381],{"class":74},"    this_directory",[68,383,384],{"class":78}," =",[68,386,387],{"class":78}," get_package_share_directory",[68,389,29],{"class":283},[68,391,392],{"class":74},"'demo_stage_sim'",[68,394,395],{"class":283},")\n",[68,397,399,403,406],{"class":70,"line":398},8,[68,400,402],{"class":401},"szBVR","return",[68,404,405],{"class":78}," LaunchDescription",[68,407,408],{"class":283},"([\n",[68,410,412],{"class":70,"line":411},9,[68,413,414],{"class":283},"        Node(\n",[68,416,418],{"class":70,"line":417},10,[68,419,420],{"class":283},"            package='stage_ros2',\n",[68,422,424,427,430,433],{"class":70,"line":423},11,[68,425,426],{"class":283},"            executable",[68,428,429],{"class":401},"=",[68,431,432],{"class":78},"'stage_ros2'",[68,434,435],{"class":283},",\n",[68,437,439,442,444,447],{"class":70,"line":438},12,[68,440,441],{"class":283},"            name",[68,443,429],{"class":401},[68,445,446],{"class":78},"'stage'",[68,448,435],{"class":283},[68,450,452,455,457,460,463,466,469,472,474,477],{"class":70,"line":451},13,[68,453,454],{"class":283},"            parameters",[68,456,429],{"class":401},[68,458,459],{"class":283},"[{",[68,461,462],{"class":78},"\"world_file\"",[68,464,465],{"class":283},": os.path.join(this_directory",[68,467,468],{"class":401},",",[68,470,471],{"class":78},"'world'",[68,473,468],{"class":401},[68,475,476],{"class":78},"'sim.world'",[68,478,479],{"class":283},")}],\n",[68,481,483],{"class":70,"line":482},14,[68,484,485],{"class":283},"        )\n",[68,487,489],{"class":70,"line":488},15,[68,490,491],{"class":283},"    ])\n",[10,493,494],{},"This launch file will run the stage_ros2 node and load the sim.world file from the world directory.",[10,496,295,497,499,500,302],{},[65,498,247],{}," directory, create a new file named ",[65,501,502],{},"sim.world",[58,504,506],{"className":60,"code":505,"language":62,"meta":63,"style":63},"\n# -----------------------------------------------------------------------------\n\n# 设置窗体\n\n# 设置模拟器地图分辨率(以 米/像素 为单位)\nresolution 0.02\n\n# 设置模拟器的时间步长(以 毫秒 为单位)\ninterval_sim 100\n",[65,507,508,512,518,522,527,531,536,544,548,553],{"__ignoreMap":63},[68,509,510],{"class":70,"line":71},[68,511,360],{"emptyLinePlaceholder":359},[68,513,514],{"class":70,"line":132},[68,515,517],{"class":516},"sJ8bj","# -----------------------------------------------------------------------------\n",[68,519,520],{"class":70,"line":163},[68,521,360],{"emptyLinePlaceholder":359},[68,523,524],{"class":70,"line":343},[68,525,526],{"class":516},"# 设置窗体\n",[68,528,529],{"class":70,"line":356},[68,530,360],{"emptyLinePlaceholder":359},[68,532,533],{"class":70,"line":363},[68,534,535],{"class":516},"# 设置模拟器地图分辨率(以 米/像素 为单位)\n",[68,537,538,541],{"class":70,"line":378},[68,539,540],{"class":74},"resolution",[68,542,543],{"class":233}," 0.02\n",[68,545,546],{"class":70,"line":398},[68,547,360],{"emptyLinePlaceholder":359},[68,549,550],{"class":70,"line":411},[68,551,552],{"class":516},"# 设置模拟器的时间步长(以 毫秒 为单位)\n",[68,554,555,558],{"class":70,"line":417},[68,556,557],{"class":74},"interval_sim",[68,559,560],{"class":233}," 100\n",[10,562,563,564,566],{},"The ",[65,565,502],{}," file currently only declares some general parameters for the simulation environment.",[45,568,569],{"start":163},[48,570,571],{},"Compilation",[10,573,574],{},"In the terminal, navigate to the current workspace and compile the package:",[58,576,578],{"className":60,"code":577,"language":62,"meta":63,"style":63},"colcon build --packages-select demo_stage_sim\n",[65,579,580],{"__ignoreMap":63},[68,581,582,585,588,591],{"class":70,"line":71},[68,583,584],{"class":74},"colcon",[68,586,587],{"class":78}," build",[68,589,590],{"class":233}," --packages-select",[68,592,593],{"class":78}," demo_stage_sim\n",[45,595,596],{"start":343},[48,597,598],{},"Execute",[10,600,601],{},"In the current workspace, open a terminal and enter the following command:",[58,603,605],{"className":60,"code":604,"language":62,"meta":63,"style":63},". install/setup.bash\nros2 launch demo_stage_sim stage_sim.launch.py\n",[65,606,607,615],{"__ignoreMap":63},[68,608,609,612],{"class":70,"line":71},[68,610,611],{"class":233},".",[68,613,614],{"class":78}," install/setup.bash\n",[68,616,617,619,621,623],{"class":70,"line":132},[68,618,179],{"class":74},[68,620,182],{"class":78},[68,622,230],{"class":78},[68,624,625],{"class":78}," stage_sim.launch.py\n",[10,627,628],{},"After executing this launch file, a window will appear with no content inside. Next, we can proceed to create the specific simulation content.",[10,630,631],{},[195,632],{"alt":63,"src":633},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1619.webp",[45,635,636],{"start":356},[48,637,638],{},"world file parameters",[10,640,641],{},[31,642,643],{},"Summary and Default Values",[58,645,647],{"className":60,"code":646,"language":62,"meta":63,"style":63},"name                      \u003Cworldfile name>\ninterval_sim              100\nquit_time                 0\nresolution                0.02\nshow_clock                0\nshow_clock_interval       100\nthreads                   0\n",[65,648,649,669,676,684,691,699,707],{"__ignoreMap":63},[68,650,651,654,657,660,663,666],{"class":70,"line":71},[68,652,653],{"class":74},"name",[68,655,656],{"class":401},"                      \u003C",[68,658,659],{"class":78},"worldfile",[68,661,662],{"class":78}," nam",[68,664,665],{"class":283},"e",[68,667,668],{"class":401},">\n",[68,670,671,673],{"class":70,"line":132},[68,672,557],{"class":74},[68,674,675],{"class":233},"              100\n",[68,677,678,681],{"class":70,"line":163},[68,679,680],{"class":74},"quit_time",[68,682,683],{"class":233},"                 0\n",[68,685,686,688],{"class":70,"line":343},[68,687,540],{"class":74},[68,689,690],{"class":233},"                0.02\n",[68,692,693,696],{"class":70,"line":356},[68,694,695],{"class":74},"show_clock",[68,697,698],{"class":233},"                0\n",[68,700,701,704],{"class":70,"line":363},[68,702,703],{"class":74},"show_clock_interval",[68,705,706],{"class":233},"       100\n",[68,708,709,712],{"class":70,"line":378},[68,710,711],{"class":74},"threads",[68,713,714],{"class":233},"                   0\n",[10,716,717],{},[31,718,719],{},"Detailed Explanation",[721,722,723,729,732,738,741,747,753,759,762,767,774,779],"ul",{},[48,724,725,726],{},"name ",[727,728],"string",{},[48,730,731],{},"A name used for identification in the world, such as in the title bar of a graphical user interface.",[48,733,734,735],{},"interval_sim ",[736,737],"float",{},[48,739,740],{},"The amount of simulated time that runs each time World::Update() is called. Each model has its own configurable update interval, which can be greater or smaller than this value, but intervals shorter than this value are not visible in the graphical user interface or World update callbacks. You likely do not need to change the default value of 100 milliseconds: this value is used internally by clients such as Player and WebSim.",[48,742,743,744],{},"quit_time ",[736,745,746],{}," stops the simulation after the simulated time reaches the specified number of seconds. In libstage, World::Update() returns true. In Stage with a graphical user interface, the simulation is paused. In Stage without a graphical user interface, Stage exits.",[48,748,749,750],{},"resolution ",[736,751,752],{}," The resolution of the underlying bitmap model, in meters. Larger values can speed up ray tracing, but at the cost of collision detection and perception accuracy. In general, the default value is a reasonable choice.",[48,754,755,756],{},"show_clock ",[757,758],"int",{},[48,760,761],{},"If non-zero, print the simulation time to standard output every $show_clock_interval updates. This is useful for observing the progress of non-GUI simulations.",[48,763,764,765],{},"show_clock_interval ",[757,766],{},[48,768,769,770,773],{},"When ",[65,771,772],{},"$show_clock"," is enabled, prints the number of updates between time prints on standard output. The default is to print once every 10 seconds of simulated time. Smaller values will slightly reduce simulation speed.",[48,775,776,777],{},"threads ",[757,778],{},[48,780,781],{},"Number of worker threads to generate. Some models can update in parallel (e.g., lasers, rangefinders). Running 2 or more threads here may speed up simulation, depending on the number of available CPU cores and the world file. If you have high-resolution models with parallelism enabled (e.g., lasers with hundreds or thousands of samples, or a large number of models), use one thread per core.",[40,783,785],{"id":784},"stage_ros2-setup-window","stage_ros2 setup window",[10,787,788],{},"The stage window consists of a menu bar and a view of the simulated world. We can zoom in and out of the view, and scroll to see more of the simulated world. Simulated robot devices, obstacles, and other elements are rendered as colored polygons. The window also supports visualization of data and configuration for various sensor and actuator models. The menu provides options for controlling which data and configurations are displayed. In this section, we will introduce how to set up and operate the stage window.",[45,790,791],{},[48,792,793],{},"Set up the form",[10,795,796,797,799],{},"Set the window-related parameters by adding the following content to the ",[65,798,301],{}," file:",[58,801,803],{"className":60,"code":802,"language":62,"meta":63,"style":63},"\n# 配置窗体参数\nwindow\n(\n  size [ 700.000 700.000 ] # 窗体尺寸(以 像素 为单位)\n  scale 35  # 缩放比\n  center [ 0  0 ] # 地图相对于窗体的偏移量(以 米 为单位)\n  rotate [ 0  0 ] # 地图旋转角度\n  show_data 1     # 是否显示传感器数据 1=on 0=off\n)\n",[65,804,805,809,814,819,824,844,855,873,889,900],{"__ignoreMap":63},[68,806,807],{"class":70,"line":71},[68,808,360],{"emptyLinePlaceholder":359},[68,810,811],{"class":70,"line":132},[68,812,813],{"class":516},"# 配置窗体参数\n",[68,815,816],{"class":70,"line":163},[68,817,818],{"class":74},"window\n",[68,820,821],{"class":70,"line":343},[68,822,823],{"class":283},"(\n",[68,825,826,829,832,835,838,841],{"class":70,"line":356},[68,827,828],{"class":74},"  size",[68,830,831],{"class":283}," [ ",[68,833,834],{"class":233},"700.000",[68,836,837],{"class":233}," 700.000",[68,839,840],{"class":78}," ]",[68,842,843],{"class":516}," # 窗体尺寸(以 像素 为单位)\n",[68,845,846,849,852],{"class":70,"line":363},[68,847,848],{"class":74},"  scale",[68,850,851],{"class":233}," 35",[68,853,854],{"class":516},"  # 缩放比\n",[68,856,857,860,862,865,868,870],{"class":70,"line":378},[68,858,859],{"class":74},"  center",[68,861,831],{"class":283},[68,863,864],{"class":233},"0",[68,866,867],{"class":233},"  0",[68,869,840],{"class":78},[68,871,872],{"class":516}," # 地图相对于窗体的偏移量(以 米 为单位)\n",[68,874,875,878,880,882,884,886],{"class":70,"line":398},[68,876,877],{"class":74},"  rotate",[68,879,831],{"class":283},[68,881,864],{"class":233},[68,883,867],{"class":233},[68,885,840],{"class":78},[68,887,888],{"class":516}," # 地图旋转角度\n",[68,890,891,894,897],{"class":70,"line":411},[68,892,893],{"class":74},"  show_data",[68,895,896],{"class":233}," 1",[68,898,899],{"class":516},"     # 是否显示传感器数据 1=on 0=off\n",[68,901,902],{"class":70,"line":417},[68,903,395],{"class":283},[10,905,906],{},"The above code creates a window object with a resolution of 700x700, using a zoom ratio of 35x. The subsequently loaded map has no offset or rotation relative to the window and will display sensor data in a visual format.",[45,908,909],{"start":132},[48,910,911],{},"Compile and Execute",[10,913,914],{},"After building the functional package and executing the launch file, the result is as follows.",[10,916,917],{},[195,918],{"alt":63,"src":919},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1620.webp",[45,921,922],{"start":163},[48,923,924],{},"Form Parameters",[10,926,927],{},[31,928,643],{},[58,930,932],{"className":60,"code":931,"language":62,"meta":63,"style":63},"window\n(\n  size [ 400 300 ]\n\n  # camera options\n  center [ 0 0 ]\n  rotate [ 0 0 ]\n  scale 1.0\n\n  # perspective camera options\n  pcam_loc [ 0 -4 2 ]\n  pcam_angle [ 70 0 ]\n\n  # GUI options\n  show_data 0\n  show_flags 1\n  show_blocks 1\n  show_clock 1\n  show_footprints 0\n  show_grid 1\n  show_trailarrows 0\n  show_trailrise 0\n  show_trailfast 0\n  show_occupancy 0\n  show_tree 0\n  pcam_on 0\n  screenshots 0\n)\n",[65,933,934,938,942,957,961,966,979,991,998,1002,1007,1024,1038,1042,1047,1054,1063,1071,1079,1087,1095,1103,1111,1119,1127,1135,1143,1151],{"__ignoreMap":63},[68,935,936],{"class":70,"line":71},[68,937,818],{"class":74},[68,939,940],{"class":70,"line":132},[68,941,823],{"class":283},[68,943,944,946,948,951,954],{"class":70,"line":163},[68,945,828],{"class":74},[68,947,831],{"class":283},[68,949,950],{"class":233},"400",[68,952,953],{"class":233}," 300",[68,955,956],{"class":78}," ]\n",[68,958,959],{"class":70,"line":343},[68,960,360],{"emptyLinePlaceholder":359},[68,962,963],{"class":70,"line":356},[68,964,965],{"class":516},"  # camera options\n",[68,967,968,970,972,974,977],{"class":70,"line":363},[68,969,859],{"class":74},[68,971,831],{"class":283},[68,973,864],{"class":233},[68,975,976],{"class":233}," 0",[68,978,956],{"class":78},[68,980,981,983,985,987,989],{"class":70,"line":378},[68,982,877],{"class":74},[68,984,831],{"class":283},[68,986,864],{"class":233},[68,988,976],{"class":233},[68,990,956],{"class":78},[68,992,993,995],{"class":70,"line":398},[68,994,848],{"class":74},[68,996,997],{"class":233}," 1.0\n",[68,999,1000],{"class":70,"line":411},[68,1001,360],{"emptyLinePlaceholder":359},[68,1003,1004],{"class":70,"line":417},[68,1005,1006],{"class":516},"  # perspective camera options\n",[68,1008,1009,1012,1014,1016,1019,1022],{"class":70,"line":423},[68,1010,1011],{"class":74},"  pcam_loc",[68,1013,831],{"class":283},[68,1015,864],{"class":233},[68,1017,1018],{"class":233}," -4",[68,1020,1021],{"class":233}," 2",[68,1023,956],{"class":78},[68,1025,1026,1029,1031,1034,1036],{"class":70,"line":438},[68,1027,1028],{"class":74},"  pcam_angle",[68,1030,831],{"class":283},[68,1032,1033],{"class":233},"70",[68,1035,976],{"class":233},[68,1037,956],{"class":78},[68,1039,1040],{"class":70,"line":451},[68,1041,360],{"emptyLinePlaceholder":359},[68,1043,1044],{"class":70,"line":482},[68,1045,1046],{"class":516},"  # GUI options\n",[68,1048,1049,1051],{"class":70,"line":488},[68,1050,893],{"class":74},[68,1052,1053],{"class":233}," 0\n",[68,1055,1057,1060],{"class":70,"line":1056},16,[68,1058,1059],{"class":74},"  show_flags",[68,1061,1062],{"class":233}," 1\n",[68,1064,1066,1069],{"class":70,"line":1065},17,[68,1067,1068],{"class":74},"  show_blocks",[68,1070,1062],{"class":233},[68,1072,1074,1077],{"class":70,"line":1073},18,[68,1075,1076],{"class":74},"  show_clock",[68,1078,1062],{"class":233},[68,1080,1082,1085],{"class":70,"line":1081},19,[68,1083,1084],{"class":74},"  show_footprints",[68,1086,1053],{"class":233},[68,1088,1090,1093],{"class":70,"line":1089},20,[68,1091,1092],{"class":74},"  show_grid",[68,1094,1062],{"class":233},[68,1096,1098,1101],{"class":70,"line":1097},21,[68,1099,1100],{"class":74},"  show_trailarrows",[68,1102,1053],{"class":233},[68,1104,1106,1109],{"class":70,"line":1105},22,[68,1107,1108],{"class":74},"  show_trailrise",[68,1110,1053],{"class":233},[68,1112,1114,1117],{"class":70,"line":1113},23,[68,1115,1116],{"class":74},"  show_trailfast",[68,1118,1053],{"class":233},[68,1120,1122,1125],{"class":70,"line":1121},24,[68,1123,1124],{"class":74},"  show_occupancy",[68,1126,1053],{"class":233},[68,1128,1130,1133],{"class":70,"line":1129},25,[68,1131,1132],{"class":74},"  show_tree",[68,1134,1053],{"class":233},[68,1136,1138,1141],{"class":70,"line":1137},26,[68,1139,1140],{"class":74},"  pcam_on",[68,1142,1053],{"class":233},[68,1144,1146,1149],{"class":70,"line":1145},27,[68,1147,1148],{"class":74},"  screenshots",[68,1150,1053],{"class":233},[68,1152,1154],{"class":70,"line":1153},28,[68,1155,395],{"class":283},[10,1157,1158],{},[31,1159,719],{},[721,1161,1162,1167,1170,1179,1182,1185,1188,1197,1200,1205,1208,1211,1214,1221,1224,1229],{},[48,1163,1164,1165],{},"speedup ",[757,1166],{},[48,1168,1169],{},"Stage will attempt to run at this real-time multiplier. If set to -1, Stage will run as fast as possible and will not attempt to track real time.",[48,1171,1172,1173,1176,840],{},"size [",[22,1174,1175],{"href":1175},"width:int",[22,1177,1178],{"href":1178},"height:int",[48,1180,1181],{},"The size of the window (in pixels).",[48,1183,1184],{},"center [\u003Cx:float>\u003Cy:float> ]",[48,1186,1187],{},"The position of the window center, expressed in world coordinates (in meters).",[48,1189,1190,1191,1194,840],{},"rotate [",[22,1192,1193],{"href":1193},"pitch:float",[22,1195,1196],{"href":1196},"yaw:float",[48,1198,1199],{},"Rotation angle in degrees, relative to the vertical upward direction.",[48,1201,1202,1203],{},"scale",[736,1204],{},[48,1206,1207],{},"Ratio of world coordinates to pixel coordinates (window scaling).",[48,1209,1210],{},"pcam_loc [\u003Cx:int>\u003Cy:int>\u003Cz:int> ]",[48,1212,1213],{},"The position of the perspective camera (in meters).",[48,1215,1216,1217,1219,840],{},"pcam_angle [",[22,1218,1193],{"href":1193},[22,1220,1196],{"href":1196},[48,1222,1223],{},"Perspective camera's vertical and horizontal angles.",[48,1225,1226,1227],{},"pcam_on",[757,1228],{},[48,1230,1231],{},"Whether to enable the perspective camera (0/1).",[45,1233,1234],{"start":343},[48,1235,1236],{},"Operation Window",[10,1238,1239],{},[31,1240,1241],{},"Scroll View",[10,1243,1244],{},"Left-click and drag on the background to move your view of the world.",[10,1246,1247],{},[31,1248,1249],{},"Zoom View",[10,1251,1252],{},"Scroll the mouse wheel to zoom in or out at the cursor position.",[10,1254,1255],{},[31,1256,1257],{},"Save the World",[10,1259,1260],{},"You can save the positions of all objects in the current world using the \"File/Save\" menu item. Warning: Saving will overwrite the current world file. Before saving, copy your world file to preserve the old positions. Alternatively, you can use the \"File/Save As\" menu item to save it to a new world file.",[10,1262,1263],{},[31,1264,1265],{},"Pausing and Resuming the Clock",[10,1267,1268],{},"Pressing the \"p\" key can pause or resume the simulation. Pressing the \".\" (period) key runs one simulation step. Holding down the \".\" key repeats stepping multiple times. Stepping pauses the simulation, so pressing the \"p\" key resumes it. The initial pause/run state can be set using the \"paused\" attribute in the world file.",[10,1270,1271],{},[31,1272,1273],{},"Select Model",[10,1275,1276],{},"You can select a model by left-clicking on it. You can also select multiple models by holding down the Shift key and clicking on several models. Selected models can be moved by dragging, or rotated by holding down the right mouse button and moving the mouse. Clicking on an empty spot in the world clears the selection. After clearing the selection, the last single model that was selected is saved as the target for several view options that affect specific models.",[10,1278,1279],{},[31,1280,1281],{},"View Options",[10,1283,1284],{},"The View menu provides many features that affect how the world is rendered. To the right of each option, there is usually a keyboard shortcut for quickly toggling the related setting.",[10,1286,1287],{},"The \"Data\" option (shortcut 'd') toggles sensor data visualization. The Filter Data option (shortcut Shift+'d') opens a dialog that allows enabling or disabling visualization for specific sensors. The \"Visualize All\" option in the dialog toggles whether sensor visualization is enabled for all models or only for the currently selected model.",[10,1289,1290],{},"The \"Follow\" option keeps the view locked to the last selected model.",[10,1292,1293],{},"The \"Perspective camera\" option switches from an orthographic view to a perspective view.",[10,1295,1296],{},[31,1297,1298],{},"Save screenshot",[10,1300,1301],{},"To save a series of screenshots of the world, select the \"Save screenshots\" option from the View menu to start capturing images, then select the same option from the menu again to stop.",[40,1303,1305],{"id":1304},"stage_ros2-basic-model","stage_ros2 basic model",[10,1307,1308],{},"The basic model simulates objects with fundamental attributes: position, size, velocity, color, and visibility to various sensors. The basic model also has a body composed of a linear list. Internally, the basic model is used as the base class for all other model types. We can use the basic model to simulate environmental objects. In Stage, chassis models, radar models, camera models, and so on can all be considered subclasses of the basic model.",[10,1310,1311],{},[195,1312],{"alt":63,"src":1313},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1621.webp",[45,1315,1316],{},[48,1317,1318],{},"Add basic model",[10,1320,295,1321,1323],{},[65,1322,301],{}," file, add the following content:",[58,1325,1327],{"className":60,"code":1326,"language":62,"meta":63,"style":63},"\n# -----------------------------------------------------------------------------\n\n# 添加障碍物\nmodel( pose [ -2 -4 0 0 ] color \"green\")\n\n# define a block\ndefine my_block model\n(\n  size [1.0 1.0 1.0]\n  gui_nose 0\n  gui_grid 0\n  gui_outline 0\n)\n\n# throw in a block\nmy_block( pose [ 0 4 0 90 ] color \"red\" bitmap \"maps/ghost.png\")\n",[65,1328,1329,1333,1337,1341,1346,1375,1379,1384,1395,1399,1412,1419,1426,1433,1437,1441,1446],{"__ignoreMap":63},[68,1330,1331],{"class":70,"line":71},[68,1332,360],{"emptyLinePlaceholder":359},[68,1334,1335],{"class":70,"line":132},[68,1336,517],{"class":516},[68,1338,1339],{"class":70,"line":163},[68,1340,360],{"emptyLinePlaceholder":359},[68,1342,1343],{"class":70,"line":343},[68,1344,1345],{"class":516},"# 添加障碍物\n",[68,1347,1348,1351,1354,1356,1359,1361,1363,1365,1367,1370,1373],{"class":70,"line":356},[68,1349,1350],{"class":74},"model(",[68,1352,1353],{"class":78}," pose",[68,1355,831],{"class":283},[68,1357,1358],{"class":233},"-2",[68,1360,1018],{"class":233},[68,1362,976],{"class":233},[68,1364,976],{"class":233},[68,1366,840],{"class":78},[68,1368,1369],{"class":78}," color",[68,1371,1372],{"class":78}," \"green\"",[68,1374,395],{"class":283},[68,1376,1377],{"class":70,"line":363},[68,1378,360],{"emptyLinePlaceholder":359},[68,1380,1381],{"class":70,"line":378},[68,1382,1383],{"class":516},"# define a block\n",[68,1385,1386,1389,1392],{"class":70,"line":398},[68,1387,1388],{"class":74},"define",[68,1390,1391],{"class":78}," my_block",[68,1393,1394],{"class":78}," model\n",[68,1396,1397],{"class":70,"line":411},[68,1398,823],{"class":283},[68,1400,1401,1403,1406,1409],{"class":70,"line":417},[68,1402,828],{"class":74},[68,1404,1405],{"class":283}," [1.0 ",[68,1407,1408],{"class":233},"1.0",[68,1410,1411],{"class":78}," 1.0]\n",[68,1413,1414,1417],{"class":70,"line":423},[68,1415,1416],{"class":74},"  gui_nose",[68,1418,1053],{"class":233},[68,1420,1421,1424],{"class":70,"line":438},[68,1422,1423],{"class":74},"  gui_grid",[68,1425,1053],{"class":233},[68,1427,1428,1431],{"class":70,"line":451},[68,1429,1430],{"class":74},"  gui_outline",[68,1432,1053],{"class":233},[68,1434,1435],{"class":70,"line":482},[68,1436,395],{"class":283},[68,1438,1439],{"class":70,"line":488},[68,1440,360],{"emptyLinePlaceholder":359},[68,1442,1443],{"class":70,"line":1056},[68,1444,1445],{"class":516},"# throw in a block\n",[68,1447,1448,1451,1453,1455,1457,1460,1462,1465,1467,1469,1472,1475,1478],{"class":70,"line":1065},[68,1449,1450],{"class":74},"my_block(",[68,1452,1353],{"class":78},[68,1454,831],{"class":283},[68,1456,864],{"class":233},[68,1458,1459],{"class":233}," 4",[68,1461,976],{"class":233},[68,1463,1464],{"class":233}," 90",[68,1466,840],{"class":78},[68,1468,1369],{"class":78},[68,1470,1471],{"class":78}," \"red\"",[68,1473,1474],{"class":78}," bitmap",[68,1476,1477],{"class":78}," \"maps/ghost.png\"",[68,1479,395],{"class":283},[10,1481,1482,1483,1486,1487,1490],{},"In the code above, a green model object was created directly using the default base model, and a custom ",[65,1484,1485],{},"my_block"," model inheriting from ",[65,1488,1489],{},"model"," was also defined, followed by creating an instance of that model.",[45,1492,1493],{"start":132},[48,1494,911],{},[10,1496,914],{},[10,1498,1499],{},[195,1500],{"alt":63,"src":1501},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1622.webp",[45,1503,1504],{"start":163},[48,1505,924],{},[10,1507,1508],{},[31,1509,643],{},[58,1511,1513],{"className":60,"code":1512,"language":62,"meta":63,"style":63},"model (\n    pose [ 0.0 0.0 0.0 0.0 ]\n    size [ 0.1 0.1 0.1 ]\n    origin [ 0.0 0.0 0.0 0.0 ]\n    velocity [ 0.0 0.0 0.0 0.0 ]\n    color \"red\"\n    color_rgba [ 0.0 0.0 0.0 1.0 ]\n    bitmap \"\"\n    ctrl \"\"\n\n    # determine how the model appears in various sensors\n    fiducial_return 0\n    fiducial_key 0\n    obstacle_return 1\n    ranger_return 1\n    blob_return 1\n    laser_return LaserVisible\n    gripper_return 0\n    gravity_return 0\n    sticky_return 0\n\n    # GUI properties\n    gui_nose 0\n    gui_grid 0\n    gui_outline 1\n    gui_move 0 (1 if the model has no parents);\n    boundary 0\n    mass 10.0\n    map_resolution 0.1\n    say \"\"\n    alwayson 0\n)\n",[65,1514,1515,1522,1541,1558,1575,1592,1600,1618,1626,1633,1637,1642,1649,1656,1663,1670,1677,1685,1692,1699,1706,1710,1715,1722,1729,1736,1767,1774,1782,1791,1799,1807],{"__ignoreMap":63},[68,1516,1517,1519],{"class":70,"line":71},[68,1518,1489],{"class":74},[68,1520,1521],{"class":283}," (\n",[68,1523,1524,1527,1529,1532,1535,1537,1539],{"class":70,"line":132},[68,1525,1526],{"class":74},"    pose",[68,1528,831],{"class":283},[68,1530,1531],{"class":233},"0.0",[68,1533,1534],{"class":233}," 0.0",[68,1536,1534],{"class":233},[68,1538,1534],{"class":233},[68,1540,956],{"class":78},[68,1542,1543,1546,1548,1551,1554,1556],{"class":70,"line":163},[68,1544,1545],{"class":74},"    size",[68,1547,831],{"class":283},[68,1549,1550],{"class":233},"0.1",[68,1552,1553],{"class":233}," 0.1",[68,1555,1553],{"class":233},[68,1557,956],{"class":78},[68,1559,1560,1563,1565,1567,1569,1571,1573],{"class":70,"line":343},[68,1561,1562],{"class":74},"    origin",[68,1564,831],{"class":283},[68,1566,1531],{"class":233},[68,1568,1534],{"class":233},[68,1570,1534],{"class":233},[68,1572,1534],{"class":233},[68,1574,956],{"class":78},[68,1576,1577,1580,1582,1584,1586,1588,1590],{"class":70,"line":356},[68,1578,1579],{"class":74},"    velocity",[68,1581,831],{"class":283},[68,1583,1531],{"class":233},[68,1585,1534],{"class":233},[68,1587,1534],{"class":233},[68,1589,1534],{"class":233},[68,1591,956],{"class":78},[68,1593,1594,1597],{"class":70,"line":363},[68,1595,1596],{"class":74},"    color",[68,1598,1599],{"class":78}," \"red\"\n",[68,1601,1602,1605,1607,1609,1611,1613,1616],{"class":70,"line":378},[68,1603,1604],{"class":74},"    color_rgba",[68,1606,831],{"class":283},[68,1608,1531],{"class":233},[68,1610,1534],{"class":233},[68,1612,1534],{"class":233},[68,1614,1615],{"class":233}," 1.0",[68,1617,956],{"class":78},[68,1619,1620,1623],{"class":70,"line":398},[68,1621,1622],{"class":74},"    bitmap",[68,1624,1625],{"class":78}," \"\"\n",[68,1627,1628,1631],{"class":70,"line":411},[68,1629,1630],{"class":74},"    ctrl",[68,1632,1625],{"class":78},[68,1634,1635],{"class":70,"line":417},[68,1636,360],{"emptyLinePlaceholder":359},[68,1638,1639],{"class":70,"line":423},[68,1640,1641],{"class":516},"    # determine how the model appears in various sensors\n",[68,1643,1644,1647],{"class":70,"line":438},[68,1645,1646],{"class":74},"    fiducial_return",[68,1648,1053],{"class":233},[68,1650,1651,1654],{"class":70,"line":451},[68,1652,1653],{"class":74},"    fiducial_key",[68,1655,1053],{"class":233},[68,1657,1658,1661],{"class":70,"line":482},[68,1659,1660],{"class":74},"    obstacle_return",[68,1662,1062],{"class":233},[68,1664,1665,1668],{"class":70,"line":488},[68,1666,1667],{"class":74},"    ranger_return",[68,1669,1062],{"class":233},[68,1671,1672,1675],{"class":70,"line":1056},[68,1673,1674],{"class":74},"    blob_return",[68,1676,1062],{"class":233},[68,1678,1679,1682],{"class":70,"line":1065},[68,1680,1681],{"class":74},"    laser_return",[68,1683,1684],{"class":78}," LaserVisible\n",[68,1686,1687,1690],{"class":70,"line":1073},[68,1688,1689],{"class":74},"    gripper_return",[68,1691,1053],{"class":233},[68,1693,1694,1697],{"class":70,"line":1081},[68,1695,1696],{"class":74},"    gravity_return",[68,1698,1053],{"class":233},[68,1700,1701,1704],{"class":70,"line":1089},[68,1702,1703],{"class":74},"    sticky_return",[68,1705,1053],{"class":233},[68,1707,1708],{"class":70,"line":1097},[68,1709,360],{"emptyLinePlaceholder":359},[68,1711,1712],{"class":70,"line":1105},[68,1713,1714],{"class":516},"    # GUI properties\n",[68,1716,1717,1720],{"class":70,"line":1113},[68,1718,1719],{"class":74},"    gui_nose",[68,1721,1053],{"class":233},[68,1723,1724,1727],{"class":70,"line":1121},[68,1725,1726],{"class":74},"    gui_grid",[68,1728,1053],{"class":233},[68,1730,1731,1734],{"class":70,"line":1129},[68,1732,1733],{"class":74},"    gui_outline",[68,1735,1062],{"class":233},[68,1737,1738,1741,1743,1746,1749,1752,1755,1758,1761,1764],{"class":70,"line":1137},[68,1739,1740],{"class":74},"    gui_move",[68,1742,976],{"class":233},[68,1744,1745],{"class":283}," (1 ",[68,1747,1748],{"class":78},"if",[68,1750,1751],{"class":78}," the",[68,1753,1754],{"class":78}," model",[68,1756,1757],{"class":78}," has",[68,1759,1760],{"class":78}," no",[68,1762,1763],{"class":78}," parents",[68,1765,1766],{"class":283},");\n",[68,1768,1769,1772],{"class":70,"line":1145},[68,1770,1771],{"class":74},"    boundary",[68,1773,1053],{"class":233},[68,1775,1776,1779],{"class":70,"line":1153},[68,1777,1778],{"class":74},"    mass",[68,1780,1781],{"class":233}," 10.0\n",[68,1783,1785,1788],{"class":70,"line":1784},29,[68,1786,1787],{"class":74},"    map_resolution",[68,1789,1790],{"class":233}," 0.1\n",[68,1792,1794,1797],{"class":70,"line":1793},30,[68,1795,1796],{"class":74},"    say",[68,1798,1625],{"class":78},[68,1800,1802,1805],{"class":70,"line":1801},31,[68,1803,1804],{"class":74},"    alwayson",[68,1806,1053],{"class":233},[68,1808,1810],{"class":70,"line":1809},32,[68,1811,395],{"class":283},[10,1813,1814],{},[31,1815,719],{},[721,1817,1818,1833,1843,1858,1875,1878,1884,1890,1896,1902,1908,1914,1920,1926,1932,1938,1944,1950,1956],{},[48,1819,1820,1821],{},"pose [ x:",[736,1822,1823,1824],{}," y:",[736,1825,1826,1827],{}," z:",[736,1828,1829,1830],{}," heading:",[736,1831,1832],{}," ] Specifies the model's pose in its parent coordinate system.",[48,1834,1835,1836],{},"size [ x:",[736,1837,1823,1838],{},[736,1839,1826,1840],{},[736,1841,1842],{}," ] specifies the model's dimensions along each axis.",[48,1844,1845,1846,1857],{},"origin ",[68,1847,1848,1849],{}," x:",[736,1850,1823,1851],{},[736,1852,1826,1853],{},[736,1854,1829,1855],{},[736,1856],{}," Specifies the position of the object's center relative to its orientation.",[48,1859,1860,1861,1874],{},"velocity ",[68,1862,1848,1863],{},[736,1864,1823,1865],{},[736,1866,1826,1867],{},[736,1868,1829,1869],{},[736,1870,1871,1872],{}," omega:",[736,1873],{}," specifies the initial velocity of the model. Note that if the model collides with an obstacle, its velocity will be set to zero.",[48,1876,1877],{},"velocity_enable int (default 0) Most models ignore their velocity state. This saves processing time, since most models never have their velocity set to a non-zero value. Some subclasses (such as ModelPosition) change this default because they expect movement. Users can specify a non-zero value here to enable velocity control for this model. This has the same effect as calling Model::VelocityEnable().",[48,1879,1880,1881],{},"color ",[727,1882,1883],{}," Specifies the object's color using a color name from the X11 database (rgb.txt).",[48,1885,1886,1887],{},"bitmap filename:",[727,1888,1889],{}," Draws a model by interpreting lines in the bitmap (supports bmp, jpeg, gif, png). The file is opened and parsed into a set of lines. These lines are scaled to fit within the rectangle defined by the model's current size.",[48,1891,1892,1893],{},"ctrl ",[727,1894,1895],{}," Specifies the model's controller module and its parameter string. For example, the string \"foo bar bash\" will load libfoo.so, and its Init() function will be called with the entire string as an argument (including the library name). The controller needs to parse the string (if parameters are required).",[48,1897,1898,1899],{},"fiducial_return fiducial_id ",[757,1900,1901],{}," If non-zero, this model is detected by the fiducial finder sensor. This value is used as the fiducial identifier.",[48,1903,1904,1905],{},"fiducial_key ",[757,1906,1907],{}," The fiducial_id model will only be detected by a fiducialfinder when the model's fiducial_key value matches that of the fiducialfinder. This allows you to have several independent types of fiducial markers in the same environment, with each type only appearing in the fiducialfinders that are \"tuned\" for it.",[48,1909,1910,1911],{},"obstacle_return ",[757,1912,1913],{}," If set to 1, this model can collide with other models that have this attribute enabled.",[48,1915,1916,1917],{},"ranger_return ",[757,1918,1919],{}," If set to 1, this model can be detected by the ranger sensor.",[48,1921,1922,1923],{},"blob_return ",[757,1924,1925],{}," If set to 1, the model can be detected in blob_finder (depending on its color).",[48,1927,1928,1929],{},"laser_return ",[757,1930,1931],{}," If set to 0, this model will not be detected by the laser sensor. If set to 1, the model appears as normal (0) reflection in the laser sensor. If set to 2, it appears as high (1) reflection.",[48,1933,1934,1935],{},"gripper_return ",[757,1936,1937],{}," If set to 1, the model can be grasped by the gripper and can be pushed through collision with anything that has a non-zero obstacle_return.",[48,1939,1940,1941],{},"gui_nose ",[757,1942,1943],{}," If set to 1, draws a nose on the model to indicate its orientation (positive X-axis).",[48,1945,1946,1947],{},"gui_grid ",[757,1948,1949],{}," If set to 1, draws a scale grid on the model.",[48,1951,1952,1953],{},"gui_outline ",[757,1954,1955],{}," If set to 1, draws a bounding box around the model to indicate its size.",[48,1957,1958,1959],{},"gui_move ",[757,1960,1961],{}," If set to 1, the model can be moved with the mouse in the GUI window.",[40,1963,1965],{"id":1964},"stage_ros2-adding-a-map","stage_ros2 adding a map",[10,1967,1968],{},"In this section, we will add a global map to the simulation environment. Please first prepare an image to serve as the global map.",[45,1970,1971],{},[48,1972,1973],{},"Add Map",[10,1975,295,1976,1323],{},[65,1977,301],{},[58,1979,1981],{"className":60,"code":1980,"language":62,"meta":63,"style":63},"\n# -----------------------------------------------------------------------------\n\n# 设置地图(定义模型)\ndefine floorplan model\n(\n  color \"gray30\"  # 颜色\n  boundary 1  # 为地图设置边框\n\n  gui_nose 0\n  gui_grid 0 \n\n  gui_outline 0\n  gripper_return 0\n  fiducial_return 0\n  laser_return 1\n)\n\n# 加载地图\nfloorplan\n( \n  name \"room\"\n  size [16.000 16.000 0.800]\n  pose [0 0 0 0]\n  bitmap \"maps/room.jpg\"\n  gui_move 0\n)\n",[65,1982,1983,1987,1991,1995,2000,2009,2013,2024,2034,2038,2044,2053,2057,2063,2070,2077,2084,2088,2092,2097,2102,2107,2115,2128,2143,2151,2158],{"__ignoreMap":63},[68,1984,1985],{"class":70,"line":71},[68,1986,360],{"emptyLinePlaceholder":359},[68,1988,1989],{"class":70,"line":132},[68,1990,517],{"class":516},[68,1992,1993],{"class":70,"line":163},[68,1994,360],{"emptyLinePlaceholder":359},[68,1996,1997],{"class":70,"line":343},[68,1998,1999],{"class":516},"# 设置地图(定义模型)\n",[68,2001,2002,2004,2007],{"class":70,"line":356},[68,2003,1388],{"class":74},[68,2005,2006],{"class":78}," floorplan",[68,2008,1394],{"class":78},[68,2010,2011],{"class":70,"line":363},[68,2012,823],{"class":283},[68,2014,2015,2018,2021],{"class":70,"line":378},[68,2016,2017],{"class":74},"  color",[68,2019,2020],{"class":78}," \"gray30\"",[68,2022,2023],{"class":516},"  # 颜色\n",[68,2025,2026,2029,2031],{"class":70,"line":398},[68,2027,2028],{"class":74},"  boundary",[68,2030,896],{"class":233},[68,2032,2033],{"class":516},"  # 为地图设置边框\n",[68,2035,2036],{"class":70,"line":411},[68,2037,360],{"emptyLinePlaceholder":359},[68,2039,2040,2042],{"class":70,"line":417},[68,2041,1416],{"class":74},[68,2043,1053],{"class":233},[68,2045,2046,2048,2050],{"class":70,"line":423},[68,2047,1423],{"class":74},[68,2049,976],{"class":233},[68,2051,2052],{"class":283}," \n",[68,2054,2055],{"class":70,"line":438},[68,2056,360],{"emptyLinePlaceholder":359},[68,2058,2059,2061],{"class":70,"line":451},[68,2060,1430],{"class":74},[68,2062,1053],{"class":233},[68,2064,2065,2068],{"class":70,"line":482},[68,2066,2067],{"class":74},"  gripper_return",[68,2069,1053],{"class":233},[68,2071,2072,2075],{"class":70,"line":488},[68,2073,2074],{"class":74},"  fiducial_return",[68,2076,1053],{"class":233},[68,2078,2079,2082],{"class":70,"line":1056},[68,2080,2081],{"class":74},"  laser_return",[68,2083,1062],{"class":233},[68,2085,2086],{"class":70,"line":1065},[68,2087,395],{"class":283},[68,2089,2090],{"class":70,"line":1073},[68,2091,360],{"emptyLinePlaceholder":359},[68,2093,2094],{"class":70,"line":1081},[68,2095,2096],{"class":516},"# 加载地图\n",[68,2098,2099],{"class":70,"line":1089},[68,2100,2101],{"class":74},"floorplan\n",[68,2103,2104],{"class":70,"line":1097},[68,2105,2106],{"class":283},"( \n",[68,2108,2109,2112],{"class":70,"line":1105},[68,2110,2111],{"class":74},"  name",[68,2113,2114],{"class":78}," \"room\"\n",[68,2116,2117,2119,2122,2125],{"class":70,"line":1113},[68,2118,828],{"class":74},[68,2120,2121],{"class":283}," [16.000 ",[68,2123,2124],{"class":233},"16.000",[68,2126,2127],{"class":78}," 0.800]\n",[68,2129,2130,2133,2136,2138,2140],{"class":70,"line":1121},[68,2131,2132],{"class":74},"  pose",[68,2134,2135],{"class":283}," [0 ",[68,2137,864],{"class":233},[68,2139,976],{"class":233},[68,2141,2142],{"class":78}," 0]\n",[68,2144,2145,2148],{"class":70,"line":1129},[68,2146,2147],{"class":74},"  bitmap",[68,2149,2150],{"class":78}," \"maps/room.jpg\"\n",[68,2152,2153,2156],{"class":70,"line":1137},[68,2154,2155],{"class":74},"  gui_move",[68,2157,1053],{"class":233},[68,2159,2160],{"class":70,"line":1145},[68,2161,395],{"class":283},[10,2163,2164],{},"The code above defines a custom floorplan model and creates a floorplan object loaded with map data based on this model.",[45,2166,2167],{"start":132},[48,2168,911],{},[10,2170,914],{},[10,2172,2173],{},[195,2174],{"alt":63,"src":2175},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1623.webp",[40,2177,2179],{"id":2178},"stage_ros2-add-robot","stage_ros2 add robot",[10,2181,2182],{},"This section will add a virtual robot composed of a chassis, a camera, and a LiDAR to the simulation environment.",[45,2184,2185],{},[48,2186,2187],{},"Code Framework Setup",[10,2189,295,2190,2192,2193,2196,2197,2199,2200,244,2203,244,2206,248,2209,2212],{},[65,2191,247],{}," directory, create a new ",[65,2194,2195],{},"robot"," directory. Inside the ",[65,2198,2195],{}," directory, create the files ",[65,2201,2202],{},"car_base.inc",[65,2204,2205],{},"camera.inc",[65,2207,2208],{},"laser.inc",[65,2210,2211],{},"mycar.inc",". The purpose of each file is as follows:",[721,2214,2215,2218,2221,2224],{},[48,2216,2217],{},"car_base.inc: Used to configure the robot chassis module.",[48,2219,2220],{},"camera.inc: used to configure the robot's camera module;",[48,2222,2223],{},"laser.inc: used to configure the robot's LiDAR module;",[48,2225,2226],{},"mycar.inc: Used to assemble the various modules of the robot.",[10,2228,2229,2230,2232,2233,2235],{},"Additionally, it will include ",[65,2231,2211],{}," in ",[65,2234,502],{}," and call its robot generation functionality.",[45,2237,2238],{"start":132},[48,2239,2240],{},"Set up the robot chassis",[10,2242,2243],{},"The position model in stage can simulate a mobile robot chassis using differential, omnidirectional, or Ackermann steering. Enter the following code in car_base.inc:",[58,2245,2247],{"className":60,"code":2246,"language":62,"meta":63,"style":63},"\n# 机器人底盘配置\ndefine car_base position \n(\n  color \"red\"                   # 车身颜色\n  drive \"diff\"                  # 车辆运动学模型                  \n  obstacle_return 1             \n  ranger_return 1           \n  blob_return 1                  \n  fiducial_return 1             \n\n  localization \"odom\"           # 定位方式\n  odom_error [ 0.05 0.05 0.0 0.1 ]  # 里程计误差\n\n  # localization_origin [0 0 0 0]   # 定位原点，默认为机器人的初始位置。\n\n  # [ xmin xmax ymin ymax zmin zmax amin amax ]        \n  velocity_bounds [-1 1 0 0 0 0 -45.0 45.0 ]         # 速度最值 \n  acceleration_bounds [-0.5 0.5 0 0 0 0 -45 45.0 ]   # 加速度最值\n\n  size [0.44 0.38 0.22]  # 车体尺寸\n  origin [0 0 0 0] # 旋转中心与车体中心的偏移量\n  mass 23.0 # 车体质量，单位kg\n\n  gui_nose 0 # 是否绘制方向指示标记\n\n  block( \n    points 8\n    point[0] [-0.2 0.18]\n    point[1] [-0.2 -0.18]\n    point[2] [-0.15 -0.27]\n    point[3] [0.12 -0.23]\n    point[4] [0.2 -0.12]\n    point[5] [0.2 0.12]\n    point[6] [0.12 0.23]\n    point[7] [-0.15 0.27]\n    z [0 0.22]\n  )\n)\n",[65,2248,2249,2253,2258,2270,2274,2283,2294,2304,2314,2324,2332,2336,2347,2369,2373,2378,2382,2387,2417,2446,2450,2466,2483,2494,2498,2507,2511,2518,2526,2537,2550,2563,2576,2590,2601,2612,2623,2634,2640],{"__ignoreMap":63},[68,2250,2251],{"class":70,"line":71},[68,2252,360],{"emptyLinePlaceholder":359},[68,2254,2255],{"class":70,"line":132},[68,2256,2257],{"class":516},"# 机器人底盘配置\n",[68,2259,2260,2262,2265,2268],{"class":70,"line":163},[68,2261,1388],{"class":74},[68,2263,2264],{"class":78}," car_base",[68,2266,2267],{"class":78}," position",[68,2269,2052],{"class":283},[68,2271,2272],{"class":70,"line":343},[68,2273,823],{"class":283},[68,2275,2276,2278,2280],{"class":70,"line":356},[68,2277,2017],{"class":74},[68,2279,1471],{"class":78},[68,2281,2282],{"class":516},"                   # 车身颜色\n",[68,2284,2285,2288,2291],{"class":70,"line":363},[68,2286,2287],{"class":74},"  drive",[68,2289,2290],{"class":78}," \"diff\"",[68,2292,2293],{"class":516},"                  # 车辆运动学模型                  \n",[68,2295,2296,2299,2301],{"class":70,"line":378},[68,2297,2298],{"class":74},"  obstacle_return",[68,2300,896],{"class":233},[68,2302,2303],{"class":283},"             \n",[68,2305,2306,2309,2311],{"class":70,"line":398},[68,2307,2308],{"class":74},"  ranger_return",[68,2310,896],{"class":233},[68,2312,2313],{"class":283},"           \n",[68,2315,2316,2319,2321],{"class":70,"line":411},[68,2317,2318],{"class":74},"  blob_return",[68,2320,896],{"class":233},[68,2322,2323],{"class":283},"                  \n",[68,2325,2326,2328,2330],{"class":70,"line":417},[68,2327,2074],{"class":74},[68,2329,896],{"class":233},[68,2331,2303],{"class":283},[68,2333,2334],{"class":70,"line":423},[68,2335,360],{"emptyLinePlaceholder":359},[68,2337,2338,2341,2344],{"class":70,"line":438},[68,2339,2340],{"class":74},"  localization",[68,2342,2343],{"class":78}," \"odom\"",[68,2345,2346],{"class":516},"           # 定位方式\n",[68,2348,2349,2352,2354,2357,2360,2362,2364,2366],{"class":70,"line":451},[68,2350,2351],{"class":74},"  odom_error",[68,2353,831],{"class":283},[68,2355,2356],{"class":233},"0.05",[68,2358,2359],{"class":233}," 0.05",[68,2361,1534],{"class":233},[68,2363,1553],{"class":233},[68,2365,840],{"class":78},[68,2367,2368],{"class":516},"  # 里程计误差\n",[68,2370,2371],{"class":70,"line":482},[68,2372,360],{"emptyLinePlaceholder":359},[68,2374,2375],{"class":70,"line":488},[68,2376,2377],{"class":516},"  # localization_origin [0 0 0 0]   # 定位原点，默认为机器人的初始位置。\n",[68,2379,2380],{"class":70,"line":1056},[68,2381,360],{"emptyLinePlaceholder":359},[68,2383,2384],{"class":70,"line":1065},[68,2385,2386],{"class":516},"  # [ xmin xmax ymin ymax zmin zmax amin amax ]        \n",[68,2388,2389,2392,2395,2398,2400,2402,2404,2406,2409,2412,2414],{"class":70,"line":1073},[68,2390,2391],{"class":74},"  velocity_bounds",[68,2393,2394],{"class":283}," [-1 ",[68,2396,2397],{"class":233},"1",[68,2399,976],{"class":233},[68,2401,976],{"class":233},[68,2403,976],{"class":233},[68,2405,976],{"class":233},[68,2407,2408],{"class":233}," -45.0",[68,2410,2411],{"class":233}," 45.0",[68,2413,840],{"class":78},[68,2415,2416],{"class":516},"         # 速度最值 \n",[68,2418,2419,2422,2425,2428,2430,2432,2434,2436,2439,2441,2443],{"class":70,"line":1081},[68,2420,2421],{"class":74},"  acceleration_bounds",[68,2423,2424],{"class":283}," [-0.5 ",[68,2426,2427],{"class":233},"0.5",[68,2429,976],{"class":233},[68,2431,976],{"class":233},[68,2433,976],{"class":233},[68,2435,976],{"class":233},[68,2437,2438],{"class":233}," -45",[68,2440,2411],{"class":233},[68,2442,840],{"class":78},[68,2444,2445],{"class":516},"   # 加速度最值\n",[68,2447,2448],{"class":70,"line":1089},[68,2449,360],{"emptyLinePlaceholder":359},[68,2451,2452,2454,2457,2460,2463],{"class":70,"line":1097},[68,2453,828],{"class":74},[68,2455,2456],{"class":283}," [0.44 ",[68,2458,2459],{"class":233},"0.38",[68,2461,2462],{"class":78}," 0.22]",[68,2464,2465],{"class":516},"  # 车体尺寸\n",[68,2467,2468,2471,2473,2475,2477,2480],{"class":70,"line":1105},[68,2469,2470],{"class":74},"  origin",[68,2472,2135],{"class":283},[68,2474,864],{"class":233},[68,2476,976],{"class":233},[68,2478,2479],{"class":78}," 0]",[68,2481,2482],{"class":516}," # 旋转中心与车体中心的偏移量\n",[68,2484,2485,2488,2491],{"class":70,"line":1113},[68,2486,2487],{"class":74},"  mass",[68,2489,2490],{"class":233}," 23.0",[68,2492,2493],{"class":516}," # 车体质量，单位kg\n",[68,2495,2496],{"class":70,"line":1121},[68,2497,360],{"emptyLinePlaceholder":359},[68,2499,2500,2502,2504],{"class":70,"line":1129},[68,2501,1416],{"class":74},[68,2503,976],{"class":233},[68,2505,2506],{"class":516}," # 是否绘制方向指示标记\n",[68,2508,2509],{"class":70,"line":1137},[68,2510,360],{"emptyLinePlaceholder":359},[68,2512,2513,2516],{"class":70,"line":1145},[68,2514,2515],{"class":74},"  block(",[68,2517,2052],{"class":283},[68,2519,2520,2523],{"class":70,"line":1153},[68,2521,2522],{"class":74},"    points",[68,2524,2525],{"class":233}," 8\n",[68,2527,2528,2531,2534],{"class":70,"line":1784},[68,2529,2530],{"class":74},"    point[0]",[68,2532,2533],{"class":283}," [-0.2 ",[68,2535,2536],{"class":78},"0.18]\n",[68,2538,2539,2542,2544,2547],{"class":70,"line":1793},[68,2540,2541],{"class":74},"    point[1]",[68,2543,2533],{"class":283},[68,2545,2546],{"class":233},"-0.18",[68,2548,2549],{"class":283},"]\n",[68,2551,2552,2555,2558,2561],{"class":70,"line":1801},[68,2553,2554],{"class":74},"    point[2]",[68,2556,2557],{"class":283}," [-0.15 ",[68,2559,2560],{"class":233},"-0.27",[68,2562,2549],{"class":283},[68,2564,2565,2568,2571,2574],{"class":70,"line":1809},[68,2566,2567],{"class":74},"    point[3]",[68,2569,2570],{"class":283}," [0.12 ",[68,2572,2573],{"class":233},"-0.23",[68,2575,2549],{"class":283},[68,2577,2579,2582,2585,2588],{"class":70,"line":2578},33,[68,2580,2581],{"class":74},"    point[4]",[68,2583,2584],{"class":283}," [0.2 ",[68,2586,2587],{"class":233},"-0.12",[68,2589,2549],{"class":283},[68,2591,2593,2596,2598],{"class":70,"line":2592},34,[68,2594,2595],{"class":74},"    point[5]",[68,2597,2584],{"class":283},[68,2599,2600],{"class":78},"0.12]\n",[68,2602,2604,2607,2609],{"class":70,"line":2603},35,[68,2605,2606],{"class":74},"    point[6]",[68,2608,2570],{"class":283},[68,2610,2611],{"class":78},"0.23]\n",[68,2613,2615,2618,2620],{"class":70,"line":2614},36,[68,2616,2617],{"class":74},"    point[7]",[68,2619,2557],{"class":283},[68,2621,2622],{"class":78},"0.27]\n",[68,2624,2626,2629,2631],{"class":70,"line":2625},37,[68,2627,2628],{"class":74},"    z",[68,2630,2135],{"class":283},[68,2632,2633],{"class":78},"0.22]\n",[68,2635,2637],{"class":70,"line":2636},38,[68,2638,2639],{"class":283},"  )\n",[68,2641,2643],{"class":70,"line":2642},39,[68,2644,395],{"class":283},[10,2646,2647],{},[31,2648,2649],{},"Position Summary and Default Values",[58,2651,2653],{"className":60,"code":2652,"language":62,"meta":63,"style":63},"position(\n    drive \"diff\"\n    localization \"gps\"\n    localization_origin [\u003Cdefaults to model's start pose>]\n    odom_error [0.03 0.03 0.00 0.05]\n    velocity_enable 1\n)\n",[65,2654,2655,2660,2668,2676,2690,2695,2700],{"__ignoreMap":63},[68,2656,2657],{"class":70,"line":71},[68,2658,2659],{"class":74},"position(\n",[68,2661,2662,2665],{"class":70,"line":132},[68,2663,2664],{"class":74},"    drive",[68,2666,2667],{"class":78}," \"diff\"\n",[68,2669,2670,2673],{"class":70,"line":163},[68,2671,2672],{"class":74},"    localization",[68,2674,2675],{"class":78}," \"gps\"\n",[68,2677,2678,2681,2684,2687],{"class":70,"line":343},[68,2679,2680],{"class":74},"    localization_origin",[68,2682,2683],{"class":283}," [\u003Cdefaults ",[68,2685,2686],{"class":78},"to",[68,2688,2689],{"class":78}," model's start pose>]\n",[68,2691,2692],{"class":70,"line":356},[68,2693,2694],{"class":78},"    odom_error [0.03 0.03 0.00 0.05]\n",[68,2696,2697],{"class":70,"line":363},[68,2698,2699],{"class":78},"    velocity_enable 1\n",[68,2701,2702],{"class":70,"line":378},[68,2703,395],{"class":78},[10,2705,2706],{},[31,2707,719],{},[721,2709,2710,2713,2716,2727],{},[48,2711,2712],{},"The \"diff\", \"omni\", or \"car\" drive options select the differential steering model, omnidirectional mode, or car-like Ackermann mode.",[48,2714,2715],{},"localization \"gps\" or \"odom\". If \"gps\" is selected, the position model will report location with perfect accuracy. If \"odom\" is selected, a simple odometry model will be used, and the position data will drift from the true location over time. The odometry model is parameterized by the odom_error attribute.",[48,2717,2718,2719,2722,2723,2726],{},"localization_origin ",[68,2720,2721],{},"x y z theta"," You can use the localization_origin parameter to set the origin of the localization coordinate system. By default, it copies the model's initial pose, so the robot will report its position relative to the starting location. Tip: If you set localization_origin to ",[68,2724,2725],{},"0 0 0 0"," and the localization method to \"gps\", the model will return its true global position. This setting is unrealistic but useful in research where you want to abstract away localization details.",[48,2728,2729],{},"odom_error [x y z theta] These are the odometry error model parameters used when selecting the \"odom\" positioning mode. Each value represents the maximum error ratio when integrating x, y, and theta velocities for odometry position estimation. For each axis, if the value specified here is E, the actual ratio is randomly chosen at startup within the range of -E/2 to +E/2. Note that due to rounding errors, setting these values to zero does not make localization perfect — to achieve that, you need to select the \"gps\" positioning mode.",[45,2731,2732],{"start":163},[48,2733,2734],{},"Set up the camera",[10,2736,2737],{},"The camera model in stage can simulate a depth camera. Enter the following code in camera.inc:",[58,2739,2741],{"className":60,"code":2740,"language":62,"meta":63,"style":63},"define my_camera camera\n(\n    range [ 0.3 3.0 ] # 相机采样范围\n    resolution [ 160 90 ]  #相机分辨率 1280 × 720 / 8\n    fov [ 87 58 ] # 相机视场\n    pantilt [ 0 0 ] # 相机姿态\n    alwayson 1 # 是否一直处于启动状态\n    size [ 0.025 0.09 0.025 ] # 相机尺寸\n    color \"gray\" # 相机颜色\n)\n",[65,2742,2743,2753,2757,2775,2792,2810,2826,2835,2855,2865],{"__ignoreMap":63},[68,2744,2745,2747,2750],{"class":70,"line":71},[68,2746,1388],{"class":74},[68,2748,2749],{"class":78}," my_camera",[68,2751,2752],{"class":78}," camera\n",[68,2754,2755],{"class":70,"line":132},[68,2756,823],{"class":283},[68,2758,2759,2762,2764,2767,2770,2772],{"class":70,"line":163},[68,2760,2761],{"class":74},"    range",[68,2763,831],{"class":283},[68,2765,2766],{"class":233},"0.3",[68,2768,2769],{"class":233}," 3.0",[68,2771,840],{"class":78},[68,2773,2774],{"class":516}," # 相机采样范围\n",[68,2776,2777,2780,2782,2785,2787,2789],{"class":70,"line":343},[68,2778,2779],{"class":74},"    resolution",[68,2781,831],{"class":283},[68,2783,2784],{"class":233},"160",[68,2786,1464],{"class":233},[68,2788,840],{"class":78},[68,2790,2791],{"class":516},"  #相机分辨率 1280 × 720 / 8\n",[68,2793,2794,2797,2799,2802,2805,2807],{"class":70,"line":356},[68,2795,2796],{"class":74},"    fov",[68,2798,831],{"class":283},[68,2800,2801],{"class":233},"87",[68,2803,2804],{"class":233}," 58",[68,2806,840],{"class":78},[68,2808,2809],{"class":516}," # 相机视场\n",[68,2811,2812,2815,2817,2819,2821,2823],{"class":70,"line":363},[68,2813,2814],{"class":74},"    pantilt",[68,2816,831],{"class":283},[68,2818,864],{"class":233},[68,2820,976],{"class":233},[68,2822,840],{"class":78},[68,2824,2825],{"class":516}," # 相机姿态\n",[68,2827,2828,2830,2832],{"class":70,"line":378},[68,2829,1804],{"class":74},[68,2831,896],{"class":233},[68,2833,2834],{"class":516}," # 是否一直处于启动状态\n",[68,2836,2837,2839,2841,2844,2847,2850,2852],{"class":70,"line":398},[68,2838,1545],{"class":74},[68,2840,831],{"class":283},[68,2842,2843],{"class":233},"0.025",[68,2845,2846],{"class":233}," 0.09",[68,2848,2849],{"class":233}," 0.025",[68,2851,840],{"class":78},[68,2853,2854],{"class":516}," # 相机尺寸\n",[68,2856,2857,2859,2862],{"class":70,"line":411},[68,2858,1596],{"class":74},[68,2860,2861],{"class":78}," \"gray\"",[68,2863,2864],{"class":516}," # 相机颜色\n",[68,2866,2867],{"class":70,"line":417},[68,2868,395],{"class":283},[10,2870,2871],{},[31,2872,2873],{},"Camera Summary and Default Values",[58,2875,2877],{"className":60,"code":2876,"language":62,"meta":63,"style":63},"camera(\n  resolution [ 32 32 ]\n  range [ 0.2 8.0 ]\n  fov [ 70.0 40.0 ]\n  pantilt [ 0.0 0.0 ]\n  size [ 0.1 0.07 0.05 ]\n  color \"black\"\n  watts 100.0 \n)\n",[65,2878,2879,2884,2899,2914,2929,2942,2957,2964,2974],{"__ignoreMap":63},[68,2880,2881],{"class":70,"line":71},[68,2882,2883],{"class":74},"camera(\n",[68,2885,2886,2889,2891,2894,2897],{"class":70,"line":132},[68,2887,2888],{"class":74},"  resolution",[68,2890,831],{"class":283},[68,2892,2893],{"class":233},"32",[68,2895,2896],{"class":233}," 32",[68,2898,956],{"class":78},[68,2900,2901,2904,2906,2909,2912],{"class":70,"line":163},[68,2902,2903],{"class":74},"  range",[68,2905,831],{"class":283},[68,2907,2908],{"class":233},"0.2",[68,2910,2911],{"class":233}," 8.0",[68,2913,956],{"class":78},[68,2915,2916,2919,2921,2924,2927],{"class":70,"line":343},[68,2917,2918],{"class":74},"  fov",[68,2920,831],{"class":283},[68,2922,2923],{"class":233},"70.0",[68,2925,2926],{"class":233}," 40.0",[68,2928,956],{"class":78},[68,2930,2931,2934,2936,2938,2940],{"class":70,"line":356},[68,2932,2933],{"class":74},"  pantilt",[68,2935,831],{"class":283},[68,2937,1531],{"class":233},[68,2939,1534],{"class":233},[68,2941,956],{"class":78},[68,2943,2944,2946,2948,2950,2953,2955],{"class":70,"line":363},[68,2945,828],{"class":74},[68,2947,831],{"class":283},[68,2949,1550],{"class":233},[68,2951,2952],{"class":233}," 0.07",[68,2954,2359],{"class":233},[68,2956,956],{"class":78},[68,2958,2959,2961],{"class":70,"line":378},[68,2960,2017],{"class":74},[68,2962,2963],{"class":78}," \"black\"\n",[68,2965,2966,2969,2972],{"class":70,"line":398},[68,2967,2968],{"class":74},"  watts",[68,2970,2971],{"class":233}," 100.0",[68,2973,2052],{"class":283},[68,2975,2976],{"class":70,"line":411},[68,2977,395],{"class":283},[10,2979,2980],{},[31,2981,719],{},[721,2983,2984,2993,3013,3022],{},[48,2985,2986,2987],{},"resolution [ width:",[757,2988,2989,2990],{}," height:",[757,2991,2992],{},"] Camera resolution.",[48,2994,2995,2996],{},"range [ min:",[736,2997,2998,2999],{}," max:",[736,3000,3001,3002,3005,3006,3009,3010,3012],{}," ] The distance range reported by the camera, in meters. Objects closer than ",[65,3003,3004],{},"min"," or farther than ",[65,3007,3008],{},"max"," will not be displayed. ",[65,3011,3004],{}," The smaller the number, the lower the depth accuracy - do not set this value too close to 0.",[48,3014,3015,3016],{},"fov [ horizontal: ",[736,3017,3018,3019],{}," vertical: ",[736,3020,3021],{}," ] The horizontal and vertical field of view angles, in degrees.",[48,3023,3024,3025],{},"pantilt [ pan:",[736,3026,3027,3028],{}," tilt:",[736,3029,3030],{}," ] The camera's orientation angle, in degrees. The left-right position is called pan, and the up-down position is called tilt.",[45,3032,3033],{"start":343},[48,3034,3035],{},"Set up the LiDAR",[10,3037,3038],{},"The ranger model in stage can simulate a LiDAR. Enter the following code in laser.inc:",[58,3040,3042],{"className":60,"code":3041,"language":62,"meta":63,"style":63},"define my_laser ranger\n(\n  sensor(\n\n    range [ 0.0  15.0 ]     # 雷达数据采集区间\n    fov 360.0               # 视角\n    samples 720             # 采样数\n    color_rgba [ 0 0 1 0.15 ] # 可视化光束颜色以及透明度\n  )\n  model # 雷达外观\n  (\n    pose [ 0 0 0 0 ]        # 雷达位姿\n    size [ 0.07 0.07 0.05 ] # 雷达尺寸信息\n    color \"blue\"            # 雷达颜色\n  )\n)\n",[65,3043,3044,3054,3058,3063,3067,3083,3093,3104,3124,3128,3136,3141,3160,3178,3188,3192],{"__ignoreMap":63},[68,3045,3046,3048,3051],{"class":70,"line":71},[68,3047,1388],{"class":74},[68,3049,3050],{"class":78}," my_laser",[68,3052,3053],{"class":78}," ranger\n",[68,3055,3056],{"class":70,"line":132},[68,3057,823],{"class":283},[68,3059,3060],{"class":70,"line":163},[68,3061,3062],{"class":74},"  sensor(\n",[68,3064,3065],{"class":70,"line":343},[68,3066,360],{"emptyLinePlaceholder":359},[68,3068,3069,3071,3073,3075,3078,3080],{"class":70,"line":356},[68,3070,2761],{"class":74},[68,3072,831],{"class":283},[68,3074,1531],{"class":233},[68,3076,3077],{"class":233},"  15.0",[68,3079,840],{"class":78},[68,3081,3082],{"class":516},"     # 雷达数据采集区间\n",[68,3084,3085,3087,3090],{"class":70,"line":363},[68,3086,2796],{"class":74},[68,3088,3089],{"class":233}," 360.0",[68,3091,3092],{"class":516},"               # 视角\n",[68,3094,3095,3098,3101],{"class":70,"line":378},[68,3096,3097],{"class":74},"    samples",[68,3099,3100],{"class":233}," 720",[68,3102,3103],{"class":516},"             # 采样数\n",[68,3105,3106,3108,3110,3112,3114,3116,3119,3121],{"class":70,"line":398},[68,3107,1604],{"class":74},[68,3109,831],{"class":283},[68,3111,864],{"class":233},[68,3113,976],{"class":233},[68,3115,896],{"class":233},[68,3117,3118],{"class":233}," 0.15",[68,3120,840],{"class":78},[68,3122,3123],{"class":516}," # 可视化光束颜色以及透明度\n",[68,3125,3126],{"class":70,"line":411},[68,3127,2639],{"class":283},[68,3129,3130,3133],{"class":70,"line":417},[68,3131,3132],{"class":74},"  model",[68,3134,3135],{"class":516}," # 雷达外观\n",[68,3137,3138],{"class":70,"line":423},[68,3139,3140],{"class":283},"  (\n",[68,3142,3143,3145,3147,3149,3151,3153,3155,3157],{"class":70,"line":438},[68,3144,1526],{"class":74},[68,3146,831],{"class":283},[68,3148,864],{"class":233},[68,3150,976],{"class":233},[68,3152,976],{"class":233},[68,3154,976],{"class":233},[68,3156,840],{"class":78},[68,3158,3159],{"class":516},"        # 雷达位姿\n",[68,3161,3162,3164,3166,3169,3171,3173,3175],{"class":70,"line":451},[68,3163,1545],{"class":74},[68,3165,831],{"class":283},[68,3167,3168],{"class":233},"0.07",[68,3170,2952],{"class":233},[68,3172,2359],{"class":233},[68,3174,840],{"class":78},[68,3176,3177],{"class":516}," # 雷达尺寸信息\n",[68,3179,3180,3182,3185],{"class":70,"line":482},[68,3181,1596],{"class":74},[68,3183,3184],{"class":78}," \"blue\"",[68,3186,3187],{"class":516},"            # 雷达颜色\n",[68,3189,3190],{"class":70,"line":488},[68,3191,2639],{"class":283},[68,3193,3194],{"class":70,"line":1056},[68,3195,395],{"class":283},[10,3197,3198],{},[31,3199,3200],{},"ranger Summary and Default Values",[58,3202,3204],{"className":60,"code":3203,"language":62,"meta":63,"style":63}," sensor(\n   samples 180\n   range_max 8.0\n   fov 360.0\n   resolution 1\n   size [ 0.15 0.15 0.2 ]\n   color \"blue\"\n )\n",[65,3205,3206,3211,3219,3227,3235,3242,3259,3267],{"__ignoreMap":63},[68,3207,3208],{"class":70,"line":71},[68,3209,3210],{"class":74}," sensor(\n",[68,3212,3213,3216],{"class":70,"line":132},[68,3214,3215],{"class":74},"   samples",[68,3217,3218],{"class":233}," 180\n",[68,3220,3221,3224],{"class":70,"line":163},[68,3222,3223],{"class":74},"   range_max",[68,3225,3226],{"class":233}," 8.0\n",[68,3228,3229,3232],{"class":70,"line":343},[68,3230,3231],{"class":74},"   fov",[68,3233,3234],{"class":233}," 360.0\n",[68,3236,3237,3240],{"class":70,"line":356},[68,3238,3239],{"class":74},"   resolution",[68,3241,1062],{"class":233},[68,3243,3244,3247,3249,3252,3254,3257],{"class":70,"line":363},[68,3245,3246],{"class":74},"   size",[68,3248,831],{"class":283},[68,3250,3251],{"class":233},"0.15",[68,3253,3118],{"class":233},[68,3255,3256],{"class":233}," 0.2",[68,3258,956],{"class":78},[68,3260,3261,3264],{"class":70,"line":378},[68,3262,3263],{"class":74},"   color",[68,3265,3266],{"class":78}," \"blue\"\n",[68,3268,3269],{"class":70,"line":398},[68,3270,3271],{"class":283}," )\n",[10,3273,3274],{},[31,3275,719],{},[721,3277,3278,3284,3290,3296],{},[48,3279,3280,3281],{},"samples ",[757,3282,3283],{}," Number of laser samples per scan.",[48,3285,3286,3287],{},"range_max ",[736,3288,3289],{}," The maximum distance reported by the laser scanner, in meters. The scanner will not detect objects beyond this range.",[48,3291,3292,3293],{},"fov ",[736,3294,3295],{}," Angular field of view of the laser scanner.",[48,3297,749,3298],{},[757,3299,3300],{}," Only calculates the true distance for the nth laser sample. Missing samples will be filled using linear interpolation. In general, using fewer samples is better, but some (poorly implemented) programs require a fixed number of samples. Setting this number greater than 1 can reduce the required computation, which is suitable for fixed-size laser vectors.",[45,3302,3303],{"start":356},[48,3304,3305],{},"Assemble the robot",[10,3307,3308],{},"Implement robot assembly in mycar.inc:",[58,3310,3314],{"className":3311,"code":3312,"language":3313,"meta":63,"style":63},"language-SQL shiki shiki-themes github-light github-dark","\n# 组装机器人各个模块\ninclude \"robot/car_base.inc\"\ninclude \"robot/camera.inc\"\ninclude \"robot/laser.inc\"\n\ndefine my_car car_base(\n    my_camera(pose [0.15 0 0 0])\n    my_laser()\n)\n","SQL",[65,3315,3316,3320,3325,3330,3335,3340,3344,3349,3354,3359],{"__ignoreMap":63},[68,3317,3318],{"class":70,"line":71},[68,3319,360],{"emptyLinePlaceholder":359},[68,3321,3322],{"class":70,"line":132},[68,3323,3324],{},"# 组装机器人各个模块\n",[68,3326,3327],{"class":70,"line":163},[68,3328,3329],{},"include \"robot/car_base.inc\"\n",[68,3331,3332],{"class":70,"line":343},[68,3333,3334],{},"include \"robot/camera.inc\"\n",[68,3336,3337],{"class":70,"line":356},[68,3338,3339],{},"include \"robot/laser.inc\"\n",[68,3341,3342],{"class":70,"line":363},[68,3343,360],{"emptyLinePlaceholder":359},[68,3345,3346],{"class":70,"line":378},[68,3347,3348],{},"define my_car car_base(\n",[68,3350,3351],{"class":70,"line":398},[68,3352,3353],{},"    my_camera(pose [0.15 0 0 0])\n",[68,3355,3356],{"class":70,"line":411},[68,3357,3358],{},"    my_laser()\n",[68,3360,3361],{"class":70,"line":417},[68,3362,395],{},[10,3364,3365],{},"The my_car model is built on top of the car_base model, integrating the my_camera and my_laser models.",[45,3367,3368],{"start":363},[48,3369,3370],{},"Spawning a robot in the simulation environment",[10,3372,3373,3374,3376],{},"Add the following code in ",[65,3375,502],{}," to generate a robot:",[58,3378,3380],{"className":3311,"code":3379,"language":3313,"meta":63,"style":63},"\n# -----------------------------------------------------------------------------\n\n# 生成机器人\n\n# 文件包含\ninclude \"robot/mycar.inc\"\n\nmy_car(\n  name \"robot_0\"\n  color \"red\"\n  pose [ -3 -7 0 90 ] \n)\n",[65,3381,3382,3386,3390,3394,3399,3403,3408,3413,3417,3422,3427,3432,3437],{"__ignoreMap":63},[68,3383,3384],{"class":70,"line":71},[68,3385,360],{"emptyLinePlaceholder":359},[68,3387,3388],{"class":70,"line":132},[68,3389,517],{},[68,3391,3392],{"class":70,"line":163},[68,3393,360],{"emptyLinePlaceholder":359},[68,3395,3396],{"class":70,"line":343},[68,3397,3398],{},"# 生成机器人\n",[68,3400,3401],{"class":70,"line":356},[68,3402,360],{"emptyLinePlaceholder":359},[68,3404,3405],{"class":70,"line":363},[68,3406,3407],{},"# 文件包含\n",[68,3409,3410],{"class":70,"line":378},[68,3411,3412],{},"include \"robot/mycar.inc\"\n",[68,3414,3415],{"class":70,"line":398},[68,3416,360],{"emptyLinePlaceholder":359},[68,3418,3419],{"class":70,"line":411},[68,3420,3421],{},"my_car(\n",[68,3423,3424],{"class":70,"line":417},[68,3425,3426],{},"  name \"robot_0\"\n",[68,3428,3429],{"class":70,"line":423},[68,3430,3431],{},"  color \"red\"\n",[68,3433,3434],{"class":70,"line":438},[68,3435,3436],{},"  pose [ -3 -7 0 90 ] \n",[68,3438,3439],{"class":70,"line":451},[68,3440,395],{},[45,3442,3443],{"start":378},[48,3444,3445],{},"Build Execution",[10,3447,914],{},[10,3449,3450],{},"Starting rviz2 allows you to view sensor-related data in the simulation environment. After launching the keyboard control node, you can also control the robot's movement.",[10,3452,3453],{},[195,3454],{"alt":63,"src":3455},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1624.webp",[10,3457,3458],{},[195,3459],{"alt":63,"src":3460},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1625.webp",[40,3462,3464],{"id":3463},"stage_ros2-adding-multiple-robots","stage_ros2 adding multiple robots",[10,3466,3467],{},"In stage_ros2, it is also very convenient to generate multiple robots.",[45,3469,3470],{},[48,3471,3472],{},"Generate multiple robots",[10,3474,3475,3476,3478,3479,3482],{},"In ",[65,3477,502],{},", you can continue creating ",[65,3480,3481],{},"my_car"," objects to generate new robot models. Add the following code:",[58,3484,3486],{"className":60,"code":3485,"language":62,"meta":63,"style":63},"my_car(\n  name \"robot_1\"\n  color \"yellow\"\n  pose [ -1 -7 0 90 ] \n)\n",[65,3487,3488,3492,3499,3506,3526],{"__ignoreMap":63},[68,3489,3490],{"class":70,"line":71},[68,3491,3421],{"class":74},[68,3493,3494,3496],{"class":70,"line":132},[68,3495,2111],{"class":74},[68,3497,3498],{"class":78}," \"robot_1\"\n",[68,3500,3501,3503],{"class":70,"line":163},[68,3502,2017],{"class":74},[68,3504,3505],{"class":78}," \"yellow\"\n",[68,3507,3508,3510,3512,3515,3518,3520,3522,3524],{"class":70,"line":343},[68,3509,2132],{"class":74},[68,3511,831],{"class":283},[68,3513,3514],{"class":233},"-1",[68,3516,3517],{"class":233}," -7",[68,3519,976],{"class":233},[68,3521,1464],{"class":233},[68,3523,840],{"class":78},[68,3525,2052],{"class":283},[68,3527,3528],{"class":70,"line":356},[68,3529,395],{"class":283},[45,3531,3532],{"start":132},[48,3533,3445],{},[10,3535,914],{},[10,3537,3538],{},[195,3539],{"alt":63,"src":3540},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1626.webp",[10,3542,3543,3544,3546,3547,3549],{},"When multiple robots are running simultaneously, the topics published by different robots will use their respective ",[65,3545,653],{}," values as namespaces, and the coordinate transforms published by different robots will also be prefixed with the ",[65,3548,653],{}," value.",[3551,3552,3553],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .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 .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":63,"searchDepth":132,"depth":132,"links":3555},[],"/en-us/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai","10",10000000,"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/ch10-Stage_Ros2仿真平台",false,null,"en-US","en-us",{},{"title":5,"description":12},"/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仿真平台","bobdfOWWnovZoK3siHCLxlBbl8zRdhVtAXmFqTI28EU",[3576,3581,3582,3588,3594,3600,3606,3612,3618,3624,3630,3636,3642,3648,3654,3660,3666,3672,3677,3683,3688,3694,3700,3706,3712,3718,3724,3730,3736,3742,3748,3754,3760,3766,3772,3778,3784,3790,3796,3802,3808,3814,3820,3826,3832,3838,3844,3850,3856,3862,3868,3874,3880,3886,3892,3898,3904,3910,3916,3922],{"path":3577,"stem":3578,"title":3579,"date":3559,"chapter":2397,"chapterSort":3580,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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",1000000,{"path":3556,"stem":3573,"title":5,"date":3559,"chapter":3557,"chapterSort":3558,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},{"path":3583,"stem":3584,"title":3585,"date":3559,"chapter":3586,"chapterSort":3587,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3589,"stem":3590,"title":3591,"date":3559,"chapter":3592,"chapterSort":3593,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3595,"stem":3596,"title":3597,"date":3559,"chapter":3598,"chapterSort":3599,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3601,"stem":3602,"title":3603,"date":3559,"chapter":3604,"chapterSort":3605,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/en-us/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-4-Igngz2gzsim","Migrate Ign Gazebo to Gz Sim","11.4",11040000,{"path":3607,"stem":3608,"title":3609,"date":3559,"chapter":3610,"chapterSort":3611,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3613,"stem":3614,"title":3615,"date":3559,"chapter":3616,"chapterSort":3617,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3619,"stem":3620,"title":3621,"date":3559,"chapter":3622,"chapterSort":3623,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3625,"stem":3626,"title":3627,"date":3559,"chapter":3628,"chapterSort":3629,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3631,"stem":3632,"title":3633,"date":3559,"chapter":3634,"chapterSort":3635,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3637,"stem":3638,"title":3639,"date":3559,"chapter":3640,"chapterSort":3641,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3643,"stem":3644,"title":3645,"date":3559,"chapter":3646,"chapterSort":3647,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3649,"stem":3650,"title":3651,"date":3559,"chapter":3652,"chapterSort":3653,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3655,"stem":3656,"title":3657,"date":3559,"chapter":3658,"chapterSort":3659,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3661,"stem":3662,"title":3663,"date":3559,"chapter":3664,"chapterSort":3665,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3667,"stem":3668,"title":3669,"date":3559,"chapter":3670,"chapterSort":3671,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3673,"stem":3674,"title":3639,"date":3559,"chapter":3675,"chapterSort":3676,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3678,"stem":3679,"title":3680,"date":3559,"chapter":3681,"chapterSort":3682,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3684,"stem":3685,"title":3639,"date":3559,"chapter":3686,"chapterSort":3687,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3689,"stem":3690,"title":3691,"date":3559,"chapter":3692,"chapterSort":3693,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3695,"stem":3696,"title":3697,"date":3559,"chapter":3698,"chapterSort":3699,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3701,"stem":3702,"title":3703,"date":3559,"chapter":3704,"chapterSort":3705,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3707,"stem":3708,"title":3709,"date":3559,"chapter":3710,"chapterSort":3711,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3713,"stem":3714,"title":3715,"date":3559,"chapter":3716,"chapterSort":3717,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3719,"stem":3720,"title":3721,"date":3559,"chapter":3722,"chapterSort":3723,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3725,"stem":3726,"title":3727,"date":3559,"chapter":3728,"chapterSort":3729,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3731,"stem":3732,"title":3733,"date":3559,"chapter":3734,"chapterSort":3735,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3737,"stem":3738,"title":3739,"date":3559,"chapter":3740,"chapterSort":3741,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3743,"stem":3744,"title":3745,"date":3559,"chapter":3746,"chapterSort":3747,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3749,"stem":3750,"title":3751,"date":3559,"chapter":3752,"chapterSort":3753,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3755,"stem":3756,"title":3757,"date":3559,"chapter":3758,"chapterSort":3759,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3761,"stem":3762,"title":3763,"date":3559,"chapter":3764,"chapterSort":3765,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3767,"stem":3768,"title":3769,"date":3559,"chapter":3770,"chapterSort":3771,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3773,"stem":3774,"title":3775,"date":3559,"chapter":3776,"chapterSort":3777,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3779,"stem":3780,"title":3781,"date":3559,"chapter":3782,"chapterSort":3783,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3785,"stem":3786,"title":3787,"date":3559,"chapter":3788,"chapterSort":3789,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3791,"stem":3792,"title":3793,"date":3559,"chapter":3794,"chapterSort":3795,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3797,"stem":3798,"title":3799,"date":3559,"chapter":3800,"chapterSort":3801,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3803,"stem":3804,"title":3805,"date":3559,"chapter":3806,"chapterSort":3807,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3809,"stem":3810,"title":3811,"date":3559,"chapter":3812,"chapterSort":3813,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3815,"stem":3816,"title":3817,"date":3559,"chapter":3818,"chapterSort":3819,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3821,"stem":3822,"title":3823,"date":3559,"chapter":3824,"chapterSort":3825,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3827,"stem":3828,"title":3829,"date":3559,"chapter":3830,"chapterSort":3831,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3833,"stem":3834,"title":3835,"date":3559,"chapter":3836,"chapterSort":3837,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3839,"stem":3840,"title":3841,"date":3559,"chapter":3842,"chapterSort":3843,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3845,"stem":3846,"title":3847,"date":3559,"chapter":3848,"chapterSort":3849,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3851,"stem":3852,"title":3853,"date":3559,"chapter":3854,"chapterSort":3855,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3857,"stem":3858,"title":3859,"date":3559,"chapter":3860,"chapterSort":3861,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3863,"stem":3864,"title":3865,"date":3559,"chapter":3866,"chapterSort":3867,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3869,"stem":3870,"title":3871,"date":3559,"chapter":3872,"chapterSort":3873,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3875,"stem":3876,"title":3877,"date":3559,"chapter":3878,"chapterSort":3879,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3881,"stem":3882,"title":3883,"date":3559,"chapter":3884,"chapterSort":3885,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3887,"stem":3888,"title":3889,"date":3559,"chapter":3890,"chapterSort":3891,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3893,"stem":3894,"title":3895,"date":3559,"chapter":3896,"chapterSort":3897,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3899,"stem":3900,"title":3901,"date":3559,"chapter":3902,"chapterSort":3903,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3905,"stem":3906,"title":3907,"date":3559,"chapter":3908,"chapterSort":3909,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3911,"stem":3912,"title":3913,"date":3559,"chapter":3914,"chapterSort":3915,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3917,"stem":3918,"title":3919,"date":3559,"chapter":3920,"chapterSort":3921,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":3566},"/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":3562,"stem":3923,"title":3924,"date":3559,"chapter":3567,"chapterSort":3925,"docKey":3561,"docRoot":3562,"docTitle":3563,"isWikiDoc":359,"isWikiIndex":359},"_i18n/en-us/wiki/2023-12-30-ros2-tutorial/index","ROS2 Robot Operating System Tutorial",0,{"variants":3927},[3928,3929,3932,3935,3938],{"path":3556,"localeSlug":3569,"i18nKey":3565},{"path":3930,"localeSlug":3931,"i18nKey":3565},"/zh-hant/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai","zh-hant",{"path":3933,"localeSlug":3934,"i18nKey":3565},"/zh-hk/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai","zh-hk",{"path":3936,"localeSlug":3937,"i18nKey":3565},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai","zh-tw",{"path":3939,"localeSlug":3940,"i18nKey":3565},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai","zh-cn",[3556,3572,3930,3572,3933,3572,3936,3572,3939,3572],1780671799046]