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