[{"data":1,"prerenderedAt":16293},["ShallowReactive",2],{"wiki-page-/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben":3,"wiki-doc-items-/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben":15926,"language-switcher-data-/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben":16277,"wiki-i18n-paths-/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben":16292},{"id":4,"title":5,"body":6,"canonicalPath":15907,"chapter":15908,"chapterSort":15909,"date":15910,"description":32,"docI18nKey":15911,"docKey":15912,"docRoot":15913,"docTitle":15914,"extension":15915,"i18nKey":15916,"isBlogPost":15917,"isWikiDoc":139,"isWikiIndex":15917,"layout":15918,"legacyPath":15918,"locale":15919,"localeSlug":15920,"meta":15921,"navigation":139,"path":15907,"seo":15922,"sourcePath":15923,"sourceStem":15916,"stem":15924,"wikiDepth":80,"__hash__":15925},"content/_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-1-Humble版本.md","Humble導航仿真",{"type":7,"value":8,"toc":15899},"minimark",[9,13,17,24,27,34,37,42,45,58,61,64,67,207,214,217,220,225,257,260,280,283,286,294,298,302,305,308,311,326,329,333,336,351,354,357,359,366,369,395,398,424,427,436,498,502,505,508,526,529,534,580,583,664,669,705,710,823,833,1185,1188,1193,1196,1222,1227,1234,1627,1637,2262,2265,2270,2277,2304,2309,2312,2331,2417,2422,2425,2430,2433,2436,2439,2442,2445,2448,2453,2456,2461,2474,2477,2481,2484,2488,2519,2521,2553,2556,2559,2663,2668,2671,2682,2707,2710,2715,2748,2753,2788,2793,2873,2878,2883,2888,2911,2916,2939,2944,2967,2972,2977,2980,2984,2986,3007,3011,3016,3359,3362,3943,3945,3949,3953,3973,3977,3979,3995,3999,4002,4022,4025,4049,4052,4057,4062,4067,4070,4077,4099,4103,4107,4116,4120,4144,4148,4174,4178,4190,4228,4231,4235,4238,4243,4246,4270,4284,4289,4294,4297,4300,4313,4317,4324,4514,4518,4523,4808,4811,4817,4903,4908,4945,4949,4952,4959,4963,4986,4990,5010,5013,5017,5020,5041,5044,5061,5066,5071,5077,5097,5102,5105,5130,5136,5170,5180,5185,5195,5458,5469,5485,5490,5496,5503,5508,5513,5518,5522,5525,5531,5534,5537,5543,5548,5602,5607,5651,5656,5691,5696,5701,5762,5767,5818,5823,5861,5866,5895,5900,5955,5958,5963,5965,5989,5994,6000,6491,6512,6517,6902,6908,6913,6917,6937,6942,6944,6960,6965,6967,6987,6989,7013,7016,7033,7039,7046,7049,7055,7060,7078,7083,7088,7093,7096,7101,7104,7109,7112,7115,7118,7125,7130,7133,7139,7145,7150,7155,7158,7164,7167,7182,7186,7251,7254,7267,7273,7279,7282,7288,7291,7297,7301,7344,7349,7375,7379,7440,7443,7457,7462,7487,7492,7563,7568,7611,7616,7673,7678,8030,8033,8050,8055,8089,8094,8173,8178,8247,8252,8285,8290,8365,8370,8531,8534,8544,8548,8612,8616,8640,8645,8715,8719,8832,8835,8853,8858,8883,8888,8911,8916,8970,8973,8983,8987,9019,9023,9047,9051,9077,9081,9173,9176,9186,9190,9213,9217,9240,9244,9340,9344,9348,9350,9374,9378,9381,9387,10957,10960,10965,10968,10975,11473,11479,11963,11969,12306,12311,12316,12901,12906,12911,13982,13985,13996,14002,14005,14020,14025,14030,14257,14262,14267,14355,14360,14365,14546,14551,14556,14653,14658,14665,14982,14987,14991,15013,15018,15020,15036,15041,15043,15063,15066,15090,15105,15121,15150,15158,15161,15169,15172,15175,15180,15185,15189,15200,15205,15211,15764,15769,15771,15785,15790,15792,15812,15815,15843,15853,15865,15870,15875,15878,15881,15892,15895],[10,11,12],"h3",{"id":12},"導航概述",[14,15,16],"h4",{"id":16},"導航簡述",[18,19,20],"p",{},[21,22,23],"strong",{},"概念",[18,25,26],{},"機器人導航是指在沒有人為干預的情況下，機器人可以自主地從一個位置移動到另一個位置。在ROS2中，導航實現最為常用的框架是Nav2。",[18,28,29],{},[30,31],"img",{"alt":32,"src":33},"","https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1745.webp",[18,35,36],{},"Nav2也即Navigation2，它繼承自ROS的導航堆棧。它採用了與自動駕駛車輛相同的前沿技術，並經過優化和改造，專門適用於移動機器人和地面機器人的導航需求。這個項目賦予移動機器人穿越複雜環境的能力，使其能夠完成用戶定義的各種應用任務，幾乎適用於任何類型的機器人動力學。Nav2不僅支持機器人從A點到B點的移動，還能設置中間姿態，並執行多種任務，如物體跟蹤、全面覆蓋導航等。作為全球100多家公司信賴的生產級高質量導航框架，Nav2以其卓越的可靠性和穩定性贏得了廣泛讚譽。",[18,38,39],{},[21,40,41],{},"作用",[18,43,44],{},"Nav2在機器人導航領域作用顯著，主要表現在以下幾個方面。",[46,47,48,52,55],"ul",{},[49,50,51],"li",{},"Nav2具備多樣的導航功能，支持激光雷達、攝像頭等多種傳感器輸入，實時獲取環境信息，實現智能路徑規劃和精確運動控制。它支持多種導航模式，滿足不同應用需求，並具備強大的擴展性，可與ROS 2組件無縫集成。",[49,53,54],{},"Nav2性能卓越，採用高效算法和數據處理技術，確保機器人在導航過程中響應迅速且穩定。",[49,56,57],{},"安全方面，Nav2採用多種避障算法和參數調節功能，設定安全區域，提供診斷監控，確保機器人安全導航。",[18,59,60],{},"總之，Nav2為機器人的導航和應用提供了強大的支持。無論是工業領域的自動化生產，還是服務領域的智能機器人，Nav2都能夠發揮重要作用，提升機器人的自主性和智能化水平。",[14,62,63],{"id":63},"導航安裝",[18,65,66],{},"藉助於Ubuntu的包資源管理器，可以使用二進制的方式安裝Nav2，安裝指令如下：",[68,69,73],"pre",{"className":70,"code":71,"language":72,"meta":32,"style":32},"language-bash shiki shiki-themes github-light github-dark","sudo apt install ros-\u003Cros2-distro>-navigation2\nsudo apt install ros-\u003Cros2-distro>-nav2-bringup\n\n# Humble\nsudo apt install ros-humble-navigation2\nsudo apt install ros-humble-nav2-bringup\n\n# Jazzy\nsudo apt install ros-jazzy-navigation2\nsudo apt install ros-jazzy-nav2-bringup\n","bash",[74,75,76,112,134,141,148,160,172,177,183,195],"code",{"__ignoreMap":32},[77,78,81,85,89,92,95,99,102,106,109],"span",{"class":79,"line":80},"line",1,[77,82,84],{"class":83},"sScJk","sudo",[77,86,88],{"class":87},"sZZnC"," apt",[77,90,91],{"class":87}," install",[77,93,94],{"class":87}," ros-",[77,96,98],{"class":97},"szBVR","\u003C",[77,100,101],{"class":87},"ros2-distr",[77,103,105],{"class":104},"sVt8B","o",[77,107,108],{"class":97},">",[77,110,111],{"class":87},"-navigation2\n",[77,113,115,117,119,121,123,125,127,129,131],{"class":79,"line":114},2,[77,116,84],{"class":83},[77,118,88],{"class":87},[77,120,91],{"class":87},[77,122,94],{"class":87},[77,124,98],{"class":97},[77,126,101],{"class":87},[77,128,105],{"class":104},[77,130,108],{"class":97},[77,132,133],{"class":87},"-nav2-bringup\n",[77,135,137],{"class":79,"line":136},3,[77,138,140],{"emptyLinePlaceholder":139},true,"\n",[77,142,144],{"class":79,"line":143},4,[77,145,147],{"class":146},"sJ8bj","# Humble\n",[77,149,151,153,155,157],{"class":79,"line":150},5,[77,152,84],{"class":83},[77,154,88],{"class":87},[77,156,91],{"class":87},[77,158,159],{"class":87}," ros-humble-navigation2\n",[77,161,163,165,167,169],{"class":79,"line":162},6,[77,164,84],{"class":83},[77,166,88],{"class":87},[77,168,91],{"class":87},[77,170,171],{"class":87}," ros-humble-nav2-bringup\n",[77,173,175],{"class":79,"line":174},7,[77,176,140],{"emptyLinePlaceholder":139},[77,178,180],{"class":79,"line":179},8,[77,181,182],{"class":146},"# Jazzy\n",[77,184,186,188,190,192],{"class":79,"line":185},9,[77,187,84],{"class":83},[77,189,88],{"class":87},[77,191,91],{"class":87},[77,193,194],{"class":87}," ros-jazzy-navigation2\n",[77,196,198,200,202,204],{"class":79,"line":197},10,[77,199,84],{"class":83},[77,201,88],{"class":87},[77,203,91],{"class":87},[77,205,206],{"class":87}," ros-jazzy-nav2-bringup\n",[18,208,209,210,213],{},"指令中的",[74,211,212],{},"\u003Cros2-distro>","請替換成當前所使用的ROS2版本。",[14,215,216],{"id":216},"導航條件",[18,218,219],{},"深入學習Nav2，需瞭解ROS2機器人基礎知識，並配備仿真或實體機器人作為實踐環境。",[18,221,222],{},[21,223,224],{},"ROS2基礎",[46,226,227,233,239,245,251],{},[49,228,229,232],{},[21,230,231],{},"ROS2通信"," ：瞭解ROS2中的節點（Nodes）、話題（Topics）、服務（Services）、動作（Actions）等基本概念，以及如何通過這些機制實現節點間的通信。",[49,234,235,238],{},[21,236,237],{},"生命週期管理"," ：熟悉ROS2中的生命週期節點（Lifecycle Nodes），理解節點的啟動、配置、激活、去激活、清理等狀態轉換過程，這對於管理複雜的ROS2系統至關重要。",[49,240,241,244],{},[21,242,243],{},"rviz2："," 熟練使用rviz2進行可視化調試，包括如何設置不同的顯示類型（如點雲、地圖、路徑等），以及如何通過rviz2與ROS2節點進行交互（如設置導航目標點、觀察機器人狀態等）。",[49,246,247,250],{},[21,248,249],{},"URDF："," 瞭解URDF（Unified Robot Description Format）文件，這是ROS中用於描述機器人模型的一種XML格式。熟悉如何編寫和修改URDF文件，以便在仿真或實際環境中準確地表示機器人結構。",[49,252,253,256],{},[21,254,255],{},"TF座標變換："," 掌握TF（Transform）庫的使用，理解座標變換在機器人導航中的重要性。學會如何設置和查詢不同座標系之間的變換關係，以確保機器人能夠準確地定位自身和周圍環境。",[18,258,259],{},"實踐環境",[46,261,262,268,274],{},[49,263,264,267],{},[21,265,266],{},"仿真環境："," 搭建一個ROS2兼容的仿真環境，並配置好相應的機器人模型、傳感器（如激光雷達、相機等）和仿真世界。確保仿真環境中的機器人能夠接收速度指令、反饋里程計消息、發佈傳感器數據和TF座標變換等。",[49,269,270,273],{},[21,271,272],{},"實體機器人："," 如果條件允許，準備一臺實體機器人。這臺機器人應該具備與仿真環境中相似的功能，即能夠接收速度指令、反饋里程計消息、發佈激光雷達等傳感器數據以及發佈TF座標變換。同時，確保實體機器人已經安裝了ROS2系統，並且已經配置好相應的驅動程序和算法庫。",[49,275,276,279],{},[21,277,278],{},"Nav2軟件包："," 安裝並配置好Nav2軟件包及其依賴項。Nav2是ROS2中用於機器人導航的綜合性軟件包，它包含了路徑規劃、避障、局部和全局地圖維護等多個功能模塊。確保Nav2軟件包與您的ROS2版本兼容，並且已經根據需要進行了適當的配置。",[18,281,282],{},"通過掌握上述基礎知識並準備好實踐環境，您將能夠更好地學習和應用Nav2進行機器人導航任務的開發與調試。",[14,284,285],{"id":285},"導航參數參考",[18,287,288],{},[289,290,291],"a",{"href":291,"rel":292},"https://docs.nav2.org/configuration/index.html",[293],"nofollow",[10,295,297],{"id":296},"slam-定位與建圖","SLAM 定位與建圖",[18,299,300],{},[21,301,23],{},[18,303,304],{},"SLAM（Simultaneous Localization and Mapping，即時定位與建圖）是機器人學和自動導航領域的一種關鍵技術，允許機器人在未知環境中繪製環境地圖。",[18,306,307],{},"在ROS 2下進行SLAM，通常涉及使用專門為ROS 2開發的SLAM相關軟件包。這些軟件包利用ROS 2的通訊框架（如話題、服務和action）來處理接收到的傳感器數據，包括激光雷達、相機、慣性測量單元等。",[18,309,310],{},"以下列舉了一些常見的在ROS2中使用的SLAM系統：",[312,313,314,320],"ol",{},[49,315,316,319],{},[21,317,318],{},"SLAM Toolbox"," ：SLAM Toolbox 是一種在 ROS 2 中普遍使用的 SLAM 解決方案，由 Steve Macenski 維護。它是為了替代原有的ROS中著名的gmapping包和Cartographer SLAM包而開發的，提供了2D激光SLAM領域中的多種功能。",[49,321,322,325],{},[21,323,324],{},"Cartographer for ROS 2"," ：Cartographer是由Google開發的一個2D和3D環境SLAM庫。儘管它最初是為ROS開發的，但已經有為ROS 2創建的適配版本，可以在ROS 2生態系統內使用。",[18,327,328],{},"要在ROS 2中開始一個SLAM項目，還需要具體的傳感器（例如激光雷達或攝像頭），計算機要有足夠的算力來運行SLAM算法，以及熟悉ROS 2節點、話題、服務、action、參數等知識，以實現有效的數據處理和通信。隨著項目的發展，可能還需要考慮動態重配置、3D建圖和路徑規劃等高級功能。",[18,330,331],{},[21,332,41],{},[18,334,335],{},"必須先說明的是：SLAM與Nav2並沒有直接的依賴關係，它們是兩種相對獨立的技術框架。然而，在實際應用中，這兩者卻展現出緊密的聯繫與互補性。",[337,338,339,345],"blockquote",{},[18,340,341,344],{},[21,342,343],{},"獨立性："," SLAM能夠獨立完成環境地圖的構建，無需Nav2的介入。它依靠傳感器數據來感知環境，並通過算法估計機器人的位置與姿態，從而構建出環境的地圖。與此同時，Nav2也具備自主導航的能力。即使沒有SLAM地圖作為輸入，它也能依賴其他來源的環境信息進行導航。",[18,346,347,350],{},[21,348,349],{},"互補性："," 儘管兩者在技術上各自獨立，但它們的結合卻帶來了顯著的優勢。Nav2能夠利用SLAM創建的精確地圖進行高效的路徑規劃，確保機器人能夠順利導航至目標位置。而SLAM則能借助Nav2的導航控制功能，在機器人移動過程中實時收集環境信息，從而進一步提高地圖構建的效率和準確性。",[18,352,353],{},"因此，儘管SLAM與Nav2在技術上各自獨立，但在構建完整的機器人導航系統中，它們的互補性使得機器人能夠在複雜環境中實現更加自主、精準的建圖或導航。",[14,355,356],{"id":356},"slam_toolbox概述",[18,358,23],{},[18,360,361,362,365],{},"SLAM Toolbox是一個基於開源軟件的用來構建 ",[21,363,364],{},"2D地圖"," 的工具集，旨在為研究人員和開發者提供一個快速構建和實現SLAM算法的平臺。它集成了多種常用的SLAM算法，並提供了豐富的數據處理和濾波函數，以及地圖構建和環境建模的工具。",[18,367,368],{},"功能",[46,370,371,377,383,389],{},[49,372,373,376],{},[21,374,375],{},"算法集成"," 包含基於卡爾曼濾波器和粒子濾波器的SLAM算法，以及基於圖優化的SLAM算法等。",[49,378,379,382],{},[21,380,381],{},"數據處理"," 提供數據融合、數據預處理和異常檢測等功能，支持激光雷達、攝像頭、IMU等多種傳感器數據的處理。",[49,384,385,388],{},[21,386,387],{},"地圖構建"," 利用傳感器數據和機器人運動信息構建準確的地圖，並進行更新和優化。",[49,390,391,394],{},[21,392,393],{},"模塊化設計"," 支持用戶插入自己的算法或替換現有模塊，實現高度定製化的SLAM解決方案。",[18,396,397],{},"優點",[46,399,400,406,412,418],{},[49,401,402,405],{},[21,403,404],{},"開源性和靈活性"," 作為開源軟件，SLAM Toolbox提供了源代碼和文檔，用戶可以自由修改和擴展算法。",[49,407,408,411],{},[21,409,410],{},"多種傳感器支持"," 支持激光雷達、攝像頭、IMU等多種傳感器數據，適應不同應用場景的需求。",[49,413,414,417],{},[21,415,416],{},"高效性"," 利用現代C++的特性優化性能，確保在資源受限的硬件上也能高效運行。",[49,419,420,423],{},[21,421,422],{},"廣泛的應用前景"," 適用於學術研究、無人機導航、自動駕駛汽車、室內機器人和工業自動化等多個領域。",[14,425,426],{"id":426},"slam_toolbox安裝",[18,428,429,430,435],{},"藉助於Advanced Packaging Tools(",[289,431,434],{"href":432,"rel":433},"https://c6.y.qq.com/base/fcgi-bin/u?__=bqEbdGxIB7mM",[293],"APT",")包資源管理器，可以使用二進制的方式安裝slam_toolbox，安裝指令如下：",[68,437,439],{"className":70,"code":438,"language":72,"meta":32,"style":32},"sudo apt install ros-\u003Cros2-distro>-slam-toolbox\n\n#humble\nsudo apt install ros-humble-slam-toolbox\n#jazzy\nsudo apt install ros-jazzy-slam-toolbox\n",[74,440,441,462,466,471,482,487],{"__ignoreMap":32},[77,442,443,445,447,449,451,453,455,457,459],{"class":79,"line":80},[77,444,84],{"class":83},[77,446,88],{"class":87},[77,448,91],{"class":87},[77,450,94],{"class":87},[77,452,98],{"class":97},[77,454,101],{"class":87},[77,456,105],{"class":104},[77,458,108],{"class":97},[77,460,461],{"class":87},"-slam-toolbox\n",[77,463,464],{"class":79,"line":114},[77,465,140],{"emptyLinePlaceholder":139},[77,467,468],{"class":79,"line":136},[77,469,470],{"class":146},"#humble\n",[77,472,473,475,477,479],{"class":79,"line":143},[77,474,84],{"class":83},[77,476,88],{"class":87},[77,478,91],{"class":87},[77,480,481],{"class":87}," ros-humble-slam-toolbox\n",[77,483,484],{"class":79,"line":150},[77,485,486],{"class":146},"#jazzy\n",[77,488,489,491,493,495],{"class":79,"line":162},[77,490,84],{"class":83},[77,492,88],{"class":87},[77,494,91],{"class":87},[77,496,497],{"class":87}," ros-jazzy-slam-toolbox\n",[18,499,209,500,213],{},[74,501,212],{},[14,503,504],{"id":504},"slam_toolbox節點說明",[18,506,507],{},"在slam_toolbox中常用的節點有兩個：sync_slam_toolbox_node和async_slam_toolbox_node。",[337,509,510,515,518,523],{},[18,511,512],{},[21,513,514],{},"sync_slam_toolbox_node：",[18,516,517],{},"這是一個同步節點，會等待所有傳感器數據到達後再處理，確保數據完整性和一致性，提高定位和建圖準確性。但同步處理可能導致延遲，更適合對數據一致性和準確性要求高、實時性要求不高的場景。",[18,519,520],{},[21,521,522],{},"async_slam_toolbox_node：",[18,524,525],{},"與同步節點不同，這是一個異步節點，可以立即處理已接收的數據，減小延遲，提高響應速度。但異步處理可能導致數據不完全同步，定位和建圖結果可能不如同步方式準確。因此，它更適合對實時性要求高、對數據一致性和準確性要求相對較低的場景。",[18,527,528],{},"在選擇使用sync_slam_toolbox_node還是async_slam_toolbox_node時，需根據應用需求和環境權衡。若實時性關鍵且能接受一定定位或建圖誤差，選擇async_slam_toolbox_node。若對數據一致性和準確性要求較高，且實時性非首要考慮，則選擇sync_slam_toolbox_node。另外二者的主要區別在於數據處理的方式，而兩個節點發布的話題、訂閱的話題、發佈的服務以及使用的參數等都是一樣的。",[312,530,531],{},[49,532,533],{},"訂閱的話題",[535,536,537,554],"table",{},[538,539,540],"thead",{},[541,542,543,548,551],"tr",{},[544,545,547],"th",{"align":546},"left","話題",[544,549,550],{"align":546},"類型",[544,552,553],{"align":546},"描述",[555,556,557,569],"tbody",{},[541,558,559,563,566],{},[560,561,562],"td",{"align":546},"/scan",[560,564,565],{"align":546},"sensor_msgs/msg/LaserScan",[560,567,568],{"align":546},"來自激光雷達輸入的掃描數據",[541,570,571,574,577],{},[560,572,573],{"align":546},"/tf",[560,575,576],{"align":546},"tf2_msgs/msg/TFMessage",[560,578,579],{"align":546},"配置的odom_frame到base_frame的轉換",[18,581,582],{},"雖然不訂閱/odom,但是需要發佈/odom,以改變座標。",[535,584,585,598],{},[538,586,587],{},[541,588,589,592,595],{},[544,590,591],{"align":546},"特性",[544,593,594],{"align":546},"slam_toolbox",[544,596,597],{"align":546},"hector_slam",[555,599,600,611,622,633,644,653],{},[541,601,602,605,608],{},[560,603,604],{"align":546},"地圖精度",[560,606,607],{"align":546},"高",[560,609,610],{"align":546},"中",[541,612,613,616,619],{},[560,614,615],{"align":546},"實時性",[560,617,618],{"align":546},"較好，但依賴優化（迴環檢測）",[560,620,621],{"align":546},"極高",[541,623,624,627,630],{},[560,625,626],{"align":546},"依賴數據",[560,628,629],{"align":546},"激光雷達、TF 樹、里程計",[560,631,632],{"align":546},"激光雷達（可選 IMU）",[541,634,635,638,641],{},[560,636,637],{"align":546},"迴環檢測",[560,639,640],{"align":546},"支持",[560,642,643],{"align":546},"不支持",[541,645,646,649,651],{},[560,647,648],{"align":546},"長期運行",[560,650,640],{"align":546},[560,652,643],{"align":546},[541,654,655,658,661],{},[560,656,657],{"align":546},"適用場景",[560,659,660],{"align":546},"動態導航、複雜環境",[560,662,663],{"align":546},"簡單環境，或無里程計時",[312,665,666],{"start":114},[49,667,668],{},"發佈的話題",[535,670,671,681],{},[538,672,673],{},[541,674,675,677,679],{},[544,676,547],{"align":546},[544,678,550],{"align":546},[544,680,553],{"align":546},[555,682,683,694],{},[541,684,685,688,691],{},[560,686,687],{"align":546},"/map",[560,689,690],{"align":546},"nav_msgs/msg/OccupancyGrid",[560,692,693],{"align":546},"pose-graph（姿態圖）在特定的更新頻率（map_update_interval）下的佔用柵格表示。",[541,695,696,699,702],{},[560,697,698],{"align":546},"/pose",[560,700,701],{"align":546},"geometry_msgs/msg/PoseWithCovarianceStamped",[560,703,704],{"align":546},"配置的map_frame中base_frame的位姿以及根據掃描匹配計算的協方差",[312,706,707],{"start":136},[49,708,709],{},"發佈的服務",[535,711,712,722],{},[538,713,714],{},[541,715,716,718,720],{},[544,717,547],{"align":546},[544,719,550],{"align":546},[544,721,553],{"align":546},[555,723,724,735,746,757,768,779,790,801,812],{},[541,725,726,729,732],{},[560,727,728],{"align":546},"/slam_toolbox/clear_changes",[560,730,731],{"align":546},"slam_toolbox/srv/Clear",[560,733,734],{"align":546},"清除所有待處理的手動位姿圖操作的更改",[541,736,737,740,743],{},[560,738,739],{"align":546},"/slam_toolbox/deserialize_map",[560,741,742],{"align":546},"slam_toolbox/srv/DeserializePoseGraph",[560,744,745],{"align":546},"從磁盤加載保存的序列化位姿圖文件",[541,747,748,751,754],{},[560,749,750],{"align":546},"/slam_toolbox/dynamic_map",[560,752,753],{"align":546},"nav_msgs/OccupancyGrid",[560,755,756],{"align":546},"請求位姿圖的當前狀態作為佔用網格",[541,758,759,762,765],{},[560,760,761],{"align":546},"/slam_toolbox/manual_loop_closure",[560,763,764],{"align":546},"slam_toolbox/srv/LoopClosure",[560,766,767],{"align":546},"請求對位姿圖進行手動更改",[541,769,770,773,776],{},[560,771,772],{"align":546},"/slam_toolbox/pause_new_measurements",[560,774,775],{"align":546},"slam_toolbox/srv/Pause",[560,777,778],{"align":546},"暫停處理新傳入的激光掃描",[541,780,781,784,787],{},[560,782,783],{"align":546},"/slam_toolbox/save_map",[560,785,786],{"align":546},"slam_toolbox/srv/SaveMap",[560,788,789],{"align":546},"保存可用於顯示 AMCL 定位的地圖圖像文件。",[541,791,792,795,798],{},[560,793,794],{"align":546},"/slam_toolbox/serialize_map",[560,796,797],{"align":546},"slam_toolbox/srv/SerializePoseGraph",[560,799,800],{"align":546},"保存地圖位姿圖和數據，可用於繼續建圖、slam_toolbox 定位、離線操作等",[541,802,803,806,809],{},[560,804,805],{"align":546},"/slam_toolbox/toggle_interactive_mode",[560,807,808],{"align":546},"slam_toolbox/srv/ToggleInteractive",[560,810,811],{"align":546},"在交互模式與非交互模式之間切換，發佈節點的交互式標記及其位置，以便在應用程序中進行更新",[541,813,814,817,820],{},[560,815,816],{"align":546},"/slam_toolbox/reset",[560,818,819],{"align":546},"slam_toolbox/srv/Reset",[560,821,822],{"align":546},"將當前地圖重置回初始狀態",[312,824,825],{"start":143},[49,826,827,828],{},"參數",[312,829,830],{},[49,831,832],{},"求解器參數",[46,834,835,841,847,853,859,865,871,882,888,894,900,906,912,918,924,930,936,942,948,954,960,966,972,978,984,990,996,1002,1008,1014,1025,1031,1037,1043,1049,1055,1061,1067,1073,1079,1085,1091,1097,1103,1109,1115,1121,1127,1133,1138,1144,1149,1155,1161,1167,1173,1179],{},[49,836,837,840],{},[21,838,839],{},"solver_plugin","  用於 karto 掃描解算器的非線性解算器類型。選項：solver_plugins::CeresSolver, - solver_plugins::SpaSolver, solver_plugins::G2oSolver. Default: solver_plugins::CeresSolver.",[49,842,843,846],{},[21,844,845],{},"ceres_linear_solver","  Ceres 使用的線性求解器。選項：SPARSE_NORMAL_CHOLESKY、SPARSE_SCHUR、ITERATIVE_SCHUR、CGNR。默認為 SPARSE_NORMAL_CHOLESKY。",[49,848,849,852],{},[21,850,851],{},"ceres_preconditioner","  與該求解器一起使用的預處理器。選項：JACOBI、IDENTITY（none）、SCHUR_JACOBI。默認為JACOBI。",[49,854,855,858],{},[21,856,857],{},"ceres_trust_strategy","  信任區域策略。行搜索策略沒有公開，因為它們對於這種用途表現不佳。選項：LEVENBERG_MARQUARDT、DOGLEG。默認值：LEVENBERG_MARQUARDT。",[49,860,861,864],{},[21,862,863],{},"ceres_dogleg_type","  如果信任策略是 DOGLEG，則使用dogleg策略。選項：TRADITIONAL_DOGLEG、SUBSPACE_DOGLEG。默認值：TRADITIONAL_DOGLEG",[49,866,867,870],{},[21,868,869],{},"ceres_loss_function","  拒絕異常值的損失函數類型。沒有一個等於損失平方。選項：None、HuberLoss、CauchyLoss。默認值：None。",[49,872,873,876,877],{},[21,874,875],{},"mode","  “建圖”或“定位”模式，用於 Ceres 問題創建中的性能優化",[46,878,879],{},[49,880,881],{},"Toolbox參數",[49,883,884,887],{},[21,885,886],{},"odom_frame","  里程計座標系",[49,889,890,893],{},[21,891,892],{},"map_frame","  地圖座標系",[49,895,896,899],{},[21,897,898],{},"base_frame","  基座標系",[49,901,902,905],{},[21,903,904],{},"scan_topic","  掃描主題名， 注意是/scan 不是scan",[49,907,908,911],{},[21,909,910],{},"scan_queue_size","  掃描消息對隊列長度。在異步模式下應始終設置為 1",[49,913,914,917],{},[21,915,916],{},"use_map_saver","  實例化地圖服務程序並自行訂閱map主題",[49,919,920,923],{},[21,921,922],{},"map_file_name","  啟動時加載的位姿圖文件的名稱（如果可用）",[49,925,926,929],{},[21,927,928],{},"map_start_pose","  啟動建圖/定位時的位姿（如果可用）",[49,931,932,935],{},[21,933,934],{},"map_start_at_dock","  在dock（第一個節點）處啟動姿勢圖加載（如果可用）。如果同時設置了pose和dock，優先使用pose",[49,937,938,941],{},[21,939,940],{},"debug_logging","  更改日誌以進行調試",[49,943,944,947],{},[21,945,946],{},"throttle_scans","  在同步模式下限制的掃描次數",[49,949,950,953],{},[21,951,952],{},"transform_publish_period","  里程計odom變換髮布週期。 0 不會發布變換。",[49,955,956,959],{},[21,957,958],{},"map_update_interval","  更新 2D 佔用地圖的時間間隔",[49,961,962,965],{},[21,963,964],{},"enable_interactive_mode","  是否允許啟用交互模式。交互模式將保留映射到其 ID 的激光掃描緩存，以便在交互模式下進行可視化。結果，該進程的內存將會增加。在定位和長期建圖模式下可以手動禁用此功能，因為它們會隨著時間的推移增加內存利用率。對於建圖或連續建圖模式均有效。",[49,967,968,971],{},[21,969,970],{},"position_covariance_scale","  從掃描匹配發布姿勢時縮放位置協方差的量。這可用於調整下游定位濾波器中位姿的影響。協方差表示測量的不確定性，因此擴大協方差將減小位姿對下游濾波器的影響。默認值：1.0",[49,973,974,977],{},[21,975,976],{},"yaw_covariance_scale","  從掃描匹配發布位姿時縮放偏航協方差的量。請參閱position_covariance_scale 的描述。默認值：1.0",[49,979,980,983],{},[21,981,982],{},"resolution","  生成的 2D 佔用圖的分辨率",[49,985,986,989],{},[21,987,988],{},"max_laser_range","  用於 2D 佔用地圖光柵化的最大激光範圍",[49,991,992,995],{},[21,993,994],{},"minimum_time_interval","  在同步模式下處理的掃描之間的最短持續時間",[49,997,998,1001],{},[21,999,1000],{},"transform_timeout","  查找轉換 TF 超時時間限制",[49,1003,1004,1007],{},[21,1005,1006],{},"tf_buffer_duration","  存儲 TF 消息以供查詢的時間。如果在同步模式下以倍速脫機運行，則設置高一些。",[49,1009,1010,1013],{},[21,1011,1012],{},"stack_size_to_use","  將堆棧大小重置為的字節數，以啟用文件的序列化/反序列化。自由默認值為 40000000，但越少越好。",[49,1015,1016,1019,1020],{},[21,1017,1018],{},"minimum_travel_distance","  處理新掃描之前的最小行進距離",[46,1021,1022],{},[49,1023,1024],{},"匹配器參數",[49,1026,1027,1030],{},[21,1028,1029],{},"use_scan_matching","  是否使用掃描匹配來優化里程位姿",[49,1032,1033,1036],{},[21,1034,1035],{},"use_scan_barycenter","  是否使用重心或掃描位姿",[49,1038,1039,1042],{},[21,1040,1041],{},"minimum_travel_heading","  合理更新的最小航向變化",[49,1044,1045,1048],{},[21,1046,1047],{},"scan_buffer_size","  緩衝到鏈中的掃描次數，也用作定位模式循環緩衝區中的掃描次數",[49,1050,1051,1054],{},[21,1052,1053],{},"scan_buffer_maximum_scan_distance","  從緩衝區中刪除之前掃描，距離之前位姿的最大距離",[49,1056,1057,1060],{},[21,1058,1059],{},"link_match_minimum_response_fine","  精細分辨率通過的閾值鏈接匹配算法響應",[49,1062,1063,1066],{},[21,1064,1065],{},"link_scan_maximum_distance","  有效鏈接掃描之間的最大距離",[49,1068,1069,1072],{},[21,1070,1071],{},"Loop_search_maximum_distance","  循環閉合時考慮的掃描距離的最大閾值",[49,1074,1075,1078],{},[21,1076,1077],{},"do_loop_close","  是否進行循環閉合（如果不確定，答案是“true”）",[49,1080,1081,1084],{},[21,1082,1083],{},"Loop_match_minimum_chain_size","  尋找循環閉合的掃描的最小鏈長度",[49,1086,1087,1090],{},[21,1088,1089],{},"Loop_match_maximum_variance_coarse","  粗略搜索中傳遞給細化的閾值方差",[49,1092,1093,1096],{},[21,1094,1095],{},"Loop_match_minimum_response_coarse","  粗略搜索中環路閉合算法的閾值響應要傳遞給細化",[49,1098,1099,1102],{},[21,1100,1101],{},"Loop_match_minimum_response_fine","  精細搜索中循環閉合算法的閾值響應傳遞給細化",[49,1104,1105,1108],{},[21,1106,1107],{},"correlation_search_space_dimension"," 搜索網格大小以進行掃描相關性",[49,1110,1111,1114],{},[21,1112,1113],{},"correlation_search_space_resolution","  搜索網格分辨率以進行掃描相關性",[49,1116,1117,1120],{},[21,1118,1119],{},"correlation_search_space_smear_deviation","  用於平滑響應的多模態塗抹量",[49,1122,1123,1126],{},[21,1124,1125],{},"loop_search_space_dimension","  循環閉合算法的搜索網格的大小",[49,1128,1129,1132],{},[21,1130,1131],{},"loop_search_space_resolution","  搜索網格分辨率以進行循環閉合",[49,1134,1135,1120],{},[21,1136,1137],{},"loop_search_space_smear_deviation",[49,1139,1140,1143],{},[21,1141,1142],{},"distance_variance_penalty","  應用於匹配掃描的懲罰，因為它與里程姿勢不同",[49,1145,1146,1143],{},[21,1147,1148],{},"angle_variance_penalty",[49,1150,1151,1154],{},[21,1152,1153],{},"fine_search_angle_offset","  用於測試精細掃描匹配的角度範圍",[49,1156,1157,1160],{},[21,1158,1159],{},"rough_search_angle_offset","  用於測試粗略掃描匹配的角度範圍",[49,1162,1163,1166],{},[21,1164,1165],{},"coarse_angle_resolution","  在掃描匹配中測試的偏移範圍內的角度分辨率",[49,1168,1169,1172],{},[21,1170,1171],{},"minimum_angle_penalty","  確保尺寸不會膨脹的最小懲罰角度",[49,1174,1175,1178],{},[21,1176,1177],{},"minimum_distance_penalty","  掃描可以確保大小不會爆炸的最小懲罰",[49,1180,1181,1184],{},[21,1182,1183],{},"use_response_expansion","  如果沒有找到可行的匹配，是否自動增加搜索網格大小",[14,1186,1187],{"id":1187},"slam_toolbox基本使用",[312,1189,1190],{},[49,1191,1192],{},"準備工作",[18,1194,1195],{},"在src目錄下，請先調用如下指令在工作空間的src目錄下創建一個功能包：",[68,1197,1199],{"className":70,"code":1198,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_slam_slam_toolbox --dependencies slam_toolbox\n",[74,1200,1201],{"__ignoreMap":32},[77,1202,1203,1206,1209,1212,1215,1219],{"class":79,"line":80},[77,1204,1205],{"class":83},"ros2",[77,1207,1208],{"class":87}," pkg",[77,1210,1211],{"class":87}," create",[77,1213,1214],{"class":87}," mycar_slam_slam_toolbox",[77,1216,1218],{"class":1217},"sj4cs"," --dependencies",[77,1220,1221],{"class":87}," slam_toolbox\n",[312,1223,1224],{"start":114},[49,1225,1226],{},"編寫launch文件與參數文件",[18,1228,1229,1230,1233],{},"在功能包下，新建launch目錄和params目錄，launch目錄下新建",[74,1231,1232],{},"online_sync_launch.py","文件並輸入如下內容：",[68,1235,1239],{"className":1236,"code":1237,"language":1238,"meta":32,"style":32},"language-python shiki shiki-themes github-light github-dark","import os\n\nfrom launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument\nfrom launch.substitutions import LaunchConfiguration\nfrom launch_ros.actions import Node\nfrom ament_index_python.packages import get_package_share_directory\n\ndef generate_launch_description():\n    use_sim_time = LaunchConfiguration('use_sim_time')\n    slam_params_file = LaunchConfiguration('slam_params_file')\n\n    declare_use_sim_time_argument = DeclareLaunchArgument(\n        'use_sim_time',\n        default_value='false',\n        description='Use simulation/Gazebo clock')\n    declare_slam_params_file_cmd = DeclareLaunchArgument(\n        'slam_params_file',\n        default_value=os.path.join(get_package_share_directory(\"mycar_slam_slam_toolbox\"),\n                                   'params', 'mapper_params_online_sync.yaml'),\n        description='Full path to the ROS2 parameters file to use for the slam_toolbox node')\n\n    start_sync_slam_toolbox_node = Node(\n        parameters=[\n          slam_params_file,\n          {'use_sim_time': use_sim_time}\n        ],\n        package='slam_toolbox',\n        executable='sync_slam_toolbox_node',\n        name='slam_toolbox',\n        output='screen')\n\n    ld = LaunchDescription()\n\n    ld.add_action(declare_use_sim_time_argument)\n    ld.add_action(declare_slam_params_file_cmd)\n    ld.add_action(start_sync_slam_toolbox_node)\n\n    return ld\n","python",[74,1240,1241,1249,1253,1266,1278,1290,1302,1314,1318,1329,1346,1361,1366,1377,1386,1400,1413,1423,1431,1447,1461,1473,1478,1489,1500,1506,1517,1523,1536,1549,1561,1574,1579,1590,1595,1601,1607,1613,1618],{"__ignoreMap":32},[77,1242,1243,1246],{"class":79,"line":80},[77,1244,1245],{"class":97},"import",[77,1247,1248],{"class":104}," os\n",[77,1250,1251],{"class":79,"line":114},[77,1252,140],{"emptyLinePlaceholder":139},[77,1254,1255,1258,1261,1263],{"class":79,"line":136},[77,1256,1257],{"class":97},"from",[77,1259,1260],{"class":104}," launch ",[77,1262,1245],{"class":97},[77,1264,1265],{"class":104}," LaunchDescription\n",[77,1267,1268,1270,1273,1275],{"class":79,"line":143},[77,1269,1257],{"class":97},[77,1271,1272],{"class":104}," launch.actions ",[77,1274,1245],{"class":97},[77,1276,1277],{"class":104}," DeclareLaunchArgument\n",[77,1279,1280,1282,1285,1287],{"class":79,"line":150},[77,1281,1257],{"class":97},[77,1283,1284],{"class":104}," launch.substitutions ",[77,1286,1245],{"class":97},[77,1288,1289],{"class":104}," LaunchConfiguration\n",[77,1291,1292,1294,1297,1299],{"class":79,"line":162},[77,1293,1257],{"class":97},[77,1295,1296],{"class":104}," launch_ros.actions ",[77,1298,1245],{"class":97},[77,1300,1301],{"class":104}," Node\n",[77,1303,1304,1306,1309,1311],{"class":79,"line":174},[77,1305,1257],{"class":97},[77,1307,1308],{"class":104}," ament_index_python.packages ",[77,1310,1245],{"class":97},[77,1312,1313],{"class":104}," get_package_share_directory\n",[77,1315,1316],{"class":79,"line":179},[77,1317,140],{"emptyLinePlaceholder":139},[77,1319,1320,1323,1326],{"class":79,"line":185},[77,1321,1322],{"class":97},"def",[77,1324,1325],{"class":83}," generate_launch_description",[77,1327,1328],{"class":104},"():\n",[77,1330,1331,1334,1337,1340,1343],{"class":79,"line":197},[77,1332,1333],{"class":104},"    use_sim_time ",[77,1335,1336],{"class":97},"=",[77,1338,1339],{"class":104}," LaunchConfiguration(",[77,1341,1342],{"class":87},"'use_sim_time'",[77,1344,1345],{"class":104},")\n",[77,1347,1349,1352,1354,1356,1359],{"class":79,"line":1348},11,[77,1350,1351],{"class":104},"    slam_params_file ",[77,1353,1336],{"class":97},[77,1355,1339],{"class":104},[77,1357,1358],{"class":87},"'slam_params_file'",[77,1360,1345],{"class":104},[77,1362,1364],{"class":79,"line":1363},12,[77,1365,140],{"emptyLinePlaceholder":139},[77,1367,1369,1372,1374],{"class":79,"line":1368},13,[77,1370,1371],{"class":104},"    declare_use_sim_time_argument ",[77,1373,1336],{"class":97},[77,1375,1376],{"class":104}," DeclareLaunchArgument(\n",[77,1378,1380,1383],{"class":79,"line":1379},14,[77,1381,1382],{"class":87},"        'use_sim_time'",[77,1384,1385],{"class":104},",\n",[77,1387,1389,1393,1395,1398],{"class":79,"line":1388},15,[77,1390,1392],{"class":1391},"s4XuR","        default_value",[77,1394,1336],{"class":97},[77,1396,1397],{"class":87},"'false'",[77,1399,1385],{"class":104},[77,1401,1403,1406,1408,1411],{"class":79,"line":1402},16,[77,1404,1405],{"class":1391},"        description",[77,1407,1336],{"class":97},[77,1409,1410],{"class":87},"'Use simulation/Gazebo clock'",[77,1412,1345],{"class":104},[77,1414,1416,1419,1421],{"class":79,"line":1415},17,[77,1417,1418],{"class":104},"    declare_slam_params_file_cmd ",[77,1420,1336],{"class":97},[77,1422,1376],{"class":104},[77,1424,1426,1429],{"class":79,"line":1425},18,[77,1427,1428],{"class":87},"        'slam_params_file'",[77,1430,1385],{"class":104},[77,1432,1434,1436,1438,1441,1444],{"class":79,"line":1433},19,[77,1435,1392],{"class":1391},[77,1437,1336],{"class":97},[77,1439,1440],{"class":104},"os.path.join(get_package_share_directory(",[77,1442,1443],{"class":87},"\"mycar_slam_slam_toolbox\"",[77,1445,1446],{"class":104},"),\n",[77,1448,1450,1453,1456,1459],{"class":79,"line":1449},20,[77,1451,1452],{"class":87},"                                   'params'",[77,1454,1455],{"class":104},", ",[77,1457,1458],{"class":87},"'mapper_params_online_sync.yaml'",[77,1460,1446],{"class":104},[77,1462,1464,1466,1468,1471],{"class":79,"line":1463},21,[77,1465,1405],{"class":1391},[77,1467,1336],{"class":97},[77,1469,1470],{"class":87},"'Full path to the ROS2 parameters file to use for the slam_toolbox node'",[77,1472,1345],{"class":104},[77,1474,1476],{"class":79,"line":1475},22,[77,1477,140],{"emptyLinePlaceholder":139},[77,1479,1481,1484,1486],{"class":79,"line":1480},23,[77,1482,1483],{"class":104},"    start_sync_slam_toolbox_node ",[77,1485,1336],{"class":97},[77,1487,1488],{"class":104}," Node(\n",[77,1490,1492,1495,1497],{"class":79,"line":1491},24,[77,1493,1494],{"class":1391},"        parameters",[77,1496,1336],{"class":97},[77,1498,1499],{"class":104},"[\n",[77,1501,1503],{"class":79,"line":1502},25,[77,1504,1505],{"class":104},"          slam_params_file,\n",[77,1507,1509,1512,1514],{"class":79,"line":1508},26,[77,1510,1511],{"class":104},"          {",[77,1513,1342],{"class":87},[77,1515,1516],{"class":104},": use_sim_time}\n",[77,1518,1520],{"class":79,"line":1519},27,[77,1521,1522],{"class":104},"        ],\n",[77,1524,1526,1529,1531,1534],{"class":79,"line":1525},28,[77,1527,1528],{"class":1391},"        package",[77,1530,1336],{"class":97},[77,1532,1533],{"class":87},"'slam_toolbox'",[77,1535,1385],{"class":104},[77,1537,1539,1542,1544,1547],{"class":79,"line":1538},29,[77,1540,1541],{"class":1391},"        executable",[77,1543,1336],{"class":97},[77,1545,1546],{"class":87},"'sync_slam_toolbox_node'",[77,1548,1385],{"class":104},[77,1550,1552,1555,1557,1559],{"class":79,"line":1551},30,[77,1553,1554],{"class":1391},"        name",[77,1556,1336],{"class":97},[77,1558,1533],{"class":87},[77,1560,1385],{"class":104},[77,1562,1564,1567,1569,1572],{"class":79,"line":1563},31,[77,1565,1566],{"class":1391},"        output",[77,1568,1336],{"class":97},[77,1570,1571],{"class":87},"'screen'",[77,1573,1345],{"class":104},[77,1575,1577],{"class":79,"line":1576},32,[77,1578,140],{"emptyLinePlaceholder":139},[77,1580,1582,1585,1587],{"class":79,"line":1581},33,[77,1583,1584],{"class":104},"    ld ",[77,1586,1336],{"class":97},[77,1588,1589],{"class":104}," LaunchDescription()\n",[77,1591,1593],{"class":79,"line":1592},34,[77,1594,140],{"emptyLinePlaceholder":139},[77,1596,1598],{"class":79,"line":1597},35,[77,1599,1600],{"class":104},"    ld.add_action(declare_use_sim_time_argument)\n",[77,1602,1604],{"class":79,"line":1603},36,[77,1605,1606],{"class":104},"    ld.add_action(declare_slam_params_file_cmd)\n",[77,1608,1610],{"class":79,"line":1609},37,[77,1611,1612],{"class":104},"    ld.add_action(start_sync_slam_toolbox_node)\n",[77,1614,1616],{"class":79,"line":1615},38,[77,1617,140],{"emptyLinePlaceholder":139},[77,1619,1621,1624],{"class":79,"line":1620},39,[77,1622,1623],{"class":97},"    return",[77,1625,1626],{"class":104}," ld\n",[18,1628,1629,1630,1633,1634,1636],{},"該launch文件主要是加載了slam_toolbox下的sync_slam_toolbox_node節點，並且會從當前功能包的params下讀取一個名為",[74,1631,1632],{},"mapper_params_online_sync.yaml","的配置文件。這個配置文件還不存在，接下來需要在params目錄下新建",[74,1635,1632],{},"文件，並輸入如下內容：",[68,1638,1642],{"className":1639,"code":1640,"language":1641,"meta":32,"style":32},"language-yaml shiki shiki-themes github-light github-dark","slam_toolbox:\n  ros__parameters:\n    solver_plugin: solver_plugins::CeresSolver\n    ceres_linear_solver: SPARSE_NORMAL_CHOLESKY\n    ceres_preconditioner: SCHUR_JACOBI\n    ceres_trust_strategy: LEVENBERG_MARQUARDT\n    ceres_dogleg_type: TRADITIONAL_DOGLEG\n    ceres_loss_function: None\n\n    odom_frame: odom\n    map_frame: map\n    base_frame: base_link\n    scan_topic: /scan\n    mode: mapping #localization\n\n    #map_file_name: test_steve\n    #map_start_pose: [0.0, 0.0, 0.0]\n    #map_start_at_dock: true\n\n    debug_logging: false\n    throttle_scans: 1\n    transform_publish_period: 0.02 \n    map_update_interval: 2.0\n    resolution: 0.05\n    max_laser_range: 20.0 \n    minimum_time_interval: 0.5\n    transform_timeout: 0.2\n    tf_buffer_duration: 30.0\n    stack_size_to_use: 40000000 \n    enable_interactive_mode: true\n\n    use_scan_matching: true\n    use_scan_barycenter: true\n    minimum_travel_distance: 0.1\n    minimum_travel_heading: 0.1\n    scan_buffer_size: 100\n    scan_buffer_maximum_scan_distance: 10.0\n    link_match_minimum_response_fine: 0.1  \n    link_scan_maximum_distance: 1.5\n    loop_search_maximum_distance: 3.0\n    do_loop_closing: true \n    loop_match_minimum_chain_size: 10           \n    loop_match_maximum_variance_coarse: 3.0  \n    loop_match_minimum_response_coarse: 0.35    \n    loop_match_minimum_response_fine: 0.45\n\n    correlation_search_space_dimension: 0.5\n    correlation_search_space_resolution: 0.01\n    correlation_search_space_smear_deviation: 0.1 \n\n    loop_search_space_dimension: 8.0\n    loop_search_space_resolution: 0.05\n    loop_search_space_smear_deviation: 0.03\n\n    distance_variance_penalty: 0.5      \n    angle_variance_penalty: 1.0    \n\n    fine_search_angle_offset: 0.00349     \n    coarse_search_angle_offset: 0.349   \n    coarse_angle_resolution: 0.0349        \n    minimum_angle_penalty: 0.9\n    minimum_distance_penalty: 0.5\n    use_response_expansion: true\n","yaml",[74,1643,1644,1652,1659,1670,1680,1690,1700,1710,1720,1724,1734,1744,1754,1764,1777,1781,1786,1791,1796,1800,1810,1820,1833,1843,1853,1865,1875,1885,1895,1907,1917,1921,1930,1939,1949,1958,1968,1978,1991,2001,2012,2025,2039,2052,2066,2077,2082,2092,2103,2115,2120,2131,2141,2152,2157,2171,2184,2189,2203,2217,2231,2242,2252],{"__ignoreMap":32},[77,1645,1646,1649],{"class":79,"line":80},[77,1647,594],{"class":1648},"s9eBZ",[77,1650,1651],{"class":104},":\n",[77,1653,1654,1657],{"class":79,"line":114},[77,1655,1656],{"class":1648},"  ros__parameters",[77,1658,1651],{"class":104},[77,1660,1661,1664,1667],{"class":79,"line":136},[77,1662,1663],{"class":1648},"    solver_plugin",[77,1665,1666],{"class":104},": ",[77,1668,1669],{"class":87},"solver_plugins::CeresSolver\n",[77,1671,1672,1675,1677],{"class":79,"line":143},[77,1673,1674],{"class":1648},"    ceres_linear_solver",[77,1676,1666],{"class":104},[77,1678,1679],{"class":87},"SPARSE_NORMAL_CHOLESKY\n",[77,1681,1682,1685,1687],{"class":79,"line":150},[77,1683,1684],{"class":1648},"    ceres_preconditioner",[77,1686,1666],{"class":104},[77,1688,1689],{"class":87},"SCHUR_JACOBI\n",[77,1691,1692,1695,1697],{"class":79,"line":162},[77,1693,1694],{"class":1648},"    ceres_trust_strategy",[77,1696,1666],{"class":104},[77,1698,1699],{"class":87},"LEVENBERG_MARQUARDT\n",[77,1701,1702,1705,1707],{"class":79,"line":174},[77,1703,1704],{"class":1648},"    ceres_dogleg_type",[77,1706,1666],{"class":104},[77,1708,1709],{"class":87},"TRADITIONAL_DOGLEG\n",[77,1711,1712,1715,1717],{"class":79,"line":179},[77,1713,1714],{"class":1648},"    ceres_loss_function",[77,1716,1666],{"class":104},[77,1718,1719],{"class":87},"None\n",[77,1721,1722],{"class":79,"line":185},[77,1723,140],{"emptyLinePlaceholder":139},[77,1725,1726,1729,1731],{"class":79,"line":197},[77,1727,1728],{"class":1648},"    odom_frame",[77,1730,1666],{"class":104},[77,1732,1733],{"class":87},"odom\n",[77,1735,1736,1739,1741],{"class":79,"line":1348},[77,1737,1738],{"class":1648},"    map_frame",[77,1740,1666],{"class":104},[77,1742,1743],{"class":87},"map\n",[77,1745,1746,1749,1751],{"class":79,"line":1363},[77,1747,1748],{"class":1648},"    base_frame",[77,1750,1666],{"class":104},[77,1752,1753],{"class":87},"base_link\n",[77,1755,1756,1759,1761],{"class":79,"line":1368},[77,1757,1758],{"class":1648},"    scan_topic",[77,1760,1666],{"class":104},[77,1762,1763],{"class":87},"/scan\n",[77,1765,1766,1769,1771,1774],{"class":79,"line":1379},[77,1767,1768],{"class":1648},"    mode",[77,1770,1666],{"class":104},[77,1772,1773],{"class":87},"mapping",[77,1775,1776],{"class":146}," #localization\n",[77,1778,1779],{"class":79,"line":1388},[77,1780,140],{"emptyLinePlaceholder":139},[77,1782,1783],{"class":79,"line":1402},[77,1784,1785],{"class":146},"    #map_file_name: test_steve\n",[77,1787,1788],{"class":79,"line":1415},[77,1789,1790],{"class":146},"    #map_start_pose: [0.0, 0.0, 0.0]\n",[77,1792,1793],{"class":79,"line":1425},[77,1794,1795],{"class":146},"    #map_start_at_dock: true\n",[77,1797,1798],{"class":79,"line":1433},[77,1799,140],{"emptyLinePlaceholder":139},[77,1801,1802,1805,1807],{"class":79,"line":1449},[77,1803,1804],{"class":1648},"    debug_logging",[77,1806,1666],{"class":104},[77,1808,1809],{"class":1217},"false\n",[77,1811,1812,1815,1817],{"class":79,"line":1463},[77,1813,1814],{"class":1648},"    throttle_scans",[77,1816,1666],{"class":104},[77,1818,1819],{"class":1217},"1\n",[77,1821,1822,1825,1827,1830],{"class":79,"line":1475},[77,1823,1824],{"class":1648},"    transform_publish_period",[77,1826,1666],{"class":104},[77,1828,1829],{"class":1217},"0.02",[77,1831,1832],{"class":104}," \n",[77,1834,1835,1838,1840],{"class":79,"line":1480},[77,1836,1837],{"class":1648},"    map_update_interval",[77,1839,1666],{"class":104},[77,1841,1842],{"class":1217},"2.0\n",[77,1844,1845,1848,1850],{"class":79,"line":1491},[77,1846,1847],{"class":1648},"    resolution",[77,1849,1666],{"class":104},[77,1851,1852],{"class":1217},"0.05\n",[77,1854,1855,1858,1860,1863],{"class":79,"line":1502},[77,1856,1857],{"class":1648},"    max_laser_range",[77,1859,1666],{"class":104},[77,1861,1862],{"class":1217},"20.0",[77,1864,1832],{"class":104},[77,1866,1867,1870,1872],{"class":79,"line":1508},[77,1868,1869],{"class":1648},"    minimum_time_interval",[77,1871,1666],{"class":104},[77,1873,1874],{"class":1217},"0.5\n",[77,1876,1877,1880,1882],{"class":79,"line":1519},[77,1878,1879],{"class":1648},"    transform_timeout",[77,1881,1666],{"class":104},[77,1883,1884],{"class":1217},"0.2\n",[77,1886,1887,1890,1892],{"class":79,"line":1525},[77,1888,1889],{"class":1648},"    tf_buffer_duration",[77,1891,1666],{"class":104},[77,1893,1894],{"class":1217},"30.0\n",[77,1896,1897,1900,1902,1905],{"class":79,"line":1538},[77,1898,1899],{"class":1648},"    stack_size_to_use",[77,1901,1666],{"class":104},[77,1903,1904],{"class":1217},"40000000",[77,1906,1832],{"class":104},[77,1908,1909,1912,1914],{"class":79,"line":1551},[77,1910,1911],{"class":1648},"    enable_interactive_mode",[77,1913,1666],{"class":104},[77,1915,1916],{"class":1217},"true\n",[77,1918,1919],{"class":79,"line":1563},[77,1920,140],{"emptyLinePlaceholder":139},[77,1922,1923,1926,1928],{"class":79,"line":1576},[77,1924,1925],{"class":1648},"    use_scan_matching",[77,1927,1666],{"class":104},[77,1929,1916],{"class":1217},[77,1931,1932,1935,1937],{"class":79,"line":1581},[77,1933,1934],{"class":1648},"    use_scan_barycenter",[77,1936,1666],{"class":104},[77,1938,1916],{"class":1217},[77,1940,1941,1944,1946],{"class":79,"line":1592},[77,1942,1943],{"class":1648},"    minimum_travel_distance",[77,1945,1666],{"class":104},[77,1947,1948],{"class":1217},"0.1\n",[77,1950,1951,1954,1956],{"class":79,"line":1597},[77,1952,1953],{"class":1648},"    minimum_travel_heading",[77,1955,1666],{"class":104},[77,1957,1948],{"class":1217},[77,1959,1960,1963,1965],{"class":79,"line":1603},[77,1961,1962],{"class":1648},"    scan_buffer_size",[77,1964,1666],{"class":104},[77,1966,1967],{"class":1217},"100\n",[77,1969,1970,1973,1975],{"class":79,"line":1609},[77,1971,1972],{"class":1648},"    scan_buffer_maximum_scan_distance",[77,1974,1666],{"class":104},[77,1976,1977],{"class":1217},"10.0\n",[77,1979,1980,1983,1985,1988],{"class":79,"line":1615},[77,1981,1982],{"class":1648},"    link_match_minimum_response_fine",[77,1984,1666],{"class":104},[77,1986,1987],{"class":1217},"0.1",[77,1989,1990],{"class":104},"  \n",[77,1992,1993,1996,1998],{"class":79,"line":1620},[77,1994,1995],{"class":1648},"    link_scan_maximum_distance",[77,1997,1666],{"class":104},[77,1999,2000],{"class":1217},"1.5\n",[77,2002,2004,2007,2009],{"class":79,"line":2003},40,[77,2005,2006],{"class":1648},"    loop_search_maximum_distance",[77,2008,1666],{"class":104},[77,2010,2011],{"class":1217},"3.0\n",[77,2013,2015,2018,2020,2023],{"class":79,"line":2014},41,[77,2016,2017],{"class":1648},"    do_loop_closing",[77,2019,1666],{"class":104},[77,2021,2022],{"class":1217},"true",[77,2024,1832],{"class":104},[77,2026,2028,2031,2033,2036],{"class":79,"line":2027},42,[77,2029,2030],{"class":1648},"    loop_match_minimum_chain_size",[77,2032,1666],{"class":104},[77,2034,2035],{"class":1217},"10",[77,2037,2038],{"class":104},"           \n",[77,2040,2042,2045,2047,2050],{"class":79,"line":2041},43,[77,2043,2044],{"class":1648},"    loop_match_maximum_variance_coarse",[77,2046,1666],{"class":104},[77,2048,2049],{"class":1217},"3.0",[77,2051,1990],{"class":104},[77,2053,2055,2058,2060,2063],{"class":79,"line":2054},44,[77,2056,2057],{"class":1648},"    loop_match_minimum_response_coarse",[77,2059,1666],{"class":104},[77,2061,2062],{"class":1217},"0.35",[77,2064,2065],{"class":104},"    \n",[77,2067,2069,2072,2074],{"class":79,"line":2068},45,[77,2070,2071],{"class":1648},"    loop_match_minimum_response_fine",[77,2073,1666],{"class":104},[77,2075,2076],{"class":1217},"0.45\n",[77,2078,2080],{"class":79,"line":2079},46,[77,2081,140],{"emptyLinePlaceholder":139},[77,2083,2085,2088,2090],{"class":79,"line":2084},47,[77,2086,2087],{"class":1648},"    correlation_search_space_dimension",[77,2089,1666],{"class":104},[77,2091,1874],{"class":1217},[77,2093,2095,2098,2100],{"class":79,"line":2094},48,[77,2096,2097],{"class":1648},"    correlation_search_space_resolution",[77,2099,1666],{"class":104},[77,2101,2102],{"class":1217},"0.01\n",[77,2104,2106,2109,2111,2113],{"class":79,"line":2105},49,[77,2107,2108],{"class":1648},"    correlation_search_space_smear_deviation",[77,2110,1666],{"class":104},[77,2112,1987],{"class":1217},[77,2114,1832],{"class":104},[77,2116,2118],{"class":79,"line":2117},50,[77,2119,140],{"emptyLinePlaceholder":139},[77,2121,2123,2126,2128],{"class":79,"line":2122},51,[77,2124,2125],{"class":1648},"    loop_search_space_dimension",[77,2127,1666],{"class":104},[77,2129,2130],{"class":1217},"8.0\n",[77,2132,2134,2137,2139],{"class":79,"line":2133},52,[77,2135,2136],{"class":1648},"    loop_search_space_resolution",[77,2138,1666],{"class":104},[77,2140,1852],{"class":1217},[77,2142,2144,2147,2149],{"class":79,"line":2143},53,[77,2145,2146],{"class":1648},"    loop_search_space_smear_deviation",[77,2148,1666],{"class":104},[77,2150,2151],{"class":1217},"0.03\n",[77,2153,2155],{"class":79,"line":2154},54,[77,2156,140],{"emptyLinePlaceholder":139},[77,2158,2160,2163,2165,2168],{"class":79,"line":2159},55,[77,2161,2162],{"class":1648},"    distance_variance_penalty",[77,2164,1666],{"class":104},[77,2166,2167],{"class":1217},"0.5",[77,2169,2170],{"class":104},"      \n",[77,2172,2174,2177,2179,2182],{"class":79,"line":2173},56,[77,2175,2176],{"class":1648},"    angle_variance_penalty",[77,2178,1666],{"class":104},[77,2180,2181],{"class":1217},"1.0",[77,2183,2065],{"class":104},[77,2185,2187],{"class":79,"line":2186},57,[77,2188,140],{"emptyLinePlaceholder":139},[77,2190,2192,2195,2197,2200],{"class":79,"line":2191},58,[77,2193,2194],{"class":1648},"    fine_search_angle_offset",[77,2196,1666],{"class":104},[77,2198,2199],{"class":1217},"0.00349",[77,2201,2202],{"class":104},"     \n",[77,2204,2206,2209,2211,2214],{"class":79,"line":2205},59,[77,2207,2208],{"class":1648},"    coarse_search_angle_offset",[77,2210,1666],{"class":104},[77,2212,2213],{"class":1217},"0.349",[77,2215,2216],{"class":104},"   \n",[77,2218,2220,2223,2225,2228],{"class":79,"line":2219},60,[77,2221,2222],{"class":1648},"    coarse_angle_resolution",[77,2224,1666],{"class":104},[77,2226,2227],{"class":1217},"0.0349",[77,2229,2230],{"class":104},"        \n",[77,2232,2234,2237,2239],{"class":79,"line":2233},61,[77,2235,2236],{"class":1648},"    minimum_angle_penalty",[77,2238,1666],{"class":104},[77,2240,2241],{"class":1217},"0.9\n",[77,2243,2245,2248,2250],{"class":79,"line":2244},62,[77,2246,2247],{"class":1648},"    minimum_distance_penalty",[77,2249,1666],{"class":104},[77,2251,1874],{"class":1217},[77,2253,2255,2258,2260],{"class":79,"line":2254},63,[77,2256,2257],{"class":1648},"    use_response_expansion",[77,2259,1666],{"class":104},[77,2261,1916],{"class":1217},[18,2263,2264],{},"配置文件的內容需要根據實際情況進行動態調整。",[312,2266,2267],{"start":136},[49,2268,2269],{},"編輯配置文件",[18,2271,2272,2273,2276],{},"打開",[74,2274,2275],{},"CMakeLists.txt"," 並輸入如下內容：",[68,2278,2282],{"className":2279,"code":2280,"language":2281,"meta":32,"style":32},"language-cmake shiki shiki-themes github-light github-dark","install(DIRECTORY launch params\n  DESTINATION share/${PROJECT_NAME}\n)\n","cmake",[74,2283,2284,2292,2300],{"__ignoreMap":32},[77,2285,2286,2289],{"class":79,"line":80},[77,2287,2288],{"class":97},"install",[77,2290,2291],{"class":104},"(DIRECTORY launch params\n",[77,2293,2294,2297],{"class":79,"line":114},[77,2295,2296],{"class":104},"  DESTINATION share/",[77,2298,2299],{"class":97},"${PROJECT_NAME}\n",[77,2301,2302],{"class":79,"line":136},[77,2303,1345],{"class":104},[312,2305,2306],{"start":143},[49,2307,2308],{},"編譯",[18,2310,2311],{},"終端中進入當前工作空間，編譯功能包：",[68,2313,2315],{"className":70,"code":2314,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_slam_slam_toolbox\n",[74,2316,2317],{"__ignoreMap":32},[77,2318,2319,2322,2325,2328],{"class":79,"line":80},[77,2320,2321],{"class":83},"colcon",[77,2323,2324],{"class":87}," build",[77,2326,2327],{"class":1217}," --packages-select",[77,2329,2330],{"class":87}," mycar_slam_slam_toolbox\n",[312,2332,2333],{"start":150},[49,2334,2335,2336,2341,2367,2372,2397,2405,2408,2409,2412,2413,2416],{},"執行",[312,2337,2338],{},[49,2339,2340],{},"請先調用如下指令啟動仿真環境：",[68,2342,2344],{"className":70,"code":2343,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch demo_gazebo_sim gazebo_sim_robot_world.launch.py\n",[74,2345,2346,2354],{"__ignoreMap":32},[77,2347,2348,2351],{"class":79,"line":80},[77,2349,2350],{"class":1217},".",[77,2352,2353],{"class":87}," install/setup.bash\n",[77,2355,2356,2358,2361,2364],{"class":79,"line":114},[77,2357,1205],{"class":83},[77,2359,2360],{"class":87}," launch",[77,2362,2363],{"class":87}," demo_gazebo_sim",[77,2365,2366],{"class":87}," gazebo_sim_robot_world.launch.py\n",[312,2368,2369],{"start":136},[49,2370,2371],{},"然後在終端下進入當前工作空間，輸入如下指令：",[68,2373,2375],{"className":70,"code":2374,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_slam_slam_toolbox online_sync_launch.py use_sim_time:=True\n",[74,2376,2377,2383],{"__ignoreMap":32},[77,2378,2379,2381],{"class":79,"line":80},[77,2380,2350],{"class":1217},[77,2382,2353],{"class":87},[77,2384,2385,2387,2389,2391,2394],{"class":79,"line":114},[77,2386,1205],{"class":83},[77,2388,2360],{"class":87},[77,2390,1214],{"class":87},[77,2392,2393],{"class":87}," online_sync_launch.py",[77,2395,2396],{"class":87}," use_sim_time:=True\n",[312,2398,2399,2402],{"start":150},[49,2400,2401],{},"啟動rviz2，將Fixed Frame設置為map，添加map插件並將話題設置為/map，即可顯示slam_toolbox創建的地圖了，當機器人運動時，地圖也會隨之更新。",[49,2403,2404],{},"use_sim_time:=True參數表示使用仿真的時間。",[2406,2407],"br",{},"  最後需要說明的是，本節內容使用的是",[74,2410,2411],{},"sync_slam_toolbox_node"," 節點，即以同步方式建圖，而異步建圖節點",[74,2414,2415],{},"async_slam_toolbox_node"," 的使用與同步類似。",[18,2418,2419],{},[30,2420],{"alt":32,"src":2421},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1746.webp",[18,2423,2424],{},"我們用鍵盤控制節點去控制機器人跑滿整張地圖，",[18,2426,2427],{},[30,2428],{"alt":32,"src":2429},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1747.webp",[18,2431,2432],{},"黑色：障礙物",[18,2434,2435],{},"白色：無障礙物區",[18,2437,2438],{},"灰色：未知區",[18,2440,2441],{},"SLAM是建圖與定位，以上就是建圖，那麼定位是啥呢？",[18,2443,2444],{},"定位就是Slam會發佈一個/tf，這裡面會包含機器人到map之間的座標變換。",[18,2446,2447],{},"這個/tf發佈的具體是map到odom的座標變換，所以需要你自己去處理odom和base_link之間的座標關係。",[18,2449,2450],{},[30,2451],{"alt":32,"src":2452},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1748.webp",[18,2454,2455],{},"這樣的設計，可以讓整條座標樹是一個鏈式結構，避免base_link或者base_foot_print出現兩個父類，這樣計算量會變大。",[18,2457,2458],{},[21,2459,2460],{},"注意事項：",[312,2462,2463],{},[49,2464,2465,2466],{},"突然爛圖\n",[312,2467,2468,2471],{},[49,2469,2470],{},"如果你的環境很簡單，那麼跑圖的時候可能會突然爛圖，這個時候，大概率是do_loop_closing的問題，你把do_loop_closing設置成false再試試。\n這個東西是SLAM用激光檢測形狀來匹配之前走過的路，如果他匹配到的形狀差不多他會把當前這段軌跡和以前的軌跡連起來，然後重新優化整張 pose graph，讓地圖整體更一致。\n主要是為了防止odom會漂，因為 odom 會漂，機器人最後回到起點時，SLAM 可能覺得位置差了幾十釐米，但是可以通過激光雷達矯正。",[49,2472,2473],{},"在窄通道盡量直線過去，不要原地旋轉等等，這種窄通道炸了大概率是scan matching相關參數的問題。",[14,2475,2476],{"id":2476},"cartographer概述",[18,2478,2479],{},[21,2480,23],{},[18,2482,2483],{},"Cartographer是Google推出的一套基於圖優化的激光SLAM算法庫，支持二維和三維地圖的構建。它結合了激光雷達和慣性測量單元（IMU）的數據，通過高效的算法實現實時、準確的定位和建圖。",[18,2485,2486],{},[21,2487,368],{},[46,2489,2490,2496,2502,2508,2513],{},[49,2491,2492,2495],{},[21,2493,2494],{},"並行掃描匹配"," 利用並行計算技術加快掃描匹配速度，提高建圖效率。",[49,2497,2498,2501],{},[21,2499,2500],{},"位姿圖優化"," 通過圖優化技術估計機器人的姿態和地圖的拓撲結構，減少累積誤差。",[49,2503,2504,2507],{},[21,2505,2506],{},"實時地圖更新"," 在機器人移動過程中實時更新地圖，確保地圖的準確性和時效性。",[49,2509,2510,2512],{},[21,2511,637],{}," 通過迴環檢測識別機器人曾經訪問過的區域，進一步減少累積誤差，提高地圖的全局一致性。",[49,2514,2515,2518],{},[21,2516,2517],{},"多傳感器融合"," 支持激光雷達、IMU、里程計等多種傳感器數據的融合，提高定位和建圖的精度。",[18,2520,397],{},[46,2522,2523,2529,2535,2541,2547],{},[49,2524,2525,2528],{},[21,2526,2527],{},"高效穩定"," Cartographer的算法經過精心設計和優化，能夠在複雜環境中高效穩定地運行。",[49,2530,2531,2534],{},[21,2532,2533],{},"高精度"," 通過圖優化和迴環檢測技術提供高精度的定位和建圖結果。",[49,2536,2537,2540],{},[21,2538,2539],{},"靈活性"," 支持二維和三維地圖構建，適應不同應用場景的需求。",[49,2542,2543,2546],{},[21,2544,2545],{},"開源免費"," Cartographer是開源項目，用戶可以免費獲取和使用其源代碼和文檔。",[49,2548,2549,2552],{},[21,2550,2551],{},"社區支持"," 擁有活躍的社區支持體系，用戶可以獲取來自全球開發者的幫助和支持。",[14,2554,2555],{"id":2555},"cartographer安裝",[18,2557,2558],{},"藉助於Ubuntu的包資源管理器，可以使用二進制的方式安裝cartographer，安裝指令如下：",[68,2560,2562],{"className":70,"code":2561,"language":72,"meta":32,"style":32},"sudo apt install ros-\u003Cros2-distro>-cartographer\nsudo apt install ros-\u003Cros2-distro>-cartographer-ros\n\n# humble\nsudo apt install ros-humble-cartographer\nsudo apt install ros-humble-cartographer-ros\n#jazzy\nsudo apt install ros-jazzy-cartographer\nsudo apt install ros-jazzy-cartographer-ros\n",[74,2563,2564,2585,2606,2610,2615,2626,2637,2641,2652],{"__ignoreMap":32},[77,2565,2566,2568,2570,2572,2574,2576,2578,2580,2582],{"class":79,"line":80},[77,2567,84],{"class":83},[77,2569,88],{"class":87},[77,2571,91],{"class":87},[77,2573,94],{"class":87},[77,2575,98],{"class":97},[77,2577,101],{"class":87},[77,2579,105],{"class":104},[77,2581,108],{"class":97},[77,2583,2584],{"class":87},"-cartographer\n",[77,2586,2587,2589,2591,2593,2595,2597,2599,2601,2603],{"class":79,"line":114},[77,2588,84],{"class":83},[77,2590,88],{"class":87},[77,2592,91],{"class":87},[77,2594,94],{"class":87},[77,2596,98],{"class":97},[77,2598,101],{"class":87},[77,2600,105],{"class":104},[77,2602,108],{"class":97},[77,2604,2605],{"class":87},"-cartographer-ros\n",[77,2607,2608],{"class":79,"line":136},[77,2609,140],{"emptyLinePlaceholder":139},[77,2611,2612],{"class":79,"line":143},[77,2613,2614],{"class":146},"# humble\n",[77,2616,2617,2619,2621,2623],{"class":79,"line":150},[77,2618,84],{"class":83},[77,2620,88],{"class":87},[77,2622,91],{"class":87},[77,2624,2625],{"class":87}," ros-humble-cartographer\n",[77,2627,2628,2630,2632,2634],{"class":79,"line":162},[77,2629,84],{"class":83},[77,2631,88],{"class":87},[77,2633,91],{"class":87},[77,2635,2636],{"class":87}," ros-humble-cartographer-ros\n",[77,2638,2639],{"class":79,"line":174},[77,2640,486],{"class":146},[77,2642,2643,2645,2647,2649],{"class":79,"line":179},[77,2644,84],{"class":83},[77,2646,88],{"class":87},[77,2648,91],{"class":87},[77,2650,2651],{"class":87}," ros-jazzy-cartographer\n",[77,2653,2654,2656,2658,2660],{"class":79,"line":185},[77,2655,84],{"class":83},[77,2657,88],{"class":87},[77,2659,91],{"class":87},[77,2661,2662],{"class":87}," ros-jazzy-cartographer-ros\n",[18,2664,2665,2666,213],{},"上述兩條安裝指令中，前者用於安裝cartographer的核心庫，這個包不直接與ROS2集成，而是作為一個獨立的算法庫存在，為地圖構建和定位提供底層的計算支持。後者則是cartographer在ROS2環境下的封裝，它提供了與ROS2系統的接口，使得Cartographer算法能夠在ROS2環境中運行。另外指令中的",[74,2667,212],{},[14,2669,2670],{"id":2670},"cartographer節點說明",[18,2672,2673,2674,2677,2678,2681],{},"在Cartographer框架中，",[74,2675,2676],{},"cartographer_node","和",[74,2679,2680],{},"cartographer_occupancy_grid_node","是兩個關鍵的節點，它們各自承擔著不同的角色和功能。詳細介紹如下。",[337,2683,2684,2689,2692,2697],{},[18,2685,2686],{},[21,2687,2688],{},"cartographer_node：",[18,2690,2691],{},"主要負責訂閱來自各種傳感器的數據（如激光雷達、IMU、里程計等），並基於這些數據實時構建地圖。它採用子圖（submap）的方法來逐步構建和更新地圖，確保定位的準確性和建圖的實時性。",[18,2693,2694],{},[21,2695,2696],{},"cartographer_occupancy_grid_node：",[18,2698,2699,2700,2702,2703,2706],{},"該節點負責接收",[74,2701,2676],{},"發佈的子圖列表（",[74,2704,2705],{},"/submap_list","），並將其拼接成完整的柵格地圖（occupancy grid map），然後發佈這個地圖。這個節點是地圖生成的最終環節，它使得Cartographer能夠輸出人類可讀且易於可視化的地圖。",[18,2708,2709],{},"這兩個節點的協同工作，前者負責實時構建和更新地圖，後者則負責將子圖拼接成完整的柵格地圖併發布，使得Cartographer能夠高效地實現SLAM功能。",[312,2711,2712],{},[49,2713,2714],{},"cartographer_node訂閱的話題",[535,2716,2717,2727],{},[538,2718,2719],{},[541,2720,2721,2723,2725],{},[544,2722,547],{"align":546},[544,2724,550],{"align":546},[544,2726,553],{"align":546},[555,2728,2729,2737],{},[541,2730,2731,2733,2735],{},[560,2732,562],{"align":546},[560,2734,565],{"align":546},[560,2736,568],{"align":546},[541,2738,2739,2742,2745],{},[560,2740,2741],{"align":546},"/odom",[560,2743,2744],{"align":546},"nav_msgs/msg/Odometry",[560,2746,2747],{"align":546},"里程計消息",[312,2749,2750],{"start":114},[49,2751,2752],{},"cartographer_node發佈的話題",[535,2754,2755,2765],{},[538,2756,2757],{},[541,2758,2759,2761,2763],{},[544,2760,547],{"align":546},[544,2762,550],{"align":546},[544,2764,553],{"align":546},[555,2766,2767,2778],{},[541,2768,2769,2772,2775],{},[560,2770,2771],{"align":546},"/scan_matched_points2",[560,2773,2774],{"align":546},"sensors_msgs/msg/PointCloud2",[560,2776,2777],{"align":546},"匹配好的點雲數據，用於scan-to-submap matching",[541,2779,2780,2782,2785],{},[560,2781,2705],{"align":546},[560,2783,2784],{"align":546},"cartographer_ros_msgs/SubmapList",[560,2786,2787],{"align":546},"發佈構建好的子圖列表",[312,2789,2790],{"start":136},[49,2791,2792],{},"cartographer_node發佈的服務",[535,2794,2795,2805],{},[538,2796,2797],{},[541,2798,2799,2801,2803],{},[544,2800,547],{"align":546},[544,2802,550],{"align":546},[544,2804,553],{"align":546},[555,2806,2807,2818,2829,2840,2851,2862],{},[541,2808,2809,2812,2815],{},[560,2810,2811],{"align":546},"/submap_query",[560,2813,2814],{"align":546},"cartographer_ros_msgs/srv/SubmapQuery",[560,2816,2817],{"align":546},"提供查詢子圖的服務，獲取到查詢的子圖",[541,2819,2820,2823,2826],{},[560,2821,2822],{"align":546},"/start_trajectory",[560,2824,2825],{"align":546},"cartographer_ros_msgs/srv/StartTrajectory",[560,2827,2828],{"align":546},"開始一條軌跡",[541,2830,2831,2834,2837],{},[560,2832,2833],{"align":546},"/finish_trajectory",[560,2835,2836],{"align":546},"cartographer_ros_msgs/srv/FinishTrajectory",[560,2838,2839],{"align":546},"結束一條給定ID的軌跡",[541,2841,2842,2845,2848],{},[560,2843,2844],{"align":546},"/write_state",[560,2846,2847],{"align":546},"cartographer_ros_msgs/srv/WriteState",[560,2849,2850],{"align":546},"將當前狀態寫入磁盤文件中",[541,2852,2853,2856,2859],{},[560,2854,2855],{"align":546},"/get_trajectory_states",[560,2857,2858],{"align":546},"cartographer_ros_msgs/srv/GetTrajectoryStates",[560,2860,2861],{"align":546},"獲取指定軌跡的狀態",[541,2863,2864,2867,2870],{},[560,2865,2866],{"align":546},"/read_metrics",[560,2868,2869],{"align":546},"cartographer_ros_msgs/srv/ReadMetrics",[560,2871,2872],{"align":546},"讀取性能指標",[312,2874,2875],{"start":143},[49,2876,2877],{},"cartographer_node參數",[18,2879,2880,2882],{},[74,2881,2676],{},"節點需要接收一個參數配置文件，該配置文件包含了地圖構建、軌跡跟蹤等所需的各項參數。",[312,2884,2885],{"start":150},[49,2886,2887],{},"cartographer_occupancy_grid_node訂閱的話題",[535,2889,2890,2900],{},[538,2891,2892],{},[541,2893,2894,2896,2898],{},[544,2895,547],{"align":546},[544,2897,550],{"align":546},[544,2899,553],{"align":546},[555,2901,2902],{},[541,2903,2904,2906,2908],{},[560,2905,2705],{"align":546},[560,2907,2784],{"align":546},[560,2909,2910],{"align":546},"子圖列表",[312,2912,2913],{"start":162},[49,2914,2915],{},"cartographer_occupancy_grid_node發佈的話題",[535,2917,2918,2928],{},[538,2919,2920],{},[541,2921,2922,2924,2926],{},[544,2923,547],{"align":546},[544,2925,550],{"align":546},[544,2927,553],{"align":546},[555,2929,2930],{},[541,2931,2932,2934,2936],{},[560,2933,687],{"align":546},[560,2935,690],{"align":546},[560,2937,2938],{"align":546},"發佈的柵格地圖",[312,2940,2941],{"start":174},[49,2942,2943],{},"cartographer_occupancy_grid_node請求的服務",[535,2945,2946,2956],{},[538,2947,2948],{},[541,2949,2950,2952,2954],{},[544,2951,547],{"align":546},[544,2953,550],{"align":546},[544,2955,553],{"align":546},[555,2957,2958],{},[541,2959,2960,2962,2964],{},[560,2961,2811],{"align":546},[560,2963,2814],{"align":546},[560,2965,2966],{"align":546},"獲取子圖",[312,2968,2969],{"start":179},[49,2970,2971],{},"cartographer_occupancy_grid_node參數",[18,2973,2974,2976],{},[74,2975,2680],{},"節點需要配置地圖的分辨率和更新週期等參數，以確保生成的柵格地圖滿足特定的精度和實時性要求。",[14,2978,2979],{"id":2979},"cartogarpher基本使用",[312,2981,2982],{},[49,2983,1192],{},[18,2985,1195],{},[68,2987,2989],{"className":70,"code":2988,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_slam_cartographer --dependencies cartographer\n",[74,2990,2991],{"__ignoreMap":32},[77,2992,2993,2995,2997,2999,3002,3004],{"class":79,"line":80},[77,2994,1205],{"class":83},[77,2996,1208],{"class":87},[77,2998,1211],{"class":87},[77,3000,3001],{"class":87}," mycar_slam_cartographer",[77,3003,1218],{"class":1217},[77,3005,3006],{"class":87}," cartographer\n",[312,3008,3009],{"start":114},[49,3010,1226],{},[18,3012,1229,3013,1233],{},[74,3014,3015],{},"cartographer.launch.py",[68,3017,3019],{"className":1236,"code":3018,"language":1238,"meta":32,"style":32},"from launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument\nfrom launch.substitutions import LaunchConfiguration\nfrom launch_ros.actions import Node\nimport os\nfrom ament_index_python.packages import get_package_share_directory\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument('use_sim_time', default_value = 'false')\n    resolution_arg = DeclareLaunchArgument('resolution', default_value='0.05')\n\n    cartographer_node = Node(\n        package = 'cartographer_ros',\n        executable = 'cartographer_node',\n        parameters = [{'use_sim_time': LaunchConfiguration('use_sim_time')}],\n        arguments = [\n            '-configuration_directory', os.path.join(get_package_share_directory(\"mycar_slam_cartographer\"),\"params\"),\n            '-configuration_basename', 'mycar.lua'],\n        output = 'screen'\n    )\n\n    cartographer_occupancy_grid_node = Node(\n        package = 'cartographer_ros',\n        executable = 'cartographer_occupancy_grid_node',\n        parameters = [\n            {'use_sim_time': LaunchConfiguration('use_sim_time')},\n            {'resolution': LaunchConfiguration('resolution')}],\n    )\n\n    return LaunchDescription([\n        use_sim_time_arg,\n        resolution_arg,\n        cartographer_node,\n        cartographer_occupancy_grid_node,\n    ])\n",[74,3020,3021,3031,3041,3051,3061,3067,3077,3081,3089,3093,3118,3141,3145,3154,3165,3176,3195,3205,3224,3237,3246,3251,3255,3264,3274,3285,3293,3307,3319,3323,3327,3334,3339,3344,3349,3354],{"__ignoreMap":32},[77,3022,3023,3025,3027,3029],{"class":79,"line":80},[77,3024,1257],{"class":97},[77,3026,1260],{"class":104},[77,3028,1245],{"class":97},[77,3030,1265],{"class":104},[77,3032,3033,3035,3037,3039],{"class":79,"line":114},[77,3034,1257],{"class":97},[77,3036,1272],{"class":104},[77,3038,1245],{"class":97},[77,3040,1277],{"class":104},[77,3042,3043,3045,3047,3049],{"class":79,"line":136},[77,3044,1257],{"class":97},[77,3046,1284],{"class":104},[77,3048,1245],{"class":97},[77,3050,1289],{"class":104},[77,3052,3053,3055,3057,3059],{"class":79,"line":143},[77,3054,1257],{"class":97},[77,3056,1296],{"class":104},[77,3058,1245],{"class":97},[77,3060,1301],{"class":104},[77,3062,3063,3065],{"class":79,"line":150},[77,3064,1245],{"class":97},[77,3066,1248],{"class":104},[77,3068,3069,3071,3073,3075],{"class":79,"line":162},[77,3070,1257],{"class":97},[77,3072,1308],{"class":104},[77,3074,1245],{"class":97},[77,3076,1313],{"class":104},[77,3078,3079],{"class":79,"line":174},[77,3080,140],{"emptyLinePlaceholder":139},[77,3082,3083,3085,3087],{"class":79,"line":179},[77,3084,1322],{"class":97},[77,3086,1325],{"class":83},[77,3088,1328],{"class":104},[77,3090,3091],{"class":79,"line":185},[77,3092,140],{"emptyLinePlaceholder":139},[77,3094,3095,3098,3100,3103,3105,3107,3110,3113,3116],{"class":79,"line":197},[77,3096,3097],{"class":104},"    use_sim_time_arg ",[77,3099,1336],{"class":97},[77,3101,3102],{"class":104}," DeclareLaunchArgument(",[77,3104,1342],{"class":87},[77,3106,1455],{"class":104},[77,3108,3109],{"class":1391},"default_value",[77,3111,3112],{"class":97}," =",[77,3114,3115],{"class":87}," 'false'",[77,3117,1345],{"class":104},[77,3119,3120,3123,3125,3127,3130,3132,3134,3136,3139],{"class":79,"line":1348},[77,3121,3122],{"class":104},"    resolution_arg ",[77,3124,1336],{"class":97},[77,3126,3102],{"class":104},[77,3128,3129],{"class":87},"'resolution'",[77,3131,1455],{"class":104},[77,3133,3109],{"class":1391},[77,3135,1336],{"class":97},[77,3137,3138],{"class":87},"'0.05'",[77,3140,1345],{"class":104},[77,3142,3143],{"class":79,"line":1363},[77,3144,140],{"emptyLinePlaceholder":139},[77,3146,3147,3150,3152],{"class":79,"line":1368},[77,3148,3149],{"class":104},"    cartographer_node ",[77,3151,1336],{"class":97},[77,3153,1488],{"class":104},[77,3155,3156,3158,3160,3163],{"class":79,"line":1379},[77,3157,1528],{"class":1391},[77,3159,3112],{"class":97},[77,3161,3162],{"class":87}," 'cartographer_ros'",[77,3164,1385],{"class":104},[77,3166,3167,3169,3171,3174],{"class":79,"line":1388},[77,3168,1541],{"class":1391},[77,3170,3112],{"class":97},[77,3172,3173],{"class":87}," 'cartographer_node'",[77,3175,1385],{"class":104},[77,3177,3178,3180,3182,3185,3187,3190,3192],{"class":79,"line":1402},[77,3179,1494],{"class":1391},[77,3181,3112],{"class":97},[77,3183,3184],{"class":104}," [{",[77,3186,1342],{"class":87},[77,3188,3189],{"class":104},": LaunchConfiguration(",[77,3191,1342],{"class":87},[77,3193,3194],{"class":104},")}],\n",[77,3196,3197,3200,3202],{"class":79,"line":1415},[77,3198,3199],{"class":1391},"        arguments",[77,3201,3112],{"class":97},[77,3203,3204],{"class":104}," [\n",[77,3206,3207,3210,3213,3216,3219,3222],{"class":79,"line":1425},[77,3208,3209],{"class":87},"            '-configuration_directory'",[77,3211,3212],{"class":104},", os.path.join(get_package_share_directory(",[77,3214,3215],{"class":87},"\"mycar_slam_cartographer\"",[77,3217,3218],{"class":104},"),",[77,3220,3221],{"class":87},"\"params\"",[77,3223,1446],{"class":104},[77,3225,3226,3229,3231,3234],{"class":79,"line":1433},[77,3227,3228],{"class":87},"            '-configuration_basename'",[77,3230,1455],{"class":104},[77,3232,3233],{"class":87},"'mycar.lua'",[77,3235,3236],{"class":104},"],\n",[77,3238,3239,3241,3243],{"class":79,"line":1449},[77,3240,1566],{"class":1391},[77,3242,3112],{"class":97},[77,3244,3245],{"class":87}," 'screen'\n",[77,3247,3248],{"class":79,"line":1463},[77,3249,3250],{"class":104},"    )\n",[77,3252,3253],{"class":79,"line":1475},[77,3254,140],{"emptyLinePlaceholder":139},[77,3256,3257,3260,3262],{"class":79,"line":1480},[77,3258,3259],{"class":104},"    cartographer_occupancy_grid_node ",[77,3261,1336],{"class":97},[77,3263,1488],{"class":104},[77,3265,3266,3268,3270,3272],{"class":79,"line":1491},[77,3267,1528],{"class":1391},[77,3269,3112],{"class":97},[77,3271,3162],{"class":87},[77,3273,1385],{"class":104},[77,3275,3276,3278,3280,3283],{"class":79,"line":1502},[77,3277,1541],{"class":1391},[77,3279,3112],{"class":97},[77,3281,3282],{"class":87}," 'cartographer_occupancy_grid_node'",[77,3284,1385],{"class":104},[77,3286,3287,3289,3291],{"class":79,"line":1508},[77,3288,1494],{"class":1391},[77,3290,3112],{"class":97},[77,3292,3204],{"class":104},[77,3294,3295,3298,3300,3302,3304],{"class":79,"line":1519},[77,3296,3297],{"class":104},"            {",[77,3299,1342],{"class":87},[77,3301,3189],{"class":104},[77,3303,1342],{"class":87},[77,3305,3306],{"class":104},")},\n",[77,3308,3309,3311,3313,3315,3317],{"class":79,"line":1525},[77,3310,3297],{"class":104},[77,3312,3129],{"class":87},[77,3314,3189],{"class":104},[77,3316,3129],{"class":87},[77,3318,3194],{"class":104},[77,3320,3321],{"class":79,"line":1538},[77,3322,3250],{"class":104},[77,3324,3325],{"class":79,"line":1551},[77,3326,140],{"emptyLinePlaceholder":139},[77,3328,3329,3331],{"class":79,"line":1563},[77,3330,1623],{"class":97},[77,3332,3333],{"class":104}," LaunchDescription([\n",[77,3335,3336],{"class":79,"line":1576},[77,3337,3338],{"class":104},"        use_sim_time_arg,\n",[77,3340,3341],{"class":79,"line":1581},[77,3342,3343],{"class":104},"        resolution_arg,\n",[77,3345,3346],{"class":79,"line":1592},[77,3347,3348],{"class":104},"        cartographer_node,\n",[77,3350,3351],{"class":79,"line":1597},[77,3352,3353],{"class":104},"        cartographer_occupancy_grid_node,\n",[77,3355,3356],{"class":79,"line":1603},[77,3357,3358],{"class":104},"    ])\n",[18,3360,3361],{},"該launch文件主要是加載了cartographer_ros下的cartographer_node與cartographer_occupancy_grid_node節點，並且會從當前功能包的params下讀取一個名為mycar.lua的配置文件。這個配置文件還不存在，接下來需要在params目錄下新建mycar.lua文件，並輸入如下內容：",[68,3363,3367],{"className":3364,"code":3365,"language":3366,"meta":32,"style":32},"language-lua shiki shiki-themes github-light github-dark","include \"map_builder.lua\" -- 地图构建器\ninclude \"trajectory_builder.lua\" -- 轨迹构建器\n\noptions = {\n  map_builder = MAP_BUILDER,\n  trajectory_builder = TRAJECTORY_BUILDER,\n  map_frame = \"map\",  -- 地图坐标系\n  tracking_frame = \"base_link\", -- 跟踪的坐标系，可以是基坐标系、雷达或imu的坐标系\n  published_frame = \"odom\", -- cartographer发布的位姿（pose）的坐标系\n  odom_frame = \"carto_odom\",  -- cartographer 计算后优化的里程计，并非机器人本身里程计\n  provide_odom_frame = false, -- 是否发布cartographer的里程计\n  publish_frame_projected_to_2d = true, -- 是否转换成2d(无俯仰、滚动的情况下为 true)\n  use_odometry = true, -- 是否订阅里程计数据\n  use_nav_sat = false, -- 是否订阅GPS\n  use_landmarks = false, -- 是否订阅路标\n  num_laser_scans = 1, -- 订阅的雷达的数量\n  num_multi_echo_laser_scans = 0, -- 订阅的多层回波激光雷达数量\n  num_subdivisions_per_laser_scan = 1, -- 将激光雷达的数据拆分成多少部分发布\n  num_point_clouds = 0, -- 订阅多线激光雷达的数量\n  lookup_transform_timeout_sec = 1.5, -- 坐标变换超时时间\n  submap_publish_period_sec = 0.5, -- 发布子图的时间间隔\n  pose_publish_period_sec = 5e-3, -- 发布pose的时间间隔\n  trajectory_publish_period_sec = 30e-3, -- 发布轨迹的时间间隔\n  rangefinder_sampling_ratio = 1., -- 雷达采样比例\n  odometry_sampling_ratio = 0.8, -- 里程计采样比例(如果里程计精度低，可以减小该设置值)\n  fixed_frame_pose_sampling_ratio = 1., -- 参考坐标系采样比例\n  imu_sampling_ratio = 1.,-- imu采样比例\n  landmarks_sampling_ratio = 1., -- 路标采样比例\n}\n\nMAP_BUILDER.use_trajectory_builder_2d = true -- 启用2D轨迹构建器\n\nTRAJECTORY_BUILDER_2D.min_range = 0.15 -- 最小雷达有效距离\nTRAJECTORY_BUILDER_2D.max_range = 6.0 -- 最大雷达有效距离\nTRAJECTORY_BUILDER_2D.missing_data_ray_length = 3. -- 缺失数据的射线长度\nTRAJECTORY_BUILDER_2D.use_imu_data = false -- 是否使用 imu 数据\nTRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true -- 是否使用在线相关扫描匹配\nTRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) -- 运动滤波器的最大角度限制（以弧度为单位）\n\nPOSE_GRAPH.constraint_builder.min_score = 0.65 -- 建约束时的最小分数\nPOSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 -- 全局定位时的最小分数\n\n-- POSE_GRAPH.optimize_every_n_nodes = 0\n\nreturn options\n","lua",[74,3368,3369,3380,3390,3394,3404,3414,3424,3440,3455,3470,3485,3500,3515,3529,3543,3557,3572,3587,3601,3615,3630,3645,3660,3675,3690,3705,3719,3734,3748,3753,3757,3772,3776,3792,3807,3822,3836,3850,3878,3882,3903,3922,3926,3931,3935],{"__ignoreMap":32},[77,3370,3371,3374,3377],{"class":79,"line":80},[77,3372,3373],{"class":1217},"include",[77,3375,3376],{"class":87}," \"map_builder.lua\" ",[77,3378,3379],{"class":146},"-- 地图构建器\n",[77,3381,3382,3384,3387],{"class":79,"line":114},[77,3383,3373],{"class":1217},[77,3385,3386],{"class":87}," \"trajectory_builder.lua\" ",[77,3388,3389],{"class":146},"-- 轨迹构建器\n",[77,3391,3392],{"class":79,"line":136},[77,3393,140],{"emptyLinePlaceholder":139},[77,3395,3396,3399,3401],{"class":79,"line":143},[77,3397,3398],{"class":104},"options ",[77,3400,1336],{"class":97},[77,3402,3403],{"class":104}," {\n",[77,3405,3406,3409,3411],{"class":79,"line":150},[77,3407,3408],{"class":104},"  map_builder ",[77,3410,1336],{"class":97},[77,3412,3413],{"class":104}," MAP_BUILDER,\n",[77,3415,3416,3419,3421],{"class":79,"line":162},[77,3417,3418],{"class":104},"  trajectory_builder ",[77,3420,1336],{"class":97},[77,3422,3423],{"class":104}," TRAJECTORY_BUILDER,\n",[77,3425,3426,3429,3431,3434,3437],{"class":79,"line":174},[77,3427,3428],{"class":104},"  map_frame ",[77,3430,1336],{"class":97},[77,3432,3433],{"class":87}," \"map\"",[77,3435,3436],{"class":104},",  ",[77,3438,3439],{"class":146},"-- 地图坐标系\n",[77,3441,3442,3445,3447,3450,3452],{"class":79,"line":179},[77,3443,3444],{"class":104},"  tracking_frame ",[77,3446,1336],{"class":97},[77,3448,3449],{"class":87}," \"base_link\"",[77,3451,1455],{"class":104},[77,3453,3454],{"class":146},"-- 跟踪的坐标系，可以是基坐标系、雷达或imu的坐标系\n",[77,3456,3457,3460,3462,3465,3467],{"class":79,"line":185},[77,3458,3459],{"class":104},"  published_frame ",[77,3461,1336],{"class":97},[77,3463,3464],{"class":87}," \"odom\"",[77,3466,1455],{"class":104},[77,3468,3469],{"class":146},"-- cartographer发布的位姿（pose）的坐标系\n",[77,3471,3472,3475,3477,3480,3482],{"class":79,"line":197},[77,3473,3474],{"class":104},"  odom_frame ",[77,3476,1336],{"class":97},[77,3478,3479],{"class":87}," \"carto_odom\"",[77,3481,3436],{"class":104},[77,3483,3484],{"class":146},"-- cartographer 计算后优化的里程计，并非机器人本身里程计\n",[77,3486,3487,3490,3492,3495,3497],{"class":79,"line":1348},[77,3488,3489],{"class":104},"  provide_odom_frame ",[77,3491,1336],{"class":97},[77,3493,3494],{"class":1217}," false",[77,3496,1455],{"class":104},[77,3498,3499],{"class":146},"-- 是否发布cartographer的里程计\n",[77,3501,3502,3505,3507,3510,3512],{"class":79,"line":1363},[77,3503,3504],{"class":104},"  publish_frame_projected_to_2d ",[77,3506,1336],{"class":97},[77,3508,3509],{"class":1217}," true",[77,3511,1455],{"class":104},[77,3513,3514],{"class":146},"-- 是否转换成2d(无俯仰、滚动的情况下为 true)\n",[77,3516,3517,3520,3522,3524,3526],{"class":79,"line":1368},[77,3518,3519],{"class":104},"  use_odometry ",[77,3521,1336],{"class":97},[77,3523,3509],{"class":1217},[77,3525,1455],{"class":104},[77,3527,3528],{"class":146},"-- 是否订阅里程计数据\n",[77,3530,3531,3534,3536,3538,3540],{"class":79,"line":1379},[77,3532,3533],{"class":104},"  use_nav_sat ",[77,3535,1336],{"class":97},[77,3537,3494],{"class":1217},[77,3539,1455],{"class":104},[77,3541,3542],{"class":146},"-- 是否订阅GPS\n",[77,3544,3545,3548,3550,3552,3554],{"class":79,"line":1388},[77,3546,3547],{"class":104},"  use_landmarks ",[77,3549,1336],{"class":97},[77,3551,3494],{"class":1217},[77,3553,1455],{"class":104},[77,3555,3556],{"class":146},"-- 是否订阅路标\n",[77,3558,3559,3562,3564,3567,3569],{"class":79,"line":1402},[77,3560,3561],{"class":104},"  num_laser_scans ",[77,3563,1336],{"class":97},[77,3565,3566],{"class":1217}," 1",[77,3568,1455],{"class":104},[77,3570,3571],{"class":146},"-- 订阅的雷达的数量\n",[77,3573,3574,3577,3579,3582,3584],{"class":79,"line":1415},[77,3575,3576],{"class":104},"  num_multi_echo_laser_scans ",[77,3578,1336],{"class":97},[77,3580,3581],{"class":1217}," 0",[77,3583,1455],{"class":104},[77,3585,3586],{"class":146},"-- 订阅的多层回波激光雷达数量\n",[77,3588,3589,3592,3594,3596,3598],{"class":79,"line":1425},[77,3590,3591],{"class":104},"  num_subdivisions_per_laser_scan ",[77,3593,1336],{"class":97},[77,3595,3566],{"class":1217},[77,3597,1455],{"class":104},[77,3599,3600],{"class":146},"-- 将激光雷达的数据拆分成多少部分发布\n",[77,3602,3603,3606,3608,3610,3612],{"class":79,"line":1433},[77,3604,3605],{"class":104},"  num_point_clouds ",[77,3607,1336],{"class":97},[77,3609,3581],{"class":1217},[77,3611,1455],{"class":104},[77,3613,3614],{"class":146},"-- 订阅多线激光雷达的数量\n",[77,3616,3617,3620,3622,3625,3627],{"class":79,"line":1449},[77,3618,3619],{"class":104},"  lookup_transform_timeout_sec ",[77,3621,1336],{"class":97},[77,3623,3624],{"class":1217}," 1.5",[77,3626,1455],{"class":104},[77,3628,3629],{"class":146},"-- 坐标变换超时时间\n",[77,3631,3632,3635,3637,3640,3642],{"class":79,"line":1463},[77,3633,3634],{"class":104},"  submap_publish_period_sec ",[77,3636,1336],{"class":97},[77,3638,3639],{"class":1217}," 0.5",[77,3641,1455],{"class":104},[77,3643,3644],{"class":146},"-- 发布子图的时间间隔\n",[77,3646,3647,3650,3652,3655,3657],{"class":79,"line":1475},[77,3648,3649],{"class":104},"  pose_publish_period_sec ",[77,3651,1336],{"class":97},[77,3653,3654],{"class":1217}," 5e-3",[77,3656,1455],{"class":104},[77,3658,3659],{"class":146},"-- 发布pose的时间间隔\n",[77,3661,3662,3665,3667,3670,3672],{"class":79,"line":1480},[77,3663,3664],{"class":104},"  trajectory_publish_period_sec ",[77,3666,1336],{"class":97},[77,3668,3669],{"class":1217}," 30e-3",[77,3671,1455],{"class":104},[77,3673,3674],{"class":146},"-- 发布轨迹的时间间隔\n",[77,3676,3677,3680,3682,3685,3687],{"class":79,"line":1491},[77,3678,3679],{"class":104},"  rangefinder_sampling_ratio ",[77,3681,1336],{"class":97},[77,3683,3684],{"class":1217}," 1.",[77,3686,1455],{"class":104},[77,3688,3689],{"class":146},"-- 雷达采样比例\n",[77,3691,3692,3695,3697,3700,3702],{"class":79,"line":1502},[77,3693,3694],{"class":104},"  odometry_sampling_ratio ",[77,3696,1336],{"class":97},[77,3698,3699],{"class":1217}," 0.8",[77,3701,1455],{"class":104},[77,3703,3704],{"class":146},"-- 里程计采样比例(如果里程计精度低，可以减小该设置值)\n",[77,3706,3707,3710,3712,3714,3716],{"class":79,"line":1508},[77,3708,3709],{"class":104},"  fixed_frame_pose_sampling_ratio ",[77,3711,1336],{"class":97},[77,3713,3684],{"class":1217},[77,3715,1455],{"class":104},[77,3717,3718],{"class":146},"-- 参考坐标系采样比例\n",[77,3720,3721,3724,3726,3728,3731],{"class":79,"line":1519},[77,3722,3723],{"class":104},"  imu_sampling_ratio ",[77,3725,1336],{"class":97},[77,3727,3684],{"class":1217},[77,3729,3730],{"class":104},",",[77,3732,3733],{"class":146},"-- imu采样比例\n",[77,3735,3736,3739,3741,3743,3745],{"class":79,"line":1525},[77,3737,3738],{"class":104},"  landmarks_sampling_ratio ",[77,3740,1336],{"class":97},[77,3742,3684],{"class":1217},[77,3744,1455],{"class":104},[77,3746,3747],{"class":146},"-- 路标采样比例\n",[77,3749,3750],{"class":79,"line":1538},[77,3751,3752],{"class":104},"}\n",[77,3754,3755],{"class":79,"line":1551},[77,3756,140],{"emptyLinePlaceholder":139},[77,3758,3759,3762,3765,3767,3769],{"class":79,"line":1563},[77,3760,3761],{"class":104},"MAP_BUILDER.",[77,3763,3764],{"class":83},"use_trajectory_builder_2d",[77,3766,3112],{"class":97},[77,3768,3509],{"class":1217},[77,3770,3771],{"class":146}," -- 启用2D轨迹构建器\n",[77,3773,3774],{"class":79,"line":1576},[77,3775,140],{"emptyLinePlaceholder":139},[77,3777,3778,3781,3784,3786,3789],{"class":79,"line":1581},[77,3779,3780],{"class":104},"TRAJECTORY_BUILDER_2D.",[77,3782,3783],{"class":83},"min_range",[77,3785,3112],{"class":97},[77,3787,3788],{"class":1217}," 0.15",[77,3790,3791],{"class":146}," -- 最小雷达有效距离\n",[77,3793,3794,3796,3799,3801,3804],{"class":79,"line":1592},[77,3795,3780],{"class":104},[77,3797,3798],{"class":83},"max_range",[77,3800,3112],{"class":97},[77,3802,3803],{"class":1217}," 6.0",[77,3805,3806],{"class":146}," -- 最大雷达有效距离\n",[77,3808,3809,3811,3814,3816,3819],{"class":79,"line":1597},[77,3810,3780],{"class":104},[77,3812,3813],{"class":83},"missing_data_ray_length",[77,3815,3112],{"class":97},[77,3817,3818],{"class":1217}," 3.",[77,3820,3821],{"class":146}," -- 缺失数据的射线长度\n",[77,3823,3824,3826,3829,3831,3833],{"class":79,"line":1603},[77,3825,3780],{"class":104},[77,3827,3828],{"class":83},"use_imu_data",[77,3830,3112],{"class":97},[77,3832,3494],{"class":1217},[77,3834,3835],{"class":146}," -- 是否使用 imu 数据\n",[77,3837,3838,3840,3843,3845,3847],{"class":79,"line":1609},[77,3839,3780],{"class":104},[77,3841,3842],{"class":83},"use_online_correlative_scan_matching",[77,3844,3112],{"class":97},[77,3846,3509],{"class":1217},[77,3848,3849],{"class":146}," -- 是否使用在线相关扫描匹配\n",[77,3851,3852,3854,3857,3859,3862,3864,3867,3870,3872,3875],{"class":79,"line":1615},[77,3853,3780],{"class":104},[77,3855,3856],{"class":83},"motion_filter",[77,3858,2350],{"class":104},[77,3860,3861],{"class":83},"max_angle_radians",[77,3863,3112],{"class":97},[77,3865,3866],{"class":1217}," math.rad",[77,3868,3869],{"class":104},"(",[77,3871,1987],{"class":1217},[77,3873,3874],{"class":104},") ",[77,3876,3877],{"class":146},"-- 运动滤波器的最大角度限制（以弧度为单位）\n",[77,3879,3880],{"class":79,"line":1620},[77,3881,140],{"emptyLinePlaceholder":139},[77,3883,3884,3887,3890,3892,3895,3897,3900],{"class":79,"line":2003},[77,3885,3886],{"class":104},"POSE_GRAPH.",[77,3888,3889],{"class":83},"constraint_builder",[77,3891,2350],{"class":104},[77,3893,3894],{"class":83},"min_score",[77,3896,3112],{"class":97},[77,3898,3899],{"class":1217}," 0.65",[77,3901,3902],{"class":146}," -- 建约束时的最小分数\n",[77,3904,3905,3907,3909,3911,3914,3916,3919],{"class":79,"line":2014},[77,3906,3886],{"class":104},[77,3908,3889],{"class":83},[77,3910,2350],{"class":104},[77,3912,3913],{"class":83},"global_localization_min_score",[77,3915,3112],{"class":97},[77,3917,3918],{"class":1217}," 0.7",[77,3920,3921],{"class":146}," -- 全局定位时的最小分数\n",[77,3923,3924],{"class":79,"line":2027},[77,3925,140],{"emptyLinePlaceholder":139},[77,3927,3928],{"class":79,"line":2041},[77,3929,3930],{"class":146},"-- POSE_GRAPH.optimize_every_n_nodes = 0\n",[77,3932,3933],{"class":79,"line":2054},[77,3934,140],{"emptyLinePlaceholder":139},[77,3936,3937,3940],{"class":79,"line":2068},[77,3938,3939],{"class":97},"return",[77,3941,3942],{"class":104}," options\n",[18,3944,2264],{},[312,3946,3947],{"start":136},[49,3948,2269],{},[18,3950,2272,3951,2276],{},[74,3952,2275],{},[68,3954,3955],{"className":2279,"code":2280,"language":2281,"meta":32,"style":32},[74,3956,3957,3963,3969],{"__ignoreMap":32},[77,3958,3959,3961],{"class":79,"line":80},[77,3960,2288],{"class":97},[77,3962,2291],{"class":104},[77,3964,3965,3967],{"class":79,"line":114},[77,3966,2296],{"class":104},[77,3968,2299],{"class":97},[77,3970,3971],{"class":79,"line":136},[77,3972,1345],{"class":104},[312,3974,3975],{"start":143},[49,3976,2308],{},[18,3978,2311],{},[68,3980,3982],{"className":70,"code":3981,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_slam_cartographer\n",[74,3983,3984],{"__ignoreMap":32},[77,3985,3986,3988,3990,3992],{"class":79,"line":80},[77,3987,2321],{"class":83},[77,3989,2324],{"class":87},[77,3991,2327],{"class":1217},[77,3993,3994],{"class":87}," mycar_slam_cartographer\n",[312,3996,3997],{"start":150},[49,3998,2335],{},[18,4000,4001],{},"（1）請先調用如下指令啟動仿真環境：",[68,4003,4004],{"className":70,"code":2343,"language":72,"meta":32,"style":32},[74,4005,4006,4012],{"__ignoreMap":32},[77,4007,4008,4010],{"class":79,"line":80},[77,4009,2350],{"class":1217},[77,4011,2353],{"class":87},[77,4013,4014,4016,4018,4020],{"class":79,"line":114},[77,4015,1205],{"class":83},[77,4017,2360],{"class":87},[77,4019,2363],{"class":87},[77,4021,2366],{"class":87},[18,4023,4024],{},"（2）然後在終端下進入當前工作空間，輸入如下指令：",[68,4026,4028],{"className":70,"code":4027,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_slam_cartographer cartographer.launch.py use_sim_time:=True\n",[74,4029,4030,4036],{"__ignoreMap":32},[77,4031,4032,4034],{"class":79,"line":80},[77,4033,2350],{"class":1217},[77,4035,2353],{"class":87},[77,4037,4038,4040,4042,4044,4047],{"class":79,"line":114},[77,4039,1205],{"class":83},[77,4041,2360],{"class":87},[77,4043,3001],{"class":87},[77,4045,4046],{"class":87}," cartographer.launch.py",[77,4048,2396],{"class":87},[18,4050,4051],{},"（3）啟動rviz2，將Fixed Frame設置為map，添加map插件並將話題設置為/map，即可顯示創建的地圖了，當機器人運動時，地圖也會隨之更新。",[18,4053,4054],{},[30,4055],{"alt":32,"src":4056},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1749.webp",[18,4058,4059],{},[30,4060],{"alt":32,"src":4061},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1750.webp",[18,4063,4064],{},[30,4065],{"alt":32,"src":4066},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1751.webp",[10,4068,4069],{"id":4069},"地圖服務",[18,4071,4072,4073,4076],{},"SLAM建圖時，地圖數據是保存在內存中的，這也意味著，一旦節點關閉，數據也會一併被釋放，而更合理的實現應該是將構建的地圖序列化到的磁盤以持久化存儲，並且後期還要通過反序列化讀取磁盤的地圖數據以做其他操作。在Nav2中已經已經封裝好了地圖序列化和反序列化的相關功能包，該包是：",[74,4074,4075],{},"nav2_map_server","。",[18,4078,4079,4080,4082,4083,4085,4086,2677,4089,4092,4093,4095,4096,4098],{},"在",[74,4081,4075],{},"中，可以通過話題和服務接口與Nav2系統的其餘部分進行交互。",[74,4084,4075],{},"包下有兩個重要的節點，分別是",[74,4087,4088],{},"map_saver_cli",[74,4090,4091],{},"map_server","，通過",[74,4094,4088],{},"節點則可以保存地圖，而",[74,4097,4091],{},"節點則可以在啟動時顯示地圖。",[14,4100,4102],{"id":4101},"保存地圖序列化","保存地圖(序列化)",[4104,4105,4106],"h5",{"id":4106},"地圖保存節點說明",[18,4108,4079,4109,4111,4112,4115],{},[74,4110,4075],{},"中的地圖保存節點是",[74,4113,4114],{},"map_saver_server","，該節點相關信息如下。",[312,4117,4118],{},[49,4119,533],{},[535,4121,4122,4133],{},[538,4123,4124],{},[541,4125,4126,4128,4131],{},[544,4127,547],{"align":546},[544,4129,4130],{"align":546},"接口",[544,4132,553],{"align":546},[555,4134,4135],{},[541,4136,4137,4139,4141],{},[560,4138,687],{"align":546},[560,4140,690],{"align":546},[560,4142,4143],{"align":546},"SLAM節點發布的地圖數據",[312,4145,4146],{"start":114},[49,4147,827],{},[46,4149,4150,4156,4162,4168],{},[49,4151,4152,4155],{},[21,4153,4154],{},"save_map_timeout","  保存地圖操作的最大等待時間。",[49,4157,4158,4161],{},[21,4159,4160],{},"free_thresh_default","  柵格單元被認為未被佔用的概率閾值。",[49,4163,4164,4167],{},[21,4165,4166],{},"occupied_thresh_default","  柵格單元被認為佔用的概率閾值。",[49,4169,4170,4173],{},[21,4171,4172],{},"map_subscribe_transient_local","  節點重啟後消息不保留，默認為 true。",[312,4175,4176],{"start":136},[49,4177,4088],{},[18,4179,4180,4181,4183,4184,4186,4187,4189],{},"另外，而為了便於使用，在",[74,4182,4114],{},"的基礎之上還封裝了一個名為",[74,4185,4088],{},"的可執行程序，它可以以實參的方式更方便的設置地圖保存相關數據，並且後續執行時也是調用",[74,4188,4088],{},"，其實參列表如下：",[46,4191,4192,4198,4204,4210,4216,4222],{},[49,4193,4194,4197],{},[21,4195,4196],{},"-t"," 訂閱的地圖話題。",[49,4199,4200,4203],{},[21,4201,4202],{},"-f"," 地圖存儲路徑。",[49,4205,4206,4209],{},[21,4207,4208],{},"--occ"," 柵格單元被認為佔用的概率閾值。",[49,4211,4212,4215],{},[21,4213,4214],{},"--free"," 柵格單元被認為未被佔用的概率閾值。",[49,4217,4218,4221],{},[21,4219,4220],{},"--fmt"," 圖片格式。",[49,4223,4224,4227],{},[21,4225,4226],{},"--mode"," 地圖模式，trinary(默認)或scale或raw。",[4104,4229,4230],{"id":4230},"地圖保存基本操作",[18,4232,4233],{},[21,4234,1192],{},[18,4236,4237],{},"請先啟動仿真或實體機器人，然後啟動SLAM相關節點，實現基本的建圖功能。",[18,4239,4240],{},[21,4241,4242],{},"保存地圖",[18,4244,4245],{},"SLAM建圖完畢，在終端下進入工作空間，調用如下指令保存地圖：",[68,4247,4249],{"className":70,"code":4248,"language":72,"meta":32,"style":32},"ros2 run nav2_map_server map_saver_cli -f map/my_map\n",[74,4250,4251],{"__ignoreMap":32},[77,4252,4253,4255,4258,4261,4264,4267],{"class":79,"line":80},[77,4254,1205],{"class":83},[77,4256,4257],{"class":87}," run",[77,4259,4260],{"class":87}," nav2_map_server",[77,4262,4263],{"class":87}," map_saver_cli",[77,4265,4266],{"class":1217}," -f",[77,4268,4269],{"class":87}," map/my_map\n",[18,4271,4272,4273,4277,4278,2677,4281,4076],{},"上述指令將訂閱/map話題，並把/map話題裡的數據保存為文件，在工作空間下的map目錄(",[4274,4275,4276],"em",{},"需要自行創建該目錄，否則將會拋出異常",")中，生成兩個文件，分別名為：",[74,4279,4280],{},"my_map.yaml",[74,4282,4283],{},"my_map.pgm",[18,4285,4286],{},[30,4287],{"alt":32,"src":4288},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1752.webp",[18,4290,4291],{},[30,4292],{"alt":32,"src":4293},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1753.webp",[4104,4295,4296],{"id":4296},"地圖接口",[18,4298,4299],{},"在Nav2中地圖相關的接口主要有兩個：",[46,4301,4302,4308],{},[49,4303,4304,4307],{},[21,4305,4306],{},"nav_msgs/msg/MapMetaData"," 地圖元數據，包括地圖的寬度、高度、分辨率等。",[49,4309,4310,4312],{},[21,4311,690],{}," 地圖柵格數據，一般會在rviz中以圖形化的方式顯示。",[18,4314,4315],{},[21,4316,4306],{},[18,4318,4319,4320,4323],{},"調用指令",[74,4321,4322],{},"ros2 interface show nav_msgs/msg/MapMetaData","查看接口格式，顯示如下內容（註釋已漢化）：",[68,4325,4327],{"className":70,"code":4326,"language":72,"meta":32,"style":32},"\n# 它包含了关于OccupancyGrid特性的基本信息\n\n# 地图加载时间\nbuiltin_interfaces/Time map_load_time\n        int32 sec\n        uint32 nanosec\n\n# 地图分辨率 [米/像素]\nfloat32 resolution\n\n# 地图宽度 [像素]\nuint32 width\n\n# 地图高度 [像素]\nuint32 height\n\n#地图的原点坐标[米，米，弧度]。这是地图中单元格(0,0)左下角在现实世界中的位置和方向。\ngeometry_msgs/Pose origin\n        Point position\n                float64 x\n                float64 y\n                float64 z\n        Quaternion orientation\n                float64 x 0\n                float64 y 0\n                float64 z 0\n                float64 w 1\n",[74,4328,4329,4333,4338,4342,4347,4355,4363,4371,4375,4380,4388,4392,4397,4405,4409,4414,4421,4425,4430,4438,4446,4454,4461,4468,4476,4486,4495,4504],{"__ignoreMap":32},[77,4330,4331],{"class":79,"line":80},[77,4332,140],{"emptyLinePlaceholder":139},[77,4334,4335],{"class":79,"line":114},[77,4336,4337],{"class":146},"# 它包含了关于OccupancyGrid特性的基本信息\n",[77,4339,4340],{"class":79,"line":136},[77,4341,140],{"emptyLinePlaceholder":139},[77,4343,4344],{"class":79,"line":143},[77,4345,4346],{"class":146},"# 地图加载时间\n",[77,4348,4349,4352],{"class":79,"line":150},[77,4350,4351],{"class":83},"builtin_interfaces/Time",[77,4353,4354],{"class":87}," map_load_time\n",[77,4356,4357,4360],{"class":79,"line":162},[77,4358,4359],{"class":83},"        int32",[77,4361,4362],{"class":87}," sec\n",[77,4364,4365,4368],{"class":79,"line":174},[77,4366,4367],{"class":83},"        uint32",[77,4369,4370],{"class":87}," nanosec\n",[77,4372,4373],{"class":79,"line":179},[77,4374,140],{"emptyLinePlaceholder":139},[77,4376,4377],{"class":79,"line":185},[77,4378,4379],{"class":146},"# 地图分辨率 [米/像素]\n",[77,4381,4382,4385],{"class":79,"line":197},[77,4383,4384],{"class":83},"float32",[77,4386,4387],{"class":87}," resolution\n",[77,4389,4390],{"class":79,"line":1348},[77,4391,140],{"emptyLinePlaceholder":139},[77,4393,4394],{"class":79,"line":1363},[77,4395,4396],{"class":146},"# 地图宽度 [像素]\n",[77,4398,4399,4402],{"class":79,"line":1368},[77,4400,4401],{"class":83},"uint32",[77,4403,4404],{"class":87}," width\n",[77,4406,4407],{"class":79,"line":1379},[77,4408,140],{"emptyLinePlaceholder":139},[77,4410,4411],{"class":79,"line":1388},[77,4412,4413],{"class":146},"# 地图高度 [像素]\n",[77,4415,4416,4418],{"class":79,"line":1402},[77,4417,4401],{"class":83},[77,4419,4420],{"class":87}," height\n",[77,4422,4423],{"class":79,"line":1415},[77,4424,140],{"emptyLinePlaceholder":139},[77,4426,4427],{"class":79,"line":1425},[77,4428,4429],{"class":146},"#地图的原点坐标[米，米，弧度]。这是地图中单元格(0,0)左下角在现实世界中的位置和方向。\n",[77,4431,4432,4435],{"class":79,"line":1433},[77,4433,4434],{"class":83},"geometry_msgs/Pose",[77,4436,4437],{"class":87}," origin\n",[77,4439,4440,4443],{"class":79,"line":1449},[77,4441,4442],{"class":83},"        Point",[77,4444,4445],{"class":87}," position\n",[77,4447,4448,4451],{"class":79,"line":1463},[77,4449,4450],{"class":83},"                float64",[77,4452,4453],{"class":87}," x\n",[77,4455,4456,4458],{"class":79,"line":1475},[77,4457,4450],{"class":83},[77,4459,4460],{"class":87}," y\n",[77,4462,4463,4465],{"class":79,"line":1480},[77,4464,4450],{"class":83},[77,4466,4467],{"class":87}," z\n",[77,4469,4470,4473],{"class":79,"line":1491},[77,4471,4472],{"class":83},"        Quaternion",[77,4474,4475],{"class":87}," orientation\n",[77,4477,4478,4480,4483],{"class":79,"line":1502},[77,4479,4450],{"class":83},[77,4481,4482],{"class":87}," x",[77,4484,4485],{"class":1217}," 0\n",[77,4487,4488,4490,4493],{"class":79,"line":1508},[77,4489,4450],{"class":83},[77,4491,4492],{"class":87}," y",[77,4494,4485],{"class":1217},[77,4496,4497,4499,4502],{"class":79,"line":1519},[77,4498,4450],{"class":83},[77,4500,4501],{"class":87}," z",[77,4503,4485],{"class":1217},[77,4505,4506,4508,4511],{"class":79,"line":1525},[77,4507,4450],{"class":83},[77,4509,4510],{"class":87}," w",[77,4512,4513],{"class":1217}," 1\n",[18,4515,4516],{},[21,4517,690],{},[18,4519,4319,4520,4323],{},[74,4521,4522],{},"ros2 interface show nav_msgs/msg/OccupancyGrid",[68,4524,4526],{"className":70,"code":4525,"language":72,"meta":32,"style":32},"\n# 它代表一个二维网格地图。\nstd_msgs/Header header\n        builtin_interfaces/Time stamp\n                int32 sec\n                uint32 nanosec\n        string frame_id\n\n# 地图元数据\nMapMetaData info\n        builtin_interfaces/Time map_load_time\n                int32 sec\n                uint32 nanosec\n        float32 resolution\n        uint32 width\n        uint32 height\n        geometry_msgs/Pose origin\n                Point position\n                        float64 x\n                        float64 y\n                        float64 z\n                Quaternion orientation\n                        float64 x 0\n                        float64 y 0\n                        float64 z 0\n                        float64 w 1\n\n# 地图数据按照行优先的顺序进行排列，\n\n# 这意味着首先填充第一行的所有单元格，\n\n# 然后填充第二行，依此类推。\n\n# 起始单元格是(0,0)，也就是地图的左上角。\n\n# 单元格(1, 0)紧接着(0,0)，是x方向上紧邻的下一个单元格。\n\n# 而单元格(0, 1)则位于第一行的第二个位置，其索引等于地图的宽度（info.width），\n\n# 然后才是(1, 1)单元格，即第二行的第二个单元格。\n\n# 关于地图数据的值，它们根据具体的应用需求来定义。但在很多情况下，\n\n# 会使用0表示该单元格是未占用的，即机器人可以安全通过；\n\n# 1表示该单元格是确定占用的，即存在障碍物；\n\n# 而-1表示该单元格的状态是未知的，即机器人尚未探测到该区域的状态。\nint8[] data\n",[74,4527,4528,4532,4537,4545,4553,4560,4567,4575,4579,4584,4592,4598,4604,4610,4617,4623,4629,4636,4643,4650,4656,4662,4669,4677,4685,4693,4701,4705,4710,4714,4719,4723,4728,4732,4737,4741,4746,4750,4755,4759,4764,4768,4773,4777,4782,4786,4791,4795,4800],{"__ignoreMap":32},[77,4529,4530],{"class":79,"line":80},[77,4531,140],{"emptyLinePlaceholder":139},[77,4533,4534],{"class":79,"line":114},[77,4535,4536],{"class":146},"# 它代表一个二维网格地图。\n",[77,4538,4539,4542],{"class":79,"line":136},[77,4540,4541],{"class":83},"std_msgs/Header",[77,4543,4544],{"class":87}," header\n",[77,4546,4547,4550],{"class":79,"line":143},[77,4548,4549],{"class":83},"        builtin_interfaces/Time",[77,4551,4552],{"class":87}," stamp\n",[77,4554,4555,4558],{"class":79,"line":150},[77,4556,4557],{"class":83},"                int32",[77,4559,4362],{"class":87},[77,4561,4562,4565],{"class":79,"line":162},[77,4563,4564],{"class":83},"                uint32",[77,4566,4370],{"class":87},[77,4568,4569,4572],{"class":79,"line":174},[77,4570,4571],{"class":83},"        string",[77,4573,4574],{"class":87}," frame_id\n",[77,4576,4577],{"class":79,"line":179},[77,4578,140],{"emptyLinePlaceholder":139},[77,4580,4581],{"class":79,"line":185},[77,4582,4583],{"class":146},"# 地图元数据\n",[77,4585,4586,4589],{"class":79,"line":197},[77,4587,4588],{"class":83},"MapMetaData",[77,4590,4591],{"class":87}," info\n",[77,4593,4594,4596],{"class":79,"line":1348},[77,4595,4549],{"class":83},[77,4597,4354],{"class":87},[77,4599,4600,4602],{"class":79,"line":1363},[77,4601,4557],{"class":83},[77,4603,4362],{"class":87},[77,4605,4606,4608],{"class":79,"line":1368},[77,4607,4564],{"class":83},[77,4609,4370],{"class":87},[77,4611,4612,4615],{"class":79,"line":1379},[77,4613,4614],{"class":83},"        float32",[77,4616,4387],{"class":87},[77,4618,4619,4621],{"class":79,"line":1388},[77,4620,4367],{"class":83},[77,4622,4404],{"class":87},[77,4624,4625,4627],{"class":79,"line":1402},[77,4626,4367],{"class":83},[77,4628,4420],{"class":87},[77,4630,4631,4634],{"class":79,"line":1415},[77,4632,4633],{"class":83},"        geometry_msgs/Pose",[77,4635,4437],{"class":87},[77,4637,4638,4641],{"class":79,"line":1425},[77,4639,4640],{"class":83},"                Point",[77,4642,4445],{"class":87},[77,4644,4645,4648],{"class":79,"line":1433},[77,4646,4647],{"class":83},"                        float64",[77,4649,4453],{"class":87},[77,4651,4652,4654],{"class":79,"line":1449},[77,4653,4647],{"class":83},[77,4655,4460],{"class":87},[77,4657,4658,4660],{"class":79,"line":1463},[77,4659,4647],{"class":83},[77,4661,4467],{"class":87},[77,4663,4664,4667],{"class":79,"line":1475},[77,4665,4666],{"class":83},"                Quaternion",[77,4668,4475],{"class":87},[77,4670,4671,4673,4675],{"class":79,"line":1480},[77,4672,4647],{"class":83},[77,4674,4482],{"class":87},[77,4676,4485],{"class":1217},[77,4678,4679,4681,4683],{"class":79,"line":1491},[77,4680,4647],{"class":83},[77,4682,4492],{"class":87},[77,4684,4485],{"class":1217},[77,4686,4687,4689,4691],{"class":79,"line":1502},[77,4688,4647],{"class":83},[77,4690,4501],{"class":87},[77,4692,4485],{"class":1217},[77,4694,4695,4697,4699],{"class":79,"line":1508},[77,4696,4647],{"class":83},[77,4698,4510],{"class":87},[77,4700,4513],{"class":1217},[77,4702,4703],{"class":79,"line":1519},[77,4704,140],{"emptyLinePlaceholder":139},[77,4706,4707],{"class":79,"line":1525},[77,4708,4709],{"class":146},"# 地图数据按照行优先的顺序进行排列，\n",[77,4711,4712],{"class":79,"line":1538},[77,4713,140],{"emptyLinePlaceholder":139},[77,4715,4716],{"class":79,"line":1551},[77,4717,4718],{"class":146},"# 这意味着首先填充第一行的所有单元格，\n",[77,4720,4721],{"class":79,"line":1563},[77,4722,140],{"emptyLinePlaceholder":139},[77,4724,4725],{"class":79,"line":1576},[77,4726,4727],{"class":146},"# 然后填充第二行，依此类推。\n",[77,4729,4730],{"class":79,"line":1581},[77,4731,140],{"emptyLinePlaceholder":139},[77,4733,4734],{"class":79,"line":1592},[77,4735,4736],{"class":146},"# 起始单元格是(0,0)，也就是地图的左上角。\n",[77,4738,4739],{"class":79,"line":1597},[77,4740,140],{"emptyLinePlaceholder":139},[77,4742,4743],{"class":79,"line":1603},[77,4744,4745],{"class":146},"# 单元格(1, 0)紧接着(0,0)，是x方向上紧邻的下一个单元格。\n",[77,4747,4748],{"class":79,"line":1609},[77,4749,140],{"emptyLinePlaceholder":139},[77,4751,4752],{"class":79,"line":1615},[77,4753,4754],{"class":146},"# 而单元格(0, 1)则位于第一行的第二个位置，其索引等于地图的宽度（info.width），\n",[77,4756,4757],{"class":79,"line":1620},[77,4758,140],{"emptyLinePlaceholder":139},[77,4760,4761],{"class":79,"line":2003},[77,4762,4763],{"class":146},"# 然后才是(1, 1)单元格，即第二行的第二个单元格。\n",[77,4765,4766],{"class":79,"line":2014},[77,4767,140],{"emptyLinePlaceholder":139},[77,4769,4770],{"class":79,"line":2027},[77,4771,4772],{"class":146},"# 关于地图数据的值，它们根据具体的应用需求来定义。但在很多情况下，\n",[77,4774,4775],{"class":79,"line":2041},[77,4776,140],{"emptyLinePlaceholder":139},[77,4778,4779],{"class":79,"line":2054},[77,4780,4781],{"class":146},"# 会使用0表示该单元格是未占用的，即机器人可以安全通过；\n",[77,4783,4784],{"class":79,"line":2068},[77,4785,140],{"emptyLinePlaceholder":139},[77,4787,4788],{"class":79,"line":2079},[77,4789,4790],{"class":146},"# 1表示该单元格是确定占用的，即存在障碍物；\n",[77,4792,4793],{"class":79,"line":2084},[77,4794,140],{"emptyLinePlaceholder":139},[77,4796,4797],{"class":79,"line":2094},[77,4798,4799],{"class":146},"# 而-1表示该单元格的状态是未知的，即机器人尚未探测到该区域的状态。\n",[77,4801,4802,4805],{"class":79,"line":2105},[77,4803,4804],{"class":83},"int8[]",[77,4806,4807],{"class":87}," data\n",[4104,4809,4810],{"id":4810},"地圖存儲格式",[18,4812,4813,4814,4816],{},"在 ",[21,4815,4230],{},"  一節中，地圖保存後後生成兩個文件，這兩個文件就是用來存儲序列化後的地圖數據的。其中，my_map.pgm是一張圖片資源，使用圖片查看程序打開即可，而my_map.yaml保存的是地圖的元數據信息，用於描述圖片，內容格式如下：",[68,4818,4820],{"className":1639,"code":4819,"language":1641,"meta":32,"style":32},"image: my_map.pgm\nmode: trinary\nresolution: 0.05\norigin: [-0.955, -10.9, 0]\nnegate: 0\noccupied_thresh: 0.65\nfree_thresh: 0.25\n",[74,4821,4822,4832,4841,4849,4873,4883,4893],{"__ignoreMap":32},[77,4823,4824,4827,4829],{"class":79,"line":80},[77,4825,4826],{"class":1648},"image",[77,4828,1666],{"class":104},[77,4830,4831],{"class":87},"my_map.pgm\n",[77,4833,4834,4836,4838],{"class":79,"line":114},[77,4835,875],{"class":1648},[77,4837,1666],{"class":104},[77,4839,4840],{"class":87},"trinary\n",[77,4842,4843,4845,4847],{"class":79,"line":136},[77,4844,982],{"class":1648},[77,4846,1666],{"class":104},[77,4848,1852],{"class":1217},[77,4850,4851,4854,4857,4860,4862,4865,4867,4870],{"class":79,"line":143},[77,4852,4853],{"class":1648},"origin",[77,4855,4856],{"class":104},": [",[77,4858,4859],{"class":1217},"-0.955",[77,4861,1455],{"class":104},[77,4863,4864],{"class":1217},"-10.9",[77,4866,1455],{"class":104},[77,4868,4869],{"class":1217},"0",[77,4871,4872],{"class":104},"]\n",[77,4874,4875,4878,4880],{"class":79,"line":150},[77,4876,4877],{"class":1648},"negate",[77,4879,1666],{"class":104},[77,4881,4882],{"class":1217},"0\n",[77,4884,4885,4888,4890],{"class":79,"line":162},[77,4886,4887],{"class":1648},"occupied_thresh",[77,4889,1666],{"class":104},[77,4891,4892],{"class":1217},"0.65\n",[77,4894,4895,4898,4900],{"class":79,"line":174},[77,4896,4897],{"class":1648},"free_thresh",[77,4899,1666],{"class":104},[77,4901,4902],{"class":1217},"0.25\n",[18,4904,4905],{},[21,4906,4907],{},"參數解釋：",[46,4909,4910,4915,4920,4925,4930,4935,4940],{},[49,4911,4912,4914],{},[21,4913,4826],{},"  被描述的圖片資源路徑，可以是絕對路徑也可以是相對路徑。",[49,4916,4917,4919],{},[21,4918,982],{}," 圖片分片率(單位: m/像素)。",[49,4921,4922,4924],{},[21,4923,4853],{}," 地圖中左下像素的二維姿態，為（x，y，z），偏航為逆時針旋轉（偏航=0 表示無旋轉）。",[49,4926,4927,4929],{},[21,4928,4887],{}," 佔用概率大於此閾值的像素被視為完全佔用。",[49,4931,4932,4934],{},[21,4933,4897],{}," 佔用率小於此閾值的像素被視為完全空閒。",[49,4936,4937,4939],{},[21,4938,4877],{}," 是否應該顛倒白色/黑色 自由/佔用的語義。",[49,4941,4942,4944],{},[21,4943,875],{},"  地圖模式，trinary(默認)或scale或raw。",[14,4946,4948],{"id":4947},"讀取地圖反序列化","讀取地圖(反序列化)",[4104,4950,4951],{"id":4951},"地圖讀取節點說明",[18,4953,4079,4954,4956,4957,4115],{},[74,4955,4075],{},"中的地圖讀取節點是",[74,4958,4091],{},[18,4960,4961],{},[21,4962,668],{},[535,4964,4965,4975],{},[538,4966,4967],{},[541,4968,4969,4971,4973],{},[544,4970,547],{"align":546},[544,4972,4130],{"align":546},[544,4974,553],{"align":546},[555,4976,4977],{},[541,4978,4979,4981,4983],{},[560,4980,687],{"align":546},[560,4982,690],{"align":546},[560,4984,4985],{"align":546},"地圖數據",[18,4987,4988],{},[21,4989,827],{},[46,4991,4992,4998,5004],{},[49,4993,4994,4997],{},[21,4995,4996],{},"frame_id","  地圖座標系名稱。",[49,4999,5000,5003],{},[21,5001,5002],{},"topic_name","  話題名稱。",[49,5005,5006,5009],{},[21,5007,5008],{},"yaml_filename","  地圖數據源。",[4104,5011,5012],{"id":5012},"地圖讀取基本操作",[18,5014,5015],{},[21,5016,1192],{},[18,5018,5019],{},"請先調用如下指令在工作空間的src目錄下創建一個功能包：",[68,5021,5023],{"className":70,"code":5022,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_map_server --dependencies nav2_map_server\n",[74,5024,5025],{"__ignoreMap":32},[77,5026,5027,5029,5031,5033,5036,5038],{"class":79,"line":80},[77,5028,1205],{"class":83},[77,5030,1208],{"class":87},[77,5032,1211],{"class":87},[77,5034,5035],{"class":87}," mycar_map_server",[77,5037,1218],{"class":1217},[77,5039,5040],{"class":87}," nav2_map_server\n",[18,5042,5043],{},"在功能包下，新建launch文件夾，並在CMakeLists.txt中添加如下配置：",[68,5045,5047],{"className":2279,"code":5046,"language":2281,"meta":32,"style":32},"install(DIRECTORY launch DESTINATION share/${PROJECT_NAME})\n",[74,5048,5049],{"__ignoreMap":32},[77,5050,5051,5053,5056,5059],{"class":79,"line":80},[77,5052,2288],{"class":97},[77,5054,5055],{"class":104},"(DIRECTORY launch DESTINATION share/",[77,5057,5058],{"class":97},"${PROJECT_NAME}",[77,5060,1345],{"class":104},[18,5062,5063],{},[30,5064],{"alt":32,"src":5065},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1754.webp",[18,5067,5068],{},[21,5069,5070],{},"讀取地圖",[18,5072,5073,5074,5076],{},"使用",[74,5075,4091],{},"讀取地圖時，常用的方式有兩種，分別是使用終端指令與launch文件集成。兩種方式效果一致，都可以以話題的方式發佈地圖消息。",[68,5078,5080],{"className":70,"code":5079,"language":72,"meta":32,"style":32},"colcon build\nsource ./install/setup.bash\n",[74,5081,5082,5089],{"__ignoreMap":32},[77,5083,5084,5086],{"class":79,"line":80},[77,5085,2321],{"class":83},[77,5087,5088],{"class":87}," build\n",[77,5090,5091,5094],{"class":79,"line":114},[77,5092,5093],{"class":1217},"source",[77,5095,5096],{"class":87}," ./install/setup.bash\n",[18,5098,5099],{},[21,5100,5101],{},"方式1：終端指令",[18,5103,5104],{},"請在終端下進入工作空間，輸入如下指令：",[68,5106,5108],{"className":70,"code":5107,"language":72,"meta":32,"style":32},"ros2 run nav2_map_server map_server --ros-args -p yaml_filename:=map/my_map.yaml\n",[74,5109,5110],{"__ignoreMap":32},[77,5111,5112,5114,5116,5118,5121,5124,5127],{"class":79,"line":80},[77,5113,1205],{"class":83},[77,5115,4257],{"class":87},[77,5117,4260],{"class":87},[77,5119,5120],{"class":87}," map_server",[77,5122,5123],{"class":1217}," --ros-args",[77,5125,5126],{"class":1217}," -p",[77,5128,5129],{"class":87}," yaml_filename:=map/my_map.yaml\n",[18,5131,5132,5133,5135],{},"由於",[74,5134,4091],{},"是具有生命週期的節點，所以接下來還需要對節點進行配置和激活，請新開終端執行如下指令：",[68,5137,5139],{"className":70,"code":5138,"language":72,"meta":32,"style":32},"ros2 lifecycle set /map_server configure\nros2 lifecycle set /map_server activate\n",[74,5140,5141,5157],{"__ignoreMap":32},[77,5142,5143,5145,5148,5151,5154],{"class":79,"line":80},[77,5144,1205],{"class":83},[77,5146,5147],{"class":87}," lifecycle",[77,5149,5150],{"class":87}," set",[77,5152,5153],{"class":87}," /map_server",[77,5155,5156],{"class":87}," configure\n",[77,5158,5159,5161,5163,5165,5167],{"class":79,"line":114},[77,5160,1205],{"class":83},[77,5162,5147],{"class":87},[77,5164,5150],{"class":87},[77,5166,5153],{"class":87},[77,5168,5169],{"class":87}," activate\n",[18,5171,5172,5173,5176,5177,5179],{},"執行完畢若無異常，再調用",[74,5174,5175],{},"ros2 topic list","即可查看到",[74,5178,687],{},"話題了，說明地圖消息已經被髮布了。",[18,5181,5182],{},[21,5183,5184],{},"方式2：launch集成",[18,5186,5187,5188,5190,5191,5194],{},"方式1需要手動設置",[74,5189,4091],{},"生命週期，步驟稍顯繁瑣，因此，我們還可以將該節點集成進launch文件，以簡化啟動步驟。在launch目錄下新建名為",[74,5192,5193],{},"map_server.launch.py","的文件，並輸入如下內容：",[68,5196,5198],{"className":1236,"code":5197,"language":1238,"meta":32,"style":32},"import os\nfrom launch import LaunchDescription\nfrom launch_ros.actions import Node\ndef generate_launch_description():\n  map_file = os.path.join('map', 'my_map.yaml')\n  map_server_node = Node(\n      package='nav2_map_server',\n      executable='map_server',\n      name='map_server',\n      output='screen',\n      parameters=[{'use_sim_time': True},\n                  {'yaml_filename':map_file}]\n  )\n  manager_mapper_node = Node(\n    package='nav2_lifecycle_manager',\n    executable='lifecycle_manager',\n    name='lifecycle_manager_mapper',\n    output='screen',\n    parameters=[{'use_sim_time': True},\n      {'autostart': True},\n      {'node_names': ['map_server']}]\n  )\n  return LaunchDescription([map_server_node,manager_mapper_node])\n",[74,5199,5200,5206,5216,5226,5234,5254,5263,5275,5287,5298,5309,5329,5340,5345,5354,5366,5378,5390,5401,5418,5432,5446,5450],{"__ignoreMap":32},[77,5201,5202,5204],{"class":79,"line":80},[77,5203,1245],{"class":97},[77,5205,1248],{"class":104},[77,5207,5208,5210,5212,5214],{"class":79,"line":114},[77,5209,1257],{"class":97},[77,5211,1260],{"class":104},[77,5213,1245],{"class":97},[77,5215,1265],{"class":104},[77,5217,5218,5220,5222,5224],{"class":79,"line":136},[77,5219,1257],{"class":97},[77,5221,1296],{"class":104},[77,5223,1245],{"class":97},[77,5225,1301],{"class":104},[77,5227,5228,5230,5232],{"class":79,"line":143},[77,5229,1322],{"class":97},[77,5231,1325],{"class":83},[77,5233,1328],{"class":104},[77,5235,5236,5239,5241,5244,5247,5249,5252],{"class":79,"line":150},[77,5237,5238],{"class":104},"  map_file ",[77,5240,1336],{"class":97},[77,5242,5243],{"class":104}," os.path.join(",[77,5245,5246],{"class":87},"'map'",[77,5248,1455],{"class":104},[77,5250,5251],{"class":87},"'my_map.yaml'",[77,5253,1345],{"class":104},[77,5255,5256,5259,5261],{"class":79,"line":162},[77,5257,5258],{"class":104},"  map_server_node ",[77,5260,1336],{"class":97},[77,5262,1488],{"class":104},[77,5264,5265,5268,5270,5273],{"class":79,"line":174},[77,5266,5267],{"class":1391},"      package",[77,5269,1336],{"class":97},[77,5271,5272],{"class":87},"'nav2_map_server'",[77,5274,1385],{"class":104},[77,5276,5277,5280,5282,5285],{"class":79,"line":179},[77,5278,5279],{"class":1391},"      executable",[77,5281,1336],{"class":97},[77,5283,5284],{"class":87},"'map_server'",[77,5286,1385],{"class":104},[77,5288,5289,5292,5294,5296],{"class":79,"line":185},[77,5290,5291],{"class":1391},"      name",[77,5293,1336],{"class":97},[77,5295,5284],{"class":87},[77,5297,1385],{"class":104},[77,5299,5300,5303,5305,5307],{"class":79,"line":197},[77,5301,5302],{"class":1391},"      output",[77,5304,1336],{"class":97},[77,5306,1571],{"class":87},[77,5308,1385],{"class":104},[77,5310,5311,5314,5316,5319,5321,5323,5326],{"class":79,"line":1348},[77,5312,5313],{"class":1391},"      parameters",[77,5315,1336],{"class":97},[77,5317,5318],{"class":104},"[{",[77,5320,1342],{"class":87},[77,5322,1666],{"class":104},[77,5324,5325],{"class":1217},"True",[77,5327,5328],{"class":104},"},\n",[77,5330,5331,5334,5337],{"class":79,"line":1363},[77,5332,5333],{"class":104},"                  {",[77,5335,5336],{"class":87},"'yaml_filename'",[77,5338,5339],{"class":104},":map_file}]\n",[77,5341,5342],{"class":79,"line":1368},[77,5343,5344],{"class":104},"  )\n",[77,5346,5347,5350,5352],{"class":79,"line":1379},[77,5348,5349],{"class":104},"  manager_mapper_node ",[77,5351,1336],{"class":97},[77,5353,1488],{"class":104},[77,5355,5356,5359,5361,5364],{"class":79,"line":1388},[77,5357,5358],{"class":1391},"    package",[77,5360,1336],{"class":97},[77,5362,5363],{"class":87},"'nav2_lifecycle_manager'",[77,5365,1385],{"class":104},[77,5367,5368,5371,5373,5376],{"class":79,"line":1402},[77,5369,5370],{"class":1391},"    executable",[77,5372,1336],{"class":97},[77,5374,5375],{"class":87},"'lifecycle_manager'",[77,5377,1385],{"class":104},[77,5379,5380,5383,5385,5388],{"class":79,"line":1415},[77,5381,5382],{"class":1391},"    name",[77,5384,1336],{"class":97},[77,5386,5387],{"class":87},"'lifecycle_manager_mapper'",[77,5389,1385],{"class":104},[77,5391,5392,5395,5397,5399],{"class":79,"line":1425},[77,5393,5394],{"class":1391},"    output",[77,5396,1336],{"class":97},[77,5398,1571],{"class":87},[77,5400,1385],{"class":104},[77,5402,5403,5406,5408,5410,5412,5414,5416],{"class":79,"line":1433},[77,5404,5405],{"class":1391},"    parameters",[77,5407,1336],{"class":97},[77,5409,5318],{"class":104},[77,5411,1342],{"class":87},[77,5413,1666],{"class":104},[77,5415,5325],{"class":1217},[77,5417,5328],{"class":104},[77,5419,5420,5423,5426,5428,5430],{"class":79,"line":1449},[77,5421,5422],{"class":104},"      {",[77,5424,5425],{"class":87},"'autostart'",[77,5427,1666],{"class":104},[77,5429,5325],{"class":1217},[77,5431,5328],{"class":104},[77,5433,5434,5436,5439,5441,5443],{"class":79,"line":1463},[77,5435,5422],{"class":104},[77,5437,5438],{"class":87},"'node_names'",[77,5440,4856],{"class":104},[77,5442,5284],{"class":87},[77,5444,5445],{"class":104},"]}]\n",[77,5447,5448],{"class":79,"line":1475},[77,5449,5344],{"class":104},[77,5451,5452,5455],{"class":79,"line":1480},[77,5453,5454],{"class":97},"  return",[77,5456,5457],{"class":104}," LaunchDescription([map_server_node,manager_mapper_node])\n",[18,5459,5460,5461,5464,5465,5468],{},"在該文件中，使用了功能包中",[74,5462,5463],{},"nav2_lifecycle_manager","中的",[74,5466,5467],{},"lifecycle_manager","組件，該組件可以自動的配置、激活其所管理的具有生命週期的節點。構建功能包後並執行該launch文件，其最終效果與方式一類似。",[68,5470,5472],{"className":70,"code":5471,"language":72,"meta":32,"style":32},"ros2 launch mycar_map_server map_server.launch.py\n",[74,5473,5474],{"__ignoreMap":32},[77,5475,5476,5478,5480,5482],{"class":79,"line":80},[77,5477,1205],{"class":83},[77,5479,2360],{"class":87},[77,5481,5035],{"class":87},[77,5483,5484],{"class":87}," map_server.launch.py\n",[18,5486,5487],{},[21,5488,5489],{},"顯示地圖",[18,5491,5492,5493],{},"打開rviz2，然後添加Map插件，並將話題設置為/map，並將該話題的",[74,5494,5495],{},"Durability Policy",[18,5497,5498,5499,5502],{},"選項設置為",[74,5500,5501],{},"Transient Local","，就可以正常顯示地圖數據了。",[18,5504,5505],{},[30,5506],{"alt":32,"src":5507},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1755.webp",[18,5509,5510],{},[30,5511],{"alt":32,"src":5512},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1756.webp",[18,5514,5515],{},[30,5516],{"alt":32,"src":5517},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1757.webp",[10,5519,5521],{"id":5520},"amcl自適應蒙特卡洛定位","AMCL自適應蒙特卡洛定位",[18,5523,5524],{},"定位是機器人在已知地圖上確定自身位置的過程，為機器人的導航提供了基礎信息。",[18,5526,5527,5528,4076],{},"Nav2中的定位技術技術稱之為AMCL，全稱Adaptive Monte Carlo Localization，即自適應蒙特卡洛定位，是一種基於粒子濾波器的定位算法。它通過蒙特卡洛方法進行自適應定位，利用對機器人周圍環境的感知和觀測數據的分析，來確定機器人在環境中的位置和姿態。在Nav2中對應的功能包為",[74,5529,5530],{},"nav2_amcl",[18,5532,5533],{},"在AMCL中，粒子濾波器的核心思想是使用一組粒子（樣本）來代表機器人在地圖上的可能位置。每個粒子都有一個權重，表示該粒子所代表的位置的置信度。算法會根據機器人的運動模型和傳感器數據來更新這些粒子的位置和權重。隨著時間的推移，粒子會逐漸收斂到機器人實際位置附近，從而實現對機器人位置的準確估計。",[14,5535,5536],{"id":5536},"定位節點說明",[18,5538,5539,5540,5542],{},"功能包",[74,5541,5530],{},"中的核心節點為amcl。該節點相關信息如下。",[18,5544,5545],{},[21,5546,5547],{},"1.訂閱的話題",[535,5549,5550,5560],{},[538,5551,5552],{},[541,5553,5554,5556,5558],{},[544,5555,547],{"align":546},[544,5557,4130],{"align":546},[544,5559,553],{"align":546},[555,5561,5562,5571,5581,5592],{},[541,5563,5564,5566,5569],{},[560,5565,687],{"align":546},[560,5567,5568],{"align":546},"/nav_msgs/msg/OccupancyGrid",[560,5570,4985],{"align":546},[541,5572,5573,5575,5578],{},[560,5574,562],{"align":546},[560,5576,5577],{"align":546},"/sensor_msgs/msg/LaserScan",[560,5579,5580],{"align":546},"激光雷達數據",[541,5582,5583,5586,5589],{},[560,5584,5585],{"align":546},"/initialpose",[560,5587,5588],{"align":546},"/geometry_msgs/msg/PoseWithCovarianceStamped",[560,5590,5591],{"align":546},"用來初始化粒子濾波器的均值和協方差",[541,5593,5594,5596,5599],{},[560,5595,573],{"align":546},[560,5597,5598],{"align":546},"/tf2_msgs/msg/TFMessage",[560,5600,5601],{"align":546},"座標變換消息",[18,5603,5604],{},[21,5605,5606],{},"2.發佈的話題",[535,5608,5609,5619],{},[538,5610,5611],{},[541,5612,5613,5615,5617],{},[544,5614,547],{"align":546},[544,5616,4130],{"align":546},[544,5618,553],{"align":546},[555,5620,5621,5631,5642],{},[541,5622,5623,5626,5628],{},[560,5624,5625],{"align":546},"/amcl_pose",[560,5627,5588],{"align":546},[560,5629,5630],{"align":546},"機器人在地圖中的位姿估計",[541,5632,5633,5636,5639],{},[560,5634,5635],{"align":546},"/particle_cloud",[560,5637,5638],{"align":546},"/nav2_msgs/msg/ParticleCloud",[560,5640,5641],{"align":546},"位姿估計集合，rviz中可以被 PoseArray 訂閱然後圖形化顯示機器人的位姿估計集合",[541,5643,5644,5646,5648],{},[560,5645,573],{"align":546},[560,5647,5598],{"align":546},[560,5649,5650],{"align":546},"發佈從 odom 與 map 的轉換",[18,5652,5653],{},[21,5654,5655],{},"3.發佈的服務",[535,5657,5658,5668],{},[538,5659,5660],{},[541,5661,5662,5664,5666],{},[544,5663,547],{"align":546},[544,5665,4130],{"align":546},[544,5667,553],{"align":546},[555,5669,5670,5681],{},[541,5671,5672,5675,5678],{},[560,5673,5674],{"align":546},"/reinitialize_global_localization",[560,5676,5677],{"align":546},"std_srvs/srv/Empty",[560,5679,5680],{"align":546},"在全局範圍內初始化粒子位姿",[541,5682,5683,5686,5688],{},[560,5684,5685],{"align":546},"/request_nomotion_update",[560,5687,5677],{"align":546},[560,5689,5690],{"align":546},"在沒有運動模型更新的情況下手動觸發粒子群的更新",[18,5692,5693],{},[21,5694,5695],{},"4.參數",[18,5697,5698],{},[21,5699,5700],{},"通用參數",[46,5702,5703,5712,5722,5731,5740,5748,5754],{},[49,5704,5705,5708,5709,5711],{},[74,5706,5707],{},"bond_disable_heartbeat_timeout",": 設置為",[74,5710,2022],{},"時，禁用amcl節點與其他節點之間基於心跳的超時檢測。這通常用於當節點之間的連接非常穩定，不需要頻繁的心跳檢測來確認連接狀態時。",[49,5713,5714,5717,5718,5721],{},[74,5715,5716],{},"base_frame_id",": 定義機器人基座標系的ID，通常是",[74,5719,5720],{},"base_link","或類似的名稱。",[49,5723,5724,5727,5728,4076],{},[74,5725,5726],{},"global_frame_id",": 定義全局地圖座標系的ID，通常是",[74,5729,5730],{},"map",[49,5732,5733,5736,5737,4076],{},[74,5734,5735],{},"odom_frame_id",": 定義里程計座標系的ID，通常是",[74,5738,5739],{},"odom",[49,5741,5742,5708,5745,5747],{},[74,5743,5744],{},"tf_broadcast",[74,5746,2022],{},"時，amcl節點會發布從里程計座標系到全局地圖座標系的變換。",[49,5749,5750,5753],{},[74,5751,5752],{},"transform_tolerance",": 設置TF變換的容忍度，用於處理TF樹中的時間不一致性。",[49,5755,5756,5708,5759,5761],{},[74,5757,5758],{},"use_sim_time",[74,5760,2022],{},"時，amcl將使用ROS 2的模擬時間（如果可用）。這在仿真環境中很有用。",[18,5763,5764],{},[21,5765,5766],{},"激光模型參數",[46,5768,5769,5779,5788,5794],{},[49,5770,5771,5774,5775,5778],{},[74,5772,5773],{},"laser_model_type",": 設置激光模型類型，",[74,5776,5777],{},"likelihood_field","是一種常用的模型，它考慮了激光束擊中障礙物的概率。",[49,5780,5781,2677,5784,5787],{},[74,5782,5783],{},"laser_max_range",[74,5785,5786],{},"laser_min_range",": 分別設置激光雷達的最大和最小探測範圍。",[49,5789,5790,5793],{},[74,5791,5792],{},"laser_likelihood_max_dist",": 設置激光模型考慮的最大距離，超過這個距離的數據將被忽略。",[49,5795,5796,5799,5800,5803,5804,5803,5807,5810,5811,5813,5814,5817],{},[74,5797,5798],{},"do_beamskip","和相關參數（",[74,5801,5802],{},"beam_skip_distance","、",[74,5805,5806],{},"beam_skip_threshold",[74,5808,5809],{},"beam_skip_error_threshold","）: 這些參數用於控制是否跳過某些激光束的處理，以減少計算量。然而，",[74,5812,5798],{},"被設置為",[74,5815,5816],{},"false","，意味著不跳過任何激光束。",[18,5819,5820],{},[21,5821,5822],{},"粒子濾波器參數",[46,5824,5825,5837,5846,5852],{},[49,5826,5827,5830,5833,5836],{},[74,5828,5829],{},"alpha1",[21,5831,5832],{},"到",[74,5834,5835],{},"alpha5",": 這些參數用於控制粒子濾波器中的權重更新過程，但它們的具體作用可能因amcl的實現而異。在標準的amcl實現中，這些參數可能不是直接使用的。",[49,5838,5839,2677,5842,5845],{},[74,5840,5841],{},"max_particles",[74,5843,5844],{},"min_particles",": 分別設置粒子濾波器的最大和最小粒子數。",[49,5847,5848,5851],{},[74,5849,5850],{},"resample_interval",": 設置在重採樣前需要的濾波更新次數。",[49,5853,5854,2677,5857,5860],{},[74,5855,5856],{},"pf_err",[74,5858,5859],{},"pf_z",": 這些參數用於控制粒子濾波器的性能，但它們的具體作用可能依賴於amcl的實現細節。",[18,5862,5863],{},[21,5864,5865],{},"初始位姿參數",[46,5867,5868,5880,5887],{},[49,5869,5870,5873,5874,5813,5877,5879],{},[74,5871,5872],{},"initial_pose",": 定義了機器人的初始位姿（x, y, yaw, z），但在實際使用中，如果",[74,5875,5876],{},"set_initial_pose",[74,5878,2022],{},"，則這個初始位姿可能會被通過服務請求設置的初始位姿所覆蓋。",[49,5881,5882,5708,5884,5886],{},[74,5883,5876],{},[74,5885,2022],{},"時，允許通過服務請求來設置機器人的初始位姿。",[49,5888,5889,5708,5892,5894],{},[74,5890,5891],{},"always_reset_initial_pose",[74,5893,5816],{},"時，表示不會在每個定位會話開始時自動重置初始位姿。",[18,5896,5897],{},[21,5898,5899],{},"其他參數",[46,5901,5902,5911,5917,5922,5928,5937],{},[49,5903,5904,5907,5908,5910],{},[74,5905,5906],{},"first_map_only",": 當設置為",[74,5909,5816],{},"時，表示amcl將訂閱並處理不斷更新的地圖話題。",[49,5912,5913,5916],{},[74,5914,5915],{},"map_topic",": 定義地圖話題的名稱，amcl將訂閱這個話題以獲取地圖信息。",[49,5918,5919,5921],{},[74,5920,904],{},": 定義激光雷達掃描數據話題的名稱，amcl將訂閱這個話題以獲取用於定位的數據。",[49,5923,5924,5927],{},[74,5925,5926],{},"save_pose_rate",": 設置保存機器人位姿的速率（以Hz為單位）。",[49,5929,5930,2677,5933,5936],{},[74,5931,5932],{},"recovery_alpha_fast",[74,5934,5935],{},"recovery_alpha_slow",": 這些參數在標準的amcl實現中可能不是直接使用的，它們可能屬於某個特定版本的amcl或擴展。",[49,5938,5939,5803,5942,5803,5945,5803,5948,2677,5951,5954],{},[74,5940,5941],{},"z_hit",[74,5943,5944],{},"z_rand",[74,5946,5947],{},"z_short",[74,5949,5950],{},"z_max",[74,5952,5953],{},"sigma_hit",": 這些參數定義了激光模型中的概率分佈，用於計算激光束擊中障礙物或隨機位置的概率。",[14,5956,5957],{"id":5957},"定位節點基本操作",[18,5959,5960],{},[21,5961,5962],{},"1.準備工作",[18,5964,5019],{},[68,5966,5968],{"className":70,"code":5967,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_localization --dependencies nav2_amcl mycar_map_server\n",[74,5969,5970],{"__ignoreMap":32},[77,5971,5972,5974,5976,5978,5981,5983,5986],{"class":79,"line":80},[77,5973,1205],{"class":83},[77,5975,1208],{"class":87},[77,5977,1211],{"class":87},[77,5979,5980],{"class":87}," mycar_localization",[77,5982,1218],{"class":1217},[77,5984,5985],{"class":87}," nav2_amcl",[77,5987,5988],{"class":87}," mycar_map_server\n",[18,5990,5991],{},[21,5992,5993],{},"2.編寫launch文件與參數文件",[18,5995,5996,5997,5194],{},"在功能包下，新建launch和params文件夾，在launch目錄下新建名為",[74,5998,5999],{},"mycar_loca.launch.py",[68,6001,6003],{"className":1236,"code":6002,"language":1238,"meta":32,"style":32},"import os\nfrom ament_index_python.packages import get_package_share_directory\n\nfrom launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument, IncludeLaunchDescription\nfrom launch.substitutions import LaunchConfiguration\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\n\nfrom launch_ros.actions import Node\n\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument(\n        'use_sim_time',\n        default_value='false'\n    )\n\n    amcl_yaml = os.path.join(\n        get_package_share_directory('mycar_localization'),\n        'params',\n        'amcl.yaml'\n    )\n\n    amcl_node = Node(\n        package='nav2_amcl',\n        executable='amcl',\n        name='amcl',\n        output='screen',\n        parameters=[\n            amcl_yaml,\n            {'use_sim_time': LaunchConfiguration('use_sim_time')} # 覆盖掉yaml里的use_sim_time参数,以launch启动的设置为准.\n        ]\n    )\n\n    manager_localization_node = Node(\n        package='nav2_lifecycle_manager',\n        executable='lifecycle_manager',\n        name='lifecycle_manager_localization',\n        output='screen',\n        parameters=[\n            {'use_sim_time': LaunchConfiguration('use_sim_time')},\n            {'autostart': True},\n            {'node_names': ['amcl']}\n        ]\n    )\n\n    map_server_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                get_package_share_directory('mycar_map_server'),\n                'launch',\n                'map_server.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': LaunchConfiguration('use_sim_time')\n        }.items()\n    )\n\n    return LaunchDescription([\n        use_sim_time_arg,\n        map_server_launch,\n        amcl_node,\n        manager_localization_node,\n    ])\n",[74,6004,6005,6011,6021,6025,6035,6046,6056,6068,6072,6082,6086,6090,6098,6102,6110,6116,6125,6129,6133,6143,6153,6160,6165,6169,6173,6182,6193,6204,6214,6224,6232,6237,6253,6258,6262,6266,6275,6285,6295,6306,6316,6324,6336,6348,6361,6365,6369,6373,6383,6388,6393,6403,6410,6415,6420,6425,6435,6446,6451,6455,6459,6465,6469,6474,6480,6486],{"__ignoreMap":32},[77,6006,6007,6009],{"class":79,"line":80},[77,6008,1245],{"class":97},[77,6010,1248],{"class":104},[77,6012,6013,6015,6017,6019],{"class":79,"line":114},[77,6014,1257],{"class":97},[77,6016,1308],{"class":104},[77,6018,1245],{"class":97},[77,6020,1313],{"class":104},[77,6022,6023],{"class":79,"line":136},[77,6024,140],{"emptyLinePlaceholder":139},[77,6026,6027,6029,6031,6033],{"class":79,"line":143},[77,6028,1257],{"class":97},[77,6030,1260],{"class":104},[77,6032,1245],{"class":97},[77,6034,1265],{"class":104},[77,6036,6037,6039,6041,6043],{"class":79,"line":150},[77,6038,1257],{"class":97},[77,6040,1272],{"class":104},[77,6042,1245],{"class":97},[77,6044,6045],{"class":104}," DeclareLaunchArgument, IncludeLaunchDescription\n",[77,6047,6048,6050,6052,6054],{"class":79,"line":162},[77,6049,1257],{"class":97},[77,6051,1284],{"class":104},[77,6053,1245],{"class":97},[77,6055,1289],{"class":104},[77,6057,6058,6060,6063,6065],{"class":79,"line":174},[77,6059,1257],{"class":97},[77,6061,6062],{"class":104}," launch.launch_description_sources ",[77,6064,1245],{"class":97},[77,6066,6067],{"class":104}," PythonLaunchDescriptionSource\n",[77,6069,6070],{"class":79,"line":179},[77,6071,140],{"emptyLinePlaceholder":139},[77,6073,6074,6076,6078,6080],{"class":79,"line":185},[77,6075,1257],{"class":97},[77,6077,1296],{"class":104},[77,6079,1245],{"class":97},[77,6081,1301],{"class":104},[77,6083,6084],{"class":79,"line":197},[77,6085,140],{"emptyLinePlaceholder":139},[77,6087,6088],{"class":79,"line":1348},[77,6089,140],{"emptyLinePlaceholder":139},[77,6091,6092,6094,6096],{"class":79,"line":1363},[77,6093,1322],{"class":97},[77,6095,1325],{"class":83},[77,6097,1328],{"class":104},[77,6099,6100],{"class":79,"line":1368},[77,6101,140],{"emptyLinePlaceholder":139},[77,6103,6104,6106,6108],{"class":79,"line":1379},[77,6105,3097],{"class":104},[77,6107,1336],{"class":97},[77,6109,1376],{"class":104},[77,6111,6112,6114],{"class":79,"line":1388},[77,6113,1382],{"class":87},[77,6115,1385],{"class":104},[77,6117,6118,6120,6122],{"class":79,"line":1402},[77,6119,1392],{"class":1391},[77,6121,1336],{"class":97},[77,6123,6124],{"class":87},"'false'\n",[77,6126,6127],{"class":79,"line":1415},[77,6128,3250],{"class":104},[77,6130,6131],{"class":79,"line":1425},[77,6132,140],{"emptyLinePlaceholder":139},[77,6134,6135,6138,6140],{"class":79,"line":1433},[77,6136,6137],{"class":104},"    amcl_yaml ",[77,6139,1336],{"class":97},[77,6141,6142],{"class":104}," os.path.join(\n",[77,6144,6145,6148,6151],{"class":79,"line":1449},[77,6146,6147],{"class":104},"        get_package_share_directory(",[77,6149,6150],{"class":87},"'mycar_localization'",[77,6152,1446],{"class":104},[77,6154,6155,6158],{"class":79,"line":1463},[77,6156,6157],{"class":87},"        'params'",[77,6159,1385],{"class":104},[77,6161,6162],{"class":79,"line":1475},[77,6163,6164],{"class":87},"        'amcl.yaml'\n",[77,6166,6167],{"class":79,"line":1480},[77,6168,3250],{"class":104},[77,6170,6171],{"class":79,"line":1491},[77,6172,140],{"emptyLinePlaceholder":139},[77,6174,6175,6178,6180],{"class":79,"line":1502},[77,6176,6177],{"class":104},"    amcl_node ",[77,6179,1336],{"class":97},[77,6181,1488],{"class":104},[77,6183,6184,6186,6188,6191],{"class":79,"line":1508},[77,6185,1528],{"class":1391},[77,6187,1336],{"class":97},[77,6189,6190],{"class":87},"'nav2_amcl'",[77,6192,1385],{"class":104},[77,6194,6195,6197,6199,6202],{"class":79,"line":1519},[77,6196,1541],{"class":1391},[77,6198,1336],{"class":97},[77,6200,6201],{"class":87},"'amcl'",[77,6203,1385],{"class":104},[77,6205,6206,6208,6210,6212],{"class":79,"line":1525},[77,6207,1554],{"class":1391},[77,6209,1336],{"class":97},[77,6211,6201],{"class":87},[77,6213,1385],{"class":104},[77,6215,6216,6218,6220,6222],{"class":79,"line":1538},[77,6217,1566],{"class":1391},[77,6219,1336],{"class":97},[77,6221,1571],{"class":87},[77,6223,1385],{"class":104},[77,6225,6226,6228,6230],{"class":79,"line":1551},[77,6227,1494],{"class":1391},[77,6229,1336],{"class":97},[77,6231,1499],{"class":104},[77,6233,6234],{"class":79,"line":1563},[77,6235,6236],{"class":104},"            amcl_yaml,\n",[77,6238,6239,6241,6243,6245,6247,6250],{"class":79,"line":1576},[77,6240,3297],{"class":104},[77,6242,1342],{"class":87},[77,6244,3189],{"class":104},[77,6246,1342],{"class":87},[77,6248,6249],{"class":104},")} ",[77,6251,6252],{"class":146},"# 覆盖掉yaml里的use_sim_time参数,以launch启动的设置为准.\n",[77,6254,6255],{"class":79,"line":1581},[77,6256,6257],{"class":104},"        ]\n",[77,6259,6260],{"class":79,"line":1592},[77,6261,3250],{"class":104},[77,6263,6264],{"class":79,"line":1597},[77,6265,140],{"emptyLinePlaceholder":139},[77,6267,6268,6271,6273],{"class":79,"line":1603},[77,6269,6270],{"class":104},"    manager_localization_node ",[77,6272,1336],{"class":97},[77,6274,1488],{"class":104},[77,6276,6277,6279,6281,6283],{"class":79,"line":1609},[77,6278,1528],{"class":1391},[77,6280,1336],{"class":97},[77,6282,5363],{"class":87},[77,6284,1385],{"class":104},[77,6286,6287,6289,6291,6293],{"class":79,"line":1615},[77,6288,1541],{"class":1391},[77,6290,1336],{"class":97},[77,6292,5375],{"class":87},[77,6294,1385],{"class":104},[77,6296,6297,6299,6301,6304],{"class":79,"line":1620},[77,6298,1554],{"class":1391},[77,6300,1336],{"class":97},[77,6302,6303],{"class":87},"'lifecycle_manager_localization'",[77,6305,1385],{"class":104},[77,6307,6308,6310,6312,6314],{"class":79,"line":2003},[77,6309,1566],{"class":1391},[77,6311,1336],{"class":97},[77,6313,1571],{"class":87},[77,6315,1385],{"class":104},[77,6317,6318,6320,6322],{"class":79,"line":2014},[77,6319,1494],{"class":1391},[77,6321,1336],{"class":97},[77,6323,1499],{"class":104},[77,6325,6326,6328,6330,6332,6334],{"class":79,"line":2027},[77,6327,3297],{"class":104},[77,6329,1342],{"class":87},[77,6331,3189],{"class":104},[77,6333,1342],{"class":87},[77,6335,3306],{"class":104},[77,6337,6338,6340,6342,6344,6346],{"class":79,"line":2041},[77,6339,3297],{"class":104},[77,6341,5425],{"class":87},[77,6343,1666],{"class":104},[77,6345,5325],{"class":1217},[77,6347,5328],{"class":104},[77,6349,6350,6352,6354,6356,6358],{"class":79,"line":2054},[77,6351,3297],{"class":104},[77,6353,5438],{"class":87},[77,6355,4856],{"class":104},[77,6357,6201],{"class":87},[77,6359,6360],{"class":104},"]}\n",[77,6362,6363],{"class":79,"line":2068},[77,6364,6257],{"class":104},[77,6366,6367],{"class":79,"line":2079},[77,6368,3250],{"class":104},[77,6370,6371],{"class":79,"line":2084},[77,6372,140],{"emptyLinePlaceholder":139},[77,6374,6375,6378,6380],{"class":79,"line":2094},[77,6376,6377],{"class":104},"    map_server_launch ",[77,6379,1336],{"class":97},[77,6381,6382],{"class":104}," IncludeLaunchDescription(\n",[77,6384,6385],{"class":79,"line":2105},[77,6386,6387],{"class":104},"        PythonLaunchDescriptionSource(\n",[77,6389,6390],{"class":79,"line":2117},[77,6391,6392],{"class":104},"            os.path.join(\n",[77,6394,6395,6398,6401],{"class":79,"line":2122},[77,6396,6397],{"class":104},"                get_package_share_directory(",[77,6399,6400],{"class":87},"'mycar_map_server'",[77,6402,1446],{"class":104},[77,6404,6405,6408],{"class":79,"line":2133},[77,6406,6407],{"class":87},"                'launch'",[77,6409,1385],{"class":104},[77,6411,6412],{"class":79,"line":2143},[77,6413,6414],{"class":87},"                'map_server.launch.py'\n",[77,6416,6417],{"class":79,"line":2154},[77,6418,6419],{"class":104},"            )\n",[77,6421,6422],{"class":79,"line":2159},[77,6423,6424],{"class":104},"        ),\n",[77,6426,6427,6430,6432],{"class":79,"line":2173},[77,6428,6429],{"class":1391},"        launch_arguments",[77,6431,1336],{"class":97},[77,6433,6434],{"class":104},"{\n",[77,6436,6437,6440,6442,6444],{"class":79,"line":2186},[77,6438,6439],{"class":87},"            'use_sim_time'",[77,6441,3189],{"class":104},[77,6443,1342],{"class":87},[77,6445,1345],{"class":104},[77,6447,6448],{"class":79,"line":2191},[77,6449,6450],{"class":104},"        }.items()\n",[77,6452,6453],{"class":79,"line":2205},[77,6454,3250],{"class":104},[77,6456,6457],{"class":79,"line":2219},[77,6458,140],{"emptyLinePlaceholder":139},[77,6460,6461,6463],{"class":79,"line":2233},[77,6462,1623],{"class":97},[77,6464,3333],{"class":104},[77,6466,6467],{"class":79,"line":2244},[77,6468,3338],{"class":104},[77,6470,6471],{"class":79,"line":2254},[77,6472,6473],{"class":104},"        map_server_launch,\n",[77,6475,6477],{"class":79,"line":6476},64,[77,6478,6479],{"class":104},"        amcl_node,\n",[77,6481,6483],{"class":79,"line":6482},65,[77,6484,6485],{"class":104},"        manager_localization_node,\n",[77,6487,6489],{"class":79,"line":6488},66,[77,6490,3358],{"class":104},[18,6492,6493,6494,6497,6498,6501,6502,6505,6506,6508,6509,6511],{},"在上述代碼中，創建了",[74,6495,6496],{},"amcl","節點，並從",[74,6499,6500],{},"params","目錄加載了名為",[74,6503,6504],{},"amcl.yaml","的配置文件，且由於",[74,6507,6496],{},"也是擁有生命週期的節點，所以將其添加進了生命週期管理器。最後，定位必須依賴於地圖信息，因此又包含了 ",[21,6510,5012],{},"  中的launch文件，以加載地圖。",[18,6513,6514,6515,5194],{},"在params目錄下新建名為",[74,6516,6504],{},[68,6518,6520],{"className":1639,"code":6519,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    use_sim_time: True  # 由launch的设置覆盖\n    alpha1: 0.2\n    alpha2: 0.2\n    alpha3: 0.2\n    alpha4: 0.2\n    alpha5: 0.2\n    base_frame_id: \"base_link\"\n    beam_skip_distance: 0.5\n    beam_skip_error_threshold: 0.9\n    beam_skip_threshold: 0.3\n    do_beamskip: false\n    global_frame_id: \"map\"\n    lambda_short: 0.1\n    laser_likelihood_max_dist: 2.0\n    laser_max_range: 100.0\n    laser_min_range: -1.0\n    laser_model_type: \"likelihood_field\"\n    max_beams: 60\n    max_particles: 2000\n    min_particles: 500\n    odom_frame_id: \"odom\"\n    pf_err: 0.05\n    pf_z: 0.99\n    recovery_alpha_fast: 0.0\n    recovery_alpha_slow: 0.0\n    resample_interval: 1\n    robot_model_type: \"nav2_amcl::DifferentialMotionModel\"\n    save_pose_rate: 0.5\n    sigma_hit: 0.2\n    tf_broadcast: true\n    transform_tolerance: 2.0\n    update_min_a: 0.2\n    update_min_d: 0.25\n    z_hit: 0.5\n    z_max: 0.05\n    z_rand: 0.5\n    z_short: 0.05\n    scan_topic: scan\n    set_initial_pose: false\n",[74,6521,6522,6529,6535,6547,6556,6565,6574,6583,6592,6602,6611,6620,6630,6639,6649,6658,6667,6677,6687,6697,6707,6717,6727,6737,6746,6756,6766,6775,6784,6794,6803,6812,6821,6830,6839,6848,6857,6866,6875,6884,6893],{"__ignoreMap":32},[77,6523,6524,6527],{"class":79,"line":80},[77,6525,6526],{"class":1648},"/**",[77,6528,1651],{"class":104},[77,6530,6531,6533],{"class":79,"line":114},[77,6532,1656],{"class":1648},[77,6534,1651],{"class":104},[77,6536,6537,6540,6542,6544],{"class":79,"line":136},[77,6538,6539],{"class":1648},"    use_sim_time",[77,6541,1666],{"class":104},[77,6543,5325],{"class":1217},[77,6545,6546],{"class":146},"  # 由launch的设置覆盖\n",[77,6548,6549,6552,6554],{"class":79,"line":143},[77,6550,6551],{"class":1648},"    alpha1",[77,6553,1666],{"class":104},[77,6555,1884],{"class":1217},[77,6557,6558,6561,6563],{"class":79,"line":150},[77,6559,6560],{"class":1648},"    alpha2",[77,6562,1666],{"class":104},[77,6564,1884],{"class":1217},[77,6566,6567,6570,6572],{"class":79,"line":162},[77,6568,6569],{"class":1648},"    alpha3",[77,6571,1666],{"class":104},[77,6573,1884],{"class":1217},[77,6575,6576,6579,6581],{"class":79,"line":174},[77,6577,6578],{"class":1648},"    alpha4",[77,6580,1666],{"class":104},[77,6582,1884],{"class":1217},[77,6584,6585,6588,6590],{"class":79,"line":179},[77,6586,6587],{"class":1648},"    alpha5",[77,6589,1666],{"class":104},[77,6591,1884],{"class":1217},[77,6593,6594,6597,6599],{"class":79,"line":185},[77,6595,6596],{"class":1648},"    base_frame_id",[77,6598,1666],{"class":104},[77,6600,6601],{"class":87},"\"base_link\"\n",[77,6603,6604,6607,6609],{"class":79,"line":197},[77,6605,6606],{"class":1648},"    beam_skip_distance",[77,6608,1666],{"class":104},[77,6610,1874],{"class":1217},[77,6612,6613,6616,6618],{"class":79,"line":1348},[77,6614,6615],{"class":1648},"    beam_skip_error_threshold",[77,6617,1666],{"class":104},[77,6619,2241],{"class":1217},[77,6621,6622,6625,6627],{"class":79,"line":1363},[77,6623,6624],{"class":1648},"    beam_skip_threshold",[77,6626,1666],{"class":104},[77,6628,6629],{"class":1217},"0.3\n",[77,6631,6632,6635,6637],{"class":79,"line":1368},[77,6633,6634],{"class":1648},"    do_beamskip",[77,6636,1666],{"class":104},[77,6638,1809],{"class":1217},[77,6640,6641,6644,6646],{"class":79,"line":1379},[77,6642,6643],{"class":1648},"    global_frame_id",[77,6645,1666],{"class":104},[77,6647,6648],{"class":87},"\"map\"\n",[77,6650,6651,6654,6656],{"class":79,"line":1388},[77,6652,6653],{"class":1648},"    lambda_short",[77,6655,1666],{"class":104},[77,6657,1948],{"class":1217},[77,6659,6660,6663,6665],{"class":79,"line":1402},[77,6661,6662],{"class":1648},"    laser_likelihood_max_dist",[77,6664,1666],{"class":104},[77,6666,1842],{"class":1217},[77,6668,6669,6672,6674],{"class":79,"line":1415},[77,6670,6671],{"class":1648},"    laser_max_range",[77,6673,1666],{"class":104},[77,6675,6676],{"class":1217},"100.0\n",[77,6678,6679,6682,6684],{"class":79,"line":1425},[77,6680,6681],{"class":1648},"    laser_min_range",[77,6683,1666],{"class":104},[77,6685,6686],{"class":1217},"-1.0\n",[77,6688,6689,6692,6694],{"class":79,"line":1433},[77,6690,6691],{"class":1648},"    laser_model_type",[77,6693,1666],{"class":104},[77,6695,6696],{"class":87},"\"likelihood_field\"\n",[77,6698,6699,6702,6704],{"class":79,"line":1449},[77,6700,6701],{"class":1648},"    max_beams",[77,6703,1666],{"class":104},[77,6705,6706],{"class":1217},"60\n",[77,6708,6709,6712,6714],{"class":79,"line":1463},[77,6710,6711],{"class":1648},"    max_particles",[77,6713,1666],{"class":104},[77,6715,6716],{"class":1217},"2000\n",[77,6718,6719,6722,6724],{"class":79,"line":1475},[77,6720,6721],{"class":1648},"    min_particles",[77,6723,1666],{"class":104},[77,6725,6726],{"class":1217},"500\n",[77,6728,6729,6732,6734],{"class":79,"line":1480},[77,6730,6731],{"class":1648},"    odom_frame_id",[77,6733,1666],{"class":104},[77,6735,6736],{"class":87},"\"odom\"\n",[77,6738,6739,6742,6744],{"class":79,"line":1491},[77,6740,6741],{"class":1648},"    pf_err",[77,6743,1666],{"class":104},[77,6745,1852],{"class":1217},[77,6747,6748,6751,6753],{"class":79,"line":1502},[77,6749,6750],{"class":1648},"    pf_z",[77,6752,1666],{"class":104},[77,6754,6755],{"class":1217},"0.99\n",[77,6757,6758,6761,6763],{"class":79,"line":1508},[77,6759,6760],{"class":1648},"    recovery_alpha_fast",[77,6762,1666],{"class":104},[77,6764,6765],{"class":1217},"0.0\n",[77,6767,6768,6771,6773],{"class":79,"line":1519},[77,6769,6770],{"class":1648},"    recovery_alpha_slow",[77,6772,1666],{"class":104},[77,6774,6765],{"class":1217},[77,6776,6777,6780,6782],{"class":79,"line":1525},[77,6778,6779],{"class":1648},"    resample_interval",[77,6781,1666],{"class":104},[77,6783,1819],{"class":1217},[77,6785,6786,6789,6791],{"class":79,"line":1538},[77,6787,6788],{"class":1648},"    robot_model_type",[77,6790,1666],{"class":104},[77,6792,6793],{"class":87},"\"nav2_amcl::DifferentialMotionModel\"\n",[77,6795,6796,6799,6801],{"class":79,"line":1551},[77,6797,6798],{"class":1648},"    save_pose_rate",[77,6800,1666],{"class":104},[77,6802,1874],{"class":1217},[77,6804,6805,6808,6810],{"class":79,"line":1563},[77,6806,6807],{"class":1648},"    sigma_hit",[77,6809,1666],{"class":104},[77,6811,1884],{"class":1217},[77,6813,6814,6817,6819],{"class":79,"line":1576},[77,6815,6816],{"class":1648},"    tf_broadcast",[77,6818,1666],{"class":104},[77,6820,1916],{"class":1217},[77,6822,6823,6826,6828],{"class":79,"line":1581},[77,6824,6825],{"class":1648},"    transform_tolerance",[77,6827,1666],{"class":104},[77,6829,1842],{"class":1217},[77,6831,6832,6835,6837],{"class":79,"line":1592},[77,6833,6834],{"class":1648},"    update_min_a",[77,6836,1666],{"class":104},[77,6838,1884],{"class":1217},[77,6840,6841,6844,6846],{"class":79,"line":1597},[77,6842,6843],{"class":1648},"    update_min_d",[77,6845,1666],{"class":104},[77,6847,4902],{"class":1217},[77,6849,6850,6853,6855],{"class":79,"line":1603},[77,6851,6852],{"class":1648},"    z_hit",[77,6854,1666],{"class":104},[77,6856,1874],{"class":1217},[77,6858,6859,6862,6864],{"class":79,"line":1609},[77,6860,6861],{"class":1648},"    z_max",[77,6863,1666],{"class":104},[77,6865,1852],{"class":1217},[77,6867,6868,6871,6873],{"class":79,"line":1615},[77,6869,6870],{"class":1648},"    z_rand",[77,6872,1666],{"class":104},[77,6874,1874],{"class":1217},[77,6876,6877,6880,6882],{"class":79,"line":1620},[77,6878,6879],{"class":1648},"    z_short",[77,6881,1666],{"class":104},[77,6883,1852],{"class":1217},[77,6885,6886,6888,6890],{"class":79,"line":2003},[77,6887,1758],{"class":1648},[77,6889,1666],{"class":104},[77,6891,6892],{"class":87},"scan\n",[77,6894,6895,6898,6900],{"class":79,"line":2014},[77,6896,6897],{"class":1648},"    set_initial_pose",[77,6899,1666],{"class":104},[77,6901,1809],{"class":1217},[18,6903,6904,6905,6907],{},"關於參數的具體含義，可以參考 ",[21,6906,5536],{}," 中參數相關內容。",[18,6909,6910],{},[21,6911,6912],{},"3.編輯配置文件",[18,6914,2272,6915,2276],{},[74,6916,2275],{},[68,6918,6919],{"className":2279,"code":2280,"language":2281,"meta":32,"style":32},[74,6920,6921,6927,6933],{"__ignoreMap":32},[77,6922,6923,6925],{"class":79,"line":80},[77,6924,2288],{"class":97},[77,6926,2291],{"class":104},[77,6928,6929,6931],{"class":79,"line":114},[77,6930,2296],{"class":104},[77,6932,2299],{"class":97},[77,6934,6935],{"class":79,"line":136},[77,6936,1345],{"class":104},[18,6938,6939],{},[21,6940,6941],{},"4.編譯",[18,6943,2311],{},[68,6945,6947],{"className":70,"code":6946,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_localization\n",[74,6948,6949],{"__ignoreMap":32},[77,6950,6951,6953,6955,6957],{"class":79,"line":80},[77,6952,2321],{"class":83},[77,6954,2324],{"class":87},[77,6956,2327],{"class":1217},[77,6958,6959],{"class":87}," mycar_localization\n",[18,6961,6962],{},[21,6963,6964],{},"5.執行",[18,6966,4001],{},[68,6968,6969],{"className":70,"code":2343,"language":72,"meta":32,"style":32},[74,6970,6971,6977],{"__ignoreMap":32},[77,6972,6973,6975],{"class":79,"line":80},[77,6974,2350],{"class":1217},[77,6976,2353],{"class":87},[77,6978,6979,6981,6983,6985],{"class":79,"line":114},[77,6980,1205],{"class":83},[77,6982,2360],{"class":87},[77,6984,2363],{"class":87},[77,6986,2366],{"class":87},[18,6988,4024],{},[68,6990,6992],{"className":70,"code":6991,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_localization mycar_loca.launch.py use_sim_time:=True\n",[74,6993,6994,7000],{"__ignoreMap":32},[77,6995,6996,6998],{"class":79,"line":80},[77,6997,2350],{"class":1217},[77,6999,2353],{"class":87},[77,7001,7002,7004,7006,7008,7011],{"class":79,"line":114},[77,7003,1205],{"class":83},[77,7005,2360],{"class":87},[77,7007,5980],{"class":87},[77,7009,7010],{"class":87}," mycar_loca.launch.py",[77,7012,2396],{"class":87},[18,7014,7015],{},"（3）啟動鍵盤控制節點以作備用：",[68,7017,7019],{"className":70,"code":7018,"language":72,"meta":32,"style":32},"ros2 run teleop_twist_keyboard teleop_twist_keyboard\n",[74,7020,7021],{"__ignoreMap":32},[77,7022,7023,7025,7027,7030],{"class":79,"line":80},[77,7024,1205],{"class":83},[77,7026,4257],{"class":87},[77,7028,7029],{"class":87}," teleop_twist_keyboard",[77,7031,7032],{"class":87}," teleop_twist_keyboard\n",[18,7034,7035,7036,7038],{},"（4）在rviz2中，將Fixed Frme設置為map，添加TF插件，按照 ",[21,7037,5012],{},"  添加並顯示地圖。",[18,7040,7041,7042,7045],{},"接下來，點擊rviz2菜單欄的",[74,7043,7044],{},"2D Pose Estimate","在地圖中為機器人設置一個初始位姿。",[18,7047,7048],{},"這裡需要給一個大概的機器人位置和機器人的朝向，不是很準確也可以，機器人會在運動中逐漸通過AMCL校準。",[18,7050,7051,7052,7054],{},"先點擊",[74,7053,7044],{},"，左鍵在地圖上點擊機器人所在位置，長摁別鬆手，鼠標往機器人朝向的位置劃，出現下方這種綠色箭頭，再鬆手即可。",[18,7056,7057],{},[30,7058],{"alt":32,"src":7059},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1758.webp",[18,7061,7062,7063,7066,7067,7069,7070,7073,7074,7077],{},"再添加",[74,7064,7065],{},"ParticleCloud","插件，將話題設置為",[74,7068,5635],{},"，並將話題下",[74,7071,7072],{},"Reliability Policy","設置為",[74,7075,7076],{},"Best Effort","，最後使用鍵盤控制機器人運動時，會發現，機器人周邊會出現點雲，並且隨著機器人的運動，點雲會出現不同程度的收斂或發散。",[18,7079,7080],{},[30,7081],{"alt":32,"src":7082},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1759.webp",[18,7084,7085],{},[30,7086],{"alt":32,"src":7087},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1760.webp",[18,7089,7090],{},[30,7091],{"alt":32,"src":7092},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1761.webp",[18,7094,7095],{},"即便你的機器人撞牆了，rviz2和Gazebo的機器人位置完全偏移了，只要再讓機器人運動一會兒，機器人位置會被重新預估出來，AMCL非常強。",[18,7097,7098],{},[30,7099],{"alt":32,"src":7100},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1762.webp",[18,7102,7103],{},"如上圖位置已經完全偏移了。",[18,7105,7106],{},[30,7107],{"alt":32,"src":7108},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1763.webp",[18,7110,7111],{},"經過一段時間行駛，姿態位置再次被預估成功。",[10,7113,7114],{"id":7114},"導航服務器",[18,7116,7117],{},"本節將介紹導航服務器中核心節點，實現基本導航功能，並將導航與SLAM集成，以實現自主探索建圖。",[18,7119,7120,7121,7124],{},"下方網站是官方NAV2的各個節點的參數說明(",[21,7122,7123],{},"調參的時候非常常用的網站","):",[18,7126,7127],{},[289,7128,291],{"href":291,"rel":7129},[293],[18,7131,7132],{},"看不懂的英文可以用沉浸式翻譯這個chrome插件來翻譯,可以進行中英文對照翻譯,非常好用.",[18,7134,7135],{},[289,7136,7137],{"href":7137,"rel":7138},"https://chromewebstore.google.com/detail/immersive-translate-trans/bpoadfkcbjbfhfodiogcnhhhpibjhbnh?utm%5C_source=official&pli=1",[293],[18,7140,7141],{},[289,7142,7143],{"href":7143,"rel":7144},"https://microsoftedge.microsoft.com/addons/detail/immersive-translate-tra/amkbmndfnliijdhojkpoglbnaaahippg",[293],[18,7146,7147],{},[30,7148],{"alt":32,"src":7149},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1764.webp",[18,7151,7152],{},[30,7153],{"alt":32,"src":7154},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1765.webp",[18,7156,7157],{},"不會用這個插件的話,也可以看魚香ROS翻譯好的版本(但是網站不穩定):",[18,7159,7160],{},[289,7161,7162],{"href":7162,"rel":7163},"http://fishros.org/doc/nav2/configuration/index.html",[293],[14,7165,7166],{"id":7166},"生命週期管理節點說明",[18,7168,7169,7170,7172,7173,7175,7176,7178,7179,7181],{},"Nav2中通過的",[74,7171,5463],{},"功能包下的",[74,7174,5467],{},"節點管理其他節點的生命週期狀態轉換。",[74,7177,5467],{},"節點通過ROS 2的生命週期節點（Lifecycle Node）機制，提供了一種標準化的方法來控制Nav2中各個節點的狀態轉換。這些狀態包括未配置（Unconfigured）、非活動（Inactive）、活動（Active）和結束（Finalized）等。通過精細控制這些狀態轉換，",[74,7180,5467],{},"節點能夠確保Nav2系統的各個部分在正確的時機啟動、運行和停止，從而提高系統的可靠性和穩定性。",[18,7183,7184],{},[21,7185,827],{},[46,7187,7188,7197,7206,7214,7220,7226,7240,7246],{},[49,7189,7190,7193,7194,7196],{},[74,7191,7192],{},"/bond_disable_heartbeat_timeout",": 該參數與節點之間的通信綁定（bonding）有關。節點之間的通信可以通過綁定來增強可靠性，而心跳超時是檢測節點是否仍然活躍的一種方式。設置為",[74,7195,5816],{},"意味著啟用心跳超時檢測。",[49,7198,7199,7202,7203,7205],{},[74,7200,7201],{},"attempt_respawn_reconnection",": 取值為bool值，設置為",[74,7204,2022],{},"時，表示如果管理的節點意外終止，生命週期管理器將嘗試重新啟動它。",[49,7207,7208,7202,7211,7213],{},[74,7209,7210],{},"autostart",[74,7212,2022],{},"時，表示在生命週期管理器啟動時，它將自動嘗試啟動其管理的節點。",[49,7215,7216,7219],{},[74,7217,7218],{},"bond_respawn_max_duration",": 重新連接或重新啟動節點時的最大持續時間。",[49,7221,7222,7225],{},[74,7223,7224],{},"bond_timeout",": 與節點之間的通信綁定超時有關。如果在這個時間內沒有收到來自另一個節點的消息，則認為該節點已經斷開連接。",[49,7227,7228,7231,7232],{},[74,7229,7230],{},"diagnostic_updater",":",[46,7233,7234],{},[49,7235,7236,7239],{},[74,7237,7238],{},"period",": 診斷更新器的更新週期。診斷更新器用於收集和發佈有關節點狀態的診斷信息，定義了這些信息更新的頻率。",[49,7241,7242,7245],{},[74,7243,7244],{},"node_names",": 由該生命週期管理器管理的節點名稱列表。",[49,7247,7248,7250],{},[74,7249,5758],{},":是否使用仿真實踐。",[14,7252,7253],{"id":7253},"行為樹節點說明",[18,7255,7256,7259,7260,7172,7263,7266],{},[21,7257,7258],{},"行為樹（BT）"," 是一種在智能體（如機器人或電腦遊戲中的虛擬實體）中構建不同任務之間切換結構的方式。它是一種形式化的圖形建模語言，以層次化的節點組織為特徵，用於描述和規劃複雜系統中各種實體的交互和決策。",[74,7261,7262],{},"nav2_bt_navigator",[74,7264,7265],{},"/bt_navigator","是Nav2中的行為樹導航器節點，它實現了基於行為樹的導航策略。行為樹是一種用於描述複雜行為的樹狀結構，通過組合不同的行為節點，可以靈活地定義機器人的導航行為，包括路徑規劃、避障、恢復等。以下是官網。",[18,7268,7269],{},[289,7270,7271],{"href":7271,"rel":7272},"https://www.behaviortree.dev/",[293],[18,7274,7275],{},[289,7276,7277],{"href":7277,"rel":7278},"https://arxiv.org/abs/1709.00084",[293],[18,7280,7281],{},"github鏈接如下：",[18,7283,7284],{},[289,7285,7286],{"href":7286,"rel":7287},"https://github.com/BehaviorTree/BehaviorTree.CPP",[293],[18,7289,7290],{},"BT可視化工具Groot2下載：",[18,7292,7293],{},[289,7294,7295],{"href":7295,"rel":7296},"https://www.behaviortree.dev/groot/",[293],[312,7298,7299],{},[49,7300,533],{},[535,7302,7303,7313],{},[538,7304,7305],{},[541,7306,7307,7309,7311],{},[544,7308,547],{"align":546},[544,7310,4130],{"align":546},[544,7312,553],{"align":546},[555,7314,7315,7326,7335],{},[541,7316,7317,7320,7323],{},[560,7318,7319],{"align":546},"/goal_pose",[560,7321,7322],{"align":546},"geometry_msgs/msg/PoseStamped",[560,7324,7325],{"align":546},"導航目標點，用於觸發導航任務",[541,7327,7328,7330,7332],{},[560,7329,573],{"align":546},[560,7331,576],{"align":546},[560,7333,7334],{"align":546},"座標變換消息，用於不同座標系之間的轉換",[541,7336,7337,7339,7341],{},[560,7338,2741],{"align":546},[560,7340,2744],{"align":546},[560,7342,7343],{"align":546},"里程計數據，提供機器人位置和運動信息",[312,7345,7346],{"start":114},[49,7347,7348],{},"請求的Action",[535,7350,7351,7362],{},[538,7352,7353],{},[541,7354,7355,7358,7360],{},[544,7356,7357],{"align":546},"Action",[544,7359,4130],{"align":546},[544,7361,553],{"align":546},[555,7363,7364],{},[541,7365,7366,7369,7372],{},[560,7367,7368],{"align":546},"/navigate_to_pose",[560,7370,7371],{"align":546},"nav2_msgs/action/NavigateToPose",[560,7373,7374],{"align":546},"請求導航到指定位姿的Action，包括目標位姿和容忍度等參數",[312,7376,7377],{"start":136},[49,7378,827],{},[46,7380,7381,7386,7392,7398,7404,7410,7416,7422,7428,7434],{},[49,7382,7383,7385],{},[74,7384,5758],{},": 指定是否使用模擬時間而非實際時間。",[49,7387,7388,7391],{},[74,7389,7390],{},"global_frame",": 定義全局座標系的名稱，通常為地圖座標系。",[49,7393,7394,7397],{},[74,7395,7396],{},"robot_base_frame",": 指定機器人基座的座標系名稱。",[49,7399,7400,7403],{},[74,7401,7402],{},"odom_topic",": 里程計數據的ROS話題名稱。",[49,7405,7406,7409],{},[74,7407,7408],{},"bt_loop_duration",": 行為樹執行循環的持續時間（單位可能根據實現而異）。",[49,7411,7412,7415],{},[74,7413,7414],{},"default_server_timeout",": 導航服務器操作的默認超時時間。",[49,7417,7418,7421],{},[74,7419,7420],{},"enable_groot_monitoring",": 啟用或禁用Groot監控功能。",[49,7423,7424,7427],{},[74,7425,7426],{},"groot_zmq_publisher_port",": Groot監控中ZeroMQ發佈者的端口號。",[49,7429,7430,7433],{},[74,7431,7432],{},"groot_zmq_server_port",": Groot監控中ZeroMQ服務器的端口號。",[49,7435,7436,7439],{},[74,7437,7438],{},"plugin_lib_names",": 包含導航所需插件的庫名稱列表。",[14,7441,7442],{"id":7442},"規劃器節點說明",[18,7444,7445,7446,7172,7449,7452,7453,7456],{},"在Nav2 導航框架中",[74,7447,7448],{},"nav2_planner",[74,7450,7451],{},"planner_server","節點，負責處理路徑規劃請求，生成從當前位置到目標位置的路徑。該節點在執行時需要依賴於",[74,7454,7455],{},"/global_costmap/global_costmap","節點提供的地圖消息。",[312,7458,7459],{},[49,7460,7461],{},"planner_server發佈的話題",[535,7463,7464,7474],{},[538,7465,7466],{},[541,7467,7468,7470,7472],{},[544,7469,547],{"align":546},[544,7471,4130],{"align":546},[544,7473,553],{"align":546},[555,7475,7476],{},[541,7477,7478,7481,7484],{},[560,7479,7480],{"align":546},"/plan",[560,7482,7483],{"align":546},"nav_msgs/msg/Path",[560,7485,7486],{"align":546},"當前位置到目標點的全局路徑",[312,7488,7489],{"start":114},[49,7490,7491],{},"planner_server 參數",[46,7493,7494,7502,7540,7546,7555],{},[49,7495,7496,7498,7499,7501],{},[74,7497,7192],{},": 這個參數控制是否禁用心跳超時檢測，在ROS 2中，節點之間的通信綁定（bonding）機制用於增強通信的可靠性。心跳超時是檢測節點是否仍然活躍的一種機制。如果該參數設置為",[74,7500,2022],{},"，則表示禁用了心跳超時檢測，這可能在某些特定的網絡環境下或當確信節點間通信非常穩定時使用。",[49,7503,7504,7507,7508],{},[74,7505,7506],{},"GridBased",": 這是一個配置塊，專門用於設置基於網格的規劃器的參數。基於網格的規劃器通常使用地圖的網格化表示來規劃路徑。",[46,7509,7510,7516,7522,7528,7534],{},[49,7511,7512,7515],{},[74,7513,7514],{},"allow_unknown",": 控制規劃器是否允許在地圖的未知（即未探索）區域中規劃路徑。",[49,7517,7518,7521],{},[74,7519,7520],{},"plugin",": 指定使用的規劃器插件。",[49,7523,7524,7527],{},[74,7525,7526],{},"tolerance",": 設置規劃路徑時的容忍度，通常用於考慮機器人尺寸和定位的不確定性。",[49,7529,7530,7533],{},[74,7531,7532],{},"use_astar",": 控制是否使用A* 算法進行路徑規劃*。A** 算法是一種啟發式搜索算法，能夠找到從起點到終點的最短路徑。",[49,7535,7536,7539],{},[74,7537,7538],{},"use_final_approach_orientation",": 控制規劃器是否在路徑的終點附近考慮機器人的最終朝向。",[49,7541,7542,7545],{},[74,7543,7544],{},"expected_planner_frequency",": 這個參數表示對規劃器生成新路徑的頻率的預期值。它幫助系統監控規劃器的性能，並可能用於調試或性能優化。",[49,7547,7548,7551,7552,7554],{},[74,7549,7550],{},"planner_plugins",": 這是一個列表，指定了可用的規劃器插件。在這個例子中，它只包含了一個",[74,7553,7506],{},"規劃器，但理論上可以包含多個不同類型的規劃器，以適應不同的導航需求。",[49,7556,7557,7559,7560,7562],{},[74,7558,5758],{},": 這個參數控制是否使用模擬時間。在仿真環境中，時間是由仿真軟件控制的，而不是由實際的物理時鐘控制的。將此參數設置為",[74,7561,2022],{},"允許節點在仿真環境中正常運行，而無需依賴實際的系統時間。這對於開發和測試導航算法非常有用。",[312,7564,7565],{"start":136},[49,7566,7567],{},"/global_costmap/global_costmap訂閱的話題",[535,7569,7570,7580],{},[538,7571,7572],{},[541,7573,7574,7576,7578],{},[544,7575,547],{"align":546},[544,7577,4130],{"align":546},[544,7579,553],{"align":546},[555,7581,7582,7593,7602],{},[541,7583,7584,7587,7590],{},[560,7585,7586],{"align":546},"/global_costmap/footprint",[560,7588,7589],{"align":546},"geometry_msgs/msg/Polygon",[560,7591,7592],{"align":546},"機器人（或任何移動平臺）的足跡（footprint）信息。足跡是機器人在地圖上佔據的空間形狀，通常用多邊形表示。",[541,7594,7595,7597,7599],{},[560,7596,687],{"align":546},[560,7598,690],{"align":546},[560,7600,7601],{"align":546},"發佈環境地圖，特別是用於導航的佔用網格圖（Occupancy Grid Map）。",[541,7603,7604,7606,7608],{},[560,7605,562],{"align":546},[560,7607,565],{"align":546},[560,7609,7610],{"align":546},"激光掃描數據。",[312,7612,7613],{"start":143},[49,7614,7615],{},"/global_costmap/global_costmap發佈的話題",[535,7617,7618,7628],{},[538,7619,7620],{},[541,7621,7622,7624,7626],{},[544,7623,547],{"align":546},[544,7625,4130],{"align":546},[544,7627,553],{"align":546},[555,7629,7630,7640,7651,7662],{},[541,7631,7632,7635,7637],{},[560,7633,7634],{"align":546},"/global_costmap/costmap",[560,7636,690],{"align":546},[560,7638,7639],{"align":546},"發佈全局代價地圖的當前狀態。",[541,7641,7642,7645,7648],{},[560,7643,7644],{"align":546},"/global_costmap/costmap_raw",[560,7646,7647],{"align":546},"nav2_msgs/msg/Costmap",[560,7649,7650],{"align":546},"未經進一步處理的原始代價地圖數據。",[541,7652,7653,7656,7659],{},[560,7654,7655],{"align":546},"/global_costmap/costmap_updates",[560,7657,7658],{"align":546},"map_msgs/msg/OccupancyGridUpdate",[560,7660,7661],{"align":546},"全局代價地圖的更新，該消息可以高效更新地圖。",[541,7663,7664,7667,7670],{},[560,7665,7666],{"align":546},"/global_costmap/published_footprint",[560,7668,7669],{"align":546},"geometry_msgs/msg/PolygonStamped",[560,7671,7672],{"align":546},"發佈機器人的足跡（footprint），即機器人在地圖上佔據的空間形狀。",[312,7674,7675],{"start":150},[49,7676,7677],{},"/global_costmap/global_costmap參數",[46,7679,7680,7685,7691,7697,7703,7709,7715,7720,7729,7772,7778,7783,7789,7839,7848,7854,7860,7865,7870,7876,7882,7921,7927,7932,7938,7944,7950,7956,7961],{},[49,7681,7682,7684],{},[74,7683,7192],{},": 控制是否禁用心跳超時檢測，這在節點間通信綁定時用於監控對方節點的活躍度。",[49,7686,7687,7690],{},[74,7688,7689],{},"always_send_full_costmap",": 控制是否總是發送完整的代價地圖信息，而不是僅發送變化的部分。",[49,7692,7693,7696],{},[74,7694,7695],{},"clearable_layers",": 列出可以被清除的代價圖層，這些圖層中的障礙物信息可以通過某種方式（如傳感器數據）被更新或清除。",[49,7698,7699,7702],{},[74,7700,7701],{},"filters",": 定義應用於代價地圖的過濾器列表，用於預處理或修改地圖數據。",[49,7704,7705,7708],{},[74,7706,7707],{},"footprint",": 指定機器人在地圖上的足跡形狀，即機器人佔據的空間範圍。",[49,7710,7711,7714],{},[74,7712,7713],{},"footprint_padding",": 為機器人的足跡添加額外的填充空間，以考慮機器人運動時的額外空間需求。",[49,7716,7717,7719],{},[74,7718,7390],{},": 定義全局代價地圖所使用的參考座標系。",[49,7721,7722,2677,7725,7728],{},[74,7723,7724],{},"height",[74,7726,7727],{},"width",": 定義全局代價地圖的高度和寬度（以單元格數計）。",[49,7730,7731,7734,7735],{},[74,7732,7733],{},"inflation_layer",": 配置膨脹層的參數，膨脹層用於在障礙物周圍增加一定寬度的“緩衝區”，以避免機器人與障礙物過近。",[46,7736,7737,7743,7749,7755,7761,7767],{},[49,7738,7739,7742],{},[74,7740,7741],{},"cost_scaling_factor",": 膨脹成本的縮放因子。",[49,7744,7745,7748],{},[74,7746,7747],{},"enabled",": 控制膨脹層是否啟用。",[49,7750,7751,7754],{},[74,7752,7753],{},"inflate_around_unknown",": 控制是否在未知空間周圍進行膨脹。",[49,7756,7757,7760],{},[74,7758,7759],{},"inflate_unknown",": 控制是否將未知空間視為障礙物並進行膨脹。",[49,7762,7763,7766],{},[74,7764,7765],{},"inflation_radius",": 膨脹的半徑。",[49,7768,7769,7771],{},[74,7770,7520],{},": 指定使用的膨脹層插件。",[49,7773,7774,7777],{},[74,7775,7776],{},"lethal_cost_threshold",": 定義代價地圖中視為“致命”障礙物的成本閾值。",[49,7779,7780,7782],{},[74,7781,5915],{},": 指定訂閱以獲取地圖信息的ROS話題。",[49,7784,7785,7788],{},[74,7786,7787],{},"observation_sources",": 定義代價地圖的觀測源，即哪些傳感器或數據源用於更新地圖。",[49,7790,7791,7794,7795],{},[74,7792,7793],{},"obstacle_layer",": 配置障礙物層的參數，障礙物層負責處理傳感器觀測到的障礙物信息。",[46,7796,7797,7803,7808,7814,7823,7828,7833],{},[49,7798,7799,7802],{},[74,7800,7801],{},"combination_method",": 定義如何組合多個觀測源的信息。",[49,7804,7805,7807],{},[74,7806,7747],{},": 控制障礙物層是否啟用。",[49,7809,7810,7813],{},[74,7811,7812],{},"footprint_clearing_enabled",": 控制是否清除機器人足跡內的障礙物信息。",[49,7815,7816,2677,7819,7822],{},[74,7817,7818],{},"max_obstacle_height",[74,7820,7821],{},"min_obstacle_height",": 定義障礙物的高度範圍。",[49,7824,7825,7827],{},[74,7826,7787],{},": 指定障礙物信息的來源。",[49,7829,7830,7832],{},[74,7831,7520],{},": 指定使用的障礙物層插件。",[49,7834,7835,7838],{},[74,7836,7837],{},"scan",": 包含與激光掃描相關的配置，如掃描數據的處理方式。",[49,7840,7841,2677,7844,7847],{},[74,7842,7843],{},"origin_x",[74,7845,7846],{},"origin_y",": 定義全局代價地圖原點的座標。",[49,7849,7850,7853],{},[74,7851,7852],{},"plugins",": 列出啟用的代價地圖插件，這些插件定義瞭如何構建和更新代價地圖。",[49,7855,7856,7859],{},[74,7857,7858],{},"publish_frequency",": 定義發佈代價地圖的頻率。",[49,7861,7862,7864],{},[74,7863,982],{},": 定義代價地圖的分辨率，即每個單元格代表的實際物理尺寸。",[49,7866,7867,7869],{},[74,7868,7396],{},": 定義機器人基座的參考座標系。",[49,7871,7872,7875],{},[74,7873,7874],{},"robot_radius",": 定義機器人的半徑，用於計算機器人在地圖上的佔用空間。",[49,7877,7878,7881],{},[74,7879,7880],{},"rolling_window",": 控制是否使用滾動窗口（即動態變化的地圖區域）而非固定大小的地圖。",[49,7883,7884,7887,7888],{},[74,7885,7886],{},"static_layer",": 配置靜態層的參數，靜態層負責處理地圖中的靜態障礙物信息。",[46,7889,7890,7895,7900,7905,7910,7916],{},[49,7891,7892,7894],{},[74,7893,7747],{},": 控制靜態層是否啟用。",[49,7896,7897,7899],{},[74,7898,4172],{},": 控制是否訂閱瞬態本地地圖更新。",[49,7901,7902,7904],{},[74,7903,5915],{},": 指定靜態地圖的ROS話題（如果不同於全局地圖）。",[49,7906,7907,7909],{},[74,7908,7520],{},": 指定使用的靜態層插件。",[49,7911,7912,7915],{},[74,7913,7914],{},"subscribe_to_updates",": 控制是否訂閱地圖更新。",[49,7917,7918,7920],{},[74,7919,5752],{},": 定義座標變換的容忍度。",[49,7922,7923,7926],{},[74,7924,7925],{},"track_unknown_space",": 控制是否跟蹤地圖中的未知空間。",[49,7928,7929,7931],{},[74,7930,5752],{},": 定義在座標變換過程中允許的誤差範圍。",[49,7933,7934,7937],{},[74,7935,7936],{},"trinary_costmap",": 控制是否使用三態代價地圖（空閒、佔用、未知），而不是僅使用二態（空閒、佔用）。",[49,7939,7940,7943],{},[74,7941,7942],{},"unknown_cost_value",": 定義在代價地圖中表示未知空間的值。",[49,7945,7946,7949],{},[74,7947,7948],{},"update_frequency",": 定義更新代價地圖的頻率。",[49,7951,7952,7955],{},[74,7953,7954],{},"use_maximum",": 控制是否使用多個觀測源中的最大值來更新代價地圖。",[49,7957,7958,7960],{},[74,7959,5758],{},": 控制是否使用仿真時間（在仿真環境中很有用）。",[49,7962,7963,7966,7967],{},[74,7964,7965],{},"voxel_layer",": 配置體素層的參數，體素層使用體素網格來表示三維空間中的障礙物信息。",[46,7968,7969,7974,7979,7988,7995,8000,8006,8011,8017,8021],{},[49,7970,7971,7973],{},[74,7972,7747],{},": 控制體素層是否啟用。",[49,7975,7976,7978],{},[74,7977,7812],{},": 控制是否清除機器人足跡內的體素信息。",[49,7980,7981,2677,7984,7987],{},[74,7982,7983],{},"mark_threshold",[74,7985,7986],{},"unknown_threshold",": 定義將體素視為障礙物或未知的閾值。",[49,7989,7990,2677,7992,7994],{},[74,7991,7818],{},[74,7993,7821],{},": 定義體素表示的障礙物的高度範圍。",[49,7996,7997,7999],{},[74,7998,7787],{},": 指定體素信息的來源。",[49,8001,8002,8005],{},[74,8003,8004],{},"origin_z",": 定義體素網格在Z軸上的原點。",[49,8007,8008,8010],{},[74,8009,7520],{},": 指定使用的體素層插件。",[49,8012,8013,8016],{},[74,8014,8015],{},"publish_voxel_map",": 控制是否發佈體素地圖。",[49,8018,8019,7838],{},[74,8020,7837],{},[49,8022,8023,2677,8026,8029],{},[74,8024,8025],{},"z_resolution",[74,8027,8028],{},"z_voxels",": 定義體素網格在Z軸上的分辨率和體素數。",[14,8031,8032],{"id":8032},"控制器節點說明",[18,8034,8035,8036,8039,8040,8043,8044,8046,8047,7456],{},"在Nav2導航系統中",[74,8037,8038],{},"nav2_controller","功能包的",[74,8041,8042],{},"controller_server","負責處理導航任務中的控制請求，確保機器人能夠按照規劃的路徑進行移動。其主要功能是根據",[74,8045,7448],{},"模塊計算出的全局或局部路徑，生成速度、方向控制的命令，即控制機器人沿著規劃好的路徑行走。該節點在執行時還需要依賴於",[74,8048,8049],{},"/local_costmap/local_costmap",[18,8051,8052],{},[21,8053,8054],{},"1.controller_server訂閱的話題",[535,8056,8057,8067],{},[538,8058,8059],{},[541,8060,8061,8063,8065],{},[544,8062,547],{"align":546},[544,8064,4130],{"align":546},[544,8066,553],{"align":546},[555,8068,8069,8078],{},[541,8070,8071,8073,8075],{},[560,8072,2741],{"align":546},[560,8074,2744],{"align":546},[560,8076,8077],{"align":546},"機器人的里程計信息，包含位置、速度和姿態",[541,8079,8080,8083,8086],{},[560,8081,8082],{"align":546},"/speed_limit",[560,8084,8085],{"align":546},"nav2_msgs/msg/SpeedLimit",[560,8087,8088],{"align":546},"導航過程中的速度限制信息，用於動態調整機器人的移動速度",[18,8090,8091],{},[21,8092,8093],{},"2.controller_server發佈的話題",[535,8095,8096,8108],{},[538,8097,8098],{},[541,8099,8100,8103,8106],{},[544,8101,8102],{"align":546},"話題名稱",[544,8104,8105],{"align":546},"消息類型",[544,8107,553],{"align":546},[555,8109,8110,8121,8132,8142,8153,8163],{},[541,8111,8112,8115,8118],{},[560,8113,8114],{"align":546},"/cmd_vel_nav",[560,8116,8117],{"align":546},"geometry_msgs/msg/Twist",[560,8119,8120],{"align":546},"發佈控制命令，包括線性和角速度，用於控制機器人按照規劃路徑移動。",[541,8122,8123,8126,8129],{},[560,8124,8125],{"align":546},"/cost_cloud",[560,8127,8128],{"align":546},"sensor_msgs/msg/PointCloud2",[560,8130,8131],{"align":546},"發佈成本地圖中的點雲數據，用於避障和路徑規劃。",[541,8133,8134,8137,8139],{},[560,8135,8136],{"align":546},"/local_plan",[560,8138,7483],{"align":546},[560,8140,8141],{"align":546},"發佈局部路徑規劃結果，即機器人應如何到達當前目標點附近的一個點。",[541,8143,8144,8147,8150],{},[560,8145,8146],{"align":546},"/marker",[560,8148,8149],{"align":546},"visualization_msgs/msg/MarkerArray",[560,8151,8152],{"align":546},"發佈可視化標記，用於在RViz等可視化工具中顯示路徑、障礙物等信息。",[541,8154,8155,8158,8160],{},[560,8156,8157],{"align":546},"/received_global_plan",[560,8159,7483],{"align":546},[560,8161,8162],{"align":546},"發佈從全局規劃器接收到的全局路徑，即當前位置到目標點的路徑。",[541,8164,8165,8168,8170],{},[560,8166,8167],{"align":546},"/transformed_global_plan",[560,8169,7483],{"align":546},[560,8171,8172],{"align":546},"發佈經過座標變換的全局路徑，確保路徑與機器人的當前座標系一致。",[18,8174,8175],{},[21,8176,8177],{},"3.controller_server參數",[46,8179,8180,8214,8217,8220,8223,8226,8229,8232,8235,8238,8241,8244],{},[49,8181,8182,8183],{},"FollowPath: 這個部分定義了一個名為FollowPath的插件或配置集，它可能是一個路徑跟隨行為或算法的配置。它包含了多個子參數和子配置，用於定義如何跟隨路徑。",[46,8184,8185,8199,8202,8205,8208,8211],{},[49,8186,8187,8188],{},"BaseObstacle: 定義了基本的障礙物評估參數，用於在路徑跟隨過程中避免障礙物。",[46,8189,8190,8193,8196],{},[49,8191,8192],{},"class: 指定了類的名稱，這裡是BaseObstacle，表示這是一個基本障礙物評估組件。",[49,8194,8195],{},"scale: 定義了該障礙物評估在整體評估中的權重或影響程度。",[49,8197,8198],{},"sum_scores: 指示是否累加多個障礙物的分數，false可能表示使用最大值或其他邏輯。",[49,8200,8201],{},"GoalAlign, GoalDist, PathAlign, PathDist, RotateToGoal, Oscillation: 這些都是路徑跟隨過程中的不同評估或行為組件，每個都有其特定的參數和用途，如對齊目標、保持與目標或路徑的距離、減少振盪等。",[49,8203,8204],{},"acc_lim_theta, acc_lim_x, acc_lim_y: 這些參數定義了機器人在不同方向上的加速度限制。",[49,8206,8207],{},"critics: 指定了哪些評估組件（或“批評家”）將被用於路徑跟隨決策。",[49,8209,8210],{},"debug_trajectory_details: 指示是否發佈軌跡的詳細調試信息。",[49,8212,8213],{},"其他與速度、加速度、時間粒度、軌跡生成等相關的參數，共同定義了路徑跟隨算法的行為和性能。",[49,8215,8216],{},"controller_frequency: 指定了控制器（可能是FollowPath或其他控制器）的運行頻率，以赫茲為單位。",[49,8218,8219],{},"controller_plugins: 指定了將要使用的控制器插件列表，這裡只包含了FollowPath。",[49,8221,8222],{},"failure_tolerance: 定義了容忍失敗的時間或距離，用於在評估控制器是否失敗時提供一定的緩衝。",[49,8224,8225],{},"general_goal_checker: 定義了一個通用的目標檢查器，用於確定機器人是否已達到其目標位置和方向。",[49,8227,8228],{},"goal_checker_plugins: 指定了將要使用的目標檢查器插件列表。",[49,8230,8231],{},"min_theta_velocity_threshold, min_x_velocity_threshold, min_y_velocity_threshold: 這些定義了機器人在不同方向上的最小速度閾值，低於這些閾值可能被視為停止或靜止。",[49,8233,8234],{},"odom_topic: 指定了里程計信息的ROS主題。",[49,8236,8237],{},"progress_checker: 定義了一個進度檢查器，用於評估機器人是否在向目標移動。",[49,8239,8240],{},"qos_overrides: 定義了ROS服務或主題的QoS（服務質量）覆蓋設置，用於調整消息傳遞的可靠性和性能。",[49,8242,8243],{},"speed_limit_topic: 指定了速度限制信息的ROS主題。",[49,8245,8246],{},"use_sim_time: 指示是否使用模擬時間，這在ROS仿真環境中非常有用。",[18,8248,8249],{},[21,8250,8251],{},"4./local_costmap/local_costmap訂閱的話題",[535,8253,8254,8264],{},[538,8255,8256],{},[541,8257,8258,8260,8262],{},[544,8259,547],{"align":546},[544,8261,4130],{"align":546},[544,8263,553],{"align":546},[555,8265,8266,8276],{},[541,8267,8268,8271,8273],{},[560,8269,8270],{"align":546},"/local_costmap/footprint",[560,8272,7589],{"align":546},[560,8274,8275],{"align":546},"機器人或移動平臺的足跡多邊形，用於本地代價地圖的計算",[541,8277,8278,8280,8282],{},[560,8279,562],{"align":546},[560,8281,565],{"align":546},[560,8283,8284],{"align":546},"激光掃描儀的掃描數據，用於環境感知和避障",[18,8286,8287],{},[21,8288,8289],{},"5./local_costmap/local_costmap發佈的話題",[535,8291,8292,8302],{},[538,8293,8294],{},[541,8295,8296,8298,8300],{},[544,8297,547],{"align":546},[544,8299,4130],{"align":546},[544,8301,553],{"align":546},[555,8303,8304,8314,8324,8334,8344,8354],{},[541,8305,8306,8309,8311],{},[560,8307,8308],{"align":546},"/local_costmap/clearing_endpoints",[560,8310,8128],{"align":546},[560,8312,8313],{"align":546},"清除成本圖上的障礙物點雲數據，通常用於動態障礙物處理",[541,8315,8316,8319,8321],{},[560,8317,8318],{"align":546},"/local_costmap/costmap",[560,8320,690],{"align":546},[560,8322,8323],{"align":546},"本地成本圖，表示機器人周圍環境的可通行性",[541,8325,8326,8329,8331],{},[560,8327,8328],{"align":546},"/local_costmap/costmap_raw",[560,8330,7647],{"align":546},[560,8332,8333],{"align":546},"未經處理的本地成本圖，可能包含更詳細的信息",[541,8335,8336,8339,8341],{},[560,8337,8338],{"align":546},"/local_costmap/costmap_updates",[560,8340,7658],{"align":546},[560,8342,8343],{"align":546},"本地成本圖的更新信息，包括哪些區域發生了變化",[541,8345,8346,8349,8351],{},[560,8347,8348],{"align":546},"/local_costmap/published_footprint",[560,8350,7669],{"align":546},[560,8352,8353],{"align":546},"發佈的機器人足跡多邊形，時間戳表示發佈時間",[541,8355,8356,8359,8362],{},[560,8357,8358],{"align":546},"/local_costmap/voxel_grid",[560,8360,8361],{"align":546},"nav2_msgs/msg/VoxelGrid",[560,8363,8364],{"align":546},"體素網格數據，用於成本圖生成中的空間劃分和優化",[18,8366,8367],{},[21,8368,8369],{},"6./local_costmap/local_costmap參數",[46,8371,8372,8380,8388,8401,8406,8411,8416,8421,8426,8431,8436,8441,8446,8451,8458,8463,8468,8473,8478,8483,8491,8496,8501,8506,8511,8516,8521,8526],{},[49,8373,8374,8376,8377,8379],{},[74,8375,7192],{},": 是否禁用節點間的心跳超時檢查。當設置為",[74,8378,2022],{},"時，表示禁用該功能，可能用於減少網絡通信量或適應特定網絡環境。",[49,8381,8382,8384,8385,8387],{},[74,8383,7689],{},": 是否總是發送完整的成本圖。當設置為",[74,8386,2022],{},"時，節點將不依賴於增量更新，而是始終發送完整的成本圖數據。",[49,8389,8390,8392,8393,5803,8395,2677,8397,8400],{},[74,8391,7695],{},": 指定可以被清除的層列表。在這個例子中，包括",[74,8394,7793],{},[74,8396,7965],{},[74,8398,8399],{},"range_layer","，這意味著這些層中的障礙物數據可以被清除。",[49,8402,8403,8405],{},[74,8404,7701],{},": 用於指定應用於成本圖的過濾器列表。此處為空，表示沒有應用任何過濾器。",[49,8407,8408,8410],{},[74,8409,7707],{},": 機器人的足跡多邊形，定義了機器人在二維空間中的物理佔用區域。",[49,8412,8413,8415],{},[74,8414,7713],{},": 足跡的填充量，用於在計算成本圖時給機器人足跡添加額外的空間。",[49,8417,8418,8420],{},[74,8419,7390],{},": 全局參考座標系的名稱，通常用於定位和導航任務。",[49,8422,8423,8425],{},[74,8424,7724],{},": 成本圖的高度（以單元格數量計）。",[49,8427,8428,8430],{},[74,8429,7733],{},": 膨脹層的配置，用於在障礙物周圍添加一定範圍的膨脹區域，使機器人與障礙物保持安全距離。",[49,8432,8433,8435],{},[74,8434,7776],{},": 致命成本閾值，超過此閾值的成本值表示不可通行的區域。",[49,8437,8438,8440],{},[74,8439,5915],{},": 訂閱的地圖主題名稱，用於獲取全局地圖信息。",[49,8442,8443,8445],{},[74,8444,7787],{},": 觀察源的配置，用於指定哪些傳感器數據將被用於更新成本圖。此處為空字符串，可能是默認值或配置方式的不同。",[49,8447,8448,8450],{},[74,8449,7793],{},": 障礙物層的配置，用於處理來自傳感器（如激光雷達）的障礙物數據。",[49,8452,8453,3730,8455,8457],{},[74,8454,7843],{},[74,8456,7846],{},": 成本圖原點的X和Y座標，定義了成本圖在全局座標系中的位置。",[49,8459,8460,8462],{},[74,8461,7852],{},": 啟用的插件列表，定義了成本圖使用的不同層（如障礙物層、膨脹層等）。",[49,8464,8465,8467],{},[74,8466,7858],{},": 成本圖的發佈頻率（以Hz為單位）。",[49,8469,8470,8472],{},[74,8471,982],{},": 成本圖的分辨率（以米/單元格計）。",[49,8474,8475,8477],{},[74,8476,7396],{},": 機器人基座的參考座標系名稱，用於定位機器人。",[49,8479,8480,8482],{},[74,8481,7874],{},": 機器人的半徑，用於在成本圖中表示機器人的物理尺寸。",[49,8484,8485,8487,8488,8490],{},[74,8486,7880],{},": 是否使用滾動窗口。當設置為",[74,8489,2022],{},"時，成本圖將隨著機器人的移動而更新其位置和範圍。",[49,8492,8493,8495],{},[74,8494,7925],{},": 是否跟蹤未知空間。在某些情況下，這可能用於處理未探索或未知的區域。",[49,8497,8498,8500],{},[74,8499,5752],{},": 變換容差，定義了接受變換的時間差和角度差的閾值。",[49,8502,8503,8505],{},[74,8504,7936],{},": 是否使用三態成本圖（通常是自由、佔用、未知）。",[49,8507,8508,8510],{},[74,8509,7942],{},": 未知區域在成本圖中的成本值。",[49,8512,8513,8515],{},[74,8514,7948],{},": 成本圖的更新頻率（以Hz為單位），不同於發佈頻率。",[49,8517,8518,8520],{},[74,8519,7954],{},": 是否在多個源提供相同位置的成本信息時使用最大值。",[49,8522,8523,8525],{},[74,8524,5758],{},": 是否使用模擬時間而非系統時間。這在仿真環境中很有用。",[49,8527,8528,8530],{},[74,8529,7965],{},": 體素層的配置，用於將三維空間劃分為體素（體積像素），以提高成本圖的處理效率。",[14,8532,8533],{"id":8533},"恢復器節點說明",[18,8535,8536,8537,8039,8540,8543],{},"恢復行為是機器人導航過程中一個至關重要的部分，它允許機器人在遇到障礙、卡住或其他導航問題時採取一系列預定義的動作來嘗試恢復。在Nav2中由",[74,8538,8539],{},"nav2_behaviors",[74,8541,8542],{},"behavior_server","實現這一功能。",[18,8545,8546],{},[21,8547,5547],{},[535,8549,8550,8560],{},[538,8551,8552],{},[541,8553,8554,8556,8558],{},[544,8555,547],{"align":546},[544,8557,4130],{"align":546},[544,8559,553],{"align":546},[555,8561,8562,8573,8583,8592,8601],{},[541,8563,8564,8567,8570],{},[560,8565,8566],{"align":546},"/clock",[560,8568,8569],{"align":546},"rosgraph_msgs/msg/Clock",[560,8571,8572],{"align":546},"ROS系統時間",[541,8574,8575,8578,8580],{},[560,8576,8577],{"align":546},"/cmd_vel_teleop",[560,8579,8117],{"align":546},[560,8581,8582],{"align":546},"遙操作命令，用於控制機器人的線性和角速度",[541,8584,8585,8587,8589],{},[560,8586,8328],{"align":546},[560,8588,7647],{"align":546},[560,8590,8591],{"align":546},"局部代價地圖的原始數據",[541,8593,8594,8596,8598],{},[560,8595,8348],{"align":546},[560,8597,7669],{"align":546},[560,8599,8600],{"align":546},"機器人在局部代價地圖中的已發佈足跡",[541,8602,8603,8606,8609],{},[560,8604,8605],{"align":546},"/preempt_teleop",[560,8607,8608],{"align":546},"std_msgs/msg/Empty",[560,8610,8611],{"align":546},"遙操作搶佔信號，用於中斷當前遙操作",[18,8613,8614],{},[21,8615,5606],{},[535,8617,8618,8628],{},[538,8619,8620],{},[541,8621,8622,8624,8626],{},[544,8623,547],{"align":546},[544,8625,4130],{"align":546},[544,8627,553],{"align":546},[555,8629,8630],{},[541,8631,8632,8635,8637],{},[560,8633,8634],{"align":546},"/cmd_vel",[560,8636,8117],{"align":546},[560,8638,8639],{"align":546},"發送給底層控制器的速度命令",[18,8641,8642],{},[21,8643,8644],{},"3.提供的Action服務器",[535,8646,8647,8658],{},[538,8648,8649],{},[541,8650,8651,8653,8656],{},[544,8652,547],{"align":546},[544,8654,8655],{"align":546},"Action接口",[544,8657,553],{"align":546},[555,8659,8660,8671,8682,8693,8704],{},[541,8661,8662,8665,8668],{},[560,8663,8664],{"align":546},"/assisted_teleop",[560,8666,8667],{"align":546},"nav2_msgs/action/AssistedTeleop",[560,8669,8670],{"align":546},"遙控輔助操作服務，允許用戶在導航時提供方向性輸入",[541,8672,8673,8676,8679],{},[560,8674,8675],{"align":546},"/backup",[560,8677,8678],{"align":546},"nav2_msgs/action/BackUp",[560,8680,8681],{"align":546},"後退動作服務，用於在特定情況下使機器人後退",[541,8683,8684,8687,8690],{},[560,8685,8686],{"align":546},"/drive_on_heading",[560,8688,8689],{"align":546},"nav2_msgs/action/DriveOnHeading",[560,8691,8692],{"align":546},"按指定航向行駛的動作服務",[541,8694,8695,8698,8701],{},[560,8696,8697],{"align":546},"/spin",[560,8699,8700],{"align":546},"nav2_msgs/action/Spin",[560,8702,8703],{"align":546},"旋轉動作服務，允許機器人在原地旋轉",[541,8705,8706,8709,8712],{},[560,8707,8708],{"align":546},"/wait",[560,8710,8711],{"align":546},"nav2_msgs/action/Wait",[560,8713,8714],{"align":546},"等待動作服務，使機器人在當前位置等待一定時間",[18,8716,8717],{},[21,8718,5695],{},[46,8720,8721,8726,8734,8739,8744,8752,8770,8776,8782,8788,8794,8806,8812,8818,8827],{},[49,8722,8723,8725],{},[74,8724,5758],{},": 該參數指定是否使用模擬時間而非實際時間。這在仿真環境中非常有用，因為仿真環境可以加速或減速時間流逝，而不需要等待實際時間的流逝。",[49,8727,8728,8730,8731,8733],{},[74,8729,7390],{},": 定義全局座標系的名稱，該座標系通常用於導航任務中的定位和路徑規劃。在這裡，它被設置為",[74,8732,5739],{},"，意味著使用里程計數據來作為全局座標系的參考。",[49,8735,8736,8738],{},[74,8737,7396],{},": 指定機器人基座的座標系名稱。這是機器人上用於定位和運動控制的參考點，通常與機器人的物理中心或驅動輪的中心相對應。",[49,8740,8741,8743],{},[74,8742,7402],{},": 這是一個ROS話題名稱，用於發佈里程計數據。里程計數據包含了機器人隨時間推移的位置和姿態變化信息，是導航和定位系統的關鍵輸入之一。",[49,8745,8746,8748,8749,8751],{},[74,8747,7192],{},"：這個參數可能用於配置ROS節點之間的心跳檢測機制。將其設置為",[74,8750,2022],{},"可能意味著禁用或調整心跳超時的行為，以便在特定情況下（如仿真環境）避免不必要的超時錯誤。",[49,8753,8754,3730,8757,3730,8760,3730,8763,3730,8766,8769],{},[74,8755,8756],{},"assisted_teleop",[74,8758,8759],{},"backup",[74,8761,8762],{},"drive_on_heading",[74,8764,8765],{},"spin",[74,8767,8768],{},"wait",": 這些是行為樹中可能使用的行為插件的配置項。每個插件都定義了機器人可以執行的一種特定行為，如輔助遙操作、後退、按指定方向行駛、原地旋轉和等待。",[49,8771,8772,8775],{},[74,8773,8774],{},"behavior_plugins",": 列出了在行為樹中可用的行為插件名稱。",[49,8777,8778,8781],{},[74,8779,8780],{},"cmd_vel_teleop",": 指定了用於遙操作的速度控制命令的ROS話題名稱。",[49,8783,8784,8787],{},[74,8785,8786],{},"costmap_topic",": 定義了局部代價地圖的ROS話題名稱，代價地圖用於表示環境中的障礙物和可通行區域。",[49,8789,8790,8793],{},[74,8791,8792],{},"cycle_frequency",": 定義了導航系統更新其狀態和規劃新路徑的頻率（以赫茲為單位）。",[49,8795,8796,3730,8799,3730,8802,8805],{},[74,8797,8798],{},"max_rotational_vel",[74,8800,8801],{},"min_rotational_vel",[74,8803,8804],{},"rotational_acc_lim",": 這些參數定義了機器人旋轉時的最大速度、最小速度和加速度限制。",[49,8807,8808,8811],{},[74,8809,8810],{},"projection_time",": 與代價地圖的更新或預測未來障礙物位置有關的時間參數。",[49,8813,8814,8817],{},[74,8815,8816],{},"footprint_topic",": 定義了發佈機器人足跡（即機器人佔據的空間）的ROS話題名稱。",[49,8819,8820,3730,8823,8826],{},[74,8821,8822],{},"simulate_ahead_time",[74,8824,8825],{},"simulation_time_step",": 這些參數與仿真環境相關，可能用於控制仿真過程中的時間流逝和步長。",[49,8828,8829,8831],{},[74,8830,5752],{},": 定義了座標變換時的容差範圍，用於處理不同座標系之間的微小差異。",[14,8833,8834],{"id":8834},"航點跟隨節點說明",[18,8836,8837,8838,8841,8842,8845,8846,2677,8849,8852],{},"在Nav2 導航堆棧中，",[74,8839,8840],{},"nav2_waypoint_follower","包下的",[74,8843,8844],{},"/waypoint_follower","節點負責跟蹤由路徑規劃器生成的一系列航點（waypoints），以確保機器人能夠沿著預定的路徑安全、準確地移動。該節點的主要功能是根據當前機器人位置和速度信息，以及由路徑規劃器（如",[74,8847,8848],{},"nav2_global_planner",[74,8850,8851],{},"nav2_local_planner","）提供的航點列表，計算出控制指令來控制機器人的運動。這些控制指令可能包括線性和角速度命令，或者更具體的運動學或動力學命令，具體取決於機器人的類型和配置。",[18,8854,8855],{},[21,8856,8857],{},"1.提供的Action服務器",[535,8859,8860,8870],{},[538,8861,8862],{},[541,8863,8864,8866,8868],{},[544,8865,547],{"align":546},[544,8867,8655],{"align":546},[544,8869,553],{"align":546},[555,8871,8872],{},[541,8873,8874,8877,8880],{},[560,8875,8876],{"align":546},"/follow_waypoints",[560,8878,8879],{"align":546},"nav2_msgs/action/FollowWaypoints",[560,8881,8882],{"align":546},"允許客戶端請求planner_server按照一系列路點進行導航",[18,8884,8885],{},[21,8886,8887],{},"2.請求的Action服務",[535,8889,8890,8900],{},[538,8891,8892],{},[541,8893,8894,8896,8898],{},[544,8895,547],{"align":546},[544,8897,8655],{"align":546},[544,8899,553],{"align":546},[555,8901,8902],{},[541,8903,8904,8906,8908],{},[560,8905,7368],{"align":546},[560,8907,7371],{"align":546},[560,8909,8910],{"align":546},"允許planner_server（或調用它的節點）請求導航到指定的位姿",[18,8912,8913],{},[21,8914,8915],{},"3.參數",[46,8917,8918,8923,8929,8935,8940,8946],{},[49,8919,8920,8922],{},[74,8921,5758],{},": 指定是否使用模擬時間而非實際時間進行節點的計時和同步。這在仿真環境中特別有用，因為仿真環境可能無法提供與真實時間完全同步的時鐘。",[49,8924,8925,8928],{},[74,8926,8927],{},"loop_rate",": 定義了節點的主循環速率，即節點每秒執行其主要任務（如處理數據、發佈信息等）的次數。這個參數對於控制節點的響應性和資源使用非常重要。",[49,8930,8931,8934],{},[74,8932,8933],{},"stop_on_failure",": 指明當導航任務遇到無法克服的障礙或達到其他失敗條件時，節點是否應該停止執行。這對於確保在失敗情況下系統能夠安全地停止並等待進一步指令很重要。",[49,8936,8937,8939],{},[74,8938,5707],{},": 涉及節點間通信的可靠性機制。Bond是ROS 2中用於節點間穩定通信的一種機制，其中心跳信號用於檢測節點是否仍然活躍。將此參數設置為true會禁用心跳超時檢測，這可能在某些特定的網絡配置或應用場景中是有用的。",[49,8941,8942,8945],{},[74,8943,8944],{},"waypoint_task_executor_plugin",": 指定了在執行路徑點導航任務時要使用的插件。路徑點導航通常涉及一系列預先定義的點，機器人需要按順序訪問這些點。這個參數允許用戶指定用於執行這種類型任務的特定插件或算法。",[49,8947,8948,8951,8952],{},[74,8949,8950],{},"wait_at_waypoint",": 這是一個複合參數，用於配置在路徑點等待的特定行為。",[46,8953,8954,8959,8964],{},[49,8955,8956,8958],{},[74,8957,7747],{},": 啟用或禁用在到達每個路徑點時等待的功能。",[49,8960,8961,8963],{},[74,8962,7520],{},": 指定實現等待功能的插件類型。這允許用戶根據需要選擇不同的等待策略或行為。",[49,8965,8966,8969],{},[74,8967,8968],{},"waypoint_pause_duration",": 定義了在每個路徑點處等待的持續時間（以毫秒為單位）。這可以用於確保機器人在移動到下一個路徑點之前已經穩定或已經完成了某些操作。",[14,8971,8972],{"id":8972},"路徑平滑節點說明",[18,8974,8975,8976,7172,8979,8982],{},"在Nav2框架中",[74,8977,8978],{},"nav2_smoother",[74,8980,8981],{},"smoother_server","節點通過加載和運行各種平滑器插件，對規劃出的路徑進行平滑處理，使得機器人能夠更流暢、連續且安全地移動。這一功能對於提高機器人的導航性能和減少硬件磨損具有重要意義。",[18,8984,8985],{},[21,8986,5547],{},[535,8988,8989,8999],{},[538,8990,8991],{},[541,8992,8993,8995,8997],{},[544,8994,547],{"align":546},[544,8996,4130],{"align":546},[544,8998,553],{"align":546},[555,9000,9001,9010],{},[541,9002,9003,9005,9007],{},[560,9004,7644],{"align":546},[560,9006,7647],{"align":546},[560,9008,9009],{"align":546},"全局代價地圖的原始數據，用於路徑規劃",[541,9011,9012,9014,9016],{},[560,9013,7666],{"align":546},[560,9015,7669],{"align":546},[560,9017,9018],{"align":546},"機器人在全局代價地圖中的足跡表示",[18,9020,9021],{},[21,9022,5606],{},[535,9024,9025,9035],{},[538,9026,9027],{},[541,9028,9029,9031,9033],{},[544,9030,547],{"align":546},[544,9032,4130],{"align":546},[544,9034,553],{"align":546},[555,9036,9037],{},[541,9038,9039,9042,9044],{},[560,9040,9041],{"align":546},"/plan_smoothed",[560,9043,7483],{"align":546},[560,9045,9046],{"align":546},"經過平滑處理後的全局路徑",[18,9048,9049],{},[21,9050,8644],{},[535,9052,9053,9064],{},[538,9054,9055],{},[541,9056,9057,9059,9062],{},[544,9058,547],{"align":546},[544,9060,9061],{"align":546},"動作類型",[544,9063,553],{"align":546},[555,9065,9066],{},[541,9067,9068,9071,9074],{},[560,9069,9070],{"align":546},"/smooth_path",[560,9072,9073],{"align":546},"nav2_msgs/action/SmoothPath",[560,9075,9076],{"align":546},"提供平滑路徑的服務，接受路徑平滑的請求，並返回平滑後的路徑。這允許客戶端（如行為樹）異步地請求路徑平滑，並在平滑完成後接收結果。",[18,9078,9079],{},[21,9080,5695],{},[46,9082,9083,9088,9093,9098,9103,9148,9157,9162],{},[49,9084,9085,9087],{},[74,9086,7192],{},": 指示是否禁用Bond的心跳超時功能。在分佈式系統中，Bond用於管理節點間的連接和心跳，此參數用於調整心跳相關的行為。",[49,9089,9090,9092],{},[74,9091,8786],{},": 代價地圖數據的ROS話題名稱，通常是全局代價地圖的原始數據。",[49,9094,9095,9097],{},[74,9096,8816],{},": 機器人足跡（即機器人在地圖上的佔用區域）的ROS話題名稱，用於在全局代價地圖中表示機器人的物理尺寸。",[49,9099,9100,9102],{},[74,9101,7396],{},": 指定機器人基座的座標系名稱，這是機器人導航中用於定位和移動的參考點。",[49,9104,9105,7231,9108],{},[74,9106,9107],{},"simple_smoother",[46,9109,9110,9116,9122,9131,9136,9142],{},[49,9111,9112,9115],{},[74,9113,9114],{},"do_refinement",": 指示是否啟用路徑的細化（或進一步優化）過程。",[49,9117,9118,9121],{},[74,9119,9120],{},"max_its",": 平滑過程中允許的最大迭代次數，用於控制平滑算法的收斂時間。",[49,9123,9124,9126,9127,9130],{},[74,9125,7520],{},": 平滑插件的類型，這裡是",[74,9128,9129],{},"nav2_smoother::SimpleSmoother","，表示使用簡單的平滑算法。",[49,9132,9133,9135],{},[74,9134,7526],{},": 平滑算法的收斂容差，當路徑變化小於此值時，認為平滑過程已完成。",[49,9137,9138,9141],{},[74,9139,9140],{},"w_data",": 平滑過程中數據項（如障礙物距離）的權重。",[49,9143,9144,9147],{},[74,9145,9146],{},"w_smooth",": 平滑過程中平滑項（如路徑曲率）的權重。",[49,9149,9150,9153,9154,9156],{},[74,9151,9152],{},"smoother_plugins",": 定義的平滑插件列表，這裡列出了",[74,9155,9107],{},"，表示將使用此插件進行路徑平滑。",[49,9158,9159,9161],{},[74,9160,5752],{},": 座標變換的容差，用於處理不同座標系之間的轉換時的不確定性。",[49,9163,9164,9166,9167,9169,9170,9172],{},[74,9165,5758],{},": 指定是否使用模擬時間而非實際時間。在仿真環境中，這通常設置為",[74,9168,2022],{},"，以匹配仿真器的虛擬時間；在真實環境中，應設置為",[74,9171,5816],{},"以使用ROS系統的實際時間。",[14,9174,9175],{"id":9175},"速度平滑節點說明",[18,9177,9178,9179,8841,9182,9185],{},"Nav2框架中的",[74,9180,9181],{},"nav2_velocity_smoother",[74,9183,9184],{},"velocity_smoother","節點主要負責平滑由Nav2框架發送給機器人控制器的速度指令。其核心功能是實現速度和加速度平滑。這一功能對於確保機器人在導航過程中的穩定性和安全性至關重要。",[18,9187,9188],{},[21,9189,5547],{},[535,9191,9192,9202],{},[538,9193,9194],{},[541,9195,9196,9198,9200],{},[544,9197,547],{"align":546},[544,9199,4130],{"align":546},[544,9201,553],{"align":546},[555,9203,9204],{},[541,9205,9206,9208,9210],{},[560,9207,8114],{"align":546},[560,9209,8117],{"align":546},[560,9211,9212],{"align":546},"接收來自其他節點的速度控制指令的話題",[18,9214,9215],{},[21,9216,5606],{},[535,9218,9219,9229],{},[538,9220,9221],{},[541,9222,9223,9225,9227],{},[544,9224,547],{"align":546},[544,9226,4130],{"align":546},[544,9228,553],{"align":546},[555,9230,9231],{},[541,9232,9233,9235,9237],{},[560,9234,8634],{"align":546},[560,9236,8117],{"align":546},[560,9238,9239],{"align":546},"發佈經過處理或平滑後的速度控制指令的話題",[18,9241,9242],{},[21,9243,8915],{},[46,9245,9246,9254,9260,9270,9276,9282,9288,9294,9303,9311,9320,9326,9331],{},[49,9247,9248,9250,9251,9253],{},[74,9249,5707],{},": 指示是否禁用節點間的心跳超時機制。如果為",[74,9252,2022],{},"，則節點間的心跳檢測不會因超時而斷開連接。",[49,9255,9256,9259],{},[74,9257,9258],{},"deadband_velocity",": 定義在哪些速度分量上應用死區平滑（即忽略小於此閾值的微小速度變化）。這裡分別為X軸、Y軸和偏航角速度（theta）設置了死區值。",[49,9261,9262,9265,9266,9269],{},[74,9263,9264],{},"feedback",": 指定速度平滑器的反饋類型。",[74,9267,9268],{},"OPEN_LOOP","表示開環控制，即不考慮機器人的實際速度反饋進行速度調整。",[49,9271,9272,9275],{},[74,9273,9274],{},"max_accel",": 定義機器人在各個方向上的最大加速度限制，包括X軸、Y軸和偏航角速度（theta）。",[49,9277,9278,9281],{},[74,9279,9280],{},"max_decel",": 定義機器人在各個方向上的最大減速度限制，包括X軸、Y軸和偏航角速度（theta）。注意，減速度值以負數表示。",[49,9283,9284,9287],{},[74,9285,9286],{},"max_velocity",": 定義機器人在各個方向上的最大速度限制，包括X軸、Y軸和偏航角速度（theta）。",[49,9289,9290,9293],{},[74,9291,9292],{},"min_velocity",": 定義機器人在各個方向上的最小速度限制，包括X軸、Y軸和偏航角速度（theta）。這通常用於避免發送過小的速度指令給底層控制器。",[49,9295,9296,9299,9300,9302],{},[74,9297,9298],{},"odom_duration",": 與里程計數據相關的參數，但在此上下文中可能不直接用於",[74,9301,9184],{},"節點，可能是遺留或與其他功能相關聯。",[49,9304,9305,9307,9308,9310],{},[74,9306,7402],{},": 指定里程計數據的ROS話題名稱，",[74,9309,9184],{},"節點將訂閱此話題以獲取機器人的運動信息。",[49,9312,9313,9316,9317,9319],{},[74,9314,9315],{},"scale_velocities",": 指示是否根據加速度限制同比例調整速度的其他分量。如果為",[74,9318,5816],{},"，則不會進行速度縮放。",[49,9321,9322,9325],{},[74,9323,9324],{},"smoothing_frequency",": 定義速度平滑操作的執行頻率（Hz），即每秒進行多少次平滑計算。",[49,9327,9328,9330],{},[74,9329,5758],{},": 指定是否使用模擬時間而非實際系統時間。這對於仿真環境特別有用，可以確保時間的一致性和可預測性。",[49,9332,9333,9336,9337,9339],{},[74,9334,9335],{},"velocity_timeout",": 如果在指定時間內未接收到新的速度指令，則",[74,9338,9184],{},"節點將停止發佈速度指令，並可能發送零速度指令以停止機器人運動。這是為了防止在失去速度控制時機器人繼續移動。",[14,9341,9343],{"id":9342},"導航功能集成ros2-humble及之前","導航功能集成(ROS2 Humble及之前)",[18,9345,9346],{},[21,9347,5962],{},[18,9349,5019],{},[68,9351,9353],{"className":70,"code":9352,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_navigation2 --dependencies navigation2 nav2_common\n",[74,9354,9355],{"__ignoreMap":32},[77,9356,9357,9359,9361,9363,9366,9368,9371],{"class":79,"line":80},[77,9358,1205],{"class":83},[77,9360,1208],{"class":87},[77,9362,1211],{"class":87},[77,9364,9365],{"class":87}," mycar_navigation2",[77,9367,1218],{"class":1217},[77,9369,9370],{"class":87}," navigation2",[77,9372,9373],{"class":87}," nav2_common\n",[18,9375,9376],{},[21,9377,5993],{},[18,9379,9380],{},"在功能包下，新建launch目錄、params目錄和bts目錄。",[18,9382,9383,9384,1233],{},"launch目錄下新建",[74,9385,9386],{},"nav2.launch.py",[68,9388,9390],{"className":1236,"code":9389,"language":1238,"meta":32,"style":32},"import os\n\nfrom ament_index_python.packages import get_package_share_directory\n\nfrom launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument\nfrom launch.substitutions import LaunchConfiguration\n\nfrom launch_ros.actions import Node\nfrom launch_ros.descriptions import ParameterFile\n\nfrom nav2_common.launch import RewrittenYaml\n\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument(\n        'use_sim_time',\n        default_value='false'\n    )\n\n    use_sim_time = LaunchConfiguration('use_sim_time')\n\n    current_pkg = get_package_share_directory(\"mycar_navigation2\")\n\n    bt_params_file = os.path.join(current_pkg, \"params\", \"bt.yaml\")\n    planner_params_file = os.path.join(current_pkg, \"params\", \"planner.yaml\")\n    controller_params_file = os.path.join(current_pkg, \"params\", \"controller.yaml\")\n    behavior_params_file = os.path.join(current_pkg, \"params\", \"behavior.yaml\")\n    waypoint_params_file = os.path.join(current_pkg, \"params\", \"waypoint.yaml\")\n    velocity_params_file = os.path.join(current_pkg, \"params\", \"velocity.yaml\")\n    smoother_params_file = os.path.join(current_pkg, \"params\", \"smoother.yaml\")\n\n    def rewrite_params(params_file):\n        return ParameterFile(\n            RewrittenYaml(\n                source_file=params_file,\n                root_key='',\n                param_rewrites={\n                    'use_sim_time': use_sim_time\n                },\n                convert_types=True\n            ),\n            allow_substs=True\n        )\n\n    bt_params = rewrite_params(bt_params_file)\n    planner_params = rewrite_params(planner_params_file)\n    controller_params = rewrite_params(controller_params_file)\n    behavior_params = rewrite_params(behavior_params_file)\n    waypoint_params = rewrite_params(waypoint_params_file)\n    velocity_params = rewrite_params(velocity_params_file)\n    smoother_params = rewrite_params(smoother_params_file)\n\n    planner_server_node = Node(\n        package='nav2_planner',\n        executable='planner_server',\n        name='planner_server',\n        output='screen',\n        parameters=[\n            planner_params,\n            {'use_sim_time': use_sim_time}\n        ],\n    )\n\n    controller_server_node = Node(\n        package='nav2_controller',\n        executable='controller_server',\n        name='controller_server',\n        output='screen',\n        parameters=[\n            controller_params,\n            {'use_sim_time': use_sim_time}\n        ],\n        remappings=[\n            ('cmd_vel', 'cmd_vel_nav')\n        ]\n    )\n\n    behavior_server_node = Node(\n        package='nav2_behaviors',\n        executable='behavior_server',\n        name='behavior_server',\n        output='screen',\n        parameters=[\n            behavior_params,\n            {'use_sim_time': use_sim_time}\n        ]\n    )\n\n    waypoint_node = Node(\n        package='nav2_waypoint_follower',\n        executable='waypoint_follower',\n        name='waypoint_follower',\n        output='screen',\n        parameters=[\n            waypoint_params,\n            {'use_sim_time': use_sim_time}\n        ]\n    )\n\n    velocity_smoother_node = Node(\n        package='nav2_velocity_smoother',\n        executable='velocity_smoother',\n        name='velocity_smoother',\n        output='screen',\n        respawn_delay=2.0,\n        parameters=[\n            velocity_params,\n            {'use_sim_time': use_sim_time}\n        ],\n        remappings=[\n            ('cmd_vel', 'cmd_vel_nav'),\n            ('cmd_vel_smoothed', 'cmd_vel')\n        ]\n    )\n\n    smoother_server_node = Node(\n        package='nav2_smoother',\n        executable='smoother_server',\n        name='smoother_server',\n        output='screen',\n        parameters=[\n            smoother_params,\n            {'use_sim_time': use_sim_time}\n        ],\n    )\n\n    bt_navigator_node = Node(\n        package='nav2_bt_navigator',\n        executable='bt_navigator',\n        name='bt_navigator',\n        output='screen',\n        parameters=[\n            bt_params,\n            {'use_sim_time': use_sim_time},\n            {\n                \"default_nav_to_pose_bt_xml\": os.path.join(\n                    current_pkg,\n                    \"bts\",\n                    \"bt_planner_controller_behavior.xml\"\n                )\n            },\n            {\n                \"default_nav_through_poses_bt_xml\": os.path.join(\n                    current_pkg,\n                    \"bts\",\n                    \"bt_planner_controller_behavior_poses.xml\"\n                )\n            }\n        ],\n    )\n\n    lifecycle_manager_node = Node(\n        package='nav2_lifecycle_manager',\n        executable='lifecycle_manager',\n        name='lifecycle_manager_navigation',\n        output='screen',\n        parameters=[\n            {'use_sim_time': use_sim_time},\n            {'autostart': True},\n            {\n                'node_names': [\n                    'bt_navigator',\n                    'planner_server',\n                    'controller_server',\n                    'behavior_server',\n                    'waypoint_follower',\n                    'velocity_smoother',\n                    'smoother_server'\n                ]\n            }\n        ]\n    )\n\n    return LaunchDescription([\n        use_sim_time_arg,\n\n        lifecycle_manager_node,\n        bt_navigator_node,\n        planner_server_node,\n        controller_server_node,\n        behavior_server_node,\n        waypoint_node,\n        velocity_smoother_node,\n        smoother_server_node\n    ])\n",[74,9391,9392,9398,9402,9412,9416,9426,9436,9446,9450,9460,9472,9476,9488,9492,9496,9504,9508,9516,9522,9530,9534,9538,9550,9554,9569,9573,9592,9610,9628,9646,9664,9682,9700,9704,9715,9723,9728,9738,9750,9759,9767,9772,9782,9787,9796,9801,9805,9815,9825,9835,9845,9855,9865,9875,9879,9888,9899,9910,9920,9930,9938,9943,9951,9955,9959,9963,9972,9984,9996,10007,10018,10027,10033,10042,10047,10057,10073,10078,10083,10088,10098,10110,10122,10133,10144,10153,10159,10168,10173,10178,10183,10193,10205,10217,10228,10239,10248,10254,10263,10268,10273,10278,10288,10300,10312,10323,10334,10347,10356,10362,10371,10376,10385,10398,10412,10417,10422,10427,10437,10449,10461,10472,10483,10492,10498,10507,10512,10517,10522,10532,10544,10556,10567,10578,10587,10593,10603,10609,10618,10624,10632,10638,10644,10650,10655,10663,10668,10675,10681,10686,10692,10697,10702,10707,10717,10728,10739,10751,10762,10771,10780,10793,10798,10807,10815,10823,10831,10839,10847,10855,10861,10867,10872,10877,10882,10887,10894,10899,10904,10910,10916,10922,10928,10934,10940,10946,10952],{"__ignoreMap":32},[77,9393,9394,9396],{"class":79,"line":80},[77,9395,1245],{"class":97},[77,9397,1248],{"class":104},[77,9399,9400],{"class":79,"line":114},[77,9401,140],{"emptyLinePlaceholder":139},[77,9403,9404,9406,9408,9410],{"class":79,"line":136},[77,9405,1257],{"class":97},[77,9407,1308],{"class":104},[77,9409,1245],{"class":97},[77,9411,1313],{"class":104},[77,9413,9414],{"class":79,"line":143},[77,9415,140],{"emptyLinePlaceholder":139},[77,9417,9418,9420,9422,9424],{"class":79,"line":150},[77,9419,1257],{"class":97},[77,9421,1260],{"class":104},[77,9423,1245],{"class":97},[77,9425,1265],{"class":104},[77,9427,9428,9430,9432,9434],{"class":79,"line":162},[77,9429,1257],{"class":97},[77,9431,1272],{"class":104},[77,9433,1245],{"class":97},[77,9435,1277],{"class":104},[77,9437,9438,9440,9442,9444],{"class":79,"line":174},[77,9439,1257],{"class":97},[77,9441,1284],{"class":104},[77,9443,1245],{"class":97},[77,9445,1289],{"class":104},[77,9447,9448],{"class":79,"line":179},[77,9449,140],{"emptyLinePlaceholder":139},[77,9451,9452,9454,9456,9458],{"class":79,"line":185},[77,9453,1257],{"class":97},[77,9455,1296],{"class":104},[77,9457,1245],{"class":97},[77,9459,1301],{"class":104},[77,9461,9462,9464,9467,9469],{"class":79,"line":197},[77,9463,1257],{"class":97},[77,9465,9466],{"class":104}," launch_ros.descriptions ",[77,9468,1245],{"class":97},[77,9470,9471],{"class":104}," ParameterFile\n",[77,9473,9474],{"class":79,"line":1348},[77,9475,140],{"emptyLinePlaceholder":139},[77,9477,9478,9480,9483,9485],{"class":79,"line":1363},[77,9479,1257],{"class":97},[77,9481,9482],{"class":104}," nav2_common.launch ",[77,9484,1245],{"class":97},[77,9486,9487],{"class":104}," RewrittenYaml\n",[77,9489,9490],{"class":79,"line":1368},[77,9491,140],{"emptyLinePlaceholder":139},[77,9493,9494],{"class":79,"line":1379},[77,9495,140],{"emptyLinePlaceholder":139},[77,9497,9498,9500,9502],{"class":79,"line":1388},[77,9499,1322],{"class":97},[77,9501,1325],{"class":83},[77,9503,1328],{"class":104},[77,9505,9506],{"class":79,"line":1402},[77,9507,140],{"emptyLinePlaceholder":139},[77,9509,9510,9512,9514],{"class":79,"line":1415},[77,9511,3097],{"class":104},[77,9513,1336],{"class":97},[77,9515,1376],{"class":104},[77,9517,9518,9520],{"class":79,"line":1425},[77,9519,1382],{"class":87},[77,9521,1385],{"class":104},[77,9523,9524,9526,9528],{"class":79,"line":1433},[77,9525,1392],{"class":1391},[77,9527,1336],{"class":97},[77,9529,6124],{"class":87},[77,9531,9532],{"class":79,"line":1449},[77,9533,3250],{"class":104},[77,9535,9536],{"class":79,"line":1463},[77,9537,140],{"emptyLinePlaceholder":139},[77,9539,9540,9542,9544,9546,9548],{"class":79,"line":1475},[77,9541,1333],{"class":104},[77,9543,1336],{"class":97},[77,9545,1339],{"class":104},[77,9547,1342],{"class":87},[77,9549,1345],{"class":104},[77,9551,9552],{"class":79,"line":1480},[77,9553,140],{"emptyLinePlaceholder":139},[77,9555,9556,9559,9561,9564,9567],{"class":79,"line":1491},[77,9557,9558],{"class":104},"    current_pkg ",[77,9560,1336],{"class":97},[77,9562,9563],{"class":104}," get_package_share_directory(",[77,9565,9566],{"class":87},"\"mycar_navigation2\"",[77,9568,1345],{"class":104},[77,9570,9571],{"class":79,"line":1502},[77,9572,140],{"emptyLinePlaceholder":139},[77,9574,9575,9578,9580,9583,9585,9587,9590],{"class":79,"line":1508},[77,9576,9577],{"class":104},"    bt_params_file ",[77,9579,1336],{"class":97},[77,9581,9582],{"class":104}," os.path.join(current_pkg, ",[77,9584,3221],{"class":87},[77,9586,1455],{"class":104},[77,9588,9589],{"class":87},"\"bt.yaml\"",[77,9591,1345],{"class":104},[77,9593,9594,9597,9599,9601,9603,9605,9608],{"class":79,"line":1519},[77,9595,9596],{"class":104},"    planner_params_file ",[77,9598,1336],{"class":97},[77,9600,9582],{"class":104},[77,9602,3221],{"class":87},[77,9604,1455],{"class":104},[77,9606,9607],{"class":87},"\"planner.yaml\"",[77,9609,1345],{"class":104},[77,9611,9612,9615,9617,9619,9621,9623,9626],{"class":79,"line":1525},[77,9613,9614],{"class":104},"    controller_params_file ",[77,9616,1336],{"class":97},[77,9618,9582],{"class":104},[77,9620,3221],{"class":87},[77,9622,1455],{"class":104},[77,9624,9625],{"class":87},"\"controller.yaml\"",[77,9627,1345],{"class":104},[77,9629,9630,9633,9635,9637,9639,9641,9644],{"class":79,"line":1538},[77,9631,9632],{"class":104},"    behavior_params_file ",[77,9634,1336],{"class":97},[77,9636,9582],{"class":104},[77,9638,3221],{"class":87},[77,9640,1455],{"class":104},[77,9642,9643],{"class":87},"\"behavior.yaml\"",[77,9645,1345],{"class":104},[77,9647,9648,9651,9653,9655,9657,9659,9662],{"class":79,"line":1551},[77,9649,9650],{"class":104},"    waypoint_params_file ",[77,9652,1336],{"class":97},[77,9654,9582],{"class":104},[77,9656,3221],{"class":87},[77,9658,1455],{"class":104},[77,9660,9661],{"class":87},"\"waypoint.yaml\"",[77,9663,1345],{"class":104},[77,9665,9666,9669,9671,9673,9675,9677,9680],{"class":79,"line":1563},[77,9667,9668],{"class":104},"    velocity_params_file ",[77,9670,1336],{"class":97},[77,9672,9582],{"class":104},[77,9674,3221],{"class":87},[77,9676,1455],{"class":104},[77,9678,9679],{"class":87},"\"velocity.yaml\"",[77,9681,1345],{"class":104},[77,9683,9684,9687,9689,9691,9693,9695,9698],{"class":79,"line":1576},[77,9685,9686],{"class":104},"    smoother_params_file ",[77,9688,1336],{"class":97},[77,9690,9582],{"class":104},[77,9692,3221],{"class":87},[77,9694,1455],{"class":104},[77,9696,9697],{"class":87},"\"smoother.yaml\"",[77,9699,1345],{"class":104},[77,9701,9702],{"class":79,"line":1581},[77,9703,140],{"emptyLinePlaceholder":139},[77,9705,9706,9709,9712],{"class":79,"line":1592},[77,9707,9708],{"class":97},"    def",[77,9710,9711],{"class":83}," rewrite_params",[77,9713,9714],{"class":104},"(params_file):\n",[77,9716,9717,9720],{"class":79,"line":1597},[77,9718,9719],{"class":97},"        return",[77,9721,9722],{"class":104}," ParameterFile(\n",[77,9724,9725],{"class":79,"line":1603},[77,9726,9727],{"class":104},"            RewrittenYaml(\n",[77,9729,9730,9733,9735],{"class":79,"line":1609},[77,9731,9732],{"class":1391},"                source_file",[77,9734,1336],{"class":97},[77,9736,9737],{"class":104},"params_file,\n",[77,9739,9740,9743,9745,9748],{"class":79,"line":1615},[77,9741,9742],{"class":1391},"                root_key",[77,9744,1336],{"class":97},[77,9746,9747],{"class":87},"''",[77,9749,1385],{"class":104},[77,9751,9752,9755,9757],{"class":79,"line":1620},[77,9753,9754],{"class":1391},"                param_rewrites",[77,9756,1336],{"class":97},[77,9758,6434],{"class":104},[77,9760,9761,9764],{"class":79,"line":2003},[77,9762,9763],{"class":87},"                    'use_sim_time'",[77,9765,9766],{"class":104},": use_sim_time\n",[77,9768,9769],{"class":79,"line":2014},[77,9770,9771],{"class":104},"                },\n",[77,9773,9774,9777,9779],{"class":79,"line":2027},[77,9775,9776],{"class":1391},"                convert_types",[77,9778,1336],{"class":97},[77,9780,9781],{"class":1217},"True\n",[77,9783,9784],{"class":79,"line":2041},[77,9785,9786],{"class":104},"            ),\n",[77,9788,9789,9792,9794],{"class":79,"line":2054},[77,9790,9791],{"class":1391},"            allow_substs",[77,9793,1336],{"class":97},[77,9795,9781],{"class":1217},[77,9797,9798],{"class":79,"line":2068},[77,9799,9800],{"class":104},"        )\n",[77,9802,9803],{"class":79,"line":2079},[77,9804,140],{"emptyLinePlaceholder":139},[77,9806,9807,9810,9812],{"class":79,"line":2084},[77,9808,9809],{"class":104},"    bt_params ",[77,9811,1336],{"class":97},[77,9813,9814],{"class":104}," rewrite_params(bt_params_file)\n",[77,9816,9817,9820,9822],{"class":79,"line":2094},[77,9818,9819],{"class":104},"    planner_params ",[77,9821,1336],{"class":97},[77,9823,9824],{"class":104}," rewrite_params(planner_params_file)\n",[77,9826,9827,9830,9832],{"class":79,"line":2105},[77,9828,9829],{"class":104},"    controller_params ",[77,9831,1336],{"class":97},[77,9833,9834],{"class":104}," rewrite_params(controller_params_file)\n",[77,9836,9837,9840,9842],{"class":79,"line":2117},[77,9838,9839],{"class":104},"    behavior_params ",[77,9841,1336],{"class":97},[77,9843,9844],{"class":104}," rewrite_params(behavior_params_file)\n",[77,9846,9847,9850,9852],{"class":79,"line":2122},[77,9848,9849],{"class":104},"    waypoint_params ",[77,9851,1336],{"class":97},[77,9853,9854],{"class":104}," rewrite_params(waypoint_params_file)\n",[77,9856,9857,9860,9862],{"class":79,"line":2133},[77,9858,9859],{"class":104},"    velocity_params ",[77,9861,1336],{"class":97},[77,9863,9864],{"class":104}," rewrite_params(velocity_params_file)\n",[77,9866,9867,9870,9872],{"class":79,"line":2143},[77,9868,9869],{"class":104},"    smoother_params ",[77,9871,1336],{"class":97},[77,9873,9874],{"class":104}," rewrite_params(smoother_params_file)\n",[77,9876,9877],{"class":79,"line":2154},[77,9878,140],{"emptyLinePlaceholder":139},[77,9880,9881,9884,9886],{"class":79,"line":2159},[77,9882,9883],{"class":104},"    planner_server_node ",[77,9885,1336],{"class":97},[77,9887,1488],{"class":104},[77,9889,9890,9892,9894,9897],{"class":79,"line":2173},[77,9891,1528],{"class":1391},[77,9893,1336],{"class":97},[77,9895,9896],{"class":87},"'nav2_planner'",[77,9898,1385],{"class":104},[77,9900,9901,9903,9905,9908],{"class":79,"line":2186},[77,9902,1541],{"class":1391},[77,9904,1336],{"class":97},[77,9906,9907],{"class":87},"'planner_server'",[77,9909,1385],{"class":104},[77,9911,9912,9914,9916,9918],{"class":79,"line":2191},[77,9913,1554],{"class":1391},[77,9915,1336],{"class":97},[77,9917,9907],{"class":87},[77,9919,1385],{"class":104},[77,9921,9922,9924,9926,9928],{"class":79,"line":2205},[77,9923,1566],{"class":1391},[77,9925,1336],{"class":97},[77,9927,1571],{"class":87},[77,9929,1385],{"class":104},[77,9931,9932,9934,9936],{"class":79,"line":2219},[77,9933,1494],{"class":1391},[77,9935,1336],{"class":97},[77,9937,1499],{"class":104},[77,9939,9940],{"class":79,"line":2233},[77,9941,9942],{"class":104},"            planner_params,\n",[77,9944,9945,9947,9949],{"class":79,"line":2244},[77,9946,3297],{"class":104},[77,9948,1342],{"class":87},[77,9950,1516],{"class":104},[77,9952,9953],{"class":79,"line":2254},[77,9954,1522],{"class":104},[77,9956,9957],{"class":79,"line":6476},[77,9958,3250],{"class":104},[77,9960,9961],{"class":79,"line":6482},[77,9962,140],{"emptyLinePlaceholder":139},[77,9964,9965,9968,9970],{"class":79,"line":6488},[77,9966,9967],{"class":104},"    controller_server_node ",[77,9969,1336],{"class":97},[77,9971,1488],{"class":104},[77,9973,9975,9977,9979,9982],{"class":79,"line":9974},67,[77,9976,1528],{"class":1391},[77,9978,1336],{"class":97},[77,9980,9981],{"class":87},"'nav2_controller'",[77,9983,1385],{"class":104},[77,9985,9987,9989,9991,9994],{"class":79,"line":9986},68,[77,9988,1541],{"class":1391},[77,9990,1336],{"class":97},[77,9992,9993],{"class":87},"'controller_server'",[77,9995,1385],{"class":104},[77,9997,9999,10001,10003,10005],{"class":79,"line":9998},69,[77,10000,1554],{"class":1391},[77,10002,1336],{"class":97},[77,10004,9993],{"class":87},[77,10006,1385],{"class":104},[77,10008,10010,10012,10014,10016],{"class":79,"line":10009},70,[77,10011,1566],{"class":1391},[77,10013,1336],{"class":97},[77,10015,1571],{"class":87},[77,10017,1385],{"class":104},[77,10019,10021,10023,10025],{"class":79,"line":10020},71,[77,10022,1494],{"class":1391},[77,10024,1336],{"class":97},[77,10026,1499],{"class":104},[77,10028,10030],{"class":79,"line":10029},72,[77,10031,10032],{"class":104},"            controller_params,\n",[77,10034,10036,10038,10040],{"class":79,"line":10035},73,[77,10037,3297],{"class":104},[77,10039,1342],{"class":87},[77,10041,1516],{"class":104},[77,10043,10045],{"class":79,"line":10044},74,[77,10046,1522],{"class":104},[77,10048,10050,10053,10055],{"class":79,"line":10049},75,[77,10051,10052],{"class":1391},"        remappings",[77,10054,1336],{"class":97},[77,10056,1499],{"class":104},[77,10058,10060,10063,10066,10068,10071],{"class":79,"line":10059},76,[77,10061,10062],{"class":104},"            (",[77,10064,10065],{"class":87},"'cmd_vel'",[77,10067,1455],{"class":104},[77,10069,10070],{"class":87},"'cmd_vel_nav'",[77,10072,1345],{"class":104},[77,10074,10076],{"class":79,"line":10075},77,[77,10077,6257],{"class":104},[77,10079,10081],{"class":79,"line":10080},78,[77,10082,3250],{"class":104},[77,10084,10086],{"class":79,"line":10085},79,[77,10087,140],{"emptyLinePlaceholder":139},[77,10089,10091,10094,10096],{"class":79,"line":10090},80,[77,10092,10093],{"class":104},"    behavior_server_node ",[77,10095,1336],{"class":97},[77,10097,1488],{"class":104},[77,10099,10101,10103,10105,10108],{"class":79,"line":10100},81,[77,10102,1528],{"class":1391},[77,10104,1336],{"class":97},[77,10106,10107],{"class":87},"'nav2_behaviors'",[77,10109,1385],{"class":104},[77,10111,10113,10115,10117,10120],{"class":79,"line":10112},82,[77,10114,1541],{"class":1391},[77,10116,1336],{"class":97},[77,10118,10119],{"class":87},"'behavior_server'",[77,10121,1385],{"class":104},[77,10123,10125,10127,10129,10131],{"class":79,"line":10124},83,[77,10126,1554],{"class":1391},[77,10128,1336],{"class":97},[77,10130,10119],{"class":87},[77,10132,1385],{"class":104},[77,10134,10136,10138,10140,10142],{"class":79,"line":10135},84,[77,10137,1566],{"class":1391},[77,10139,1336],{"class":97},[77,10141,1571],{"class":87},[77,10143,1385],{"class":104},[77,10145,10147,10149,10151],{"class":79,"line":10146},85,[77,10148,1494],{"class":1391},[77,10150,1336],{"class":97},[77,10152,1499],{"class":104},[77,10154,10156],{"class":79,"line":10155},86,[77,10157,10158],{"class":104},"            behavior_params,\n",[77,10160,10162,10164,10166],{"class":79,"line":10161},87,[77,10163,3297],{"class":104},[77,10165,1342],{"class":87},[77,10167,1516],{"class":104},[77,10169,10171],{"class":79,"line":10170},88,[77,10172,6257],{"class":104},[77,10174,10176],{"class":79,"line":10175},89,[77,10177,3250],{"class":104},[77,10179,10181],{"class":79,"line":10180},90,[77,10182,140],{"emptyLinePlaceholder":139},[77,10184,10186,10189,10191],{"class":79,"line":10185},91,[77,10187,10188],{"class":104},"    waypoint_node ",[77,10190,1336],{"class":97},[77,10192,1488],{"class":104},[77,10194,10196,10198,10200,10203],{"class":79,"line":10195},92,[77,10197,1528],{"class":1391},[77,10199,1336],{"class":97},[77,10201,10202],{"class":87},"'nav2_waypoint_follower'",[77,10204,1385],{"class":104},[77,10206,10208,10210,10212,10215],{"class":79,"line":10207},93,[77,10209,1541],{"class":1391},[77,10211,1336],{"class":97},[77,10213,10214],{"class":87},"'waypoint_follower'",[77,10216,1385],{"class":104},[77,10218,10220,10222,10224,10226],{"class":79,"line":10219},94,[77,10221,1554],{"class":1391},[77,10223,1336],{"class":97},[77,10225,10214],{"class":87},[77,10227,1385],{"class":104},[77,10229,10231,10233,10235,10237],{"class":79,"line":10230},95,[77,10232,1566],{"class":1391},[77,10234,1336],{"class":97},[77,10236,1571],{"class":87},[77,10238,1385],{"class":104},[77,10240,10242,10244,10246],{"class":79,"line":10241},96,[77,10243,1494],{"class":1391},[77,10245,1336],{"class":97},[77,10247,1499],{"class":104},[77,10249,10251],{"class":79,"line":10250},97,[77,10252,10253],{"class":104},"            waypoint_params,\n",[77,10255,10257,10259,10261],{"class":79,"line":10256},98,[77,10258,3297],{"class":104},[77,10260,1342],{"class":87},[77,10262,1516],{"class":104},[77,10264,10266],{"class":79,"line":10265},99,[77,10267,6257],{"class":104},[77,10269,10271],{"class":79,"line":10270},100,[77,10272,3250],{"class":104},[77,10274,10276],{"class":79,"line":10275},101,[77,10277,140],{"emptyLinePlaceholder":139},[77,10279,10281,10284,10286],{"class":79,"line":10280},102,[77,10282,10283],{"class":104},"    velocity_smoother_node ",[77,10285,1336],{"class":97},[77,10287,1488],{"class":104},[77,10289,10291,10293,10295,10298],{"class":79,"line":10290},103,[77,10292,1528],{"class":1391},[77,10294,1336],{"class":97},[77,10296,10297],{"class":87},"'nav2_velocity_smoother'",[77,10299,1385],{"class":104},[77,10301,10303,10305,10307,10310],{"class":79,"line":10302},104,[77,10304,1541],{"class":1391},[77,10306,1336],{"class":97},[77,10308,10309],{"class":87},"'velocity_smoother'",[77,10311,1385],{"class":104},[77,10313,10315,10317,10319,10321],{"class":79,"line":10314},105,[77,10316,1554],{"class":1391},[77,10318,1336],{"class":97},[77,10320,10309],{"class":87},[77,10322,1385],{"class":104},[77,10324,10326,10328,10330,10332],{"class":79,"line":10325},106,[77,10327,1566],{"class":1391},[77,10329,1336],{"class":97},[77,10331,1571],{"class":87},[77,10333,1385],{"class":104},[77,10335,10337,10340,10342,10345],{"class":79,"line":10336},107,[77,10338,10339],{"class":1391},"        respawn_delay",[77,10341,1336],{"class":97},[77,10343,10344],{"class":1217},"2.0",[77,10346,1385],{"class":104},[77,10348,10350,10352,10354],{"class":79,"line":10349},108,[77,10351,1494],{"class":1391},[77,10353,1336],{"class":97},[77,10355,1499],{"class":104},[77,10357,10359],{"class":79,"line":10358},109,[77,10360,10361],{"class":104},"            velocity_params,\n",[77,10363,10365,10367,10369],{"class":79,"line":10364},110,[77,10366,3297],{"class":104},[77,10368,1342],{"class":87},[77,10370,1516],{"class":104},[77,10372,10374],{"class":79,"line":10373},111,[77,10375,1522],{"class":104},[77,10377,10379,10381,10383],{"class":79,"line":10378},112,[77,10380,10052],{"class":1391},[77,10382,1336],{"class":97},[77,10384,1499],{"class":104},[77,10386,10388,10390,10392,10394,10396],{"class":79,"line":10387},113,[77,10389,10062],{"class":104},[77,10391,10065],{"class":87},[77,10393,1455],{"class":104},[77,10395,10070],{"class":87},[77,10397,1446],{"class":104},[77,10399,10401,10403,10406,10408,10410],{"class":79,"line":10400},114,[77,10402,10062],{"class":104},[77,10404,10405],{"class":87},"'cmd_vel_smoothed'",[77,10407,1455],{"class":104},[77,10409,10065],{"class":87},[77,10411,1345],{"class":104},[77,10413,10415],{"class":79,"line":10414},115,[77,10416,6257],{"class":104},[77,10418,10420],{"class":79,"line":10419},116,[77,10421,3250],{"class":104},[77,10423,10425],{"class":79,"line":10424},117,[77,10426,140],{"emptyLinePlaceholder":139},[77,10428,10430,10433,10435],{"class":79,"line":10429},118,[77,10431,10432],{"class":104},"    smoother_server_node ",[77,10434,1336],{"class":97},[77,10436,1488],{"class":104},[77,10438,10440,10442,10444,10447],{"class":79,"line":10439},119,[77,10441,1528],{"class":1391},[77,10443,1336],{"class":97},[77,10445,10446],{"class":87},"'nav2_smoother'",[77,10448,1385],{"class":104},[77,10450,10452,10454,10456,10459],{"class":79,"line":10451},120,[77,10453,1541],{"class":1391},[77,10455,1336],{"class":97},[77,10457,10458],{"class":87},"'smoother_server'",[77,10460,1385],{"class":104},[77,10462,10464,10466,10468,10470],{"class":79,"line":10463},121,[77,10465,1554],{"class":1391},[77,10467,1336],{"class":97},[77,10469,10458],{"class":87},[77,10471,1385],{"class":104},[77,10473,10475,10477,10479,10481],{"class":79,"line":10474},122,[77,10476,1566],{"class":1391},[77,10478,1336],{"class":97},[77,10480,1571],{"class":87},[77,10482,1385],{"class":104},[77,10484,10486,10488,10490],{"class":79,"line":10485},123,[77,10487,1494],{"class":1391},[77,10489,1336],{"class":97},[77,10491,1499],{"class":104},[77,10493,10495],{"class":79,"line":10494},124,[77,10496,10497],{"class":104},"            smoother_params,\n",[77,10499,10501,10503,10505],{"class":79,"line":10500},125,[77,10502,3297],{"class":104},[77,10504,1342],{"class":87},[77,10506,1516],{"class":104},[77,10508,10510],{"class":79,"line":10509},126,[77,10511,1522],{"class":104},[77,10513,10515],{"class":79,"line":10514},127,[77,10516,3250],{"class":104},[77,10518,10520],{"class":79,"line":10519},128,[77,10521,140],{"emptyLinePlaceholder":139},[77,10523,10525,10528,10530],{"class":79,"line":10524},129,[77,10526,10527],{"class":104},"    bt_navigator_node ",[77,10529,1336],{"class":97},[77,10531,1488],{"class":104},[77,10533,10535,10537,10539,10542],{"class":79,"line":10534},130,[77,10536,1528],{"class":1391},[77,10538,1336],{"class":97},[77,10540,10541],{"class":87},"'nav2_bt_navigator'",[77,10543,1385],{"class":104},[77,10545,10547,10549,10551,10554],{"class":79,"line":10546},131,[77,10548,1541],{"class":1391},[77,10550,1336],{"class":97},[77,10552,10553],{"class":87},"'bt_navigator'",[77,10555,1385],{"class":104},[77,10557,10559,10561,10563,10565],{"class":79,"line":10558},132,[77,10560,1554],{"class":1391},[77,10562,1336],{"class":97},[77,10564,10553],{"class":87},[77,10566,1385],{"class":104},[77,10568,10570,10572,10574,10576],{"class":79,"line":10569},133,[77,10571,1566],{"class":1391},[77,10573,1336],{"class":97},[77,10575,1571],{"class":87},[77,10577,1385],{"class":104},[77,10579,10581,10583,10585],{"class":79,"line":10580},134,[77,10582,1494],{"class":1391},[77,10584,1336],{"class":97},[77,10586,1499],{"class":104},[77,10588,10590],{"class":79,"line":10589},135,[77,10591,10592],{"class":104},"            bt_params,\n",[77,10594,10596,10598,10600],{"class":79,"line":10595},136,[77,10597,3297],{"class":104},[77,10599,1342],{"class":87},[77,10601,10602],{"class":104},": use_sim_time},\n",[77,10604,10606],{"class":79,"line":10605},137,[77,10607,10608],{"class":104},"            {\n",[77,10610,10612,10615],{"class":79,"line":10611},138,[77,10613,10614],{"class":87},"                \"default_nav_to_pose_bt_xml\"",[77,10616,10617],{"class":104},": os.path.join(\n",[77,10619,10621],{"class":79,"line":10620},139,[77,10622,10623],{"class":104},"                    current_pkg,\n",[77,10625,10627,10630],{"class":79,"line":10626},140,[77,10628,10629],{"class":87},"                    \"bts\"",[77,10631,1385],{"class":104},[77,10633,10635],{"class":79,"line":10634},141,[77,10636,10637],{"class":87},"                    \"bt_planner_controller_behavior.xml\"\n",[77,10639,10641],{"class":79,"line":10640},142,[77,10642,10643],{"class":104},"                )\n",[77,10645,10647],{"class":79,"line":10646},143,[77,10648,10649],{"class":104},"            },\n",[77,10651,10653],{"class":79,"line":10652},144,[77,10654,10608],{"class":104},[77,10656,10658,10661],{"class":79,"line":10657},145,[77,10659,10660],{"class":87},"                \"default_nav_through_poses_bt_xml\"",[77,10662,10617],{"class":104},[77,10664,10666],{"class":79,"line":10665},146,[77,10667,10623],{"class":104},[77,10669,10671,10673],{"class":79,"line":10670},147,[77,10672,10629],{"class":87},[77,10674,1385],{"class":104},[77,10676,10678],{"class":79,"line":10677},148,[77,10679,10680],{"class":87},"                    \"bt_planner_controller_behavior_poses.xml\"\n",[77,10682,10684],{"class":79,"line":10683},149,[77,10685,10643],{"class":104},[77,10687,10689],{"class":79,"line":10688},150,[77,10690,10691],{"class":104},"            }\n",[77,10693,10695],{"class":79,"line":10694},151,[77,10696,1522],{"class":104},[77,10698,10700],{"class":79,"line":10699},152,[77,10701,3250],{"class":104},[77,10703,10705],{"class":79,"line":10704},153,[77,10706,140],{"emptyLinePlaceholder":139},[77,10708,10710,10713,10715],{"class":79,"line":10709},154,[77,10711,10712],{"class":104},"    lifecycle_manager_node ",[77,10714,1336],{"class":97},[77,10716,1488],{"class":104},[77,10718,10720,10722,10724,10726],{"class":79,"line":10719},155,[77,10721,1528],{"class":1391},[77,10723,1336],{"class":97},[77,10725,5363],{"class":87},[77,10727,1385],{"class":104},[77,10729,10731,10733,10735,10737],{"class":79,"line":10730},156,[77,10732,1541],{"class":1391},[77,10734,1336],{"class":97},[77,10736,5375],{"class":87},[77,10738,1385],{"class":104},[77,10740,10742,10744,10746,10749],{"class":79,"line":10741},157,[77,10743,1554],{"class":1391},[77,10745,1336],{"class":97},[77,10747,10748],{"class":87},"'lifecycle_manager_navigation'",[77,10750,1385],{"class":104},[77,10752,10754,10756,10758,10760],{"class":79,"line":10753},158,[77,10755,1566],{"class":1391},[77,10757,1336],{"class":97},[77,10759,1571],{"class":87},[77,10761,1385],{"class":104},[77,10763,10765,10767,10769],{"class":79,"line":10764},159,[77,10766,1494],{"class":1391},[77,10768,1336],{"class":97},[77,10770,1499],{"class":104},[77,10772,10774,10776,10778],{"class":79,"line":10773},160,[77,10775,3297],{"class":104},[77,10777,1342],{"class":87},[77,10779,10602],{"class":104},[77,10781,10783,10785,10787,10789,10791],{"class":79,"line":10782},161,[77,10784,3297],{"class":104},[77,10786,5425],{"class":87},[77,10788,1666],{"class":104},[77,10790,5325],{"class":1217},[77,10792,5328],{"class":104},[77,10794,10796],{"class":79,"line":10795},162,[77,10797,10608],{"class":104},[77,10799,10801,10804],{"class":79,"line":10800},163,[77,10802,10803],{"class":87},"                'node_names'",[77,10805,10806],{"class":104},": [\n",[77,10808,10810,10813],{"class":79,"line":10809},164,[77,10811,10812],{"class":87},"                    'bt_navigator'",[77,10814,1385],{"class":104},[77,10816,10818,10821],{"class":79,"line":10817},165,[77,10819,10820],{"class":87},"                    'planner_server'",[77,10822,1385],{"class":104},[77,10824,10826,10829],{"class":79,"line":10825},166,[77,10827,10828],{"class":87},"                    'controller_server'",[77,10830,1385],{"class":104},[77,10832,10834,10837],{"class":79,"line":10833},167,[77,10835,10836],{"class":87},"                    'behavior_server'",[77,10838,1385],{"class":104},[77,10840,10842,10845],{"class":79,"line":10841},168,[77,10843,10844],{"class":87},"                    'waypoint_follower'",[77,10846,1385],{"class":104},[77,10848,10850,10853],{"class":79,"line":10849},169,[77,10851,10852],{"class":87},"                    'velocity_smoother'",[77,10854,1385],{"class":104},[77,10856,10858],{"class":79,"line":10857},170,[77,10859,10860],{"class":87},"                    'smoother_server'\n",[77,10862,10864],{"class":79,"line":10863},171,[77,10865,10866],{"class":104},"                ]\n",[77,10868,10870],{"class":79,"line":10869},172,[77,10871,10691],{"class":104},[77,10873,10875],{"class":79,"line":10874},173,[77,10876,6257],{"class":104},[77,10878,10880],{"class":79,"line":10879},174,[77,10881,3250],{"class":104},[77,10883,10885],{"class":79,"line":10884},175,[77,10886,140],{"emptyLinePlaceholder":139},[77,10888,10890,10892],{"class":79,"line":10889},176,[77,10891,1623],{"class":97},[77,10893,3333],{"class":104},[77,10895,10897],{"class":79,"line":10896},177,[77,10898,3338],{"class":104},[77,10900,10902],{"class":79,"line":10901},178,[77,10903,140],{"emptyLinePlaceholder":139},[77,10905,10907],{"class":79,"line":10906},179,[77,10908,10909],{"class":104},"        lifecycle_manager_node,\n",[77,10911,10913],{"class":79,"line":10912},180,[77,10914,10915],{"class":104},"        bt_navigator_node,\n",[77,10917,10919],{"class":79,"line":10918},181,[77,10920,10921],{"class":104},"        planner_server_node,\n",[77,10923,10925],{"class":79,"line":10924},182,[77,10926,10927],{"class":104},"        controller_server_node,\n",[77,10929,10931],{"class":79,"line":10930},183,[77,10932,10933],{"class":104},"        behavior_server_node,\n",[77,10935,10937],{"class":79,"line":10936},184,[77,10938,10939],{"class":104},"        waypoint_node,\n",[77,10941,10943],{"class":79,"line":10942},185,[77,10944,10945],{"class":104},"        velocity_smoother_node,\n",[77,10947,10949],{"class":79,"line":10948},186,[77,10950,10951],{"class":104},"        smoother_server_node\n",[77,10953,10955],{"class":79,"line":10954},187,[77,10956,3358],{"class":104},[18,10958,10959],{},"該launch文件主要是加載了生命週期管理器、行為樹、規劃器、控制器、恢復器、航點跟蹤、路徑平滑以及速度平滑等節點。並且除了生命週期管理器節點外，每個節點都還會加載一個配置文件，接下來需要編輯這些配置文。",[18,10961,10962],{},[21,10963,10964],{},"（1）bt_navigator相關配置文件",[18,10966,10967],{},"bt_navigator相關配置文件有兩個，分別是描述行為樹的xml文件，以及yaml格式的參數文件，前者存儲在bts目錄下，後者存儲在params目錄下。",[18,10969,10970,10971,10974],{},"請在bts目錄下，新建一個名為",[74,10972,10973],{},"bt_planner_controller_behavior.xml","的文件並輸入如下內容：",[68,10976,10980],{"className":10977,"code":10978,"language":10979,"meta":32,"style":32},"language-xml shiki shiki-themes github-light github-dark","\n\u003Croot main_tree_to_execute=\"MainTree\">\n  \u003CBehaviorTree ID=\"MainTree\">\n    \u003CRecoveryNode number_of_retries=\"6\" name=\"NavigateRecovery\">\n      \u003CPipelineSequence name=\"NavigateWithReplanning\">\n        \u003CRateController hz=\"1.0\">\n          \u003CRecoveryNode number_of_retries=\"1\" name=\"ComputePathToPose\">\n            \u003CComputePathToPose goal=\"{goal}\" path=\"{path}\" planner_id=\"GridBased\"/>\n            \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Context\" service_name=\"global_costmap/clear_entirely_global_costmap\"/>\n          \u003C/RecoveryNode>\n        \u003C/RateController>\n        \u003CRecoveryNode number_of_retries=\"1\" name=\"FollowPath\">\n          \u003CFollowPath path=\"{path}\" controller_id=\"FollowPath\"/>\n          \u003CClearEntireCostmap name=\"ClearLocalCostmap-Context\" service_name=\"local_costmap/clear_entirely_local_costmap\"/>\n        \u003C/RecoveryNode>\n      \u003C/PipelineSequence>\n      \u003CReactiveFallback name=\"RecoveryFallback\">\n        \u003CGoalUpdated/>\n        \u003CRoundRobin name=\"RecoveryActions\">\n          \u003CSequence name=\"ClearingActions\">\n            \u003CClearEntireCostmap name=\"ClearLocalCostmap-Subtree\" service_name=\"local_costmap/clear_entirely_local_costmap\"/>\n            \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Subtree\" service_name=\"global_costmap/clear_entirely_global_costmap\"/>\n          \u003C/Sequence>\n          \u003CSpin spin_dist=\"1.57\"/>\n          \u003CWait wait_duration=\"5\"/>\n          \u003CBackUp backup_dist=\"0.30\" backup_speed=\"0.05\"/>\n        \u003C/RoundRobin>\n      \u003C/ReactiveFallback>\n    \u003C/RecoveryNode>\n  \u003C/BehaviorTree>\n\u003C/root>\n","xml",[74,10981,10982,10986,11004,11021,11047,11064,11082,11105,11140,11164,11173,11182,11203,11225,11247,11255,11264,11280,11289,11305,11321,11342,11363,11371,11388,11405,11430,11438,11446,11455,11464],{"__ignoreMap":32},[77,10983,10984],{"class":79,"line":80},[77,10985,140],{"emptyLinePlaceholder":139},[77,10987,10988,10990,10993,10996,10998,11001],{"class":79,"line":114},[77,10989,98],{"class":104},[77,10991,10992],{"class":1648},"root",[77,10994,10995],{"class":83}," main_tree_to_execute",[77,10997,1336],{"class":104},[77,10999,11000],{"class":87},"\"MainTree\"",[77,11002,11003],{"class":104},">\n",[77,11005,11006,11009,11012,11015,11017,11019],{"class":79,"line":136},[77,11007,11008],{"class":104},"  \u003C",[77,11010,11011],{"class":1648},"BehaviorTree",[77,11013,11014],{"class":83}," ID",[77,11016,1336],{"class":104},[77,11018,11000],{"class":87},[77,11020,11003],{"class":104},[77,11022,11023,11026,11029,11032,11034,11037,11040,11042,11045],{"class":79,"line":143},[77,11024,11025],{"class":104},"    \u003C",[77,11027,11028],{"class":1648},"RecoveryNode",[77,11030,11031],{"class":83}," number_of_retries",[77,11033,1336],{"class":104},[77,11035,11036],{"class":87},"\"6\"",[77,11038,11039],{"class":83}," name",[77,11041,1336],{"class":104},[77,11043,11044],{"class":87},"\"NavigateRecovery\"",[77,11046,11003],{"class":104},[77,11048,11049,11052,11055,11057,11059,11062],{"class":79,"line":150},[77,11050,11051],{"class":104},"      \u003C",[77,11053,11054],{"class":1648},"PipelineSequence",[77,11056,11039],{"class":83},[77,11058,1336],{"class":104},[77,11060,11061],{"class":87},"\"NavigateWithReplanning\"",[77,11063,11003],{"class":104},[77,11065,11066,11069,11072,11075,11077,11080],{"class":79,"line":162},[77,11067,11068],{"class":104},"        \u003C",[77,11070,11071],{"class":1648},"RateController",[77,11073,11074],{"class":83}," hz",[77,11076,1336],{"class":104},[77,11078,11079],{"class":87},"\"1.0\"",[77,11081,11003],{"class":104},[77,11083,11084,11087,11089,11091,11093,11096,11098,11100,11103],{"class":79,"line":174},[77,11085,11086],{"class":104},"          \u003C",[77,11088,11028],{"class":1648},[77,11090,11031],{"class":83},[77,11092,1336],{"class":104},[77,11094,11095],{"class":87},"\"1\"",[77,11097,11039],{"class":83},[77,11099,1336],{"class":104},[77,11101,11102],{"class":87},"\"ComputePathToPose\"",[77,11104,11003],{"class":104},[77,11106,11107,11110,11113,11116,11118,11121,11124,11126,11129,11132,11134,11137],{"class":79,"line":179},[77,11108,11109],{"class":104},"            \u003C",[77,11111,11112],{"class":1648},"ComputePathToPose",[77,11114,11115],{"class":83}," goal",[77,11117,1336],{"class":104},[77,11119,11120],{"class":87},"\"{goal}\"",[77,11122,11123],{"class":83}," path",[77,11125,1336],{"class":104},[77,11127,11128],{"class":87},"\"{path}\"",[77,11130,11131],{"class":83}," planner_id",[77,11133,1336],{"class":104},[77,11135,11136],{"class":87},"\"GridBased\"",[77,11138,11139],{"class":104},"/>\n",[77,11141,11142,11144,11147,11149,11151,11154,11157,11159,11162],{"class":79,"line":185},[77,11143,11109],{"class":104},[77,11145,11146],{"class":1648},"ClearEntireCostmap",[77,11148,11039],{"class":83},[77,11150,1336],{"class":104},[77,11152,11153],{"class":87},"\"ClearGlobalCostmap-Context\"",[77,11155,11156],{"class":83}," service_name",[77,11158,1336],{"class":104},[77,11160,11161],{"class":87},"\"global_costmap/clear_entirely_global_costmap\"",[77,11163,11139],{"class":104},[77,11165,11166,11169,11171],{"class":79,"line":197},[77,11167,11168],{"class":104},"          \u003C/",[77,11170,11028],{"class":1648},[77,11172,11003],{"class":104},[77,11174,11175,11178,11180],{"class":79,"line":1348},[77,11176,11177],{"class":104},"        \u003C/",[77,11179,11071],{"class":1648},[77,11181,11003],{"class":104},[77,11183,11184,11186,11188,11190,11192,11194,11196,11198,11201],{"class":79,"line":1363},[77,11185,11068],{"class":104},[77,11187,11028],{"class":1648},[77,11189,11031],{"class":83},[77,11191,1336],{"class":104},[77,11193,11095],{"class":87},[77,11195,11039],{"class":83},[77,11197,1336],{"class":104},[77,11199,11200],{"class":87},"\"FollowPath\"",[77,11202,11003],{"class":104},[77,11204,11205,11207,11210,11212,11214,11216,11219,11221,11223],{"class":79,"line":1368},[77,11206,11086],{"class":104},[77,11208,11209],{"class":1648},"FollowPath",[77,11211,11123],{"class":83},[77,11213,1336],{"class":104},[77,11215,11128],{"class":87},[77,11217,11218],{"class":83}," controller_id",[77,11220,1336],{"class":104},[77,11222,11200],{"class":87},[77,11224,11139],{"class":104},[77,11226,11227,11229,11231,11233,11235,11238,11240,11242,11245],{"class":79,"line":1379},[77,11228,11086],{"class":104},[77,11230,11146],{"class":1648},[77,11232,11039],{"class":83},[77,11234,1336],{"class":104},[77,11236,11237],{"class":87},"\"ClearLocalCostmap-Context\"",[77,11239,11156],{"class":83},[77,11241,1336],{"class":104},[77,11243,11244],{"class":87},"\"local_costmap/clear_entirely_local_costmap\"",[77,11246,11139],{"class":104},[77,11248,11249,11251,11253],{"class":79,"line":1388},[77,11250,11177],{"class":104},[77,11252,11028],{"class":1648},[77,11254,11003],{"class":104},[77,11256,11257,11260,11262],{"class":79,"line":1402},[77,11258,11259],{"class":104},"      \u003C/",[77,11261,11054],{"class":1648},[77,11263,11003],{"class":104},[77,11265,11266,11268,11271,11273,11275,11278],{"class":79,"line":1415},[77,11267,11051],{"class":104},[77,11269,11270],{"class":1648},"ReactiveFallback",[77,11272,11039],{"class":83},[77,11274,1336],{"class":104},[77,11276,11277],{"class":87},"\"RecoveryFallback\"",[77,11279,11003],{"class":104},[77,11281,11282,11284,11287],{"class":79,"line":1425},[77,11283,11068],{"class":104},[77,11285,11286],{"class":1648},"GoalUpdated",[77,11288,11139],{"class":104},[77,11290,11291,11293,11296,11298,11300,11303],{"class":79,"line":1433},[77,11292,11068],{"class":104},[77,11294,11295],{"class":1648},"RoundRobin",[77,11297,11039],{"class":83},[77,11299,1336],{"class":104},[77,11301,11302],{"class":87},"\"RecoveryActions\"",[77,11304,11003],{"class":104},[77,11306,11307,11309,11312,11314,11316,11319],{"class":79,"line":1449},[77,11308,11086],{"class":104},[77,11310,11311],{"class":1648},"Sequence",[77,11313,11039],{"class":83},[77,11315,1336],{"class":104},[77,11317,11318],{"class":87},"\"ClearingActions\"",[77,11320,11003],{"class":104},[77,11322,11323,11325,11327,11329,11331,11334,11336,11338,11340],{"class":79,"line":1463},[77,11324,11109],{"class":104},[77,11326,11146],{"class":1648},[77,11328,11039],{"class":83},[77,11330,1336],{"class":104},[77,11332,11333],{"class":87},"\"ClearLocalCostmap-Subtree\"",[77,11335,11156],{"class":83},[77,11337,1336],{"class":104},[77,11339,11244],{"class":87},[77,11341,11139],{"class":104},[77,11343,11344,11346,11348,11350,11352,11355,11357,11359,11361],{"class":79,"line":1475},[77,11345,11109],{"class":104},[77,11347,11146],{"class":1648},[77,11349,11039],{"class":83},[77,11351,1336],{"class":104},[77,11353,11354],{"class":87},"\"ClearGlobalCostmap-Subtree\"",[77,11356,11156],{"class":83},[77,11358,1336],{"class":104},[77,11360,11161],{"class":87},[77,11362,11139],{"class":104},[77,11364,11365,11367,11369],{"class":79,"line":1480},[77,11366,11168],{"class":104},[77,11368,11311],{"class":1648},[77,11370,11003],{"class":104},[77,11372,11373,11375,11378,11381,11383,11386],{"class":79,"line":1491},[77,11374,11086],{"class":104},[77,11376,11377],{"class":1648},"Spin",[77,11379,11380],{"class":83}," spin_dist",[77,11382,1336],{"class":104},[77,11384,11385],{"class":87},"\"1.57\"",[77,11387,11139],{"class":104},[77,11389,11390,11392,11395,11398,11400,11403],{"class":79,"line":1502},[77,11391,11086],{"class":104},[77,11393,11394],{"class":1648},"Wait",[77,11396,11397],{"class":83}," wait_duration",[77,11399,1336],{"class":104},[77,11401,11402],{"class":87},"\"5\"",[77,11404,11139],{"class":104},[77,11406,11407,11409,11412,11415,11417,11420,11423,11425,11428],{"class":79,"line":1508},[77,11408,11086],{"class":104},[77,11410,11411],{"class":1648},"BackUp",[77,11413,11414],{"class":83}," backup_dist",[77,11416,1336],{"class":104},[77,11418,11419],{"class":87},"\"0.30\"",[77,11421,11422],{"class":83}," backup_speed",[77,11424,1336],{"class":104},[77,11426,11427],{"class":87},"\"0.05\"",[77,11429,11139],{"class":104},[77,11431,11432,11434,11436],{"class":79,"line":1519},[77,11433,11177],{"class":104},[77,11435,11295],{"class":1648},[77,11437,11003],{"class":104},[77,11439,11440,11442,11444],{"class":79,"line":1525},[77,11441,11259],{"class":104},[77,11443,11270],{"class":1648},[77,11445,11003],{"class":104},[77,11447,11448,11451,11453],{"class":79,"line":1538},[77,11449,11450],{"class":104},"    \u003C/",[77,11452,11028],{"class":1648},[77,11454,11003],{"class":104},[77,11456,11457,11460,11462],{"class":79,"line":1551},[77,11458,11459],{"class":104},"  \u003C/",[77,11461,11011],{"class":1648},[77,11463,11003],{"class":104},[77,11465,11466,11469,11471],{"class":79,"line":1563},[77,11467,11468],{"class":104},"\u003C/",[77,11470,10992],{"class":1648},[77,11472,11003],{"class":104},[18,11474,11475,11476,5194],{},"繼續在bts目錄下新建一個名為",[74,11477,11478],{},"bt_planner_controller_behavior_poses.xml",[68,11480,11482],{"className":10977,"code":11481,"language":10979,"meta":32,"style":32},"\n\u003Croot main_tree_to_execute=\"MainTree\">\n  \u003CBehaviorTree ID=\"MainTree\">\n    \u003CRecoveryNode number_of_retries=\"6\" name=\"NavigateRecovery\">\n      \u003CPipelineSequence name=\"NavigateWithReplanning\">\n        \u003CRateController hz=\"0.333\">\n          \u003CRecoveryNode number_of_retries=\"1\" name=\"ComputePathThroughPoses\">\n            \u003CReactiveSequence>\n              \u003CRemovePassedGoals input_goals=\"{goals}\" output_goals=\"{goals}\" radius=\"0.7\"/>\n              \u003CComputePathThroughPoses goals=\"{goals}\" path=\"{path}\" planner_id=\"GridBased\"/>\n            \u003C/ReactiveSequence>\n            \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Context\" service_name=\"global_costmap/clear_entirely_global_costmap\"/>\n          \u003C/RecoveryNode>\n        \u003C/RateController>\n        \u003CRecoveryNode number_of_retries=\"1\" name=\"FollowPath\">\n          \u003CFollowPath path=\"{path}\" controller_id=\"FollowPath\"/>\n          \u003CClearEntireCostmap name=\"ClearLocalCostmap-Context\" service_name=\"local_costmap/clear_entirely_local_costmap\"/>\n        \u003C/RecoveryNode>\n      \u003C/PipelineSequence>\n      \u003CReactiveFallback name=\"RecoveryFallback\">\n        \u003CGoalUpdated/>\n        \u003CRoundRobin name=\"RecoveryActions\">\n          \u003CSequence name=\"ClearingActions\">\n            \u003CClearEntireCostmap name=\"ClearLocalCostmap-Subtree\" service_name=\"local_costmap/clear_entirely_local_costmap\"/>\n            \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Subtree\" service_name=\"global_costmap/clear_entirely_global_costmap\"/>\n          \u003C/Sequence>\n          \u003CSpin spin_dist=\"1.57\"/>\n          \u003CWait wait_duration=\"5\"/>\n          \u003CBackUp backup_dist=\"0.30\" backup_speed=\"0.05\"/>\n        \u003C/RoundRobin>\n      \u003C/ReactiveFallback>\n    \u003C/RecoveryNode>\n  \u003C/BehaviorTree>\n\u003C/root>\n",[74,11483,11484,11488,11502,11516,11536,11550,11565,11586,11595,11628,11656,11665,11685,11693,11701,11721,11741,11761,11769,11777,11791,11799,11813,11827,11847,11867,11875,11889,11903,11923,11931,11939,11947,11955],{"__ignoreMap":32},[77,11485,11486],{"class":79,"line":80},[77,11487,140],{"emptyLinePlaceholder":139},[77,11489,11490,11492,11494,11496,11498,11500],{"class":79,"line":114},[77,11491,98],{"class":104},[77,11493,10992],{"class":1648},[77,11495,10995],{"class":83},[77,11497,1336],{"class":104},[77,11499,11000],{"class":87},[77,11501,11003],{"class":104},[77,11503,11504,11506,11508,11510,11512,11514],{"class":79,"line":136},[77,11505,11008],{"class":104},[77,11507,11011],{"class":1648},[77,11509,11014],{"class":83},[77,11511,1336],{"class":104},[77,11513,11000],{"class":87},[77,11515,11003],{"class":104},[77,11517,11518,11520,11522,11524,11526,11528,11530,11532,11534],{"class":79,"line":143},[77,11519,11025],{"class":104},[77,11521,11028],{"class":1648},[77,11523,11031],{"class":83},[77,11525,1336],{"class":104},[77,11527,11036],{"class":87},[77,11529,11039],{"class":83},[77,11531,1336],{"class":104},[77,11533,11044],{"class":87},[77,11535,11003],{"class":104},[77,11537,11538,11540,11542,11544,11546,11548],{"class":79,"line":150},[77,11539,11051],{"class":104},[77,11541,11054],{"class":1648},[77,11543,11039],{"class":83},[77,11545,1336],{"class":104},[77,11547,11061],{"class":87},[77,11549,11003],{"class":104},[77,11551,11552,11554,11556,11558,11560,11563],{"class":79,"line":162},[77,11553,11068],{"class":104},[77,11555,11071],{"class":1648},[77,11557,11074],{"class":83},[77,11559,1336],{"class":104},[77,11561,11562],{"class":87},"\"0.333\"",[77,11564,11003],{"class":104},[77,11566,11567,11569,11571,11573,11575,11577,11579,11581,11584],{"class":79,"line":174},[77,11568,11086],{"class":104},[77,11570,11028],{"class":1648},[77,11572,11031],{"class":83},[77,11574,1336],{"class":104},[77,11576,11095],{"class":87},[77,11578,11039],{"class":83},[77,11580,1336],{"class":104},[77,11582,11583],{"class":87},"\"ComputePathThroughPoses\"",[77,11585,11003],{"class":104},[77,11587,11588,11590,11593],{"class":79,"line":179},[77,11589,11109],{"class":104},[77,11591,11592],{"class":1648},"ReactiveSequence",[77,11594,11003],{"class":104},[77,11596,11597,11600,11603,11606,11608,11611,11614,11616,11618,11621,11623,11626],{"class":79,"line":185},[77,11598,11599],{"class":104},"              \u003C",[77,11601,11602],{"class":1648},"RemovePassedGoals",[77,11604,11605],{"class":83}," input_goals",[77,11607,1336],{"class":104},[77,11609,11610],{"class":87},"\"{goals}\"",[77,11612,11613],{"class":83}," output_goals",[77,11615,1336],{"class":104},[77,11617,11610],{"class":87},[77,11619,11620],{"class":83}," radius",[77,11622,1336],{"class":104},[77,11624,11625],{"class":87},"\"0.7\"",[77,11627,11139],{"class":104},[77,11629,11630,11632,11635,11638,11640,11642,11644,11646,11648,11650,11652,11654],{"class":79,"line":197},[77,11631,11599],{"class":104},[77,11633,11634],{"class":1648},"ComputePathThroughPoses",[77,11636,11637],{"class":83}," goals",[77,11639,1336],{"class":104},[77,11641,11610],{"class":87},[77,11643,11123],{"class":83},[77,11645,1336],{"class":104},[77,11647,11128],{"class":87},[77,11649,11131],{"class":83},[77,11651,1336],{"class":104},[77,11653,11136],{"class":87},[77,11655,11139],{"class":104},[77,11657,11658,11661,11663],{"class":79,"line":1348},[77,11659,11660],{"class":104},"            \u003C/",[77,11662,11592],{"class":1648},[77,11664,11003],{"class":104},[77,11666,11667,11669,11671,11673,11675,11677,11679,11681,11683],{"class":79,"line":1363},[77,11668,11109],{"class":104},[77,11670,11146],{"class":1648},[77,11672,11039],{"class":83},[77,11674,1336],{"class":104},[77,11676,11153],{"class":87},[77,11678,11156],{"class":83},[77,11680,1336],{"class":104},[77,11682,11161],{"class":87},[77,11684,11139],{"class":104},[77,11686,11687,11689,11691],{"class":79,"line":1368},[77,11688,11168],{"class":104},[77,11690,11028],{"class":1648},[77,11692,11003],{"class":104},[77,11694,11695,11697,11699],{"class":79,"line":1379},[77,11696,11177],{"class":104},[77,11698,11071],{"class":1648},[77,11700,11003],{"class":104},[77,11702,11703,11705,11707,11709,11711,11713,11715,11717,11719],{"class":79,"line":1388},[77,11704,11068],{"class":104},[77,11706,11028],{"class":1648},[77,11708,11031],{"class":83},[77,11710,1336],{"class":104},[77,11712,11095],{"class":87},[77,11714,11039],{"class":83},[77,11716,1336],{"class":104},[77,11718,11200],{"class":87},[77,11720,11003],{"class":104},[77,11722,11723,11725,11727,11729,11731,11733,11735,11737,11739],{"class":79,"line":1402},[77,11724,11086],{"class":104},[77,11726,11209],{"class":1648},[77,11728,11123],{"class":83},[77,11730,1336],{"class":104},[77,11732,11128],{"class":87},[77,11734,11218],{"class":83},[77,11736,1336],{"class":104},[77,11738,11200],{"class":87},[77,11740,11139],{"class":104},[77,11742,11743,11745,11747,11749,11751,11753,11755,11757,11759],{"class":79,"line":1415},[77,11744,11086],{"class":104},[77,11746,11146],{"class":1648},[77,11748,11039],{"class":83},[77,11750,1336],{"class":104},[77,11752,11237],{"class":87},[77,11754,11156],{"class":83},[77,11756,1336],{"class":104},[77,11758,11244],{"class":87},[77,11760,11139],{"class":104},[77,11762,11763,11765,11767],{"class":79,"line":1425},[77,11764,11177],{"class":104},[77,11766,11028],{"class":1648},[77,11768,11003],{"class":104},[77,11770,11771,11773,11775],{"class":79,"line":1433},[77,11772,11259],{"class":104},[77,11774,11054],{"class":1648},[77,11776,11003],{"class":104},[77,11778,11779,11781,11783,11785,11787,11789],{"class":79,"line":1449},[77,11780,11051],{"class":104},[77,11782,11270],{"class":1648},[77,11784,11039],{"class":83},[77,11786,1336],{"class":104},[77,11788,11277],{"class":87},[77,11790,11003],{"class":104},[77,11792,11793,11795,11797],{"class":79,"line":1463},[77,11794,11068],{"class":104},[77,11796,11286],{"class":1648},[77,11798,11139],{"class":104},[77,11800,11801,11803,11805,11807,11809,11811],{"class":79,"line":1475},[77,11802,11068],{"class":104},[77,11804,11295],{"class":1648},[77,11806,11039],{"class":83},[77,11808,1336],{"class":104},[77,11810,11302],{"class":87},[77,11812,11003],{"class":104},[77,11814,11815,11817,11819,11821,11823,11825],{"class":79,"line":1480},[77,11816,11086],{"class":104},[77,11818,11311],{"class":1648},[77,11820,11039],{"class":83},[77,11822,1336],{"class":104},[77,11824,11318],{"class":87},[77,11826,11003],{"class":104},[77,11828,11829,11831,11833,11835,11837,11839,11841,11843,11845],{"class":79,"line":1491},[77,11830,11109],{"class":104},[77,11832,11146],{"class":1648},[77,11834,11039],{"class":83},[77,11836,1336],{"class":104},[77,11838,11333],{"class":87},[77,11840,11156],{"class":83},[77,11842,1336],{"class":104},[77,11844,11244],{"class":87},[77,11846,11139],{"class":104},[77,11848,11849,11851,11853,11855,11857,11859,11861,11863,11865],{"class":79,"line":1502},[77,11850,11109],{"class":104},[77,11852,11146],{"class":1648},[77,11854,11039],{"class":83},[77,11856,1336],{"class":104},[77,11858,11354],{"class":87},[77,11860,11156],{"class":83},[77,11862,1336],{"class":104},[77,11864,11161],{"class":87},[77,11866,11139],{"class":104},[77,11868,11869,11871,11873],{"class":79,"line":1508},[77,11870,11168],{"class":104},[77,11872,11311],{"class":1648},[77,11874,11003],{"class":104},[77,11876,11877,11879,11881,11883,11885,11887],{"class":79,"line":1519},[77,11878,11086],{"class":104},[77,11880,11377],{"class":1648},[77,11882,11380],{"class":83},[77,11884,1336],{"class":104},[77,11886,11385],{"class":87},[77,11888,11139],{"class":104},[77,11890,11891,11893,11895,11897,11899,11901],{"class":79,"line":1525},[77,11892,11086],{"class":104},[77,11894,11394],{"class":1648},[77,11896,11397],{"class":83},[77,11898,1336],{"class":104},[77,11900,11402],{"class":87},[77,11902,11139],{"class":104},[77,11904,11905,11907,11909,11911,11913,11915,11917,11919,11921],{"class":79,"line":1538},[77,11906,11086],{"class":104},[77,11908,11411],{"class":1648},[77,11910,11414],{"class":83},[77,11912,1336],{"class":104},[77,11914,11419],{"class":87},[77,11916,11422],{"class":83},[77,11918,1336],{"class":104},[77,11920,11427],{"class":87},[77,11922,11139],{"class":104},[77,11924,11925,11927,11929],{"class":79,"line":1551},[77,11926,11177],{"class":104},[77,11928,11295],{"class":1648},[77,11930,11003],{"class":104},[77,11932,11933,11935,11937],{"class":79,"line":1563},[77,11934,11259],{"class":104},[77,11936,11270],{"class":1648},[77,11938,11003],{"class":104},[77,11940,11941,11943,11945],{"class":79,"line":1576},[77,11942,11450],{"class":104},[77,11944,11028],{"class":1648},[77,11946,11003],{"class":104},[77,11948,11949,11951,11953],{"class":79,"line":1581},[77,11950,11459],{"class":104},[77,11952,11011],{"class":1648},[77,11954,11003],{"class":104},[77,11956,11957,11959,11961],{"class":79,"line":1592},[77,11958,11468],{"class":104},[77,11960,10992],{"class":1648},[77,11962,11003],{"class":104},[18,11964,11965,11966,5194],{},"在params目錄下新建一個名為",[74,11967,11968],{},"bt.yaml",[68,11970,11972],{"className":1639,"code":11971,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    use_sim_time: True\n    global_frame: map\n    robot_base_frame: base_link\n    odom_topic: /odom\n    default_bt_xml_filename: \"navigate_w_replanning_and_recovery.xml\"\n    bt_loop_duration: 10\n    default_server_timeout: 20\n    enable_groot_monitoring: True\n    groot_zmq_publisher_port: 1666\n    groot_zmq_server_port: 1667\n    plugin_lib_names:\n    - nav2_compute_path_to_pose_action_bt_node\n    - nav2_compute_path_through_poses_action_bt_node\n    - nav2_follow_path_action_bt_node\n    - nav2_back_up_action_bt_node\n    - nav2_spin_action_bt_node\n    - nav2_wait_action_bt_node\n    - nav2_clear_costmap_service_bt_node\n    - nav2_is_stuck_condition_bt_node\n    - nav2_goal_reached_condition_bt_node\n    - nav2_goal_updated_condition_bt_node\n    - nav2_initial_pose_received_condition_bt_node\n    - nav2_reinitialize_global_localization_service_bt_node\n    - nav2_rate_controller_bt_node\n    - nav2_distance_controller_bt_node\n    - nav2_speed_controller_bt_node\n    - nav2_truncate_path_action_bt_node\n    - nav2_goal_updater_node_bt_node\n    - nav2_recovery_node_bt_node\n    - nav2_pipeline_sequence_bt_node\n    - nav2_round_robin_node_bt_node\n    - nav2_transform_available_condition_bt_node\n    - nav2_time_expired_condition_bt_node\n    - nav2_distance_traveled_condition_bt_node\n    - nav2_single_trigger_bt_node\n    - nav2_is_battery_low_condition_bt_node\n    - nav2_navigate_through_poses_action_bt_node\n    - nav2_navigate_to_pose_action_bt_node\n    - nav2_remove_passed_goals_action_bt_node\n    - nav2_planner_selector_bt_node\n    - nav2_controller_selector_bt_node\n    - nav2_goal_checker_selector_bt_node\n",[74,11973,11974,11980,11986,11994,12003,12012,12022,12032,12042,12052,12061,12071,12081,12088,12096,12103,12110,12117,12124,12131,12138,12145,12152,12159,12166,12173,12180,12187,12194,12201,12208,12215,12222,12229,12236,12243,12250,12257,12264,12271,12278,12285,12292,12299],{"__ignoreMap":32},[77,11975,11976,11978],{"class":79,"line":80},[77,11977,6526],{"class":1648},[77,11979,1651],{"class":104},[77,11981,11982,11984],{"class":79,"line":114},[77,11983,1656],{"class":1648},[77,11985,1651],{"class":104},[77,11987,11988,11990,11992],{"class":79,"line":136},[77,11989,6539],{"class":1648},[77,11991,1666],{"class":104},[77,11993,9781],{"class":1217},[77,11995,11996,11999,12001],{"class":79,"line":143},[77,11997,11998],{"class":1648},"    global_frame",[77,12000,1666],{"class":104},[77,12002,1743],{"class":87},[77,12004,12005,12008,12010],{"class":79,"line":150},[77,12006,12007],{"class":1648},"    robot_base_frame",[77,12009,1666],{"class":104},[77,12011,1753],{"class":87},[77,12013,12014,12017,12019],{"class":79,"line":162},[77,12015,12016],{"class":1648},"    odom_topic",[77,12018,1666],{"class":104},[77,12020,12021],{"class":87},"/odom\n",[77,12023,12024,12027,12029],{"class":79,"line":174},[77,12025,12026],{"class":1648},"    default_bt_xml_filename",[77,12028,1666],{"class":104},[77,12030,12031],{"class":87},"\"navigate_w_replanning_and_recovery.xml\"\n",[77,12033,12034,12037,12039],{"class":79,"line":179},[77,12035,12036],{"class":1648},"    bt_loop_duration",[77,12038,1666],{"class":104},[77,12040,12041],{"class":1217},"10\n",[77,12043,12044,12047,12049],{"class":79,"line":185},[77,12045,12046],{"class":1648},"    default_server_timeout",[77,12048,1666],{"class":104},[77,12050,12051],{"class":1217},"20\n",[77,12053,12054,12057,12059],{"class":79,"line":197},[77,12055,12056],{"class":1648},"    enable_groot_monitoring",[77,12058,1666],{"class":104},[77,12060,9781],{"class":1217},[77,12062,12063,12066,12068],{"class":79,"line":1348},[77,12064,12065],{"class":1648},"    groot_zmq_publisher_port",[77,12067,1666],{"class":104},[77,12069,12070],{"class":1217},"1666\n",[77,12072,12073,12076,12078],{"class":79,"line":1363},[77,12074,12075],{"class":1648},"    groot_zmq_server_port",[77,12077,1666],{"class":104},[77,12079,12080],{"class":1217},"1667\n",[77,12082,12083,12086],{"class":79,"line":1368},[77,12084,12085],{"class":1648},"    plugin_lib_names",[77,12087,1651],{"class":104},[77,12089,12090,12093],{"class":79,"line":1379},[77,12091,12092],{"class":104},"    - ",[77,12094,12095],{"class":87},"nav2_compute_path_to_pose_action_bt_node\n",[77,12097,12098,12100],{"class":79,"line":1388},[77,12099,12092],{"class":104},[77,12101,12102],{"class":87},"nav2_compute_path_through_poses_action_bt_node\n",[77,12104,12105,12107],{"class":79,"line":1402},[77,12106,12092],{"class":104},[77,12108,12109],{"class":87},"nav2_follow_path_action_bt_node\n",[77,12111,12112,12114],{"class":79,"line":1415},[77,12113,12092],{"class":104},[77,12115,12116],{"class":87},"nav2_back_up_action_bt_node\n",[77,12118,12119,12121],{"class":79,"line":1425},[77,12120,12092],{"class":104},[77,12122,12123],{"class":87},"nav2_spin_action_bt_node\n",[77,12125,12126,12128],{"class":79,"line":1433},[77,12127,12092],{"class":104},[77,12129,12130],{"class":87},"nav2_wait_action_bt_node\n",[77,12132,12133,12135],{"class":79,"line":1449},[77,12134,12092],{"class":104},[77,12136,12137],{"class":87},"nav2_clear_costmap_service_bt_node\n",[77,12139,12140,12142],{"class":79,"line":1463},[77,12141,12092],{"class":104},[77,12143,12144],{"class":87},"nav2_is_stuck_condition_bt_node\n",[77,12146,12147,12149],{"class":79,"line":1475},[77,12148,12092],{"class":104},[77,12150,12151],{"class":87},"nav2_goal_reached_condition_bt_node\n",[77,12153,12154,12156],{"class":79,"line":1480},[77,12155,12092],{"class":104},[77,12157,12158],{"class":87},"nav2_goal_updated_condition_bt_node\n",[77,12160,12161,12163],{"class":79,"line":1491},[77,12162,12092],{"class":104},[77,12164,12165],{"class":87},"nav2_initial_pose_received_condition_bt_node\n",[77,12167,12168,12170],{"class":79,"line":1502},[77,12169,12092],{"class":104},[77,12171,12172],{"class":87},"nav2_reinitialize_global_localization_service_bt_node\n",[77,12174,12175,12177],{"class":79,"line":1508},[77,12176,12092],{"class":104},[77,12178,12179],{"class":87},"nav2_rate_controller_bt_node\n",[77,12181,12182,12184],{"class":79,"line":1519},[77,12183,12092],{"class":104},[77,12185,12186],{"class":87},"nav2_distance_controller_bt_node\n",[77,12188,12189,12191],{"class":79,"line":1525},[77,12190,12092],{"class":104},[77,12192,12193],{"class":87},"nav2_speed_controller_bt_node\n",[77,12195,12196,12198],{"class":79,"line":1538},[77,12197,12092],{"class":104},[77,12199,12200],{"class":87},"nav2_truncate_path_action_bt_node\n",[77,12202,12203,12205],{"class":79,"line":1551},[77,12204,12092],{"class":104},[77,12206,12207],{"class":87},"nav2_goal_updater_node_bt_node\n",[77,12209,12210,12212],{"class":79,"line":1563},[77,12211,12092],{"class":104},[77,12213,12214],{"class":87},"nav2_recovery_node_bt_node\n",[77,12216,12217,12219],{"class":79,"line":1576},[77,12218,12092],{"class":104},[77,12220,12221],{"class":87},"nav2_pipeline_sequence_bt_node\n",[77,12223,12224,12226],{"class":79,"line":1581},[77,12225,12092],{"class":104},[77,12227,12228],{"class":87},"nav2_round_robin_node_bt_node\n",[77,12230,12231,12233],{"class":79,"line":1592},[77,12232,12092],{"class":104},[77,12234,12235],{"class":87},"nav2_transform_available_condition_bt_node\n",[77,12237,12238,12240],{"class":79,"line":1597},[77,12239,12092],{"class":104},[77,12241,12242],{"class":87},"nav2_time_expired_condition_bt_node\n",[77,12244,12245,12247],{"class":79,"line":1603},[77,12246,12092],{"class":104},[77,12248,12249],{"class":87},"nav2_distance_traveled_condition_bt_node\n",[77,12251,12252,12254],{"class":79,"line":1609},[77,12253,12092],{"class":104},[77,12255,12256],{"class":87},"nav2_single_trigger_bt_node\n",[77,12258,12259,12261],{"class":79,"line":1615},[77,12260,12092],{"class":104},[77,12262,12263],{"class":87},"nav2_is_battery_low_condition_bt_node\n",[77,12265,12266,12268],{"class":79,"line":1620},[77,12267,12092],{"class":104},[77,12269,12270],{"class":87},"nav2_navigate_through_poses_action_bt_node\n",[77,12272,12273,12275],{"class":79,"line":2003},[77,12274,12092],{"class":104},[77,12276,12277],{"class":87},"nav2_navigate_to_pose_action_bt_node\n",[77,12279,12280,12282],{"class":79,"line":2014},[77,12281,12092],{"class":104},[77,12283,12284],{"class":87},"nav2_remove_passed_goals_action_bt_node\n",[77,12286,12287,12289],{"class":79,"line":2027},[77,12288,12092],{"class":104},[77,12290,12291],{"class":87},"nav2_planner_selector_bt_node\n",[77,12293,12294,12296],{"class":79,"line":2041},[77,12295,12092],{"class":104},[77,12297,12298],{"class":87},"nav2_controller_selector_bt_node\n",[77,12300,12301,12303],{"class":79,"line":2054},[77,12302,12092],{"class":104},[77,12304,12305],{"class":87},"nav2_goal_checker_selector_bt_node\n",[18,12307,12308],{},[21,12309,12310],{},"（2）planner_server相關配置文件",[18,12312,11965,12313,5194],{},[74,12314,12315],{},"planner.yaml",[68,12317,12319],{"className":1639,"code":12318,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    expected_planner_frequency: 20.0\n    use_sim_time: True\n    planner_plugins: [\"GridBased\"]\n    GridBased:\n      plugin: \"nav2_navfn_planner/NavfnPlanner\"\n      tolerance: 0.5\n      use_astar: false\n      allow_unknown: true\n\n/**:\n  global_costmap:\n    ros__parameters:\n      update_frequency: 1.0\n      publish_frequency: 1.0\n      global_frame: map\n      robot_base_frame: base_link\n      use_sim_time: True\n\n      # robot_radius: 0.2\n      footprint: \"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n      resolution: 0.05\n      track_unknown_space: true\n      plugins: [\"static_layer\", \"obstacle_layer\", \"voxel_layer\", \"inflation_layer\"]\n      obstacle_layer:\n        plugin: \"nav2_costmap_2d::ObstacleLayer\"\n        enabled: True\n        observation_sources: scan\n        scan:\n          topic: /scan\n          max_obstacle_height: 2.0\n          clearing: True\n          marking: True\n          data_type: \"LaserScan\"\n          raytrace_max_range: 3.0\n          raytrace_min_range: 0.0\n          obstacle_max_range: 2.5\n          obstacle_min_range: 0.0\n      voxel_layer:\n        plugin: \"nav2_costmap_2d::VoxelLayer\"\n        enabled: True\n        publish_voxel_map: True\n        origin_z: 0.0\n        z_resolution: 0.05\n        z_voxels: 16\n        max_obstacle_height: 2.0\n        mark_threshold: 0\n        observation_sources: scan\n        scan:\n          topic: /scan\n          max_obstacle_height: 2.0\n          clearing: True\n          marking: True\n          data_type: \"LaserScan\"\n          raytrace_max_range: 3.0\n          raytrace_min_range: 0.0\n          obstacle_max_range: 2.5\n          obstacle_min_range: 0.0\n      static_layer:\n        plugin: \"nav2_costmap_2d::StaticLayer\"\n        map_subscribe_transient_local: True\n      inflation_layer:\n        plugin: \"nav2_costmap_2d::InflationLayer\"\n        cost_scaling_factor: 4.0\n        inflation_radius: 0.55\n      always_send_full_costmap: False\n",[74,12320,12321,12327,12333,12343,12351,12362,12369,12379,12388,12397,12406,12410,12416,12423,12430,12440,12449,12458,12467,12476,12480,12485,12495,12504,12513,12540,12547,12557,12566,12575,12582,12591,12600,12609,12618,12628,12637,12646,12656,12665,12672,12681,12689,12698,12707,12716,12726,12735,12744,12752,12758,12766,12774,12782,12790,12798,12806,12814,12822,12830,12837,12846,12855,12862,12871,12881,12891],{"__ignoreMap":32},[77,12322,12323,12325],{"class":79,"line":80},[77,12324,6526],{"class":1648},[77,12326,1651],{"class":104},[77,12328,12329,12331],{"class":79,"line":114},[77,12330,1656],{"class":1648},[77,12332,1651],{"class":104},[77,12334,12335,12338,12340],{"class":79,"line":136},[77,12336,12337],{"class":1648},"    expected_planner_frequency",[77,12339,1666],{"class":104},[77,12341,12342],{"class":1217},"20.0\n",[77,12344,12345,12347,12349],{"class":79,"line":143},[77,12346,6539],{"class":1648},[77,12348,1666],{"class":104},[77,12350,9781],{"class":1217},[77,12352,12353,12356,12358,12360],{"class":79,"line":150},[77,12354,12355],{"class":1648},"    planner_plugins",[77,12357,4856],{"class":104},[77,12359,11136],{"class":87},[77,12361,4872],{"class":104},[77,12363,12364,12367],{"class":79,"line":162},[77,12365,12366],{"class":1648},"    GridBased",[77,12368,1651],{"class":104},[77,12370,12371,12374,12376],{"class":79,"line":174},[77,12372,12373],{"class":1648},"      plugin",[77,12375,1666],{"class":104},[77,12377,12378],{"class":87},"\"nav2_navfn_planner/NavfnPlanner\"\n",[77,12380,12381,12384,12386],{"class":79,"line":179},[77,12382,12383],{"class":1648},"      tolerance",[77,12385,1666],{"class":104},[77,12387,1874],{"class":1217},[77,12389,12390,12393,12395],{"class":79,"line":185},[77,12391,12392],{"class":1648},"      use_astar",[77,12394,1666],{"class":104},[77,12396,1809],{"class":1217},[77,12398,12399,12402,12404],{"class":79,"line":197},[77,12400,12401],{"class":1648},"      allow_unknown",[77,12403,1666],{"class":104},[77,12405,1916],{"class":1217},[77,12407,12408],{"class":79,"line":1348},[77,12409,140],{"emptyLinePlaceholder":139},[77,12411,12412,12414],{"class":79,"line":1363},[77,12413,6526],{"class":1648},[77,12415,1651],{"class":104},[77,12417,12418,12421],{"class":79,"line":1368},[77,12419,12420],{"class":1648},"  global_costmap",[77,12422,1651],{"class":104},[77,12424,12425,12428],{"class":79,"line":1379},[77,12426,12427],{"class":1648},"    ros__parameters",[77,12429,1651],{"class":104},[77,12431,12432,12435,12437],{"class":79,"line":1388},[77,12433,12434],{"class":1648},"      update_frequency",[77,12436,1666],{"class":104},[77,12438,12439],{"class":1217},"1.0\n",[77,12441,12442,12445,12447],{"class":79,"line":1402},[77,12443,12444],{"class":1648},"      publish_frequency",[77,12446,1666],{"class":104},[77,12448,12439],{"class":1217},[77,12450,12451,12454,12456],{"class":79,"line":1415},[77,12452,12453],{"class":1648},"      global_frame",[77,12455,1666],{"class":104},[77,12457,1743],{"class":87},[77,12459,12460,12463,12465],{"class":79,"line":1425},[77,12461,12462],{"class":1648},"      robot_base_frame",[77,12464,1666],{"class":104},[77,12466,1753],{"class":87},[77,12468,12469,12472,12474],{"class":79,"line":1433},[77,12470,12471],{"class":1648},"      use_sim_time",[77,12473,1666],{"class":104},[77,12475,9781],{"class":1217},[77,12477,12478],{"class":79,"line":1449},[77,12479,140],{"emptyLinePlaceholder":139},[77,12481,12482],{"class":79,"line":1463},[77,12483,12484],{"class":146},"      # robot_radius: 0.2\n",[77,12486,12487,12490,12492],{"class":79,"line":1475},[77,12488,12489],{"class":1648},"      footprint",[77,12491,1666],{"class":104},[77,12493,12494],{"class":87},"\"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n",[77,12496,12497,12500,12502],{"class":79,"line":1480},[77,12498,12499],{"class":1648},"      resolution",[77,12501,1666],{"class":104},[77,12503,1852],{"class":1217},[77,12505,12506,12509,12511],{"class":79,"line":1491},[77,12507,12508],{"class":1648},"      track_unknown_space",[77,12510,1666],{"class":104},[77,12512,1916],{"class":1217},[77,12514,12515,12518,12520,12523,12525,12528,12530,12533,12535,12538],{"class":79,"line":1502},[77,12516,12517],{"class":1648},"      plugins",[77,12519,4856],{"class":104},[77,12521,12522],{"class":87},"\"static_layer\"",[77,12524,1455],{"class":104},[77,12526,12527],{"class":87},"\"obstacle_layer\"",[77,12529,1455],{"class":104},[77,12531,12532],{"class":87},"\"voxel_layer\"",[77,12534,1455],{"class":104},[77,12536,12537],{"class":87},"\"inflation_layer\"",[77,12539,4872],{"class":104},[77,12541,12542,12545],{"class":79,"line":1508},[77,12543,12544],{"class":1648},"      obstacle_layer",[77,12546,1651],{"class":104},[77,12548,12549,12552,12554],{"class":79,"line":1519},[77,12550,12551],{"class":1648},"        plugin",[77,12553,1666],{"class":104},[77,12555,12556],{"class":87},"\"nav2_costmap_2d::ObstacleLayer\"\n",[77,12558,12559,12562,12564],{"class":79,"line":1525},[77,12560,12561],{"class":1648},"        enabled",[77,12563,1666],{"class":104},[77,12565,9781],{"class":1217},[77,12567,12568,12571,12573],{"class":79,"line":1538},[77,12569,12570],{"class":1648},"        observation_sources",[77,12572,1666],{"class":104},[77,12574,6892],{"class":87},[77,12576,12577,12580],{"class":79,"line":1551},[77,12578,12579],{"class":1648},"        scan",[77,12581,1651],{"class":104},[77,12583,12584,12587,12589],{"class":79,"line":1563},[77,12585,12586],{"class":1648},"          topic",[77,12588,1666],{"class":104},[77,12590,1763],{"class":87},[77,12592,12593,12596,12598],{"class":79,"line":1576},[77,12594,12595],{"class":1648},"          max_obstacle_height",[77,12597,1666],{"class":104},[77,12599,1842],{"class":1217},[77,12601,12602,12605,12607],{"class":79,"line":1581},[77,12603,12604],{"class":1648},"          clearing",[77,12606,1666],{"class":104},[77,12608,9781],{"class":1217},[77,12610,12611,12614,12616],{"class":79,"line":1592},[77,12612,12613],{"class":1648},"          marking",[77,12615,1666],{"class":104},[77,12617,9781],{"class":1217},[77,12619,12620,12623,12625],{"class":79,"line":1597},[77,12621,12622],{"class":1648},"          data_type",[77,12624,1666],{"class":104},[77,12626,12627],{"class":87},"\"LaserScan\"\n",[77,12629,12630,12633,12635],{"class":79,"line":1603},[77,12631,12632],{"class":1648},"          raytrace_max_range",[77,12634,1666],{"class":104},[77,12636,2011],{"class":1217},[77,12638,12639,12642,12644],{"class":79,"line":1609},[77,12640,12641],{"class":1648},"          raytrace_min_range",[77,12643,1666],{"class":104},[77,12645,6765],{"class":1217},[77,12647,12648,12651,12653],{"class":79,"line":1615},[77,12649,12650],{"class":1648},"          obstacle_max_range",[77,12652,1666],{"class":104},[77,12654,12655],{"class":1217},"2.5\n",[77,12657,12658,12661,12663],{"class":79,"line":1620},[77,12659,12660],{"class":1648},"          obstacle_min_range",[77,12662,1666],{"class":104},[77,12664,6765],{"class":1217},[77,12666,12667,12670],{"class":79,"line":2003},[77,12668,12669],{"class":1648},"      voxel_layer",[77,12671,1651],{"class":104},[77,12673,12674,12676,12678],{"class":79,"line":2014},[77,12675,12551],{"class":1648},[77,12677,1666],{"class":104},[77,12679,12680],{"class":87},"\"nav2_costmap_2d::VoxelLayer\"\n",[77,12682,12683,12685,12687],{"class":79,"line":2027},[77,12684,12561],{"class":1648},[77,12686,1666],{"class":104},[77,12688,9781],{"class":1217},[77,12690,12691,12694,12696],{"class":79,"line":2041},[77,12692,12693],{"class":1648},"        publish_voxel_map",[77,12695,1666],{"class":104},[77,12697,9781],{"class":1217},[77,12699,12700,12703,12705],{"class":79,"line":2054},[77,12701,12702],{"class":1648},"        origin_z",[77,12704,1666],{"class":104},[77,12706,6765],{"class":1217},[77,12708,12709,12712,12714],{"class":79,"line":2068},[77,12710,12711],{"class":1648},"        z_resolution",[77,12713,1666],{"class":104},[77,12715,1852],{"class":1217},[77,12717,12718,12721,12723],{"class":79,"line":2079},[77,12719,12720],{"class":1648},"        z_voxels",[77,12722,1666],{"class":104},[77,12724,12725],{"class":1217},"16\n",[77,12727,12728,12731,12733],{"class":79,"line":2084},[77,12729,12730],{"class":1648},"        max_obstacle_height",[77,12732,1666],{"class":104},[77,12734,1842],{"class":1217},[77,12736,12737,12740,12742],{"class":79,"line":2094},[77,12738,12739],{"class":1648},"        mark_threshold",[77,12741,1666],{"class":104},[77,12743,4882],{"class":1217},[77,12745,12746,12748,12750],{"class":79,"line":2105},[77,12747,12570],{"class":1648},[77,12749,1666],{"class":104},[77,12751,6892],{"class":87},[77,12753,12754,12756],{"class":79,"line":2117},[77,12755,12579],{"class":1648},[77,12757,1651],{"class":104},[77,12759,12760,12762,12764],{"class":79,"line":2122},[77,12761,12586],{"class":1648},[77,12763,1666],{"class":104},[77,12765,1763],{"class":87},[77,12767,12768,12770,12772],{"class":79,"line":2133},[77,12769,12595],{"class":1648},[77,12771,1666],{"class":104},[77,12773,1842],{"class":1217},[77,12775,12776,12778,12780],{"class":79,"line":2143},[77,12777,12604],{"class":1648},[77,12779,1666],{"class":104},[77,12781,9781],{"class":1217},[77,12783,12784,12786,12788],{"class":79,"line":2154},[77,12785,12613],{"class":1648},[77,12787,1666],{"class":104},[77,12789,9781],{"class":1217},[77,12791,12792,12794,12796],{"class":79,"line":2159},[77,12793,12622],{"class":1648},[77,12795,1666],{"class":104},[77,12797,12627],{"class":87},[77,12799,12800,12802,12804],{"class":79,"line":2173},[77,12801,12632],{"class":1648},[77,12803,1666],{"class":104},[77,12805,2011],{"class":1217},[77,12807,12808,12810,12812],{"class":79,"line":2186},[77,12809,12641],{"class":1648},[77,12811,1666],{"class":104},[77,12813,6765],{"class":1217},[77,12815,12816,12818,12820],{"class":79,"line":2191},[77,12817,12650],{"class":1648},[77,12819,1666],{"class":104},[77,12821,12655],{"class":1217},[77,12823,12824,12826,12828],{"class":79,"line":2205},[77,12825,12660],{"class":1648},[77,12827,1666],{"class":104},[77,12829,6765],{"class":1217},[77,12831,12832,12835],{"class":79,"line":2219},[77,12833,12834],{"class":1648},"      static_layer",[77,12836,1651],{"class":104},[77,12838,12839,12841,12843],{"class":79,"line":2233},[77,12840,12551],{"class":1648},[77,12842,1666],{"class":104},[77,12844,12845],{"class":87},"\"nav2_costmap_2d::StaticLayer\"\n",[77,12847,12848,12851,12853],{"class":79,"line":2244},[77,12849,12850],{"class":1648},"        map_subscribe_transient_local",[77,12852,1666],{"class":104},[77,12854,9781],{"class":1217},[77,12856,12857,12860],{"class":79,"line":2254},[77,12858,12859],{"class":1648},"      inflation_layer",[77,12861,1651],{"class":104},[77,12863,12864,12866,12868],{"class":79,"line":6476},[77,12865,12551],{"class":1648},[77,12867,1666],{"class":104},[77,12869,12870],{"class":87},"\"nav2_costmap_2d::InflationLayer\"\n",[77,12872,12873,12876,12878],{"class":79,"line":6482},[77,12874,12875],{"class":1648},"        cost_scaling_factor",[77,12877,1666],{"class":104},[77,12879,12880],{"class":1217},"4.0\n",[77,12882,12883,12886,12888],{"class":79,"line":6488},[77,12884,12885],{"class":1648},"        inflation_radius",[77,12887,1666],{"class":104},[77,12889,12890],{"class":1217},"0.55\n",[77,12892,12893,12896,12898],{"class":79,"line":9974},[77,12894,12895],{"class":1648},"      always_send_full_costmap",[77,12897,1666],{"class":104},[77,12899,12900],{"class":1217},"False\n",[18,12902,12903],{},[21,12904,12905],{},"（3）controller_server相關配置文件",[18,12907,11965,12908,5194],{},[74,12909,12910],{},"controller.yaml",[68,12912,12914],{"className":1639,"code":12913,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    use_sim_time: True\n    controller_frequency: 10.0\n    min_x_velocity_threshold: 0.001\n    min_y_velocity_threshold: 0.5\n    min_theta_velocity_threshold: 0.001\n\n    # failure_tolerance: 0.3\n    failure_tolerance: 1.0\n    progress_checker_plugin: \"progress_checker\"\n    goal_checker_plugins: [\"general_goal_checker\"] \n    controller_plugins: [\"FollowPath\"]\n\n    # Progress checker parameters\n    progress_checker:\n      plugin: \"nav2_controller::SimpleProgressChecker\"\n      required_movement_radius: 0.5\n      movement_time_allowance: 10.0\n\n    general_goal_checker:\n      stateful: True\n      plugin: \"nav2_controller::SimpleGoalChecker\"\n      xy_goal_tolerance: 0.25\n      yaw_goal_tolerance: 0.25\n\n    # DWB parameters\n    FollowPath:\n      plugin: \"dwb_core::DWBLocalPlanner\"\n      debug_trajectory_details: True\n      min_vel_x: 0.0\n      min_vel_y: 0.0\n\n      # max_vel_x: 0.15\n      max_vel_x: 0.2\n      max_vel_y: 0.0\n\n      # max_vel_theta: 1.0\n      max_vel_theta: 1.0\n      min_speed_xy: 0.0\n      max_speed_xy: 0.2\n      min_speed_theta: 0.0\n\n      # Add high threshold velocity for turtlebot 3 issue.\n\n      # https://github.com/ROBOTIS-GIT/turtlebot3_simulations/issues/75\n      acc_lim_x: 1.0\n      acc_lim_y: 0.0\n      acc_lim_theta: 3.2\n      decel_lim_x: -1.0\n      decel_lim_y: 0.0\n      decel_lim_theta: -3.2\n\n      # vx_samples: 20\n      vx_samples: 20\n      vy_samples: 5\n      vtheta_samples: 20\n      sim_time: 1.7\n      linear_granularity: 0.05\n      angular_granularity: 0.025\n\n      # transform_tolerance: 0.2\n      transform_tolerance: 1.0\n      xy_goal_tolerance: 0.15\n      trans_stopped_velocity: 0.25\n      short_circuit_trajectory_evaluation: True\n      stateful: True\n      critics: [\"RotateToGoal\", \"Oscillation\", \"BaseObstacle\", \"GoalAlign\", \"PathAlign\", \"PathDist\", \"GoalDist\"]\n      BaseObstacle.scale: 0.02\n      PathAlign.scale: 32.0\n      PathAlign.forward_point_distance: 0.1\n      GoalAlign.scale: 24.0\n      GoalAlign.forward_point_distance: 0.1\n      PathDist.scale: 32.0\n      GoalDist.scale: 24.0\n      RotateToGoal.scale: 32.0\n      RotateToGoal.slowing_factor: 5.0\n      RotateToGoal.lookahead_time: -1.0\n/**:\n  local_costmap:\n    ros__parameters:\n      update_frequency: 5.0\n      publish_frequency: 2.0\n      global_frame: odom\n      robot_base_frame: base_link\n      use_sim_time: True\n      rolling_window: True\n      width: 2\n      height: 2\n      resolution: 0.05\n\n      # robot_radius: 0.20\n      footprint: \"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n      plugins: [\"obstacle_layer\", \"voxel_layer\", \"inflation_layer\"]\n      inflation_layer:\n        plugin: \"nav2_costmap_2d::InflationLayer\"\n        inflation_radius: 0.5\n        cost_scaling_factor: 4.0\n      obstacle_layer:\n        plugin: \"nav2_costmap_2d::ObstacleLayer\"\n        enabled: True\n        observation_sources: scan\n        scan:\n          topic: /scan\n          max_obstacle_height: 2.0\n          clearing: True\n          marking: True\n          data_type: \"LaserScan\"\n      voxel_layer:\n        plugin: \"nav2_costmap_2d::VoxelLayer\"\n        enabled: True\n        publish_voxel_map: True\n        origin_z: 0.0\n        z_resolution: 0.05\n        z_voxels: 16\n        max_obstacle_height: 2.0\n        mark_threshold: 0\n        observation_sources: scan\n        scan:\n          topic: /scan\n          max_obstacle_height: 2.0\n          clearing: True\n          marking: True\n          data_type: \"LaserScan\"\n          raytrace_max_range: 3.0\n          raytrace_min_range: 0.0\n          obstacle_max_range: 2.5\n          obstacle_min_range: 0.0\n      static_layer:\n        map_subscribe_transient_local: True\n      always_send_full_costmap: True\n",[74,12915,12916,12922,12928,12936,12945,12955,12964,12973,12977,12982,12991,13001,13014,13025,13029,13034,13041,13050,13059,13068,13072,13079,13088,13097,13106,13115,13119,13124,13131,13140,13149,13158,13167,13171,13176,13185,13194,13198,13203,13212,13221,13230,13239,13243,13248,13252,13257,13266,13275,13285,13294,13303,13313,13317,13322,13331,13341,13350,13360,13369,13379,13383,13388,13397,13406,13415,13424,13432,13474,13484,13494,13503,13513,13522,13531,13540,13549,13559,13568,13574,13581,13587,13595,13603,13611,13619,13627,13636,13646,13655,13663,13667,13672,13680,13698,13704,13712,13720,13728,13734,13742,13750,13758,13764,13772,13780,13788,13796,13804,13810,13818,13826,13834,13842,13850,13858,13866,13874,13882,13888,13896,13904,13912,13920,13928,13936,13944,13952,13960,13966,13974],{"__ignoreMap":32},[77,12917,12918,12920],{"class":79,"line":80},[77,12919,6526],{"class":1648},[77,12921,1651],{"class":104},[77,12923,12924,12926],{"class":79,"line":114},[77,12925,1656],{"class":1648},[77,12927,1651],{"class":104},[77,12929,12930,12932,12934],{"class":79,"line":136},[77,12931,6539],{"class":1648},[77,12933,1666],{"class":104},[77,12935,9781],{"class":1217},[77,12937,12938,12941,12943],{"class":79,"line":143},[77,12939,12940],{"class":1648},"    controller_frequency",[77,12942,1666],{"class":104},[77,12944,1977],{"class":1217},[77,12946,12947,12950,12952],{"class":79,"line":150},[77,12948,12949],{"class":1648},"    min_x_velocity_threshold",[77,12951,1666],{"class":104},[77,12953,12954],{"class":1217},"0.001\n",[77,12956,12957,12960,12962],{"class":79,"line":162},[77,12958,12959],{"class":1648},"    min_y_velocity_threshold",[77,12961,1666],{"class":104},[77,12963,1874],{"class":1217},[77,12965,12966,12969,12971],{"class":79,"line":174},[77,12967,12968],{"class":1648},"    min_theta_velocity_threshold",[77,12970,1666],{"class":104},[77,12972,12954],{"class":1217},[77,12974,12975],{"class":79,"line":179},[77,12976,140],{"emptyLinePlaceholder":139},[77,12978,12979],{"class":79,"line":185},[77,12980,12981],{"class":146},"    # failure_tolerance: 0.3\n",[77,12983,12984,12987,12989],{"class":79,"line":197},[77,12985,12986],{"class":1648},"    failure_tolerance",[77,12988,1666],{"class":104},[77,12990,12439],{"class":1217},[77,12992,12993,12996,12998],{"class":79,"line":1348},[77,12994,12995],{"class":1648},"    progress_checker_plugin",[77,12997,1666],{"class":104},[77,12999,13000],{"class":87},"\"progress_checker\"\n",[77,13002,13003,13006,13008,13011],{"class":79,"line":1363},[77,13004,13005],{"class":1648},"    goal_checker_plugins",[77,13007,4856],{"class":104},[77,13009,13010],{"class":87},"\"general_goal_checker\"",[77,13012,13013],{"class":104},"] \n",[77,13015,13016,13019,13021,13023],{"class":79,"line":1368},[77,13017,13018],{"class":1648},"    controller_plugins",[77,13020,4856],{"class":104},[77,13022,11200],{"class":87},[77,13024,4872],{"class":104},[77,13026,13027],{"class":79,"line":1379},[77,13028,140],{"emptyLinePlaceholder":139},[77,13030,13031],{"class":79,"line":1388},[77,13032,13033],{"class":146},"    # Progress checker parameters\n",[77,13035,13036,13039],{"class":79,"line":1402},[77,13037,13038],{"class":1648},"    progress_checker",[77,13040,1651],{"class":104},[77,13042,13043,13045,13047],{"class":79,"line":1415},[77,13044,12373],{"class":1648},[77,13046,1666],{"class":104},[77,13048,13049],{"class":87},"\"nav2_controller::SimpleProgressChecker\"\n",[77,13051,13052,13055,13057],{"class":79,"line":1425},[77,13053,13054],{"class":1648},"      required_movement_radius",[77,13056,1666],{"class":104},[77,13058,1874],{"class":1217},[77,13060,13061,13064,13066],{"class":79,"line":1433},[77,13062,13063],{"class":1648},"      movement_time_allowance",[77,13065,1666],{"class":104},[77,13067,1977],{"class":1217},[77,13069,13070],{"class":79,"line":1449},[77,13071,140],{"emptyLinePlaceholder":139},[77,13073,13074,13077],{"class":79,"line":1463},[77,13075,13076],{"class":1648},"    general_goal_checker",[77,13078,1651],{"class":104},[77,13080,13081,13084,13086],{"class":79,"line":1475},[77,13082,13083],{"class":1648},"      stateful",[77,13085,1666],{"class":104},[77,13087,9781],{"class":1217},[77,13089,13090,13092,13094],{"class":79,"line":1480},[77,13091,12373],{"class":1648},[77,13093,1666],{"class":104},[77,13095,13096],{"class":87},"\"nav2_controller::SimpleGoalChecker\"\n",[77,13098,13099,13102,13104],{"class":79,"line":1491},[77,13100,13101],{"class":1648},"      xy_goal_tolerance",[77,13103,1666],{"class":104},[77,13105,4902],{"class":1217},[77,13107,13108,13111,13113],{"class":79,"line":1502},[77,13109,13110],{"class":1648},"      yaw_goal_tolerance",[77,13112,1666],{"class":104},[77,13114,4902],{"class":1217},[77,13116,13117],{"class":79,"line":1508},[77,13118,140],{"emptyLinePlaceholder":139},[77,13120,13121],{"class":79,"line":1519},[77,13122,13123],{"class":146},"    # DWB parameters\n",[77,13125,13126,13129],{"class":79,"line":1525},[77,13127,13128],{"class":1648},"    FollowPath",[77,13130,1651],{"class":104},[77,13132,13133,13135,13137],{"class":79,"line":1538},[77,13134,12373],{"class":1648},[77,13136,1666],{"class":104},[77,13138,13139],{"class":87},"\"dwb_core::DWBLocalPlanner\"\n",[77,13141,13142,13145,13147],{"class":79,"line":1551},[77,13143,13144],{"class":1648},"      debug_trajectory_details",[77,13146,1666],{"class":104},[77,13148,9781],{"class":1217},[77,13150,13151,13154,13156],{"class":79,"line":1563},[77,13152,13153],{"class":1648},"      min_vel_x",[77,13155,1666],{"class":104},[77,13157,6765],{"class":1217},[77,13159,13160,13163,13165],{"class":79,"line":1576},[77,13161,13162],{"class":1648},"      min_vel_y",[77,13164,1666],{"class":104},[77,13166,6765],{"class":1217},[77,13168,13169],{"class":79,"line":1581},[77,13170,140],{"emptyLinePlaceholder":139},[77,13172,13173],{"class":79,"line":1592},[77,13174,13175],{"class":146},"      # max_vel_x: 0.15\n",[77,13177,13178,13181,13183],{"class":79,"line":1597},[77,13179,13180],{"class":1648},"      max_vel_x",[77,13182,1666],{"class":104},[77,13184,1884],{"class":1217},[77,13186,13187,13190,13192],{"class":79,"line":1603},[77,13188,13189],{"class":1648},"      max_vel_y",[77,13191,1666],{"class":104},[77,13193,6765],{"class":1217},[77,13195,13196],{"class":79,"line":1609},[77,13197,140],{"emptyLinePlaceholder":139},[77,13199,13200],{"class":79,"line":1615},[77,13201,13202],{"class":146},"      # max_vel_theta: 1.0\n",[77,13204,13205,13208,13210],{"class":79,"line":1620},[77,13206,13207],{"class":1648},"      max_vel_theta",[77,13209,1666],{"class":104},[77,13211,12439],{"class":1217},[77,13213,13214,13217,13219],{"class":79,"line":2003},[77,13215,13216],{"class":1648},"      min_speed_xy",[77,13218,1666],{"class":104},[77,13220,6765],{"class":1217},[77,13222,13223,13226,13228],{"class":79,"line":2014},[77,13224,13225],{"class":1648},"      max_speed_xy",[77,13227,1666],{"class":104},[77,13229,1884],{"class":1217},[77,13231,13232,13235,13237],{"class":79,"line":2027},[77,13233,13234],{"class":1648},"      min_speed_theta",[77,13236,1666],{"class":104},[77,13238,6765],{"class":1217},[77,13240,13241],{"class":79,"line":2041},[77,13242,140],{"emptyLinePlaceholder":139},[77,13244,13245],{"class":79,"line":2054},[77,13246,13247],{"class":146},"      # Add high threshold velocity for turtlebot 3 issue.\n",[77,13249,13250],{"class":79,"line":2068},[77,13251,140],{"emptyLinePlaceholder":139},[77,13253,13254],{"class":79,"line":2079},[77,13255,13256],{"class":146},"      # https://github.com/ROBOTIS-GIT/turtlebot3_simulations/issues/75\n",[77,13258,13259,13262,13264],{"class":79,"line":2084},[77,13260,13261],{"class":1648},"      acc_lim_x",[77,13263,1666],{"class":104},[77,13265,12439],{"class":1217},[77,13267,13268,13271,13273],{"class":79,"line":2094},[77,13269,13270],{"class":1648},"      acc_lim_y",[77,13272,1666],{"class":104},[77,13274,6765],{"class":1217},[77,13276,13277,13280,13282],{"class":79,"line":2105},[77,13278,13279],{"class":1648},"      acc_lim_theta",[77,13281,1666],{"class":104},[77,13283,13284],{"class":1217},"3.2\n",[77,13286,13287,13290,13292],{"class":79,"line":2117},[77,13288,13289],{"class":1648},"      decel_lim_x",[77,13291,1666],{"class":104},[77,13293,6686],{"class":1217},[77,13295,13296,13299,13301],{"class":79,"line":2122},[77,13297,13298],{"class":1648},"      decel_lim_y",[77,13300,1666],{"class":104},[77,13302,6765],{"class":1217},[77,13304,13305,13308,13310],{"class":79,"line":2133},[77,13306,13307],{"class":1648},"      decel_lim_theta",[77,13309,1666],{"class":104},[77,13311,13312],{"class":1217},"-3.2\n",[77,13314,13315],{"class":79,"line":2143},[77,13316,140],{"emptyLinePlaceholder":139},[77,13318,13319],{"class":79,"line":2154},[77,13320,13321],{"class":146},"      # vx_samples: 20\n",[77,13323,13324,13327,13329],{"class":79,"line":2159},[77,13325,13326],{"class":1648},"      vx_samples",[77,13328,1666],{"class":104},[77,13330,12051],{"class":1217},[77,13332,13333,13336,13338],{"class":79,"line":2173},[77,13334,13335],{"class":1648},"      vy_samples",[77,13337,1666],{"class":104},[77,13339,13340],{"class":1217},"5\n",[77,13342,13343,13346,13348],{"class":79,"line":2186},[77,13344,13345],{"class":1648},"      vtheta_samples",[77,13347,1666],{"class":104},[77,13349,12051],{"class":1217},[77,13351,13352,13355,13357],{"class":79,"line":2191},[77,13353,13354],{"class":1648},"      sim_time",[77,13356,1666],{"class":104},[77,13358,13359],{"class":1217},"1.7\n",[77,13361,13362,13365,13367],{"class":79,"line":2205},[77,13363,13364],{"class":1648},"      linear_granularity",[77,13366,1666],{"class":104},[77,13368,1852],{"class":1217},[77,13370,13371,13374,13376],{"class":79,"line":2219},[77,13372,13373],{"class":1648},"      angular_granularity",[77,13375,1666],{"class":104},[77,13377,13378],{"class":1217},"0.025\n",[77,13380,13381],{"class":79,"line":2233},[77,13382,140],{"emptyLinePlaceholder":139},[77,13384,13385],{"class":79,"line":2244},[77,13386,13387],{"class":146},"      # transform_tolerance: 0.2\n",[77,13389,13390,13393,13395],{"class":79,"line":2254},[77,13391,13392],{"class":1648},"      transform_tolerance",[77,13394,1666],{"class":104},[77,13396,12439],{"class":1217},[77,13398,13399,13401,13403],{"class":79,"line":6476},[77,13400,13101],{"class":1648},[77,13402,1666],{"class":104},[77,13404,13405],{"class":1217},"0.15\n",[77,13407,13408,13411,13413],{"class":79,"line":6482},[77,13409,13410],{"class":1648},"      trans_stopped_velocity",[77,13412,1666],{"class":104},[77,13414,4902],{"class":1217},[77,13416,13417,13420,13422],{"class":79,"line":6488},[77,13418,13419],{"class":1648},"      short_circuit_trajectory_evaluation",[77,13421,1666],{"class":104},[77,13423,9781],{"class":1217},[77,13425,13426,13428,13430],{"class":79,"line":9974},[77,13427,13083],{"class":1648},[77,13429,1666],{"class":104},[77,13431,9781],{"class":1217},[77,13433,13434,13437,13439,13442,13444,13447,13449,13452,13454,13457,13459,13462,13464,13467,13469,13472],{"class":79,"line":9986},[77,13435,13436],{"class":1648},"      critics",[77,13438,4856],{"class":104},[77,13440,13441],{"class":87},"\"RotateToGoal\"",[77,13443,1455],{"class":104},[77,13445,13446],{"class":87},"\"Oscillation\"",[77,13448,1455],{"class":104},[77,13450,13451],{"class":87},"\"BaseObstacle\"",[77,13453,1455],{"class":104},[77,13455,13456],{"class":87},"\"GoalAlign\"",[77,13458,1455],{"class":104},[77,13460,13461],{"class":87},"\"PathAlign\"",[77,13463,1455],{"class":104},[77,13465,13466],{"class":87},"\"PathDist\"",[77,13468,1455],{"class":104},[77,13470,13471],{"class":87},"\"GoalDist\"",[77,13473,4872],{"class":104},[77,13475,13476,13479,13481],{"class":79,"line":9998},[77,13477,13478],{"class":1648},"      BaseObstacle.scale",[77,13480,1666],{"class":104},[77,13482,13483],{"class":1217},"0.02\n",[77,13485,13486,13489,13491],{"class":79,"line":10009},[77,13487,13488],{"class":1648},"      PathAlign.scale",[77,13490,1666],{"class":104},[77,13492,13493],{"class":1217},"32.0\n",[77,13495,13496,13499,13501],{"class":79,"line":10020},[77,13497,13498],{"class":1648},"      PathAlign.forward_point_distance",[77,13500,1666],{"class":104},[77,13502,1948],{"class":1217},[77,13504,13505,13508,13510],{"class":79,"line":10029},[77,13506,13507],{"class":1648},"      GoalAlign.scale",[77,13509,1666],{"class":104},[77,13511,13512],{"class":1217},"24.0\n",[77,13514,13515,13518,13520],{"class":79,"line":10035},[77,13516,13517],{"class":1648},"      GoalAlign.forward_point_distance",[77,13519,1666],{"class":104},[77,13521,1948],{"class":1217},[77,13523,13524,13527,13529],{"class":79,"line":10044},[77,13525,13526],{"class":1648},"      PathDist.scale",[77,13528,1666],{"class":104},[77,13530,13493],{"class":1217},[77,13532,13533,13536,13538],{"class":79,"line":10049},[77,13534,13535],{"class":1648},"      GoalDist.scale",[77,13537,1666],{"class":104},[77,13539,13512],{"class":1217},[77,13541,13542,13545,13547],{"class":79,"line":10059},[77,13543,13544],{"class":1648},"      RotateToGoal.scale",[77,13546,1666],{"class":104},[77,13548,13493],{"class":1217},[77,13550,13551,13554,13556],{"class":79,"line":10075},[77,13552,13553],{"class":1648},"      RotateToGoal.slowing_factor",[77,13555,1666],{"class":104},[77,13557,13558],{"class":1217},"5.0\n",[77,13560,13561,13564,13566],{"class":79,"line":10080},[77,13562,13563],{"class":1648},"      RotateToGoal.lookahead_time",[77,13565,1666],{"class":104},[77,13567,6686],{"class":1217},[77,13569,13570,13572],{"class":79,"line":10085},[77,13571,6526],{"class":1648},[77,13573,1651],{"class":104},[77,13575,13576,13579],{"class":79,"line":10090},[77,13577,13578],{"class":1648},"  local_costmap",[77,13580,1651],{"class":104},[77,13582,13583,13585],{"class":79,"line":10100},[77,13584,12427],{"class":1648},[77,13586,1651],{"class":104},[77,13588,13589,13591,13593],{"class":79,"line":10112},[77,13590,12434],{"class":1648},[77,13592,1666],{"class":104},[77,13594,13558],{"class":1217},[77,13596,13597,13599,13601],{"class":79,"line":10124},[77,13598,12444],{"class":1648},[77,13600,1666],{"class":104},[77,13602,1842],{"class":1217},[77,13604,13605,13607,13609],{"class":79,"line":10135},[77,13606,12453],{"class":1648},[77,13608,1666],{"class":104},[77,13610,1733],{"class":87},[77,13612,13613,13615,13617],{"class":79,"line":10146},[77,13614,12462],{"class":1648},[77,13616,1666],{"class":104},[77,13618,1753],{"class":87},[77,13620,13621,13623,13625],{"class":79,"line":10155},[77,13622,12471],{"class":1648},[77,13624,1666],{"class":104},[77,13626,9781],{"class":1217},[77,13628,13629,13632,13634],{"class":79,"line":10161},[77,13630,13631],{"class":1648},"      rolling_window",[77,13633,1666],{"class":104},[77,13635,9781],{"class":1217},[77,13637,13638,13641,13643],{"class":79,"line":10170},[77,13639,13640],{"class":1648},"      width",[77,13642,1666],{"class":104},[77,13644,13645],{"class":1217},"2\n",[77,13647,13648,13651,13653],{"class":79,"line":10175},[77,13649,13650],{"class":1648},"      height",[77,13652,1666],{"class":104},[77,13654,13645],{"class":1217},[77,13656,13657,13659,13661],{"class":79,"line":10180},[77,13658,12499],{"class":1648},[77,13660,1666],{"class":104},[77,13662,1852],{"class":1217},[77,13664,13665],{"class":79,"line":10185},[77,13666,140],{"emptyLinePlaceholder":139},[77,13668,13669],{"class":79,"line":10195},[77,13670,13671],{"class":146},"      # robot_radius: 0.20\n",[77,13673,13674,13676,13678],{"class":79,"line":10207},[77,13675,12489],{"class":1648},[77,13677,1666],{"class":104},[77,13679,12494],{"class":87},[77,13681,13682,13684,13686,13688,13690,13692,13694,13696],{"class":79,"line":10219},[77,13683,12517],{"class":1648},[77,13685,4856],{"class":104},[77,13687,12527],{"class":87},[77,13689,1455],{"class":104},[77,13691,12532],{"class":87},[77,13693,1455],{"class":104},[77,13695,12537],{"class":87},[77,13697,4872],{"class":104},[77,13699,13700,13702],{"class":79,"line":10230},[77,13701,12859],{"class":1648},[77,13703,1651],{"class":104},[77,13705,13706,13708,13710],{"class":79,"line":10241},[77,13707,12551],{"class":1648},[77,13709,1666],{"class":104},[77,13711,12870],{"class":87},[77,13713,13714,13716,13718],{"class":79,"line":10250},[77,13715,12885],{"class":1648},[77,13717,1666],{"class":104},[77,13719,1874],{"class":1217},[77,13721,13722,13724,13726],{"class":79,"line":10256},[77,13723,12875],{"class":1648},[77,13725,1666],{"class":104},[77,13727,12880],{"class":1217},[77,13729,13730,13732],{"class":79,"line":10265},[77,13731,12544],{"class":1648},[77,13733,1651],{"class":104},[77,13735,13736,13738,13740],{"class":79,"line":10270},[77,13737,12551],{"class":1648},[77,13739,1666],{"class":104},[77,13741,12556],{"class":87},[77,13743,13744,13746,13748],{"class":79,"line":10275},[77,13745,12561],{"class":1648},[77,13747,1666],{"class":104},[77,13749,9781],{"class":1217},[77,13751,13752,13754,13756],{"class":79,"line":10280},[77,13753,12570],{"class":1648},[77,13755,1666],{"class":104},[77,13757,6892],{"class":87},[77,13759,13760,13762],{"class":79,"line":10290},[77,13761,12579],{"class":1648},[77,13763,1651],{"class":104},[77,13765,13766,13768,13770],{"class":79,"line":10302},[77,13767,12586],{"class":1648},[77,13769,1666],{"class":104},[77,13771,1763],{"class":87},[77,13773,13774,13776,13778],{"class":79,"line":10314},[77,13775,12595],{"class":1648},[77,13777,1666],{"class":104},[77,13779,1842],{"class":1217},[77,13781,13782,13784,13786],{"class":79,"line":10325},[77,13783,12604],{"class":1648},[77,13785,1666],{"class":104},[77,13787,9781],{"class":1217},[77,13789,13790,13792,13794],{"class":79,"line":10336},[77,13791,12613],{"class":1648},[77,13793,1666],{"class":104},[77,13795,9781],{"class":1217},[77,13797,13798,13800,13802],{"class":79,"line":10349},[77,13799,12622],{"class":1648},[77,13801,1666],{"class":104},[77,13803,12627],{"class":87},[77,13805,13806,13808],{"class":79,"line":10358},[77,13807,12669],{"class":1648},[77,13809,1651],{"class":104},[77,13811,13812,13814,13816],{"class":79,"line":10364},[77,13813,12551],{"class":1648},[77,13815,1666],{"class":104},[77,13817,12680],{"class":87},[77,13819,13820,13822,13824],{"class":79,"line":10373},[77,13821,12561],{"class":1648},[77,13823,1666],{"class":104},[77,13825,9781],{"class":1217},[77,13827,13828,13830,13832],{"class":79,"line":10378},[77,13829,12693],{"class":1648},[77,13831,1666],{"class":104},[77,13833,9781],{"class":1217},[77,13835,13836,13838,13840],{"class":79,"line":10387},[77,13837,12702],{"class":1648},[77,13839,1666],{"class":104},[77,13841,6765],{"class":1217},[77,13843,13844,13846,13848],{"class":79,"line":10400},[77,13845,12711],{"class":1648},[77,13847,1666],{"class":104},[77,13849,1852],{"class":1217},[77,13851,13852,13854,13856],{"class":79,"line":10414},[77,13853,12720],{"class":1648},[77,13855,1666],{"class":104},[77,13857,12725],{"class":1217},[77,13859,13860,13862,13864],{"class":79,"line":10419},[77,13861,12730],{"class":1648},[77,13863,1666],{"class":104},[77,13865,1842],{"class":1217},[77,13867,13868,13870,13872],{"class":79,"line":10424},[77,13869,12739],{"class":1648},[77,13871,1666],{"class":104},[77,13873,4882],{"class":1217},[77,13875,13876,13878,13880],{"class":79,"line":10429},[77,13877,12570],{"class":1648},[77,13879,1666],{"class":104},[77,13881,6892],{"class":87},[77,13883,13884,13886],{"class":79,"line":10439},[77,13885,12579],{"class":1648},[77,13887,1651],{"class":104},[77,13889,13890,13892,13894],{"class":79,"line":10451},[77,13891,12586],{"class":1648},[77,13893,1666],{"class":104},[77,13895,1763],{"class":87},[77,13897,13898,13900,13902],{"class":79,"line":10463},[77,13899,12595],{"class":1648},[77,13901,1666],{"class":104},[77,13903,1842],{"class":1217},[77,13905,13906,13908,13910],{"class":79,"line":10474},[77,13907,12604],{"class":1648},[77,13909,1666],{"class":104},[77,13911,9781],{"class":1217},[77,13913,13914,13916,13918],{"class":79,"line":10485},[77,13915,12613],{"class":1648},[77,13917,1666],{"class":104},[77,13919,9781],{"class":1217},[77,13921,13922,13924,13926],{"class":79,"line":10494},[77,13923,12622],{"class":1648},[77,13925,1666],{"class":104},[77,13927,12627],{"class":87},[77,13929,13930,13932,13934],{"class":79,"line":10500},[77,13931,12632],{"class":1648},[77,13933,1666],{"class":104},[77,13935,2011],{"class":1217},[77,13937,13938,13940,13942],{"class":79,"line":10509},[77,13939,12641],{"class":1648},[77,13941,1666],{"class":104},[77,13943,6765],{"class":1217},[77,13945,13946,13948,13950],{"class":79,"line":10514},[77,13947,12650],{"class":1648},[77,13949,1666],{"class":104},[77,13951,12655],{"class":1217},[77,13953,13954,13956,13958],{"class":79,"line":10519},[77,13955,12660],{"class":1648},[77,13957,1666],{"class":104},[77,13959,6765],{"class":1217},[77,13961,13962,13964],{"class":79,"line":10524},[77,13963,12834],{"class":1648},[77,13965,1651],{"class":104},[77,13967,13968,13970,13972],{"class":79,"line":10534},[77,13969,12850],{"class":1648},[77,13971,1666],{"class":104},[77,13973,9781],{"class":1217},[77,13975,13976,13978,13980],{"class":79,"line":10546},[77,13977,12895],{"class":1648},[77,13979,1666],{"class":104},[77,13981,9781],{"class":1217},[18,13983,13984],{},"Footprint",[46,13986,13987,13990],{},[49,13988,13989],{},"將毫米轉換為米：長0.96m，寬0.45m",[49,13991,13992,13993,13995],{},"以機器人中心（",[74,13994,5720],{},"座標系原點）為基準，計算矩形頂點座標：",[18,13997,13998,14001],{},[4274,13999,14000],{},"說明","：頂點按順時針或逆時針順序排列，覆蓋機器人長寬邊界。（右手座標系）",[18,14003,14004],{},"例如長960寬450長400",[68,14006,14010],{"className":14007,"code":14008,"language":14009,"meta":32,"style":32},"language-cpp shiki shiki-themes github-light github-dark","footprint: [[0.48, 0.225], [0.48, -0.225], [-0.48, -0.225], [-0.48, 0.225]]\n","cpp",[74,14011,14012],{"__ignoreMap":32},[77,14013,14014,14017],{"class":79,"line":80},[77,14015,14016],{"class":104},"footprint: ",[77,14018,14019],{"class":1217},"[[0.48, 0.225], [0.48, -0.225], [-0.48, -0.225], [-0.48, 0.225]]\n",[18,14021,14022],{},[21,14023,14024],{},"（4）behavior_server相關配置文件",[18,14026,11965,14027,5194],{},[74,14028,14029],{},"behavior.yaml",[68,14031,14033],{"className":1639,"code":14032,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    costmap_topic: local_costmap/costmap_raw\n    footprint_topic: local_costmap/published_footprint\n    cycle_frequency: 5.0\n    behavior_plugins: [\"spin\", \"backup\", \"drive_on_heading\", \"assisted_teleop\", \"wait\"]\n    spin:\n      plugin: \"nav2_behaviors/Spin\"\n    backup:\n      plugin: \"nav2_behaviors/BackUp\"\n    drive_on_heading:\n      plugin: \"nav2_behaviors/DriveOnHeading\"\n    wait:\n      plugin: \"nav2_behaviors/Wait\"\n    assisted_teleop:\n      plugin: \"nav2_behaviors/AssistedTeleop\"\n    global_frame: odom\n    robot_base_frame: base_link\n    transform_tolerance: 0.1\n    use_sim_time: True\n    simulate_ahead_time: 2.0\n    max_rotational_vel: 1.0\n    min_rotational_vel: 0.4\n    rotational_acc_lim: 3.2\n",[74,14034,14035,14041,14047,14057,14067,14076,14108,14115,14124,14131,14140,14147,14156,14163,14172,14179,14188,14196,14204,14212,14220,14229,14238,14248],{"__ignoreMap":32},[77,14036,14037,14039],{"class":79,"line":80},[77,14038,6526],{"class":1648},[77,14040,1651],{"class":104},[77,14042,14043,14045],{"class":79,"line":114},[77,14044,1656],{"class":1648},[77,14046,1651],{"class":104},[77,14048,14049,14052,14054],{"class":79,"line":136},[77,14050,14051],{"class":1648},"    costmap_topic",[77,14053,1666],{"class":104},[77,14055,14056],{"class":87},"local_costmap/costmap_raw\n",[77,14058,14059,14062,14064],{"class":79,"line":143},[77,14060,14061],{"class":1648},"    footprint_topic",[77,14063,1666],{"class":104},[77,14065,14066],{"class":87},"local_costmap/published_footprint\n",[77,14068,14069,14072,14074],{"class":79,"line":150},[77,14070,14071],{"class":1648},"    cycle_frequency",[77,14073,1666],{"class":104},[77,14075,13558],{"class":1217},[77,14077,14078,14081,14083,14086,14088,14091,14093,14096,14098,14101,14103,14106],{"class":79,"line":162},[77,14079,14080],{"class":1648},"    behavior_plugins",[77,14082,4856],{"class":104},[77,14084,14085],{"class":87},"\"spin\"",[77,14087,1455],{"class":104},[77,14089,14090],{"class":87},"\"backup\"",[77,14092,1455],{"class":104},[77,14094,14095],{"class":87},"\"drive_on_heading\"",[77,14097,1455],{"class":104},[77,14099,14100],{"class":87},"\"assisted_teleop\"",[77,14102,1455],{"class":104},[77,14104,14105],{"class":87},"\"wait\"",[77,14107,4872],{"class":104},[77,14109,14110,14113],{"class":79,"line":174},[77,14111,14112],{"class":1648},"    spin",[77,14114,1651],{"class":104},[77,14116,14117,14119,14121],{"class":79,"line":179},[77,14118,12373],{"class":1648},[77,14120,1666],{"class":104},[77,14122,14123],{"class":87},"\"nav2_behaviors/Spin\"\n",[77,14125,14126,14129],{"class":79,"line":185},[77,14127,14128],{"class":1648},"    backup",[77,14130,1651],{"class":104},[77,14132,14133,14135,14137],{"class":79,"line":197},[77,14134,12373],{"class":1648},[77,14136,1666],{"class":104},[77,14138,14139],{"class":87},"\"nav2_behaviors/BackUp\"\n",[77,14141,14142,14145],{"class":79,"line":1348},[77,14143,14144],{"class":1648},"    drive_on_heading",[77,14146,1651],{"class":104},[77,14148,14149,14151,14153],{"class":79,"line":1363},[77,14150,12373],{"class":1648},[77,14152,1666],{"class":104},[77,14154,14155],{"class":87},"\"nav2_behaviors/DriveOnHeading\"\n",[77,14157,14158,14161],{"class":79,"line":1368},[77,14159,14160],{"class":1648},"    wait",[77,14162,1651],{"class":104},[77,14164,14165,14167,14169],{"class":79,"line":1379},[77,14166,12373],{"class":1648},[77,14168,1666],{"class":104},[77,14170,14171],{"class":87},"\"nav2_behaviors/Wait\"\n",[77,14173,14174,14177],{"class":79,"line":1388},[77,14175,14176],{"class":1648},"    assisted_teleop",[77,14178,1651],{"class":104},[77,14180,14181,14183,14185],{"class":79,"line":1402},[77,14182,12373],{"class":1648},[77,14184,1666],{"class":104},[77,14186,14187],{"class":87},"\"nav2_behaviors/AssistedTeleop\"\n",[77,14189,14190,14192,14194],{"class":79,"line":1415},[77,14191,11998],{"class":1648},[77,14193,1666],{"class":104},[77,14195,1733],{"class":87},[77,14197,14198,14200,14202],{"class":79,"line":1425},[77,14199,12007],{"class":1648},[77,14201,1666],{"class":104},[77,14203,1753],{"class":87},[77,14205,14206,14208,14210],{"class":79,"line":1433},[77,14207,6825],{"class":1648},[77,14209,1666],{"class":104},[77,14211,1948],{"class":1217},[77,14213,14214,14216,14218],{"class":79,"line":1449},[77,14215,6539],{"class":1648},[77,14217,1666],{"class":104},[77,14219,9781],{"class":1217},[77,14221,14222,14225,14227],{"class":79,"line":1463},[77,14223,14224],{"class":1648},"    simulate_ahead_time",[77,14226,1666],{"class":104},[77,14228,1842],{"class":1217},[77,14230,14231,14234,14236],{"class":79,"line":1475},[77,14232,14233],{"class":1648},"    max_rotational_vel",[77,14235,1666],{"class":104},[77,14237,12439],{"class":1217},[77,14239,14240,14243,14245],{"class":79,"line":1480},[77,14241,14242],{"class":1648},"    min_rotational_vel",[77,14244,1666],{"class":104},[77,14246,14247],{"class":1217},"0.4\n",[77,14249,14250,14253,14255],{"class":79,"line":1491},[77,14251,14252],{"class":1648},"    rotational_acc_lim",[77,14254,1666],{"class":104},[77,14256,13284],{"class":1217},[18,14258,14259],{},[21,14260,14261],{},"（5）waypoint_follower相關配置文件",[18,14263,11965,14264,5194],{},[74,14265,14266],{},"waypoint.yaml",[68,14268,14270],{"className":1639,"code":14269,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    use_sim_time: True\n    loop_rate: 20\n    stop_on_failure: false\n    waypoint_task_executor_plugin: \"wait_at_waypoint\"\n    wait_at_waypoint:\n      plugin: \"nav2_waypoint_follower::WaitAtWaypoint\"\n      enabled: True\n      waypoint_pause_duration: 5000\n",[74,14271,14272,14278,14284,14292,14301,14310,14320,14327,14336,14345],{"__ignoreMap":32},[77,14273,14274,14276],{"class":79,"line":80},[77,14275,6526],{"class":1648},[77,14277,1651],{"class":104},[77,14279,14280,14282],{"class":79,"line":114},[77,14281,1656],{"class":1648},[77,14283,1651],{"class":104},[77,14285,14286,14288,14290],{"class":79,"line":136},[77,14287,6539],{"class":1648},[77,14289,1666],{"class":104},[77,14291,9781],{"class":1217},[77,14293,14294,14297,14299],{"class":79,"line":143},[77,14295,14296],{"class":1648},"    loop_rate",[77,14298,1666],{"class":104},[77,14300,12051],{"class":1217},[77,14302,14303,14306,14308],{"class":79,"line":150},[77,14304,14305],{"class":1648},"    stop_on_failure",[77,14307,1666],{"class":104},[77,14309,1809],{"class":1217},[77,14311,14312,14315,14317],{"class":79,"line":162},[77,14313,14314],{"class":1648},"    waypoint_task_executor_plugin",[77,14316,1666],{"class":104},[77,14318,14319],{"class":87},"\"wait_at_waypoint\"\n",[77,14321,14322,14325],{"class":79,"line":174},[77,14323,14324],{"class":1648},"    wait_at_waypoint",[77,14326,1651],{"class":104},[77,14328,14329,14331,14333],{"class":79,"line":179},[77,14330,12373],{"class":1648},[77,14332,1666],{"class":104},[77,14334,14335],{"class":87},"\"nav2_waypoint_follower::WaitAtWaypoint\"\n",[77,14337,14338,14341,14343],{"class":79,"line":185},[77,14339,14340],{"class":1648},"      enabled",[77,14342,1666],{"class":104},[77,14344,9781],{"class":1217},[77,14346,14347,14350,14352],{"class":79,"line":197},[77,14348,14349],{"class":1648},"      waypoint_pause_duration",[77,14351,1666],{"class":104},[77,14353,14354],{"class":1217},"5000\n",[18,14356,14357],{},[21,14358,14359],{},"（6）velocity_smoother相關配置文件",[18,14361,11965,14362,5194],{},[74,14363,14364],{},"velocity.yaml",[68,14366,14368],{"className":1639,"code":14367,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    use_sim_time: True\n    smoothing_frequency: 20.0\n    scale_velocities: False\n    feedback: \"OPEN_LOOP\"\n    max_velocity: [0.1, 0.0, 1.0]\n    min_velocity: [-0.1, 0.0, -1.0]\n    max_accel: [2.5, 0.0, 3.2]\n    max_decel: [-2.5, 0.0, -3.2]\n    odom_topic: \"odom\"\n    odom_duration: 0.1\n    deadband_velocity: [0.0, 0.0, 0.0]\n    velocity_timeout: 1.0\n",[74,14369,14370,14376,14382,14390,14399,14408,14418,14438,14459,14480,14501,14509,14518,14537],{"__ignoreMap":32},[77,14371,14372,14374],{"class":79,"line":80},[77,14373,6526],{"class":1648},[77,14375,1651],{"class":104},[77,14377,14378,14380],{"class":79,"line":114},[77,14379,1656],{"class":1648},[77,14381,1651],{"class":104},[77,14383,14384,14386,14388],{"class":79,"line":136},[77,14385,6539],{"class":1648},[77,14387,1666],{"class":104},[77,14389,9781],{"class":1217},[77,14391,14392,14395,14397],{"class":79,"line":143},[77,14393,14394],{"class":1648},"    smoothing_frequency",[77,14396,1666],{"class":104},[77,14398,12342],{"class":1217},[77,14400,14401,14404,14406],{"class":79,"line":150},[77,14402,14403],{"class":1648},"    scale_velocities",[77,14405,1666],{"class":104},[77,14407,12900],{"class":1217},[77,14409,14410,14413,14415],{"class":79,"line":162},[77,14411,14412],{"class":1648},"    feedback",[77,14414,1666],{"class":104},[77,14416,14417],{"class":87},"\"OPEN_LOOP\"\n",[77,14419,14420,14423,14425,14427,14429,14432,14434,14436],{"class":79,"line":174},[77,14421,14422],{"class":1648},"    max_velocity",[77,14424,4856],{"class":104},[77,14426,1987],{"class":1217},[77,14428,1455],{"class":104},[77,14430,14431],{"class":1217},"0.0",[77,14433,1455],{"class":104},[77,14435,2181],{"class":1217},[77,14437,4872],{"class":104},[77,14439,14440,14443,14445,14448,14450,14452,14454,14457],{"class":79,"line":179},[77,14441,14442],{"class":1648},"    min_velocity",[77,14444,4856],{"class":104},[77,14446,14447],{"class":1217},"-0.1",[77,14449,1455],{"class":104},[77,14451,14431],{"class":1217},[77,14453,1455],{"class":104},[77,14455,14456],{"class":1217},"-1.0",[77,14458,4872],{"class":104},[77,14460,14461,14464,14466,14469,14471,14473,14475,14478],{"class":79,"line":185},[77,14462,14463],{"class":1648},"    max_accel",[77,14465,4856],{"class":104},[77,14467,14468],{"class":1217},"2.5",[77,14470,1455],{"class":104},[77,14472,14431],{"class":1217},[77,14474,1455],{"class":104},[77,14476,14477],{"class":1217},"3.2",[77,14479,4872],{"class":104},[77,14481,14482,14485,14487,14490,14492,14494,14496,14499],{"class":79,"line":197},[77,14483,14484],{"class":1648},"    max_decel",[77,14486,4856],{"class":104},[77,14488,14489],{"class":1217},"-2.5",[77,14491,1455],{"class":104},[77,14493,14431],{"class":1217},[77,14495,1455],{"class":104},[77,14497,14498],{"class":1217},"-3.2",[77,14500,4872],{"class":104},[77,14502,14503,14505,14507],{"class":79,"line":1348},[77,14504,12016],{"class":1648},[77,14506,1666],{"class":104},[77,14508,6736],{"class":87},[77,14510,14511,14514,14516],{"class":79,"line":1363},[77,14512,14513],{"class":1648},"    odom_duration",[77,14515,1666],{"class":104},[77,14517,1948],{"class":1217},[77,14519,14520,14523,14525,14527,14529,14531,14533,14535],{"class":79,"line":1368},[77,14521,14522],{"class":1648},"    deadband_velocity",[77,14524,4856],{"class":104},[77,14526,14431],{"class":1217},[77,14528,1455],{"class":104},[77,14530,14431],{"class":1217},[77,14532,1455],{"class":104},[77,14534,14431],{"class":1217},[77,14536,4872],{"class":104},[77,14538,14539,14542,14544],{"class":79,"line":1379},[77,14540,14541],{"class":1648},"    velocity_timeout",[77,14543,1666],{"class":104},[77,14545,12439],{"class":1217},[18,14547,14548],{},[21,14549,14550],{},"（7）smoother_server相關配置文件",[18,14552,11965,14553,5194],{},[74,14554,14555],{},"smootherr.yaml",[68,14557,14559],{"className":1639,"code":14558,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    costmap_topic: global_costmap/costmap_raw\n    footprint_topic: global_costmap/published_footprint\n    robot_base_frame: base_link\n    transform_timeout: 0.1\n    smoother_plugins: [\"simple_smoother\"]\n    simple_smoother:\n      plugin: \"nav2_smoother::SimpleSmoother\"\n      tolerance: 1.0e-10\n      do_refinement: True\n",[74,14560,14561,14567,14573,14582,14591,14599,14607,14619,14626,14635,14644],{"__ignoreMap":32},[77,14562,14563,14565],{"class":79,"line":80},[77,14564,6526],{"class":1648},[77,14566,1651],{"class":104},[77,14568,14569,14571],{"class":79,"line":114},[77,14570,1656],{"class":1648},[77,14572,1651],{"class":104},[77,14574,14575,14577,14579],{"class":79,"line":136},[77,14576,14051],{"class":1648},[77,14578,1666],{"class":104},[77,14580,14581],{"class":87},"global_costmap/costmap_raw\n",[77,14583,14584,14586,14588],{"class":79,"line":143},[77,14585,14061],{"class":1648},[77,14587,1666],{"class":104},[77,14589,14590],{"class":87},"global_costmap/published_footprint\n",[77,14592,14593,14595,14597],{"class":79,"line":150},[77,14594,12007],{"class":1648},[77,14596,1666],{"class":104},[77,14598,1753],{"class":87},[77,14600,14601,14603,14605],{"class":79,"line":162},[77,14602,1879],{"class":1648},[77,14604,1666],{"class":104},[77,14606,1948],{"class":1217},[77,14608,14609,14612,14614,14617],{"class":79,"line":174},[77,14610,14611],{"class":1648},"    smoother_plugins",[77,14613,4856],{"class":104},[77,14615,14616],{"class":87},"\"simple_smoother\"",[77,14618,4872],{"class":104},[77,14620,14621,14624],{"class":79,"line":179},[77,14622,14623],{"class":1648},"    simple_smoother",[77,14625,1651],{"class":104},[77,14627,14628,14630,14632],{"class":79,"line":185},[77,14629,12373],{"class":1648},[77,14631,1666],{"class":104},[77,14633,14634],{"class":87},"\"nav2_smoother::SimpleSmoother\"\n",[77,14636,14637,14639,14641],{"class":79,"line":197},[77,14638,12383],{"class":1648},[77,14640,1666],{"class":104},[77,14642,14643],{"class":1217},"1.0e-10\n",[77,14645,14646,14649,14651],{"class":79,"line":1348},[77,14647,14648],{"class":1648},"      do_refinement",[77,14650,1666],{"class":104},[77,14652,9781],{"class":1217},[18,14654,14655],{},[21,14656,14657],{},"3.launch集成",[18,14659,14660,14661,14664],{},"導航實現時，需要依賴於地圖與定位功能，我們可以在一個launch文件中集成之前的定位launch以及當前編寫的導航核心模塊的launch，以簡化導航功能的啟動，在launch目錄下新建一個名為",[74,14662,14663],{},"bringup.launch.py","的launch文件，並輸入如下內容：",[68,14666,14668],{"className":1236,"code":14667,"language":1238,"meta":32,"style":32},"import os\n\nfrom ament_index_python.packages import get_package_share_directory\n\nfrom launch import LaunchDescription\nfrom launch.actions import IncludeLaunchDescription, DeclareLaunchArgument\nfrom launch.substitutions import LaunchConfiguration\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\n\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument(\n        'use_sim_time',\n        default_value='false'\n    )\n\n    amcl_pkg = get_package_share_directory(\"mycar_localization\")\n    nav2_pkg = get_package_share_directory(\"mycar_navigation2\")\n\n    amcl_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                amcl_pkg,\n                'launch',\n                'mycar_loca.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': LaunchConfiguration('use_sim_time')\n        }.items()\n    )\n\n    nav2_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                nav2_pkg,\n                'launch',\n                'nav2.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': LaunchConfiguration('use_sim_time')\n        }.items()\n    )\n\n    return LaunchDescription([\n        use_sim_time_arg,\n        amcl_launch,\n        nav2_launch\n    ])\n",[74,14669,14670,14676,14680,14690,14694,14704,14715,14725,14735,14739,14743,14751,14755,14763,14769,14777,14781,14785,14799,14812,14816,14825,14829,14833,14838,14844,14849,14853,14857,14865,14875,14879,14883,14887,14896,14900,14904,14909,14915,14920,14924,14928,14936,14946,14950,14954,14958,14964,14968,14973,14978],{"__ignoreMap":32},[77,14671,14672,14674],{"class":79,"line":80},[77,14673,1245],{"class":97},[77,14675,1248],{"class":104},[77,14677,14678],{"class":79,"line":114},[77,14679,140],{"emptyLinePlaceholder":139},[77,14681,14682,14684,14686,14688],{"class":79,"line":136},[77,14683,1257],{"class":97},[77,14685,1308],{"class":104},[77,14687,1245],{"class":97},[77,14689,1313],{"class":104},[77,14691,14692],{"class":79,"line":143},[77,14693,140],{"emptyLinePlaceholder":139},[77,14695,14696,14698,14700,14702],{"class":79,"line":150},[77,14697,1257],{"class":97},[77,14699,1260],{"class":104},[77,14701,1245],{"class":97},[77,14703,1265],{"class":104},[77,14705,14706,14708,14710,14712],{"class":79,"line":162},[77,14707,1257],{"class":97},[77,14709,1272],{"class":104},[77,14711,1245],{"class":97},[77,14713,14714],{"class":104}," IncludeLaunchDescription, DeclareLaunchArgument\n",[77,14716,14717,14719,14721,14723],{"class":79,"line":174},[77,14718,1257],{"class":97},[77,14720,1284],{"class":104},[77,14722,1245],{"class":97},[77,14724,1289],{"class":104},[77,14726,14727,14729,14731,14733],{"class":79,"line":179},[77,14728,1257],{"class":97},[77,14730,6062],{"class":104},[77,14732,1245],{"class":97},[77,14734,6067],{"class":104},[77,14736,14737],{"class":79,"line":185},[77,14738,140],{"emptyLinePlaceholder":139},[77,14740,14741],{"class":79,"line":197},[77,14742,140],{"emptyLinePlaceholder":139},[77,14744,14745,14747,14749],{"class":79,"line":1348},[77,14746,1322],{"class":97},[77,14748,1325],{"class":83},[77,14750,1328],{"class":104},[77,14752,14753],{"class":79,"line":1363},[77,14754,140],{"emptyLinePlaceholder":139},[77,14756,14757,14759,14761],{"class":79,"line":1368},[77,14758,3097],{"class":104},[77,14760,1336],{"class":97},[77,14762,1376],{"class":104},[77,14764,14765,14767],{"class":79,"line":1379},[77,14766,1382],{"class":87},[77,14768,1385],{"class":104},[77,14770,14771,14773,14775],{"class":79,"line":1388},[77,14772,1392],{"class":1391},[77,14774,1336],{"class":97},[77,14776,6124],{"class":87},[77,14778,14779],{"class":79,"line":1402},[77,14780,3250],{"class":104},[77,14782,14783],{"class":79,"line":1415},[77,14784,140],{"emptyLinePlaceholder":139},[77,14786,14787,14790,14792,14794,14797],{"class":79,"line":1425},[77,14788,14789],{"class":104},"    amcl_pkg ",[77,14791,1336],{"class":97},[77,14793,9563],{"class":104},[77,14795,14796],{"class":87},"\"mycar_localization\"",[77,14798,1345],{"class":104},[77,14800,14801,14804,14806,14808,14810],{"class":79,"line":1433},[77,14802,14803],{"class":104},"    nav2_pkg ",[77,14805,1336],{"class":97},[77,14807,9563],{"class":104},[77,14809,9566],{"class":87},[77,14811,1345],{"class":104},[77,14813,14814],{"class":79,"line":1449},[77,14815,140],{"emptyLinePlaceholder":139},[77,14817,14818,14821,14823],{"class":79,"line":1463},[77,14819,14820],{"class":104},"    amcl_launch ",[77,14822,1336],{"class":97},[77,14824,6382],{"class":104},[77,14826,14827],{"class":79,"line":1475},[77,14828,6387],{"class":104},[77,14830,14831],{"class":79,"line":1480},[77,14832,6392],{"class":104},[77,14834,14835],{"class":79,"line":1491},[77,14836,14837],{"class":104},"                amcl_pkg,\n",[77,14839,14840,14842],{"class":79,"line":1502},[77,14841,6407],{"class":87},[77,14843,1385],{"class":104},[77,14845,14846],{"class":79,"line":1508},[77,14847,14848],{"class":87},"                'mycar_loca.launch.py'\n",[77,14850,14851],{"class":79,"line":1519},[77,14852,6419],{"class":104},[77,14854,14855],{"class":79,"line":1525},[77,14856,6424],{"class":104},[77,14858,14859,14861,14863],{"class":79,"line":1538},[77,14860,6429],{"class":1391},[77,14862,1336],{"class":97},[77,14864,6434],{"class":104},[77,14866,14867,14869,14871,14873],{"class":79,"line":1551},[77,14868,6439],{"class":87},[77,14870,3189],{"class":104},[77,14872,1342],{"class":87},[77,14874,1345],{"class":104},[77,14876,14877],{"class":79,"line":1563},[77,14878,6450],{"class":104},[77,14880,14881],{"class":79,"line":1576},[77,14882,3250],{"class":104},[77,14884,14885],{"class":79,"line":1581},[77,14886,140],{"emptyLinePlaceholder":139},[77,14888,14889,14892,14894],{"class":79,"line":1592},[77,14890,14891],{"class":104},"    nav2_launch ",[77,14893,1336],{"class":97},[77,14895,6382],{"class":104},[77,14897,14898],{"class":79,"line":1597},[77,14899,6387],{"class":104},[77,14901,14902],{"class":79,"line":1603},[77,14903,6392],{"class":104},[77,14905,14906],{"class":79,"line":1609},[77,14907,14908],{"class":104},"                nav2_pkg,\n",[77,14910,14911,14913],{"class":79,"line":1615},[77,14912,6407],{"class":87},[77,14914,1385],{"class":104},[77,14916,14917],{"class":79,"line":1620},[77,14918,14919],{"class":87},"                'nav2.launch.py'\n",[77,14921,14922],{"class":79,"line":2003},[77,14923,6419],{"class":104},[77,14925,14926],{"class":79,"line":2014},[77,14927,6424],{"class":104},[77,14929,14930,14932,14934],{"class":79,"line":2027},[77,14931,6429],{"class":1391},[77,14933,1336],{"class":97},[77,14935,6434],{"class":104},[77,14937,14938,14940,14942,14944],{"class":79,"line":2041},[77,14939,6439],{"class":87},[77,14941,3189],{"class":104},[77,14943,1342],{"class":87},[77,14945,1345],{"class":104},[77,14947,14948],{"class":79,"line":2054},[77,14949,6450],{"class":104},[77,14951,14952],{"class":79,"line":2068},[77,14953,3250],{"class":104},[77,14955,14956],{"class":79,"line":2079},[77,14957,140],{"emptyLinePlaceholder":139},[77,14959,14960,14962],{"class":79,"line":2084},[77,14961,1623],{"class":97},[77,14963,3333],{"class":104},[77,14965,14966],{"class":79,"line":2094},[77,14967,3338],{"class":104},[77,14969,14970],{"class":79,"line":2105},[77,14971,14972],{"class":104},"        amcl_launch,\n",[77,14974,14975],{"class":79,"line":2117},[77,14976,14977],{"class":104},"        nav2_launch\n",[77,14979,14980],{"class":79,"line":2122},[77,14981,3358],{"class":104},[18,14983,14984],{},[21,14985,14986],{},"4.編輯配置文件",[18,14988,2272,14989,2276],{},[74,14990,2275],{},[68,14992,14994],{"className":2279,"code":14993,"language":2281,"meta":32,"style":32},"install(DIRECTORY launch params bts\n  DESTINATION share/${PROJECT_NAME}\n)\n",[74,14995,14996,15003,15009],{"__ignoreMap":32},[77,14997,14998,15000],{"class":79,"line":80},[77,14999,2288],{"class":97},[77,15001,15002],{"class":104},"(DIRECTORY launch params bts\n",[77,15004,15005,15007],{"class":79,"line":114},[77,15006,2296],{"class":104},[77,15008,2299],{"class":97},[77,15010,15011],{"class":79,"line":136},[77,15012,1345],{"class":104},[18,15014,15015],{},[21,15016,15017],{},"5.編譯",[18,15019,2311],{},[68,15021,15023],{"className":70,"code":15022,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_navigation2\n",[74,15024,15025],{"__ignoreMap":32},[77,15026,15027,15029,15031,15033],{"class":79,"line":80},[77,15028,2321],{"class":83},[77,15030,2324],{"class":87},[77,15032,2327],{"class":1217},[77,15034,15035],{"class":87}," mycar_navigation2\n",[18,15037,15038],{},[21,15039,15040],{},"6.執行",[18,15042,4001],{},[68,15044,15045],{"className":70,"code":2343,"language":72,"meta":32,"style":32},[74,15046,15047,15053],{"__ignoreMap":32},[77,15048,15049,15051],{"class":79,"line":80},[77,15050,2350],{"class":1217},[77,15052,2353],{"class":87},[77,15054,15055,15057,15059,15061],{"class":79,"line":114},[77,15056,1205],{"class":83},[77,15058,2360],{"class":87},[77,15060,2363],{"class":87},[77,15062,2366],{"class":87},[18,15064,15065],{},"（2）然後在終端下進入當前工作空間，輸入如下指令啟動導航功能：",[68,15067,15069],{"className":70,"code":15068,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_navigation2 bringup.launch.py use_sim_time:=True\n",[74,15070,15071,15077],{"__ignoreMap":32},[77,15072,15073,15075],{"class":79,"line":80},[77,15074,2350],{"class":1217},[77,15076,2353],{"class":87},[77,15078,15079,15081,15083,15085,15088],{"class":79,"line":114},[77,15080,1205],{"class":83},[77,15082,2360],{"class":87},[77,15084,9365],{"class":87},[77,15086,15087],{"class":87}," bringup.launch.py",[77,15089,2396],{"class":87},[18,15091,15092,15093,15096,15097,15100,15101,15104],{},"（3）啟動rviz2，加載",[74,15094,15095],{},"/opt/ros/humble/share/nav2_bringup/rviz","下的",[74,15098,15099],{},"nav2_default_view.rviz","文件，為機器人設置初始位姿後，再通過菜單欄的",[74,15102,15103],{},"Nav2 Goal","設置目標點，機器人就可以自動導航至目標點了。",[68,15106,15108],{"className":70,"code":15107,"language":72,"meta":32,"style":32},"rviz2 -d /opt/ros/humble/share/nav2_bringup/rviz/nav2_default_view.rviz\n",[74,15109,15110],{"__ignoreMap":32},[77,15111,15112,15115,15118],{"class":79,"line":80},[77,15113,15114],{"class":83},"rviz2",[77,15116,15117],{"class":1217}," -d",[77,15119,15120],{"class":87}," /opt/ros/humble/share/nav2_bringup/rviz/nav2_default_view.rviz\n",[46,15122,15123,15131,15141],{},[49,15124,15125,15127,15128,15130],{},[74,15126,15114],{},"：啟動 ",[74,15129,15114],{}," 工具。",[49,15132,15133,15136,15137,15140],{},[74,15134,15135],{},"-d","：指定要加載的 ",[74,15138,15139],{},".rviz"," 配置文件。",[49,15142,15143,15146,15147,15149],{},[74,15144,15145],{},"/opt/ros/humble/share/nav2_bringup/rviz/nav2_default_view.rviz","：",[74,15148,15139],{}," 配置文件的路徑。",[18,15151,15152,15153,15155,15156,15140],{},"運行該命令後，",[74,15154,15114],{}," 將啟動並加載 ",[74,15157,15099],{},[18,15159,15160],{},"先使用",[18,15162,15163,15166],{},[30,15164],{"alt":32,"src":15165},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1766.webp",[30,15167],{"alt":32,"src":15168},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1767.webp",[18,15170,15171],{},"如上圖，左圖是選擇初始位置，右圖是選擇目標位置。",[18,15173,15174],{},"上圖中，每個障礙物和牆附近的光圈是危險程度，顏色越紅表示機器人經過此地越危險。",[18,15176,15177],{},[30,15178],{"alt":32,"src":15179},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1768.webp",[18,15181,15182],{},[30,15183],{"alt":32,"src":15184},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1769.webp",[14,15186,15188],{"id":15187},"自主探索slam","自主探索SLAM",[18,15190,15191,15192,15195,15196,15199],{},"導航需要依賴於地圖與定位，例如在上一節 ",[21,15193,15194],{},"導航功能集成"," 中，導航實現時就是以launch文件的方式集成了 ",[21,15197,15198],{},"定位AMCL"," 一節中的定位功能，而機器人SLAM時，也是發佈地圖數據與定位信息的，所以導航時也可以不借助於amcl而是直接與SLAM結合，達到自主探索的SLAM效果。",[18,15201,15202],{},[21,15203,15204],{},"1.編寫launch文件",[18,15206,15207,15208,14664],{},"在功能包mycar_navigation2的launch目錄下新建名為",[74,15209,15210],{},"auto_slam.launch.py",[68,15212,15214],{"className":1236,"code":15213,"language":1238,"meta":32,"style":32},"import os\n\nfrom ament_index_python.packages import get_package_share_directory\n\nfrom launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument, IncludeLaunchDescription\nfrom launch.conditions import IfCondition\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\nfrom launch.substitutions import LaunchConfiguration, PythonExpression\n\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument(\n        'use_sim_time',\n        default_value='false'\n    )\n\n    slam_backend_arg = DeclareLaunchArgument(\n        'slam_backend',\n        default_value='cartographer',\n        description='SLAM backend: slam_toolbox or cartographer'\n    )\n\n    use_sim_time = LaunchConfiguration('use_sim_time')\n    slam_backend = LaunchConfiguration('slam_backend')\n\n    slam_toolbox_pkg = get_package_share_directory(\"mycar_slam_slam_toolbox\")\n    cartographer_pkg = get_package_share_directory(\"mycar_slam_cartographer\")\n    # 从这开始修改: Jazzy auto_slam 引用 mycar_navigation2_jazzy，而不是 Humble 版本包\n    nav2_pkg = get_package_share_directory(\"mycar_navigation2_jazzy\")\n    # 从这结束\n\n    slam_toolbox_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                slam_toolbox_pkg,\n                'launch',\n                'online_sync_launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': use_sim_time\n        }.items(),\n        condition=IfCondition(\n            PythonExpression([\"'\", slam_backend, \"' == 'slam_toolbox'\"])\n        )\n    )\n\n    cartographer_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                cartographer_pkg,\n                'launch',\n                'cartographer.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': use_sim_time\n        }.items(),\n        condition=IfCondition(\n            PythonExpression([\"'\", slam_backend, \"' == 'cartographer'\"])\n        )\n    )\n\n    nav2_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                nav2_pkg,\n                'launch',\n                'nav2.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': use_sim_time\n        }.items()\n    )\n\n    ld = LaunchDescription()\n    ld.add_action(use_sim_time_arg)\n    ld.add_action(slam_backend_arg)\n    ld.add_action(slam_toolbox_launch)\n    ld.add_action(cartographer_launch)\n    ld.add_action(nav2_launch)\n    return ld\n\n",[74,15215,15216,15222,15226,15236,15240,15250,15260,15272,15282,15293,15297,15301,15309,15313,15321,15327,15335,15339,15343,15352,15359,15370,15379,15383,15387,15399,15413,15417,15430,15443,15448,15461,15466,15470,15479,15483,15487,15492,15498,15503,15507,15511,15519,15525,15530,15540,15557,15561,15565,15569,15578,15582,15586,15591,15597,15602,15606,15610,15618,15624,15628,15636,15649,15653,15657,15661,15669,15673,15677,15681,15687,15691,15695,15699,15707,15713,15717,15721,15725,15733,15738,15743,15748,15753,15758],{"__ignoreMap":32},[77,15217,15218,15220],{"class":79,"line":80},[77,15219,1245],{"class":97},[77,15221,1248],{"class":104},[77,15223,15224],{"class":79,"line":114},[77,15225,140],{"emptyLinePlaceholder":139},[77,15227,15228,15230,15232,15234],{"class":79,"line":136},[77,15229,1257],{"class":97},[77,15231,1308],{"class":104},[77,15233,1245],{"class":97},[77,15235,1313],{"class":104},[77,15237,15238],{"class":79,"line":143},[77,15239,140],{"emptyLinePlaceholder":139},[77,15241,15242,15244,15246,15248],{"class":79,"line":150},[77,15243,1257],{"class":97},[77,15245,1260],{"class":104},[77,15247,1245],{"class":97},[77,15249,1265],{"class":104},[77,15251,15252,15254,15256,15258],{"class":79,"line":162},[77,15253,1257],{"class":97},[77,15255,1272],{"class":104},[77,15257,1245],{"class":97},[77,15259,6045],{"class":104},[77,15261,15262,15264,15267,15269],{"class":79,"line":174},[77,15263,1257],{"class":97},[77,15265,15266],{"class":104}," launch.conditions ",[77,15268,1245],{"class":97},[77,15270,15271],{"class":104}," IfCondition\n",[77,15273,15274,15276,15278,15280],{"class":79,"line":179},[77,15275,1257],{"class":97},[77,15277,6062],{"class":104},[77,15279,1245],{"class":97},[77,15281,6067],{"class":104},[77,15283,15284,15286,15288,15290],{"class":79,"line":185},[77,15285,1257],{"class":97},[77,15287,1284],{"class":104},[77,15289,1245],{"class":97},[77,15291,15292],{"class":104}," LaunchConfiguration, PythonExpression\n",[77,15294,15295],{"class":79,"line":197},[77,15296,140],{"emptyLinePlaceholder":139},[77,15298,15299],{"class":79,"line":1348},[77,15300,140],{"emptyLinePlaceholder":139},[77,15302,15303,15305,15307],{"class":79,"line":1363},[77,15304,1322],{"class":97},[77,15306,1325],{"class":83},[77,15308,1328],{"class":104},[77,15310,15311],{"class":79,"line":1368},[77,15312,140],{"emptyLinePlaceholder":139},[77,15314,15315,15317,15319],{"class":79,"line":1379},[77,15316,3097],{"class":104},[77,15318,1336],{"class":97},[77,15320,1376],{"class":104},[77,15322,15323,15325],{"class":79,"line":1388},[77,15324,1382],{"class":87},[77,15326,1385],{"class":104},[77,15328,15329,15331,15333],{"class":79,"line":1402},[77,15330,1392],{"class":1391},[77,15332,1336],{"class":97},[77,15334,6124],{"class":87},[77,15336,15337],{"class":79,"line":1415},[77,15338,3250],{"class":104},[77,15340,15341],{"class":79,"line":1425},[77,15342,140],{"emptyLinePlaceholder":139},[77,15344,15345,15348,15350],{"class":79,"line":1433},[77,15346,15347],{"class":104},"    slam_backend_arg ",[77,15349,1336],{"class":97},[77,15351,1376],{"class":104},[77,15353,15354,15357],{"class":79,"line":1449},[77,15355,15356],{"class":87},"        'slam_backend'",[77,15358,1385],{"class":104},[77,15360,15361,15363,15365,15368],{"class":79,"line":1463},[77,15362,1392],{"class":1391},[77,15364,1336],{"class":97},[77,15366,15367],{"class":87},"'cartographer'",[77,15369,1385],{"class":104},[77,15371,15372,15374,15376],{"class":79,"line":1475},[77,15373,1405],{"class":1391},[77,15375,1336],{"class":97},[77,15377,15378],{"class":87},"'SLAM backend: slam_toolbox or cartographer'\n",[77,15380,15381],{"class":79,"line":1480},[77,15382,3250],{"class":104},[77,15384,15385],{"class":79,"line":1491},[77,15386,140],{"emptyLinePlaceholder":139},[77,15388,15389,15391,15393,15395,15397],{"class":79,"line":1502},[77,15390,1333],{"class":104},[77,15392,1336],{"class":97},[77,15394,1339],{"class":104},[77,15396,1342],{"class":87},[77,15398,1345],{"class":104},[77,15400,15401,15404,15406,15408,15411],{"class":79,"line":1508},[77,15402,15403],{"class":104},"    slam_backend ",[77,15405,1336],{"class":97},[77,15407,1339],{"class":104},[77,15409,15410],{"class":87},"'slam_backend'",[77,15412,1345],{"class":104},[77,15414,15415],{"class":79,"line":1519},[77,15416,140],{"emptyLinePlaceholder":139},[77,15418,15419,15422,15424,15426,15428],{"class":79,"line":1525},[77,15420,15421],{"class":104},"    slam_toolbox_pkg ",[77,15423,1336],{"class":97},[77,15425,9563],{"class":104},[77,15427,1443],{"class":87},[77,15429,1345],{"class":104},[77,15431,15432,15435,15437,15439,15441],{"class":79,"line":1538},[77,15433,15434],{"class":104},"    cartographer_pkg ",[77,15436,1336],{"class":97},[77,15438,9563],{"class":104},[77,15440,3215],{"class":87},[77,15442,1345],{"class":104},[77,15444,15445],{"class":79,"line":1551},[77,15446,15447],{"class":146},"    # 从这开始修改: Jazzy auto_slam 引用 mycar_navigation2_jazzy，而不是 Humble 版本包\n",[77,15449,15450,15452,15454,15456,15459],{"class":79,"line":1563},[77,15451,14803],{"class":104},[77,15453,1336],{"class":97},[77,15455,9563],{"class":104},[77,15457,15458],{"class":87},"\"mycar_navigation2_jazzy\"",[77,15460,1345],{"class":104},[77,15462,15463],{"class":79,"line":1576},[77,15464,15465],{"class":146},"    # 从这结束\n",[77,15467,15468],{"class":79,"line":1581},[77,15469,140],{"emptyLinePlaceholder":139},[77,15471,15472,15475,15477],{"class":79,"line":1592},[77,15473,15474],{"class":104},"    slam_toolbox_launch ",[77,15476,1336],{"class":97},[77,15478,6382],{"class":104},[77,15480,15481],{"class":79,"line":1597},[77,15482,6387],{"class":104},[77,15484,15485],{"class":79,"line":1603},[77,15486,6392],{"class":104},[77,15488,15489],{"class":79,"line":1609},[77,15490,15491],{"class":104},"                slam_toolbox_pkg,\n",[77,15493,15494,15496],{"class":79,"line":1615},[77,15495,6407],{"class":87},[77,15497,1385],{"class":104},[77,15499,15500],{"class":79,"line":1620},[77,15501,15502],{"class":87},"                'online_sync_launch.py'\n",[77,15504,15505],{"class":79,"line":2003},[77,15506,6419],{"class":104},[77,15508,15509],{"class":79,"line":2014},[77,15510,6424],{"class":104},[77,15512,15513,15515,15517],{"class":79,"line":2027},[77,15514,6429],{"class":1391},[77,15516,1336],{"class":97},[77,15518,6434],{"class":104},[77,15520,15521,15523],{"class":79,"line":2041},[77,15522,6439],{"class":87},[77,15524,9766],{"class":104},[77,15526,15527],{"class":79,"line":2054},[77,15528,15529],{"class":104},"        }.items(),\n",[77,15531,15532,15535,15537],{"class":79,"line":2068},[77,15533,15534],{"class":1391},"        condition",[77,15536,1336],{"class":97},[77,15538,15539],{"class":104},"IfCondition(\n",[77,15541,15542,15545,15548,15551,15554],{"class":79,"line":2079},[77,15543,15544],{"class":104},"            PythonExpression([",[77,15546,15547],{"class":87},"\"'\"",[77,15549,15550],{"class":104},", slam_backend, ",[77,15552,15553],{"class":87},"\"' == 'slam_toolbox'\"",[77,15555,15556],{"class":104},"])\n",[77,15558,15559],{"class":79,"line":2084},[77,15560,9800],{"class":104},[77,15562,15563],{"class":79,"line":2094},[77,15564,3250],{"class":104},[77,15566,15567],{"class":79,"line":2105},[77,15568,140],{"emptyLinePlaceholder":139},[77,15570,15571,15574,15576],{"class":79,"line":2117},[77,15572,15573],{"class":104},"    cartographer_launch ",[77,15575,1336],{"class":97},[77,15577,6382],{"class":104},[77,15579,15580],{"class":79,"line":2122},[77,15581,6387],{"class":104},[77,15583,15584],{"class":79,"line":2133},[77,15585,6392],{"class":104},[77,15587,15588],{"class":79,"line":2143},[77,15589,15590],{"class":104},"                cartographer_pkg,\n",[77,15592,15593,15595],{"class":79,"line":2154},[77,15594,6407],{"class":87},[77,15596,1385],{"class":104},[77,15598,15599],{"class":79,"line":2159},[77,15600,15601],{"class":87},"                'cartographer.launch.py'\n",[77,15603,15604],{"class":79,"line":2173},[77,15605,6419],{"class":104},[77,15607,15608],{"class":79,"line":2186},[77,15609,6424],{"class":104},[77,15611,15612,15614,15616],{"class":79,"line":2191},[77,15613,6429],{"class":1391},[77,15615,1336],{"class":97},[77,15617,6434],{"class":104},[77,15619,15620,15622],{"class":79,"line":2205},[77,15621,6439],{"class":87},[77,15623,9766],{"class":104},[77,15625,15626],{"class":79,"line":2219},[77,15627,15529],{"class":104},[77,15629,15630,15632,15634],{"class":79,"line":2233},[77,15631,15534],{"class":1391},[77,15633,1336],{"class":97},[77,15635,15539],{"class":104},[77,15637,15638,15640,15642,15644,15647],{"class":79,"line":2244},[77,15639,15544],{"class":104},[77,15641,15547],{"class":87},[77,15643,15550],{"class":104},[77,15645,15646],{"class":87},"\"' == 'cartographer'\"",[77,15648,15556],{"class":104},[77,15650,15651],{"class":79,"line":2254},[77,15652,9800],{"class":104},[77,15654,15655],{"class":79,"line":6476},[77,15656,3250],{"class":104},[77,15658,15659],{"class":79,"line":6482},[77,15660,140],{"emptyLinePlaceholder":139},[77,15662,15663,15665,15667],{"class":79,"line":6488},[77,15664,14891],{"class":104},[77,15666,1336],{"class":97},[77,15668,6382],{"class":104},[77,15670,15671],{"class":79,"line":9974},[77,15672,6387],{"class":104},[77,15674,15675],{"class":79,"line":9986},[77,15676,6392],{"class":104},[77,15678,15679],{"class":79,"line":9998},[77,15680,14908],{"class":104},[77,15682,15683,15685],{"class":79,"line":10009},[77,15684,6407],{"class":87},[77,15686,1385],{"class":104},[77,15688,15689],{"class":79,"line":10020},[77,15690,14919],{"class":87},[77,15692,15693],{"class":79,"line":10029},[77,15694,6419],{"class":104},[77,15696,15697],{"class":79,"line":10035},[77,15698,6424],{"class":104},[77,15700,15701,15703,15705],{"class":79,"line":10044},[77,15702,6429],{"class":1391},[77,15704,1336],{"class":97},[77,15706,6434],{"class":104},[77,15708,15709,15711],{"class":79,"line":10049},[77,15710,6439],{"class":87},[77,15712,9766],{"class":104},[77,15714,15715],{"class":79,"line":10059},[77,15716,6450],{"class":104},[77,15718,15719],{"class":79,"line":10075},[77,15720,3250],{"class":104},[77,15722,15723],{"class":79,"line":10080},[77,15724,140],{"emptyLinePlaceholder":139},[77,15726,15727,15729,15731],{"class":79,"line":10085},[77,15728,1584],{"class":104},[77,15730,1336],{"class":97},[77,15732,1589],{"class":104},[77,15734,15735],{"class":79,"line":10090},[77,15736,15737],{"class":104},"    ld.add_action(use_sim_time_arg)\n",[77,15739,15740],{"class":79,"line":10100},[77,15741,15742],{"class":104},"    ld.add_action(slam_backend_arg)\n",[77,15744,15745],{"class":79,"line":10112},[77,15746,15747],{"class":104},"    ld.add_action(slam_toolbox_launch)\n",[77,15749,15750],{"class":79,"line":10124},[77,15751,15752],{"class":104},"    ld.add_action(cartographer_launch)\n",[77,15754,15755],{"class":79,"line":10135},[77,15756,15757],{"class":104},"    ld.add_action(nav2_launch)\n",[77,15759,15760,15762],{"class":79,"line":10146},[77,15761,1623],{"class":97},[77,15763,1626],{"class":104},[18,15765,15766],{},[21,15767,15768],{},"2.編譯",[18,15770,2311],{},[68,15772,15773],{"className":70,"code":15022,"language":72,"meta":32,"style":32},[74,15774,15775],{"__ignoreMap":32},[77,15776,15777,15779,15781,15783],{"class":79,"line":80},[77,15778,2321],{"class":83},[77,15780,2324],{"class":87},[77,15782,2327],{"class":1217},[77,15784,15035],{"class":87},[18,15786,15787],{},[21,15788,15789],{},"3.執行",[18,15791,4001],{},[68,15793,15794],{"className":70,"code":2343,"language":72,"meta":32,"style":32},[74,15795,15796,15802],{"__ignoreMap":32},[77,15797,15798,15800],{"class":79,"line":80},[77,15799,2350],{"class":1217},[77,15801,2353],{"class":87},[77,15803,15804,15806,15808,15810],{"class":79,"line":114},[77,15805,1205],{"class":83},[77,15807,2360],{"class":87},[77,15809,2363],{"class":87},[77,15811,2366],{"class":87},[18,15813,15814],{},"（2）然後在終端下進入當前工作空間，輸入如下指令啟動自主SLAM功能：",[68,15816,15818],{"className":70,"code":15817,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_navigation2 auto_slam.launch.py use_sim_time:=True slam_backend:=cartographer\n",[74,15819,15820,15826],{"__ignoreMap":32},[77,15821,15822,15824],{"class":79,"line":80},[77,15823,2350],{"class":1217},[77,15825,2353],{"class":87},[77,15827,15828,15830,15832,15834,15837,15840],{"class":79,"line":114},[77,15829,1205],{"class":83},[77,15831,2360],{"class":87},[77,15833,9365],{"class":87},[77,15835,15836],{"class":87}," auto_slam.launch.py",[77,15838,15839],{"class":87}," use_sim_time:=True",[77,15841,15842],{"class":87}," slam_backend:=cartographer\n",[18,15844,15092,15845,15096,15847,15849,15850,15852],{},[74,15846,15095],{},[74,15848,15099],{},"文件，再通過菜單欄的",[74,15851,15103],{},"設置目標點，機器人就可以自動導航至目標點，並且導航中還會實現建圖的功能。",[68,15854,15855],{"className":70,"code":15107,"language":72,"meta":32,"style":32},[74,15856,15857],{"__ignoreMap":32},[77,15858,15859,15861,15863],{"class":79,"line":80},[77,15860,15114],{"class":83},[77,15862,15117],{"class":1217},[77,15864,15120],{"class":87},[18,15866,15867],{},[30,15868],{"alt":32,"src":15869},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1770.webp",[18,15871,15872],{},[30,15873],{"alt":32,"src":15874},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1771.webp",[10,15876,15877],{"id":15877},"多車編隊",[18,15879,15880],{},"多車編隊技術通過先進的傳感器、實時數據分析和高度智能化的控制系統，使得一組車輛能夠在沒有人工干預的情況下實現協同運行，作為一種先進的智能交通系統應用，已經在多個領域展現出其巨大的潛力和廣泛的應用場景。比如：",[337,15882,15883,15886,15889],{},[18,15884,15885],{},"時間優化：多車編隊技術消除了人為操作中的誤差和延誤，降低了人力資源成本和運營風險。",[18,15887,15888],{},"空間優化：多車編隊技術可以減少車輛間的空隙，最大化道路利用率。",[18,15890,15891],{},"性能優化：密集編隊行駛減少了空氣動力學阻力，降低了能耗和燃料消耗。",[18,15893,15894],{},"總之，多車編隊技術在機器人領域有著獨特的作用和價值。本節將介紹如何在ROS2中實現多車編隊。",[15896,15897,15898],"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 pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":32,"searchDepth":114,"depth":114,"links":15900},[15901,15902,15903,15904,15905,15906],{"id":12,"depth":136,"text":12},{"id":296,"depth":136,"text":297},{"id":4069,"depth":136,"text":4069},{"id":5520,"depth":136,"text":5521},{"id":7114,"depth":136,"text":7114},{"id":15877,"depth":136,"text":15877},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","12.1",12010000,"2023-12-30","wiki/2023-12-30-ros2-tutorial","zh-tw:2023-12-30-ros2-tutorial","/zh-tw/wiki/2023-12-30-ros2-tutorial","Ros2 Tutorial","md","wiki/2023-12-30-ros2-tutorial/ch12-1-Humble版本",false,null,"zh-TW","zh-tw",{},{"title":5,"description":32},"/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-1-Humble版本","1NBVwZIFCdL7r2jAqQEaX-mv-l2BqOLdyp22epxZYEM",[15927,15933,15938,15944,15950,15956,15962,15968,15969,15975,15981,15987,15993,15999,16005,16011,16017,16023,16028,16034,16039,16045,16051,16057,16063,16069,16075,16081,16087,16093,16099,16105,16111,16117,16123,16129,16135,16141,16147,16153,16159,16165,16171,16177,16183,16189,16195,16201,16207,16213,16219,16225,16231,16237,16243,16249,16255,16261,16267,16273],{"path":15928,"stem":15929,"title":15930,"date":15910,"chapter":15931,"chapterSort":15932,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch1-ros2-jie-shao","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch1-ROS2介绍","ROS2介紹","1",1000000,{"path":15934,"stem":15935,"title":15936,"date":15910,"chapter":2035,"chapterSort":15937,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch10-Stage_Ros2仿真平台","Stage_Ros2仿真平臺",10000000,{"path":15939,"stem":15940,"title":15941,"date":15910,"chapter":15942,"chapterSort":15943,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch11-1-gazeboclassic","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch11-1-GazeboClassic","Gezebo Classic","11.1",11010000,{"path":15945,"stem":15946,"title":15947,"date":15910,"chapter":15948,"chapterSort":15949,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch11-2-ignitiongazebo","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch11-2-IgnitionGazebo","Ignition Gazebo（Gazebo Fortress）","11.2",11020000,{"path":15951,"stem":15952,"title":15953,"date":15910,"chapter":15954,"chapterSort":15955,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch11-3-gazebosim","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch11-3-GazeboSim","Gz Sim（Gazebo Harmonic）","11.3",11030000,{"path":15957,"stem":15958,"title":15959,"date":15910,"chapter":15960,"chapterSort":15961,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch11-4-Igngz2gzsim","將Ign Gazebo遷移至Gz Sim","11.4",11040000,{"path":15963,"stem":15964,"title":15965,"date":15910,"chapter":15966,"chapterSort":15967,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch11-gezebo-fang-zhen-ping-tai","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch11-Gezebo仿真平台","Gezebo仿真平臺","11",11000000,{"path":15907,"stem":15924,"title":5,"date":15910,"chapter":15908,"chapterSort":15909,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},{"path":15970,"stem":15971,"title":15972,"date":15910,"chapter":15973,"chapterSort":15974,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-2-Jazzy版本","Jazzy導航仿真","12.2",12020000,{"path":15976,"stem":15977,"title":15978,"date":15910,"chapter":15979,"chapterSort":15980,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-3-humble2jazzy","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-3-Humble2Jazzy","Humble與Jazzy導航的差異","12.3",12030000,{"path":15982,"stem":15983,"title":15984,"date":15910,"chapter":15985,"chapterSort":15986,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-机器人导航Navigation2(仿真篇)","機器人導航Navigation2(仿真篇)","12",12000000,{"path":15988,"stem":15989,"title":15990,"date":15910,"chapter":15991,"chapterSort":15992,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-1-1-boost-aiso","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-1-1-Boost.Aiso","Boost.Asio庫","13.1.1",13010100,{"path":15994,"stem":15995,"title":15996,"date":15910,"chapter":15997,"chapterSort":15998,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-1-2-ros2-serial-driver","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-1-2-ros2_serial_driver","ROS2 Serial Driver庫","13.1.2",13010200,{"path":16000,"stem":16001,"title":16002,"date":15910,"chapter":16003,"chapterSort":16004,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-1-chuan-kou-tong-xin","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-1-串口通信","UART串口通信","13.1",13010000,{"path":16006,"stem":16007,"title":16008,"date":15910,"chapter":16009,"chapterSort":16010,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-2-1-socketcan","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-2-1-socketcan","SocketCAN","13.2.1",13020100,{"path":16012,"stem":16013,"title":16014,"date":15910,"chapter":16015,"chapterSort":16016,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-2-2-ros2-socketcan","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-2-2-ros2_socketcan","ROS2_SocketCAN","13.2.2",13020200,{"path":16018,"stem":16019,"title":16020,"date":15910,"chapter":16021,"chapterSort":16022,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-2-can-tong-xin","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-2-CAN通信","CAN通信","13.2",13020000,{"path":16024,"stem":16025,"title":15990,"date":15910,"chapter":16026,"chapterSort":16027,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-3-1-boost-aiso","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-3-1-Boost.Aiso","13.3.1",13030100,{"path":16029,"stem":16030,"title":16031,"date":15910,"chapter":16032,"chapterSort":16033,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-3-tcp-tong-xin","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-3-TCP通信","TCP通信","13.3",13030000,{"path":16035,"stem":16036,"title":15990,"date":15910,"chapter":16037,"chapterSort":16038,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-4-1-boost-aiso","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-4-1-Boost.Aiso","13.4.1",13040100,{"path":16040,"stem":16041,"title":16042,"date":15910,"chapter":16043,"chapterSort":16044,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-4-udp-tong-xin","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-4-UDP通信","UDP通信","13.4",13040000,{"path":16046,"stem":16047,"title":16048,"date":15910,"chapter":16049,"chapterSort":16050,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-linux-ying-jian-tong-xin","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch13-Linux硬件通信","Linux硬件通信","13",13000000,{"path":16052,"stem":16053,"title":16054,"date":15910,"chapter":16055,"chapterSort":16056,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-1-ji-qi-ren-zu-cheng","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-1-机器人组成","機器人組成","14.1",14010000,{"path":16058,"stem":16059,"title":16060,"date":15910,"chapter":16061,"chapterSort":16062,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-2-1-yuan-cheng-kai-fa-ssh","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-2-1-远程开发SSH","遠程開發SSH","14.2.1",14020100,{"path":16064,"stem":16065,"title":16066,"date":15910,"chapter":16067,"chapterSort":16068,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-2-2-yuan-cheng-fang-wen-zhuo-mian","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-2-2-远程访问桌面","遠程訪問桌面","14.2.2",14020200,{"path":16070,"stem":16071,"title":16072,"date":15910,"chapter":16073,"chapterSort":16074,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-2-gong-kong-ji-zhi-yuan-cheng-kai-fa-huan-jing","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-2-工控机之远程开发环境","工控機之遠程開發環境","14.2",14020000,{"path":16076,"stem":16077,"title":16078,"date":15910,"chapter":16079,"chapterSort":16080,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-3-gong-kong-ji-zhi-wai-jie-usb-she-bei","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-3-工控机之外接USB设备","工控機之外接USB設備","14.3",14030000,{"path":16082,"stem":16083,"title":16084,"date":15910,"chapter":16085,"chapterSort":16086,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-4-fen-bu-shi-da-jian","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-4-分布式搭建","分佈式搭建","14.4",14040000,{"path":16088,"stem":16089,"title":16090,"date":15910,"chapter":16091,"chapterSort":16092,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-5-you-hua-ri-zhi","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-5-优化日志","優化日誌","14.5",14050000,{"path":16094,"stem":16095,"title":16096,"date":15910,"chapter":16097,"chapterSort":16098,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-1-li-cheng-ji-odom","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-1-里程计Odom","里程計Odom","14.6.1",14060100,{"path":16100,"stem":16101,"title":16102,"date":15910,"chapter":16103,"chapterSort":16104,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-2-guan-xing-ji-imu","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-2-惯性计IMU","慣性計IMU","14.6.2",14060200,{"path":16106,"stem":16107,"title":16108,"date":15910,"chapter":16109,"chapterSort":16110,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-3-ji-guang-lei-da-lidar","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-3-激光雷达LiDAR","激光雷達LiDAR","14.6.3",14060300,{"path":16112,"stem":16113,"title":16114,"date":15910,"chapter":16115,"chapterSort":16116,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-4-xiang-ji-camera","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-4-相机Camera","相機Camera","14.6.4",14060400,{"path":16118,"stem":16119,"title":16120,"date":15910,"chapter":16121,"chapterSort":16122,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-5-quan-qiu-ding-wei-gnss","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-5-全球定位GNSS","全球定位GNSS","14.6.5",14060500,{"path":16124,"stem":16125,"title":16126,"date":15910,"chapter":16127,"chapterSort":16128,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-6-shou-bing-joy","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-6-手柄joy","手柄JOY","14.6.6",14060600,{"path":16130,"stem":16131,"title":16132,"date":15910,"chapter":16133,"chapterSort":16134,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-7-jian-pan-kong-zhi-jie-dian","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-7-键盘控制节点","鍵盤控制節點","14.6.7",14060700,{"path":16136,"stem":16137,"title":16138,"date":15910,"chapter":16139,"chapterSort":16140,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-ying-jian-ping-tai","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-6-硬件平台","硬件平臺","14.6",14060000,{"path":16142,"stem":16143,"title":16144,"date":15910,"chapter":16145,"chapterSort":16146,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-7-zuo-biao-xi-yu-hua-ti-guan-xi","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-7-坐标系与话题关系","座標系與話題關係","14.7",14070000,{"path":16148,"stem":16149,"title":16150,"date":15910,"chapter":16151,"chapterSort":16152,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-1-1-lun-shi-li-cheng-ji-biao-ding","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-1-1-轮式里程计标定","輪式里程計標定","14.8.1.1",14080101,{"path":16154,"stem":16155,"title":16156,"date":15910,"chapter":16157,"chapterSort":16158,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-1-2-lun-shi-li-cheng-ji-yu-imu-rong-he","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-1-2-轮式里程计与IMU融合","輪式里程計與IMU融合","14.8.1.2",14080102,{"path":16160,"stem":16161,"title":16162,"date":15910,"chapter":16163,"chapterSort":16164,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-1-lun-shi-li-cheng-ji-biao-ding-yu-rong-he","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-1-轮式里程计标定与融合","輪式里程計標定與融合","14.8.1",14080100,{"path":16166,"stem":16167,"title":16168,"date":15910,"chapter":16169,"chapterSort":16170,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-2-ji-guang-lei-da-gong-ju","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-2-激光雷达工具","激光雷達工具","14.8.2",14080200,{"path":16172,"stem":16173,"title":16174,"date":15910,"chapter":16175,"chapterSort":16176,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-3-xiang-ji-shi-yong-jin-jie","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-3-相机使用进阶","相機使用進階","14.8.3",14080300,{"path":16178,"stem":16179,"title":16180,"date":15910,"chapter":16181,"chapterSort":16182,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-ying-jian-ping-tai-jin-jie","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-8-硬件平台进阶","硬件平臺進階","14.8",14080000,{"path":16184,"stem":16185,"title":16186,"date":15910,"chapter":16187,"chapterSort":16188,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-ji-qi-ren-ying-jian","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch14-机器人硬件","機器人硬件","14",14000000,{"path":16190,"stem":16191,"title":16192,"date":15910,"chapter":16193,"chapterSort":16194,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch15-ros2-control","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch15-ROS2_Control","ROS2_Control","15",15000000,{"path":16196,"stem":16197,"title":16198,"date":15910,"chapter":16199,"chapterSort":16200,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch16-moveit2-gong-ye-ji-qi-ren-ji-xie-bi","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch16-Moveit2工业机器人机械臂","Moveit2工業機器人機械臂","16",16000000,{"path":16202,"stem":16203,"title":16204,"date":15910,"chapter":16205,"chapterSort":16206,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch17-ji-qi-ren-dao-hang-navigation2-shi-ti-pian","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch17-机器人导航Navigation2(实体篇)","機器人導航Navigation2(實體篇)","17",17000000,{"path":16208,"stem":16209,"title":16210,"date":15910,"chapter":16211,"chapterSort":16212,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch18-microros","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch18-MicroROS","MicroROS","18",18000000,{"path":16214,"stem":16215,"title":16216,"date":15910,"chapter":16217,"chapterSort":16218,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch19-webots-fang-zhen-ping-tai","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch19-Webots仿真平台","Webots仿真平臺","19",19000000,{"path":16220,"stem":16221,"title":16222,"date":15910,"chapter":16223,"chapterSort":16224,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch2-ru-men-cao-zuo","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch2-入门操作","入門操作","2",2000000,{"path":16226,"stem":16227,"title":16228,"date":15910,"chapter":16229,"chapterSort":16230,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch20-opencv","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch20-OpenCV","OpenCV","20",20000000,{"path":16232,"stem":16233,"title":16234,"date":15910,"chapter":16235,"chapterSort":16236,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch3-gong-zuo-kong-jian-yu-gong-neng-bao","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch3-工作空间与功能包","工作空間與功能包","3",3000000,{"path":16238,"stem":16239,"title":16240,"date":15910,"chapter":16241,"chapterSort":16242,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch4-si-da-tong-xin","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch4-四大通信","四大通信","4",4000000,{"path":16244,"stem":16245,"title":16246,"date":15910,"chapter":16247,"chapterSort":16248,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch5-ros2-qi-ta-tong-xin-ji-zhi","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch5-ROS2其他通信机制","ROS2其他通信機制","5",5000000,{"path":16250,"stem":16251,"title":16252,"date":15910,"chapter":16253,"chapterSort":16254,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch6-launch","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch6-Launch","Launch","6",6000000,{"path":16256,"stem":16257,"title":16258,"date":15910,"chapter":16259,"chapterSort":16260,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch7-hui-su-rosbag2","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch7-回溯rosbag2","回溯rosbag2","7",7000000,{"path":16262,"stem":16263,"title":16264,"date":15910,"chapter":16265,"chapterSort":16266,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch8-zuo-biao-bian-huan-tf","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch8-坐标变换TF","座標變換TF","8",8000000,{"path":16268,"stem":16269,"title":16270,"date":15910,"chapter":16271,"chapterSort":16272,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":15917},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch9-ke-shi-hua-ping-tai-rviz2-yu-urdf-jian-mo-yu-yan","_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/ch9-可视化平台RVIZ2与URDF建模语言","可視化平臺RVIZ2與URDF建模語言","9",9000000,{"path":15913,"stem":16274,"title":16275,"date":15910,"chapter":15918,"chapterSort":16276,"docKey":15912,"docRoot":15913,"docTitle":15914,"isWikiDoc":139,"isWikiIndex":139},"_i18n/zh-tw/wiki/2023-12-30-ros2-tutorial/index","ROS2機器人操作系統教程",0,{"variants":16278},[16279,16282,16285,16288,16289],{"path":16280,"localeSlug":16281,"i18nKey":15916},"/en-us/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","en-us",{"path":16283,"localeSlug":16284,"i18nKey":15916},"/zh-hant/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","zh-hant",{"path":16286,"localeSlug":16287,"i18nKey":15916},"/zh-hk/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","zh-hk",{"path":15907,"localeSlug":15920,"i18nKey":15916},{"path":16290,"localeSlug":16291,"i18nKey":15916},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","zh-cn",[16280,15923,16283,15923,16286,15923,15907,15923,16290,15923],1780671893465]