[{"data":1,"prerenderedAt":3847},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1000-stage-ros2-fang-zhen-ping-tai":3,"wiki-doc-items-2023-12-30-ros2-tutorial":3427,"wiki:author-members":3835},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":3414,"chapterOrder":3415,"date":3416,"description":14,"docKey":3417,"docRoot":3418,"docTitle":3419,"extension":3420,"isWikiDoc":320,"isWikiIndex":3421,"meta":3422,"navigation":320,"path":3423,"seo":3424,"stem":3425,"wikiDepth":68,"__hash__":3426},"wiki\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1000-Stage_Ros2仿真平台.md","Stage_Ros2仿真平台",[7],"董佳辉",{"type":9,"value":10,"toc":3412},"minimark",[11,15,21,29,41,45,48,51,54,104,107,133,140,143,146,152,155,158,177,180,186,189,192,195,198,223,226,254,257,260,263,454,457,460,518,521,524,527,546,549,552,576,579,584,587,592,663,668,727,730,733,736,739,843,846,849,852,857,860,864,1091,1095,1167,1170,1175,1178,1183,1186,1191,1194,1199,1202,1207,1210,1215,1218,1221,1224,1227,1232,1235,1238,1241,1246,1249,1252,1408,1411,1413,1415,1420,1422,1426,1729,1733,1874,1877,1880,1883,1885,2069,2072,2074,2076,2081,2084,2087,2090,2093,2107,2110,2113,2116,2517,2522,2576,2580,2594,2597,2600,2731,2736,2840,2844,2893,2896,2899,3056,3061,3132,3136,3161,3164,3167,3228,3231,3234,3237,3312,3315,3317,3320,3325,3330,3333,3336,3339,3342,3389,3392,3394,3399,3408],[12,13,14],"p",{},"stage_ros2是基于Stage模拟器的ROS2功能包，用于在虚拟环境中模拟和控制机器人的行为。它提供了强大的工具和通信接口，可用于开发、测试和验证机器人系统。通过stage_ros2，用户可以轻松创建虚拟环境，并使用ROS 2发送指令控制机器人的运动，同时接收传感器数据。这个功能包可以帮助用户以更低的成本和风险进行机器人开发，提供了高效且灵活的机器人仿真环境。",[12,16,17],{},[18,19,20],"em",{},"stage使用手册：",[12,22,23],{},[24,25,26],"a",{"href":26,"rel":27},"http:\u002F\u002Frtv.github.io\u002FStage\u002Fmodules.html",[28],"nofollow",[12,30,31,32,36,37,40],{},"（ ",[33,34,35],"strong",{},"可以不学"," ，连ROS2官方都已经移除掉了Stage， ",[33,38,39],{},"用更牛X的Gazebo更好"," ，但学一学也问题不大）",[42,43,44],"h4",{"id":44},"stage_ros2安装与运行",[12,46,47],{},"1.安装",[12,49,50],{},"因为ROS2官方已经移除掉了Stage，所以我们要通过源码编译手动安装，已经有大佬适配了ROS2版本的Stage：",[12,52,53],{},"请先调用如下指令安装依赖：",[55,56,61],"pre",{"className":57,"code":58,"language":59,"meta":60,"style":60},"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","",[62,63,64],"code",{"__ignoreMap":60},[65,66,69,73,77,80,83,86,89,92,95,98,101],"span",{"class":67,"line":68},"line",1,[65,70,72],{"class":71},"sScJk","sudo",[65,74,76],{"class":75},"sZZnC"," apt-get",[65,78,79],{"class":75}," install",[65,81,82],{"class":75}," git",[65,84,85],{"class":75}," cmake",[65,87,88],{"class":75}," g++",[65,90,91],{"class":75}," libjpeg8-dev",[65,93,94],{"class":75}," libpng-dev",[65,96,97],{"class":75}," libglu1-mesa-dev",[65,99,100],{"class":75}," libltdl-dev",[65,102,103],{"class":75}," libfltk1.1-dev\n",[12,105,106],{},"进入ROS2工作空间的src目录，调用如下指令下载相关仓库：",[55,108,110],{"className":57,"code":109,"language":59,"meta":60,"style":60},"git clone https:\u002F\u002Fgithub.com\u002Fdamuxt\u002FStage.git\ngit clone https:\u002F\u002Fgithub.com\u002Fdamuxt\u002Fstage_ros2.git\n",[62,111,112,123],{"__ignoreMap":60},[65,113,114,117,120],{"class":67,"line":68},[65,115,116],{"class":71},"git",[65,118,119],{"class":75}," clone",[65,121,122],{"class":75}," https:\u002F\u002Fgithub.com\u002Fdamuxt\u002FStage.git\n",[65,124,126,128,130],{"class":67,"line":125},2,[65,127,116],{"class":71},[65,129,119],{"class":75},[65,131,132],{"class":75}," https:\u002F\u002Fgithub.com\u002Fdamuxt\u002Fstage_ros2.git\n",[12,134,135,136,139],{},"进入工作空间目录，使用",[62,137,138],{},"colcon build","指令进行构建。",[12,141,142],{},"（这是第三方作者适配Humble版本的，暂时不支持Jazzy版本，Jazzy版本目前编译会报错，可能作者会更新Jazzy版本的）",[12,144,145],{},"2.节点说明",[12,147,148,151],{},[62,149,150],{},"stage_ros2","节点是stage_ros2功能包的核心节点之一。它通过加载world文件来创建一个仿真场景，包括地图、障碍物和机器人等元素。world文件描述了虚拟环境的属性，节点会根据文件中的描述构建对应的环境。stage_ros2节点利用这个虚拟环境来模拟机器人的运动、感知和控制。通过该节点和world文件的结合，可以进行机器人的仿真和测试。",[12,153,154],{},"3.使用",[12,156,157],{},"在功能包下，已经内置了使用示例，终端下可以执行如下指令启动示例：",[55,159,161],{"className":57,"code":160,"language":59,"meta":60,"style":60},"ros2 launch stage_ros2 my_house.launch.py\n",[62,162,163],{"__ignoreMap":60},[65,164,165,168,171,174],{"class":67,"line":68},[65,166,167],{"class":71},"ros2",[65,169,170],{"class":75}," launch",[65,172,173],{"class":75}," stage_ros2",[65,175,176],{"class":75}," my_house.launch.py\n",[12,178,179],{},"模拟器以及rviz2将被启动，并且在rviz2中可以显示里程计、激光雷达以及深度相机等相关信息，运行结果如下。",[12,181,182],{},[183,184],"img",{"alt":60,"src":185},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1618.webp",[42,187,188],{"id":188},"stage_ros2仿真框架搭建",[12,190,191],{},"本节开始，我们将介绍如何通过stage_ros2自定义仿真环境。",[12,193,194],{},"1.准备工作",[12,196,197],{},"首先请创建一个功能包，指令如下：",[55,199,201],{"className":57,"code":200,"language":59,"meta":60,"style":60},"ros2 pkg create demo_stage_sim --dependencies stage_ros2\n",[62,202,203],{"__ignoreMap":60},[65,204,205,207,210,213,216,220],{"class":67,"line":68},[65,206,167],{"class":71},[65,208,209],{"class":75}," pkg",[65,211,212],{"class":75}," create",[65,214,215],{"class":75}," demo_stage_sim",[65,217,219],{"class":218},"sj4cs"," --dependencies",[65,221,222],{"class":75}," stage_ros2\n",[12,224,225],{},"然后在功能包下新建launch、world、config目录，并修改功能包下的CMakeLists.txt文件，添加如下代码：",[55,227,229],{"className":57,"code":228,"language":59,"meta":60,"style":60},"install(DIRECTORY launch world config DESTINATION share\u002F${PROJECT_NAME})\n",[62,230,231],{"__ignoreMap":60},[65,232,233,236,238,241,244,247,250],{"class":67,"line":68},[65,234,235],{"class":71},"install(DIRECTORY",[65,237,170],{"class":75},[65,239,240],{"class":75}," world",[65,242,243],{"class":75}," config",[65,245,246],{"class":75}," DESTINATION",[65,248,249],{"class":75}," share\u002F",[65,251,253],{"class":252},"sVt8B","${PROJECT_NAME})\n",[12,255,256],{},"其中，launch目录用于存储launch文件，config用于存储rviz2的配置文件，world用于存储仿真相关文件。world目录中请新建maps目录，并将课程配套资料中的图片素材复制进去。",[12,258,259],{},"2.搭建代码框架",[12,261,262],{},"在功能包的launch目录下，新建stage_sim.launch.py文件，并输入如下内容：",[55,264,266],{"className":57,"code":265,"language":59,"meta":60,"style":60},"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",[62,267,268,276,290,302,315,322,337,358,371,377,383,398,411,442,448],{"__ignoreMap":60},[65,269,270,273],{"class":67,"line":68},[65,271,272],{"class":71},"import",[65,274,275],{"class":75}," os\n",[65,277,278,281,284,287],{"class":67,"line":125},[65,279,280],{"class":71},"from",[65,282,283],{"class":75}," ament_index_python.packages",[65,285,286],{"class":75}," import",[65,288,289],{"class":75}," get_package_share_directory\n",[65,291,293,295,297,299],{"class":67,"line":292},3,[65,294,280],{"class":71},[65,296,170],{"class":75},[65,298,286],{"class":75},[65,300,301],{"class":75}," LaunchDescription\n",[65,303,305,307,310,312],{"class":67,"line":304},4,[65,306,280],{"class":71},[65,308,309],{"class":75}," launch_ros.actions",[65,311,286],{"class":75},[65,313,314],{"class":75}," Node\n",[65,316,318],{"class":67,"line":317},5,[65,319,321],{"emptyLinePlaceholder":320},true,"\n",[65,323,325,328,331,334],{"class":67,"line":324},6,[65,326,327],{"class":71},"def",[65,329,330],{"class":75}," generate_launch_description",[65,332,333],{"class":252},"()",[65,335,336],{"class":75},":\n",[65,338,340,343,346,349,352,355],{"class":67,"line":339},7,[65,341,342],{"class":71},"    this_directory",[65,344,345],{"class":75}," =",[65,347,348],{"class":75}," get_package_share_directory",[65,350,351],{"class":252},"(",[65,353,354],{"class":71},"'demo_stage_sim'",[65,356,357],{"class":252},")\n",[65,359,361,365,368],{"class":67,"line":360},8,[65,362,364],{"class":363},"szBVR","return",[65,366,367],{"class":75}," LaunchDescription",[65,369,370],{"class":252},"([\n",[65,372,374],{"class":67,"line":373},9,[65,375,376],{"class":252},"        Node(\n",[65,378,380],{"class":67,"line":379},10,[65,381,382],{"class":252},"            package='stage_ros2',\n",[65,384,386,389,392,395],{"class":67,"line":385},11,[65,387,388],{"class":252},"            executable",[65,390,391],{"class":363},"=",[65,393,394],{"class":75},"'stage_ros2'",[65,396,397],{"class":252},",\n",[65,399,401,404,406,409],{"class":67,"line":400},12,[65,402,403],{"class":252},"            name",[65,405,391],{"class":363},[65,407,408],{"class":75},"'stage'",[65,410,397],{"class":252},[65,412,414,417,419,422,425,428,431,434,436,439],{"class":67,"line":413},13,[65,415,416],{"class":252},"            parameters",[65,418,391],{"class":363},[65,420,421],{"class":252},"[{",[65,423,424],{"class":75},"\"world_file\"",[65,426,427],{"class":252},": os.path.join(this_directory",[65,429,430],{"class":363},",",[65,432,433],{"class":75},"'world'",[65,435,430],{"class":363},[65,437,438],{"class":75},"'sim.world'",[65,440,441],{"class":252},")}],\n",[65,443,445],{"class":67,"line":444},14,[65,446,447],{"class":252},"        )\n",[65,449,451],{"class":67,"line":450},15,[65,452,453],{"class":252},"    ])\n",[12,455,456],{},"该launch文件将运行stage_ros2节点，并加载world目录下的sim.world文件。",[12,458,459],{},"在world目录下，新建sim.world文件，并输入如下内容：",[55,461,463],{"className":57,"code":462,"language":59,"meta":60,"style":60},"\n# -----------------------------------------------------------------------------\n\n# 设置窗体\n\n# 设置模拟器地图分辨率(以 米\u002F像素 为单位)\nresolution 0.02\n\n# 设置模拟器的时间步长(以 毫秒 为单位)\ninterval_sim 100\n",[62,464,465,469,475,479,484,488,493,501,505,510],{"__ignoreMap":60},[65,466,467],{"class":67,"line":68},[65,468,321],{"emptyLinePlaceholder":320},[65,470,471],{"class":67,"line":125},[65,472,474],{"class":473},"sJ8bj","# -----------------------------------------------------------------------------\n",[65,476,477],{"class":67,"line":292},[65,478,321],{"emptyLinePlaceholder":320},[65,480,481],{"class":67,"line":304},[65,482,483],{"class":473},"# 设置窗体\n",[65,485,486],{"class":67,"line":317},[65,487,321],{"emptyLinePlaceholder":320},[65,489,490],{"class":67,"line":324},[65,491,492],{"class":473},"# 设置模拟器地图分辨率(以 米\u002F像素 为单位)\n",[65,494,495,498],{"class":67,"line":339},[65,496,497],{"class":71},"resolution",[65,499,500],{"class":218}," 0.02\n",[65,502,503],{"class":67,"line":360},[65,504,321],{"emptyLinePlaceholder":320},[65,506,507],{"class":67,"line":373},[65,508,509],{"class":473},"# 设置模拟器的时间步长(以 毫秒 为单位)\n",[65,511,512,515],{"class":67,"line":379},[65,513,514],{"class":71},"interval_sim",[65,516,517],{"class":218}," 100\n",[12,519,520],{},"sim.world文件当前只是声明了仿真环境的一些通用参数。",[12,522,523],{},"3.编译",[12,525,526],{},"终端中进入当前工作空间，编译功能包：",[55,528,530],{"className":57,"code":529,"language":59,"meta":60,"style":60},"colcon build --packages-select demo_stage_sim\n",[62,531,532],{"__ignoreMap":60},[65,533,534,537,540,543],{"class":67,"line":68},[65,535,536],{"class":71},"colcon",[65,538,539],{"class":75}," build",[65,541,542],{"class":218}," --packages-select",[65,544,545],{"class":75}," demo_stage_sim\n",[12,547,548],{},"4.执行",[12,550,551],{},"当前工作空间下，启动终端，并输入如下指令：",[55,553,555],{"className":57,"code":554,"language":59,"meta":60,"style":60},". install\u002Fsetup.bash\nros2 launch demo_stage_sim stage_sim.launch.py\n",[62,556,557,565],{"__ignoreMap":60},[65,558,559,562],{"class":67,"line":68},[65,560,561],{"class":218},".",[65,563,564],{"class":75}," install\u002Fsetup.bash\n",[65,566,567,569,571,573],{"class":67,"line":125},[65,568,167],{"class":71},[65,570,170],{"class":75},[65,572,215],{"class":75},[65,574,575],{"class":75}," stage_sim.launch.py\n",[12,577,578],{},"执行该launch文件后，将生成一个窗口，该窗口中并无任何内容，下一步我们就可以着手创建具体的仿真内容了。",[12,580,581],{},[183,582],{"alt":60,"src":583},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1619.webp",[12,585,586],{},"5.world文件参数",[12,588,589],{},[33,590,591],{},"摘要和默认值",[55,593,595],{"className":57,"code":594,"language":59,"meta":60,"style":60},"name                      \u003Cworldfile name>\ninterval_sim              100\nquit_time                 0\nresolution                0.02\nshow_clock                0\nshow_clock_interval       100\nthreads                   0\n",[62,596,597,617,624,632,639,647,655],{"__ignoreMap":60},[65,598,599,602,605,608,611,614],{"class":67,"line":68},[65,600,601],{"class":71},"name",[65,603,604],{"class":363},"                      \u003C",[65,606,607],{"class":75},"worldfile",[65,609,610],{"class":75}," nam",[65,612,613],{"class":252},"e",[65,615,616],{"class":363},">\n",[65,618,619,621],{"class":67,"line":125},[65,620,514],{"class":71},[65,622,623],{"class":218},"              100\n",[65,625,626,629],{"class":67,"line":292},[65,627,628],{"class":71},"quit_time",[65,630,631],{"class":218},"                 0\n",[65,633,634,636],{"class":67,"line":304},[65,635,497],{"class":71},[65,637,638],{"class":218},"                0.02\n",[65,640,641,644],{"class":67,"line":317},[65,642,643],{"class":71},"show_clock",[65,645,646],{"class":218},"                0\n",[65,648,649,652],{"class":67,"line":324},[65,650,651],{"class":71},"show_clock_interval",[65,653,654],{"class":218},"       100\n",[65,656,657,660],{"class":67,"line":339},[65,658,659],{"class":71},"threads",[65,661,662],{"class":218},"                   0\n",[12,664,665],{},[33,666,667],{},"详解",[669,670,671,678,681,687,690,696,702,708,711,716,719,724],"ul",{},[672,673,674,675],"li",{},"name ",[676,677],"string",{},[672,679,680],{},"用于世界的识别名称，例如在图形用户界面的标题栏中使用。",[672,682,683,684],{},"interval_sim ",[685,686],"float",{},[672,688,689],{},"每次调用 World::Update() 时运行的模拟时间量。每个模型都有其自己可配置的更新间隔，可以大于或小于此值，但比此值更短的间隔在图形用户界面或 World 更新回调中是不可见的。您可能不需要改变默认值100毫秒：此值在客户端内部使用，如Player和WebSim。",[672,691,692,693],{},"quit_time ",[685,694,695],{}," 在模拟时间达到指定的秒数后停止模拟。在 libstage 中，World::Update() 返回 true。在带有图形用户界面的 Stage 中，模拟被暂停。在没有图形用户界面的 Stage 中，Stage 会退出。",[672,697,698,699],{},"resolution ",[685,700,701],{}," 底层位图模型的分辨率（以米为单位）。较大的值可以加快射线追踪速度，但会以碰撞检测和感知精度为代价。通常情况下，默认值是一个合理的选择。",[672,703,704,705],{},"show_clock ",[706,707],"int",{},[672,709,710],{},"如果非零，每经过 $show_clock_interval 次更新就在标准输出上打印模拟时间。这对于观察非 GUI 模拟的进展非常有用。",[672,712,713,714],{},"show_clock_interval ",[706,715],{},[672,717,718],{},"设置在启用 $show_clock 的情况下，在标准输出上打印时间之间的更新次数。默认值是每经过 10 秒模拟时间打印一次。较小的值会稍微降低模拟速度。",[672,720,721,722],{},"threads ",[706,723],{},[672,725,726],{},"要生成的工作线程数。一些模型可以并行更新（例如激光器、测距仪），在这里运行 2 个或更多线程可能会使模拟运行更快，取决于可用的 CPU 内核数量和世界文件的情况。如果您有启用并行的高分辨率模型（例如带有数百或数千个样本的激光器或大量模型），则每个内核使用一个线程。",[42,728,729],{"id":729},"stage_ros2设置窗体",[12,731,732],{},"stage 窗体由菜单栏和模拟世界的视图组成。我们可以放大和缩小视图，并滚动视图以查看模拟世界的更多内容。模拟的机器人设备、障碍物等被渲染为彩色多边形。窗体中还可以实现各种传感器和执行器模型的数据和配置的可视化。菜单则具有用于控制呈现哪些数据和配置的选项。本节我们将介绍如何设置以及操作stage窗体。",[12,734,735],{},"1.设置窗体",[12,737,738],{},"设置窗体相关参数，可以在stage_sim.launch.py文件中添加如下内容：",[55,740,742],{"className":57,"code":741,"language":59,"meta":60,"style":60},"\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",[62,743,744,748,753,758,763,783,794,812,828,839],{"__ignoreMap":60},[65,745,746],{"class":67,"line":68},[65,747,321],{"emptyLinePlaceholder":320},[65,749,750],{"class":67,"line":125},[65,751,752],{"class":473},"# 配置窗体参数\n",[65,754,755],{"class":67,"line":292},[65,756,757],{"class":71},"window\n",[65,759,760],{"class":67,"line":304},[65,761,762],{"class":252},"(\n",[65,764,765,768,771,774,777,780],{"class":67,"line":317},[65,766,767],{"class":71},"  size",[65,769,770],{"class":252}," [ ",[65,772,773],{"class":218},"700.000",[65,775,776],{"class":218}," 700.000",[65,778,779],{"class":75}," ]",[65,781,782],{"class":473}," # 窗体尺寸(以 像素 为单位)\n",[65,784,785,788,791],{"class":67,"line":324},[65,786,787],{"class":71},"  scale",[65,789,790],{"class":218}," 35",[65,792,793],{"class":473},"  # 缩放比\n",[65,795,796,799,801,804,807,809],{"class":67,"line":339},[65,797,798],{"class":71},"  center",[65,800,770],{"class":252},[65,802,803],{"class":218},"0",[65,805,806],{"class":218},"  0",[65,808,779],{"class":75},[65,810,811],{"class":473}," # 地图相对于窗体的偏移量(以 米 为单位)\n",[65,813,814,817,819,821,823,825],{"class":67,"line":360},[65,815,816],{"class":71},"  rotate",[65,818,770],{"class":252},[65,820,803],{"class":218},[65,822,806],{"class":218},[65,824,779],{"class":75},[65,826,827],{"class":473}," # 地图旋转角度\n",[65,829,830,833,836],{"class":67,"line":373},[65,831,832],{"class":71},"  show_data",[65,834,835],{"class":218}," 1",[65,837,838],{"class":473},"     # 是否显示传感器数据 1=on 0=off\n",[65,840,841],{"class":67,"line":379},[65,842,357],{"class":252},[12,844,845],{},"上述代码创建了一个窗体对象，该窗体分辨率为700*700，使用了35倍缩放比，后续加载的地图相对于窗体无偏移无旋转且会以可视化的方式显示传感器数据。",[12,847,848],{},"2.编译执行",[12,850,851],{},"构建功能包并执行launch文件后，运行结果如下。",[12,853,854],{},[183,855],{"alt":60,"src":856},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1620.webp",[12,858,859],{},"3.窗体参数",[12,861,862],{},[33,863,591],{},[55,865,867],{"className":57,"code":866,"language":59,"meta":60,"style":60},"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",[62,868,869,873,877,892,896,901,914,926,933,937,942,959,973,977,982,989,998,1006,1014,1022,1030,1038,1046,1054,1062,1070,1078,1086],{"__ignoreMap":60},[65,870,871],{"class":67,"line":68},[65,872,757],{"class":71},[65,874,875],{"class":67,"line":125},[65,876,762],{"class":252},[65,878,879,881,883,886,889],{"class":67,"line":292},[65,880,767],{"class":71},[65,882,770],{"class":252},[65,884,885],{"class":218},"400",[65,887,888],{"class":218}," 300",[65,890,891],{"class":75}," ]\n",[65,893,894],{"class":67,"line":304},[65,895,321],{"emptyLinePlaceholder":320},[65,897,898],{"class":67,"line":317},[65,899,900],{"class":473},"  # camera options\n",[65,902,903,905,907,909,912],{"class":67,"line":324},[65,904,798],{"class":71},[65,906,770],{"class":252},[65,908,803],{"class":218},[65,910,911],{"class":218}," 0",[65,913,891],{"class":75},[65,915,916,918,920,922,924],{"class":67,"line":339},[65,917,816],{"class":71},[65,919,770],{"class":252},[65,921,803],{"class":218},[65,923,911],{"class":218},[65,925,891],{"class":75},[65,927,928,930],{"class":67,"line":360},[65,929,787],{"class":71},[65,931,932],{"class":218}," 1.0\n",[65,934,935],{"class":67,"line":373},[65,936,321],{"emptyLinePlaceholder":320},[65,938,939],{"class":67,"line":379},[65,940,941],{"class":473},"  # perspective camera options\n",[65,943,944,947,949,951,954,957],{"class":67,"line":385},[65,945,946],{"class":71},"  pcam_loc",[65,948,770],{"class":252},[65,950,803],{"class":218},[65,952,953],{"class":218}," -4",[65,955,956],{"class":218}," 2",[65,958,891],{"class":75},[65,960,961,964,966,969,971],{"class":67,"line":400},[65,962,963],{"class":71},"  pcam_angle",[65,965,770],{"class":252},[65,967,968],{"class":218},"70",[65,970,911],{"class":218},[65,972,891],{"class":75},[65,974,975],{"class":67,"line":413},[65,976,321],{"emptyLinePlaceholder":320},[65,978,979],{"class":67,"line":444},[65,980,981],{"class":473},"  # GUI options\n",[65,983,984,986],{"class":67,"line":450},[65,985,832],{"class":71},[65,987,988],{"class":218}," 0\n",[65,990,992,995],{"class":67,"line":991},16,[65,993,994],{"class":71},"  show_flags",[65,996,997],{"class":218}," 1\n",[65,999,1001,1004],{"class":67,"line":1000},17,[65,1002,1003],{"class":71},"  show_blocks",[65,1005,997],{"class":218},[65,1007,1009,1012],{"class":67,"line":1008},18,[65,1010,1011],{"class":71},"  show_clock",[65,1013,997],{"class":218},[65,1015,1017,1020],{"class":67,"line":1016},19,[65,1018,1019],{"class":71},"  show_footprints",[65,1021,988],{"class":218},[65,1023,1025,1028],{"class":67,"line":1024},20,[65,1026,1027],{"class":71},"  show_grid",[65,1029,997],{"class":218},[65,1031,1033,1036],{"class":67,"line":1032},21,[65,1034,1035],{"class":71},"  show_trailarrows",[65,1037,988],{"class":218},[65,1039,1041,1044],{"class":67,"line":1040},22,[65,1042,1043],{"class":71},"  show_trailrise",[65,1045,988],{"class":218},[65,1047,1049,1052],{"class":67,"line":1048},23,[65,1050,1051],{"class":71},"  show_trailfast",[65,1053,988],{"class":218},[65,1055,1057,1060],{"class":67,"line":1056},24,[65,1058,1059],{"class":71},"  show_occupancy",[65,1061,988],{"class":218},[65,1063,1065,1068],{"class":67,"line":1064},25,[65,1066,1067],{"class":71},"  show_tree",[65,1069,988],{"class":218},[65,1071,1073,1076],{"class":67,"line":1072},26,[65,1074,1075],{"class":71},"  pcam_on",[65,1077,988],{"class":218},[65,1079,1081,1084],{"class":67,"line":1080},27,[65,1082,1083],{"class":71},"  screenshots",[65,1085,988],{"class":218},[65,1087,1089],{"class":67,"line":1088},28,[65,1090,357],{"class":252},[12,1092,1093],{},[33,1094,667],{},[669,1096,1097,1102,1105,1114,1117,1120,1123,1132,1135,1140,1143,1146,1149,1156,1159,1164],{},[672,1098,1099,1100],{},"speedup ",[706,1101],{},[672,1103,1104],{},"Stage 将尝试以实时的这个倍数运行。如果设置为 -1，Stage 将尽可能以最快速度运行，并且不会尝试跟踪实时时间。",[672,1106,1107,1108,1111,779],{},"size [",[24,1109,1110],{"href":1110},"width:int",[24,1112,1113],{"href":1113},"height:int",[672,1115,1116],{},"窗口的大小（以像素为单位）。",[672,1118,1119],{},"center [\u003Cx:float>\u003Cy:float> ]",[672,1121,1122],{},"窗口中心的位置，使用世界坐标表示（以米为单位）。",[672,1124,1125,1126,1129,779],{},"rotate [",[24,1127,1128],{"href":1128},"pitch:float",[24,1130,1131],{"href":1131},"yaw:float",[672,1133,1134],{},"相对于垂直向上的角度，旋转角度（以度为单位）。",[672,1136,1137,1138],{},"scale",[685,1139],{},[672,1141,1142],{},"世界坐标到像素坐标的比例（窗口缩放）。",[672,1144,1145],{},"pcam_loc [\u003Cx:int>\u003Cy:int>\u003Cz:int> ]",[672,1147,1148],{},"透视摄像机的位置（以米为单位）。",[672,1150,1151,1152,1154,779],{},"pcam_angle [",[24,1153,1128],{"href":1128},[24,1155,1131],{"href":1131},[672,1157,1158],{},"透视摄像机的垂直和水平角度。",[672,1160,1161,1162],{},"pcam_on",[706,1163],{},[672,1165,1166],{},"是否启用透视摄像机（0\u002F1）。",[12,1168,1169],{},"4.操作窗体",[12,1171,1172],{},[33,1173,1174],{},"滚动视图",[12,1176,1177],{},"在背景上左键单击并拖动以移动你对世界的视图。",[12,1179,1180],{},[33,1181,1182],{},"缩放视图",[12,1184,1185],{},"滚动鼠标滚轮可放大或缩小鼠标光标处的位置。",[12,1187,1188],{},[33,1189,1190],{},"保存世界",[12,1192,1193],{},"你可以保存当前世界中所有事物的位置，使用“文件\u002F保存”菜单项。警告：保存的位置将覆盖当前的世界文件。在保存之前，先复制你的世界文件，以保留旧的位置。另外，可以使用“文件\u002F另存为”菜单项将其保存到一个新的世界文件中。",[12,1195,1196],{},[33,1197,1198],{},"暂停和恢复时钟",[12,1200,1201],{},"按下“p”键可以暂停或恢复模拟。按下“.”（句号）键可以运行一个模拟步骤。按住“.”键可以重复多次步进。步进会让模拟暂停，所以按下“p”键可以恢复运行。可以在世界文件中使用“paused”属性来设置初始的暂停\u002F运行状态。",[12,1203,1204],{},[33,1205,1206],{},"选择模型",[12,1208,1209],{},"可以通过点击左键来选择模型。通过按住Shift键并点击多个模型，也可以选择多个模型。选择的模型可以通过拖动来移动，或者通过按住右键并移动鼠标来旋转。点击世界中的空白位置可以清除选择。在清除选择后，最后选中的单个模型将被保存为影响特定模型的几个视图选项的目标。",[12,1211,1212],{},[33,1213,1214],{},"视图选项",[12,1216,1217],{},"视图菜单提供了许多影响世界渲染方式的功能。在每个选项的右侧，通常有一个按键快捷键，可快速切换相关选项。",[12,1219,1220],{},"“Data”选项（快捷键'd'）可切换传感器数据可视化。滤波器数据选项（快捷键Shift+'d'）打开对话框，可启用或禁用特定传感器的可视化。对话框中的“Visualize All”选项可切换是否为所有模型启用传感器可视化，还是仅为当前选择的模型启用。",[12,1222,1223],{},"“Follow”选项可保持视图始终在最后选择的模型上。",[12,1225,1226],{},"“Perspective camera”选项可以从正交视图切换到透视视图。",[12,1228,1229],{},[33,1230,1231],{},"保存截图",[12,1233,1234],{},"要保存世界的一系列截图，从视图菜单中选择“Save screenshots”选项以开始录制图像，然后再次从菜单中选择该选项以停止。",[42,1236,1237],{"id":1237},"stage_ros2基本模型",[12,1239,1240],{},"基本模型（model）模拟具有基本属性的对象；位置、大小、速度、颜色、对各种传感器的可见性等。基本模型还具有由线性列表组成的主体。在内部，基本模型被用作所有其他模型类型的基类。我们可以使用基本模型来模拟环境对象。在stage中，底盘模型、雷达模型、相机模型等都可以看作是基本模型的子类。",[12,1242,1243],{},[183,1244],{"alt":60,"src":1245},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1621.webp",[12,1247,1248],{},"1.添加基本模型",[12,1250,1251],{},"在stage_sim.launch.py文件中添加如下内容：",[55,1253,1255],{"className":57,"code":1254,"language":59,"meta":60,"style":60},"\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\u002Fghost.png\")\n",[62,1256,1257,1261,1265,1269,1274,1303,1307,1312,1323,1327,1340,1347,1354,1361,1365,1369,1374],{"__ignoreMap":60},[65,1258,1259],{"class":67,"line":68},[65,1260,321],{"emptyLinePlaceholder":320},[65,1262,1263],{"class":67,"line":125},[65,1264,474],{"class":473},[65,1266,1267],{"class":67,"line":292},[65,1268,321],{"emptyLinePlaceholder":320},[65,1270,1271],{"class":67,"line":304},[65,1272,1273],{"class":473},"# 添加障碍物\n",[65,1275,1276,1279,1282,1284,1287,1289,1291,1293,1295,1298,1301],{"class":67,"line":317},[65,1277,1278],{"class":71},"model(",[65,1280,1281],{"class":75}," pose",[65,1283,770],{"class":252},[65,1285,1286],{"class":218},"-2",[65,1288,953],{"class":218},[65,1290,911],{"class":218},[65,1292,911],{"class":218},[65,1294,779],{"class":75},[65,1296,1297],{"class":75}," color",[65,1299,1300],{"class":75}," \"green\"",[65,1302,357],{"class":252},[65,1304,1305],{"class":67,"line":324},[65,1306,321],{"emptyLinePlaceholder":320},[65,1308,1309],{"class":67,"line":339},[65,1310,1311],{"class":473},"# define a block\n",[65,1313,1314,1317,1320],{"class":67,"line":360},[65,1315,1316],{"class":71},"define",[65,1318,1319],{"class":75}," my_block",[65,1321,1322],{"class":75}," model\n",[65,1324,1325],{"class":67,"line":373},[65,1326,762],{"class":252},[65,1328,1329,1331,1334,1337],{"class":67,"line":379},[65,1330,767],{"class":71},[65,1332,1333],{"class":252}," [1.0 ",[65,1335,1336],{"class":218},"1.0",[65,1338,1339],{"class":75}," 1.0]\n",[65,1341,1342,1345],{"class":67,"line":385},[65,1343,1344],{"class":71},"  gui_nose",[65,1346,988],{"class":218},[65,1348,1349,1352],{"class":67,"line":400},[65,1350,1351],{"class":71},"  gui_grid",[65,1353,988],{"class":218},[65,1355,1356,1359],{"class":67,"line":413},[65,1357,1358],{"class":71},"  gui_outline",[65,1360,988],{"class":218},[65,1362,1363],{"class":67,"line":444},[65,1364,357],{"class":252},[65,1366,1367],{"class":67,"line":450},[65,1368,321],{"emptyLinePlaceholder":320},[65,1370,1371],{"class":67,"line":991},[65,1372,1373],{"class":473},"# throw in a block\n",[65,1375,1376,1379,1381,1383,1385,1388,1390,1393,1395,1397,1400,1403,1406],{"class":67,"line":1000},[65,1377,1378],{"class":71},"my_block(",[65,1380,1281],{"class":75},[65,1382,770],{"class":252},[65,1384,803],{"class":218},[65,1386,1387],{"class":218}," 4",[65,1389,911],{"class":218},[65,1391,1392],{"class":218}," 90",[65,1394,779],{"class":75},[65,1396,1297],{"class":75},[65,1398,1399],{"class":75}," \"red\"",[65,1401,1402],{"class":75}," bitmap",[65,1404,1405],{"class":75}," \"maps\u002Fghost.png\"",[65,1407,357],{"class":252},[12,1409,1410],{},"上述代码中，直接使用默认的基础model创建了一个绿色模型对象，并且还自定义了继承自model的my_block模型，然后创建了该模型对象。",[12,1412,848],{},[12,1414,851],{},[12,1416,1417],{},[183,1418],{"alt":60,"src":1419},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1622.webp",[12,1421,859],{},[12,1423,1424],{},[33,1425,591],{},[55,1427,1429],{"className":57,"code":1428,"language":59,"meta":60,"style":60},"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",[62,1430,1431,1439,1458,1475,1492,1509,1517,1535,1543,1550,1554,1559,1566,1573,1580,1587,1594,1602,1609,1616,1623,1627,1632,1639,1646,1653,1684,1691,1699,1708,1716,1724],{"__ignoreMap":60},[65,1432,1433,1436],{"class":67,"line":68},[65,1434,1435],{"class":71},"model",[65,1437,1438],{"class":252}," (\n",[65,1440,1441,1444,1446,1449,1452,1454,1456],{"class":67,"line":125},[65,1442,1443],{"class":71},"    pose",[65,1445,770],{"class":252},[65,1447,1448],{"class":218},"0.0",[65,1450,1451],{"class":218}," 0.0",[65,1453,1451],{"class":218},[65,1455,1451],{"class":218},[65,1457,891],{"class":75},[65,1459,1460,1463,1465,1468,1471,1473],{"class":67,"line":292},[65,1461,1462],{"class":71},"    size",[65,1464,770],{"class":252},[65,1466,1467],{"class":218},"0.1",[65,1469,1470],{"class":218}," 0.1",[65,1472,1470],{"class":218},[65,1474,891],{"class":75},[65,1476,1477,1480,1482,1484,1486,1488,1490],{"class":67,"line":304},[65,1478,1479],{"class":71},"    origin",[65,1481,770],{"class":252},[65,1483,1448],{"class":218},[65,1485,1451],{"class":218},[65,1487,1451],{"class":218},[65,1489,1451],{"class":218},[65,1491,891],{"class":75},[65,1493,1494,1497,1499,1501,1503,1505,1507],{"class":67,"line":317},[65,1495,1496],{"class":71},"    velocity",[65,1498,770],{"class":252},[65,1500,1448],{"class":218},[65,1502,1451],{"class":218},[65,1504,1451],{"class":218},[65,1506,1451],{"class":218},[65,1508,891],{"class":75},[65,1510,1511,1514],{"class":67,"line":324},[65,1512,1513],{"class":71},"    color",[65,1515,1516],{"class":75}," \"red\"\n",[65,1518,1519,1522,1524,1526,1528,1530,1533],{"class":67,"line":339},[65,1520,1521],{"class":71},"    color_rgba",[65,1523,770],{"class":252},[65,1525,1448],{"class":218},[65,1527,1451],{"class":218},[65,1529,1451],{"class":218},[65,1531,1532],{"class":218}," 1.0",[65,1534,891],{"class":75},[65,1536,1537,1540],{"class":67,"line":360},[65,1538,1539],{"class":71},"    bitmap",[65,1541,1542],{"class":75}," \"\"\n",[65,1544,1545,1548],{"class":67,"line":373},[65,1546,1547],{"class":71},"    ctrl",[65,1549,1542],{"class":75},[65,1551,1552],{"class":67,"line":379},[65,1553,321],{"emptyLinePlaceholder":320},[65,1555,1556],{"class":67,"line":385},[65,1557,1558],{"class":473},"    # determine how the model appears in various sensors\n",[65,1560,1561,1564],{"class":67,"line":400},[65,1562,1563],{"class":71},"    fiducial_return",[65,1565,988],{"class":218},[65,1567,1568,1571],{"class":67,"line":413},[65,1569,1570],{"class":71},"    fiducial_key",[65,1572,988],{"class":218},[65,1574,1575,1578],{"class":67,"line":444},[65,1576,1577],{"class":71},"    obstacle_return",[65,1579,997],{"class":218},[65,1581,1582,1585],{"class":67,"line":450},[65,1583,1584],{"class":71},"    ranger_return",[65,1586,997],{"class":218},[65,1588,1589,1592],{"class":67,"line":991},[65,1590,1591],{"class":71},"    blob_return",[65,1593,997],{"class":218},[65,1595,1596,1599],{"class":67,"line":1000},[65,1597,1598],{"class":71},"    laser_return",[65,1600,1601],{"class":75}," LaserVisible\n",[65,1603,1604,1607],{"class":67,"line":1008},[65,1605,1606],{"class":71},"    gripper_return",[65,1608,988],{"class":218},[65,1610,1611,1614],{"class":67,"line":1016},[65,1612,1613],{"class":71},"    gravity_return",[65,1615,988],{"class":218},[65,1617,1618,1621],{"class":67,"line":1024},[65,1619,1620],{"class":71},"    sticky_return",[65,1622,988],{"class":218},[65,1624,1625],{"class":67,"line":1032},[65,1626,321],{"emptyLinePlaceholder":320},[65,1628,1629],{"class":67,"line":1040},[65,1630,1631],{"class":473},"    # GUI properties\n",[65,1633,1634,1637],{"class":67,"line":1048},[65,1635,1636],{"class":71},"    gui_nose",[65,1638,988],{"class":218},[65,1640,1641,1644],{"class":67,"line":1056},[65,1642,1643],{"class":71},"    gui_grid",[65,1645,988],{"class":218},[65,1647,1648,1651],{"class":67,"line":1064},[65,1649,1650],{"class":71},"    gui_outline",[65,1652,997],{"class":218},[65,1654,1655,1658,1660,1663,1666,1669,1672,1675,1678,1681],{"class":67,"line":1072},[65,1656,1657],{"class":71},"    gui_move",[65,1659,911],{"class":218},[65,1661,1662],{"class":252}," (1 ",[65,1664,1665],{"class":75},"if",[65,1667,1668],{"class":75}," the",[65,1670,1671],{"class":75}," model",[65,1673,1674],{"class":75}," has",[65,1676,1677],{"class":75}," no",[65,1679,1680],{"class":75}," parents",[65,1682,1683],{"class":252},");\n",[65,1685,1686,1689],{"class":67,"line":1080},[65,1687,1688],{"class":71},"    boundary",[65,1690,988],{"class":218},[65,1692,1693,1696],{"class":67,"line":1088},[65,1694,1695],{"class":71},"    mass",[65,1697,1698],{"class":218}," 10.0\n",[65,1700,1702,1705],{"class":67,"line":1701},29,[65,1703,1704],{"class":71},"    map_resolution",[65,1706,1707],{"class":218}," 0.1\n",[65,1709,1711,1714],{"class":67,"line":1710},30,[65,1712,1713],{"class":71},"    say",[65,1715,1542],{"class":75},[65,1717,1719,1722],{"class":67,"line":1718},31,[65,1720,1721],{"class":71},"    alwayson",[65,1723,988],{"class":218},[65,1725,1727],{"class":67,"line":1726},32,[65,1728,357],{"class":252},[12,1730,1731],{},[33,1732,667],{},[669,1734,1735,1750,1760,1772,1787,1790,1796,1802,1808,1814,1820,1826,1832,1838,1844,1850,1856,1862,1868],{},[672,1736,1737,1738],{},"pose [ x:",[685,1739,1740,1741],{}," y:",[685,1742,1743,1744],{}," z:",[685,1745,1746,1747],{}," heading:",[685,1748,1749],{}," ] 指定模型在其父坐标系中的姿态。",[672,1751,1752,1753],{},"size [ x:",[685,1754,1740,1755],{},[685,1756,1743,1757],{},[685,1758,1759],{}," ] 指定模型在各个维度上的大小。",[672,1761,1762,1763],{},"origin [ x:",[685,1764,1740,1765],{},[685,1766,1743,1767],{},[685,1768,1746,1769],{},[685,1770,1771],{}," ] 指定对象中心的位置，相对于其姿态。",[672,1773,1774,1775],{},"velocity [ x:",[685,1776,1740,1777],{},[685,1778,1743,1779],{},[685,1780,1746,1781],{},[685,1782,1783,1784],{}," omega:",[685,1785,1786],{}," ] 指定模型的初始速度。请注意，如果模型撞到障碍物，其速度将被设置为零。",[672,1788,1789],{},"velocity_enable int (默认为0) 大多数模型忽略其速度状态。这样可以节省处理时间，因为大多数模型的速度永远不会被设置为非零值。一些子类（例如ModelPosition）会改变这个默认值，因为它们期望移动。用户可以在这里指定一个非零值来启用对该模型的速度控制。这与调用Model::VelocityEnable()的效果相同。",[672,1791,1792,1793],{},"color ",[676,1794,1795],{}," 使用X11数据库（rgb.txt）中的颜色名称指定对象的颜色。",[672,1797,1798,1799],{},"bitmap filename:",[676,1800,1801],{}," 通过解释位图中的线条来绘制模型（支持bmp、jpeg、gif、png）。文件被打开并解析为一组线条。这些线条被缩放以适应模型当前大小所定义的矩形内。",[672,1803,1804,1805],{},"ctrl ",[676,1806,1807],{}," 指定模型的控制器模块及其参数字符串。例如，字符串\"foo bar bash\"将加载libfoo.so，其Init()函数将以整个字符串作为参数进行调用（包括库名称）。控制器需要解析字符串（如果需要参数）。",[672,1809,1810,1811],{},"fiducial_return fiducial_id ",[706,1812,1813],{}," 如果非零，则通过fiducialfinder传感器检测到此模型。该值用作基准标识符。",[672,1815,1816,1817],{},"fiducial_key ",[706,1818,1819],{}," 仅当模型和fiducialfinder的fiducial_key值匹配时，fiducial_id模型才会被fiducialfinder检测到。这允许您在同一环境中拥有几种独立类型的基准标识，每种类型只显示在为其\"调谐\"的fiducialfinders中。",[672,1821,1822,1823],{},"obstacle_return ",[706,1824,1825],{}," 如果为1，则此模型可以与具有此属性设置的其他模型发生碰撞。",[672,1827,1828,1829],{},"ranger_return ",[706,1830,1831],{}," 如果为1，则该模型可以被ranger传感器检测到。",[672,1833,1834,1835],{},"blob_return ",[706,1836,1837],{}," 如果为1，则该模型可以在blob_finder中被检测到（取决于其颜色）。",[672,1839,1840,1841],{},"laser_return ",[706,1842,1843],{}," 如果为0，则此模型不会被激光传感器检测到。如果为1，则该模型在激光传感器中显示为正常（0）反射。如果为2，则显示为高（1）反射。",[672,1845,1846,1847],{},"gripper_return ",[706,1848,1849],{}," 如果为1，则该模型可以被夹爪夹取，并且可以通过与具有非零obstacle_return的任何东西的碰撞来推动。",[672,1851,1852,1853],{},"gui_nose ",[706,1854,1855],{}," 如果为1，则在模型上绘制显示其朝向的鼻子（正X轴）。",[672,1857,1858,1859],{},"gui_grid ",[706,1860,1861],{}," 如果为1，则在模型上绘制比例网格。",[672,1863,1864,1865],{},"gui_outline ",[706,1866,1867],{}," 如果为1，则在模型周围绘制边界框，指示其大小。",[672,1869,1870,1871],{},"gui_move ",[706,1872,1873],{}," 如果为1，则模型可以在GUI窗口中通过鼠标移动。",[42,1875,1876],{"id":1876},"stage_ros2添加地图",[12,1878,1879],{},"本节我们将在仿真环境中，添加一张全局地图，请先准备一张作为全局地图的图片。",[12,1881,1882],{},"1.添加地图",[12,1884,1251],{},[55,1886,1888],{"className":57,"code":1887,"language":59,"meta":60,"style":60},"\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\u002Froom.jpg\"\n  gui_move 0\n)\n",[62,1889,1890,1894,1898,1902,1907,1916,1920,1931,1941,1945,1951,1960,1964,1970,1977,1984,1991,1995,1999,2004,2009,2014,2022,2035,2050,2058,2065],{"__ignoreMap":60},[65,1891,1892],{"class":67,"line":68},[65,1893,321],{"emptyLinePlaceholder":320},[65,1895,1896],{"class":67,"line":125},[65,1897,474],{"class":473},[65,1899,1900],{"class":67,"line":292},[65,1901,321],{"emptyLinePlaceholder":320},[65,1903,1904],{"class":67,"line":304},[65,1905,1906],{"class":473},"# 设置地图(定义模型)\n",[65,1908,1909,1911,1914],{"class":67,"line":317},[65,1910,1316],{"class":71},[65,1912,1913],{"class":75}," floorplan",[65,1915,1322],{"class":75},[65,1917,1918],{"class":67,"line":324},[65,1919,762],{"class":252},[65,1921,1922,1925,1928],{"class":67,"line":339},[65,1923,1924],{"class":71},"  color",[65,1926,1927],{"class":75}," \"gray30\"",[65,1929,1930],{"class":473},"  # 颜色\n",[65,1932,1933,1936,1938],{"class":67,"line":360},[65,1934,1935],{"class":71},"  boundary",[65,1937,835],{"class":218},[65,1939,1940],{"class":473},"  # 为地图设置边框\n",[65,1942,1943],{"class":67,"line":373},[65,1944,321],{"emptyLinePlaceholder":320},[65,1946,1947,1949],{"class":67,"line":379},[65,1948,1344],{"class":71},[65,1950,988],{"class":218},[65,1952,1953,1955,1957],{"class":67,"line":385},[65,1954,1351],{"class":71},[65,1956,911],{"class":218},[65,1958,1959],{"class":252}," \n",[65,1961,1962],{"class":67,"line":400},[65,1963,321],{"emptyLinePlaceholder":320},[65,1965,1966,1968],{"class":67,"line":413},[65,1967,1358],{"class":71},[65,1969,988],{"class":218},[65,1971,1972,1975],{"class":67,"line":444},[65,1973,1974],{"class":71},"  gripper_return",[65,1976,988],{"class":218},[65,1978,1979,1982],{"class":67,"line":450},[65,1980,1981],{"class":71},"  fiducial_return",[65,1983,988],{"class":218},[65,1985,1986,1989],{"class":67,"line":991},[65,1987,1988],{"class":71},"  laser_return",[65,1990,997],{"class":218},[65,1992,1993],{"class":67,"line":1000},[65,1994,357],{"class":252},[65,1996,1997],{"class":67,"line":1008},[65,1998,321],{"emptyLinePlaceholder":320},[65,2000,2001],{"class":67,"line":1016},[65,2002,2003],{"class":473},"# 加载地图\n",[65,2005,2006],{"class":67,"line":1024},[65,2007,2008],{"class":71},"floorplan\n",[65,2010,2011],{"class":67,"line":1032},[65,2012,2013],{"class":252},"( \n",[65,2015,2016,2019],{"class":67,"line":1040},[65,2017,2018],{"class":71},"  name",[65,2020,2021],{"class":75}," \"room\"\n",[65,2023,2024,2026,2029,2032],{"class":67,"line":1048},[65,2025,767],{"class":71},[65,2027,2028],{"class":252}," [16.000 ",[65,2030,2031],{"class":218},"16.000",[65,2033,2034],{"class":75}," 0.800]\n",[65,2036,2037,2040,2043,2045,2047],{"class":67,"line":1056},[65,2038,2039],{"class":71},"  pose",[65,2041,2042],{"class":252}," [0 ",[65,2044,803],{"class":218},[65,2046,911],{"class":218},[65,2048,2049],{"class":75}," 0]\n",[65,2051,2052,2055],{"class":67,"line":1064},[65,2053,2054],{"class":71},"  bitmap",[65,2056,2057],{"class":75}," \"maps\u002Froom.jpg\"\n",[65,2059,2060,2063],{"class":67,"line":1072},[65,2061,2062],{"class":71},"  gui_move",[65,2064,988],{"class":218},[65,2066,2067],{"class":67,"line":1080},[65,2068,357],{"class":252},[12,2070,2071],{},"上述代码自定义了floorplan模型，并根据此模型创建了一个加载了地图数据的floorplan对象。",[12,2073,848],{},[12,2075,851],{},[12,2077,2078],{},[183,2079],{"alt":60,"src":2080},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1623.webp",[42,2082,2083],{"id":2083},"stage_ros2添加机器人",[12,2085,2086],{},"本节将在仿真环境中添加一个由底盘、摄像头以及激光雷达组成的虚拟机器人。",[12,2088,2089],{},"1.代码框架搭建",[12,2091,2092],{},"在world目录下新建robot目录，robot目录中再创建car_base.inc、camera.inc、laser.inc以及mycar.inc等文件，各文件作用如下：",[669,2094,2095,2098,2101,2104],{},[672,2096,2097],{},"car_base.inc：用于设置机器人底盘模块；",[672,2099,2100],{},"camera.inc：用于设置机器人相机模块；",[672,2102,2103],{},"laser.inc：用于设置机器人雷达模块；",[672,2105,2106],{},"mycar.inc：用于组装机器人各模块。",[12,2108,2109],{},"除此之外，还会在sim.world中包含mycar.inc并调用其生成机器人的功能。",[12,2111,2112],{},"2.设置机器人底盘",[12,2114,2115],{},"stage中的position模型可以以差速、全向或阿克曼的方式模拟移动机器人底盘。在car_base.inc中输入如下代码：",[55,2117,2119],{"className":57,"code":2118,"language":59,"meta":60,"style":60},"\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",[62,2120,2121,2125,2130,2142,2146,2155,2166,2176,2186,2196,2204,2208,2219,2241,2245,2250,2254,2259,2289,2318,2322,2338,2355,2366,2370,2379,2383,2390,2398,2409,2422,2435,2448,2462,2473,2484,2495,2506,2512],{"__ignoreMap":60},[65,2122,2123],{"class":67,"line":68},[65,2124,321],{"emptyLinePlaceholder":320},[65,2126,2127],{"class":67,"line":125},[65,2128,2129],{"class":473},"# 机器人底盘配置\n",[65,2131,2132,2134,2137,2140],{"class":67,"line":292},[65,2133,1316],{"class":71},[65,2135,2136],{"class":75}," car_base",[65,2138,2139],{"class":75}," position",[65,2141,1959],{"class":252},[65,2143,2144],{"class":67,"line":304},[65,2145,762],{"class":252},[65,2147,2148,2150,2152],{"class":67,"line":317},[65,2149,1924],{"class":71},[65,2151,1399],{"class":75},[65,2153,2154],{"class":473},"                   # 车身颜色\n",[65,2156,2157,2160,2163],{"class":67,"line":324},[65,2158,2159],{"class":71},"  drive",[65,2161,2162],{"class":75}," \"diff\"",[65,2164,2165],{"class":473},"                  # 车辆运动学模型                  \n",[65,2167,2168,2171,2173],{"class":67,"line":339},[65,2169,2170],{"class":71},"  obstacle_return",[65,2172,835],{"class":218},[65,2174,2175],{"class":252},"             \n",[65,2177,2178,2181,2183],{"class":67,"line":360},[65,2179,2180],{"class":71},"  ranger_return",[65,2182,835],{"class":218},[65,2184,2185],{"class":252},"           \n",[65,2187,2188,2191,2193],{"class":67,"line":373},[65,2189,2190],{"class":71},"  blob_return",[65,2192,835],{"class":218},[65,2194,2195],{"class":252},"                  \n",[65,2197,2198,2200,2202],{"class":67,"line":379},[65,2199,1981],{"class":71},[65,2201,835],{"class":218},[65,2203,2175],{"class":252},[65,2205,2206],{"class":67,"line":385},[65,2207,321],{"emptyLinePlaceholder":320},[65,2209,2210,2213,2216],{"class":67,"line":400},[65,2211,2212],{"class":71},"  localization",[65,2214,2215],{"class":75}," \"odom\"",[65,2217,2218],{"class":473},"           # 定位方式\n",[65,2220,2221,2224,2226,2229,2232,2234,2236,2238],{"class":67,"line":413},[65,2222,2223],{"class":71},"  odom_error",[65,2225,770],{"class":252},[65,2227,2228],{"class":218},"0.05",[65,2230,2231],{"class":218}," 0.05",[65,2233,1451],{"class":218},[65,2235,1470],{"class":218},[65,2237,779],{"class":75},[65,2239,2240],{"class":473},"  # 里程计误差\n",[65,2242,2243],{"class":67,"line":444},[65,2244,321],{"emptyLinePlaceholder":320},[65,2246,2247],{"class":67,"line":450},[65,2248,2249],{"class":473},"  # localization_origin [0 0 0 0]   # 定位原点，默认为机器人的初始位置。\n",[65,2251,2252],{"class":67,"line":991},[65,2253,321],{"emptyLinePlaceholder":320},[65,2255,2256],{"class":67,"line":1000},[65,2257,2258],{"class":473},"  # [ xmin xmax ymin ymax zmin zmax amin amax ]        \n",[65,2260,2261,2264,2267,2270,2272,2274,2276,2278,2281,2284,2286],{"class":67,"line":1008},[65,2262,2263],{"class":71},"  velocity_bounds",[65,2265,2266],{"class":252}," [-1 ",[65,2268,2269],{"class":218},"1",[65,2271,911],{"class":218},[65,2273,911],{"class":218},[65,2275,911],{"class":218},[65,2277,911],{"class":218},[65,2279,2280],{"class":218}," -45.0",[65,2282,2283],{"class":218}," 45.0",[65,2285,779],{"class":75},[65,2287,2288],{"class":473},"         # 速度最值 \n",[65,2290,2291,2294,2297,2300,2302,2304,2306,2308,2311,2313,2315],{"class":67,"line":1016},[65,2292,2293],{"class":71},"  acceleration_bounds",[65,2295,2296],{"class":252}," [-0.5 ",[65,2298,2299],{"class":218},"0.5",[65,2301,911],{"class":218},[65,2303,911],{"class":218},[65,2305,911],{"class":218},[65,2307,911],{"class":218},[65,2309,2310],{"class":218}," -45",[65,2312,2283],{"class":218},[65,2314,779],{"class":75},[65,2316,2317],{"class":473},"   # 加速度最值\n",[65,2319,2320],{"class":67,"line":1024},[65,2321,321],{"emptyLinePlaceholder":320},[65,2323,2324,2326,2329,2332,2335],{"class":67,"line":1032},[65,2325,767],{"class":71},[65,2327,2328],{"class":252}," [0.44 ",[65,2330,2331],{"class":218},"0.38",[65,2333,2334],{"class":75}," 0.22]",[65,2336,2337],{"class":473},"  # 车体尺寸\n",[65,2339,2340,2343,2345,2347,2349,2352],{"class":67,"line":1040},[65,2341,2342],{"class":71},"  origin",[65,2344,2042],{"class":252},[65,2346,803],{"class":218},[65,2348,911],{"class":218},[65,2350,2351],{"class":75}," 0]",[65,2353,2354],{"class":473}," # 旋转中心与车体中心的偏移量\n",[65,2356,2357,2360,2363],{"class":67,"line":1048},[65,2358,2359],{"class":71},"  mass",[65,2361,2362],{"class":218}," 23.0",[65,2364,2365],{"class":473}," # 车体质量，单位kg\n",[65,2367,2368],{"class":67,"line":1056},[65,2369,321],{"emptyLinePlaceholder":320},[65,2371,2372,2374,2376],{"class":67,"line":1064},[65,2373,1344],{"class":71},[65,2375,911],{"class":218},[65,2377,2378],{"class":473}," # 是否绘制方向指示标记\n",[65,2380,2381],{"class":67,"line":1072},[65,2382,321],{"emptyLinePlaceholder":320},[65,2384,2385,2388],{"class":67,"line":1080},[65,2386,2387],{"class":71},"  block(",[65,2389,1959],{"class":252},[65,2391,2392,2395],{"class":67,"line":1088},[65,2393,2394],{"class":71},"    points",[65,2396,2397],{"class":218}," 8\n",[65,2399,2400,2403,2406],{"class":67,"line":1701},[65,2401,2402],{"class":71},"    point[0]",[65,2404,2405],{"class":252}," [-0.2 ",[65,2407,2408],{"class":75},"0.18]\n",[65,2410,2411,2414,2416,2419],{"class":67,"line":1710},[65,2412,2413],{"class":71},"    point[1]",[65,2415,2405],{"class":252},[65,2417,2418],{"class":218},"-0.18",[65,2420,2421],{"class":252},"]\n",[65,2423,2424,2427,2430,2433],{"class":67,"line":1718},[65,2425,2426],{"class":71},"    point[2]",[65,2428,2429],{"class":252}," [-0.15 ",[65,2431,2432],{"class":218},"-0.27",[65,2434,2421],{"class":252},[65,2436,2437,2440,2443,2446],{"class":67,"line":1726},[65,2438,2439],{"class":71},"    point[3]",[65,2441,2442],{"class":252}," [0.12 ",[65,2444,2445],{"class":218},"-0.23",[65,2447,2421],{"class":252},[65,2449,2451,2454,2457,2460],{"class":67,"line":2450},33,[65,2452,2453],{"class":71},"    point[4]",[65,2455,2456],{"class":252}," [0.2 ",[65,2458,2459],{"class":218},"-0.12",[65,2461,2421],{"class":252},[65,2463,2465,2468,2470],{"class":67,"line":2464},34,[65,2466,2467],{"class":71},"    point[5]",[65,2469,2456],{"class":252},[65,2471,2472],{"class":75},"0.12]\n",[65,2474,2476,2479,2481],{"class":67,"line":2475},35,[65,2477,2478],{"class":71},"    point[6]",[65,2480,2442],{"class":252},[65,2482,2483],{"class":75},"0.23]\n",[65,2485,2487,2490,2492],{"class":67,"line":2486},36,[65,2488,2489],{"class":71},"    point[7]",[65,2491,2429],{"class":252},[65,2493,2494],{"class":75},"0.27]\n",[65,2496,2498,2501,2503],{"class":67,"line":2497},37,[65,2499,2500],{"class":71},"    z",[65,2502,2042],{"class":252},[65,2504,2505],{"class":75},"0.22]\n",[65,2507,2509],{"class":67,"line":2508},38,[65,2510,2511],{"class":252},"  )\n",[65,2513,2515],{"class":67,"line":2514},39,[65,2516,357],{"class":252},[12,2518,2519],{},[33,2520,2521],{},"position摘要和默认值",[55,2523,2525],{"className":57,"code":2524,"language":59,"meta":60,"style":60},"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",[62,2526,2527,2532,2540,2548,2562,2567,2572],{"__ignoreMap":60},[65,2528,2529],{"class":67,"line":68},[65,2530,2531],{"class":71},"position(\n",[65,2533,2534,2537],{"class":67,"line":125},[65,2535,2536],{"class":71},"    drive",[65,2538,2539],{"class":75}," \"diff\"\n",[65,2541,2542,2545],{"class":67,"line":292},[65,2543,2544],{"class":71},"    localization",[65,2546,2547],{"class":75}," \"gps\"\n",[65,2549,2550,2553,2556,2559],{"class":67,"line":304},[65,2551,2552],{"class":71},"    localization_origin",[65,2554,2555],{"class":252}," [\u003Cdefaults ",[65,2557,2558],{"class":75},"to",[65,2560,2561],{"class":75}," model's start pose>]\n",[65,2563,2564],{"class":67,"line":317},[65,2565,2566],{"class":75},"    odom_error [0.03 0.03 0.00 0.05]\n",[65,2568,2569],{"class":67,"line":324},[65,2570,2571],{"class":75},"    velocity_enable 1\n",[65,2573,2574],{"class":67,"line":339},[65,2575,357],{"class":75},[12,2577,2578],{},[33,2579,667],{},[669,2581,2582,2585,2588,2591],{},[672,2583,2584],{},"drive \"diff\", \"omni\" 或 \"car\" 选择差速转向模型、全向模式或类似汽车的阿克曼模式。",[672,2586,2587],{},"localization \"gps\" 或 \"odom\" 如果选择 “gps”，位置模型将以完全准确的精度报告位置。如果选择 “odom”，将使用简单的里程计模型，并且位置数据会随时间与真实位置的差异而漂移。里程计模型由 odom_error 属性参数化。",[672,2589,2590],{},"localization_origin [x y z theta] 您可以使用 localization_origin 参数来设置定位坐标系的原点。默认情况下，它将复制模型的初始姿态，因此机器人将报告相对于起始位置的位置。提示: 如果将 localization_origin 设置为 [0 0 0 0] 并且定位方式为 “gps”，模型将返回其真实的全局位置。这种设置是不现实的，但在希望抽象定位细节的研究中很有用。",[672,2592,2593],{},"odom_error [x y z theta] 在选择 “odom” 定位方式时用到的里程计误差模型参数，每个值是计算里程计位置估计时积分 x、y 和 theta 速度的误差比例的最大值。对于每个轴，如果在此处指定的值为 E，则实际比例在启动时在 -E\u002F2 到 +E\u002F2 的范围内随机选择。请注意，由于舍入误差，将这些值设置为零并不能让定位完美无误 - 为了实现这一点，您需要选择 “gps” 定位方式。",[12,2595,2596],{},"3.设置摄像头",[12,2598,2599],{},"stage中的camera模型可以模拟深度相机。在camera.inc中输入如下代码：",[55,2601,2603],{"className":57,"code":2602,"language":59,"meta":60,"style":60},"define my_camera camera\n(\n    range [ 0.3 3.0 ] # 相机采样范围\n    resolution [ 160 90 ]  #相机分辨率 1280 × 720 \u002F 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",[62,2604,2605,2615,2619,2637,2654,2672,2688,2697,2717,2727],{"__ignoreMap":60},[65,2606,2607,2609,2612],{"class":67,"line":68},[65,2608,1316],{"class":71},[65,2610,2611],{"class":75}," my_camera",[65,2613,2614],{"class":75}," camera\n",[65,2616,2617],{"class":67,"line":125},[65,2618,762],{"class":252},[65,2620,2621,2624,2626,2629,2632,2634],{"class":67,"line":292},[65,2622,2623],{"class":71},"    range",[65,2625,770],{"class":252},[65,2627,2628],{"class":218},"0.3",[65,2630,2631],{"class":218}," 3.0",[65,2633,779],{"class":75},[65,2635,2636],{"class":473}," # 相机采样范围\n",[65,2638,2639,2642,2644,2647,2649,2651],{"class":67,"line":304},[65,2640,2641],{"class":71},"    resolution",[65,2643,770],{"class":252},[65,2645,2646],{"class":218},"160",[65,2648,1392],{"class":218},[65,2650,779],{"class":75},[65,2652,2653],{"class":473},"  #相机分辨率 1280 × 720 \u002F 8\n",[65,2655,2656,2659,2661,2664,2667,2669],{"class":67,"line":317},[65,2657,2658],{"class":71},"    fov",[65,2660,770],{"class":252},[65,2662,2663],{"class":218},"87",[65,2665,2666],{"class":218}," 58",[65,2668,779],{"class":75},[65,2670,2671],{"class":473}," # 相机视场\n",[65,2673,2674,2677,2679,2681,2683,2685],{"class":67,"line":324},[65,2675,2676],{"class":71},"    pantilt",[65,2678,770],{"class":252},[65,2680,803],{"class":218},[65,2682,911],{"class":218},[65,2684,779],{"class":75},[65,2686,2687],{"class":473}," # 相机姿态\n",[65,2689,2690,2692,2694],{"class":67,"line":339},[65,2691,1721],{"class":71},[65,2693,835],{"class":218},[65,2695,2696],{"class":473}," # 是否一直处于启动状态\n",[65,2698,2699,2701,2703,2706,2709,2712,2714],{"class":67,"line":360},[65,2700,1462],{"class":71},[65,2702,770],{"class":252},[65,2704,2705],{"class":218},"0.025",[65,2707,2708],{"class":218}," 0.09",[65,2710,2711],{"class":218}," 0.025",[65,2713,779],{"class":75},[65,2715,2716],{"class":473}," # 相机尺寸\n",[65,2718,2719,2721,2724],{"class":67,"line":373},[65,2720,1513],{"class":71},[65,2722,2723],{"class":75}," \"gray\"",[65,2725,2726],{"class":473}," # 相机颜色\n",[65,2728,2729],{"class":67,"line":379},[65,2730,357],{"class":252},[12,2732,2733],{},[33,2734,2735],{},"camera摘要和默认值",[55,2737,2739],{"className":57,"code":2738,"language":59,"meta":60,"style":60},"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",[62,2740,2741,2746,2761,2776,2791,2804,2819,2826,2836],{"__ignoreMap":60},[65,2742,2743],{"class":67,"line":68},[65,2744,2745],{"class":71},"camera(\n",[65,2747,2748,2751,2753,2756,2759],{"class":67,"line":125},[65,2749,2750],{"class":71},"  resolution",[65,2752,770],{"class":252},[65,2754,2755],{"class":218},"32",[65,2757,2758],{"class":218}," 32",[65,2760,891],{"class":75},[65,2762,2763,2766,2768,2771,2774],{"class":67,"line":292},[65,2764,2765],{"class":71},"  range",[65,2767,770],{"class":252},[65,2769,2770],{"class":218},"0.2",[65,2772,2773],{"class":218}," 8.0",[65,2775,891],{"class":75},[65,2777,2778,2781,2783,2786,2789],{"class":67,"line":304},[65,2779,2780],{"class":71},"  fov",[65,2782,770],{"class":252},[65,2784,2785],{"class":218},"70.0",[65,2787,2788],{"class":218}," 40.0",[65,2790,891],{"class":75},[65,2792,2793,2796,2798,2800,2802],{"class":67,"line":317},[65,2794,2795],{"class":71},"  pantilt",[65,2797,770],{"class":252},[65,2799,1448],{"class":218},[65,2801,1451],{"class":218},[65,2803,891],{"class":75},[65,2805,2806,2808,2810,2812,2815,2817],{"class":67,"line":324},[65,2807,767],{"class":71},[65,2809,770],{"class":252},[65,2811,1467],{"class":218},[65,2813,2814],{"class":218}," 0.07",[65,2816,2231],{"class":218},[65,2818,891],{"class":75},[65,2820,2821,2823],{"class":67,"line":339},[65,2822,1924],{"class":71},[65,2824,2825],{"class":75}," \"black\"\n",[65,2827,2828,2831,2834],{"class":67,"line":360},[65,2829,2830],{"class":71},"  watts",[65,2832,2833],{"class":218}," 100.0",[65,2835,1959],{"class":252},[65,2837,2838],{"class":67,"line":373},[65,2839,357],{"class":252},[12,2841,2842],{},[33,2843,667],{},[669,2845,2846,2855,2875,2884],{},[672,2847,2848,2849],{},"resolution [ width:",[706,2850,2851,2852],{}," height:",[706,2853,2854],{},"] 相机分辨率。",[672,2856,2857,2858],{},"range [ min:",[685,2859,2860,2861],{}," max:",[685,2862,2863,2864,2867,2868,2871,2872,2874],{}," ] 相机报告的距离范围，以米为单位。距离小于",[62,2865,2866],{},"min","或大于",[62,2869,2870],{},"max","的物体将无法显示。",[62,2873,2866],{},"数字越小，深度精度越低 - 不要将此值设置得太接近 0。",[672,2876,2877,2878],{},"fov [ horizontal: ",[685,2879,2880,2881],{}," vertical: ",[685,2882,2883],{}," ] 水平和垂直视野的角度，以度为单位。",[672,2885,2886,2887],{},"pantilt [ pan:",[685,2888,2889,2890],{}," tilt:",[685,2891,2892],{}," ] 相机的朝向角度，以度为单位。左右位置称为 pan，上下位置称为 tilt。",[12,2894,2895],{},"4.设置激光雷达",[12,2897,2898],{},"stage中的ranger模型可以模拟激光雷达。在laser.inc中输入如下代码：",[55,2900,2902],{"className":57,"code":2901,"language":59,"meta":60,"style":60},"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",[62,2903,2904,2914,2918,2923,2927,2943,2953,2964,2984,2988,2996,3001,3020,3038,3048,3052],{"__ignoreMap":60},[65,2905,2906,2908,2911],{"class":67,"line":68},[65,2907,1316],{"class":71},[65,2909,2910],{"class":75}," my_laser",[65,2912,2913],{"class":75}," ranger\n",[65,2915,2916],{"class":67,"line":125},[65,2917,762],{"class":252},[65,2919,2920],{"class":67,"line":292},[65,2921,2922],{"class":71},"  sensor(\n",[65,2924,2925],{"class":67,"line":304},[65,2926,321],{"emptyLinePlaceholder":320},[65,2928,2929,2931,2933,2935,2938,2940],{"class":67,"line":317},[65,2930,2623],{"class":71},[65,2932,770],{"class":252},[65,2934,1448],{"class":218},[65,2936,2937],{"class":218},"  15.0",[65,2939,779],{"class":75},[65,2941,2942],{"class":473},"     # 雷达数据采集区间\n",[65,2944,2945,2947,2950],{"class":67,"line":324},[65,2946,2658],{"class":71},[65,2948,2949],{"class":218}," 360.0",[65,2951,2952],{"class":473},"               # 视角\n",[65,2954,2955,2958,2961],{"class":67,"line":339},[65,2956,2957],{"class":71},"    samples",[65,2959,2960],{"class":218}," 720",[65,2962,2963],{"class":473},"             # 采样数\n",[65,2965,2966,2968,2970,2972,2974,2976,2979,2981],{"class":67,"line":360},[65,2967,1521],{"class":71},[65,2969,770],{"class":252},[65,2971,803],{"class":218},[65,2973,911],{"class":218},[65,2975,835],{"class":218},[65,2977,2978],{"class":218}," 0.15",[65,2980,779],{"class":75},[65,2982,2983],{"class":473}," # 可视化光束颜色以及透明度\n",[65,2985,2986],{"class":67,"line":373},[65,2987,2511],{"class":252},[65,2989,2990,2993],{"class":67,"line":379},[65,2991,2992],{"class":71},"  model",[65,2994,2995],{"class":473}," # 雷达外观\n",[65,2997,2998],{"class":67,"line":385},[65,2999,3000],{"class":252},"  (\n",[65,3002,3003,3005,3007,3009,3011,3013,3015,3017],{"class":67,"line":400},[65,3004,1443],{"class":71},[65,3006,770],{"class":252},[65,3008,803],{"class":218},[65,3010,911],{"class":218},[65,3012,911],{"class":218},[65,3014,911],{"class":218},[65,3016,779],{"class":75},[65,3018,3019],{"class":473},"        # 雷达位姿\n",[65,3021,3022,3024,3026,3029,3031,3033,3035],{"class":67,"line":413},[65,3023,1462],{"class":71},[65,3025,770],{"class":252},[65,3027,3028],{"class":218},"0.07",[65,3030,2814],{"class":218},[65,3032,2231],{"class":218},[65,3034,779],{"class":75},[65,3036,3037],{"class":473}," # 雷达尺寸信息\n",[65,3039,3040,3042,3045],{"class":67,"line":444},[65,3041,1513],{"class":71},[65,3043,3044],{"class":75}," \"blue\"",[65,3046,3047],{"class":473},"            # 雷达颜色\n",[65,3049,3050],{"class":67,"line":450},[65,3051,2511],{"class":252},[65,3053,3054],{"class":67,"line":991},[65,3055,357],{"class":252},[12,3057,3058],{},[33,3059,3060],{},"ranger摘要和默认值",[55,3062,3064],{"className":57,"code":3063,"language":59,"meta":60,"style":60}," 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",[62,3065,3066,3071,3079,3087,3095,3102,3119,3127],{"__ignoreMap":60},[65,3067,3068],{"class":67,"line":68},[65,3069,3070],{"class":71}," sensor(\n",[65,3072,3073,3076],{"class":67,"line":125},[65,3074,3075],{"class":71},"   samples",[65,3077,3078],{"class":218}," 180\n",[65,3080,3081,3084],{"class":67,"line":292},[65,3082,3083],{"class":71},"   range_max",[65,3085,3086],{"class":218}," 8.0\n",[65,3088,3089,3092],{"class":67,"line":304},[65,3090,3091],{"class":71},"   fov",[65,3093,3094],{"class":218}," 360.0\n",[65,3096,3097,3100],{"class":67,"line":317},[65,3098,3099],{"class":71},"   resolution",[65,3101,997],{"class":218},[65,3103,3104,3107,3109,3112,3114,3117],{"class":67,"line":324},[65,3105,3106],{"class":71},"   size",[65,3108,770],{"class":252},[65,3110,3111],{"class":218},"0.15",[65,3113,2978],{"class":218},[65,3115,3116],{"class":218}," 0.2",[65,3118,891],{"class":75},[65,3120,3121,3124],{"class":67,"line":339},[65,3122,3123],{"class":71},"   color",[65,3125,3126],{"class":75}," \"blue\"\n",[65,3128,3129],{"class":67,"line":360},[65,3130,3131],{"class":252}," )\n",[12,3133,3134],{},[33,3135,667],{},[669,3137,3138,3144,3150,3156],{},[672,3139,3140,3141],{},"samples ",[706,3142,3143],{}," 每次扫描的激光样本数量。",[672,3145,3146,3147],{},"range_max ",[685,3148,3149],{}," 激光扫描仪所报告的最大距离，以米为单位。扫描仪将不会检测超出此范围的物体。",[672,3151,3152,3153],{},"fov ",[685,3154,3155],{}," 激光扫描仪的角度视野。",[672,3157,698,3158],{},[706,3159,3160],{}," 仅计算第 n 个激光样本的真实距离。缺失的样本将用线性插值填充。一般来说，使用较少的样本会更好，但某些（实现不好的）程序需要固定数量的样本数。设置此数字大于 1 可以减少所需的计算量，适用于固定大小的激光矢量。",[12,3162,3163],{},"5.组装机器人",[12,3165,3166],{},"在mycar.inc中实现机器人的组装：",[55,3168,3172],{"className":3169,"code":3170,"language":3171,"meta":60,"style":60},"language-SQL shiki shiki-themes github-light github-dark","\n# 组装机器人各个模块\ninclude \"robot\u002Fcar_base.inc\"\ninclude \"robot\u002Fcamera.inc\"\ninclude \"robot\u002Flaser.inc\"\n\ndefine my_car car_base(\n    my_camera(pose [0.15 0 0 0])\n    my_laser()\n)\n","SQL",[62,3173,3174,3178,3183,3191,3198,3205,3209,3214,3219,3224],{"__ignoreMap":60},[65,3175,3176],{"class":67,"line":68},[65,3177,321],{"emptyLinePlaceholder":320},[65,3179,3180],{"class":67,"line":125},[65,3181,3182],{"class":252},"# 组装机器人各个模块\n",[65,3184,3185,3188],{"class":67,"line":292},[65,3186,3187],{"class":363},"include",[65,3189,3190],{"class":75}," \"robot\u002Fcar_base.inc\"\n",[65,3192,3193,3195],{"class":67,"line":304},[65,3194,3187],{"class":363},[65,3196,3197],{"class":75}," \"robot\u002Fcamera.inc\"\n",[65,3199,3200,3202],{"class":67,"line":317},[65,3201,3187],{"class":363},[65,3203,3204],{"class":75}," \"robot\u002Flaser.inc\"\n",[65,3206,3207],{"class":67,"line":324},[65,3208,321],{"emptyLinePlaceholder":320},[65,3210,3211],{"class":67,"line":339},[65,3212,3213],{"class":252},"define my_car car_base(\n",[65,3215,3216],{"class":67,"line":360},[65,3217,3218],{"class":252},"    my_camera(pose [0.15 0 0 0])\n",[65,3220,3221],{"class":67,"line":373},[65,3222,3223],{"class":252},"    my_laser()\n",[65,3225,3226],{"class":67,"line":379},[65,3227,357],{"class":252},[12,3229,3230],{},"my_car模型是在car_base模型之上，集成了my_camera和my_laser模型。",[12,3232,3233],{},"6.在仿真环境中生成机器人",[12,3235,3236],{},"在sim.world中添加如下代码生成一个机器人：",[55,3238,3240],{"className":3169,"code":3239,"language":3171,"meta":60,"style":60},"\n# -----------------------------------------------------------------------------\n\n# 生成机器人\n\n# 文件包含\ninclude \"robot\u002Fmycar.inc\"\n\nmy_car(\n  name \"robot_0\"\n  color \"red\"\n  pose [ -3 -7 0 90 ] \n)\n",[62,3241,3242,3246,3254,3258,3263,3267,3272,3279,3283,3288,3295,3303,3308],{"__ignoreMap":60},[65,3243,3244],{"class":67,"line":68},[65,3245,321],{"emptyLinePlaceholder":320},[65,3247,3248,3251],{"class":67,"line":125},[65,3249,3250],{"class":252},"# ",[65,3252,3253],{"class":473},"-----------------------------------------------------------------------------\n",[65,3255,3256],{"class":67,"line":292},[65,3257,321],{"emptyLinePlaceholder":320},[65,3259,3260],{"class":67,"line":304},[65,3261,3262],{"class":252},"# 生成机器人\n",[65,3264,3265],{"class":67,"line":317},[65,3266,321],{"emptyLinePlaceholder":320},[65,3268,3269],{"class":67,"line":324},[65,3270,3271],{"class":252},"# 文件包含\n",[65,3273,3274,3276],{"class":67,"line":339},[65,3275,3187],{"class":363},[65,3277,3278],{"class":75}," \"robot\u002Fmycar.inc\"\n",[65,3280,3281],{"class":67,"line":360},[65,3282,321],{"emptyLinePlaceholder":320},[65,3284,3285],{"class":67,"line":373},[65,3286,3287],{"class":252},"my_car(\n",[65,3289,3290,3292],{"class":67,"line":379},[65,3291,2018],{"class":363},[65,3293,3294],{"class":75}," \"robot_0\"\n",[65,3296,3297,3300],{"class":67,"line":385},[65,3298,3299],{"class":252},"  color ",[65,3301,3302],{"class":75},"\"red\"\n",[65,3304,3305],{"class":67,"line":400},[65,3306,3307],{"class":252},"  pose [ -3 -7 0 90 ] \n",[65,3309,3310],{"class":67,"line":413},[65,3311,357],{"class":252},[12,3313,3314],{},"7.构建执行",[12,3316,851],{},[12,3318,3319],{},"启动rviz2可以查看仿真环境下传感器相关数据，启动键盘控制节点后，也可以控制机器人运动。",[12,3321,3322],{},[183,3323],{"alt":60,"src":3324},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1624.webp",[12,3326,3327],{},[183,3328],{"alt":60,"src":3329},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1625.webp",[42,3331,3332],{"id":3332},"stage_ros2添加多机器人",[12,3334,3335],{},"在stage_ros2中也可以很方便的生成多个机器人。",[12,3337,3338],{},"1.生成多个机器人",[12,3340,3341],{},"在sim.world中还可以继续创建my_car对象以生成新的机器人模型，添加代码如下：",[55,3343,3345],{"className":57,"code":3344,"language":59,"meta":60,"style":60},"my_car(\n  name \"robot_1\"\n  color \"yellow\"\n  pose [ -1 -7 0 90 ] \n)\n",[62,3346,3347,3351,3358,3365,3385],{"__ignoreMap":60},[65,3348,3349],{"class":67,"line":68},[65,3350,3287],{"class":71},[65,3352,3353,3355],{"class":67,"line":125},[65,3354,2018],{"class":71},[65,3356,3357],{"class":75}," \"robot_1\"\n",[65,3359,3360,3362],{"class":67,"line":292},[65,3361,1924],{"class":71},[65,3363,3364],{"class":75}," \"yellow\"\n",[65,3366,3367,3369,3371,3374,3377,3379,3381,3383],{"class":67,"line":304},[65,3368,2039],{"class":71},[65,3370,770],{"class":252},[65,3372,3373],{"class":218},"-1",[65,3375,3376],{"class":218}," -7",[65,3378,911],{"class":218},[65,3380,1392],{"class":218},[65,3382,779],{"class":75},[65,3384,1959],{"class":252},[65,3386,3387],{"class":67,"line":317},[65,3388,357],{"class":252},[12,3390,3391],{},"2.构建执行",[12,3393,851],{},[12,3395,3396],{},[183,3397],{"alt":60,"src":3398},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1626.webp",[12,3400,3401,3402,3404,3405,3407],{},"在多机器人运行时，不同的机器人发布的话题会以各自对应的",[62,3403,601],{},"值为命名空间，且不同机器人发布的坐标变换也会以",[62,3406,601],{},"值为前缀。",[3409,3410,3411],"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":60,"searchDepth":125,"depth":125,"links":3413},[],0,"1000","2023-12-30","2023-12-30-ros2-tutorial","\u002Fwiki\u002F2023-12-30-ros2-tutorial","Ros2 Tutorial","md",false,{},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1000-stage-ros2-fang-zhen-ping-tai",{"title":5,"description":14},"wiki\u002F2023-12-30-ros2-tutorial\u002F1000-Stage_Ros2仿真平台","3WhviKSE-XpTwNj_3DDmOiqiAY8MHB00zkvoVv_cI-M",[3428,3434,3440,3446,3452,3458,3464,3470,3476,3482,3484,3490,3496,3502,3508,3514,3520,3526,3532,3538,3544,3550,3556,3562,3568,3574,3580,3586,3592,3598,3604,3610,3616,3622,3628,3633,3639,3644,3650,3656,3662,3668,3674,3680,3686,3692,3698,3704,3710,3716,3722,3728,3734,3740,3746,3752,3758,3764,3770,3776,3782,3788,3794,3800,3806,3812,3818,3824,3830],{"path":3429,"stem":3430,"title":3431,"authors":3432,"date":3416,"chapterOrder":3433,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0100-ros2-jie-shao","wiki\u002F2023-12-30-ros2-tutorial\u002F0100-ROS2介绍","ROS2介绍",[7],"0100",{"path":3435,"stem":3436,"title":3437,"authors":3438,"date":3416,"chapterOrder":3439,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0200-ru-men-cao-zuo","wiki\u002F2023-12-30-ros2-tutorial\u002F0200-入门操作","入门操作",[7],"0200",{"path":3441,"stem":3442,"title":3443,"authors":3444,"date":3416,"chapterOrder":3445,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0300-gong-zuo-kong-jian-yu-gong-neng-bao","wiki\u002F2023-12-30-ros2-tutorial\u002F0300-工作空间与功能包","工作空间与功能包",[7],"0300",{"path":3447,"stem":3448,"title":3449,"authors":3450,"date":3416,"chapterOrder":3451,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0400-si-da-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F0400-四大通信","四大通信",[7],"0400",{"path":3453,"stem":3454,"title":3455,"authors":3456,"date":3416,"chapterOrder":3457,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0500-ros2-qi-ta-tong-xin-ji-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F0500-ROS2其他通信机制","ROS2其他通信机制",[7],"0500",{"path":3459,"stem":3460,"title":3461,"authors":3462,"date":3416,"chapterOrder":3463,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0600-launch","wiki\u002F2023-12-30-ros2-tutorial\u002F0600-Launch","Launch",[7],"0600",{"path":3465,"stem":3466,"title":3467,"authors":3468,"date":3416,"chapterOrder":3469,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0700-hui-su-rosbag2","wiki\u002F2023-12-30-ros2-tutorial\u002F0700-回溯rosbag2","回溯rosbag2",[7],"0700",{"path":3471,"stem":3472,"title":3473,"authors":3474,"date":3416,"chapterOrder":3475,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0800-zuo-biao-bian-huan-tf","wiki\u002F2023-12-30-ros2-tutorial\u002F0800-坐标变换TF","坐标变换TF",[7],"0800",{"path":3477,"stem":3478,"title":3479,"authors":3480,"date":3416,"chapterOrder":3481,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0900-ke-shi-hua-ping-tai-rviz2-yu-urdf-jian-mo-yu-yan","wiki\u002F2023-12-30-ros2-tutorial\u002F0900-可视化平台RVIZ2与URDF建模语言","可视化平台RVIZ2与URDF建模语言",[7],"0900",{"path":3423,"stem":3425,"title":5,"authors":3483,"date":3416,"chapterOrder":3415,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},[7],{"path":3485,"stem":3486,"title":3487,"authors":3488,"date":3416,"chapterOrder":3489,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-gazeboclassic","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-GazeboClassic","Gezebo Classic",[7],"1100-0100",{"path":3491,"stem":3492,"title":3493,"authors":3494,"date":3416,"chapterOrder":3495,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-ignitiongazebo","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-IgnitionGazebo","Ignition Gazebo（Gazebo Fortress）",[7],"1100-0200",{"path":3497,"stem":3498,"title":3499,"authors":3500,"date":3416,"chapterOrder":3501,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-gazebosim","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-GazeboSim","Gz Sim（Gazebo Harmonic）",[7],"1100-0300",{"path":3503,"stem":3504,"title":3505,"authors":3506,"date":3416,"chapterOrder":3507,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-igngz2gzsim","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-Igngz2gzsim","将Ign Gazebo迁移至Gz Sim",[7],"1100-0400",{"path":3509,"stem":3510,"title":3511,"authors":3512,"date":3416,"chapterOrder":3513,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-gezebo-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-Gezebo仿真平台","Gezebo仿真平台",[7],"1100",{"path":3515,"stem":3516,"title":3517,"authors":3518,"date":3416,"chapterOrder":3519,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-humble-ban-ben","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-Humble版本","Humble导航仿真",[7],"1200-0100",{"path":3521,"stem":3522,"title":3523,"authors":3524,"date":3416,"chapterOrder":3525,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-jazzy-ban-ben","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-Jazzy版本","Jazzy导航仿真",[7],"1200-0200",{"path":3527,"stem":3528,"title":3529,"authors":3530,"date":3416,"chapterOrder":3531,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-humble2jazzy","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-Humble2Jazzy","Humble与Jazzy导航的差异",[7],"1200-0300",{"path":3533,"stem":3534,"title":3535,"authors":3536,"date":3416,"chapterOrder":3537,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-you-xian-zhuang-tai-ji-fsm","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-有限状态机FSM","有限状态机（Finite State Machine）",[7],"1200-0400-0100",{"path":3539,"stem":3540,"title":3541,"authors":3542,"date":3416,"chapterOrder":3543,"chapterDepth":292,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-ji-ben-gai-nian","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-基本概念","基本概念",[7],"1200-0400-0200-0100",{"path":3545,"stem":3546,"title":3547,"authors":3548,"date":3416,"chapterOrder":3549,"chapterDepth":292,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-kong-zhi-yu-zhuang-shi-gui-ze","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-控制与装饰规则","控制与装饰规则",[7],"1200-0400-0200-0200",{"path":3551,"stem":3552,"title":3553,"authors":3554,"date":3416,"chapterOrder":3555,"chapterDepth":292,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0300-di-yi-ge-wan-zheng-cheng-xu","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0300-第一个完整程序","第一个完整程序",[7],"1200-0400-0200-0300",{"path":3557,"stem":3558,"title":3559,"authors":3560,"date":3416,"chapterOrder":3561,"chapterDepth":292,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0400-jie-dian-zhi-jian-chuan-shu-ju","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0400-节点之间传数据","节点之间传数据",[7],"1200-0400-0200-0400",{"path":3563,"stem":3564,"title":3565,"authors":3566,"date":3416,"chapterOrder":3567,"chapterDepth":292,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0500-chi-xu-ren-wu-yu-zhong-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0500-持续任务与中止","持续任务与中止",[7],"1200-0400-0200-0500",{"path":3569,"stem":3570,"title":3571,"authors":3572,"date":3416,"chapterOrder":3573,"chapterDepth":292,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0600-zu-he-shi-ji-ren-wu","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0600-组合实际任务","组合实际任务",[7],"1200-0400-0200-0600",{"path":3575,"stem":3576,"title":3577,"authors":3578,"date":3416,"chapterOrder":3579,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-xing-wei-shu-bt","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-行为树BT","行为树（BehaviorTree.CPP）",[7],"1200-0400-0200",{"path":3581,"stem":3582,"title":3583,"authors":3584,"date":3416,"chapterOrder":3585,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-fsm-yu-bt","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-FSM与BT","有限状态机FSM与行为树BT",[7],"1200-0400",{"path":3587,"stem":3588,"title":3589,"authors":3590,"date":3416,"chapterOrder":3591,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-机器人导航Navigation2(仿真篇)","机器人导航Navigation2(仿真篇)",[7],"1200",{"path":3593,"stem":3594,"title":3595,"authors":3596,"date":3416,"chapterOrder":3597,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-Boost.Aiso","Boost.Asio库",[7],"1300-0100-0100",{"path":3599,"stem":3600,"title":3601,"authors":3602,"date":3416,"chapterOrder":3603,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2_serial_driver","ROS2 Serial Driver库",[7],"1300-0100-0200",{"path":3605,"stem":3606,"title":3607,"authors":3608,"date":3416,"chapterOrder":3609,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-chuan-kou-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-串口通信","UART串口通信",[7],"1300-0100",{"path":3611,"stem":3612,"title":3613,"authors":3614,"date":3416,"chapterOrder":3615,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","SocketCAN",[7],"1300-0200-0100",{"path":3617,"stem":3618,"title":3619,"authors":3620,"date":3416,"chapterOrder":3621,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2-socketcan","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2_socketcan","ROS2_SocketCAN",[7],"1300-0200-0200",{"path":3623,"stem":3624,"title":3625,"authors":3626,"date":3416,"chapterOrder":3627,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-can-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-CAN通信","CAN通信",[7],"1300-0200",{"path":3629,"stem":3630,"title":3595,"authors":3631,"date":3416,"chapterOrder":3632,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-Boost.Aiso",[7],"1300-0300-0100",{"path":3634,"stem":3635,"title":3636,"authors":3637,"date":3416,"chapterOrder":3638,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-tcp-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-TCP通信","TCP通信",[7],"1300-0300",{"path":3640,"stem":3641,"title":3595,"authors":3642,"date":3416,"chapterOrder":3643,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-Boost.Aiso",[7],"1300-0400-0100",{"path":3645,"stem":3646,"title":3647,"authors":3648,"date":3416,"chapterOrder":3649,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-udp-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-UDP通信","UDP通信",[7],"1300-0400",{"path":3651,"stem":3652,"title":3653,"authors":3654,"date":3416,"chapterOrder":3655,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-linux-ying-jian-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-Linux硬件通信","Linux硬件通信",[7],"1300",{"path":3657,"stem":3658,"title":3659,"authors":3660,"date":3416,"chapterOrder":3661,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-ji-qi-ren-zu-cheng","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-机器人组成","机器人组成",[7],"1400-0100",{"path":3663,"stem":3664,"title":3665,"authors":3666,"date":3416,"chapterOrder":3667,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-yuan-cheng-kai-fa-ssh","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-远程开发SSH","远程开发SSH",[7],"1400-0200-0100",{"path":3669,"stem":3670,"title":3671,"authors":3672,"date":3416,"chapterOrder":3673,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-yuan-cheng-fang-wen-zhuo-mian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-远程访问桌面","远程访问桌面",[7],"1400-0200-0200",{"path":3675,"stem":3676,"title":3677,"authors":3678,"date":3416,"chapterOrder":3679,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-gong-kong-ji-zhi-yuan-cheng-kai-fa-huan-jing","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-工控机之远程开发环境","工控机之远程开发环境",[7],"1400-0200",{"path":3681,"stem":3682,"title":3683,"authors":3684,"date":3416,"chapterOrder":3685,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-gong-kong-ji-zhi-wai-jie-usb-she-bei","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-工控机之外接USB设备","工控机之外接USB设备",[7],"1400-0300",{"path":3687,"stem":3688,"title":3689,"authors":3690,"date":3416,"chapterOrder":3691,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-fen-bu-shi-da-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-分布式搭建","分布式搭建",[7],"1400-0400",{"path":3693,"stem":3694,"title":3695,"authors":3696,"date":3416,"chapterOrder":3697,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-you-hua-ri-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-优化日志","优化日志",[7],"1400-0500",{"path":3699,"stem":3700,"title":3701,"authors":3702,"date":3416,"chapterOrder":3703,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-li-cheng-ji-odom","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-里程计Odom","里程计Odom",[7],"1400-0600-0100",{"path":3705,"stem":3706,"title":3707,"authors":3708,"date":3416,"chapterOrder":3709,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-guan-xing-ji-imu","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-惯性计IMU","惯性计IMU",[7],"1400-0600-0200",{"path":3711,"stem":3712,"title":3713,"authors":3714,"date":3416,"chapterOrder":3715,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-ji-guang-lei-da-lidar","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-激光雷达LiDAR","激光雷达LiDAR",[7],"1400-0600-0300",{"path":3717,"stem":3718,"title":3719,"authors":3720,"date":3416,"chapterOrder":3721,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-xiang-ji-camera","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-相机Camera","相机Camera",[7],"1400-0600-0400",{"path":3723,"stem":3724,"title":3725,"authors":3726,"date":3416,"chapterOrder":3727,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-quan-qiu-ding-wei-gnss","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-全球定位GNSS","全球定位GNSS",[7],"1400-0600-0500",{"path":3729,"stem":3730,"title":3731,"authors":3732,"date":3416,"chapterOrder":3733,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-shou-bing-joy","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-手柄joy","手柄JOY",[7],"1400-0600-0600",{"path":3735,"stem":3736,"title":3737,"authors":3738,"date":3416,"chapterOrder":3739,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-jian-pan-kong-zhi-jie-dian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-键盘控制节点","键盘控制节点",[7],"1400-0600-0700",{"path":3741,"stem":3742,"title":3743,"authors":3744,"date":3416,"chapterOrder":3745,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-ying-jian-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-硬件平台","硬件平台",[7],"1400-0600",{"path":3747,"stem":3748,"title":3749,"authors":3750,"date":3416,"chapterOrder":3751,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-zuo-biao-xi-yu-hua-ti-guan-xi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-坐标系与话题关系","坐标系与话题关系",[7],"1400-0700",{"path":3753,"stem":3754,"title":3755,"authors":3756,"date":3416,"chapterOrder":3757,"chapterDepth":292,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-lun-shi-li-cheng-ji-biao-ding","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-轮式里程计标定","轮式里程计标定",[7],"1400-0800-0100-0100",{"path":3759,"stem":3760,"title":3761,"authors":3762,"date":3416,"chapterOrder":3763,"chapterDepth":292,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-lun-shi-li-cheng-ji-yu-imu-rong-he","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-轮式里程计与IMU融合","轮式里程计与IMU融合",[7],"1400-0800-0100-0200",{"path":3765,"stem":3766,"title":3767,"authors":3768,"date":3416,"chapterOrder":3769,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-lun-shi-li-cheng-ji-biao-ding-yu-rong-he","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-轮式里程计标定与融合","轮式里程计标定与融合",[7],"1400-0800-0100",{"path":3771,"stem":3772,"title":3773,"authors":3774,"date":3416,"chapterOrder":3775,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-ji-guang-lei-da-gong-ju","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-激光雷达工具","激光雷达工具",[7],"1400-0800-0200",{"path":3777,"stem":3778,"title":3779,"authors":3780,"date":3416,"chapterOrder":3781,"chapterDepth":125,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-xiang-ji-shi-yong-jin-jie","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-相机使用进阶","相机使用进阶",[7],"1400-0800-0300",{"path":3783,"stem":3784,"title":3785,"authors":3786,"date":3416,"chapterOrder":3787,"chapterDepth":68,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-ying-jian-ping-tai-jin-jie","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-硬件平台进阶","硬件平台进阶",[7],"1400-0800",{"path":3789,"stem":3790,"title":3791,"authors":3792,"date":3416,"chapterOrder":3793,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-ji-qi-ren-ying-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-机器人硬件","机器人硬件",[7],"1400",{"path":3795,"stem":3796,"title":3797,"authors":3798,"date":3416,"chapterOrder":3799,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1500-ros2-control","wiki\u002F2023-12-30-ros2-tutorial\u002F1500-ROS2_Control","ROS2_Control",[7],"1500",{"path":3801,"stem":3802,"title":3803,"authors":3804,"date":3416,"chapterOrder":3805,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1600-moveit2-gong-ye-ji-qi-ren-ji-xie-bi","wiki\u002F2023-12-30-ros2-tutorial\u002F1600-Moveit2工业机器人机械臂","Moveit2工业机器人机械臂",[7],"1600",{"path":3807,"stem":3808,"title":3809,"authors":3810,"date":3416,"chapterOrder":3811,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1700-ji-qi-ren-dao-hang-navigation2-shi-ti-pian","wiki\u002F2023-12-30-ros2-tutorial\u002F1700-机器人导航Navigation2(实体篇)","机器人导航Navigation2(实体篇)",[7],"1700",{"path":3813,"stem":3814,"title":3815,"authors":3816,"date":3416,"chapterOrder":3817,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1800-microros","wiki\u002F2023-12-30-ros2-tutorial\u002F1800-MicroROS","MicroROS",[7],"1800",{"path":3819,"stem":3820,"title":3821,"authors":3822,"date":3416,"chapterOrder":3823,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1900-webots-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1900-Webots仿真平台","Webots仿真平台",[7],"1900",{"path":3825,"stem":3826,"title":3827,"authors":3828,"date":3416,"chapterOrder":3829,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":3421},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F2000-opencv","wiki\u002F2023-12-30-ros2-tutorial\u002F2000-OpenCV","OpenCV",[7],"2000",{"path":3418,"stem":3831,"title":3832,"authors":3833,"date":3416,"chapterOrder":3834,"chapterDepth":3414,"docKey":3417,"docRoot":3418,"docTitle":3419,"isWikiDoc":320,"isWikiIndex":320},"wiki\u002F2023-12-30-ros2-tutorial\u002Findex","ROS2机器人操作系统教程",[7],null,[3836,3838,3841,3844],{"name":7,"image":3837},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":3839,"image":3840},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":3842,"image":3843},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":3845,"image":3846},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431901611]