[{"data":1,"prerenderedAt":16495},["ShallowReactive",2],{"wiki-page-/en-us/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben":3,"wiki-doc-items-/en-us/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben":16128,"language-switcher-data-/en-us/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben":16479,"wiki-i18n-paths-/en-us/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben":16494},{"id":4,"title":5,"body":6,"canonicalPath":16109,"chapter":16110,"chapterSort":16111,"date":16112,"description":33,"docI18nKey":16113,"docKey":16114,"docRoot":16115,"docTitle":16116,"extension":16117,"i18nKey":16118,"isBlogPost":16119,"isWikiDoc":141,"isWikiIndex":16119,"layout":16120,"legacyPath":16120,"locale":16121,"localeSlug":16122,"meta":16123,"navigation":141,"path":16109,"seo":16124,"sourcePath":16125,"sourceStem":16118,"stem":16126,"wikiDepth":82,"__hash__":16127},"content/_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch12-1-Humble版本.md","Humble Navigation Simulation",{"type":7,"value":8,"toc":16101},"minimark",[9,14,18,25,28,35,38,43,46,59,62,66,69,209,216,220,223,228,260,263,283,286,290,298,302,306,309,312,315,330,333,337,340,355,358,362,365,372,375,401,404,430,434,443,505,509,513,516,534,551,556,602,605,686,691,727,732,845,855,1211,1215,1220,1230,1256,1261,1279,1672,1694,2319,2322,2327,2334,2361,2366,2369,2388,2464,2473,2478,2481,2486,2489,2492,2495,2498,2504,2524,2529,2532,2537,2560,2564,2568,2571,2575,2607,2609,2641,2645,2648,2752,2758,2762,2772,2797,2800,2805,2838,2843,2878,2883,2963,2968,2973,2980,3003,3008,3031,3036,3059,3064,3069,3073,3077,3083,3104,3108,3119,3462,3485,4066,4068,4072,4076,4096,4100,4102,4118,4122,4125,4145,4148,4172,4175,4180,4185,4190,4194,4200,4222,4226,4231,4241,4245,4269,4273,4299,4303,4315,4352,4356,4361,4364,4369,4372,4396,4410,4415,4420,4424,4427,4440,4444,4451,4641,4645,4650,4935,4939,4950,5036,5041,5078,5082,5086,5094,5099,5122,5127,5147,5151,5155,5161,5182,5190,5207,5212,5217,5223,5243,5248,5251,5276,5282,5316,5326,5331,5341,5604,5615,5631,5636,5642,5649,5654,5659,5664,5668,5671,5677,5680,5684,5690,5695,5749,5754,5798,5803,5838,5843,5848,5906,5911,5960,5965,6003,6008,6037,6042,6097,6101,6106,6110,6134,6139,6153,6644,6664,6670,7055,7061,7066,7070,7090,7095,7097,7113,7118,7120,7140,7142,7166,7169,7186,7193,7200,7203,7209,7214,7232,7237,7242,7247,7250,7255,7258,7263,7266,7270,7273,7280,7285,7288,7294,7300,7305,7310,7313,7319,7323,7338,7342,7406,7410,7424,7430,7436,7439,7445,7448,7454,7458,7501,7506,7532,7536,7597,7601,7616,7621,7646,7651,7722,7727,7770,7775,7832,7837,8188,8192,8210,8215,8249,8254,8333,8338,8407,8412,8445,8450,8525,8530,8691,8695,8705,8709,8773,8777,8801,8806,8876,8880,8993,8997,9014,9019,9044,9049,9072,9077,9131,9135,9145,9149,9181,9185,9209,9213,9239,9243,9335,9339,9348,9352,9375,9379,9402,9406,9502,9506,9510,9514,9538,9542,9553,9558,11128,11131,11136,11149,11157,11655,11662,12146,12153,12490,12495,12502,13087,13092,13099,14170,14173,14184,14190,14193,14208,14213,14220,14447,14452,14459,14547,14552,14559,14740,14745,14752,14849,14854,14860,15177,15182,15186,15208,15213,15215,15231,15236,15238,15258,15261,15285,15300,15316,15345,15353,15356,15364,15367,15370,15375,15380,15384,15395,15400,15412,15965,15970,15972,15986,15991,15993,16013,16016,16044,16054,16066,16071,16076,16080,16083,16094,16097],[10,11,13],"h3",{"id":12},"navigation-overview","Navigation Overview",[15,16,13],"h4",{"id":17},"navigation-overview-1",[19,20,21],"p",{},[22,23,24],"strong",{},"Concept",[19,26,27],{},"Robot navigation refers to the ability of a robot to autonomously move from one location to another without human intervention. In ROS2, the most commonly used framework for implementing navigation is Nav2.",[19,29,30],{},[31,32],"img",{"alt":33,"src":34},"","https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1745.webp",[19,36,37],{},"Nav2, also known as Navigation2, is built upon ROS's navigation stack. It adopts the same cutting-edge technology used in autonomous vehicles, optimized and adapted specifically for the navigation needs of mobile robots and ground-based robots. This project empowers mobile robots to traverse complex environments, enabling them to perform a wide range of user-defined application tasks, and is compatible with virtually any type of robot dynamics. Nav2 not only supports robot movement from point A to point B but also allows for setting intermediate poses and executing various tasks such as object tracking and full-coverage navigation. As a production-grade, high-quality navigation framework trusted by over 100 companies worldwide, Nav2 has earned widespread acclaim for its exceptional reliability and stability.",[19,39,40],{},[22,41,42],{},"Purpose",[19,44,45],{},"Nav2 plays a significant role in the field of robot navigation, mainly reflected in the following aspects.",[47,48,49,53,56],"ul",{},[50,51,52],"li",{},"Nav2 offers a diverse range of navigation capabilities, supporting multiple sensor inputs such as LiDAR and cameras to obtain real-time environmental information, enabling intelligent path planning and precise motion control. It supports various navigation modes to meet different application needs and features strong extensibility, allowing seamless integration with ROS 2 components.",[50,54,55],{},"Nav2 delivers outstanding performance, utilizing efficient algorithms and data processing techniques to ensure the robot responds quickly and stably during navigation.",[50,57,58],{},"In terms of safety, Nav2 uses multiple obstacle avoidance algorithms and parameter tuning functions, defines safety zones, and provides diagnostic monitoring to ensure safe robot navigation.",[19,60,61],{},"In short, Nav2 provides powerful support for robot navigation and applications. Whether it's automated production in the industrial sector or intelligent robots in the service industry, Nav2 plays a key role in enhancing a robot's autonomy and level of intelligence.",[15,63,65],{"id":64},"navigation-installation","Navigation Installation",[19,67,68],{},"Using Ubuntu's package manager, you can install Nav2 in binary form with the following command:",[70,71,75],"pre",{"className":72,"code":73,"language":74,"meta":33,"style":33},"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",[76,77,78,114,136,143,150,162,174,179,185,197],"code",{"__ignoreMap":33},[79,80,83,87,91,94,97,101,104,108,111],"span",{"class":81,"line":82},"line",1,[79,84,86],{"class":85},"sScJk","sudo",[79,88,90],{"class":89},"sZZnC"," apt",[79,92,93],{"class":89}," install",[79,95,96],{"class":89}," ros-",[79,98,100],{"class":99},"szBVR","\u003C",[79,102,103],{"class":89},"ros2-distr",[79,105,107],{"class":106},"sVt8B","o",[79,109,110],{"class":99},">",[79,112,113],{"class":89},"-navigation2\n",[79,115,117,119,121,123,125,127,129,131,133],{"class":81,"line":116},2,[79,118,86],{"class":85},[79,120,90],{"class":89},[79,122,93],{"class":89},[79,124,96],{"class":89},[79,126,100],{"class":99},[79,128,103],{"class":89},[79,130,107],{"class":106},[79,132,110],{"class":99},[79,134,135],{"class":89},"-nav2-bringup\n",[79,137,139],{"class":81,"line":138},3,[79,140,142],{"emptyLinePlaceholder":141},true,"\n",[79,144,146],{"class":81,"line":145},4,[79,147,149],{"class":148},"sJ8bj","# Humble\n",[79,151,153,155,157,159],{"class":81,"line":152},5,[79,154,86],{"class":85},[79,156,90],{"class":89},[79,158,93],{"class":89},[79,160,161],{"class":89}," ros-humble-navigation2\n",[79,163,165,167,169,171],{"class":81,"line":164},6,[79,166,86],{"class":85},[79,168,90],{"class":89},[79,170,93],{"class":89},[79,172,173],{"class":89}," ros-humble-nav2-bringup\n",[79,175,177],{"class":81,"line":176},7,[79,178,142],{"emptyLinePlaceholder":141},[79,180,182],{"class":81,"line":181},8,[79,183,184],{"class":148},"# Jazzy\n",[79,186,188,190,192,194],{"class":81,"line":187},9,[79,189,86],{"class":85},[79,191,90],{"class":89},[79,193,93],{"class":89},[79,195,196],{"class":89}," ros-jazzy-navigation2\n",[79,198,200,202,204,206],{"class":81,"line":199},10,[79,201,86],{"class":85},[79,203,90],{"class":89},[79,205,93],{"class":89},[79,207,208],{"class":89}," ros-jazzy-nav2-bringup\n",[19,210,211,212,215],{},"Replace ",[76,213,214],{},"\u003Cros2-distro>"," in the instructions with the currently used ROS2 version.",[15,217,219],{"id":218},"navigation-conditions","Navigation Conditions",[19,221,222],{},"To deeply learn Nav2, you need to understand the basics of ROS2 robots and have a simulation or physical robot as a practice environment.",[19,224,225],{},[22,226,227],{},"ROS2 Basics",[47,229,230,236,242,248,254],{},[50,231,232,235],{},[22,233,234],{},"ROS2 Communication",": Understand basic concepts in ROS2 such as Nodes, Topics, Services, and Actions, and how to achieve communication between nodes through these mechanisms.",[50,237,238,241],{},[22,239,240],{},"Lifecycle Management",": Familiarize yourself with lifecycle nodes in ROS2, understanding the state transition process of nodes including startup, configuration, activation, deactivation, and cleanup. This is crucial for managing complex ROS2 systems.",[50,243,244,247],{},[22,245,246],{},"rviz2:"," Proficient in using rviz2 for visual debugging, including how to set different display types (such as point clouds, maps, paths, etc.), and how to interact with ROS2 nodes through rviz2 (such as setting navigation goals, observing robot status, etc.).",[50,249,250,253],{},[22,251,252],{},"URDF:"," Understand URDF (Unified Robot Description Format) files, which are an XML format used in ROS to describe robot models. Become familiar with how to write and modify URDF files to accurately represent robot structures in simulation or real-world environments.",[50,255,256,259],{},[22,257,258],{},"TF Coordinate Transformations:"," Master the use of the TF (Transform) library and understand the importance of coordinate transformations in robot navigation. Learn how to set up and query transformation relationships between different coordinate systems to ensure the robot can accurately localize itself and its surrounding environment.",[19,261,262],{},"Practical environment",[47,264,265,271,277],{},[50,266,267,270],{},[22,268,269],{},"Simulation Environment:"," Set up a ROS2-compatible simulation environment, and configure the corresponding robot model, sensors (such as LiDAR, camera, etc.), and simulation world. Ensure that the robot in the simulation environment can receive velocity commands, feedback odometry messages, publish sensor data, and TF coordinate transforms.",[50,272,273,276],{},[22,274,275],{},"Physical Robot:"," If conditions permit, prepare a physical robot. This robot should have similar capabilities to those in the simulation environment, meaning it can receive velocity commands, provide odometry feedback, publish sensor data such as LiDAR scans, and publish TF coordinate transforms. Additionally, ensure the physical robot has the ROS2 system installed and that the corresponding drivers and algorithm libraries are configured.",[50,278,279,282],{},[22,280,281],{},"Nav2 Package:"," Install and configure the Nav2 package along with its dependencies. Nav2 is a comprehensive software package in ROS2 for robot navigation, which includes multiple functional modules such as path planning, obstacle avoidance, and local and global map maintenance. Ensure that the Nav2 package is compatible with your ROS2 version and has been properly configured as needed.",[19,284,285],{},"By mastering the foundational knowledge above and preparing the practice environment, you will be better equipped to learn and apply Nav2 for developing and debugging robot navigation tasks.",[15,287,289],{"id":288},"navigation-parameter-reference","Navigation Parameter Reference",[19,291,292],{},[293,294,295],"a",{"href":295,"rel":296},"https://docs.nav2.org/configuration/index.html",[297],"nofollow",[10,299,301],{"id":300},"slam-localization-and-mapping","SLAM localization and mapping",[19,303,304],{},[22,305,24],{},[19,307,308],{},"SLAM (Simultaneous Localization and Mapping) is a key technology in robotics and autonomous navigation, enabling robots to map an unknown environment.",[19,310,311],{},"Performing SLAM under ROS 2 typically involves using SLAM-related software packages specifically developed for ROS 2. These packages leverage ROS 2's communication framework (such as topics, services, and actions) to process incoming sensor data, including LiDAR, cameras, inertial measurement units, and more.",[19,313,314],{},"Below are some common SLAM systems used in ROS2:",[316,317,318,324],"ol",{},[50,319,320,323],{},[22,321,322],{},"SLAM Toolbox",": SLAM Toolbox is a widely used SLAM solution in ROS 2, maintained by Steve Macenski. It was developed to replace the well-known gmapping and Cartographer SLAM packages from the original ROS, providing a variety of features in the field of 2D laser SLAM.",[50,325,326,329],{},[22,327,328],{},"Cartographer for ROS 2",": Cartographer is a 2D and 3D SLAM library developed by Google. Although it was originally developed for ROS, an adapted version has been created for ROS 2, enabling its use within the ROS 2 ecosystem.",[19,331,332],{},"To start a SLAM project in ROS 2, you'll also need specific sensors (such as a LiDAR or camera), sufficient computing power to run SLAM algorithms, and familiarity with ROS 2 concepts like nodes, topics, services, actions, and parameters to enable effective data processing and communication. As the project evolves, you may also need to consider advanced features such as dynamic reconfiguration, 3D mapping, and path planning.",[19,334,335],{},[22,336,42],{},[19,338,339],{},"First, it must be clarified that SLAM and Nav2 do not have a direct dependency relationship—they are two relatively independent technical frameworks. However, in practical applications, the two exhibit a close connection and complementarity.",[341,342,343,349],"blockquote",{},[19,344,345,348],{},[22,346,347],{},"Independence:"," SLAM can independently construct an environmental map without the involvement of Nav2. It relies on sensor data to perceive the environment and uses algorithms to estimate the robot's position and pose, thereby building a map of the surroundings. At the same time, Nav2 also possesses autonomous navigation capabilities. Even without a SLAM map as input, it can rely on environmental information from other sources to navigate.",[19,350,351,354],{},[22,352,353],{},"Complementarity:"," Although the two are technically independent of each other, their combination brings significant advantages. Nav2 can leverage the precise maps created by SLAM for efficient path planning, ensuring the robot can smoothly navigate to its target location. Meanwhile, SLAM can utilize Nav2's navigation control functions to collect environmental information in real time as the robot moves, thereby further improving the efficiency and accuracy of map building.",[19,356,357],{},"Therefore, although SLAM and Nav2 are technically independent of each other, their complementarity in building a complete robot navigation system enables robots to achieve more autonomous and precise mapping or navigation in complex environments.",[15,359,361],{"id":360},"overview-of-slam_toolbox","Overview of slam_toolbox",[19,363,364],{},"concept",[19,366,367,368,371],{},"SLAM Toolbox is an open-source software toolkit for building ",[22,369,370],{},"2D maps",", designed to provide researchers and developers with a platform for quickly constructing and implementing SLAM algorithms. It integrates a variety of commonly used SLAM algorithms, offers rich data processing and filtering functions, as well as tools for map building and environmental modeling.",[19,373,374],{},"Function",[47,376,377,383,389,395],{},[50,378,379,382],{},[22,380,381],{},"Algorithm Integration"," includes SLAM algorithms based on Kalman filters and particle filters, as well as SLAM algorithms based on graph optimization.",[50,384,385,388],{},[22,386,387],{},"Data Processing"," provides data fusion, data preprocessing, and anomaly detection capabilities, supporting the processing of data from multiple sensors such as LiDAR, cameras, and IMUs.",[50,390,391,394],{},[22,392,393],{},"Map Building"," Constructs an accurate map using sensor data and robot motion information, then updates and optimizes it.",[50,396,397,400],{},[22,398,399],{},"Modular design"," supports users inserting their own algorithms or replacing existing modules to achieve highly customized SLAM solutions.",[19,402,403],{},"Advantages",[47,405,406,412,418,424],{},[50,407,408,411],{},[22,409,410],{},"Open-source and Flexibility"," As open-source software, SLAM Toolbox provides source code and documentation, allowing users to freely modify and extend the algorithms.",[50,413,414,417],{},[22,415,416],{},"Multi-Sensor Support"," Supports data from various sensors such as LiDAR, cameras, and IMUs, adapting to the needs of different application scenarios.",[50,419,420,423],{},[22,421,422],{},"Efficiency"," Leverages modern C++ features to optimize performance, ensuring efficient operation even on resource-constrained hardware.",[50,425,426,429],{},[22,427,428],{},"Broad Application Prospects"," Suitable for multiple fields including academic research, drone navigation, autonomous vehicles, indoor robots, and industrial automation.",[15,431,433],{"id":432},"slam_toolbox-installation","slam_toolbox installation",[19,435,436,437,442],{},"Using the Advanced Packaging Tool (",[293,438,441],{"href":439,"rel":440},"https://c6.y.qq.com/base/fcgi-bin/u?__=bqEbdGxIB7mM",[297],"APT",") package manager, you can install slam_toolbox in binary form with the following command:",[70,444,446],{"className":72,"code":445,"language":74,"meta":33,"style":33},"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",[76,447,448,469,473,478,489,494],{"__ignoreMap":33},[79,449,450,452,454,456,458,460,462,464,466],{"class":81,"line":82},[79,451,86],{"class":85},[79,453,90],{"class":89},[79,455,93],{"class":89},[79,457,96],{"class":89},[79,459,100],{"class":99},[79,461,103],{"class":89},[79,463,107],{"class":106},[79,465,110],{"class":99},[79,467,468],{"class":89},"-slam-toolbox\n",[79,470,471],{"class":81,"line":116},[79,472,142],{"emptyLinePlaceholder":141},[79,474,475],{"class":81,"line":138},[79,476,477],{"class":148},"#humble\n",[79,479,480,482,484,486],{"class":81,"line":145},[79,481,86],{"class":85},[79,483,90],{"class":89},[79,485,93],{"class":89},[79,487,488],{"class":89}," ros-humble-slam-toolbox\n",[79,490,491],{"class":81,"line":152},[79,492,493],{"class":148},"#jazzy\n",[79,495,496,498,500,502],{"class":81,"line":164},[79,497,86],{"class":85},[79,499,90],{"class":89},[79,501,93],{"class":89},[79,503,504],{"class":89}," ros-jazzy-slam-toolbox\n",[19,506,211,507,215],{},[76,508,214],{},[15,510,512],{"id":511},"slam_toolbox-node-description","slam_toolbox node description",[19,514,515],{},"In slam_toolbox, two commonly used nodes are: sync_slam_toolbox_node and async_slam_toolbox_node.",[341,517,518,523,526,531],{},[19,519,520],{},[22,521,522],{},"sync_slam_toolbox_node：",[19,524,525],{},"This is a synchronization node that waits for all sensor data to arrive before processing, ensuring data integrity and consistency, thereby improving the accuracy of localization and mapping. However, synchronous processing may introduce latency, making it more suitable for scenarios that prioritize data consistency and accuracy over real-time performance.",[19,527,528],{},[22,529,530],{},"async_slam_toolbox_node：",[19,532,533],{},"Unlike a synchronous node, this is an asynchronous node that can process received data immediately, reducing latency and improving response speed. However, asynchronous processing may lead to incomplete data synchronization, and the localization and mapping results may be less accurate than those from a synchronous approach. Therefore, it is better suited for scenarios that demand high real-time performance but have relatively lower requirements for data consistency and accuracy.",[19,535,536,537,540,541,544,545,547,548,550],{},"When choosing between ",[76,538,539],{},"sync_slam_toolbox_node"," and ",[76,542,543],{},"async_slam_toolbox_node",", you need to weigh the application requirements and environment. If real-time performance is critical and some localization or mapping error is acceptable, choose ",[76,546,543],{},". If data consistency and accuracy are more important, and real-time performance is not the primary concern, then choose ",[76,549,539],{},". Additionally, the main difference between the two lies in the data processing method, while the topics published, topics subscribed to, services offered, and parameters used by both nodes are the same.",[316,552,553],{},[50,554,555],{},"Subscribed topics",[557,558,559,576],"table",{},[560,561,562],"thead",{},[563,564,565,570,573],"tr",{},[566,567,569],"th",{"align":568},"left","Topic",[566,571,572],{"align":568},"type",[566,574,575],{"align":568},"description",[577,578,579,591],"tbody",{},[563,580,581,585,588],{},[582,583,584],"td",{"align":568},"/scan",[582,586,587],{"align":568},"sensor_msgs/msg/LaserScan",[582,589,590],{"align":568},"Scan data from LiDAR input",[563,592,593,596,599],{},[582,594,595],{"align":568},"/tf",[582,597,598],{"align":568},"tf2_msgs/msg/TFMessage",[582,600,601],{"align":568},"The configured transformation from odom_frame to base_frame",[19,603,604],{},"Although not subscribing to /odom, it is necessary to publish /odom in order to change the coordinates.",[557,606,607,620],{},[560,608,609],{},[563,610,611,614,617],{},[566,612,613],{"align":568},"Features",[566,615,616],{"align":568},"slam_toolbox",[566,618,619],{"align":568},"hector_slam",[577,621,622,633,644,655,666,675],{},[563,623,624,627,630],{},[582,625,626],{"align":568},"Map accuracy",[582,628,629],{"align":568},"High",[582,631,632],{"align":568},"In",[563,634,635,638,641],{},[582,636,637],{"align":568},"Real-time performance",[582,639,640],{"align":568},"Good, but relies on optimization (loop closure detection).",[582,642,643],{"align":568},"Extremely high",[563,645,646,649,652],{},[582,647,648],{"align":568},"Dependent data",[582,650,651],{"align":568},"LiDAR, TF tree, odometry",[582,653,654],{"align":568},"LiDAR (optional IMU)",[563,656,657,660,663],{},[582,658,659],{"align":568},"Loop closure detection",[582,661,662],{"align":568},"Supported",[582,664,665],{"align":568},"Not supported",[563,667,668,671,673],{},[582,669,670],{"align":568},"Long-term operation",[582,672,662],{"align":568},[582,674,665],{"align":568},[563,676,677,680,683],{},[582,678,679],{"align":568},"Applicable Scenarios",[582,681,682],{"align":568},"Dynamic navigation, complex environments",[582,684,685],{"align":568},"Simple environment, or when odometry is unavailable.",[316,687,688],{"start":116},[50,689,690],{},"Published topics",[557,692,693,703],{},[560,694,695],{},[563,696,697,699,701],{},[566,698,569],{"align":568},[566,700,572],{"align":568},[566,702,575],{"align":568},[577,704,705,716],{},[563,706,707,710,713],{},[582,708,709],{"align":568},"/map",[582,711,712],{"align":568},"nav_msgs/msg/OccupancyGrid",[582,714,715],{"align":568},"The pose graph is represented as an occupancy grid at a specific update frequency (map_update_interval).",[563,717,718,721,724],{},[582,719,720],{"align":568},"/pose",[582,722,723],{"align":568},"geometry_msgs/msg/PoseWithCovarianceStamped",[582,725,726],{"align":568},"The pose of base_frame in the configured map_frame and the covariance calculated from scan matching.",[316,728,729],{"start":138},[50,730,731],{},"Published services",[557,733,734,744],{},[560,735,736],{},[563,737,738,740,742],{},[566,739,569],{"align":568},[566,741,572],{"align":568},[566,743,575],{"align":568},[577,745,746,757,768,779,790,801,812,823,834],{},[563,747,748,751,754],{},[582,749,750],{"align":568},"/slam_toolbox/clear_changes",[582,752,753],{"align":568},"slam_toolbox/srv/Clear",[582,755,756],{"align":568},"Clear all pending changes to the manual pose graph operation.",[563,758,759,762,765],{},[582,760,761],{"align":568},"/slam_toolbox/deserialize_map",[582,763,764],{"align":568},"slam_toolbox/srv/DeserializePoseGraph",[582,766,767],{"align":568},"Load the saved serialized pose graph file from disk.",[563,769,770,773,776],{},[582,771,772],{"align":568},"/slam_toolbox/dynamic_map",[582,774,775],{"align":568},"nav_msgs/OccupancyGrid",[582,777,778],{"align":568},"Request the current state of the pose graph as an occupancy grid.",[563,780,781,784,787],{},[582,782,783],{"align":568},"/slam_toolbox/manual_loop_closure",[582,785,786],{"align":568},"slam_toolbox/srv/LoopClosure",[582,788,789],{"align":568},"Request to manually change the pose graph.",[563,791,792,795,798],{},[582,793,794],{"align":568},"/slam_toolbox/pause_new_measurements",[582,796,797],{"align":568},"slam_toolbox/srv/Pause",[582,799,800],{"align":568},"Pause processing of newly incoming laser scans.",[563,802,803,806,809],{},[582,804,805],{"align":568},"/slam_toolbox/save_map",[582,807,808],{"align":568},"slam_toolbox/srv/SaveMap",[582,810,811],{"align":568},"Save the map image file that can be used to display AMCL localization.",[563,813,814,817,820],{},[582,815,816],{"align":568},"/slam_toolbox/serialize_map",[582,818,819],{"align":568},"slam_toolbox/srv/SerializePoseGraph",[582,821,822],{"align":568},"Save the map pose graph and data, which can be used for continued mapping, slam_toolbox localization, offline operations, etc.",[563,824,825,828,831],{},[582,826,827],{"align":568},"/slam_toolbox/toggle_interactive_mode",[582,829,830],{"align":568},"slam_toolbox/srv/ToggleInteractive",[582,832,833],{"align":568},"Switch between interactive and non-interactive modes, publishing the node's interactive markers and their positions for updates within the application.",[563,835,836,839,842],{},[582,837,838],{"align":568},"/slam_toolbox/reset",[582,840,841],{"align":568},"slam_toolbox/srv/Reset",[582,843,844],{"align":568},"Reset the current map back to its initial state.",[316,846,847],{"start":145},[50,848,849,850],{},"parameter",[316,851,852],{},[50,853,854],{},"Solver parameters",[47,856,857,863,869,875,881,887,893,904,910,916,922,935,941,947,953,959,965,971,977,983,989,995,1001,1007,1013,1019,1022,1028,1034,1040,1051,1057,1063,1069,1075,1081,1087,1093,1099,1105,1111,1117,1123,1129,1135,1141,1147,1150,1156,1162,1168,1174,1180,1186,1192,1198,1205],{},[50,858,859,862],{},[22,860,861],{},"solver_plugin"," The nonlinear solver type used for the Karto scan solver. Options: solver_plugins::CeresSolver, solver_plugins::SpaSolver, solver_plugins::G2oSolver. Default: solver_plugins::CeresSolver.",[50,864,865,868],{},[22,866,867],{},"ceres_linear_solver"," The linear solver used by Ceres. Options: SPARSE_NORMAL_CHOLESKY, SPARSE_SCHUR, ITERATIVE_SCHUR, CGNR. Default is SPARSE_NORMAL_CHOLESKY.",[50,870,871,874],{},[22,872,873],{},"ceres_preconditioner"," The preconditioner used with this solver. Options: JACOBI, IDENTITY (none), SCHUR_JACOBI. Default is JACOBI.",[50,876,877,880],{},[22,878,879],{},"ceres_trust_strategy"," Trust region strategy. Line search strategies are not exposed because they perform poorly for this use case. Options: LEVENBERG_MARQUARDT, DOGLEG. Default: LEVENBERG_MARQUARDT.",[50,882,883,886],{},[22,884,885],{},"ceres_dogleg_type"," If the trust strategy is DOGLEG, use the dogleg strategy. Options: TRADITIONAL_DOGLEG, SUBSPACE_DOGLEG. Default: TRADITIONAL_DOGLEG.",[50,888,889,892],{},[22,890,891],{},"ceres_loss_function"," Loss function type for rejecting outliers. None is equivalent to squared loss. Options: None, HuberLoss, CauchyLoss. Default: None.",[50,894,895,898,899],{},[22,896,897],{},"mode"," \"Mapping\" or \"Localization\" mode, used for performance optimization in Ceres problem creation.",[47,900,901],{},[50,902,903],{},"Toolbox parameters",[50,905,906,909],{},[22,907,908],{},"odom_frame"," odometry coordinate frame",[50,911,912,915],{},[22,913,914],{},"map_frame"," Map coordinate system",[50,917,918,921],{},[22,919,920],{},"base_frame"," Base coordinate system",[50,923,924,927,928,930,931,934],{},[22,925,926],{},"scan_topic"," Scans the topic name. Note that it is ",[76,929,584],{},", not ",[76,932,933],{},"scan",".",[50,936,937,940],{},[22,938,939],{},"scan_queue_size"," The queue length for scan messages. In asynchronous mode, this should always be set to 1.",[50,942,943,946],{},[22,944,945],{},"use_map_saver"," instantiates the map service program and subscribes to the map topic on its own.",[50,948,949,952],{},[22,950,951],{},"map_file_name"," The name of the pose graph file loaded at startup (if available).",[50,954,955,958],{},[22,956,957],{},"map_start_pose"," The pose when starting mapping/localization (if available)",[50,960,961,964],{},[22,962,963],{},"map_start_at_dock"," Loads the pose graph at the dock (first node) on startup (if available). If both pose and dock are set, pose takes precedence.",[50,966,967,970],{},[22,968,969],{},"debug_logging"," Change logs for debugging",[50,972,973,976],{},[22,974,975],{},"throttle_scans"," The number of scans limited in synchronous mode",[50,978,979,982],{},[22,980,981],{},"transform_publish_period"," The publishing period for odometry (odom) transforms. A value of 0 will not publish transforms.",[50,984,985,988],{},[22,986,987],{},"map_update_interval"," The time interval for updating the 2D occupancy map.",[50,990,991,994],{},[22,992,993],{},"enable_interactive_mode"," controls whether interactive mode is enabled. Interactive mode retains a cache of laser scans mapped to their IDs for visualization during interactive sessions. As a result, the process's memory usage will increase. This feature can be manually disabled in localization and long-term mapping modes, as they increase memory utilization over time. It is effective for both mapping and continuous mapping modes.",[50,996,997,1000],{},[22,998,999],{},"position_covariance_scale"," The amount by which to scale the position covariance when publishing a pose from scan matching. This can be used to adjust the influence of the pose in downstream localization filters. The covariance represents the uncertainty of the measurement, so increasing the covariance will reduce the impact of the pose on the downstream filter. Default value: 1.0",[50,1002,1003,1006],{},[22,1004,1005],{},"yaw_covariance_scale","  The amount by which to scale the yaw covariance when publishing poses from scan matching. See the description of position_covariance_scale. Default value: 1.0",[50,1008,1009,1012],{},[22,1010,1011],{},"resolution"," The resolution of the generated 2D occupancy grid map",[50,1014,1015,1018],{},[22,1016,1017],{},"max_laser_range"," Maximum laser range used for 2D occupancy map rasterization",[50,1020,1021],{},"The minimum time interval between scans processed in synchronous mode.",[50,1023,1024,1027],{},[22,1025,1026],{},"transform_timeout"," Lookup transform TF timeout limit",[50,1029,1030,1033],{},[22,1031,1032],{},"tf_buffer_duration"," The duration for which TF messages are stored for querying. If running offline at a multiple speed in synchronous mode, set this higher.",[50,1035,1036,1039],{},[22,1037,1038],{},"stack_size_to_use"," The number of bytes to reset the stack size to, in order to enable file serialization/deserialization. The free default value is 40,000,000, but less is better.",[50,1041,1042,1045,1046],{},[22,1043,1044],{},"minimum_travel_distance"," Minimum travel distance before processing a new scan",[47,1047,1048],{},[50,1049,1050],{},"Matcher parameters",[50,1052,1053,1056],{},[22,1054,1055],{},"use_scan_matching"," – whether to use scan matching to optimize odometry poses.",[50,1058,1059,1062],{},[22,1060,1061],{},"use_scan_barycenter"," Whether to use the center of gravity or scan pose",[50,1064,1065,1068],{},[22,1066,1067],{},"minimum_travel_heading"," Minimum reasonable heading change for an update",[50,1070,1071,1074],{},[22,1072,1073],{},"scan_buffer_size"," The number of scans buffered into the chain, also used as the number of scans in the loop buffer for localization mode.",[50,1076,1077,1080],{},[22,1078,1079],{},"scan_buffer_maximum_scan_distance"," The maximum distance from a previous pose at which to remove previous scans from the buffer.",[50,1082,1083,1086],{},[22,1084,1085],{},"link_match_minimum_response_fine"," Threshold for fine-resolution link matching algorithm response",[50,1088,1089,1092],{},[22,1090,1091],{},"link_scan_maximum_distance"," Maximum distance between valid link scans",[50,1094,1095,1098],{},[22,1096,1097],{},"Loop_search_maximum_distance"," Maximum threshold for scan distance considered during loop closure",[50,1100,1101,1104],{},[22,1102,1103],{},"do_loop_close"," Whether to perform loop closure (if unsure, the answer is \"true\")",[50,1106,1107,1110],{},[22,1108,1109],{},"Loop_match_minimum_chain_size"," Minimum chain length for finding closed-loop scans",[50,1112,1113,1116],{},[22,1114,1115],{},"Loop_match_maximum_variance_coarse"," The threshold variance passed to refinement during the coarse search.",[50,1118,1119,1122],{},[22,1120,1121],{},"Loop_match_minimum_response_coarse"," The threshold response of the loop closure algorithm in the coarse search to be passed to the refinement.",[50,1124,1125,1128],{},[22,1126,1127],{},"Loop_match_minimum_response_fine"," The threshold response of the loop closure algorithm during fine search is passed to the refinement.",[50,1130,1131,1134],{},[22,1132,1133],{},"correlation_search_space_dimension"," Search grid size for scan correlation",[50,1136,1137,1140],{},[22,1138,1139],{},"correlation_search_space_resolution","  The search grid resolution for scan correlation.",[50,1142,1143,1146],{},[22,1144,1145],{},"correlation_search_space_smear_deviation","   The multimodal smear amount used to smooth the response.",[50,1148,1149],{},"The size of the search grid for the loop closure algorithm.",[50,1151,1152,1155],{},[22,1153,1154],{},"loop_search_space_resolution"," Search grid resolution for loop closure",[50,1157,1158,1161],{},[22,1159,1160],{},"loop_search_space_smear_deviation"," — multimodal smear amount for smoothing responses",[50,1163,1164,1167],{},[22,1165,1166],{},"distance_variance_penalty"," A penalty applied to matching scans, as it differs from the odometry pose.",[50,1169,1170,1173],{},[22,1171,1172],{},"angle_variance_penalty"," A penalty applied to matching scans when they deviate from the odometry pose.",[50,1175,1176,1179],{},[22,1177,1178],{},"fine_search_angle_offset"," Used to test the angular range for fine scan matching.",[50,1181,1182,1185],{},[22,1183,1184],{},"rough_search_angle_offset"," is used to test the angular range for coarse scan matching.",[50,1187,1188,1191],{},[22,1189,1190],{},"coarse_angle_resolution"," The angular resolution within the offset range tested during scan matching.",[50,1193,1194,1197],{},[22,1195,1196],{},"minimum_angle_penalty"," The minimum penalty angle that ensures dimensions do not expand.",[50,1199,1200,1201,1204],{},"The ",[22,1202,1203],{},"minimum_distance_penalty"," scan ensures the minimum penalty that prevents sizes from exploding.",[50,1206,1207,1210],{},[22,1208,1209],{},"use_response_expansion"," If no feasible match is found, whether to automatically increase the search grid size.",[15,1212,1214],{"id":1213},"basic-usage-of-slam_toolbox","Basic usage of slam_toolbox",[316,1216,1217],{},[50,1218,1219],{},"Preparation Work",[19,1221,1222,1223,1226,1227,1229],{},"In the ",[76,1224,1225],{},"src"," directory, first run the following command to create a package in the workspace's ",[76,1228,1225],{}," directory:",[70,1231,1233],{"className":72,"code":1232,"language":74,"meta":33,"style":33},"ros2 pkg create mycar_slam_slam_toolbox --dependencies slam_toolbox\n",[76,1234,1235],{"__ignoreMap":33},[79,1236,1237,1240,1243,1246,1249,1253],{"class":81,"line":82},[79,1238,1239],{"class":85},"ros2",[79,1241,1242],{"class":89}," pkg",[79,1244,1245],{"class":89}," create",[79,1247,1248],{"class":89}," mycar_slam_slam_toolbox",[79,1250,1252],{"class":1251},"sj4cs"," --dependencies",[79,1254,1255],{"class":89}," slam_toolbox\n",[316,1257,1258],{"start":116},[50,1259,1260],{},"Write launch files and parameter files",[19,1262,1263,1264,1267,1268,1271,1272,1274,1275,1278],{},"Under the function package, create a new ",[76,1265,1266],{},"launch"," directory and ",[76,1269,1270],{},"params"," directory. Inside the ",[76,1273,1266],{}," directory, create a new ",[76,1276,1277],{},"online_sync_launch.py"," file and enter the following content:",[70,1280,1284],{"className":1281,"code":1282,"language":1283,"meta":33,"style":33},"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",[76,1285,1286,1294,1298,1311,1323,1335,1347,1359,1363,1374,1391,1406,1411,1422,1431,1445,1458,1468,1476,1492,1506,1518,1523,1534,1545,1551,1562,1568,1581,1594,1606,1619,1624,1635,1640,1646,1652,1658,1663],{"__ignoreMap":33},[79,1287,1288,1291],{"class":81,"line":82},[79,1289,1290],{"class":99},"import",[79,1292,1293],{"class":106}," os\n",[79,1295,1296],{"class":81,"line":116},[79,1297,142],{"emptyLinePlaceholder":141},[79,1299,1300,1303,1306,1308],{"class":81,"line":138},[79,1301,1302],{"class":99},"from",[79,1304,1305],{"class":106}," launch ",[79,1307,1290],{"class":99},[79,1309,1310],{"class":106}," LaunchDescription\n",[79,1312,1313,1315,1318,1320],{"class":81,"line":145},[79,1314,1302],{"class":99},[79,1316,1317],{"class":106}," launch.actions ",[79,1319,1290],{"class":99},[79,1321,1322],{"class":106}," DeclareLaunchArgument\n",[79,1324,1325,1327,1330,1332],{"class":81,"line":152},[79,1326,1302],{"class":99},[79,1328,1329],{"class":106}," launch.substitutions ",[79,1331,1290],{"class":99},[79,1333,1334],{"class":106}," LaunchConfiguration\n",[79,1336,1337,1339,1342,1344],{"class":81,"line":164},[79,1338,1302],{"class":99},[79,1340,1341],{"class":106}," launch_ros.actions ",[79,1343,1290],{"class":99},[79,1345,1346],{"class":106}," Node\n",[79,1348,1349,1351,1354,1356],{"class":81,"line":176},[79,1350,1302],{"class":99},[79,1352,1353],{"class":106}," ament_index_python.packages ",[79,1355,1290],{"class":99},[79,1357,1358],{"class":106}," get_package_share_directory\n",[79,1360,1361],{"class":81,"line":181},[79,1362,142],{"emptyLinePlaceholder":141},[79,1364,1365,1368,1371],{"class":81,"line":187},[79,1366,1367],{"class":99},"def",[79,1369,1370],{"class":85}," generate_launch_description",[79,1372,1373],{"class":106},"():\n",[79,1375,1376,1379,1382,1385,1388],{"class":81,"line":199},[79,1377,1378],{"class":106},"    use_sim_time ",[79,1380,1381],{"class":99},"=",[79,1383,1384],{"class":106}," LaunchConfiguration(",[79,1386,1387],{"class":89},"'use_sim_time'",[79,1389,1390],{"class":106},")\n",[79,1392,1394,1397,1399,1401,1404],{"class":81,"line":1393},11,[79,1395,1396],{"class":106},"    slam_params_file ",[79,1398,1381],{"class":99},[79,1400,1384],{"class":106},[79,1402,1403],{"class":89},"'slam_params_file'",[79,1405,1390],{"class":106},[79,1407,1409],{"class":81,"line":1408},12,[79,1410,142],{"emptyLinePlaceholder":141},[79,1412,1414,1417,1419],{"class":81,"line":1413},13,[79,1415,1416],{"class":106},"    declare_use_sim_time_argument ",[79,1418,1381],{"class":99},[79,1420,1421],{"class":106}," DeclareLaunchArgument(\n",[79,1423,1425,1428],{"class":81,"line":1424},14,[79,1426,1427],{"class":89},"        'use_sim_time'",[79,1429,1430],{"class":106},",\n",[79,1432,1434,1438,1440,1443],{"class":81,"line":1433},15,[79,1435,1437],{"class":1436},"s4XuR","        default_value",[79,1439,1381],{"class":99},[79,1441,1442],{"class":89},"'false'",[79,1444,1430],{"class":106},[79,1446,1448,1451,1453,1456],{"class":81,"line":1447},16,[79,1449,1450],{"class":1436},"        description",[79,1452,1381],{"class":99},[79,1454,1455],{"class":89},"'Use simulation/Gazebo clock'",[79,1457,1390],{"class":106},[79,1459,1461,1464,1466],{"class":81,"line":1460},17,[79,1462,1463],{"class":106},"    declare_slam_params_file_cmd ",[79,1465,1381],{"class":99},[79,1467,1421],{"class":106},[79,1469,1471,1474],{"class":81,"line":1470},18,[79,1472,1473],{"class":89},"        'slam_params_file'",[79,1475,1430],{"class":106},[79,1477,1479,1481,1483,1486,1489],{"class":81,"line":1478},19,[79,1480,1437],{"class":1436},[79,1482,1381],{"class":99},[79,1484,1485],{"class":106},"os.path.join(get_package_share_directory(",[79,1487,1488],{"class":89},"\"mycar_slam_slam_toolbox\"",[79,1490,1491],{"class":106},"),\n",[79,1493,1495,1498,1501,1504],{"class":81,"line":1494},20,[79,1496,1497],{"class":89},"                                   'params'",[79,1499,1500],{"class":106},", ",[79,1502,1503],{"class":89},"'mapper_params_online_sync.yaml'",[79,1505,1491],{"class":106},[79,1507,1509,1511,1513,1516],{"class":81,"line":1508},21,[79,1510,1450],{"class":1436},[79,1512,1381],{"class":99},[79,1514,1515],{"class":89},"'Full path to the ROS2 parameters file to use for the slam_toolbox node'",[79,1517,1390],{"class":106},[79,1519,1521],{"class":81,"line":1520},22,[79,1522,142],{"emptyLinePlaceholder":141},[79,1524,1526,1529,1531],{"class":81,"line":1525},23,[79,1527,1528],{"class":106},"    start_sync_slam_toolbox_node ",[79,1530,1381],{"class":99},[79,1532,1533],{"class":106}," Node(\n",[79,1535,1537,1540,1542],{"class":81,"line":1536},24,[79,1538,1539],{"class":1436},"        parameters",[79,1541,1381],{"class":99},[79,1543,1544],{"class":106},"[\n",[79,1546,1548],{"class":81,"line":1547},25,[79,1549,1550],{"class":106},"          slam_params_file,\n",[79,1552,1554,1557,1559],{"class":81,"line":1553},26,[79,1555,1556],{"class":106},"          {",[79,1558,1387],{"class":89},[79,1560,1561],{"class":106},": use_sim_time}\n",[79,1563,1565],{"class":81,"line":1564},27,[79,1566,1567],{"class":106},"        ],\n",[79,1569,1571,1574,1576,1579],{"class":81,"line":1570},28,[79,1572,1573],{"class":1436},"        package",[79,1575,1381],{"class":99},[79,1577,1578],{"class":89},"'slam_toolbox'",[79,1580,1430],{"class":106},[79,1582,1584,1587,1589,1592],{"class":81,"line":1583},29,[79,1585,1586],{"class":1436},"        executable",[79,1588,1381],{"class":99},[79,1590,1591],{"class":89},"'sync_slam_toolbox_node'",[79,1593,1430],{"class":106},[79,1595,1597,1600,1602,1604],{"class":81,"line":1596},30,[79,1598,1599],{"class":1436},"        name",[79,1601,1381],{"class":99},[79,1603,1578],{"class":89},[79,1605,1430],{"class":106},[79,1607,1609,1612,1614,1617],{"class":81,"line":1608},31,[79,1610,1611],{"class":1436},"        output",[79,1613,1381],{"class":99},[79,1615,1616],{"class":89},"'screen'",[79,1618,1390],{"class":106},[79,1620,1622],{"class":81,"line":1621},32,[79,1623,142],{"emptyLinePlaceholder":141},[79,1625,1627,1630,1632],{"class":81,"line":1626},33,[79,1628,1629],{"class":106},"    ld ",[79,1631,1381],{"class":99},[79,1633,1634],{"class":106}," LaunchDescription()\n",[79,1636,1638],{"class":81,"line":1637},34,[79,1639,142],{"emptyLinePlaceholder":141},[79,1641,1643],{"class":81,"line":1642},35,[79,1644,1645],{"class":106},"    ld.add_action(declare_use_sim_time_argument)\n",[79,1647,1649],{"class":81,"line":1648},36,[79,1650,1651],{"class":106},"    ld.add_action(declare_slam_params_file_cmd)\n",[79,1653,1655],{"class":81,"line":1654},37,[79,1656,1657],{"class":106},"    ld.add_action(start_sync_slam_toolbox_node)\n",[79,1659,1661],{"class":81,"line":1660},38,[79,1662,142],{"emptyLinePlaceholder":141},[79,1664,1666,1669],{"class":81,"line":1665},39,[79,1667,1668],{"class":99},"    return",[79,1670,1671],{"class":106}," ld\n",[19,1673,1674,1675,1677,1678,1680,1681,1684,1685,1687,1688,1690,1691,1693],{},"This launch file primarily loads the ",[76,1676,539],{}," node from the ",[76,1679,616],{}," package and reads a configuration file named ",[76,1682,1683],{},"mapper_params_online_sync.yaml"," from the current package's ",[76,1686,1270],{}," directory. This configuration file does not exist yet, so you need to create a new file named ",[76,1689,1683],{}," in the ",[76,1692,1270],{}," directory and enter the following content:",[70,1695,1699],{"className":1696,"code":1697,"language":1698,"meta":33,"style":33},"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",[76,1700,1701,1709,1716,1727,1737,1747,1757,1767,1777,1781,1791,1801,1811,1821,1834,1838,1843,1848,1853,1857,1867,1877,1890,1900,1910,1922,1932,1942,1952,1964,1974,1978,1987,1996,2006,2015,2025,2035,2048,2058,2069,2082,2096,2109,2123,2134,2139,2149,2160,2172,2177,2188,2198,2209,2214,2228,2241,2246,2260,2274,2288,2299,2309],{"__ignoreMap":33},[79,1702,1703,1706],{"class":81,"line":82},[79,1704,616],{"class":1705},"s9eBZ",[79,1707,1708],{"class":106},":\n",[79,1710,1711,1714],{"class":81,"line":116},[79,1712,1713],{"class":1705},"  ros__parameters",[79,1715,1708],{"class":106},[79,1717,1718,1721,1724],{"class":81,"line":138},[79,1719,1720],{"class":1705},"    solver_plugin",[79,1722,1723],{"class":106},": ",[79,1725,1726],{"class":89},"solver_plugins::CeresSolver\n",[79,1728,1729,1732,1734],{"class":81,"line":145},[79,1730,1731],{"class":1705},"    ceres_linear_solver",[79,1733,1723],{"class":106},[79,1735,1736],{"class":89},"SPARSE_NORMAL_CHOLESKY\n",[79,1738,1739,1742,1744],{"class":81,"line":152},[79,1740,1741],{"class":1705},"    ceres_preconditioner",[79,1743,1723],{"class":106},[79,1745,1746],{"class":89},"SCHUR_JACOBI\n",[79,1748,1749,1752,1754],{"class":81,"line":164},[79,1750,1751],{"class":1705},"    ceres_trust_strategy",[79,1753,1723],{"class":106},[79,1755,1756],{"class":89},"LEVENBERG_MARQUARDT\n",[79,1758,1759,1762,1764],{"class":81,"line":176},[79,1760,1761],{"class":1705},"    ceres_dogleg_type",[79,1763,1723],{"class":106},[79,1765,1766],{"class":89},"TRADITIONAL_DOGLEG\n",[79,1768,1769,1772,1774],{"class":81,"line":181},[79,1770,1771],{"class":1705},"    ceres_loss_function",[79,1773,1723],{"class":106},[79,1775,1776],{"class":89},"None\n",[79,1778,1779],{"class":81,"line":187},[79,1780,142],{"emptyLinePlaceholder":141},[79,1782,1783,1786,1788],{"class":81,"line":199},[79,1784,1785],{"class":1705},"    odom_frame",[79,1787,1723],{"class":106},[79,1789,1790],{"class":89},"odom\n",[79,1792,1793,1796,1798],{"class":81,"line":1393},[79,1794,1795],{"class":1705},"    map_frame",[79,1797,1723],{"class":106},[79,1799,1800],{"class":89},"map\n",[79,1802,1803,1806,1808],{"class":81,"line":1408},[79,1804,1805],{"class":1705},"    base_frame",[79,1807,1723],{"class":106},[79,1809,1810],{"class":89},"base_link\n",[79,1812,1813,1816,1818],{"class":81,"line":1413},[79,1814,1815],{"class":1705},"    scan_topic",[79,1817,1723],{"class":106},[79,1819,1820],{"class":89},"/scan\n",[79,1822,1823,1826,1828,1831],{"class":81,"line":1424},[79,1824,1825],{"class":1705},"    mode",[79,1827,1723],{"class":106},[79,1829,1830],{"class":89},"mapping",[79,1832,1833],{"class":148}," #localization\n",[79,1835,1836],{"class":81,"line":1433},[79,1837,142],{"emptyLinePlaceholder":141},[79,1839,1840],{"class":81,"line":1447},[79,1841,1842],{"class":148},"    #map_file_name: test_steve\n",[79,1844,1845],{"class":81,"line":1460},[79,1846,1847],{"class":148},"    #map_start_pose: [0.0, 0.0, 0.0]\n",[79,1849,1850],{"class":81,"line":1470},[79,1851,1852],{"class":148},"    #map_start_at_dock: true\n",[79,1854,1855],{"class":81,"line":1478},[79,1856,142],{"emptyLinePlaceholder":141},[79,1858,1859,1862,1864],{"class":81,"line":1494},[79,1860,1861],{"class":1705},"    debug_logging",[79,1863,1723],{"class":106},[79,1865,1866],{"class":1251},"false\n",[79,1868,1869,1872,1874],{"class":81,"line":1508},[79,1870,1871],{"class":1705},"    throttle_scans",[79,1873,1723],{"class":106},[79,1875,1876],{"class":1251},"1\n",[79,1878,1879,1882,1884,1887],{"class":81,"line":1520},[79,1880,1881],{"class":1705},"    transform_publish_period",[79,1883,1723],{"class":106},[79,1885,1886],{"class":1251},"0.02",[79,1888,1889],{"class":106}," \n",[79,1891,1892,1895,1897],{"class":81,"line":1525},[79,1893,1894],{"class":1705},"    map_update_interval",[79,1896,1723],{"class":106},[79,1898,1899],{"class":1251},"2.0\n",[79,1901,1902,1905,1907],{"class":81,"line":1536},[79,1903,1904],{"class":1705},"    resolution",[79,1906,1723],{"class":106},[79,1908,1909],{"class":1251},"0.05\n",[79,1911,1912,1915,1917,1920],{"class":81,"line":1547},[79,1913,1914],{"class":1705},"    max_laser_range",[79,1916,1723],{"class":106},[79,1918,1919],{"class":1251},"20.0",[79,1921,1889],{"class":106},[79,1923,1924,1927,1929],{"class":81,"line":1553},[79,1925,1926],{"class":1705},"    minimum_time_interval",[79,1928,1723],{"class":106},[79,1930,1931],{"class":1251},"0.5\n",[79,1933,1934,1937,1939],{"class":81,"line":1564},[79,1935,1936],{"class":1705},"    transform_timeout",[79,1938,1723],{"class":106},[79,1940,1941],{"class":1251},"0.2\n",[79,1943,1944,1947,1949],{"class":81,"line":1570},[79,1945,1946],{"class":1705},"    tf_buffer_duration",[79,1948,1723],{"class":106},[79,1950,1951],{"class":1251},"30.0\n",[79,1953,1954,1957,1959,1962],{"class":81,"line":1583},[79,1955,1956],{"class":1705},"    stack_size_to_use",[79,1958,1723],{"class":106},[79,1960,1961],{"class":1251},"40000000",[79,1963,1889],{"class":106},[79,1965,1966,1969,1971],{"class":81,"line":1596},[79,1967,1968],{"class":1705},"    enable_interactive_mode",[79,1970,1723],{"class":106},[79,1972,1973],{"class":1251},"true\n",[79,1975,1976],{"class":81,"line":1608},[79,1977,142],{"emptyLinePlaceholder":141},[79,1979,1980,1983,1985],{"class":81,"line":1621},[79,1981,1982],{"class":1705},"    use_scan_matching",[79,1984,1723],{"class":106},[79,1986,1973],{"class":1251},[79,1988,1989,1992,1994],{"class":81,"line":1626},[79,1990,1991],{"class":1705},"    use_scan_barycenter",[79,1993,1723],{"class":106},[79,1995,1973],{"class":1251},[79,1997,1998,2001,2003],{"class":81,"line":1637},[79,1999,2000],{"class":1705},"    minimum_travel_distance",[79,2002,1723],{"class":106},[79,2004,2005],{"class":1251},"0.1\n",[79,2007,2008,2011,2013],{"class":81,"line":1642},[79,2009,2010],{"class":1705},"    minimum_travel_heading",[79,2012,1723],{"class":106},[79,2014,2005],{"class":1251},[79,2016,2017,2020,2022],{"class":81,"line":1648},[79,2018,2019],{"class":1705},"    scan_buffer_size",[79,2021,1723],{"class":106},[79,2023,2024],{"class":1251},"100\n",[79,2026,2027,2030,2032],{"class":81,"line":1654},[79,2028,2029],{"class":1705},"    scan_buffer_maximum_scan_distance",[79,2031,1723],{"class":106},[79,2033,2034],{"class":1251},"10.0\n",[79,2036,2037,2040,2042,2045],{"class":81,"line":1660},[79,2038,2039],{"class":1705},"    link_match_minimum_response_fine",[79,2041,1723],{"class":106},[79,2043,2044],{"class":1251},"0.1",[79,2046,2047],{"class":106},"  \n",[79,2049,2050,2053,2055],{"class":81,"line":1665},[79,2051,2052],{"class":1705},"    link_scan_maximum_distance",[79,2054,1723],{"class":106},[79,2056,2057],{"class":1251},"1.5\n",[79,2059,2061,2064,2066],{"class":81,"line":2060},40,[79,2062,2063],{"class":1705},"    loop_search_maximum_distance",[79,2065,1723],{"class":106},[79,2067,2068],{"class":1251},"3.0\n",[79,2070,2072,2075,2077,2080],{"class":81,"line":2071},41,[79,2073,2074],{"class":1705},"    do_loop_closing",[79,2076,1723],{"class":106},[79,2078,2079],{"class":1251},"true",[79,2081,1889],{"class":106},[79,2083,2085,2088,2090,2093],{"class":81,"line":2084},42,[79,2086,2087],{"class":1705},"    loop_match_minimum_chain_size",[79,2089,1723],{"class":106},[79,2091,2092],{"class":1251},"10",[79,2094,2095],{"class":106},"           \n",[79,2097,2099,2102,2104,2107],{"class":81,"line":2098},43,[79,2100,2101],{"class":1705},"    loop_match_maximum_variance_coarse",[79,2103,1723],{"class":106},[79,2105,2106],{"class":1251},"3.0",[79,2108,2047],{"class":106},[79,2110,2112,2115,2117,2120],{"class":81,"line":2111},44,[79,2113,2114],{"class":1705},"    loop_match_minimum_response_coarse",[79,2116,1723],{"class":106},[79,2118,2119],{"class":1251},"0.35",[79,2121,2122],{"class":106},"    \n",[79,2124,2126,2129,2131],{"class":81,"line":2125},45,[79,2127,2128],{"class":1705},"    loop_match_minimum_response_fine",[79,2130,1723],{"class":106},[79,2132,2133],{"class":1251},"0.45\n",[79,2135,2137],{"class":81,"line":2136},46,[79,2138,142],{"emptyLinePlaceholder":141},[79,2140,2142,2145,2147],{"class":81,"line":2141},47,[79,2143,2144],{"class":1705},"    correlation_search_space_dimension",[79,2146,1723],{"class":106},[79,2148,1931],{"class":1251},[79,2150,2152,2155,2157],{"class":81,"line":2151},48,[79,2153,2154],{"class":1705},"    correlation_search_space_resolution",[79,2156,1723],{"class":106},[79,2158,2159],{"class":1251},"0.01\n",[79,2161,2163,2166,2168,2170],{"class":81,"line":2162},49,[79,2164,2165],{"class":1705},"    correlation_search_space_smear_deviation",[79,2167,1723],{"class":106},[79,2169,2044],{"class":1251},[79,2171,1889],{"class":106},[79,2173,2175],{"class":81,"line":2174},50,[79,2176,142],{"emptyLinePlaceholder":141},[79,2178,2180,2183,2185],{"class":81,"line":2179},51,[79,2181,2182],{"class":1705},"    loop_search_space_dimension",[79,2184,1723],{"class":106},[79,2186,2187],{"class":1251},"8.0\n",[79,2189,2191,2194,2196],{"class":81,"line":2190},52,[79,2192,2193],{"class":1705},"    loop_search_space_resolution",[79,2195,1723],{"class":106},[79,2197,1909],{"class":1251},[79,2199,2201,2204,2206],{"class":81,"line":2200},53,[79,2202,2203],{"class":1705},"    loop_search_space_smear_deviation",[79,2205,1723],{"class":106},[79,2207,2208],{"class":1251},"0.03\n",[79,2210,2212],{"class":81,"line":2211},54,[79,2213,142],{"emptyLinePlaceholder":141},[79,2215,2217,2220,2222,2225],{"class":81,"line":2216},55,[79,2218,2219],{"class":1705},"    distance_variance_penalty",[79,2221,1723],{"class":106},[79,2223,2224],{"class":1251},"0.5",[79,2226,2227],{"class":106},"      \n",[79,2229,2231,2234,2236,2239],{"class":81,"line":2230},56,[79,2232,2233],{"class":1705},"    angle_variance_penalty",[79,2235,1723],{"class":106},[79,2237,2238],{"class":1251},"1.0",[79,2240,2122],{"class":106},[79,2242,2244],{"class":81,"line":2243},57,[79,2245,142],{"emptyLinePlaceholder":141},[79,2247,2249,2252,2254,2257],{"class":81,"line":2248},58,[79,2250,2251],{"class":1705},"    fine_search_angle_offset",[79,2253,1723],{"class":106},[79,2255,2256],{"class":1251},"0.00349",[79,2258,2259],{"class":106},"     \n",[79,2261,2263,2266,2268,2271],{"class":81,"line":2262},59,[79,2264,2265],{"class":1705},"    coarse_search_angle_offset",[79,2267,1723],{"class":106},[79,2269,2270],{"class":1251},"0.349",[79,2272,2273],{"class":106},"   \n",[79,2275,2277,2280,2282,2285],{"class":81,"line":2276},60,[79,2278,2279],{"class":1705},"    coarse_angle_resolution",[79,2281,1723],{"class":106},[79,2283,2284],{"class":1251},"0.0349",[79,2286,2287],{"class":106},"        \n",[79,2289,2291,2294,2296],{"class":81,"line":2290},61,[79,2292,2293],{"class":1705},"    minimum_angle_penalty",[79,2295,1723],{"class":106},[79,2297,2298],{"class":1251},"0.9\n",[79,2300,2302,2305,2307],{"class":81,"line":2301},62,[79,2303,2304],{"class":1705},"    minimum_distance_penalty",[79,2306,1723],{"class":106},[79,2308,1931],{"class":1251},[79,2310,2312,2315,2317],{"class":81,"line":2311},63,[79,2313,2314],{"class":1705},"    use_response_expansion",[79,2316,1723],{"class":106},[79,2318,1973],{"class":1251},[19,2320,2321],{},"The content of the configuration file needs to be dynamically adjusted based on the actual situation.",[316,2323,2324],{"start":138},[50,2325,2326],{},"Edit the configuration file",[19,2328,2329,2330,2333],{},"Open ",[76,2331,2332],{},"CMakeLists.txt"," and enter the following content:",[70,2335,2339],{"className":2336,"code":2337,"language":2338,"meta":33,"style":33},"language-cmake shiki shiki-themes github-light github-dark","install(DIRECTORY launch params\n  DESTINATION share/${PROJECT_NAME}\n)\n","cmake",[76,2340,2341,2349,2357],{"__ignoreMap":33},[79,2342,2343,2346],{"class":81,"line":82},[79,2344,2345],{"class":99},"install",[79,2347,2348],{"class":106},"(DIRECTORY launch params\n",[79,2350,2351,2354],{"class":81,"line":116},[79,2352,2353],{"class":106},"  DESTINATION share/",[79,2355,2356],{"class":99},"${PROJECT_NAME}\n",[79,2358,2359],{"class":81,"line":138},[79,2360,1390],{"class":106},[316,2362,2363],{"start":145},[50,2364,2365],{},"Compile",[19,2367,2368],{},"In the terminal, navigate to the current workspace and compile the package:",[70,2370,2372],{"className":72,"code":2371,"language":74,"meta":33,"style":33},"colcon build --packages-select mycar_slam_slam_toolbox\n",[76,2373,2374],{"__ignoreMap":33},[79,2375,2376,2379,2382,2385],{"class":81,"line":82},[79,2377,2378],{"class":85},"colcon",[79,2380,2381],{"class":89}," build",[79,2383,2384],{"class":1251}," --packages-select",[79,2386,2387],{"class":89}," mycar_slam_slam_toolbox\n",[316,2389,2390],{"start":152},[50,2391,2392,2393,2398,2423,2428,2453],{},"Execute",[316,2394,2395],{},[50,2396,2397],{},"Please first call the following command to start the simulation environment:",[70,2399,2401],{"className":72,"code":2400,"language":74,"meta":33,"style":33},". install/setup.bash\nros2 launch demo_gazebo_sim gazebo_sim_robot_world.launch.py\n",[76,2402,2403,2410],{"__ignoreMap":33},[79,2404,2405,2407],{"class":81,"line":82},[79,2406,934],{"class":1251},[79,2408,2409],{"class":89}," install/setup.bash\n",[79,2411,2412,2414,2417,2420],{"class":81,"line":116},[79,2413,1239],{"class":85},[79,2415,2416],{"class":89}," launch",[79,2418,2419],{"class":89}," demo_gazebo_sim",[79,2421,2422],{"class":89}," gazebo_sim_robot_world.launch.py\n",[316,2424,2425],{"start":138},[50,2426,2427],{},"Then, in the terminal, navigate to the current workspace and enter the following command:",[70,2429,2431],{"className":72,"code":2430,"language":74,"meta":33,"style":33},". install/setup.bash\nros2 launch mycar_slam_slam_toolbox online_sync_launch.py use_sim_time:=True\n",[76,2432,2433,2439],{"__ignoreMap":33},[79,2434,2435,2437],{"class":81,"line":82},[79,2436,934],{"class":1251},[79,2438,2409],{"class":89},[79,2440,2441,2443,2445,2447,2450],{"class":81,"line":116},[79,2442,1239],{"class":85},[79,2444,2416],{"class":89},[79,2446,1248],{"class":89},[79,2448,2449],{"class":89}," online_sync_launch.py",[79,2451,2452],{"class":89}," use_sim_time:=True\n",[316,2454,2455,2458],{"start":152},[50,2456,2457],{},"Start rviz2, set the Fixed Frame to map, add the map plugin and set the topic to /map, and the map created by slam_toolbox will be displayed. As the robot moves, the map will update accordingly.",[50,2459,1200,2460,2463],{},[76,2461,2462],{},"use_sim_time:=True"," parameter indicates that simulation time is used.",[19,2465,2466,2467,2469,2470,2472],{},"Finally, it should be noted that this section uses the ",[76,2468,539],{}," node, which builds the map synchronously, while the usage of the asynchronous mapping node ",[76,2471,543],{}," is similar to the synchronous one.",[19,2474,2475],{},[31,2476],{"alt":33,"src":2477},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1746.webp",[19,2479,2480],{},"We use the keyboard control node to drive the robot across the entire map.",[19,2482,2483],{},[31,2484],{"alt":33,"src":2485},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1747.webp",[19,2487,2488],{},"Black: obstacle",[19,2490,2491],{},"White: obstacle-free zone",[19,2493,2494],{},"Gray: Unknown area",[19,2496,2497],{},"SLAM is mapping and localization. The above covers mapping, so what is localization?",[19,2499,2500,2501,2503],{},"The positioning means Slam will publish a ",[76,2502,595],{},", which contains the coordinate transformation between the robot and the map.",[19,2505,2506,2507,2509,2510,2513,2514,2517,2518,540,2520,2523],{},"This ",[76,2508,595],{}," specifically publishes the coordinate transform from ",[76,2511,2512],{},"map"," to ",[76,2515,2516],{},"odom",", so you need to handle the coordinate relationship between ",[76,2519,2516],{},[76,2521,2522],{},"base_link"," yourself.",[19,2525,2526],{},[31,2527],{"alt":33,"src":2528},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1748.webp",[19,2530,2531],{},"This design allows the entire coordinate tree to be a chain structure, preventing base_link or base_footprint from having two parent classes, which would increase computational load.",[19,2533,2534],{},[22,2535,2536],{},"Notes:",[316,2538,2539],{},[50,2540,2541,2542],{},"Suddenly, the image quality degraded.\n",[316,2543,2544,2557],{},[50,2545,2546,2547,2550,2551,2513,2553,2556],{},"If your environment is very simple, the map may suddenly become corrupted during mapping. In this case, it is most likely an issue with ",[76,2548,2549],{},"do_loop_closing",". Try setting ",[76,2552,2549],{},[76,2554,2555],{},"false"," and test again.\nThis thing uses SLAM to detect shapes with lasers and match them against previously traveled paths. If the matched shapes are similar enough, it connects the current trajectory with the previous one, then re-optimizes the entire pose graph to make the overall map more consistent.\nMainly to prevent odom from drifting. Since odom drifts, when the robot returns to the starting point, SLAM might think the position is off by tens of centimeters, but this can be corrected using the LiDAR.",[50,2558,2559],{},"Try to go straight through narrow passages as much as possible, and avoid rotating in place. If a crash occurs in such a narrow passage, it is most likely due to issues with scan matching related parameters.",[15,2561,2563],{"id":2562},"overview-of-cartographer","Overview of Cartographer",[19,2565,2566],{},[22,2567,24],{},[19,2569,2570],{},"Cartographer is a laser SLAM algorithm library based on graph optimization, released by Google, supporting the construction of both 2D and 3D maps. It combines data from LiDAR and an Inertial Measurement Unit (IMU), using efficient algorithms to achieve real-time, accurate localization and mapping.",[19,2572,2573],{},[22,2574,613],{},[47,2576,2577,2583,2589,2595,2601],{},[50,2578,2579,2582],{},[22,2580,2581],{},"Parallel Scan Matching"," leverages parallel computing techniques to accelerate scan matching speed and improve mapping efficiency.",[50,2584,2585,2588],{},[22,2586,2587],{},"Pose Graph Optimization"," uses graph optimization techniques to estimate the robot's pose and the topological structure of the map, reducing accumulated error.",[50,2590,2591,2594],{},[22,2592,2593],{},"Real-time Map Updates"," Update the map in real-time as the robot moves to ensure accuracy and timeliness.",[50,2596,2597,2600],{},[22,2598,2599],{},"Loop Closure Detection"," identifies areas the robot has previously visited, further reducing accumulated error and improving the global consistency of the map.",[50,2602,2603,2606],{},[22,2604,2605],{},"Multi-sensor fusion"," supports the fusion of data from multiple sensors such as LiDAR, IMU, and odometry, improving the accuracy of localization and mapping.",[19,2608,403],{},[47,2610,2611,2617,2623,2629,2635],{},[50,2612,2613,2616],{},[22,2614,2615],{},"Efficient and Stable"," Cartographer's algorithm is carefully designed and optimized to run efficiently and stably in complex environments.",[50,2618,2619,2622],{},[22,2620,2621],{},"High precision"," Provides high-precision localization and mapping results through graph optimization and loop closure detection techniques.",[50,2624,2625,2628],{},[22,2626,2627],{},"Flexibility"," Supports both 2D and 3D map building to meet the needs of different application scenarios.",[50,2630,2631,2634],{},[22,2632,2633],{},"Open source and free"," Cartographer is an open source project, allowing users to freely access and use its source code and documentation.",[50,2636,2637,2640],{},[22,2638,2639],{},"Community Support"," Features an active community support system, allowing users to obtain help and support from developers worldwide.",[15,2642,2644],{"id":2643},"install-cartographer","Install Cartographer",[19,2646,2647],{},"Using Ubuntu's package manager, you can install Cartographer in binary form with the following command:",[70,2649,2651],{"className":72,"code":2650,"language":74,"meta":33,"style":33},"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",[76,2652,2653,2674,2695,2699,2704,2715,2726,2730,2741],{"__ignoreMap":33},[79,2654,2655,2657,2659,2661,2663,2665,2667,2669,2671],{"class":81,"line":82},[79,2656,86],{"class":85},[79,2658,90],{"class":89},[79,2660,93],{"class":89},[79,2662,96],{"class":89},[79,2664,100],{"class":99},[79,2666,103],{"class":89},[79,2668,107],{"class":106},[79,2670,110],{"class":99},[79,2672,2673],{"class":89},"-cartographer\n",[79,2675,2676,2678,2680,2682,2684,2686,2688,2690,2692],{"class":81,"line":116},[79,2677,86],{"class":85},[79,2679,90],{"class":89},[79,2681,93],{"class":89},[79,2683,96],{"class":89},[79,2685,100],{"class":99},[79,2687,103],{"class":89},[79,2689,107],{"class":106},[79,2691,110],{"class":99},[79,2693,2694],{"class":89},"-cartographer-ros\n",[79,2696,2697],{"class":81,"line":138},[79,2698,142],{"emptyLinePlaceholder":141},[79,2700,2701],{"class":81,"line":145},[79,2702,2703],{"class":148},"# humble\n",[79,2705,2706,2708,2710,2712],{"class":81,"line":152},[79,2707,86],{"class":85},[79,2709,90],{"class":89},[79,2711,93],{"class":89},[79,2713,2714],{"class":89}," ros-humble-cartographer\n",[79,2716,2717,2719,2721,2723],{"class":81,"line":164},[79,2718,86],{"class":85},[79,2720,90],{"class":89},[79,2722,93],{"class":89},[79,2724,2725],{"class":89}," ros-humble-cartographer-ros\n",[79,2727,2728],{"class":81,"line":176},[79,2729,493],{"class":148},[79,2731,2732,2734,2736,2738],{"class":81,"line":181},[79,2733,86],{"class":85},[79,2735,90],{"class":89},[79,2737,93],{"class":89},[79,2739,2740],{"class":89}," ros-jazzy-cartographer\n",[79,2742,2743,2745,2747,2749],{"class":81,"line":187},[79,2744,86],{"class":85},[79,2746,90],{"class":89},[79,2748,93],{"class":89},[79,2750,2751],{"class":89}," ros-jazzy-cartographer-ros\n",[19,2753,2754,2755,2757],{},"Of the two installation commands above, the first one is used to install the core library of Cartographer. This package does not integrate directly with ROS2 but exists as an independent algorithm library, providing underlying computational support for mapping and localization. The second one is the Cartographer wrapper for the ROS2 environment, which provides an interface with the ROS2 system, allowing the Cartographer algorithm to run within the ROS2 environment. Additionally, please replace ",[76,2756,214],{}," in the commands with the current ROS2 version being used.",[15,2759,2761],{"id":2760},"cartographer-node-description","Cartographer node description",[19,2763,2764,2765,540,2768,2771],{},"In the Cartographer framework, ",[76,2766,2767],{},"cartographer_node",[76,2769,2770],{},"cartographer_occupancy_grid_node"," are two key nodes, each serving distinct roles and functions. A detailed introduction follows.",[341,2773,2774,2779,2782,2787],{},[19,2775,2776],{},[22,2777,2778],{},"cartographer_node：",[19,2780,2781],{},"Primarily responsible for subscribing to data from various sensors (such as LiDAR, IMU, odometry, etc.) and building a map in real time based on this data. It uses a submap approach to gradually construct and update the map, ensuring accurate localization and real-time mapping.",[19,2783,2784],{},[22,2785,2786],{},"cartographer_occupancy_grid_node：",[19,2788,2789,2790,2793,2794,2796],{},"This node is responsible for receiving the submap list (",[76,2791,2792],{},"/submap_list",") published by ",[76,2795,2767],{},", stitching it into a complete occupancy grid map, and then publishing this map. This node is the final step in map generation, enabling Cartographer to output a map that is human-readable and easy to visualize.",[19,2798,2799],{},"The collaborative work of these two nodes involves the former being responsible for real-time map construction and updates, while the latter is responsible for stitching sub-maps into a complete grid map and publishing it, enabling Cartographer to efficiently implement SLAM functionality.",[316,2801,2802],{},[50,2803,2804],{},"Topics subscribed to by cartographer_node",[557,2806,2807,2817],{},[560,2808,2809],{},[563,2810,2811,2813,2815],{},[566,2812,569],{"align":568},[566,2814,572],{"align":568},[566,2816,575],{"align":568},[577,2818,2819,2827],{},[563,2820,2821,2823,2825],{},[582,2822,584],{"align":568},[582,2824,587],{"align":568},[582,2826,590],{"align":568},[563,2828,2829,2832,2835],{},[582,2830,2831],{"align":568},"/odom",[582,2833,2834],{"align":568},"nav_msgs/msg/Odometry",[582,2836,2837],{"align":568},"odometry message",[316,2839,2840],{"start":116},[50,2841,2842],{},"The topics published by cartographer_node",[557,2844,2845,2855],{},[560,2846,2847],{},[563,2848,2849,2851,2853],{},[566,2850,569],{"align":568},[566,2852,572],{"align":568},[566,2854,575],{"align":568},[577,2856,2857,2868],{},[563,2858,2859,2862,2865],{},[582,2860,2861],{"align":568},"/scan_matched_points2",[582,2863,2864],{"align":568},"sensors_msgs/msg/PointCloud2",[582,2866,2867],{"align":568},"Matched point cloud data, used for scan-to-submap matching.",[563,2869,2870,2872,2875],{},[582,2871,2792],{"align":568},[582,2873,2874],{"align":568},"cartographer_ros_msgs/SubmapList",[582,2876,2877],{"align":568},"Publish the built list of subgraphs.",[316,2879,2880],{"start":138},[50,2881,2882],{},"The service published by cartographer_node",[557,2884,2885,2895],{},[560,2886,2887],{},[563,2888,2889,2891,2893],{},[566,2890,569],{"align":568},[566,2892,572],{"align":568},[566,2894,575],{"align":568},[577,2896,2897,2908,2919,2930,2941,2952],{},[563,2898,2899,2902,2905],{},[582,2900,2901],{"align":568},"/submap_query",[582,2903,2904],{"align":568},"cartographer_ros_msgs/srv/SubmapQuery",[582,2906,2907],{"align":568},"Provide a service for querying subgraphs, retrieving the queried subgraph.",[563,2909,2910,2913,2916],{},[582,2911,2912],{"align":568},"/start_trajectory",[582,2914,2915],{"align":568},"cartographer_ros_msgs/srv/StartTrajectory",[582,2917,2918],{"align":568},"Starting a trajectory",[563,2920,2921,2924,2927],{},[582,2922,2923],{"align":568},"/finish_trajectory",[582,2925,2926],{"align":568},"cartographer_ros_msgs/srv/FinishTrajectory",[582,2928,2929],{"align":568},"End a trajectory with a given ID.",[563,2931,2932,2935,2938],{},[582,2933,2934],{"align":568},"/write_state",[582,2936,2937],{"align":568},"cartographer_ros_msgs/srv/WriteState",[582,2939,2940],{"align":568},"Write the current state to a disk file.",[563,2942,2943,2946,2949],{},[582,2944,2945],{"align":568},"/get_trajectory_states",[582,2947,2948],{"align":568},"cartographer_ros_msgs/srv/GetTrajectoryStates",[582,2950,2951],{"align":568},"Get the state of a specified trajectory",[563,2953,2954,2957,2960],{},[582,2955,2956],{"align":568},"/read_metrics",[582,2958,2959],{"align":568},"cartographer_ros_msgs/srv/ReadMetrics",[582,2961,2962],{"align":568},"Read performance metrics",[316,2964,2965],{"start":145},[50,2966,2967],{},"cartographer_node parameters",[19,2969,2970,2972],{},[76,2971,2767],{}," node needs to receive a parameter configuration file that contains various parameters required for map building, trajectory tracking, and other tasks.",[316,2974,2975],{"start":152},[50,2976,2977,2978,934],{},"The topic subscribed to by ",[76,2979,2770],{},[557,2981,2982,2992],{},[560,2983,2984],{},[563,2985,2986,2988,2990],{},[566,2987,569],{"align":568},[566,2989,572],{"align":568},[566,2991,575],{"align":568},[577,2993,2994],{},[563,2995,2996,2998,3000],{},[582,2997,2792],{"align":568},[582,2999,2874],{"align":568},[582,3001,3002],{"align":568},"List of Subfigures",[316,3004,3005],{"start":164},[50,3006,3007],{},"The topic published by cartographer_occupancy_grid_node",[557,3009,3010,3020],{},[560,3011,3012],{},[563,3013,3014,3016,3018],{},[566,3015,569],{"align":568},[566,3017,572],{"align":568},[566,3019,575],{"align":568},[577,3021,3022],{},[563,3023,3024,3026,3028],{},[582,3025,709],{"align":568},[582,3027,712],{"align":568},[582,3029,3030],{"align":568},"Published occupancy grid map",[316,3032,3033],{"start":176},[50,3034,3035],{},"The service requested by cartographer_occupancy_grid_node",[557,3037,3038,3048],{},[560,3039,3040],{},[563,3041,3042,3044,3046],{},[566,3043,569],{"align":568},[566,3045,572],{"align":568},[566,3047,575],{"align":568},[577,3049,3050],{},[563,3051,3052,3054,3056],{},[582,3053,2901],{"align":568},[582,3055,2904],{"align":568},[582,3057,3058],{"align":568},"Get subgraph",[316,3060,3061],{"start":181},[50,3062,3063],{},"cartographer_occupancy_grid_node parameters",[19,3065,3066,3068],{},[76,3067,2770],{}," The node needs to configure parameters such as the map's resolution and update cycle to ensure the generated grid map meets specific accuracy and real-time requirements.",[15,3070,3072],{"id":3071},"basic-usage-of-cartographer","Basic usage of Cartographer",[316,3074,3075],{},[50,3076,1219],{},[19,3078,1222,3079,1226,3081,1229],{},[76,3080,1225],{},[76,3082,1225],{},[70,3084,3086],{"className":72,"code":3085,"language":74,"meta":33,"style":33},"ros2 pkg create mycar_slam_cartographer --dependencies cartographer\n",[76,3087,3088],{"__ignoreMap":33},[79,3089,3090,3092,3094,3096,3099,3101],{"class":81,"line":82},[79,3091,1239],{"class":85},[79,3093,1242],{"class":89},[79,3095,1245],{"class":89},[79,3097,3098],{"class":89}," mycar_slam_cartographer",[79,3100,1252],{"class":1251},[79,3102,3103],{"class":89}," cartographer\n",[316,3105,3106],{"start":116},[50,3107,1260],{},[19,3109,1263,3110,1267,3112,1271,3114,1274,3116,1278],{},[76,3111,1266],{},[76,3113,1270],{},[76,3115,1266],{},[76,3117,3118],{},"cartographer.launch.py",[70,3120,3122],{"className":1281,"code":3121,"language":1283,"meta":33,"style":33},"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",[76,3123,3124,3134,3144,3154,3164,3170,3180,3184,3192,3196,3221,3244,3248,3257,3268,3279,3298,3308,3327,3340,3349,3354,3358,3367,3377,3388,3396,3410,3422,3426,3430,3437,3442,3447,3452,3457],{"__ignoreMap":33},[79,3125,3126,3128,3130,3132],{"class":81,"line":82},[79,3127,1302],{"class":99},[79,3129,1305],{"class":106},[79,3131,1290],{"class":99},[79,3133,1310],{"class":106},[79,3135,3136,3138,3140,3142],{"class":81,"line":116},[79,3137,1302],{"class":99},[79,3139,1317],{"class":106},[79,3141,1290],{"class":99},[79,3143,1322],{"class":106},[79,3145,3146,3148,3150,3152],{"class":81,"line":138},[79,3147,1302],{"class":99},[79,3149,1329],{"class":106},[79,3151,1290],{"class":99},[79,3153,1334],{"class":106},[79,3155,3156,3158,3160,3162],{"class":81,"line":145},[79,3157,1302],{"class":99},[79,3159,1341],{"class":106},[79,3161,1290],{"class":99},[79,3163,1346],{"class":106},[79,3165,3166,3168],{"class":81,"line":152},[79,3167,1290],{"class":99},[79,3169,1293],{"class":106},[79,3171,3172,3174,3176,3178],{"class":81,"line":164},[79,3173,1302],{"class":99},[79,3175,1353],{"class":106},[79,3177,1290],{"class":99},[79,3179,1358],{"class":106},[79,3181,3182],{"class":81,"line":176},[79,3183,142],{"emptyLinePlaceholder":141},[79,3185,3186,3188,3190],{"class":81,"line":181},[79,3187,1367],{"class":99},[79,3189,1370],{"class":85},[79,3191,1373],{"class":106},[79,3193,3194],{"class":81,"line":187},[79,3195,142],{"emptyLinePlaceholder":141},[79,3197,3198,3201,3203,3206,3208,3210,3213,3216,3219],{"class":81,"line":199},[79,3199,3200],{"class":106},"    use_sim_time_arg ",[79,3202,1381],{"class":99},[79,3204,3205],{"class":106}," DeclareLaunchArgument(",[79,3207,1387],{"class":89},[79,3209,1500],{"class":106},[79,3211,3212],{"class":1436},"default_value",[79,3214,3215],{"class":99}," =",[79,3217,3218],{"class":89}," 'false'",[79,3220,1390],{"class":106},[79,3222,3223,3226,3228,3230,3233,3235,3237,3239,3242],{"class":81,"line":1393},[79,3224,3225],{"class":106},"    resolution_arg ",[79,3227,1381],{"class":99},[79,3229,3205],{"class":106},[79,3231,3232],{"class":89},"'resolution'",[79,3234,1500],{"class":106},[79,3236,3212],{"class":1436},[79,3238,1381],{"class":99},[79,3240,3241],{"class":89},"'0.05'",[79,3243,1390],{"class":106},[79,3245,3246],{"class":81,"line":1408},[79,3247,142],{"emptyLinePlaceholder":141},[79,3249,3250,3253,3255],{"class":81,"line":1413},[79,3251,3252],{"class":106},"    cartographer_node ",[79,3254,1381],{"class":99},[79,3256,1533],{"class":106},[79,3258,3259,3261,3263,3266],{"class":81,"line":1424},[79,3260,1573],{"class":1436},[79,3262,3215],{"class":99},[79,3264,3265],{"class":89}," 'cartographer_ros'",[79,3267,1430],{"class":106},[79,3269,3270,3272,3274,3277],{"class":81,"line":1433},[79,3271,1586],{"class":1436},[79,3273,3215],{"class":99},[79,3275,3276],{"class":89}," 'cartographer_node'",[79,3278,1430],{"class":106},[79,3280,3281,3283,3285,3288,3290,3293,3295],{"class":81,"line":1447},[79,3282,1539],{"class":1436},[79,3284,3215],{"class":99},[79,3286,3287],{"class":106}," [{",[79,3289,1387],{"class":89},[79,3291,3292],{"class":106},": LaunchConfiguration(",[79,3294,1387],{"class":89},[79,3296,3297],{"class":106},")}],\n",[79,3299,3300,3303,3305],{"class":81,"line":1460},[79,3301,3302],{"class":1436},"        arguments",[79,3304,3215],{"class":99},[79,3306,3307],{"class":106}," [\n",[79,3309,3310,3313,3316,3319,3322,3325],{"class":81,"line":1470},[79,3311,3312],{"class":89},"            '-configuration_directory'",[79,3314,3315],{"class":106},", os.path.join(get_package_share_directory(",[79,3317,3318],{"class":89},"\"mycar_slam_cartographer\"",[79,3320,3321],{"class":106},"),",[79,3323,3324],{"class":89},"\"params\"",[79,3326,1491],{"class":106},[79,3328,3329,3332,3334,3337],{"class":81,"line":1478},[79,3330,3331],{"class":89},"            '-configuration_basename'",[79,3333,1500],{"class":106},[79,3335,3336],{"class":89},"'mycar.lua'",[79,3338,3339],{"class":106},"],\n",[79,3341,3342,3344,3346],{"class":81,"line":1494},[79,3343,1611],{"class":1436},[79,3345,3215],{"class":99},[79,3347,3348],{"class":89}," 'screen'\n",[79,3350,3351],{"class":81,"line":1508},[79,3352,3353],{"class":106},"    )\n",[79,3355,3356],{"class":81,"line":1520},[79,3357,142],{"emptyLinePlaceholder":141},[79,3359,3360,3363,3365],{"class":81,"line":1525},[79,3361,3362],{"class":106},"    cartographer_occupancy_grid_node ",[79,3364,1381],{"class":99},[79,3366,1533],{"class":106},[79,3368,3369,3371,3373,3375],{"class":81,"line":1536},[79,3370,1573],{"class":1436},[79,3372,3215],{"class":99},[79,3374,3265],{"class":89},[79,3376,1430],{"class":106},[79,3378,3379,3381,3383,3386],{"class":81,"line":1547},[79,3380,1586],{"class":1436},[79,3382,3215],{"class":99},[79,3384,3385],{"class":89}," 'cartographer_occupancy_grid_node'",[79,3387,1430],{"class":106},[79,3389,3390,3392,3394],{"class":81,"line":1553},[79,3391,1539],{"class":1436},[79,3393,3215],{"class":99},[79,3395,3307],{"class":106},[79,3397,3398,3401,3403,3405,3407],{"class":81,"line":1564},[79,3399,3400],{"class":106},"            {",[79,3402,1387],{"class":89},[79,3404,3292],{"class":106},[79,3406,1387],{"class":89},[79,3408,3409],{"class":106},")},\n",[79,3411,3412,3414,3416,3418,3420],{"class":81,"line":1570},[79,3413,3400],{"class":106},[79,3415,3232],{"class":89},[79,3417,3292],{"class":106},[79,3419,3232],{"class":89},[79,3421,3297],{"class":106},[79,3423,3424],{"class":81,"line":1583},[79,3425,3353],{"class":106},[79,3427,3428],{"class":81,"line":1596},[79,3429,142],{"emptyLinePlaceholder":141},[79,3431,3432,3434],{"class":81,"line":1608},[79,3433,1668],{"class":99},[79,3435,3436],{"class":106}," LaunchDescription([\n",[79,3438,3439],{"class":81,"line":1621},[79,3440,3441],{"class":106},"        use_sim_time_arg,\n",[79,3443,3444],{"class":81,"line":1626},[79,3445,3446],{"class":106},"        resolution_arg,\n",[79,3448,3449],{"class":81,"line":1637},[79,3450,3451],{"class":106},"        cartographer_node,\n",[79,3453,3454],{"class":81,"line":1642},[79,3455,3456],{"class":106},"        cartographer_occupancy_grid_node,\n",[79,3458,3459],{"class":81,"line":1648},[79,3460,3461],{"class":106},"    ])\n",[19,3463,1674,3464,540,3466,3468,3469,3472,3473,3476,3477,3479,3480,3482,3483,1693],{},[76,3465,2767],{},[76,3467,2770],{}," nodes from ",[76,3470,3471],{},"cartographer_ros",", and reads a configuration file named ",[76,3474,3475],{},"mycar.lua"," from the ",[76,3478,1270],{}," directory of the current package. This configuration file does not exist yet, so you need to create a new ",[76,3481,3475],{}," file in the ",[76,3484,1270],{},[70,3486,3490],{"className":3487,"code":3488,"language":3489,"meta":33,"style":33},"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",[76,3491,3492,3503,3513,3517,3527,3537,3547,3563,3578,3593,3608,3623,3638,3652,3666,3680,3695,3710,3724,3738,3753,3768,3783,3798,3813,3828,3842,3857,3871,3876,3880,3895,3899,3915,3930,3945,3959,3973,4001,4005,4026,4045,4049,4054,4058],{"__ignoreMap":33},[79,3493,3494,3497,3500],{"class":81,"line":82},[79,3495,3496],{"class":1251},"include",[79,3498,3499],{"class":89}," \"map_builder.lua\" ",[79,3501,3502],{"class":148},"-- 地图构建器\n",[79,3504,3505,3507,3510],{"class":81,"line":116},[79,3506,3496],{"class":1251},[79,3508,3509],{"class":89}," \"trajectory_builder.lua\" ",[79,3511,3512],{"class":148},"-- 轨迹构建器\n",[79,3514,3515],{"class":81,"line":138},[79,3516,142],{"emptyLinePlaceholder":141},[79,3518,3519,3522,3524],{"class":81,"line":145},[79,3520,3521],{"class":106},"options ",[79,3523,1381],{"class":99},[79,3525,3526],{"class":106}," {\n",[79,3528,3529,3532,3534],{"class":81,"line":152},[79,3530,3531],{"class":106},"  map_builder ",[79,3533,1381],{"class":99},[79,3535,3536],{"class":106}," MAP_BUILDER,\n",[79,3538,3539,3542,3544],{"class":81,"line":164},[79,3540,3541],{"class":106},"  trajectory_builder ",[79,3543,1381],{"class":99},[79,3545,3546],{"class":106}," TRAJECTORY_BUILDER,\n",[79,3548,3549,3552,3554,3557,3560],{"class":81,"line":176},[79,3550,3551],{"class":106},"  map_frame ",[79,3553,1381],{"class":99},[79,3555,3556],{"class":89}," \"map\"",[79,3558,3559],{"class":106},",  ",[79,3561,3562],{"class":148},"-- 地图坐标系\n",[79,3564,3565,3568,3570,3573,3575],{"class":81,"line":181},[79,3566,3567],{"class":106},"  tracking_frame ",[79,3569,1381],{"class":99},[79,3571,3572],{"class":89}," \"base_link\"",[79,3574,1500],{"class":106},[79,3576,3577],{"class":148},"-- 跟踪的坐标系，可以是基坐标系、雷达或imu的坐标系\n",[79,3579,3580,3583,3585,3588,3590],{"class":81,"line":187},[79,3581,3582],{"class":106},"  published_frame ",[79,3584,1381],{"class":99},[79,3586,3587],{"class":89}," \"odom\"",[79,3589,1500],{"class":106},[79,3591,3592],{"class":148},"-- cartographer发布的位姿（pose）的坐标系\n",[79,3594,3595,3598,3600,3603,3605],{"class":81,"line":199},[79,3596,3597],{"class":106},"  odom_frame ",[79,3599,1381],{"class":99},[79,3601,3602],{"class":89}," \"carto_odom\"",[79,3604,3559],{"class":106},[79,3606,3607],{"class":148},"-- cartographer 计算后优化的里程计，并非机器人本身里程计\n",[79,3609,3610,3613,3615,3618,3620],{"class":81,"line":1393},[79,3611,3612],{"class":106},"  provide_odom_frame ",[79,3614,1381],{"class":99},[79,3616,3617],{"class":1251}," false",[79,3619,1500],{"class":106},[79,3621,3622],{"class":148},"-- 是否发布cartographer的里程计\n",[79,3624,3625,3628,3630,3633,3635],{"class":81,"line":1408},[79,3626,3627],{"class":106},"  publish_frame_projected_to_2d ",[79,3629,1381],{"class":99},[79,3631,3632],{"class":1251}," true",[79,3634,1500],{"class":106},[79,3636,3637],{"class":148},"-- 是否转换成2d(无俯仰、滚动的情况下为 true)\n",[79,3639,3640,3643,3645,3647,3649],{"class":81,"line":1413},[79,3641,3642],{"class":106},"  use_odometry ",[79,3644,1381],{"class":99},[79,3646,3632],{"class":1251},[79,3648,1500],{"class":106},[79,3650,3651],{"class":148},"-- 是否订阅里程计数据\n",[79,3653,3654,3657,3659,3661,3663],{"class":81,"line":1424},[79,3655,3656],{"class":106},"  use_nav_sat ",[79,3658,1381],{"class":99},[79,3660,3617],{"class":1251},[79,3662,1500],{"class":106},[79,3664,3665],{"class":148},"-- 是否订阅GPS\n",[79,3667,3668,3671,3673,3675,3677],{"class":81,"line":1433},[79,3669,3670],{"class":106},"  use_landmarks ",[79,3672,1381],{"class":99},[79,3674,3617],{"class":1251},[79,3676,1500],{"class":106},[79,3678,3679],{"class":148},"-- 是否订阅路标\n",[79,3681,3682,3685,3687,3690,3692],{"class":81,"line":1447},[79,3683,3684],{"class":106},"  num_laser_scans ",[79,3686,1381],{"class":99},[79,3688,3689],{"class":1251}," 1",[79,3691,1500],{"class":106},[79,3693,3694],{"class":148},"-- 订阅的雷达的数量\n",[79,3696,3697,3700,3702,3705,3707],{"class":81,"line":1460},[79,3698,3699],{"class":106},"  num_multi_echo_laser_scans ",[79,3701,1381],{"class":99},[79,3703,3704],{"class":1251}," 0",[79,3706,1500],{"class":106},[79,3708,3709],{"class":148},"-- 订阅的多层回波激光雷达数量\n",[79,3711,3712,3715,3717,3719,3721],{"class":81,"line":1470},[79,3713,3714],{"class":106},"  num_subdivisions_per_laser_scan ",[79,3716,1381],{"class":99},[79,3718,3689],{"class":1251},[79,3720,1500],{"class":106},[79,3722,3723],{"class":148},"-- 将激光雷达的数据拆分成多少部分发布\n",[79,3725,3726,3729,3731,3733,3735],{"class":81,"line":1478},[79,3727,3728],{"class":106},"  num_point_clouds ",[79,3730,1381],{"class":99},[79,3732,3704],{"class":1251},[79,3734,1500],{"class":106},[79,3736,3737],{"class":148},"-- 订阅多线激光雷达的数量\n",[79,3739,3740,3743,3745,3748,3750],{"class":81,"line":1494},[79,3741,3742],{"class":106},"  lookup_transform_timeout_sec ",[79,3744,1381],{"class":99},[79,3746,3747],{"class":1251}," 1.5",[79,3749,1500],{"class":106},[79,3751,3752],{"class":148},"-- 坐标变换超时时间\n",[79,3754,3755,3758,3760,3763,3765],{"class":81,"line":1508},[79,3756,3757],{"class":106},"  submap_publish_period_sec ",[79,3759,1381],{"class":99},[79,3761,3762],{"class":1251}," 0.5",[79,3764,1500],{"class":106},[79,3766,3767],{"class":148},"-- 发布子图的时间间隔\n",[79,3769,3770,3773,3775,3778,3780],{"class":81,"line":1520},[79,3771,3772],{"class":106},"  pose_publish_period_sec ",[79,3774,1381],{"class":99},[79,3776,3777],{"class":1251}," 5e-3",[79,3779,1500],{"class":106},[79,3781,3782],{"class":148},"-- 发布pose的时间间隔\n",[79,3784,3785,3788,3790,3793,3795],{"class":81,"line":1525},[79,3786,3787],{"class":106},"  trajectory_publish_period_sec ",[79,3789,1381],{"class":99},[79,3791,3792],{"class":1251}," 30e-3",[79,3794,1500],{"class":106},[79,3796,3797],{"class":148},"-- 发布轨迹的时间间隔\n",[79,3799,3800,3803,3805,3808,3810],{"class":81,"line":1536},[79,3801,3802],{"class":106},"  rangefinder_sampling_ratio ",[79,3804,1381],{"class":99},[79,3806,3807],{"class":1251}," 1.",[79,3809,1500],{"class":106},[79,3811,3812],{"class":148},"-- 雷达采样比例\n",[79,3814,3815,3818,3820,3823,3825],{"class":81,"line":1547},[79,3816,3817],{"class":106},"  odometry_sampling_ratio ",[79,3819,1381],{"class":99},[79,3821,3822],{"class":1251}," 0.8",[79,3824,1500],{"class":106},[79,3826,3827],{"class":148},"-- 里程计采样比例(如果里程计精度低，可以减小该设置值)\n",[79,3829,3830,3833,3835,3837,3839],{"class":81,"line":1553},[79,3831,3832],{"class":106},"  fixed_frame_pose_sampling_ratio ",[79,3834,1381],{"class":99},[79,3836,3807],{"class":1251},[79,3838,1500],{"class":106},[79,3840,3841],{"class":148},"-- 参考坐标系采样比例\n",[79,3843,3844,3847,3849,3851,3854],{"class":81,"line":1564},[79,3845,3846],{"class":106},"  imu_sampling_ratio ",[79,3848,1381],{"class":99},[79,3850,3807],{"class":1251},[79,3852,3853],{"class":106},",",[79,3855,3856],{"class":148},"-- imu采样比例\n",[79,3858,3859,3862,3864,3866,3868],{"class":81,"line":1570},[79,3860,3861],{"class":106},"  landmarks_sampling_ratio ",[79,3863,1381],{"class":99},[79,3865,3807],{"class":1251},[79,3867,1500],{"class":106},[79,3869,3870],{"class":148},"-- 路标采样比例\n",[79,3872,3873],{"class":81,"line":1583},[79,3874,3875],{"class":106},"}\n",[79,3877,3878],{"class":81,"line":1596},[79,3879,142],{"emptyLinePlaceholder":141},[79,3881,3882,3885,3888,3890,3892],{"class":81,"line":1608},[79,3883,3884],{"class":106},"MAP_BUILDER.",[79,3886,3887],{"class":85},"use_trajectory_builder_2d",[79,3889,3215],{"class":99},[79,3891,3632],{"class":1251},[79,3893,3894],{"class":148}," -- 启用2D轨迹构建器\n",[79,3896,3897],{"class":81,"line":1621},[79,3898,142],{"emptyLinePlaceholder":141},[79,3900,3901,3904,3907,3909,3912],{"class":81,"line":1626},[79,3902,3903],{"class":106},"TRAJECTORY_BUILDER_2D.",[79,3905,3906],{"class":85},"min_range",[79,3908,3215],{"class":99},[79,3910,3911],{"class":1251}," 0.15",[79,3913,3914],{"class":148}," -- 最小雷达有效距离\n",[79,3916,3917,3919,3922,3924,3927],{"class":81,"line":1637},[79,3918,3903],{"class":106},[79,3920,3921],{"class":85},"max_range",[79,3923,3215],{"class":99},[79,3925,3926],{"class":1251}," 6.0",[79,3928,3929],{"class":148}," -- 最大雷达有效距离\n",[79,3931,3932,3934,3937,3939,3942],{"class":81,"line":1642},[79,3933,3903],{"class":106},[79,3935,3936],{"class":85},"missing_data_ray_length",[79,3938,3215],{"class":99},[79,3940,3941],{"class":1251}," 3.",[79,3943,3944],{"class":148}," -- 缺失数据的射线长度\n",[79,3946,3947,3949,3952,3954,3956],{"class":81,"line":1648},[79,3948,3903],{"class":106},[79,3950,3951],{"class":85},"use_imu_data",[79,3953,3215],{"class":99},[79,3955,3617],{"class":1251},[79,3957,3958],{"class":148}," -- 是否使用 imu 数据\n",[79,3960,3961,3963,3966,3968,3970],{"class":81,"line":1654},[79,3962,3903],{"class":106},[79,3964,3965],{"class":85},"use_online_correlative_scan_matching",[79,3967,3215],{"class":99},[79,3969,3632],{"class":1251},[79,3971,3972],{"class":148}," -- 是否使用在线相关扫描匹配\n",[79,3974,3975,3977,3980,3982,3985,3987,3990,3993,3995,3998],{"class":81,"line":1660},[79,3976,3903],{"class":106},[79,3978,3979],{"class":85},"motion_filter",[79,3981,934],{"class":106},[79,3983,3984],{"class":85},"max_angle_radians",[79,3986,3215],{"class":99},[79,3988,3989],{"class":1251}," math.rad",[79,3991,3992],{"class":106},"(",[79,3994,2044],{"class":1251},[79,3996,3997],{"class":106},") ",[79,3999,4000],{"class":148},"-- 运动滤波器的最大角度限制（以弧度为单位）\n",[79,4002,4003],{"class":81,"line":1665},[79,4004,142],{"emptyLinePlaceholder":141},[79,4006,4007,4010,4013,4015,4018,4020,4023],{"class":81,"line":2060},[79,4008,4009],{"class":106},"POSE_GRAPH.",[79,4011,4012],{"class":85},"constraint_builder",[79,4014,934],{"class":106},[79,4016,4017],{"class":85},"min_score",[79,4019,3215],{"class":99},[79,4021,4022],{"class":1251}," 0.65",[79,4024,4025],{"class":148}," -- 建约束时的最小分数\n",[79,4027,4028,4030,4032,4034,4037,4039,4042],{"class":81,"line":2071},[79,4029,4009],{"class":106},[79,4031,4012],{"class":85},[79,4033,934],{"class":106},[79,4035,4036],{"class":85},"global_localization_min_score",[79,4038,3215],{"class":99},[79,4040,4041],{"class":1251}," 0.7",[79,4043,4044],{"class":148}," -- 全局定位时的最小分数\n",[79,4046,4047],{"class":81,"line":2084},[79,4048,142],{"emptyLinePlaceholder":141},[79,4050,4051],{"class":81,"line":2098},[79,4052,4053],{"class":148},"-- POSE_GRAPH.optimize_every_n_nodes = 0\n",[79,4055,4056],{"class":81,"line":2111},[79,4057,142],{"emptyLinePlaceholder":141},[79,4059,4060,4063],{"class":81,"line":2125},[79,4061,4062],{"class":99},"return",[79,4064,4065],{"class":106}," options\n",[19,4067,2321],{},[316,4069,4070],{"start":138},[50,4071,2326],{},[19,4073,2329,4074,2333],{},[76,4075,2332],{},[70,4077,4078],{"className":2336,"code":2337,"language":2338,"meta":33,"style":33},[76,4079,4080,4086,4092],{"__ignoreMap":33},[79,4081,4082,4084],{"class":81,"line":82},[79,4083,2345],{"class":99},[79,4085,2348],{"class":106},[79,4087,4088,4090],{"class":81,"line":116},[79,4089,2353],{"class":106},[79,4091,2356],{"class":99},[79,4093,4094],{"class":81,"line":138},[79,4095,1390],{"class":106},[316,4097,4098],{"start":145},[50,4099,2365],{},[19,4101,2368],{},[70,4103,4105],{"className":72,"code":4104,"language":74,"meta":33,"style":33},"colcon build --packages-select mycar_slam_cartographer\n",[76,4106,4107],{"__ignoreMap":33},[79,4108,4109,4111,4113,4115],{"class":81,"line":82},[79,4110,2378],{"class":85},[79,4112,2381],{"class":89},[79,4114,2384],{"class":1251},[79,4116,4117],{"class":89}," mycar_slam_cartographer\n",[316,4119,4120],{"start":152},[50,4121,2392],{},[19,4123,4124],{},"(1) First, call the following command to start the simulation environment:",[70,4126,4127],{"className":72,"code":2400,"language":74,"meta":33,"style":33},[76,4128,4129,4135],{"__ignoreMap":33},[79,4130,4131,4133],{"class":81,"line":82},[79,4132,934],{"class":1251},[79,4134,2409],{"class":89},[79,4136,4137,4139,4141,4143],{"class":81,"line":116},[79,4138,1239],{"class":85},[79,4140,2416],{"class":89},[79,4142,2419],{"class":89},[79,4144,2422],{"class":89},[19,4146,4147],{},"(2) Then, in the terminal, navigate to the current workspace and enter the following command:",[70,4149,4151],{"className":72,"code":4150,"language":74,"meta":33,"style":33},". install/setup.bash\nros2 launch mycar_slam_cartographer cartographer.launch.py use_sim_time:=True\n",[76,4152,4153,4159],{"__ignoreMap":33},[79,4154,4155,4157],{"class":81,"line":82},[79,4156,934],{"class":1251},[79,4158,2409],{"class":89},[79,4160,4161,4163,4165,4167,4170],{"class":81,"line":116},[79,4162,1239],{"class":85},[79,4164,2416],{"class":89},[79,4166,3098],{"class":89},[79,4168,4169],{"class":89}," cartographer.launch.py",[79,4171,2452],{"class":89},[19,4173,4174],{},"(3) Start rviz2, set Fixed Frame to map, add the map plugin and set the topic to /map. The created map will then be displayed, and as the robot moves, the map will update accordingly.",[19,4176,4177],{},[31,4178],{"alt":33,"src":4179},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1749.webp",[19,4181,4182],{},[31,4183],{"alt":33,"src":4184},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1750.webp",[19,4186,4187],{},[31,4188],{"alt":33,"src":4189},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1751.webp",[10,4191,4193],{"id":4192},"map-service","Map service",[19,4195,4196,4197,934],{},"During SLAM mapping, map data is stored in memory, which means that once the node is shut down, the data is also released. A more reasonable implementation would be to serialize the constructed map to disk for persistent storage, and later deserialize the map data from disk for other operations. In Nav2, the relevant packages for map serialization and deserialization have already been encapsulated. The package is: ",[76,4198,4199],{},"nav2_map_server",[19,4201,4202,4203,4205,4206,4208,4209,540,4212,4215,4216,4218,4219,4221],{},"In ",[76,4204,4199],{},", you can interact with the rest of the Nav2 system through topics and service interfaces. Under the ",[76,4207,4199],{}," package, there are two important nodes: ",[76,4210,4211],{},"map_saver_cli",[76,4213,4214],{},"map_server",". The ",[76,4217,4211],{}," node can be used to save the map, while the ",[76,4220,4214],{}," node displays the map at startup.",[15,4223,4225],{"id":4224},"save-the-map-serialization","Save the map (serialization)",[4227,4228,4230],"h5",{"id":4229},"map-saving-node-description","Map Saving Node Description",[19,4232,4233,4234,4236,4237,4240],{},"The map saving node in ",[76,4235,4199],{}," is ",[76,4238,4239],{},"map_saver_server",". The relevant information about this node is as follows.",[316,4242,4243],{},[50,4244,555],{},[557,4246,4247,4258],{},[560,4248,4249],{},[563,4250,4251,4253,4256],{},[566,4252,569],{"align":568},[566,4254,4255],{"align":568},"interface",[566,4257,575],{"align":568},[577,4259,4260],{},[563,4261,4262,4264,4266],{},[582,4263,709],{"align":568},[582,4265,712],{"align":568},[582,4267,4268],{"align":568},"Map data published by the SLAM node",[316,4270,4271],{"start":116},[50,4272,849],{},[47,4274,4275,4281,4287,4293],{},[50,4276,4277,4280],{},[22,4278,4279],{},"save_map_timeout"," The maximum wait time for the save map operation.",[50,4282,4283,4286],{},[22,4284,4285],{},"free_thresh_default"," The probability threshold below which a grid cell is considered unoccupied.",[50,4288,4289,4292],{},[22,4290,4291],{},"occupied_thresh_default"," The probability threshold at which a grid cell is considered occupied.",[50,4294,4295,4298],{},[22,4296,4297],{},"map_subscribe_transient_local"," Messages are not retained after node restart, default is true.",[316,4300,4301],{"start":138},[50,4302,4211],{},[19,4304,4305,4306,4308,4309,4311,4312,4314],{},"Additionally, for ease of use, an executable program called ",[76,4307,4211],{}," has been wrapped on top of ",[76,4310,4239],{},". It allows for more convenient configuration of map-saving related data via actual parameters, and subsequent execution also calls ",[76,4313,4211],{},". Its actual parameter list is as follows:",[47,4316,4317,4323,4329,4334,4340,4346],{},[50,4318,4319,4322],{},[22,4320,4321],{},"-t"," The map topic being subscribed to.",[50,4324,4325,4328],{},[22,4326,4327],{},"-f"," Map storage path.",[50,4330,4331,4292],{},[22,4332,4333],{},"--occ",[50,4335,4336,4339],{},[22,4337,4338],{},"--free"," The probability threshold at which a grid cell is considered unoccupied.",[50,4341,4342,4345],{},[22,4343,4344],{},"--fmt"," Image format.",[50,4347,4348,4351],{},[22,4349,4350],{},"--mode"," Map mode: trinary (default), scale, or raw.",[4227,4353,4355],{"id":4354},"basic-map-saving-operations","Basic Map Saving Operations",[19,4357,4358],{},[22,4359,4360],{},"Preparation",[19,4362,4363],{},"Please start the simulation or the physical robot first, then launch the SLAM-related nodes to implement basic mapping functionality.",[19,4365,4366],{},[22,4367,4368],{},"Save the Map",[19,4370,4371],{},"SLAM mapping is complete. In the terminal, navigate to the workspace and run the following command to save the map:",[70,4373,4375],{"className":72,"code":4374,"language":74,"meta":33,"style":33},"ros2 run nav2_map_server map_saver_cli -f map/my_map\n",[76,4376,4377],{"__ignoreMap":33},[79,4378,4379,4381,4384,4387,4390,4393],{"class":81,"line":82},[79,4380,1239],{"class":85},[79,4382,4383],{"class":89}," run",[79,4385,4386],{"class":89}," nav2_map_server",[79,4388,4389],{"class":89}," map_saver_cli",[79,4391,4392],{"class":1251}," -f",[79,4394,4395],{"class":89}," map/my_map\n",[19,4397,4398,4399,4403,4404,540,4407,934],{},"The above command will subscribe to the /map topic and save the data from the /map topic as files. In the map directory under the workspace (",[4400,4401,4402],"em",{},"you need to create this directory yourself, otherwise an exception will be thrown","), two files will be generated, named: ",[76,4405,4406],{},"my_map.yaml",[76,4408,4409],{},"my_map.pgm",[19,4411,4412],{},[31,4413],{"alt":33,"src":4414},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1752.webp",[19,4416,4417],{},[31,4418],{"alt":33,"src":4419},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1753.webp",[4227,4421,4423],{"id":4422},"map-interface","Map interface",[19,4425,4426],{},"In Nav2, there are two main interfaces related to maps:",[47,4428,4429,4435],{},[50,4430,4431,4434],{},[22,4432,4433],{},"nav_msgs/msg/MapMetaData"," Map metadata, including the map's width, height, resolution, and other properties.",[50,4436,4437,4439],{},[22,4438,712],{}," map grid data, typically displayed graphically in RViz.",[19,4441,4442],{},[22,4443,4433],{},[19,4445,4446,4447,4450],{},"Call the command ",[76,4448,4449],{},"ros2 interface show nav_msgs/msg/MapMetaData"," to view the interface format, which displays the following content (comments have been localized):",[70,4452,4454],{"className":72,"code":4453,"language":74,"meta":33,"style":33},"\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",[76,4455,4456,4460,4465,4469,4474,4482,4490,4498,4502,4507,4515,4519,4524,4532,4536,4541,4548,4552,4557,4565,4573,4581,4588,4595,4603,4613,4622,4631],{"__ignoreMap":33},[79,4457,4458],{"class":81,"line":82},[79,4459,142],{"emptyLinePlaceholder":141},[79,4461,4462],{"class":81,"line":116},[79,4463,4464],{"class":148},"# 它包含了关于OccupancyGrid特性的基本信息\n",[79,4466,4467],{"class":81,"line":138},[79,4468,142],{"emptyLinePlaceholder":141},[79,4470,4471],{"class":81,"line":145},[79,4472,4473],{"class":148},"# 地图加载时间\n",[79,4475,4476,4479],{"class":81,"line":152},[79,4477,4478],{"class":85},"builtin_interfaces/Time",[79,4480,4481],{"class":89}," map_load_time\n",[79,4483,4484,4487],{"class":81,"line":164},[79,4485,4486],{"class":85},"        int32",[79,4488,4489],{"class":89}," sec\n",[79,4491,4492,4495],{"class":81,"line":176},[79,4493,4494],{"class":85},"        uint32",[79,4496,4497],{"class":89}," nanosec\n",[79,4499,4500],{"class":81,"line":181},[79,4501,142],{"emptyLinePlaceholder":141},[79,4503,4504],{"class":81,"line":187},[79,4505,4506],{"class":148},"# 地图分辨率 [米/像素]\n",[79,4508,4509,4512],{"class":81,"line":199},[79,4510,4511],{"class":85},"float32",[79,4513,4514],{"class":89}," resolution\n",[79,4516,4517],{"class":81,"line":1393},[79,4518,142],{"emptyLinePlaceholder":141},[79,4520,4521],{"class":81,"line":1408},[79,4522,4523],{"class":148},"# 地图宽度 [像素]\n",[79,4525,4526,4529],{"class":81,"line":1413},[79,4527,4528],{"class":85},"uint32",[79,4530,4531],{"class":89}," width\n",[79,4533,4534],{"class":81,"line":1424},[79,4535,142],{"emptyLinePlaceholder":141},[79,4537,4538],{"class":81,"line":1433},[79,4539,4540],{"class":148},"# 地图高度 [像素]\n",[79,4542,4543,4545],{"class":81,"line":1447},[79,4544,4528],{"class":85},[79,4546,4547],{"class":89}," height\n",[79,4549,4550],{"class":81,"line":1460},[79,4551,142],{"emptyLinePlaceholder":141},[79,4553,4554],{"class":81,"line":1470},[79,4555,4556],{"class":148},"#地图的原点坐标[米，米，弧度]。这是地图中单元格(0,0)左下角在现实世界中的位置和方向。\n",[79,4558,4559,4562],{"class":81,"line":1478},[79,4560,4561],{"class":85},"geometry_msgs/Pose",[79,4563,4564],{"class":89}," origin\n",[79,4566,4567,4570],{"class":81,"line":1494},[79,4568,4569],{"class":85},"        Point",[79,4571,4572],{"class":89}," position\n",[79,4574,4575,4578],{"class":81,"line":1508},[79,4576,4577],{"class":85},"                float64",[79,4579,4580],{"class":89}," x\n",[79,4582,4583,4585],{"class":81,"line":1520},[79,4584,4577],{"class":85},[79,4586,4587],{"class":89}," y\n",[79,4589,4590,4592],{"class":81,"line":1525},[79,4591,4577],{"class":85},[79,4593,4594],{"class":89}," z\n",[79,4596,4597,4600],{"class":81,"line":1536},[79,4598,4599],{"class":85},"        Quaternion",[79,4601,4602],{"class":89}," orientation\n",[79,4604,4605,4607,4610],{"class":81,"line":1547},[79,4606,4577],{"class":85},[79,4608,4609],{"class":89}," x",[79,4611,4612],{"class":1251}," 0\n",[79,4614,4615,4617,4620],{"class":81,"line":1553},[79,4616,4577],{"class":85},[79,4618,4619],{"class":89}," y",[79,4621,4612],{"class":1251},[79,4623,4624,4626,4629],{"class":81,"line":1564},[79,4625,4577],{"class":85},[79,4627,4628],{"class":89}," z",[79,4630,4612],{"class":1251},[79,4632,4633,4635,4638],{"class":81,"line":1570},[79,4634,4577],{"class":85},[79,4636,4637],{"class":89}," w",[79,4639,4640],{"class":1251}," 1\n",[19,4642,4643],{},[22,4644,712],{},[19,4646,4446,4647,4450],{},[76,4648,4649],{},"ros2 interface show nav_msgs/msg/OccupancyGrid",[70,4651,4653],{"className":72,"code":4652,"language":74,"meta":33,"style":33},"\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",[76,4654,4655,4659,4664,4672,4680,4687,4694,4702,4706,4711,4719,4725,4731,4737,4744,4750,4756,4763,4770,4777,4783,4789,4796,4804,4812,4820,4828,4832,4837,4841,4846,4850,4855,4859,4864,4868,4873,4877,4882,4886,4891,4895,4900,4904,4909,4913,4918,4922,4927],{"__ignoreMap":33},[79,4656,4657],{"class":81,"line":82},[79,4658,142],{"emptyLinePlaceholder":141},[79,4660,4661],{"class":81,"line":116},[79,4662,4663],{"class":148},"# 它代表一个二维网格地图。\n",[79,4665,4666,4669],{"class":81,"line":138},[79,4667,4668],{"class":85},"std_msgs/Header",[79,4670,4671],{"class":89}," header\n",[79,4673,4674,4677],{"class":81,"line":145},[79,4675,4676],{"class":85},"        builtin_interfaces/Time",[79,4678,4679],{"class":89}," stamp\n",[79,4681,4682,4685],{"class":81,"line":152},[79,4683,4684],{"class":85},"                int32",[79,4686,4489],{"class":89},[79,4688,4689,4692],{"class":81,"line":164},[79,4690,4691],{"class":85},"                uint32",[79,4693,4497],{"class":89},[79,4695,4696,4699],{"class":81,"line":176},[79,4697,4698],{"class":85},"        string",[79,4700,4701],{"class":89}," frame_id\n",[79,4703,4704],{"class":81,"line":181},[79,4705,142],{"emptyLinePlaceholder":141},[79,4707,4708],{"class":81,"line":187},[79,4709,4710],{"class":148},"# 地图元数据\n",[79,4712,4713,4716],{"class":81,"line":199},[79,4714,4715],{"class":85},"MapMetaData",[79,4717,4718],{"class":89}," info\n",[79,4720,4721,4723],{"class":81,"line":1393},[79,4722,4676],{"class":85},[79,4724,4481],{"class":89},[79,4726,4727,4729],{"class":81,"line":1408},[79,4728,4684],{"class":85},[79,4730,4489],{"class":89},[79,4732,4733,4735],{"class":81,"line":1413},[79,4734,4691],{"class":85},[79,4736,4497],{"class":89},[79,4738,4739,4742],{"class":81,"line":1424},[79,4740,4741],{"class":85},"        float32",[79,4743,4514],{"class":89},[79,4745,4746,4748],{"class":81,"line":1433},[79,4747,4494],{"class":85},[79,4749,4531],{"class":89},[79,4751,4752,4754],{"class":81,"line":1447},[79,4753,4494],{"class":85},[79,4755,4547],{"class":89},[79,4757,4758,4761],{"class":81,"line":1460},[79,4759,4760],{"class":85},"        geometry_msgs/Pose",[79,4762,4564],{"class":89},[79,4764,4765,4768],{"class":81,"line":1470},[79,4766,4767],{"class":85},"                Point",[79,4769,4572],{"class":89},[79,4771,4772,4775],{"class":81,"line":1478},[79,4773,4774],{"class":85},"                        float64",[79,4776,4580],{"class":89},[79,4778,4779,4781],{"class":81,"line":1494},[79,4780,4774],{"class":85},[79,4782,4587],{"class":89},[79,4784,4785,4787],{"class":81,"line":1508},[79,4786,4774],{"class":85},[79,4788,4594],{"class":89},[79,4790,4791,4794],{"class":81,"line":1520},[79,4792,4793],{"class":85},"                Quaternion",[79,4795,4602],{"class":89},[79,4797,4798,4800,4802],{"class":81,"line":1525},[79,4799,4774],{"class":85},[79,4801,4609],{"class":89},[79,4803,4612],{"class":1251},[79,4805,4806,4808,4810],{"class":81,"line":1536},[79,4807,4774],{"class":85},[79,4809,4619],{"class":89},[79,4811,4612],{"class":1251},[79,4813,4814,4816,4818],{"class":81,"line":1547},[79,4815,4774],{"class":85},[79,4817,4628],{"class":89},[79,4819,4612],{"class":1251},[79,4821,4822,4824,4826],{"class":81,"line":1553},[79,4823,4774],{"class":85},[79,4825,4637],{"class":89},[79,4827,4640],{"class":1251},[79,4829,4830],{"class":81,"line":1564},[79,4831,142],{"emptyLinePlaceholder":141},[79,4833,4834],{"class":81,"line":1570},[79,4835,4836],{"class":148},"# 地图数据按照行优先的顺序进行排列，\n",[79,4838,4839],{"class":81,"line":1583},[79,4840,142],{"emptyLinePlaceholder":141},[79,4842,4843],{"class":81,"line":1596},[79,4844,4845],{"class":148},"# 这意味着首先填充第一行的所有单元格，\n",[79,4847,4848],{"class":81,"line":1608},[79,4849,142],{"emptyLinePlaceholder":141},[79,4851,4852],{"class":81,"line":1621},[79,4853,4854],{"class":148},"# 然后填充第二行，依此类推。\n",[79,4856,4857],{"class":81,"line":1626},[79,4858,142],{"emptyLinePlaceholder":141},[79,4860,4861],{"class":81,"line":1637},[79,4862,4863],{"class":148},"# 起始单元格是(0,0)，也就是地图的左上角。\n",[79,4865,4866],{"class":81,"line":1642},[79,4867,142],{"emptyLinePlaceholder":141},[79,4869,4870],{"class":81,"line":1648},[79,4871,4872],{"class":148},"# 单元格(1, 0)紧接着(0,0)，是x方向上紧邻的下一个单元格。\n",[79,4874,4875],{"class":81,"line":1654},[79,4876,142],{"emptyLinePlaceholder":141},[79,4878,4879],{"class":81,"line":1660},[79,4880,4881],{"class":148},"# 而单元格(0, 1)则位于第一行的第二个位置，其索引等于地图的宽度（info.width），\n",[79,4883,4884],{"class":81,"line":1665},[79,4885,142],{"emptyLinePlaceholder":141},[79,4887,4888],{"class":81,"line":2060},[79,4889,4890],{"class":148},"# 然后才是(1, 1)单元格，即第二行的第二个单元格。\n",[79,4892,4893],{"class":81,"line":2071},[79,4894,142],{"emptyLinePlaceholder":141},[79,4896,4897],{"class":81,"line":2084},[79,4898,4899],{"class":148},"# 关于地图数据的值，它们根据具体的应用需求来定义。但在很多情况下，\n",[79,4901,4902],{"class":81,"line":2098},[79,4903,142],{"emptyLinePlaceholder":141},[79,4905,4906],{"class":81,"line":2111},[79,4907,4908],{"class":148},"# 会使用0表示该单元格是未占用的，即机器人可以安全通过；\n",[79,4910,4911],{"class":81,"line":2125},[79,4912,142],{"emptyLinePlaceholder":141},[79,4914,4915],{"class":81,"line":2136},[79,4916,4917],{"class":148},"# 1表示该单元格是确定占用的，即存在障碍物；\n",[79,4919,4920],{"class":81,"line":2141},[79,4921,142],{"emptyLinePlaceholder":141},[79,4923,4924],{"class":81,"line":2151},[79,4925,4926],{"class":148},"# 而-1表示该单元格的状态是未知的，即机器人尚未探测到该区域的状态。\n",[79,4928,4929,4932],{"class":81,"line":2162},[79,4930,4931],{"class":85},"int8[]",[79,4933,4934],{"class":89}," data\n",[4227,4936,4938],{"id":4937},"map-storage-format","Map Storage Format",[19,4940,1222,4941,4943,4944,4946,4947,4949],{},[22,4942,4355],{}," section, after the map is saved, two files are generated. These two files are used to store the serialized map data. Among them, ",[76,4945,4409],{}," is an image resource that can be opened with an image viewer, while ",[76,4948,4406],{}," stores the metadata information of the map, used to describe the image. The content format is as follows:",[70,4951,4953],{"className":1696,"code":4952,"language":1698,"meta":33,"style":33},"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",[76,4954,4955,4965,4974,4982,5006,5016,5026],{"__ignoreMap":33},[79,4956,4957,4960,4962],{"class":81,"line":82},[79,4958,4959],{"class":1705},"image",[79,4961,1723],{"class":106},[79,4963,4964],{"class":89},"my_map.pgm\n",[79,4966,4967,4969,4971],{"class":81,"line":116},[79,4968,897],{"class":1705},[79,4970,1723],{"class":106},[79,4972,4973],{"class":89},"trinary\n",[79,4975,4976,4978,4980],{"class":81,"line":138},[79,4977,1011],{"class":1705},[79,4979,1723],{"class":106},[79,4981,1909],{"class":1251},[79,4983,4984,4987,4990,4993,4995,4998,5000,5003],{"class":81,"line":145},[79,4985,4986],{"class":1705},"origin",[79,4988,4989],{"class":106},": [",[79,4991,4992],{"class":1251},"-0.955",[79,4994,1500],{"class":106},[79,4996,4997],{"class":1251},"-10.9",[79,4999,1500],{"class":106},[79,5001,5002],{"class":1251},"0",[79,5004,5005],{"class":106},"]\n",[79,5007,5008,5011,5013],{"class":81,"line":152},[79,5009,5010],{"class":1705},"negate",[79,5012,1723],{"class":106},[79,5014,5015],{"class":1251},"0\n",[79,5017,5018,5021,5023],{"class":81,"line":164},[79,5019,5020],{"class":1705},"occupied_thresh",[79,5022,1723],{"class":106},[79,5024,5025],{"class":1251},"0.65\n",[79,5027,5028,5031,5033],{"class":81,"line":176},[79,5029,5030],{"class":1705},"free_thresh",[79,5032,1723],{"class":106},[79,5034,5035],{"class":1251},"0.25\n",[19,5037,5038],{},[22,5039,5040],{},"Parameter Explanation:",[47,5042,5043,5048,5053,5059,5064,5069,5074],{},[50,5044,5045,5047],{},[22,5046,4959],{}," The path to the image resource being described, which can be either an absolute path or a relative path.",[50,5049,5050,5052],{},[22,5051,1011],{}," Image resolution (unit: m/pixel).",[50,5054,5055,5056,5058],{},"The 2D pose of the bottom-left pixel in the ",[22,5057,4986],{}," map is (x, y, z), with yaw representing counterclockwise rotation (yaw = 0 indicates no rotation).",[50,5060,5061,5063],{},[22,5062,5020],{}," Pixels with an occupancy probability greater than this threshold are considered fully occupied.",[50,5065,5066,5068],{},[22,5067,5030],{}," Pixels with occupancy below this threshold are considered completely free.",[50,5070,5071,5073],{},[22,5072,5010],{}," Should the semantics of white/black and free/occupied be inverted.",[50,5075,5076,4351],{},[22,5077,897],{},[15,5079,5081],{"id":5080},"read-the-map-deserialization","Read the map (deserialization)",[4227,5083,5085],{"id":5084},"map-reading-node-description","Map Reading Node Description",[19,5087,4202,5088,5090,5091,5093],{},[76,5089,4199],{},", the map reading node is ",[76,5092,4214],{},". The relevant information for this node is as follows.",[19,5095,5096],{},[22,5097,5098],{},"Published Topics",[557,5100,5101,5111],{},[560,5102,5103],{},[563,5104,5105,5107,5109],{},[566,5106,569],{"align":568},[566,5108,4255],{"align":568},[566,5110,575],{"align":568},[577,5112,5113],{},[563,5114,5115,5117,5119],{},[582,5116,709],{"align":568},[582,5118,712],{"align":568},[582,5120,5121],{"align":568},"map data",[19,5123,5124],{},[22,5125,5126],{},"Parameters",[47,5128,5129,5135,5141],{},[50,5130,5131,5134],{},[22,5132,5133],{},"frame_id"," The name of the map coordinate system.",[50,5136,5137,5140],{},[22,5138,5139],{},"topic_name"," Topic name.",[50,5142,5143,5146],{},[22,5144,5145],{},"yaml_filename"," Map data source.",[4227,5148,5150],{"id":5149},"basic-map-reading-operations","Basic Map Reading Operations",[19,5152,5153],{},[22,5154,4360],{},[19,5156,5157,5158,5160],{},"Please first run the following command to create a package in the ",[76,5159,1225],{}," directory of your workspace:",[70,5162,5164],{"className":72,"code":5163,"language":74,"meta":33,"style":33},"ros2 pkg create mycar_map_server --dependencies nav2_map_server\n",[76,5165,5166],{"__ignoreMap":33},[79,5167,5168,5170,5172,5174,5177,5179],{"class":81,"line":82},[79,5169,1239],{"class":85},[79,5171,1242],{"class":89},[79,5173,1245],{"class":89},[79,5175,5176],{"class":89}," mycar_map_server",[79,5178,1252],{"class":1251},[79,5180,5181],{"class":89}," nav2_map_server\n",[19,5183,1263,5184,5186,5187,5189],{},[76,5185,1266],{}," folder and add the following configuration to ",[76,5188,2332],{},":",[70,5191,5193],{"className":2336,"code":5192,"language":2338,"meta":33,"style":33},"install(DIRECTORY launch DESTINATION share/${PROJECT_NAME})\n",[76,5194,5195],{"__ignoreMap":33},[79,5196,5197,5199,5202,5205],{"class":81,"line":82},[79,5198,2345],{"class":99},[79,5200,5201],{"class":106},"(DIRECTORY launch DESTINATION share/",[79,5203,5204],{"class":99},"${PROJECT_NAME}",[79,5206,1390],{"class":106},[19,5208,5209],{},[31,5210],{"alt":33,"src":5211},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1754.webp",[19,5213,5214],{},[22,5215,5216],{},"Read the Map",[19,5218,5219,5220,5222],{},"When reading a map using ",[76,5221,4214],{},", there are two common approaches: using terminal commands and integrating with a launch file. Both methods produce the same result and can publish map messages as topics.",[70,5224,5226],{"className":72,"code":5225,"language":74,"meta":33,"style":33},"colcon build\nsource ./install/setup.bash\n",[76,5227,5228,5235],{"__ignoreMap":33},[79,5229,5230,5232],{"class":81,"line":82},[79,5231,2378],{"class":85},[79,5233,5234],{"class":89}," build\n",[79,5236,5237,5240],{"class":81,"line":116},[79,5238,5239],{"class":1251},"source",[79,5241,5242],{"class":89}," ./install/setup.bash\n",[19,5244,5245],{},[22,5246,5247],{},"Method 1: Terminal Commands",[19,5249,5250],{},"Please enter the workspace in the terminal and input the following command:",[70,5252,5254],{"className":72,"code":5253,"language":74,"meta":33,"style":33},"ros2 run nav2_map_server map_server --ros-args -p yaml_filename:=map/my_map.yaml\n",[76,5255,5256],{"__ignoreMap":33},[79,5257,5258,5260,5262,5264,5267,5270,5273],{"class":81,"line":82},[79,5259,1239],{"class":85},[79,5261,4383],{"class":89},[79,5263,4386],{"class":89},[79,5265,5266],{"class":89}," map_server",[79,5268,5269],{"class":1251}," --ros-args",[79,5271,5272],{"class":1251}," -p",[79,5274,5275],{"class":89}," yaml_filename:=map/my_map.yaml\n",[19,5277,5278,5279,5281],{},"Since ",[76,5280,4214],{}," is a node with a lifecycle, it still needs to be configured and activated. Please open a new terminal and run the following command:",[70,5283,5285],{"className":72,"code":5284,"language":74,"meta":33,"style":33},"ros2 lifecycle set /map_server configure\nros2 lifecycle set /map_server activate\n",[76,5286,5287,5303],{"__ignoreMap":33},[79,5288,5289,5291,5294,5297,5300],{"class":81,"line":82},[79,5290,1239],{"class":85},[79,5292,5293],{"class":89}," lifecycle",[79,5295,5296],{"class":89}," set",[79,5298,5299],{"class":89}," /map_server",[79,5301,5302],{"class":89}," configure\n",[79,5304,5305,5307,5309,5311,5313],{"class":81,"line":116},[79,5306,1239],{"class":85},[79,5308,5293],{"class":89},[79,5310,5296],{"class":89},[79,5312,5299],{"class":89},[79,5314,5315],{"class":89}," activate\n",[19,5317,5318,5319,5322,5323,5325],{},"If execution completes without errors, call ",[76,5320,5321],{},"ros2 topic list"," to see the ",[76,5324,709],{}," topic, indicating that the map message has been published.",[19,5327,5328],{},[22,5329,5330],{},"Method 2: Launch Integration",[19,5332,5333,5334,5336,5337,5340],{},"Method 1 requires manually setting the ",[76,5335,4214],{}," lifecycle, which makes the steps a bit cumbersome. Therefore, we can also integrate this node into a launch file to simplify the startup process. Create a new file named ",[76,5338,5339],{},"map_server.launch.py"," in the launch directory and enter the following content:",[70,5342,5344],{"className":1281,"code":5343,"language":1283,"meta":33,"style":33},"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",[76,5345,5346,5352,5362,5372,5380,5400,5409,5421,5433,5444,5455,5475,5486,5491,5500,5512,5524,5536,5547,5564,5578,5592,5596],{"__ignoreMap":33},[79,5347,5348,5350],{"class":81,"line":82},[79,5349,1290],{"class":99},[79,5351,1293],{"class":106},[79,5353,5354,5356,5358,5360],{"class":81,"line":116},[79,5355,1302],{"class":99},[79,5357,1305],{"class":106},[79,5359,1290],{"class":99},[79,5361,1310],{"class":106},[79,5363,5364,5366,5368,5370],{"class":81,"line":138},[79,5365,1302],{"class":99},[79,5367,1341],{"class":106},[79,5369,1290],{"class":99},[79,5371,1346],{"class":106},[79,5373,5374,5376,5378],{"class":81,"line":145},[79,5375,1367],{"class":99},[79,5377,1370],{"class":85},[79,5379,1373],{"class":106},[79,5381,5382,5385,5387,5390,5393,5395,5398],{"class":81,"line":152},[79,5383,5384],{"class":106},"  map_file ",[79,5386,1381],{"class":99},[79,5388,5389],{"class":106}," os.path.join(",[79,5391,5392],{"class":89},"'map'",[79,5394,1500],{"class":106},[79,5396,5397],{"class":89},"'my_map.yaml'",[79,5399,1390],{"class":106},[79,5401,5402,5405,5407],{"class":81,"line":164},[79,5403,5404],{"class":106},"  map_server_node ",[79,5406,1381],{"class":99},[79,5408,1533],{"class":106},[79,5410,5411,5414,5416,5419],{"class":81,"line":176},[79,5412,5413],{"class":1436},"      package",[79,5415,1381],{"class":99},[79,5417,5418],{"class":89},"'nav2_map_server'",[79,5420,1430],{"class":106},[79,5422,5423,5426,5428,5431],{"class":81,"line":181},[79,5424,5425],{"class":1436},"      executable",[79,5427,1381],{"class":99},[79,5429,5430],{"class":89},"'map_server'",[79,5432,1430],{"class":106},[79,5434,5435,5438,5440,5442],{"class":81,"line":187},[79,5436,5437],{"class":1436},"      name",[79,5439,1381],{"class":99},[79,5441,5430],{"class":89},[79,5443,1430],{"class":106},[79,5445,5446,5449,5451,5453],{"class":81,"line":199},[79,5447,5448],{"class":1436},"      output",[79,5450,1381],{"class":99},[79,5452,1616],{"class":89},[79,5454,1430],{"class":106},[79,5456,5457,5460,5462,5465,5467,5469,5472],{"class":81,"line":1393},[79,5458,5459],{"class":1436},"      parameters",[79,5461,1381],{"class":99},[79,5463,5464],{"class":106},"[{",[79,5466,1387],{"class":89},[79,5468,1723],{"class":106},[79,5470,5471],{"class":1251},"True",[79,5473,5474],{"class":106},"},\n",[79,5476,5477,5480,5483],{"class":81,"line":1408},[79,5478,5479],{"class":106},"                  {",[79,5481,5482],{"class":89},"'yaml_filename'",[79,5484,5485],{"class":106},":map_file}]\n",[79,5487,5488],{"class":81,"line":1413},[79,5489,5490],{"class":106},"  )\n",[79,5492,5493,5496,5498],{"class":81,"line":1424},[79,5494,5495],{"class":106},"  manager_mapper_node ",[79,5497,1381],{"class":99},[79,5499,1533],{"class":106},[79,5501,5502,5505,5507,5510],{"class":81,"line":1433},[79,5503,5504],{"class":1436},"    package",[79,5506,1381],{"class":99},[79,5508,5509],{"class":89},"'nav2_lifecycle_manager'",[79,5511,1430],{"class":106},[79,5513,5514,5517,5519,5522],{"class":81,"line":1447},[79,5515,5516],{"class":1436},"    executable",[79,5518,1381],{"class":99},[79,5520,5521],{"class":89},"'lifecycle_manager'",[79,5523,1430],{"class":106},[79,5525,5526,5529,5531,5534],{"class":81,"line":1460},[79,5527,5528],{"class":1436},"    name",[79,5530,1381],{"class":99},[79,5532,5533],{"class":89},"'lifecycle_manager_mapper'",[79,5535,1430],{"class":106},[79,5537,5538,5541,5543,5545],{"class":81,"line":1470},[79,5539,5540],{"class":1436},"    output",[79,5542,1381],{"class":99},[79,5544,1616],{"class":89},[79,5546,1430],{"class":106},[79,5548,5549,5552,5554,5556,5558,5560,5562],{"class":81,"line":1478},[79,5550,5551],{"class":1436},"    parameters",[79,5553,1381],{"class":99},[79,5555,5464],{"class":106},[79,5557,1387],{"class":89},[79,5559,1723],{"class":106},[79,5561,5471],{"class":1251},[79,5563,5474],{"class":106},[79,5565,5566,5569,5572,5574,5576],{"class":81,"line":1494},[79,5567,5568],{"class":106},"      {",[79,5570,5571],{"class":89},"'autostart'",[79,5573,1723],{"class":106},[79,5575,5471],{"class":1251},[79,5577,5474],{"class":106},[79,5579,5580,5582,5585,5587,5589],{"class":81,"line":1508},[79,5581,5568],{"class":106},[79,5583,5584],{"class":89},"'node_names'",[79,5586,4989],{"class":106},[79,5588,5430],{"class":89},[79,5590,5591],{"class":106},"]}]\n",[79,5593,5594],{"class":81,"line":1520},[79,5595,5490],{"class":106},[79,5597,5598,5601],{"class":81,"line":1525},[79,5599,5600],{"class":99},"  return",[79,5602,5603],{"class":106}," LaunchDescription([map_server_node,manager_mapper_node])\n",[19,5605,5606,5607,5610,5611,5614],{},"In this file, the ",[76,5608,5609],{},"lifecycle_manager"," component from the ",[76,5612,5613],{},"nav2_lifecycle_manager"," package is used. This component can automatically configure and activate the lifecycle-managed nodes it oversees. After building the package and executing this launch file, the final effect is similar to that of Method 1.",[70,5616,5618],{"className":72,"code":5617,"language":74,"meta":33,"style":33},"ros2 launch mycar_map_server map_server.launch.py\n",[76,5619,5620],{"__ignoreMap":33},[79,5621,5622,5624,5626,5628],{"class":81,"line":82},[79,5623,1239],{"class":85},[79,5625,2416],{"class":89},[79,5627,5176],{"class":89},[79,5629,5630],{"class":89}," map_server.launch.py\n",[19,5632,5633],{},[22,5634,5635],{},"Display the map",[19,5637,5638,5639,934],{},"Open rviz2, then add the Map plugin, set the topic to /map, and set the topic's ",[76,5640,5641],{},"Durability Policy",[19,5643,5644,5645,5648],{},"Set the option to ",[76,5646,5647],{},"Transient Local",", and the map data will display correctly.",[19,5650,5651],{},[31,5652],{"alt":33,"src":5653},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1755.webp",[19,5655,5656],{},[31,5657],{"alt":33,"src":5658},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1756.webp",[19,5660,5661],{},[31,5662],{"alt":33,"src":5663},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1757.webp",[10,5665,5667],{"id":5666},"amcl-adaptive-monte-carlo-localization","AMCL Adaptive Monte Carlo Localization",[19,5669,5670],{},"Localization is the process by which a robot determines its own position on a known map, providing foundational information for robot navigation.",[19,5672,5673,5674,934],{},"The localization technology in Nav2 is called AMCL, which stands for Adaptive Monte Carlo Localization. It is a localization algorithm based on a particle filter. It performs adaptive localization using the Monte Carlo method, determining the robot's position and orientation in the environment by sensing the surrounding environment and analyzing observation data. In Nav2, the corresponding functional package is ",[76,5675,5676],{},"nav2_amcl",[19,5678,5679],{},"In AMCL, the core idea of the particle filter is to use a set of particles (samples) to represent the robot's possible positions on the map. Each particle has a weight that indicates the confidence level of the position it represents. The algorithm updates the positions and weights of these particles based on the robot's motion model and sensor data. Over time, the particles gradually converge near the robot's actual position, enabling an accurate estimate of the robot's location.",[15,5681,5683],{"id":5682},"location-node-description","Location Node Description",[19,5685,5686,5687,5689],{},"The core node in the ",[76,5688,5676],{}," package is amcl. The relevant information for this node is as follows.",[19,5691,5692],{},[22,5693,5694],{},"1. Subscribed Topics",[557,5696,5697,5707],{},[560,5698,5699],{},[563,5700,5701,5703,5705],{},[566,5702,569],{"align":568},[566,5704,4255],{"align":568},[566,5706,575],{"align":568},[577,5708,5709,5718,5728,5739],{},[563,5710,5711,5713,5716],{},[582,5712,709],{"align":568},[582,5714,5715],{"align":568},"/nav_msgs/msg/OccupancyGrid",[582,5717,5121],{"align":568},[563,5719,5720,5722,5725],{},[582,5721,584],{"align":568},[582,5723,5724],{"align":568},"/sensor_msgs/msg/LaserScan",[582,5726,5727],{"align":568},"LiDAR data",[563,5729,5730,5733,5736],{},[582,5731,5732],{"align":568},"/initialpose",[582,5734,5735],{"align":568},"/geometry_msgs/msg/PoseWithCovarianceStamped",[582,5737,5738],{"align":568},"Used to initialize the mean and covariance of the particle filter.",[563,5740,5741,5743,5746],{},[582,5742,595],{"align":568},[582,5744,5745],{"align":568},"/tf2_msgs/msg/TFMessage",[582,5747,5748],{"align":568},"Coordinate transformation message",[19,5750,5751],{},[22,5752,5753],{},"2. Published Topics",[557,5755,5756,5766],{},[560,5757,5758],{},[563,5759,5760,5762,5764],{},[566,5761,569],{"align":568},[566,5763,4255],{"align":568},[566,5765,575],{"align":568},[577,5767,5768,5778,5789],{},[563,5769,5770,5773,5775],{},[582,5771,5772],{"align":568},"/amcl_pose",[582,5774,5735],{"align":568},[582,5776,5777],{"align":568},"The robot's pose estimation in the map",[563,5779,5780,5783,5786],{},[582,5781,5782],{"align":568},"/particle_cloud",[582,5784,5785],{"align":568},"/nav2_msgs/msg/ParticleCloud",[582,5787,5788],{"align":568},"Set of pose estimates, which can be subscribed to by PoseArray in rviz to graphically display the robot's set of pose estimates.",[563,5790,5791,5793,5795],{},[582,5792,595],{"align":568},[582,5794,5745],{"align":568},[582,5796,5797],{"align":568},"Publish the transformation between odom and map",[19,5799,5800],{},[22,5801,5802],{},"3. Published Services",[557,5804,5805,5815],{},[560,5806,5807],{},[563,5808,5809,5811,5813],{},[566,5810,569],{"align":568},[566,5812,4255],{"align":568},[566,5814,575],{"align":568},[577,5816,5817,5828],{},[563,5818,5819,5822,5825],{},[582,5820,5821],{"align":568},"/reinitialize_global_localization",[582,5823,5824],{"align":568},"std_srvs/srv/Empty",[582,5826,5827],{"align":568},"Initialize the particle pose globally.",[563,5829,5830,5833,5835],{},[582,5831,5832],{"align":568},"/request_nomotion_update",[582,5834,5824],{"align":568},[582,5836,5837],{"align":568},"Manually trigger the update of the particle swarm without updating the motion model.",[19,5839,5840],{},[22,5841,5842],{},"4. Parameters",[19,5844,5845],{},[22,5846,5847],{},"General Parameters",[47,5849,5850,5859,5868,5876,5884,5892,5898],{},[50,5851,5852,5855,5856,5858],{},[76,5853,5854],{},"bond_disable_heartbeat_timeout",": When set to ",[76,5857,2079],{},", it disables the heartbeat-based timeout detection between the amcl node and other nodes. This is typically used when the connections between nodes are very stable and do not require frequent heartbeat checks to confirm connection status.",[50,5860,5861,5864,5865,5867],{},[76,5862,5863],{},"base_frame_id",": Defines the ID of the robot's base coordinate system, typically named ",[76,5866,2522],{}," or a similar name.",[50,5869,5870,5873,5874,934],{},[76,5871,5872],{},"global_frame_id",": Defines the ID of the global map coordinate system, typically ",[76,5875,2512],{},[50,5877,5878,5881,5882,934],{},[76,5879,5880],{},"odom_frame_id",": Define the ID of the odometry coordinate system, typically ",[76,5883,2516],{},[50,5885,5886,5855,5889,5891],{},[76,5887,5888],{},"tf_broadcast",[76,5890,2079],{},", the amcl node publishes the transform from the odometry frame to the global map frame.",[50,5893,5894,5897],{},[76,5895,5896],{},"transform_tolerance",": Set the tolerance for TF transforms to handle time inconsistencies in the TF tree.",[50,5899,5900,5855,5903,5905],{},[76,5901,5902],{},"use_sim_time",[76,5904,2079],{},", amcl will use ROS 2's simulated time (if available). This is useful in simulation environments.",[19,5907,5908],{},[22,5909,5910],{},"Laser Model Parameters",[47,5912,5913,5923,5932,5938],{},[50,5914,5915,5918,5919,5922],{},[76,5916,5917],{},"laser_model_type",": Set the laser model type. ",[76,5920,5921],{},"likelihood_field"," is a commonly used model that accounts for the probability of a laser beam hitting an obstacle.",[50,5924,5925,540,5928,5931],{},[76,5926,5927],{},"laser_max_range",[76,5929,5930],{},"laser_min_range",": Set the maximum and minimum detection range of the LiDAR respectively.",[50,5933,5934,5937],{},[76,5935,5936],{},"laser_likelihood_max_dist",": Set the maximum distance considered by the laser model; data beyond this distance will be ignored.",[50,5939,5940,5943,5944,1500,5947,1500,5950,5953,5954,5956,5957,5959],{},[76,5941,5942],{},"do_beamskip"," and related parameters (",[76,5945,5946],{},"beam_skip_distance",[76,5948,5949],{},"beam_skip_threshold",[76,5951,5952],{},"beam_skip_error_threshold","): These parameters control whether to skip processing of certain laser beams to reduce computational load. However, ",[76,5955,5942],{}," is set to ",[76,5958,2555],{},", meaning no laser beams are skipped.",[19,5961,5962],{},[22,5963,5964],{},"Particle Filter Parameters",[47,5966,5967,5979,5988,5994],{},[50,5968,5969,5972,5975,5978],{},[76,5970,5971],{},"alpha1",[22,5973,5974],{},"To",[76,5976,5977],{},"alpha5",": These parameters are used to control the weight update process in the particle filter, but their specific roles may vary depending on the implementation of amcl. In the standard amcl implementation, these parameters may not be used directly.",[50,5980,5981,540,5984,5987],{},[76,5982,5983],{},"max_particles",[76,5985,5986],{},"min_particles",": Set the maximum and minimum number of particles for the particle filter, respectively.",[50,5989,5990,5993],{},[76,5991,5992],{},"resample_interval",": Sets the number of filter updates needed before resampling.",[50,5995,5996,540,5999,6002],{},[76,5997,5998],{},"pf_err",[76,6000,6001],{},"pf_z",": These parameters are used to control the performance of the particle filter, but their specific effects may depend on the implementation details of amcl.",[19,6004,6005],{},[22,6006,6007],{},"Initial Pose Parameters",[47,6009,6010,6022,6029],{},[50,6011,6012,6015,6016,5956,6019,6021],{},[76,6013,6014],{},"initial_pose",": Defines the robot's initial pose (x, y, yaw, z), but in practice, if ",[76,6017,6018],{},"set_initial_pose",[76,6020,2079],{},", this initial pose may be overwritten by the initial pose set via a service request.",[50,6023,6024,5855,6026,6028],{},[76,6025,6018],{},[76,6027,2079],{},", it allows setting the robot's initial pose via a service request.",[50,6030,6031,5855,6034,6036],{},[76,6032,6033],{},"always_reset_initial_pose",[76,6035,2555],{},", it means the initial pose will not be automatically reset at the start of each localization session.",[19,6038,6039],{},[22,6040,6041],{},"Other Parameters",[47,6043,6044,6052,6058,6063,6069,6078],{},[50,6045,6046,5855,6049,6051],{},[76,6047,6048],{},"first_map_only",[76,6050,2555],{},", it indicates that amcl will subscribe to and process the continuously updated map topic.",[50,6053,6054,6057],{},[76,6055,6056],{},"map_topic",": Define the name of the map topic, which AMCL will subscribe to in order to receive map information.",[50,6059,6060,6062],{},[76,6061,926],{},": Defines the name of the lidar scan data topic, which amcl will subscribe to in order to obtain data for localization.",[50,6064,6065,6068],{},[76,6066,6067],{},"save_pose_rate",": Set the rate (in Hz) at which the robot's pose is saved.",[50,6070,6071,540,6074,6077],{},[76,6072,6073],{},"recovery_alpha_fast",[76,6075,6076],{},"recovery_alpha_slow",": These parameters may not be directly used in the standard amcl implementation; they might belong to a specific version of amcl or an extension.",[50,6079,6080,1500,6083,1500,6086,1500,6089,6092,6093,6096],{},[76,6081,6082],{},"z_hit",[76,6084,6085],{},"z_rand",[76,6087,6088],{},"z_short",[76,6090,6091],{},"z_max",", and ",[76,6094,6095],{},"sigma_hit",": These parameters define the probability distribution in the laser model, used to calculate the probability of a laser beam hitting an obstacle or a random location.",[15,6098,6100],{"id":6099},"basic-operations-for-positioning-nodes","Basic Operations for Positioning Nodes",[19,6102,6103],{},[22,6104,6105],{},"1. Preparation",[19,6107,5157,6108,5160],{},[76,6109,1225],{},[70,6111,6113],{"className":72,"code":6112,"language":74,"meta":33,"style":33},"ros2 pkg create mycar_localization --dependencies nav2_amcl mycar_map_server\n",[76,6114,6115],{"__ignoreMap":33},[79,6116,6117,6119,6121,6123,6126,6128,6131],{"class":81,"line":82},[79,6118,1239],{"class":85},[79,6120,1242],{"class":89},[79,6122,1245],{"class":89},[79,6124,6125],{"class":89}," mycar_localization",[79,6127,1252],{"class":1251},[79,6129,6130],{"class":89}," nav2_amcl",[79,6132,6133],{"class":89}," mycar_map_server\n",[19,6135,6136],{},[22,6137,6138],{},"2. Writing the launch file and parameter file",[19,6140,6141,6142,540,6144,6146,6147,6149,6150,2333],{},"Under the function package, create new ",[76,6143,1266],{},[76,6145,1270],{}," folders. In the ",[76,6148,1266],{}," directory, create a file named ",[76,6151,6152],{},"mycar_loca.launch.py",[70,6154,6156],{"className":1281,"code":6155,"language":1283,"meta":33,"style":33},"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",[76,6157,6158,6164,6174,6178,6188,6199,6209,6221,6225,6235,6239,6243,6251,6255,6263,6269,6278,6282,6286,6296,6306,6313,6318,6322,6326,6335,6346,6357,6367,6377,6385,6390,6406,6411,6415,6419,6428,6438,6448,6459,6469,6477,6489,6501,6514,6518,6522,6526,6536,6541,6546,6556,6563,6568,6573,6578,6588,6599,6604,6608,6612,6618,6622,6627,6633,6639],{"__ignoreMap":33},[79,6159,6160,6162],{"class":81,"line":82},[79,6161,1290],{"class":99},[79,6163,1293],{"class":106},[79,6165,6166,6168,6170,6172],{"class":81,"line":116},[79,6167,1302],{"class":99},[79,6169,1353],{"class":106},[79,6171,1290],{"class":99},[79,6173,1358],{"class":106},[79,6175,6176],{"class":81,"line":138},[79,6177,142],{"emptyLinePlaceholder":141},[79,6179,6180,6182,6184,6186],{"class":81,"line":145},[79,6181,1302],{"class":99},[79,6183,1305],{"class":106},[79,6185,1290],{"class":99},[79,6187,1310],{"class":106},[79,6189,6190,6192,6194,6196],{"class":81,"line":152},[79,6191,1302],{"class":99},[79,6193,1317],{"class":106},[79,6195,1290],{"class":99},[79,6197,6198],{"class":106}," DeclareLaunchArgument, IncludeLaunchDescription\n",[79,6200,6201,6203,6205,6207],{"class":81,"line":164},[79,6202,1302],{"class":99},[79,6204,1329],{"class":106},[79,6206,1290],{"class":99},[79,6208,1334],{"class":106},[79,6210,6211,6213,6216,6218],{"class":81,"line":176},[79,6212,1302],{"class":99},[79,6214,6215],{"class":106}," launch.launch_description_sources ",[79,6217,1290],{"class":99},[79,6219,6220],{"class":106}," PythonLaunchDescriptionSource\n",[79,6222,6223],{"class":81,"line":181},[79,6224,142],{"emptyLinePlaceholder":141},[79,6226,6227,6229,6231,6233],{"class":81,"line":187},[79,6228,1302],{"class":99},[79,6230,1341],{"class":106},[79,6232,1290],{"class":99},[79,6234,1346],{"class":106},[79,6236,6237],{"class":81,"line":199},[79,6238,142],{"emptyLinePlaceholder":141},[79,6240,6241],{"class":81,"line":1393},[79,6242,142],{"emptyLinePlaceholder":141},[79,6244,6245,6247,6249],{"class":81,"line":1408},[79,6246,1367],{"class":99},[79,6248,1370],{"class":85},[79,6250,1373],{"class":106},[79,6252,6253],{"class":81,"line":1413},[79,6254,142],{"emptyLinePlaceholder":141},[79,6256,6257,6259,6261],{"class":81,"line":1424},[79,6258,3200],{"class":106},[79,6260,1381],{"class":99},[79,6262,1421],{"class":106},[79,6264,6265,6267],{"class":81,"line":1433},[79,6266,1427],{"class":89},[79,6268,1430],{"class":106},[79,6270,6271,6273,6275],{"class":81,"line":1447},[79,6272,1437],{"class":1436},[79,6274,1381],{"class":99},[79,6276,6277],{"class":89},"'false'\n",[79,6279,6280],{"class":81,"line":1460},[79,6281,3353],{"class":106},[79,6283,6284],{"class":81,"line":1470},[79,6285,142],{"emptyLinePlaceholder":141},[79,6287,6288,6291,6293],{"class":81,"line":1478},[79,6289,6290],{"class":106},"    amcl_yaml ",[79,6292,1381],{"class":99},[79,6294,6295],{"class":106}," os.path.join(\n",[79,6297,6298,6301,6304],{"class":81,"line":1494},[79,6299,6300],{"class":106},"        get_package_share_directory(",[79,6302,6303],{"class":89},"'mycar_localization'",[79,6305,1491],{"class":106},[79,6307,6308,6311],{"class":81,"line":1508},[79,6309,6310],{"class":89},"        'params'",[79,6312,1430],{"class":106},[79,6314,6315],{"class":81,"line":1520},[79,6316,6317],{"class":89},"        'amcl.yaml'\n",[79,6319,6320],{"class":81,"line":1525},[79,6321,3353],{"class":106},[79,6323,6324],{"class":81,"line":1536},[79,6325,142],{"emptyLinePlaceholder":141},[79,6327,6328,6331,6333],{"class":81,"line":1547},[79,6329,6330],{"class":106},"    amcl_node ",[79,6332,1381],{"class":99},[79,6334,1533],{"class":106},[79,6336,6337,6339,6341,6344],{"class":81,"line":1553},[79,6338,1573],{"class":1436},[79,6340,1381],{"class":99},[79,6342,6343],{"class":89},"'nav2_amcl'",[79,6345,1430],{"class":106},[79,6347,6348,6350,6352,6355],{"class":81,"line":1564},[79,6349,1586],{"class":1436},[79,6351,1381],{"class":99},[79,6353,6354],{"class":89},"'amcl'",[79,6356,1430],{"class":106},[79,6358,6359,6361,6363,6365],{"class":81,"line":1570},[79,6360,1599],{"class":1436},[79,6362,1381],{"class":99},[79,6364,6354],{"class":89},[79,6366,1430],{"class":106},[79,6368,6369,6371,6373,6375],{"class":81,"line":1583},[79,6370,1611],{"class":1436},[79,6372,1381],{"class":99},[79,6374,1616],{"class":89},[79,6376,1430],{"class":106},[79,6378,6379,6381,6383],{"class":81,"line":1596},[79,6380,1539],{"class":1436},[79,6382,1381],{"class":99},[79,6384,1544],{"class":106},[79,6386,6387],{"class":81,"line":1608},[79,6388,6389],{"class":106},"            amcl_yaml,\n",[79,6391,6392,6394,6396,6398,6400,6403],{"class":81,"line":1621},[79,6393,3400],{"class":106},[79,6395,1387],{"class":89},[79,6397,3292],{"class":106},[79,6399,1387],{"class":89},[79,6401,6402],{"class":106},")} ",[79,6404,6405],{"class":148},"# 覆盖掉yaml里的use_sim_time参数,以launch启动的设置为准.\n",[79,6407,6408],{"class":81,"line":1626},[79,6409,6410],{"class":106},"        ]\n",[79,6412,6413],{"class":81,"line":1637},[79,6414,3353],{"class":106},[79,6416,6417],{"class":81,"line":1642},[79,6418,142],{"emptyLinePlaceholder":141},[79,6420,6421,6424,6426],{"class":81,"line":1648},[79,6422,6423],{"class":106},"    manager_localization_node ",[79,6425,1381],{"class":99},[79,6427,1533],{"class":106},[79,6429,6430,6432,6434,6436],{"class":81,"line":1654},[79,6431,1573],{"class":1436},[79,6433,1381],{"class":99},[79,6435,5509],{"class":89},[79,6437,1430],{"class":106},[79,6439,6440,6442,6444,6446],{"class":81,"line":1660},[79,6441,1586],{"class":1436},[79,6443,1381],{"class":99},[79,6445,5521],{"class":89},[79,6447,1430],{"class":106},[79,6449,6450,6452,6454,6457],{"class":81,"line":1665},[79,6451,1599],{"class":1436},[79,6453,1381],{"class":99},[79,6455,6456],{"class":89},"'lifecycle_manager_localization'",[79,6458,1430],{"class":106},[79,6460,6461,6463,6465,6467],{"class":81,"line":2060},[79,6462,1611],{"class":1436},[79,6464,1381],{"class":99},[79,6466,1616],{"class":89},[79,6468,1430],{"class":106},[79,6470,6471,6473,6475],{"class":81,"line":2071},[79,6472,1539],{"class":1436},[79,6474,1381],{"class":99},[79,6476,1544],{"class":106},[79,6478,6479,6481,6483,6485,6487],{"class":81,"line":2084},[79,6480,3400],{"class":106},[79,6482,1387],{"class":89},[79,6484,3292],{"class":106},[79,6486,1387],{"class":89},[79,6488,3409],{"class":106},[79,6490,6491,6493,6495,6497,6499],{"class":81,"line":2098},[79,6492,3400],{"class":106},[79,6494,5571],{"class":89},[79,6496,1723],{"class":106},[79,6498,5471],{"class":1251},[79,6500,5474],{"class":106},[79,6502,6503,6505,6507,6509,6511],{"class":81,"line":2111},[79,6504,3400],{"class":106},[79,6506,5584],{"class":89},[79,6508,4989],{"class":106},[79,6510,6354],{"class":89},[79,6512,6513],{"class":106},"]}\n",[79,6515,6516],{"class":81,"line":2125},[79,6517,6410],{"class":106},[79,6519,6520],{"class":81,"line":2136},[79,6521,3353],{"class":106},[79,6523,6524],{"class":81,"line":2141},[79,6525,142],{"emptyLinePlaceholder":141},[79,6527,6528,6531,6533],{"class":81,"line":2151},[79,6529,6530],{"class":106},"    map_server_launch ",[79,6532,1381],{"class":99},[79,6534,6535],{"class":106}," IncludeLaunchDescription(\n",[79,6537,6538],{"class":81,"line":2162},[79,6539,6540],{"class":106},"        PythonLaunchDescriptionSource(\n",[79,6542,6543],{"class":81,"line":2174},[79,6544,6545],{"class":106},"            os.path.join(\n",[79,6547,6548,6551,6554],{"class":81,"line":2179},[79,6549,6550],{"class":106},"                get_package_share_directory(",[79,6552,6553],{"class":89},"'mycar_map_server'",[79,6555,1491],{"class":106},[79,6557,6558,6561],{"class":81,"line":2190},[79,6559,6560],{"class":89},"                'launch'",[79,6562,1430],{"class":106},[79,6564,6565],{"class":81,"line":2200},[79,6566,6567],{"class":89},"                'map_server.launch.py'\n",[79,6569,6570],{"class":81,"line":2211},[79,6571,6572],{"class":106},"            )\n",[79,6574,6575],{"class":81,"line":2216},[79,6576,6577],{"class":106},"        ),\n",[79,6579,6580,6583,6585],{"class":81,"line":2230},[79,6581,6582],{"class":1436},"        launch_arguments",[79,6584,1381],{"class":99},[79,6586,6587],{"class":106},"{\n",[79,6589,6590,6593,6595,6597],{"class":81,"line":2243},[79,6591,6592],{"class":89},"            'use_sim_time'",[79,6594,3292],{"class":106},[79,6596,1387],{"class":89},[79,6598,1390],{"class":106},[79,6600,6601],{"class":81,"line":2248},[79,6602,6603],{"class":106},"        }.items()\n",[79,6605,6606],{"class":81,"line":2262},[79,6607,3353],{"class":106},[79,6609,6610],{"class":81,"line":2276},[79,6611,142],{"emptyLinePlaceholder":141},[79,6613,6614,6616],{"class":81,"line":2290},[79,6615,1668],{"class":99},[79,6617,3436],{"class":106},[79,6619,6620],{"class":81,"line":2301},[79,6621,3441],{"class":106},[79,6623,6624],{"class":81,"line":2311},[79,6625,6626],{"class":106},"        map_server_launch,\n",[79,6628,6630],{"class":81,"line":6629},64,[79,6631,6632],{"class":106},"        amcl_node,\n",[79,6634,6636],{"class":81,"line":6635},65,[79,6637,6638],{"class":106},"        manager_localization_node,\n",[79,6640,6642],{"class":81,"line":6641},66,[79,6643,3461],{"class":106},[19,6645,6646,6647,6650,6651,6654,6655,6657,6658,6660,6661,6663],{},"In the code above, a ",[76,6648,6649],{},"amcl"," node was created, and a configuration file named ",[76,6652,6653],{},"amcl.yaml"," was loaded from the ",[76,6656,1270],{}," directory. Since ",[76,6659,6649],{}," is also a node with a lifecycle, it was added to the lifecycle manager. Finally, localization must rely on map information, so the launch file from ",[22,6662,5150],{}," was included to load the map.",[19,6665,6666,6667,6669],{},"Create a new file named ",[76,6668,6653],{}," in the params directory, and enter the following content:",[70,6671,6673],{"className":1696,"code":6672,"language":1698,"meta":33,"style":33},"/**:\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",[76,6674,6675,6682,6688,6700,6709,6718,6727,6736,6745,6755,6764,6773,6783,6792,6802,6811,6820,6830,6840,6850,6860,6870,6880,6890,6899,6909,6919,6928,6937,6947,6956,6965,6974,6983,6992,7001,7010,7019,7028,7037,7046],{"__ignoreMap":33},[79,6676,6677,6680],{"class":81,"line":82},[79,6678,6679],{"class":1705},"/**",[79,6681,1708],{"class":106},[79,6683,6684,6686],{"class":81,"line":116},[79,6685,1713],{"class":1705},[79,6687,1708],{"class":106},[79,6689,6690,6693,6695,6697],{"class":81,"line":138},[79,6691,6692],{"class":1705},"    use_sim_time",[79,6694,1723],{"class":106},[79,6696,5471],{"class":1251},[79,6698,6699],{"class":148},"  # 由launch的设置覆盖\n",[79,6701,6702,6705,6707],{"class":81,"line":145},[79,6703,6704],{"class":1705},"    alpha1",[79,6706,1723],{"class":106},[79,6708,1941],{"class":1251},[79,6710,6711,6714,6716],{"class":81,"line":152},[79,6712,6713],{"class":1705},"    alpha2",[79,6715,1723],{"class":106},[79,6717,1941],{"class":1251},[79,6719,6720,6723,6725],{"class":81,"line":164},[79,6721,6722],{"class":1705},"    alpha3",[79,6724,1723],{"class":106},[79,6726,1941],{"class":1251},[79,6728,6729,6732,6734],{"class":81,"line":176},[79,6730,6731],{"class":1705},"    alpha4",[79,6733,1723],{"class":106},[79,6735,1941],{"class":1251},[79,6737,6738,6741,6743],{"class":81,"line":181},[79,6739,6740],{"class":1705},"    alpha5",[79,6742,1723],{"class":106},[79,6744,1941],{"class":1251},[79,6746,6747,6750,6752],{"class":81,"line":187},[79,6748,6749],{"class":1705},"    base_frame_id",[79,6751,1723],{"class":106},[79,6753,6754],{"class":89},"\"base_link\"\n",[79,6756,6757,6760,6762],{"class":81,"line":199},[79,6758,6759],{"class":1705},"    beam_skip_distance",[79,6761,1723],{"class":106},[79,6763,1931],{"class":1251},[79,6765,6766,6769,6771],{"class":81,"line":1393},[79,6767,6768],{"class":1705},"    beam_skip_error_threshold",[79,6770,1723],{"class":106},[79,6772,2298],{"class":1251},[79,6774,6775,6778,6780],{"class":81,"line":1408},[79,6776,6777],{"class":1705},"    beam_skip_threshold",[79,6779,1723],{"class":106},[79,6781,6782],{"class":1251},"0.3\n",[79,6784,6785,6788,6790],{"class":81,"line":1413},[79,6786,6787],{"class":1705},"    do_beamskip",[79,6789,1723],{"class":106},[79,6791,1866],{"class":1251},[79,6793,6794,6797,6799],{"class":81,"line":1424},[79,6795,6796],{"class":1705},"    global_frame_id",[79,6798,1723],{"class":106},[79,6800,6801],{"class":89},"\"map\"\n",[79,6803,6804,6807,6809],{"class":81,"line":1433},[79,6805,6806],{"class":1705},"    lambda_short",[79,6808,1723],{"class":106},[79,6810,2005],{"class":1251},[79,6812,6813,6816,6818],{"class":81,"line":1447},[79,6814,6815],{"class":1705},"    laser_likelihood_max_dist",[79,6817,1723],{"class":106},[79,6819,1899],{"class":1251},[79,6821,6822,6825,6827],{"class":81,"line":1460},[79,6823,6824],{"class":1705},"    laser_max_range",[79,6826,1723],{"class":106},[79,6828,6829],{"class":1251},"100.0\n",[79,6831,6832,6835,6837],{"class":81,"line":1470},[79,6833,6834],{"class":1705},"    laser_min_range",[79,6836,1723],{"class":106},[79,6838,6839],{"class":1251},"-1.0\n",[79,6841,6842,6845,6847],{"class":81,"line":1478},[79,6843,6844],{"class":1705},"    laser_model_type",[79,6846,1723],{"class":106},[79,6848,6849],{"class":89},"\"likelihood_field\"\n",[79,6851,6852,6855,6857],{"class":81,"line":1494},[79,6853,6854],{"class":1705},"    max_beams",[79,6856,1723],{"class":106},[79,6858,6859],{"class":1251},"60\n",[79,6861,6862,6865,6867],{"class":81,"line":1508},[79,6863,6864],{"class":1705},"    max_particles",[79,6866,1723],{"class":106},[79,6868,6869],{"class":1251},"2000\n",[79,6871,6872,6875,6877],{"class":81,"line":1520},[79,6873,6874],{"class":1705},"    min_particles",[79,6876,1723],{"class":106},[79,6878,6879],{"class":1251},"500\n",[79,6881,6882,6885,6887],{"class":81,"line":1525},[79,6883,6884],{"class":1705},"    odom_frame_id",[79,6886,1723],{"class":106},[79,6888,6889],{"class":89},"\"odom\"\n",[79,6891,6892,6895,6897],{"class":81,"line":1536},[79,6893,6894],{"class":1705},"    pf_err",[79,6896,1723],{"class":106},[79,6898,1909],{"class":1251},[79,6900,6901,6904,6906],{"class":81,"line":1547},[79,6902,6903],{"class":1705},"    pf_z",[79,6905,1723],{"class":106},[79,6907,6908],{"class":1251},"0.99\n",[79,6910,6911,6914,6916],{"class":81,"line":1553},[79,6912,6913],{"class":1705},"    recovery_alpha_fast",[79,6915,1723],{"class":106},[79,6917,6918],{"class":1251},"0.0\n",[79,6920,6921,6924,6926],{"class":81,"line":1564},[79,6922,6923],{"class":1705},"    recovery_alpha_slow",[79,6925,1723],{"class":106},[79,6927,6918],{"class":1251},[79,6929,6930,6933,6935],{"class":81,"line":1570},[79,6931,6932],{"class":1705},"    resample_interval",[79,6934,1723],{"class":106},[79,6936,1876],{"class":1251},[79,6938,6939,6942,6944],{"class":81,"line":1583},[79,6940,6941],{"class":1705},"    robot_model_type",[79,6943,1723],{"class":106},[79,6945,6946],{"class":89},"\"nav2_amcl::DifferentialMotionModel\"\n",[79,6948,6949,6952,6954],{"class":81,"line":1596},[79,6950,6951],{"class":1705},"    save_pose_rate",[79,6953,1723],{"class":106},[79,6955,1931],{"class":1251},[79,6957,6958,6961,6963],{"class":81,"line":1608},[79,6959,6960],{"class":1705},"    sigma_hit",[79,6962,1723],{"class":106},[79,6964,1941],{"class":1251},[79,6966,6967,6970,6972],{"class":81,"line":1621},[79,6968,6969],{"class":1705},"    tf_broadcast",[79,6971,1723],{"class":106},[79,6973,1973],{"class":1251},[79,6975,6976,6979,6981],{"class":81,"line":1626},[79,6977,6978],{"class":1705},"    transform_tolerance",[79,6980,1723],{"class":106},[79,6982,1899],{"class":1251},[79,6984,6985,6988,6990],{"class":81,"line":1637},[79,6986,6987],{"class":1705},"    update_min_a",[79,6989,1723],{"class":106},[79,6991,1941],{"class":1251},[79,6993,6994,6997,6999],{"class":81,"line":1642},[79,6995,6996],{"class":1705},"    update_min_d",[79,6998,1723],{"class":106},[79,7000,5035],{"class":1251},[79,7002,7003,7006,7008],{"class":81,"line":1648},[79,7004,7005],{"class":1705},"    z_hit",[79,7007,1723],{"class":106},[79,7009,1931],{"class":1251},[79,7011,7012,7015,7017],{"class":81,"line":1654},[79,7013,7014],{"class":1705},"    z_max",[79,7016,1723],{"class":106},[79,7018,1909],{"class":1251},[79,7020,7021,7024,7026],{"class":81,"line":1660},[79,7022,7023],{"class":1705},"    z_rand",[79,7025,1723],{"class":106},[79,7027,1931],{"class":1251},[79,7029,7030,7033,7035],{"class":81,"line":1665},[79,7031,7032],{"class":1705},"    z_short",[79,7034,1723],{"class":106},[79,7036,1909],{"class":1251},[79,7038,7039,7041,7043],{"class":81,"line":2060},[79,7040,1815],{"class":1705},[79,7042,1723],{"class":106},[79,7044,7045],{"class":89},"scan\n",[79,7047,7048,7051,7053],{"class":81,"line":2071},[79,7049,7050],{"class":1705},"    set_initial_pose",[79,7052,1723],{"class":106},[79,7054,1866],{"class":1251},[19,7056,7057,7058,934],{},"For the specific meaning of the parameters, refer to the parameter-related content in the ",[22,7059,7060],{},"Localization Node Description",[19,7062,7063],{},[22,7064,7065],{},"3. Edit the configuration file",[19,7067,2329,7068,2333],{},[76,7069,2332],{},[70,7071,7072],{"className":2336,"code":2337,"language":2338,"meta":33,"style":33},[76,7073,7074,7080,7086],{"__ignoreMap":33},[79,7075,7076,7078],{"class":81,"line":82},[79,7077,2345],{"class":99},[79,7079,2348],{"class":106},[79,7081,7082,7084],{"class":81,"line":116},[79,7083,2353],{"class":106},[79,7085,2356],{"class":99},[79,7087,7088],{"class":81,"line":138},[79,7089,1390],{"class":106},[19,7091,7092],{},[22,7093,7094],{},"4. Compilation",[19,7096,2368],{},[70,7098,7100],{"className":72,"code":7099,"language":74,"meta":33,"style":33},"colcon build --packages-select mycar_localization\n",[76,7101,7102],{"__ignoreMap":33},[79,7103,7104,7106,7108,7110],{"class":81,"line":82},[79,7105,2378],{"class":85},[79,7107,2381],{"class":89},[79,7109,2384],{"class":1251},[79,7111,7112],{"class":89}," mycar_localization\n",[19,7114,7115],{},[22,7116,7117],{},"5. Execution",[19,7119,4124],{},[70,7121,7122],{"className":72,"code":2400,"language":74,"meta":33,"style":33},[76,7123,7124,7130],{"__ignoreMap":33},[79,7125,7126,7128],{"class":81,"line":82},[79,7127,934],{"class":1251},[79,7129,2409],{"class":89},[79,7131,7132,7134,7136,7138],{"class":81,"line":116},[79,7133,1239],{"class":85},[79,7135,2416],{"class":89},[79,7137,2419],{"class":89},[79,7139,2422],{"class":89},[19,7141,4147],{},[70,7143,7145],{"className":72,"code":7144,"language":74,"meta":33,"style":33},". install/setup.bash\nros2 launch mycar_localization mycar_loca.launch.py use_sim_time:=True\n",[76,7146,7147,7153],{"__ignoreMap":33},[79,7148,7149,7151],{"class":81,"line":82},[79,7150,934],{"class":1251},[79,7152,2409],{"class":89},[79,7154,7155,7157,7159,7161,7164],{"class":81,"line":116},[79,7156,1239],{"class":85},[79,7158,2416],{"class":89},[79,7160,6125],{"class":89},[79,7162,7163],{"class":89}," mycar_loca.launch.py",[79,7165,2452],{"class":89},[19,7167,7168],{},"(3) Start the keyboard control node as a backup:",[70,7170,7172],{"className":72,"code":7171,"language":74,"meta":33,"style":33},"ros2 run teleop_twist_keyboard teleop_twist_keyboard\n",[76,7173,7174],{"__ignoreMap":33},[79,7175,7176,7178,7180,7183],{"class":81,"line":82},[79,7177,1239],{"class":85},[79,7179,4383],{"class":89},[79,7181,7182],{"class":89}," teleop_twist_keyboard",[79,7184,7185],{"class":89}," teleop_twist_keyboard\n",[19,7187,7188,7189,7192],{},"(4) In rviz2, set the Fixed Frame to map, add the TF plugin, and follow the ",[22,7190,7191],{},"basic map reading operations"," to add and display the map.",[19,7194,7195,7196,7199],{},"Next, click ",[76,7197,7198],{},"2D Pose Estimate"," in the rviz2 menu bar to set an initial pose for the robot on the map.",[19,7201,7202],{},"Here, a rough estimate of the robot's position and orientation is sufficient; the robot will gradually calibrate itself through AMCL during motion.",[19,7204,7205,7206,7208],{},"First, click on ",[76,7207,7198],{},", then left-click on the map at the robot's location. Hold down the left button without releasing it, and drag the mouse in the direction the robot is facing. A green arrow like the one below will appear. Then release the mouse button.",[19,7210,7211],{},[31,7212],{"alt":33,"src":7213},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1758.webp",[19,7215,7216,7217,7220,7221,7223,7224,7227,7228,7231],{},"Add the ",[76,7218,7219],{},"ParticleCloud"," plugin, set the topic to ",[76,7222,5782],{},", and set ",[76,7225,7226],{},"Reliability Policy"," under the topic to ",[76,7229,7230],{},"Best Effort",". Finally, when using the keyboard to control the robot's movement, you will notice that a point cloud appears around the robot, and as the robot moves, the point cloud will converge or diverge to varying degrees.",[19,7233,7234],{},[31,7235],{"alt":33,"src":7236},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1759.webp",[19,7238,7239],{},[31,7240],{"alt":33,"src":7241},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1760.webp",[19,7243,7244],{},[31,7245],{"alt":33,"src":7246},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1761.webp",[19,7248,7249],{},"Even if your robot crashes into a wall and the robot positions in rviz2 and Gazebo are completely misaligned, simply let the robot move for a while, and its position will be re-estimated. AMCL is very powerful.",[19,7251,7252],{},[31,7253],{"alt":33,"src":7254},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1762.webp",[19,7256,7257],{},"As shown in the image above, the position has completely shifted.",[19,7259,7260],{},[31,7261],{"alt":33,"src":7262},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1763.webp",[19,7264,7265],{},"After driving for a period of time, the pose position was successfully estimated again.",[10,7267,7269],{"id":7268},"navigation-server","Navigation Server",[19,7271,7272],{},"This section will introduce the core nodes in the navigation server, implement basic navigation functions, and integrate navigation with SLAM to achieve autonomous exploration and mapping.",[19,7274,7275,7276,7279],{},"Below is the official NAV2 documentation for each node's parameter descriptions (",[22,7277,7278],{},"a very commonly used website for parameter tuning","):",[19,7281,7282],{},[293,7283,295],{"href":295,"rel":7284},[297],[19,7286,7287],{},"If you come across English you don't understand, you can use the Chrome extension \"Immersive Translation\" to translate it. It provides side-by-side Chinese-English translations and is very useful.",[19,7289,7290],{},[293,7291,7292],{"href":7292,"rel":7293},"https://chromewebstore.google.com/detail/immersive-translate-trans/bpoadfkcbjbfhfodiogcnhhhpibjhbnh?utm%5C_source=official&pli=1",[297],[19,7295,7296],{},[293,7297,7298],{"href":7298,"rel":7299},"https://microsoftedge.microsoft.com/addons/detail/immersive-translate-tra/amkbmndfnliijdhojkpoglbnaaahippg",[297],[19,7301,7302],{},[31,7303],{"alt":33,"src":7304},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1764.webp",[19,7306,7307],{},[31,7308],{"alt":33,"src":7309},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1765.webp",[19,7311,7312],{},"If you don't know how to use this plugin, you can also check out the version translated by FishROS (though the website is unstable):",[19,7314,7315],{},[293,7316,7317],{"href":7317,"rel":7318},"http://fishros.org/doc/nav2/configuration/index.html",[297],[15,7320,7322],{"id":7321},"lifecycle-management-node-explanation","Lifecycle Management Node Explanation",[19,7324,7325,7326,7328,7329,7331,7332,7334,7335,7337],{},"In Nav2, the ",[76,7327,5613],{}," package's ",[76,7330,5609],{}," node manages the lifecycle state transitions of other nodes. The ",[76,7333,5609],{}," node uses the ROS 2 Lifecycle Node mechanism to provide a standardized method for controlling state transitions of various nodes in Nav2. These states include Unconfigured, Inactive, Active, and Finalized. By precisely controlling these state transitions, the ",[76,7336,5609],{}," node ensures that each part of the Nav2 system starts, runs, and stops at the correct time, thereby improving system reliability and stability.",[19,7339,7340],{},[22,7341,5126],{},[47,7343,7344,7353,7362,7370,7376,7382,7395,7401],{},[50,7345,7346,7349,7350,7352],{},[76,7347,7348],{},"/bond_disable_heartbeat_timeout",": This parameter is related to the communication bonding between nodes. Communication between nodes can be made more reliable through bonding, and the heartbeat timeout is a way to detect whether a node is still active. Setting it to ",[76,7351,2555],{}," means enabling heartbeat timeout detection.",[50,7354,7355,7358,7359,7361],{},[76,7356,7357],{},"attempt_respawn_reconnection",": Takes a boolean value. When set to ",[76,7360,2079],{},", it indicates that if the managed node terminates unexpectedly, the lifecycle manager will attempt to restart it.",[50,7363,7364,7358,7367,7369],{},[76,7365,7366],{},"autostart",[76,7368,2079],{},", it indicates that when the lifecycle manager starts, it will automatically attempt to launch the nodes it manages.",[50,7371,7372,7375],{},[76,7373,7374],{},"bond_respawn_max_duration",": Maximum duration when reconnecting or restarting a node.",[50,7377,7378,7381],{},[76,7379,7380],{},"bond_timeout",": Related to the communication binding timeout between nodes. If no message is received from another node within this time, that node is considered disconnected.",[50,7383,7384,5189,7387],{},[76,7385,7386],{},"diagnostic_updater",[47,7388,7389],{},[50,7390,7391,7394],{},[76,7392,7393],{},"period",": The update cycle of the diagnostic updater. The diagnostic updater is used to collect and publish diagnostic information about the node's status, defining the frequency at which this information is updated.",[50,7396,7397,7400],{},[76,7398,7399],{},"node_names",": List of node names managed by this lifecycle manager.",[50,7402,7403,7405],{},[76,7404,5902],{},": Whether to use simulation practice.",[15,7407,7409],{"id":7408},"behavior-tree-node-explanation","Behavior Tree Node Explanation",[19,7411,7412,7415,7416,7419,7420,7423],{},[22,7413,7414],{},"Behavior Trees (BT)"," are a way to structure the switching between different tasks in an agent, such as a robot or a virtual entity in a computer game. It is a formalized graphical modeling language characterized by a hierarchical organization of nodes, used to describe and plan the interactions and decisions of various entities in complex systems. The ",[76,7417,7418],{},"/bt_navigator"," under the ",[76,7421,7422],{},"nav2_bt_navigator"," package is the behavior tree navigator node in Nav2, which implements a behavior tree-based navigation strategy. A behavior tree is a tree-like structure used to describe complex behaviors. By combining different behavior nodes, it can flexibly define the robot's navigation behaviors, including path planning, obstacle avoidance, recovery, and more. Below is the official website.",[19,7425,7426],{},[293,7427,7428],{"href":7428,"rel":7429},"https://www.behaviortree.dev/",[297],[19,7431,7432],{},[293,7433,7434],{"href":7434,"rel":7435},"https://arxiv.org/abs/1709.00084",[297],[19,7437,7438],{},"The GitHub link is as follows:",[19,7440,7441],{},[293,7442,7443],{"href":7443,"rel":7444},"https://github.com/BehaviorTree/BehaviorTree.CPP",[297],[19,7446,7447],{},"BT visualization tool Groot2 download:",[19,7449,7450],{},[293,7451,7452],{"href":7452,"rel":7453},"https://www.behaviortree.dev/groot/",[297],[316,7455,7456],{},[50,7457,555],{},[557,7459,7460,7470],{},[560,7461,7462],{},[563,7463,7464,7466,7468],{},[566,7465,569],{"align":568},[566,7467,4255],{"align":568},[566,7469,575],{"align":568},[577,7471,7472,7483,7492],{},[563,7473,7474,7477,7480],{},[582,7475,7476],{"align":568},"/goal_pose",[582,7478,7479],{"align":568},"geometry_msgs/msg/PoseStamped",[582,7481,7482],{"align":568},"Navigation target point, used to trigger a navigation task",[563,7484,7485,7487,7489],{},[582,7486,595],{"align":568},[582,7488,598],{"align":568},[582,7490,7491],{"align":568},"Coordinate transformation message, used for conversion between different coordinate systems.",[563,7493,7494,7496,7498],{},[582,7495,2831],{"align":568},[582,7497,2834],{"align":568},[582,7499,7500],{"align":568},"Odometry data provides the robot's position and motion information.",[316,7502,7503],{"start":116},[50,7504,7505],{},"Requested Action",[557,7507,7508,7519],{},[560,7509,7510],{},[563,7511,7512,7515,7517],{},[566,7513,7514],{"align":568},"Action",[566,7516,4255],{"align":568},[566,7518,575],{"align":568},[577,7520,7521],{},[563,7522,7523,7526,7529],{},[582,7524,7525],{"align":568},"/navigate_to_pose",[582,7527,7528],{"align":568},"nav2_msgs/action/NavigateToPose",[582,7530,7531],{"align":568},"Request to navigate to a specified pose Action, including parameters such as target pose and tolerance.",[316,7533,7534],{"start":138},[50,7535,849],{},[47,7537,7538,7543,7549,7555,7561,7567,7573,7579,7585,7591],{},[50,7539,7540,7542],{},[76,7541,5902],{},": Specifies whether to use simulated time instead of real time.",[50,7544,7545,7548],{},[76,7546,7547],{},"global_frame",": Defines the name of the global coordinate system, typically the map coordinate system.",[50,7550,7551,7554],{},[76,7552,7553],{},"robot_base_frame",": Specify the coordinate system name for the robot base.",[50,7556,7557,7560],{},[76,7558,7559],{},"odom_topic",": The ROS topic name for odometry data.",[50,7562,7563,7566],{},[76,7564,7565],{},"bt_loop_duration",": Duration of the behavior tree execution loop (units may vary depending on the implementation).",[50,7568,7569,7572],{},[76,7570,7571],{},"default_server_timeout",": The default timeout for navigation server operations.",[50,7574,7575,7578],{},[76,7576,7577],{},"enable_groot_monitoring",": Enable or disable the Groot monitoring feature.",[50,7580,7581,7584],{},[76,7582,7583],{},"groot_zmq_publisher_port",": The port number of the ZeroMQ publisher in Groot monitoring.",[50,7586,7587,7590],{},[76,7588,7589],{},"groot_zmq_server_port",": The port number of the ZeroMQ server in Groot monitoring.",[50,7592,7593,7596],{},[76,7594,7595],{},"plugin_lib_names",": A list of library names containing the plugins needed for navigation.",[15,7598,7600],{"id":7599},"planner-node-description","Planner Node Description",[19,7602,7603,7604,7607,7608,7611,7612,7615],{},"In the Nav2 navigation framework, the ",[76,7605,7606],{},"planner_server"," node under the ",[76,7609,7610],{},"nav2_planner"," package is responsible for processing path planning requests and generating a path from the current position to the target position. This node depends on the map messages provided by the ",[76,7613,7614],{},"/global_costmap/global_costmap"," node during execution.",[316,7617,7618],{},[50,7619,7620],{},"planner_server published topics",[557,7622,7623,7633],{},[560,7624,7625],{},[563,7626,7627,7629,7631],{},[566,7628,569],{"align":568},[566,7630,4255],{"align":568},[566,7632,575],{"align":568},[577,7634,7635],{},[563,7636,7637,7640,7643],{},[582,7638,7639],{"align":568},"/plan",[582,7641,7642],{"align":568},"nav_msgs/msg/Path",[582,7644,7645],{"align":568},"Global path from current position to target point",[316,7647,7648],{"start":116},[50,7649,7650],{},"planner_server parameters",[47,7652,7653,7661,7699,7705,7714],{},[50,7654,7655,7657,7658,7660],{},[76,7656,7348],{},": This parameter controls whether to disable heartbeat timeout detection. In ROS 2, the bonding mechanism between nodes is used to enhance communication reliability. Heartbeat timeout is a mechanism for detecting whether a node is still active. If this parameter is set to ",[76,7659,2079],{},", it means heartbeat timeout detection is disabled, which may be used in certain specific network environments or when communication between nodes is believed to be very stable.",[50,7662,7663,7666,7667],{},[76,7664,7665],{},"GridBased",": This is a configuration block specifically used to set parameters for a grid-based planner. Grid-based planners typically use a grid representation of the map to plan paths.",[47,7668,7669,7675,7681,7687,7693],{},[50,7670,7671,7674],{},[76,7672,7673],{},"allow_unknown",": Controls whether the planner is allowed to plan paths in unknown (i.e., unexplored) areas of the map.",[50,7676,7677,7680],{},[76,7678,7679],{},"plugin",": Specifies the planner plugin to use.",[50,7682,7683,7686],{},[76,7684,7685],{},"tolerance",": Sets the tolerance when planning paths, typically used to account for robot size and localization uncertainty.",[50,7688,7689,7692],{},[76,7690,7691],{},"use_astar",": Controls whether to use the A* algorithm for path planning*. The A* algorithm is a heuristic search algorithm that can find the shortest path from the start point to the end point.",[50,7694,7695,7698],{},[76,7696,7697],{},"use_final_approach_orientation",": Controls whether the planner considers the robot's final orientation near the end of the path.",[50,7700,7701,7704],{},[76,7702,7703],{},"expected_planner_frequency",": This parameter represents the expected frequency at which the planner generates new paths. It helps the system monitor the planner's performance and can be used for debugging or performance optimization.",[50,7706,7707,7710,7711,7713],{},[76,7708,7709],{},"planner_plugins",": This is a list specifying the available planner plugins. In this example, it only contains one ",[76,7712,7665],{}," planner, but in theory it can include multiple planners of different types to accommodate various navigation needs.",[50,7715,7716,7718,7719,7721],{},[76,7717,5902],{},": This parameter controls whether to use simulated time. In a simulation environment, time is controlled by the simulation software, not by the actual physical clock. Setting this parameter to ",[76,7720,2079],{}," allows nodes to run normally in the simulation environment without relying on the actual system time. This is very useful for developing and testing navigation algorithms.",[316,7723,7724],{"start":138},[50,7725,7726],{},"The topic subscribed to by /global_costmap/global_costmap",[557,7728,7729,7739],{},[560,7730,7731],{},[563,7732,7733,7735,7737],{},[566,7734,569],{"align":568},[566,7736,4255],{"align":568},[566,7738,575],{"align":568},[577,7740,7741,7752,7761],{},[563,7742,7743,7746,7749],{},[582,7744,7745],{"align":568},"/global_costmap/footprint",[582,7747,7748],{"align":568},"geometry_msgs/msg/Polygon",[582,7750,7751],{"align":568},"The footprint information of a robot (or any mobile platform). The footprint is the shape of the space the robot occupies on the map, typically represented as a polygon.",[563,7753,7754,7756,7758],{},[582,7755,709],{"align":568},[582,7757,712],{"align":568},[582,7759,7760],{"align":568},"Publish the environment map, especially the Occupancy Grid Map used for navigation.",[563,7762,7763,7765,7767],{},[582,7764,584],{"align":568},[582,7766,587],{"align":568},[582,7768,7769],{"align":568},"Laser scanning data.",[316,7771,7772],{"start":145},[50,7773,7774],{},"The topic published by /global_costmap/global_costmap",[557,7776,7777,7787],{},[560,7778,7779],{},[563,7780,7781,7783,7785],{},[566,7782,569],{"align":568},[566,7784,4255],{"align":568},[566,7786,575],{"align":568},[577,7788,7789,7799,7810,7821],{},[563,7790,7791,7794,7796],{},[582,7792,7793],{"align":568},"/global_costmap/costmap",[582,7795,712],{"align":568},[582,7797,7798],{"align":568},"Publish the current state of the global costmap.",[563,7800,7801,7804,7807],{},[582,7802,7803],{"align":568},"/global_costmap/costmap_raw",[582,7805,7806],{"align":568},"nav2_msgs/msg/Costmap",[582,7808,7809],{"align":568},"Raw costmap data without further processing.",[563,7811,7812,7815,7818],{},[582,7813,7814],{"align":568},"/global_costmap/costmap_updates",[582,7816,7817],{"align":568},"map_msgs/msg/OccupancyGridUpdate",[582,7819,7820],{"align":568},"The update of the global costmap, this message can efficiently update the map.",[563,7822,7823,7826,7829],{},[582,7824,7825],{"align":568},"/global_costmap/published_footprint",[582,7827,7828],{"align":568},"geometry_msgs/msg/PolygonStamped",[582,7830,7831],{"align":568},"Publish the robot's footprint, which is the shape of the space the robot occupies on the map.",[316,7833,7834],{"start":152},[50,7835,7836],{},"/global_costmap/global_costmap parameters",[47,7838,7839,7844,7850,7856,7862,7868,7874,7879,7888,7931,7937,7942,7948,7997,8006,8012,8018,8023,8028,8034,8040,8079,8085,8090,8096,8102,8108,8114,8119],{},[50,7840,7841,7843],{},[76,7842,7348],{},": Controls whether to disable heartbeat timeout detection, which is used to monitor the liveness of peer nodes during inter-node communication binding.",[50,7845,7846,7849],{},[76,7847,7848],{},"always_send_full_costmap",": Controls whether to always send the complete costmap information, rather than only sending the changed parts.",[50,7851,7852,7855],{},[76,7853,7854],{},"clearable_layers",": List the costmap layers that can be cleared, where obstacle information in these layers can be updated or cleared through some method (such as sensor data).",[50,7857,7858,7861],{},[76,7859,7860],{},"filters",": Defines the list of filters applied to the costmap for preprocessing or modifying map data.",[50,7863,7864,7867],{},[76,7865,7866],{},"footprint",": Specifies the footprint shape of the robot on the map, i.e., the spatial area the robot occupies.",[50,7869,7870,7873],{},[76,7871,7872],{},"footprint_padding",": Add extra padding space to the robot's footprint to account for additional space requirements during robot movement.",[50,7875,7876,7878],{},[76,7877,7547],{},": Defines the reference coordinate system used by the global costmap.",[50,7880,7881,540,7884,7887],{},[76,7882,7883],{},"height",[76,7885,7886],{},"width",": Define the height and width of the global costmap in number of cells.",[50,7889,7890,7893,7894],{},[76,7891,7892],{},"inflation_layer",": Configure the parameters of the inflation layer, which is used to add a \"buffer zone\" of a certain width around obstacles to prevent the robot from getting too close to them.",[47,7895,7896,7902,7908,7914,7920,7926],{},[50,7897,7898,7901],{},[76,7899,7900],{},"cost_scaling_factor",": Scaling factor for the expansion cost.",[50,7903,7904,7907],{},[76,7905,7906],{},"enabled",": Controls whether the inflation layer is enabled.",[50,7909,7910,7913],{},[76,7911,7912],{},"inflate_around_unknown",": Controls whether to inflate around unknown space.",[50,7915,7916,7919],{},[76,7917,7918],{},"inflate_unknown",": Controls whether unknown space is treated as an obstacle and inflated.",[50,7921,7922,7925],{},[76,7923,7924],{},"inflation_radius",": The radius of expansion.",[50,7927,7928,7930],{},[76,7929,7679],{},": Specifies the inflation layer plugin to use.",[50,7932,7933,7936],{},[76,7934,7935],{},"lethal_cost_threshold",": Defines the cost threshold in the costmap for considering an obstacle as \"lethal\".",[50,7938,7939,7941],{},[76,7940,6056],{},": Specify the ROS topic to subscribe to for map information.",[50,7943,7944,7947],{},[76,7945,7946],{},"observation_sources",": Define the observation sources for the costmap, i.e., which sensors or data sources are used to update the map.",[50,7949,7950,7953,7954],{},[76,7951,7952],{},"obstacle_layer",": Configure the parameters of the obstacle layer, which is responsible for processing obstacle information observed by sensors.",[47,7955,7956,7962,7967,7973,7982,7987,7992],{},[50,7957,7958,7961],{},[76,7959,7960],{},"combination_method",": Defines how to combine information from multiple observation sources.",[50,7963,7964,7966],{},[76,7965,7906],{},": Controls whether the obstacle layer is enabled.",[50,7968,7969,7972],{},[76,7970,7971],{},"footprint_clearing_enabled",": Controls whether to clear obstacle information within the robot's footprint.",[50,7974,7975,540,7978,7981],{},[76,7976,7977],{},"max_obstacle_height",[76,7979,7980],{},"min_obstacle_height",": Define the height range of obstacles.",[50,7983,7984,7986],{},[76,7985,7946],{},": Specifies the source of obstacle information.",[50,7988,7989,7991],{},[76,7990,7679],{},": Specifies the obstacle layer plugin to use.",[50,7993,7994,7996],{},[76,7995,933],{},": Contains configuration related to laser scanning, such as how scan data is processed.",[50,7998,7999,540,8002,8005],{},[76,8000,8001],{},"origin_x",[76,8003,8004],{},"origin_y",": Define the coordinates of the global costmap origin.",[50,8007,8008,8011],{},[76,8009,8010],{},"plugins",": List the enabled costmap plugins, which define how to build and update the costmap.",[50,8013,8014,8017],{},[76,8015,8016],{},"publish_frequency",": Defines the frequency of publishing the costmap.",[50,8019,8020,8022],{},[76,8021,1011],{},": Defines the resolution of the costmap, which is the actual physical size represented by each cell.",[50,8024,8025,8027],{},[76,8026,7553],{},": Define the reference coordinate system for the robot base.",[50,8029,8030,8033],{},[76,8031,8032],{},"robot_radius",": Defines the robot's radius, used to calculate the robot's footprint on the map.",[50,8035,8036,8039],{},[76,8037,8038],{},"rolling_window",": Controls whether to use a scrolling window (i.e., a dynamically changing map area) instead of a fixed-size map.",[50,8041,8042,8045,8046],{},[76,8043,8044],{},"static_layer",": Configure the parameters of the static layer, which is responsible for processing static obstacle information in the map.",[47,8047,8048,8053,8058,8063,8068,8074],{},[50,8049,8050,8052],{},[76,8051,7906],{},": Controls whether the static layer is enabled.",[50,8054,8055,8057],{},[76,8056,4297],{},": Controls whether to subscribe to transient local map updates.",[50,8059,8060,8062],{},[76,8061,6056],{},": Specify the ROS topic for the static map (if different from the global map).",[50,8064,8065,8067],{},[76,8066,7679],{},": Specifies the static layer plugin to use.",[50,8069,8070,8073],{},[76,8071,8072],{},"subscribe_to_updates",": Controls whether to subscribe to map updates.",[50,8075,8076,8078],{},[76,8077,5896],{},": Define the tolerance for coordinate transformation.",[50,8080,8081,8084],{},[76,8082,8083],{},"track_unknown_space",": Controls whether to track unknown space in the map.",[50,8086,8087,8089],{},[76,8088,5896],{},": Defines the allowable error range during coordinate transformation.",[50,8091,8092,8095],{},[76,8093,8094],{},"trinary_costmap",": Controls whether to use a three-state costmap (free, occupied, unknown) instead of only two states (free, occupied).",[50,8097,8098,8101],{},[76,8099,8100],{},"unknown_cost_value",": Value representing unknown space in the costmap.",[50,8103,8104,8107],{},[76,8105,8106],{},"update_frequency",": Defines the frequency at which the costmap is updated.",[50,8109,8110,8113],{},[76,8111,8112],{},"use_maximum",": Controls whether to use the maximum value from multiple observation sources to update the costmap.",[50,8115,8116,8118],{},[76,8117,5902],{},": Controls whether to use simulation time (useful in simulation environments).",[50,8120,8121,8124,8125],{},[76,8122,8123],{},"voxel_layer",": Configure the parameters of the voxel layer. The voxel layer uses a voxel grid to represent obstacle information in three-dimensional space.",[47,8126,8127,8132,8137,8146,8153,8158,8164,8169,8175,8179],{},[50,8128,8129,8131],{},[76,8130,7906],{},": Controls whether the voxel layer is enabled.",[50,8133,8134,8136],{},[76,8135,7971],{},": Controls whether to clear voxel information within the robot's footprint.",[50,8138,8139,540,8142,8145],{},[76,8140,8141],{},"mark_threshold",[76,8143,8144],{},"unknown_threshold",": Define the thresholds for treating voxels as obstacles or unknown.",[50,8147,8148,540,8150,8152],{},[76,8149,7977],{},[76,8151,7980],{},": Define the height range of obstacles represented by voxels.",[50,8154,8155,8157],{},[76,8156,7946],{},": Specifies the source of voxel information.",[50,8159,8160,8163],{},[76,8161,8162],{},"origin_z",": Defines the origin of the voxel grid on the Z-axis.",[50,8165,8166,8168],{},[76,8167,7679],{},": Specifies the voxel layer plugin to use.",[50,8170,8171,8174],{},[76,8172,8173],{},"publish_voxel_map",": Controls whether to publish the voxel map.",[50,8176,8177,7996],{},[76,8178,933],{},[50,8180,8181,540,8184,8187],{},[76,8182,8183],{},"z_resolution",[76,8185,8186],{},"z_voxels",": Define the resolution and number of voxels in the Z-axis for the voxel grid.",[15,8189,8191],{"id":8190},"controller-node-description","Controller Node Description",[19,8193,8194,8195,8198,8199,8202,8203,8205,8206,8209],{},"In the Nav2 navigation system, the ",[76,8196,8197],{},"nav2_controller"," function package's ",[76,8200,8201],{},"controller_server"," is responsible for handling control requests during navigation tasks, ensuring the robot can move along the planned path. Its main function is to generate speed and direction control commands based on the global or local path calculated by the ",[76,8204,7610],{}," module, i.e., controlling the robot to follow the planned path. When executing, this node also depends on the map messages provided by the ",[76,8207,8208],{},"/local_costmap/local_costmap"," node.",[19,8211,8212],{},[22,8213,8214],{},"Topics subscribed to by controller_server",[557,8216,8217,8227],{},[560,8218,8219],{},[563,8220,8221,8223,8225],{},[566,8222,569],{"align":568},[566,8224,4255],{"align":568},[566,8226,575],{"align":568},[577,8228,8229,8238],{},[563,8230,8231,8233,8235],{},[582,8232,2831],{"align":568},[582,8234,2834],{"align":568},[582,8236,8237],{"align":568},"The robot's odometry information, including position, velocity, and orientation.",[563,8239,8240,8243,8246],{},[582,8241,8242],{"align":568},"/speed_limit",[582,8244,8245],{"align":568},"nav2_msgs/msg/SpeedLimit",[582,8247,8248],{"align":568},"Speed limit information during navigation, used to dynamically adjust the robot's movement speed.",[19,8250,8251],{},[22,8252,8253],{},"Topics published by controller_server",[557,8255,8256,8268],{},[560,8257,8258],{},[563,8259,8260,8263,8266],{},[566,8261,8262],{"align":568},"Topic Name",[566,8264,8265],{"align":568},"Message type",[566,8267,575],{"align":568},[577,8269,8270,8281,8292,8302,8313,8323],{},[563,8271,8272,8275,8278],{},[582,8273,8274],{"align":568},"/cmd_vel_nav",[582,8276,8277],{"align":568},"geometry_msgs/msg/Twist",[582,8279,8280],{"align":568},"Publish control commands, including linear and angular velocity, to move the robot along the planned path.",[563,8282,8283,8286,8289],{},[582,8284,8285],{"align":568},"/cost_cloud",[582,8287,8288],{"align":568},"sensor_msgs/msg/PointCloud2",[582,8290,8291],{"align":568},"Publish point cloud data in the cost map for obstacle avoidance and path planning.",[563,8293,8294,8297,8299],{},[582,8295,8296],{"align":568},"/local_plan",[582,8298,7642],{"align":568},[582,8300,8301],{"align":568},"Publish the local path planning result, i.e., how the robot should reach a point near the current target point.",[563,8303,8304,8307,8310],{},[582,8305,8306],{"align":568},"/marker",[582,8308,8309],{"align":568},"visualization_msgs/msg/MarkerArray",[582,8311,8312],{"align":568},"Publish visualization markers to display information such as paths and obstacles in visualization tools like RViz.",[563,8314,8315,8318,8320],{},[582,8316,8317],{"align":568},"/received_global_plan",[582,8319,7642],{"align":568},[582,8321,8322],{"align":568},"Publishes the global path received from the global planner, i.e., the path from the current position to the target point.",[563,8324,8325,8328,8330],{},[582,8326,8327],{"align":568},"/transformed_global_plan",[582,8329,7642],{"align":568},[582,8331,8332],{"align":568},"Publish the globally transformed path after coordinate transformation, ensuring the path is consistent with the robot's current coordinate system.",[19,8334,8335],{},[22,8336,8337],{},"3. controller_server parameters",[47,8339,8340,8374,8377,8380,8383,8386,8389,8392,8395,8398,8401,8404],{},[50,8341,8342,8343],{},"FollowPath: This section defines a plugin or configuration set named FollowPath, which may be a configuration for a path-following behavior or algorithm. It contains multiple sub-parameters and sub-configurations used to define how to follow the path.",[47,8344,8345,8359,8362,8365,8368,8371],{},[50,8346,8347,8348],{},"BaseObstacle: Defines basic obstacle evaluation parameters, used to avoid obstacles during path following.",[47,8349,8350,8353,8356],{},[50,8351,8352],{},"class: specifies the name of the class, which here is BaseObstacle, indicating this is a basic obstacle evaluation component.",[50,8354,8355],{},"scale: Defines the weight or influence of this obstacle assessment within the overall evaluation.",[50,8357,8358],{},"sum_scores: Indicates whether to accumulate scores from multiple obstacles; false may mean using the maximum value or other logic.",[50,8360,8361],{},"GoalAlign, GoalDist, PathAlign, PathDist, RotateToGoal, Oscillation: These are different evaluation or behavior components during the path following process, each with its own specific parameters and purposes, such as aligning with the goal, maintaining distance from the goal or path, reducing oscillation, and so on.",[50,8363,8364],{},"acc_lim_theta, acc_lim_x, acc_lim_y: These parameters define the acceleration limits of the robot in different directions.",[50,8366,8367],{},"critics: specifies which evaluation components (or \"critics\") will be used for path following decisions.",[50,8369,8370],{},"debug_trajectory_details: Indicates whether to publish detailed debugging information for the trajectory.",[50,8372,8373],{},"Other parameters related to speed, acceleration, time granularity, trajectory generation, and so on collectively define the behavior and performance of the path following algorithm.",[50,8375,8376],{},"controller_frequency: Specifies the operating frequency of the controller (which may be FollowPath or another controller), in Hertz.",[50,8378,8379],{},"controller_plugins: Specifies the list of controller plugins to be used; here, it only includes FollowPath.",[50,8381,8382],{},"failure_tolerance: Defines the time or distance allowed for tolerating failure, providing a buffer when evaluating whether the controller has failed.",[50,8384,8385],{},"general_goal_checker: Defines a general goal checker used to determine whether the robot has reached its target position and orientation.",[50,8387,8388],{},"goal_checker_plugins: Specifies the list of goal checker plugins to be used.",[50,8390,8391],{},"min_theta_velocity_threshold, min_x_velocity_threshold, min_y_velocity_threshold: These define the minimum velocity thresholds for the robot in different directions; values below these thresholds may be considered as stopped or stationary.",[50,8393,8394],{},"odom_topic: Specifies the ROS topic for odometry information.",[50,8396,8397],{},"progress_checker: Defines a progress checker used to evaluate whether the robot is moving toward the target.",[50,8399,8400],{},"qos_overrides: Defines QoS (Quality of Service) override settings for ROS services or topics, used to adjust the reliability and performance of message delivery.",[50,8402,8403],{},"speed_limit_topic: Specifies the ROS topic for speed limit information.",[50,8405,8406],{},"use_sim_time: Indicates whether to use simulated time, which is very useful in the ROS simulation environment.",[19,8408,8409],{},[22,8410,8411],{},"4. Topics subscribed to by /local_costmap/local_costmap",[557,8413,8414,8424],{},[560,8415,8416],{},[563,8417,8418,8420,8422],{},[566,8419,569],{"align":568},[566,8421,4255],{"align":568},[566,8423,575],{"align":568},[577,8425,8426,8436],{},[563,8427,8428,8431,8433],{},[582,8429,8430],{"align":568},"/local_costmap/footprint",[582,8432,7748],{"align":568},[582,8434,8435],{"align":568},"Footprint polygon of a robot or mobile platform, used for local costmap calculation.",[563,8437,8438,8440,8442],{},[582,8439,584],{"align":568},[582,8441,587],{"align":568},[582,8443,8444],{"align":568},"Laser scanner scan data, used for environmental perception and obstacle avoidance.",[19,8446,8447],{},[22,8448,8449],{},"5. Topics published by /local_costmap/local_costmap",[557,8451,8452,8462],{},[560,8453,8454],{},[563,8455,8456,8458,8460],{},[566,8457,569],{"align":568},[566,8459,4255],{"align":568},[566,8461,575],{"align":568},[577,8463,8464,8474,8484,8494,8504,8514],{},[563,8465,8466,8469,8471],{},[582,8467,8468],{"align":568},"/local_costmap/clearing_endpoints",[582,8470,8288],{"align":568},[582,8472,8473],{"align":568},"Remove obstacle point cloud data from the cost map, typically used for dynamic obstacle handling.",[563,8475,8476,8479,8481],{},[582,8477,8478],{"align":568},"/local_costmap/costmap",[582,8480,712],{"align":568},[582,8482,8483],{"align":568},"Local cost map, representing the traversability of the environment around the robot.",[563,8485,8486,8489,8491],{},[582,8487,8488],{"align":568},"/local_costmap/costmap_raw",[582,8490,7806],{"align":568},[582,8492,8493],{"align":568},"Unprocessed local cost map, which may contain more detailed information.",[563,8495,8496,8499,8501],{},[582,8497,8498],{"align":568},"/local_costmap/costmap_updates",[582,8500,7817],{"align":568},[582,8502,8503],{"align":568},"Local costmap update information, including which areas have changed.",[563,8505,8506,8509,8511],{},[582,8507,8508],{"align":568},"/local_costmap/published_footprint",[582,8510,7828],{"align":568},[582,8512,8513],{"align":568},"The published robot footprint polygon, with timestamps indicating the publication time.",[563,8515,8516,8519,8522],{},[582,8517,8518],{"align":568},"/local_costmap/voxel_grid",[582,8520,8521],{"align":568},"nav2_msgs/msg/VoxelGrid",[582,8523,8524],{"align":568},"Voxel grid data, used for spatial partitioning and optimization in cost map generation.",[19,8526,8527],{},[22,8528,8529],{},"6. /local_costmap/local_costmap parameters",[47,8531,8532,8540,8548,8561,8566,8571,8576,8581,8586,8591,8596,8601,8606,8611,8618,8623,8628,8633,8638,8643,8651,8656,8661,8666,8671,8676,8681,8686],{},[50,8533,8534,8536,8537,8539],{},[76,8535,7348],{},": Whether to disable heartbeat timeout checks between nodes. When set to ",[76,8538,2079],{},", it means this feature is disabled, which may be used to reduce network traffic or adapt to specific network environments.",[50,8541,8542,8544,8545,8547],{},[76,8543,7848],{},": Whether to always send the complete costmap. When set to ",[76,8546,2079],{},", the node will not rely on incremental updates, but will always send the full costmap data.",[50,8549,8550,8552,8553,1500,8555,6092,8557,8560],{},[76,8551,7854],{},": Specifies the list of layers that can be cleared. In this example, it includes ",[76,8554,7952],{},[76,8556,8123],{},[76,8558,8559],{},"range_layer",", meaning obstacle data in these layers can be cleared.",[50,8562,8563,8565],{},[76,8564,7860],{},": Used to specify the list of filters applied to the costmap. It is empty here, indicating that no filters are applied.",[50,8567,8568,8570],{},[76,8569,7866],{},": The robot's footprint polygon defines the physical area the robot occupies in two-dimensional space.",[50,8572,8573,8575],{},[76,8574,7872],{},": The footprint padding, used to add extra space around the robot's footprint when calculating the cost map.",[50,8577,8578,8580],{},[76,8579,7547],{},": The name of the global reference coordinate system, typically used for localization and navigation tasks.",[50,8582,8583,8585],{},[76,8584,7883],{},": The height of the cost map (in number of cells).",[50,8587,8588,8590],{},[76,8589,7892],{},": Configuration of the inflation layer, used to add a certain range of inflated area around obstacles, keeping the robot at a safe distance from obstacles.",[50,8592,8593,8595],{},[76,8594,7935],{},": Fatal cost threshold. Cost values exceeding this threshold represent impassable areas.",[50,8597,8598,8600],{},[76,8599,6056],{},": The name of the subscribed map topic, used to obtain global map information.",[50,8602,8603,8605],{},[76,8604,7946],{},": The configuration of the observation source specifies which sensor data will be used to update the cost map. Here it is an empty string, which may be due to a default value or a different configuration method.",[50,8607,8608,8610],{},[76,8609,7952],{},": Configuration of the obstacle layer, used to process obstacle data from sensors such as LiDAR.",[50,8612,8613,1500,8615,8617],{},[76,8614,8001],{},[76,8616,8004],{},": The X and Y coordinates of the costmap origin, defining the costmap's position in the global coordinate system.",[50,8619,8620,8622],{},[76,8621,8010],{},": List of enabled plugins, defining the different layers used by the costmap (such as obstacle layer, inflation layer, etc.).",[50,8624,8625,8627],{},[76,8626,8016],{},": The publishing frequency of the cost map (in Hz).",[50,8629,8630,8632],{},[76,8631,1011],{},": The resolution of the costmap (in meters per cell).",[50,8634,8635,8637],{},[76,8636,7553],{},": The name of the reference coordinate system for the robot base, used to locate the robot.",[50,8639,8640,8642],{},[76,8641,8032],{},": The robot's radius, used to represent its physical size in the costmap.",[50,8644,8645,8647,8648,8650],{},[76,8646,8038],{},": Whether to use a rolling window. When set to ",[76,8649,2079],{},", the cost map will update its position and range as the robot moves.",[50,8652,8653,8655],{},[76,8654,8083],{},": Whether to track unknown space. In some cases, this may be used to handle unexplored or unknown areas.",[50,8657,8658,8660],{},[76,8659,5896],{},": Transformation tolerance, which defines the thresholds for acceptable time difference and angle difference in a transformation.",[50,8662,8663,8665],{},[76,8664,8094],{},": Whether to use a three-state cost map (typically free, occupied, unknown).",[50,8667,8668,8670],{},[76,8669,8100],{},": Cost value of unknown areas in the costmap.",[50,8672,8673,8675],{},[76,8674,8106],{},": The update frequency of the costmap (in Hz), which is different from the publish frequency.",[50,8677,8678,8680],{},[76,8679,8112],{},": Whether to use the maximum value when cost information for the same location is provided by multiple sources.",[50,8682,8683,8685],{},[76,8684,5902],{},": Whether to use simulated time instead of system time. This is useful in simulation environments.",[50,8687,8688,8690],{},[76,8689,8123],{},": Configuration of the voxel layer, used to divide three-dimensional space into voxels (volume pixels) to improve the processing efficiency of the cost map.",[15,8692,8694],{"id":8693},"recoverer-node-description","Recoverer Node Description",[19,8696,8697,8698,8701,8702,934],{},"Recovery behavior is a crucial part of the robot navigation process, allowing the robot to take a series of predefined actions to attempt recovery when encountering obstacles, getting stuck, or facing other navigation issues. In Nav2, this functionality is implemented by the ",[76,8699,8700],{},"nav2_behaviors"," feature package's ",[76,8703,8704],{},"behavior_server",[19,8706,8707],{},[22,8708,5694],{},[557,8710,8711,8721],{},[560,8712,8713],{},[563,8714,8715,8717,8719],{},[566,8716,569],{"align":568},[566,8718,4255],{"align":568},[566,8720,575],{"align":568},[577,8722,8723,8734,8744,8753,8762],{},[563,8724,8725,8728,8731],{},[582,8726,8727],{"align":568},"/clock",[582,8729,8730],{"align":568},"rosgraph_msgs/msg/Clock",[582,8732,8733],{"align":568},"ROS system time",[563,8735,8736,8739,8741],{},[582,8737,8738],{"align":568},"/cmd_vel_teleop",[582,8740,8277],{"align":568},[582,8742,8743],{"align":568},"Teleoperation commands for controlling the robot's linear and angular velocity.",[563,8745,8746,8748,8750],{},[582,8747,8488],{"align":568},[582,8749,7806],{"align":568},[582,8751,8752],{"align":568},"Raw data of the local costmap",[563,8754,8755,8757,8759],{},[582,8756,8508],{"align":568},[582,8758,7828],{"align":568},[582,8760,8761],{"align":568},"The robot's published footprint in the local costmap",[563,8763,8764,8767,8770],{},[582,8765,8766],{"align":568},"/preempt_teleop",[582,8768,8769],{"align":568},"std_msgs/msg/Empty",[582,8771,8772],{"align":568},"Teleoperation preemption signal, used to interrupt the current teleoperation.",[19,8774,8775],{},[22,8776,5753],{},[557,8778,8779,8789],{},[560,8780,8781],{},[563,8782,8783,8785,8787],{},[566,8784,569],{"align":568},[566,8786,4255],{"align":568},[566,8788,575],{"align":568},[577,8790,8791],{},[563,8792,8793,8796,8798],{},[582,8794,8795],{"align":568},"/cmd_vel",[582,8797,8277],{"align":568},[582,8799,8800],{"align":568},"Speed command sent to the low-level controller.",[19,8802,8803],{},[22,8804,8805],{},"3. Provided Action Server",[557,8807,8808,8819],{},[560,8809,8810],{},[563,8811,8812,8814,8817],{},[566,8813,569],{"align":568},[566,8815,8816],{"align":568},"Action Interface",[566,8818,575],{"align":568},[577,8820,8821,8832,8843,8854,8865],{},[563,8822,8823,8826,8829],{},[582,8824,8825],{"align":568},"/assisted_teleop",[582,8827,8828],{"align":568},"nav2_msgs/action/AssistedTeleop",[582,8830,8831],{"align":568},"Remote-assisted operation service that allows users to provide directional input during navigation.",[563,8833,8834,8837,8840],{},[582,8835,8836],{"align":568},"/backup",[582,8838,8839],{"align":568},"nav2_msgs/action/BackUp",[582,8841,8842],{"align":568},"Backward motion service, used to make the robot move backward in specific situations.",[563,8844,8845,8848,8851],{},[582,8846,8847],{"align":568},"/drive_on_heading",[582,8849,8850],{"align":568},"nav2_msgs/action/DriveOnHeading",[582,8852,8853],{"align":568},"Action service for traveling along a specified heading.",[563,8855,8856,8859,8862],{},[582,8857,8858],{"align":568},"/spin",[582,8860,8861],{"align":568},"nav2_msgs/action/Spin",[582,8863,8864],{"align":568},"Rotation action service, allowing the robot to rotate in place.",[563,8866,8867,8870,8873],{},[582,8868,8869],{"align":568},"/wait",[582,8871,8872],{"align":568},"nav2_msgs/action/Wait",[582,8874,8875],{"align":568},"Wait for the action service, causing the robot to wait at its current position for a specified duration.",[19,8877,8878],{},[22,8879,5842],{},[47,8881,8882,8887,8895,8900,8905,8913,8931,8937,8943,8949,8955,8967,8973,8979,8988],{},[50,8883,8884,8886],{},[76,8885,5902],{},": This parameter specifies whether to use simulated time instead of real time. This is very useful in simulation environments, where time can be sped up or slowed down without waiting for real time to pass.",[50,8888,8889,8891,8892,8894],{},[76,8890,7547],{},": Defines the name of the global coordinate system, which is typically used for localization and path planning in navigation tasks. Here, it is set to ",[76,8893,2516],{},", meaning that odometry data is used as the reference for the global coordinate system.",[50,8896,8897,8899],{},[76,8898,7553],{},": Specifies the coordinate system name for the robot base. This is the reference point on the robot used for positioning and motion control, typically corresponding to the robot's physical center or the center of its drive wheels.",[50,8901,8902,8904],{},[76,8903,7559],{},": This is a ROS topic name used to publish odometry data. Odometry data contains information about the robot's position and orientation changes over time, and is one of the key inputs for navigation and localization systems.",[50,8906,8907,8909,8910,8912],{},[76,8908,7348],{},": This parameter may be used to configure the heartbeat detection mechanism between ROS nodes. Setting it to ",[76,8911,2079],{}," likely means disabling or adjusting the heartbeat timeout behavior to avoid unnecessary timeout errors in specific scenarios, such as simulation environments.",[50,8914,8915,1500,8918,1500,8921,1500,8924,1500,8927,8930],{},[76,8916,8917],{},"assisted_teleop",[76,8919,8920],{},"backup",[76,8922,8923],{},"drive_on_heading",[76,8925,8926],{},"spin",[76,8928,8929],{},"wait",": These are configuration items for behavior plugins that may be used in a behavior tree. Each plugin defines a specific behavior the robot can execute, such as assisted teleoperation, moving backward, driving in a specified direction, rotating in place, and waiting.",[50,8932,8933,8936],{},[76,8934,8935],{},"behavior_plugins",": Lists the names of available behavior plugins in the behavior tree.",[50,8938,8939,8942],{},[76,8940,8941],{},"cmd_vel_teleop",": Specifies the ROS topic name for velocity control commands used in teleoperation.",[50,8944,8945,8948],{},[76,8946,8947],{},"costmap_topic",": Defines the ROS topic name for the local costmap, which is used to represent obstacles and traversable areas in the environment.",[50,8950,8951,8954],{},[76,8952,8953],{},"cycle_frequency",": Defines the frequency (in Hertz) at which the navigation system updates its state and plans new paths.",[50,8956,8957,1500,8960,1500,8963,8966],{},[76,8958,8959],{},"max_rotational_vel",[76,8961,8962],{},"min_rotational_vel",[76,8964,8965],{},"rotational_acc_lim",": These parameters define the maximum speed, minimum speed, and acceleration limits when the robot rotates.",[50,8968,8969,8972],{},[76,8970,8971],{},"projection_time",": Time parameters related to updating the costmap or predicting future obstacle positions.",[50,8974,8975,8978],{},[76,8976,8977],{},"footprint_topic",": Defines the ROS topic name for publishing the robot's footprint (i.e., the space occupied by the robot).",[50,8980,8981,1500,8984,8987],{},[76,8982,8983],{},"simulate_ahead_time",[76,8985,8986],{},"simulation_time_step",": These parameters are related to the simulation environment and may be used to control the passage of time and step size during the simulation process.",[50,8989,8990,8992],{},[76,8991,5896],{},": Defines the tolerance range for coordinate transformations, used to handle minor discrepancies between different coordinate systems.",[15,8994,8996],{"id":8995},"waypoint-following-node-description","Waypoint Following Node Description",[19,8998,8999,9000,7328,9003,9006,9007,540,9010,9013],{},"In the Nav2 navigation stack, the ",[76,9001,9002],{},"nav2_waypoint_follower",[76,9004,9005],{},"/waypoint_follower"," node is responsible for tracking a sequence of waypoints generated by the path planner, ensuring the robot moves safely and accurately along the planned path. The main function of this node is to compute control commands to guide the robot's motion based on the current robot position and velocity, as well as the list of waypoints provided by the path planner (such as ",[76,9008,9009],{},"nav2_global_planner",[76,9011,9012],{},"nav2_local_planner","). These control commands may include linear and angular velocity commands, or more specific kinematic or dynamic commands, depending on the robot's type and configuration.",[19,9015,9016],{},[22,9017,9018],{},"1. Provided Action Server",[557,9020,9021,9031],{},[560,9022,9023],{},[563,9024,9025,9027,9029],{},[566,9026,569],{"align":568},[566,9028,8816],{"align":568},[566,9030,575],{"align":568},[577,9032,9033],{},[563,9034,9035,9038,9041],{},[582,9036,9037],{"align":568},"/follow_waypoints",[582,9039,9040],{"align":568},"nav2_msgs/action/FollowWaypoints",[582,9042,9043],{"align":568},"Allow the client to request the planner_server to navigate along a series of waypoints.",[19,9045,9046],{},[22,9047,9048],{},"2. Requested Action Service",[557,9050,9051,9061],{},[560,9052,9053],{},[563,9054,9055,9057,9059],{},[566,9056,569],{"align":568},[566,9058,8816],{"align":568},[566,9060,575],{"align":568},[577,9062,9063],{},[563,9064,9065,9067,9069],{},[582,9066,7525],{"align":568},[582,9068,7528],{"align":568},[582,9070,9071],{"align":568},"Allow the planner_server (or the node calling it) to request navigation to a specified pose.",[19,9073,9074],{},[22,9075,9076],{},"3. Parameters",[47,9078,9079,9084,9090,9096,9101,9107],{},[50,9080,9081,9083],{},[76,9082,5902],{},": Specifies whether to use simulated time instead of real time for node timing and synchronization. This is particularly useful in simulation environments, where the clock may not be fully synchronized with real time.",[50,9085,9086,9089],{},[76,9087,9088],{},"loop_rate",": Defines the main loop rate of the node, which is the number of times per second the node performs its primary tasks (such as processing data, publishing information, etc.). This parameter is crucial for controlling the node's responsiveness and resource usage.",[50,9091,9092,9095],{},[76,9093,9094],{},"stop_on_failure",": Indicates whether the node should stop execution when the navigation task encounters an insurmountable obstacle or reaches other failure conditions. This is important for ensuring the system can safely stop and wait for further instructions in the event of a failure.",[50,9097,9098,9100],{},[76,9099,5854],{},": A reliability mechanism for inter-node communication. Bond is a mechanism in ROS 2 for stable communication between nodes, where a heartbeat signal is used to detect whether a node is still active. Setting this parameter to true disables heartbeat timeout detection, which may be useful in certain network configurations or application scenarios.",[50,9102,9103,9106],{},[76,9104,9105],{},"waypoint_task_executor_plugin",": Specifies the plugin to use when executing a waypoint navigation task. Waypoint navigation typically involves a series of predefined points that the robot must visit in sequence. This parameter allows the user to specify a specific plugin or algorithm for performing this type of task.",[50,9108,9109,9112,9113],{},[76,9110,9111],{},"wait_at_waypoint",": This is a compound parameter used to configure specific behavior when waiting at a waypoint.",[47,9114,9115,9120,9125],{},[50,9116,9117,9119],{},[76,9118,7906],{},": Enable or disable the function of waiting when reaching each waypoint.",[50,9121,9122,9124],{},[76,9123,7679],{},": Specifies the plugin type that implements the wait functionality. This allows users to select different waiting strategies or behaviors as needed.",[50,9126,9127,9130],{},[76,9128,9129],{},"waypoint_pause_duration",": Defines the duration (in milliseconds) to wait at each waypoint. This can be used to ensure the robot has stabilized or completed certain operations before moving to the next waypoint.",[15,9132,9134],{"id":9133},"path-smoothing-node-description","Path Smoothing Node Description",[19,9136,9137,9138,7607,9141,9144],{},"In the Nav2 framework, the ",[76,9139,9140],{},"smoother_server",[76,9142,9143],{},"nav2_smoother"," package smooths planned paths by loading and running various smoother plugins, enabling the robot to move more smoothly, continuously, and safely. This feature is significant for improving the robot's navigation performance and reducing hardware wear.",[19,9146,9147],{},[22,9148,5694],{},[557,9150,9151,9161],{},[560,9152,9153],{},[563,9154,9155,9157,9159],{},[566,9156,569],{"align":568},[566,9158,4255],{"align":568},[566,9160,575],{"align":568},[577,9162,9163,9172],{},[563,9164,9165,9167,9169],{},[582,9166,7803],{"align":568},[582,9168,7806],{"align":568},[582,9170,9171],{"align":568},"Raw data of the global costmap, used for path planning.",[563,9173,9174,9176,9178],{},[582,9175,7825],{"align":568},[582,9177,7828],{"align":568},[582,9179,9180],{"align":568},"The robot's footprint representation in the global costmap",[19,9182,9183],{},[22,9184,5753],{},[557,9186,9187,9197],{},[560,9188,9189],{},[563,9190,9191,9193,9195],{},[566,9192,569],{"align":568},[566,9194,4255],{"align":568},[566,9196,575],{"align":568},[577,9198,9199],{},[563,9200,9201,9204,9206],{},[582,9202,9203],{"align":568},"/plan_smoothed",[582,9205,7642],{"align":568},[582,9207,9208],{"align":568},"The smoothed global path",[19,9210,9211],{},[22,9212,8805],{},[557,9214,9215,9226],{},[560,9216,9217],{},[563,9218,9219,9221,9224],{},[566,9220,569],{"align":568},[566,9222,9223],{"align":568},"Action type",[566,9225,575],{"align":568},[577,9227,9228],{},[563,9229,9230,9233,9236],{},[582,9231,9232],{"align":568},"/smooth_path",[582,9234,9235],{"align":568},"nav2_msgs/action/SmoothPath",[582,9237,9238],{"align":568},"Provides a path smoothing service, accepts path smoothing requests, and returns the smoothed path. This allows clients (such as behavior trees) to asynchronously request path smoothing and receive the result once smoothing is complete.",[19,9240,9241],{},[22,9242,5842],{},[47,9244,9245,9250,9255,9260,9265,9310,9319,9324],{},[50,9246,9247,9249],{},[76,9248,7348],{},": Indicates whether to disable Bond's heartbeat timeout feature. In distributed systems, Bond is used to manage connections and heartbeats between nodes; this parameter adjusts heartbeat-related behavior.",[50,9251,9252,9254],{},[76,9253,8947],{},": The ROS topic name for costmap data, typically the raw data of the global costmap.",[50,9256,9257,9259],{},[76,9258,8977],{},": The ROS topic name for the robot's footprint (i.e., the area the robot occupies on the map), used to represent the robot's physical dimensions in the global costmap.",[50,9261,9262,9264],{},[76,9263,7553],{},": Specifies the coordinate frame name of the robot base, which serves as the reference point for localization and movement in robot navigation.",[50,9266,9267,5189,9270],{},[76,9268,9269],{},"simple_smoother",[47,9271,9272,9278,9284,9293,9298,9304],{},[50,9273,9274,9277],{},[76,9275,9276],{},"do_refinement",": Indicates whether to enable the refinement (or further optimization) process for the path.",[50,9279,9280,9283],{},[76,9281,9282],{},"max_its",": The maximum number of iterations allowed during the smoothing process, used to control the convergence time of the smoothing algorithm.",[50,9285,9286,9288,9289,9292],{},[76,9287,7679],{},": The type of smoothing plugin, here it is ",[76,9290,9291],{},"nav2_smoother::SimpleSmoother",", indicating the use of a simple smoothing algorithm.",[50,9294,9295,9297],{},[76,9296,7685],{},": The convergence tolerance of the smoothing algorithm; when the path change is less than this value, the smoothing process is considered complete.",[50,9299,9300,9303],{},[76,9301,9302],{},"w_data",": The weight of data items (such as obstacle distance) during the smoothing process.",[50,9305,9306,9309],{},[76,9307,9308],{},"w_smooth",": The weight of smoothing terms (such as path curvature) during the smoothing process.",[50,9311,9312,9315,9316,9318],{},[76,9313,9314],{},"smoother_plugins",": The defined list of smoothing plugins, which lists ",[76,9317,9269],{},", indicates that this plugin will be used for path smoothing.",[50,9320,9321,9323],{},[76,9322,5896],{},": Tolerance for coordinate transformation, used to handle uncertainty when converting between different coordinate systems.",[50,9325,9326,9328,9329,9331,9332,9334],{},[76,9327,5902],{},": Specifies whether to use simulated time instead of real time. In a simulation environment, this is typically set to ",[76,9330,2079],{}," to match the simulator's virtual time; in a real environment, it should be set to ",[76,9333,2555],{}," to use the actual time of the ROS system.",[15,9336,9338],{"id":9337},"speed-smoothing-node-description","Speed Smoothing Node Description",[19,9340,1200,9341,7607,9344,9347],{},[76,9342,9343],{},"nav2_velocity_smoother",[76,9345,9346],{},"velocity_smoother"," package in the Nav2 framework is primarily responsible for smoothing the velocity commands sent by the Nav2 framework to the robot controller. Its core functionality is to achieve velocity and acceleration smoothing. This feature is crucial for ensuring the stability and safety of the robot during navigation.",[19,9349,9350],{},[22,9351,5694],{},[557,9353,9354,9364],{},[560,9355,9356],{},[563,9357,9358,9360,9362],{},[566,9359,569],{"align":568},[566,9361,4255],{"align":568},[566,9363,575],{"align":568},[577,9365,9366],{},[563,9367,9368,9370,9372],{},[582,9369,8274],{"align":568},[582,9371,8277],{"align":568},[582,9373,9374],{"align":568},"Topic for receiving velocity control commands from other nodes",[19,9376,9377],{},[22,9378,5753],{},[557,9380,9381,9391],{},[560,9382,9383],{},[563,9384,9385,9387,9389],{},[566,9386,569],{"align":568},[566,9388,4255],{"align":568},[566,9390,575],{"align":568},[577,9392,9393],{},[563,9394,9395,9397,9399],{},[582,9396,8795],{"align":568},[582,9398,8277],{"align":568},[582,9400,9401],{"align":568},"Publish the topic for speed control commands after processing or smoothing.",[19,9403,9404],{},[22,9405,9076],{},[47,9407,9408,9416,9422,9432,9438,9444,9450,9456,9465,9473,9482,9488,9493],{},[50,9409,9410,9412,9413,9415],{},[76,9411,5854],{},": Indicates whether to disable the heartbeat timeout mechanism between nodes. If set to ",[76,9414,2079],{},", the heartbeat detection between nodes will not disconnect due to timeout.",[50,9417,9418,9421],{},[76,9419,9420],{},"deadband_velocity",": Defines which velocity components to apply deadband smoothing to (i.e., ignore small velocity changes below this threshold). Here, deadband values are set for the X-axis, Y-axis, and yaw angular velocity (theta) respectively.",[50,9423,9424,9427,9428,9431],{},[76,9425,9426],{},"feedback",": Specifies the feedback type of the speed smoother. ",[76,9429,9430],{},"OPEN_LOOP"," indicates open-loop control, meaning speed adjustments are made without considering the robot's actual speed feedback.",[50,9433,9434,9437],{},[76,9435,9436],{},"max_accel",": Defines the maximum acceleration limits for the robot in each direction, including the X-axis, Y-axis, and yaw angular velocity (theta).",[50,9439,9440,9443],{},[76,9441,9442],{},"max_decel",": Defines the maximum deceleration limits for the robot in each direction, including the X-axis, Y-axis, and yaw angular velocity (theta). Note that deceleration values are expressed as negative numbers.",[50,9445,9446,9449],{},[76,9447,9448],{},"max_velocity",": Defines the maximum speed limits for the robot in each direction, including the X-axis, Y-axis, and yaw angular velocity (theta).",[50,9451,9452,9455],{},[76,9453,9454],{},"min_velocity",": Defines the minimum speed limits for the robot in each direction, including the X-axis, Y-axis, and yaw angular velocity (theta). This is typically used to avoid sending excessively small speed commands to the low-level controller.",[50,9457,9458,9461,9462,9464],{},[76,9459,9460],{},"odom_duration",": Parameters related to odometry data, but may not be directly used by the ",[76,9463,9346],{}," node in this context; possibly legacy or associated with other functionality.",[50,9466,9467,9469,9470,9472],{},[76,9468,7559],{},": Specifies the ROS topic name for odometry data. The ",[76,9471,9346],{}," node will subscribe to this topic to obtain the robot's motion information.",[50,9474,9475,9478,9479,9481],{},[76,9476,9477],{},"scale_velocities",": Indicates whether to proportionally adjust other velocity components based on acceleration limits. If set to ",[76,9480,2555],{},", no velocity scaling will be performed.",[50,9483,9484,9487],{},[76,9485,9486],{},"smoothing_frequency",": Defines the execution frequency (Hz) of the velocity smoothing operation, i.e., how many smoothing calculations are performed per second.",[50,9489,9490,9492],{},[76,9491,5902],{},": Specifies whether to use simulated time instead of actual system time. This is especially useful in simulation environments to ensure time consistency and predictability.",[50,9494,9495,9498,9499,9501],{},[76,9496,9497],{},"velocity_timeout",": If no new speed command is received within a specified time, the ",[76,9500,9346],{}," node will stop publishing speed commands and may send a zero-speed command to stop the robot's motion. This is to prevent the robot from continuing to move when speed control is lost.",[15,9503,9505],{"id":9504},"navigation-function-integration-ros2-humble-and-earlier","Navigation Function Integration (ROS2 Humble and earlier)",[19,9507,9508],{},[22,9509,6105],{},[19,9511,5157,9512,5160],{},[76,9513,1225],{},[70,9515,9517],{"className":72,"code":9516,"language":74,"meta":33,"style":33},"ros2 pkg create mycar_navigation2 --dependencies navigation2 nav2_common\n",[76,9518,9519],{"__ignoreMap":33},[79,9520,9521,9523,9525,9527,9530,9532,9535],{"class":81,"line":82},[79,9522,1239],{"class":85},[79,9524,1242],{"class":89},[79,9526,1245],{"class":89},[79,9528,9529],{"class":89}," mycar_navigation2",[79,9531,1252],{"class":1251},[79,9533,9534],{"class":89}," navigation2",[79,9536,9537],{"class":89}," nav2_common\n",[19,9539,9540],{},[22,9541,6138],{},[19,9543,9544,9545,1500,9547,6092,9549,9552],{},"Under the function package, create the ",[76,9546,1266],{},[76,9548,1270],{},[76,9550,9551],{},"bts"," directories.",[19,9554,6666,9555,5340],{},[76,9556,9557],{},"nav2.launch.py",[70,9559,9561],{"className":1281,"code":9560,"language":1283,"meta":33,"style":33},"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",[76,9562,9563,9569,9573,9583,9587,9597,9607,9617,9621,9631,9643,9647,9659,9663,9667,9675,9679,9687,9693,9701,9705,9709,9721,9725,9740,9744,9763,9781,9799,9817,9835,9853,9871,9875,9886,9894,9899,9909,9921,9930,9938,9943,9953,9958,9967,9972,9976,9986,9996,10006,10016,10026,10036,10046,10050,10059,10070,10081,10091,10101,10109,10114,10122,10126,10130,10134,10143,10155,10167,10178,10189,10198,10204,10213,10218,10228,10244,10249,10254,10259,10269,10281,10293,10304,10315,10324,10330,10339,10344,10349,10354,10364,10376,10388,10399,10410,10419,10425,10434,10439,10444,10449,10459,10471,10483,10494,10505,10518,10527,10533,10542,10547,10556,10569,10583,10588,10593,10598,10608,10620,10632,10643,10654,10663,10669,10678,10683,10688,10693,10703,10715,10727,10738,10749,10758,10764,10774,10780,10789,10795,10803,10809,10815,10821,10826,10834,10839,10846,10852,10857,10863,10868,10873,10878,10888,10899,10910,10922,10933,10942,10951,10964,10969,10978,10986,10994,11002,11010,11018,11026,11032,11038,11043,11048,11053,11058,11065,11070,11075,11081,11087,11093,11099,11105,11111,11117,11123],{"__ignoreMap":33},[79,9564,9565,9567],{"class":81,"line":82},[79,9566,1290],{"class":99},[79,9568,1293],{"class":106},[79,9570,9571],{"class":81,"line":116},[79,9572,142],{"emptyLinePlaceholder":141},[79,9574,9575,9577,9579,9581],{"class":81,"line":138},[79,9576,1302],{"class":99},[79,9578,1353],{"class":106},[79,9580,1290],{"class":99},[79,9582,1358],{"class":106},[79,9584,9585],{"class":81,"line":145},[79,9586,142],{"emptyLinePlaceholder":141},[79,9588,9589,9591,9593,9595],{"class":81,"line":152},[79,9590,1302],{"class":99},[79,9592,1305],{"class":106},[79,9594,1290],{"class":99},[79,9596,1310],{"class":106},[79,9598,9599,9601,9603,9605],{"class":81,"line":164},[79,9600,1302],{"class":99},[79,9602,1317],{"class":106},[79,9604,1290],{"class":99},[79,9606,1322],{"class":106},[79,9608,9609,9611,9613,9615],{"class":81,"line":176},[79,9610,1302],{"class":99},[79,9612,1329],{"class":106},[79,9614,1290],{"class":99},[79,9616,1334],{"class":106},[79,9618,9619],{"class":81,"line":181},[79,9620,142],{"emptyLinePlaceholder":141},[79,9622,9623,9625,9627,9629],{"class":81,"line":187},[79,9624,1302],{"class":99},[79,9626,1341],{"class":106},[79,9628,1290],{"class":99},[79,9630,1346],{"class":106},[79,9632,9633,9635,9638,9640],{"class":81,"line":199},[79,9634,1302],{"class":99},[79,9636,9637],{"class":106}," launch_ros.descriptions ",[79,9639,1290],{"class":99},[79,9641,9642],{"class":106}," ParameterFile\n",[79,9644,9645],{"class":81,"line":1393},[79,9646,142],{"emptyLinePlaceholder":141},[79,9648,9649,9651,9654,9656],{"class":81,"line":1408},[79,9650,1302],{"class":99},[79,9652,9653],{"class":106}," nav2_common.launch ",[79,9655,1290],{"class":99},[79,9657,9658],{"class":106}," RewrittenYaml\n",[79,9660,9661],{"class":81,"line":1413},[79,9662,142],{"emptyLinePlaceholder":141},[79,9664,9665],{"class":81,"line":1424},[79,9666,142],{"emptyLinePlaceholder":141},[79,9668,9669,9671,9673],{"class":81,"line":1433},[79,9670,1367],{"class":99},[79,9672,1370],{"class":85},[79,9674,1373],{"class":106},[79,9676,9677],{"class":81,"line":1447},[79,9678,142],{"emptyLinePlaceholder":141},[79,9680,9681,9683,9685],{"class":81,"line":1460},[79,9682,3200],{"class":106},[79,9684,1381],{"class":99},[79,9686,1421],{"class":106},[79,9688,9689,9691],{"class":81,"line":1470},[79,9690,1427],{"class":89},[79,9692,1430],{"class":106},[79,9694,9695,9697,9699],{"class":81,"line":1478},[79,9696,1437],{"class":1436},[79,9698,1381],{"class":99},[79,9700,6277],{"class":89},[79,9702,9703],{"class":81,"line":1494},[79,9704,3353],{"class":106},[79,9706,9707],{"class":81,"line":1508},[79,9708,142],{"emptyLinePlaceholder":141},[79,9710,9711,9713,9715,9717,9719],{"class":81,"line":1520},[79,9712,1378],{"class":106},[79,9714,1381],{"class":99},[79,9716,1384],{"class":106},[79,9718,1387],{"class":89},[79,9720,1390],{"class":106},[79,9722,9723],{"class":81,"line":1525},[79,9724,142],{"emptyLinePlaceholder":141},[79,9726,9727,9730,9732,9735,9738],{"class":81,"line":1536},[79,9728,9729],{"class":106},"    current_pkg ",[79,9731,1381],{"class":99},[79,9733,9734],{"class":106}," get_package_share_directory(",[79,9736,9737],{"class":89},"\"mycar_navigation2\"",[79,9739,1390],{"class":106},[79,9741,9742],{"class":81,"line":1547},[79,9743,142],{"emptyLinePlaceholder":141},[79,9745,9746,9749,9751,9754,9756,9758,9761],{"class":81,"line":1553},[79,9747,9748],{"class":106},"    bt_params_file ",[79,9750,1381],{"class":99},[79,9752,9753],{"class":106}," os.path.join(current_pkg, ",[79,9755,3324],{"class":89},[79,9757,1500],{"class":106},[79,9759,9760],{"class":89},"\"bt.yaml\"",[79,9762,1390],{"class":106},[79,9764,9765,9768,9770,9772,9774,9776,9779],{"class":81,"line":1564},[79,9766,9767],{"class":106},"    planner_params_file ",[79,9769,1381],{"class":99},[79,9771,9753],{"class":106},[79,9773,3324],{"class":89},[79,9775,1500],{"class":106},[79,9777,9778],{"class":89},"\"planner.yaml\"",[79,9780,1390],{"class":106},[79,9782,9783,9786,9788,9790,9792,9794,9797],{"class":81,"line":1570},[79,9784,9785],{"class":106},"    controller_params_file ",[79,9787,1381],{"class":99},[79,9789,9753],{"class":106},[79,9791,3324],{"class":89},[79,9793,1500],{"class":106},[79,9795,9796],{"class":89},"\"controller.yaml\"",[79,9798,1390],{"class":106},[79,9800,9801,9804,9806,9808,9810,9812,9815],{"class":81,"line":1583},[79,9802,9803],{"class":106},"    behavior_params_file ",[79,9805,1381],{"class":99},[79,9807,9753],{"class":106},[79,9809,3324],{"class":89},[79,9811,1500],{"class":106},[79,9813,9814],{"class":89},"\"behavior.yaml\"",[79,9816,1390],{"class":106},[79,9818,9819,9822,9824,9826,9828,9830,9833],{"class":81,"line":1596},[79,9820,9821],{"class":106},"    waypoint_params_file ",[79,9823,1381],{"class":99},[79,9825,9753],{"class":106},[79,9827,3324],{"class":89},[79,9829,1500],{"class":106},[79,9831,9832],{"class":89},"\"waypoint.yaml\"",[79,9834,1390],{"class":106},[79,9836,9837,9840,9842,9844,9846,9848,9851],{"class":81,"line":1608},[79,9838,9839],{"class":106},"    velocity_params_file ",[79,9841,1381],{"class":99},[79,9843,9753],{"class":106},[79,9845,3324],{"class":89},[79,9847,1500],{"class":106},[79,9849,9850],{"class":89},"\"velocity.yaml\"",[79,9852,1390],{"class":106},[79,9854,9855,9858,9860,9862,9864,9866,9869],{"class":81,"line":1621},[79,9856,9857],{"class":106},"    smoother_params_file ",[79,9859,1381],{"class":99},[79,9861,9753],{"class":106},[79,9863,3324],{"class":89},[79,9865,1500],{"class":106},[79,9867,9868],{"class":89},"\"smoother.yaml\"",[79,9870,1390],{"class":106},[79,9872,9873],{"class":81,"line":1626},[79,9874,142],{"emptyLinePlaceholder":141},[79,9876,9877,9880,9883],{"class":81,"line":1637},[79,9878,9879],{"class":99},"    def",[79,9881,9882],{"class":85}," rewrite_params",[79,9884,9885],{"class":106},"(params_file):\n",[79,9887,9888,9891],{"class":81,"line":1642},[79,9889,9890],{"class":99},"        return",[79,9892,9893],{"class":106}," ParameterFile(\n",[79,9895,9896],{"class":81,"line":1648},[79,9897,9898],{"class":106},"            RewrittenYaml(\n",[79,9900,9901,9904,9906],{"class":81,"line":1654},[79,9902,9903],{"class":1436},"                source_file",[79,9905,1381],{"class":99},[79,9907,9908],{"class":106},"params_file,\n",[79,9910,9911,9914,9916,9919],{"class":81,"line":1660},[79,9912,9913],{"class":1436},"                root_key",[79,9915,1381],{"class":99},[79,9917,9918],{"class":89},"''",[79,9920,1430],{"class":106},[79,9922,9923,9926,9928],{"class":81,"line":1665},[79,9924,9925],{"class":1436},"                param_rewrites",[79,9927,1381],{"class":99},[79,9929,6587],{"class":106},[79,9931,9932,9935],{"class":81,"line":2060},[79,9933,9934],{"class":89},"                    'use_sim_time'",[79,9936,9937],{"class":106},": use_sim_time\n",[79,9939,9940],{"class":81,"line":2071},[79,9941,9942],{"class":106},"                },\n",[79,9944,9945,9948,9950],{"class":81,"line":2084},[79,9946,9947],{"class":1436},"                convert_types",[79,9949,1381],{"class":99},[79,9951,9952],{"class":1251},"True\n",[79,9954,9955],{"class":81,"line":2098},[79,9956,9957],{"class":106},"            ),\n",[79,9959,9960,9963,9965],{"class":81,"line":2111},[79,9961,9962],{"class":1436},"            allow_substs",[79,9964,1381],{"class":99},[79,9966,9952],{"class":1251},[79,9968,9969],{"class":81,"line":2125},[79,9970,9971],{"class":106},"        )\n",[79,9973,9974],{"class":81,"line":2136},[79,9975,142],{"emptyLinePlaceholder":141},[79,9977,9978,9981,9983],{"class":81,"line":2141},[79,9979,9980],{"class":106},"    bt_params ",[79,9982,1381],{"class":99},[79,9984,9985],{"class":106}," rewrite_params(bt_params_file)\n",[79,9987,9988,9991,9993],{"class":81,"line":2151},[79,9989,9990],{"class":106},"    planner_params ",[79,9992,1381],{"class":99},[79,9994,9995],{"class":106}," rewrite_params(planner_params_file)\n",[79,9997,9998,10001,10003],{"class":81,"line":2162},[79,9999,10000],{"class":106},"    controller_params ",[79,10002,1381],{"class":99},[79,10004,10005],{"class":106}," rewrite_params(controller_params_file)\n",[79,10007,10008,10011,10013],{"class":81,"line":2174},[79,10009,10010],{"class":106},"    behavior_params ",[79,10012,1381],{"class":99},[79,10014,10015],{"class":106}," rewrite_params(behavior_params_file)\n",[79,10017,10018,10021,10023],{"class":81,"line":2179},[79,10019,10020],{"class":106},"    waypoint_params ",[79,10022,1381],{"class":99},[79,10024,10025],{"class":106}," rewrite_params(waypoint_params_file)\n",[79,10027,10028,10031,10033],{"class":81,"line":2190},[79,10029,10030],{"class":106},"    velocity_params ",[79,10032,1381],{"class":99},[79,10034,10035],{"class":106}," rewrite_params(velocity_params_file)\n",[79,10037,10038,10041,10043],{"class":81,"line":2200},[79,10039,10040],{"class":106},"    smoother_params ",[79,10042,1381],{"class":99},[79,10044,10045],{"class":106}," rewrite_params(smoother_params_file)\n",[79,10047,10048],{"class":81,"line":2211},[79,10049,142],{"emptyLinePlaceholder":141},[79,10051,10052,10055,10057],{"class":81,"line":2216},[79,10053,10054],{"class":106},"    planner_server_node ",[79,10056,1381],{"class":99},[79,10058,1533],{"class":106},[79,10060,10061,10063,10065,10068],{"class":81,"line":2230},[79,10062,1573],{"class":1436},[79,10064,1381],{"class":99},[79,10066,10067],{"class":89},"'nav2_planner'",[79,10069,1430],{"class":106},[79,10071,10072,10074,10076,10079],{"class":81,"line":2243},[79,10073,1586],{"class":1436},[79,10075,1381],{"class":99},[79,10077,10078],{"class":89},"'planner_server'",[79,10080,1430],{"class":106},[79,10082,10083,10085,10087,10089],{"class":81,"line":2248},[79,10084,1599],{"class":1436},[79,10086,1381],{"class":99},[79,10088,10078],{"class":89},[79,10090,1430],{"class":106},[79,10092,10093,10095,10097,10099],{"class":81,"line":2262},[79,10094,1611],{"class":1436},[79,10096,1381],{"class":99},[79,10098,1616],{"class":89},[79,10100,1430],{"class":106},[79,10102,10103,10105,10107],{"class":81,"line":2276},[79,10104,1539],{"class":1436},[79,10106,1381],{"class":99},[79,10108,1544],{"class":106},[79,10110,10111],{"class":81,"line":2290},[79,10112,10113],{"class":106},"            planner_params,\n",[79,10115,10116,10118,10120],{"class":81,"line":2301},[79,10117,3400],{"class":106},[79,10119,1387],{"class":89},[79,10121,1561],{"class":106},[79,10123,10124],{"class":81,"line":2311},[79,10125,1567],{"class":106},[79,10127,10128],{"class":81,"line":6629},[79,10129,3353],{"class":106},[79,10131,10132],{"class":81,"line":6635},[79,10133,142],{"emptyLinePlaceholder":141},[79,10135,10136,10139,10141],{"class":81,"line":6641},[79,10137,10138],{"class":106},"    controller_server_node ",[79,10140,1381],{"class":99},[79,10142,1533],{"class":106},[79,10144,10146,10148,10150,10153],{"class":81,"line":10145},67,[79,10147,1573],{"class":1436},[79,10149,1381],{"class":99},[79,10151,10152],{"class":89},"'nav2_controller'",[79,10154,1430],{"class":106},[79,10156,10158,10160,10162,10165],{"class":81,"line":10157},68,[79,10159,1586],{"class":1436},[79,10161,1381],{"class":99},[79,10163,10164],{"class":89},"'controller_server'",[79,10166,1430],{"class":106},[79,10168,10170,10172,10174,10176],{"class":81,"line":10169},69,[79,10171,1599],{"class":1436},[79,10173,1381],{"class":99},[79,10175,10164],{"class":89},[79,10177,1430],{"class":106},[79,10179,10181,10183,10185,10187],{"class":81,"line":10180},70,[79,10182,1611],{"class":1436},[79,10184,1381],{"class":99},[79,10186,1616],{"class":89},[79,10188,1430],{"class":106},[79,10190,10192,10194,10196],{"class":81,"line":10191},71,[79,10193,1539],{"class":1436},[79,10195,1381],{"class":99},[79,10197,1544],{"class":106},[79,10199,10201],{"class":81,"line":10200},72,[79,10202,10203],{"class":106},"            controller_params,\n",[79,10205,10207,10209,10211],{"class":81,"line":10206},73,[79,10208,3400],{"class":106},[79,10210,1387],{"class":89},[79,10212,1561],{"class":106},[79,10214,10216],{"class":81,"line":10215},74,[79,10217,1567],{"class":106},[79,10219,10221,10224,10226],{"class":81,"line":10220},75,[79,10222,10223],{"class":1436},"        remappings",[79,10225,1381],{"class":99},[79,10227,1544],{"class":106},[79,10229,10231,10234,10237,10239,10242],{"class":81,"line":10230},76,[79,10232,10233],{"class":106},"            (",[79,10235,10236],{"class":89},"'cmd_vel'",[79,10238,1500],{"class":106},[79,10240,10241],{"class":89},"'cmd_vel_nav'",[79,10243,1390],{"class":106},[79,10245,10247],{"class":81,"line":10246},77,[79,10248,6410],{"class":106},[79,10250,10252],{"class":81,"line":10251},78,[79,10253,3353],{"class":106},[79,10255,10257],{"class":81,"line":10256},79,[79,10258,142],{"emptyLinePlaceholder":141},[79,10260,10262,10265,10267],{"class":81,"line":10261},80,[79,10263,10264],{"class":106},"    behavior_server_node ",[79,10266,1381],{"class":99},[79,10268,1533],{"class":106},[79,10270,10272,10274,10276,10279],{"class":81,"line":10271},81,[79,10273,1573],{"class":1436},[79,10275,1381],{"class":99},[79,10277,10278],{"class":89},"'nav2_behaviors'",[79,10280,1430],{"class":106},[79,10282,10284,10286,10288,10291],{"class":81,"line":10283},82,[79,10285,1586],{"class":1436},[79,10287,1381],{"class":99},[79,10289,10290],{"class":89},"'behavior_server'",[79,10292,1430],{"class":106},[79,10294,10296,10298,10300,10302],{"class":81,"line":10295},83,[79,10297,1599],{"class":1436},[79,10299,1381],{"class":99},[79,10301,10290],{"class":89},[79,10303,1430],{"class":106},[79,10305,10307,10309,10311,10313],{"class":81,"line":10306},84,[79,10308,1611],{"class":1436},[79,10310,1381],{"class":99},[79,10312,1616],{"class":89},[79,10314,1430],{"class":106},[79,10316,10318,10320,10322],{"class":81,"line":10317},85,[79,10319,1539],{"class":1436},[79,10321,1381],{"class":99},[79,10323,1544],{"class":106},[79,10325,10327],{"class":81,"line":10326},86,[79,10328,10329],{"class":106},"            behavior_params,\n",[79,10331,10333,10335,10337],{"class":81,"line":10332},87,[79,10334,3400],{"class":106},[79,10336,1387],{"class":89},[79,10338,1561],{"class":106},[79,10340,10342],{"class":81,"line":10341},88,[79,10343,6410],{"class":106},[79,10345,10347],{"class":81,"line":10346},89,[79,10348,3353],{"class":106},[79,10350,10352],{"class":81,"line":10351},90,[79,10353,142],{"emptyLinePlaceholder":141},[79,10355,10357,10360,10362],{"class":81,"line":10356},91,[79,10358,10359],{"class":106},"    waypoint_node ",[79,10361,1381],{"class":99},[79,10363,1533],{"class":106},[79,10365,10367,10369,10371,10374],{"class":81,"line":10366},92,[79,10368,1573],{"class":1436},[79,10370,1381],{"class":99},[79,10372,10373],{"class":89},"'nav2_waypoint_follower'",[79,10375,1430],{"class":106},[79,10377,10379,10381,10383,10386],{"class":81,"line":10378},93,[79,10380,1586],{"class":1436},[79,10382,1381],{"class":99},[79,10384,10385],{"class":89},"'waypoint_follower'",[79,10387,1430],{"class":106},[79,10389,10391,10393,10395,10397],{"class":81,"line":10390},94,[79,10392,1599],{"class":1436},[79,10394,1381],{"class":99},[79,10396,10385],{"class":89},[79,10398,1430],{"class":106},[79,10400,10402,10404,10406,10408],{"class":81,"line":10401},95,[79,10403,1611],{"class":1436},[79,10405,1381],{"class":99},[79,10407,1616],{"class":89},[79,10409,1430],{"class":106},[79,10411,10413,10415,10417],{"class":81,"line":10412},96,[79,10414,1539],{"class":1436},[79,10416,1381],{"class":99},[79,10418,1544],{"class":106},[79,10420,10422],{"class":81,"line":10421},97,[79,10423,10424],{"class":106},"            waypoint_params,\n",[79,10426,10428,10430,10432],{"class":81,"line":10427},98,[79,10429,3400],{"class":106},[79,10431,1387],{"class":89},[79,10433,1561],{"class":106},[79,10435,10437],{"class":81,"line":10436},99,[79,10438,6410],{"class":106},[79,10440,10442],{"class":81,"line":10441},100,[79,10443,3353],{"class":106},[79,10445,10447],{"class":81,"line":10446},101,[79,10448,142],{"emptyLinePlaceholder":141},[79,10450,10452,10455,10457],{"class":81,"line":10451},102,[79,10453,10454],{"class":106},"    velocity_smoother_node ",[79,10456,1381],{"class":99},[79,10458,1533],{"class":106},[79,10460,10462,10464,10466,10469],{"class":81,"line":10461},103,[79,10463,1573],{"class":1436},[79,10465,1381],{"class":99},[79,10467,10468],{"class":89},"'nav2_velocity_smoother'",[79,10470,1430],{"class":106},[79,10472,10474,10476,10478,10481],{"class":81,"line":10473},104,[79,10475,1586],{"class":1436},[79,10477,1381],{"class":99},[79,10479,10480],{"class":89},"'velocity_smoother'",[79,10482,1430],{"class":106},[79,10484,10486,10488,10490,10492],{"class":81,"line":10485},105,[79,10487,1599],{"class":1436},[79,10489,1381],{"class":99},[79,10491,10480],{"class":89},[79,10493,1430],{"class":106},[79,10495,10497,10499,10501,10503],{"class":81,"line":10496},106,[79,10498,1611],{"class":1436},[79,10500,1381],{"class":99},[79,10502,1616],{"class":89},[79,10504,1430],{"class":106},[79,10506,10508,10511,10513,10516],{"class":81,"line":10507},107,[79,10509,10510],{"class":1436},"        respawn_delay",[79,10512,1381],{"class":99},[79,10514,10515],{"class":1251},"2.0",[79,10517,1430],{"class":106},[79,10519,10521,10523,10525],{"class":81,"line":10520},108,[79,10522,1539],{"class":1436},[79,10524,1381],{"class":99},[79,10526,1544],{"class":106},[79,10528,10530],{"class":81,"line":10529},109,[79,10531,10532],{"class":106},"            velocity_params,\n",[79,10534,10536,10538,10540],{"class":81,"line":10535},110,[79,10537,3400],{"class":106},[79,10539,1387],{"class":89},[79,10541,1561],{"class":106},[79,10543,10545],{"class":81,"line":10544},111,[79,10546,1567],{"class":106},[79,10548,10550,10552,10554],{"class":81,"line":10549},112,[79,10551,10223],{"class":1436},[79,10553,1381],{"class":99},[79,10555,1544],{"class":106},[79,10557,10559,10561,10563,10565,10567],{"class":81,"line":10558},113,[79,10560,10233],{"class":106},[79,10562,10236],{"class":89},[79,10564,1500],{"class":106},[79,10566,10241],{"class":89},[79,10568,1491],{"class":106},[79,10570,10572,10574,10577,10579,10581],{"class":81,"line":10571},114,[79,10573,10233],{"class":106},[79,10575,10576],{"class":89},"'cmd_vel_smoothed'",[79,10578,1500],{"class":106},[79,10580,10236],{"class":89},[79,10582,1390],{"class":106},[79,10584,10586],{"class":81,"line":10585},115,[79,10587,6410],{"class":106},[79,10589,10591],{"class":81,"line":10590},116,[79,10592,3353],{"class":106},[79,10594,10596],{"class":81,"line":10595},117,[79,10597,142],{"emptyLinePlaceholder":141},[79,10599,10601,10604,10606],{"class":81,"line":10600},118,[79,10602,10603],{"class":106},"    smoother_server_node ",[79,10605,1381],{"class":99},[79,10607,1533],{"class":106},[79,10609,10611,10613,10615,10618],{"class":81,"line":10610},119,[79,10612,1573],{"class":1436},[79,10614,1381],{"class":99},[79,10616,10617],{"class":89},"'nav2_smoother'",[79,10619,1430],{"class":106},[79,10621,10623,10625,10627,10630],{"class":81,"line":10622},120,[79,10624,1586],{"class":1436},[79,10626,1381],{"class":99},[79,10628,10629],{"class":89},"'smoother_server'",[79,10631,1430],{"class":106},[79,10633,10635,10637,10639,10641],{"class":81,"line":10634},121,[79,10636,1599],{"class":1436},[79,10638,1381],{"class":99},[79,10640,10629],{"class":89},[79,10642,1430],{"class":106},[79,10644,10646,10648,10650,10652],{"class":81,"line":10645},122,[79,10647,1611],{"class":1436},[79,10649,1381],{"class":99},[79,10651,1616],{"class":89},[79,10653,1430],{"class":106},[79,10655,10657,10659,10661],{"class":81,"line":10656},123,[79,10658,1539],{"class":1436},[79,10660,1381],{"class":99},[79,10662,1544],{"class":106},[79,10664,10666],{"class":81,"line":10665},124,[79,10667,10668],{"class":106},"            smoother_params,\n",[79,10670,10672,10674,10676],{"class":81,"line":10671},125,[79,10673,3400],{"class":106},[79,10675,1387],{"class":89},[79,10677,1561],{"class":106},[79,10679,10681],{"class":81,"line":10680},126,[79,10682,1567],{"class":106},[79,10684,10686],{"class":81,"line":10685},127,[79,10687,3353],{"class":106},[79,10689,10691],{"class":81,"line":10690},128,[79,10692,142],{"emptyLinePlaceholder":141},[79,10694,10696,10699,10701],{"class":81,"line":10695},129,[79,10697,10698],{"class":106},"    bt_navigator_node ",[79,10700,1381],{"class":99},[79,10702,1533],{"class":106},[79,10704,10706,10708,10710,10713],{"class":81,"line":10705},130,[79,10707,1573],{"class":1436},[79,10709,1381],{"class":99},[79,10711,10712],{"class":89},"'nav2_bt_navigator'",[79,10714,1430],{"class":106},[79,10716,10718,10720,10722,10725],{"class":81,"line":10717},131,[79,10719,1586],{"class":1436},[79,10721,1381],{"class":99},[79,10723,10724],{"class":89},"'bt_navigator'",[79,10726,1430],{"class":106},[79,10728,10730,10732,10734,10736],{"class":81,"line":10729},132,[79,10731,1599],{"class":1436},[79,10733,1381],{"class":99},[79,10735,10724],{"class":89},[79,10737,1430],{"class":106},[79,10739,10741,10743,10745,10747],{"class":81,"line":10740},133,[79,10742,1611],{"class":1436},[79,10744,1381],{"class":99},[79,10746,1616],{"class":89},[79,10748,1430],{"class":106},[79,10750,10752,10754,10756],{"class":81,"line":10751},134,[79,10753,1539],{"class":1436},[79,10755,1381],{"class":99},[79,10757,1544],{"class":106},[79,10759,10761],{"class":81,"line":10760},135,[79,10762,10763],{"class":106},"            bt_params,\n",[79,10765,10767,10769,10771],{"class":81,"line":10766},136,[79,10768,3400],{"class":106},[79,10770,1387],{"class":89},[79,10772,10773],{"class":106},": use_sim_time},\n",[79,10775,10777],{"class":81,"line":10776},137,[79,10778,10779],{"class":106},"            {\n",[79,10781,10783,10786],{"class":81,"line":10782},138,[79,10784,10785],{"class":89},"                \"default_nav_to_pose_bt_xml\"",[79,10787,10788],{"class":106},": os.path.join(\n",[79,10790,10792],{"class":81,"line":10791},139,[79,10793,10794],{"class":106},"                    current_pkg,\n",[79,10796,10798,10801],{"class":81,"line":10797},140,[79,10799,10800],{"class":89},"                    \"bts\"",[79,10802,1430],{"class":106},[79,10804,10806],{"class":81,"line":10805},141,[79,10807,10808],{"class":89},"                    \"bt_planner_controller_behavior.xml\"\n",[79,10810,10812],{"class":81,"line":10811},142,[79,10813,10814],{"class":106},"                )\n",[79,10816,10818],{"class":81,"line":10817},143,[79,10819,10820],{"class":106},"            },\n",[79,10822,10824],{"class":81,"line":10823},144,[79,10825,10779],{"class":106},[79,10827,10829,10832],{"class":81,"line":10828},145,[79,10830,10831],{"class":89},"                \"default_nav_through_poses_bt_xml\"",[79,10833,10788],{"class":106},[79,10835,10837],{"class":81,"line":10836},146,[79,10838,10794],{"class":106},[79,10840,10842,10844],{"class":81,"line":10841},147,[79,10843,10800],{"class":89},[79,10845,1430],{"class":106},[79,10847,10849],{"class":81,"line":10848},148,[79,10850,10851],{"class":89},"                    \"bt_planner_controller_behavior_poses.xml\"\n",[79,10853,10855],{"class":81,"line":10854},149,[79,10856,10814],{"class":106},[79,10858,10860],{"class":81,"line":10859},150,[79,10861,10862],{"class":106},"            }\n",[79,10864,10866],{"class":81,"line":10865},151,[79,10867,1567],{"class":106},[79,10869,10871],{"class":81,"line":10870},152,[79,10872,3353],{"class":106},[79,10874,10876],{"class":81,"line":10875},153,[79,10877,142],{"emptyLinePlaceholder":141},[79,10879,10881,10884,10886],{"class":81,"line":10880},154,[79,10882,10883],{"class":106},"    lifecycle_manager_node ",[79,10885,1381],{"class":99},[79,10887,1533],{"class":106},[79,10889,10891,10893,10895,10897],{"class":81,"line":10890},155,[79,10892,1573],{"class":1436},[79,10894,1381],{"class":99},[79,10896,5509],{"class":89},[79,10898,1430],{"class":106},[79,10900,10902,10904,10906,10908],{"class":81,"line":10901},156,[79,10903,1586],{"class":1436},[79,10905,1381],{"class":99},[79,10907,5521],{"class":89},[79,10909,1430],{"class":106},[79,10911,10913,10915,10917,10920],{"class":81,"line":10912},157,[79,10914,1599],{"class":1436},[79,10916,1381],{"class":99},[79,10918,10919],{"class":89},"'lifecycle_manager_navigation'",[79,10921,1430],{"class":106},[79,10923,10925,10927,10929,10931],{"class":81,"line":10924},158,[79,10926,1611],{"class":1436},[79,10928,1381],{"class":99},[79,10930,1616],{"class":89},[79,10932,1430],{"class":106},[79,10934,10936,10938,10940],{"class":81,"line":10935},159,[79,10937,1539],{"class":1436},[79,10939,1381],{"class":99},[79,10941,1544],{"class":106},[79,10943,10945,10947,10949],{"class":81,"line":10944},160,[79,10946,3400],{"class":106},[79,10948,1387],{"class":89},[79,10950,10773],{"class":106},[79,10952,10954,10956,10958,10960,10962],{"class":81,"line":10953},161,[79,10955,3400],{"class":106},[79,10957,5571],{"class":89},[79,10959,1723],{"class":106},[79,10961,5471],{"class":1251},[79,10963,5474],{"class":106},[79,10965,10967],{"class":81,"line":10966},162,[79,10968,10779],{"class":106},[79,10970,10972,10975],{"class":81,"line":10971},163,[79,10973,10974],{"class":89},"                'node_names'",[79,10976,10977],{"class":106},": [\n",[79,10979,10981,10984],{"class":81,"line":10980},164,[79,10982,10983],{"class":89},"                    'bt_navigator'",[79,10985,1430],{"class":106},[79,10987,10989,10992],{"class":81,"line":10988},165,[79,10990,10991],{"class":89},"                    'planner_server'",[79,10993,1430],{"class":106},[79,10995,10997,11000],{"class":81,"line":10996},166,[79,10998,10999],{"class":89},"                    'controller_server'",[79,11001,1430],{"class":106},[79,11003,11005,11008],{"class":81,"line":11004},167,[79,11006,11007],{"class":89},"                    'behavior_server'",[79,11009,1430],{"class":106},[79,11011,11013,11016],{"class":81,"line":11012},168,[79,11014,11015],{"class":89},"                    'waypoint_follower'",[79,11017,1430],{"class":106},[79,11019,11021,11024],{"class":81,"line":11020},169,[79,11022,11023],{"class":89},"                    'velocity_smoother'",[79,11025,1430],{"class":106},[79,11027,11029],{"class":81,"line":11028},170,[79,11030,11031],{"class":89},"                    'smoother_server'\n",[79,11033,11035],{"class":81,"line":11034},171,[79,11036,11037],{"class":106},"                ]\n",[79,11039,11041],{"class":81,"line":11040},172,[79,11042,10862],{"class":106},[79,11044,11046],{"class":81,"line":11045},173,[79,11047,6410],{"class":106},[79,11049,11051],{"class":81,"line":11050},174,[79,11052,3353],{"class":106},[79,11054,11056],{"class":81,"line":11055},175,[79,11057,142],{"emptyLinePlaceholder":141},[79,11059,11061,11063],{"class":81,"line":11060},176,[79,11062,1668],{"class":99},[79,11064,3436],{"class":106},[79,11066,11068],{"class":81,"line":11067},177,[79,11069,3441],{"class":106},[79,11071,11073],{"class":81,"line":11072},178,[79,11074,142],{"emptyLinePlaceholder":141},[79,11076,11078],{"class":81,"line":11077},179,[79,11079,11080],{"class":106},"        lifecycle_manager_node,\n",[79,11082,11084],{"class":81,"line":11083},180,[79,11085,11086],{"class":106},"        bt_navigator_node,\n",[79,11088,11090],{"class":81,"line":11089},181,[79,11091,11092],{"class":106},"        planner_server_node,\n",[79,11094,11096],{"class":81,"line":11095},182,[79,11097,11098],{"class":106},"        controller_server_node,\n",[79,11100,11102],{"class":81,"line":11101},183,[79,11103,11104],{"class":106},"        behavior_server_node,\n",[79,11106,11108],{"class":81,"line":11107},184,[79,11109,11110],{"class":106},"        waypoint_node,\n",[79,11112,11114],{"class":81,"line":11113},185,[79,11115,11116],{"class":106},"        velocity_smoother_node,\n",[79,11118,11120],{"class":81,"line":11119},186,[79,11121,11122],{"class":106},"        smoother_server_node\n",[79,11124,11126],{"class":81,"line":11125},187,[79,11127,3461],{"class":106},[19,11129,11130],{},"This launch file primarily loads nodes for the lifecycle manager, behavior tree, planner, controller, recovery, waypoint tracking, path smoothing, and velocity smoothing. Additionally, except for the lifecycle manager node, each node also loads a configuration file. Next, these configuration files need to be edited.",[19,11132,11133],{},[22,11134,11135],{},"(1) bt_navigator related configuration files",[19,11137,11138,11139,11142,11143,11145,11146,11148],{},"There are two configuration files related to ",[76,11140,11141],{},"bt_navigator",": an XML file describing the behavior tree, stored in the ",[76,11144,9551],{}," directory, and a YAML format parameter file, stored in the ",[76,11147,1270],{}," directory.",[19,11150,1222,11151,11153,11154,2333],{},[76,11152,9551],{}," directory, create a new file named ",[76,11155,11156],{},"bt_planner_controller_behavior.xml",[70,11158,11162],{"className":11159,"code":11160,"language":11161,"meta":33,"style":33},"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",[76,11163,11164,11168,11186,11203,11229,11246,11264,11287,11322,11346,11355,11364,11385,11407,11429,11437,11446,11462,11471,11487,11503,11524,11545,11553,11570,11587,11612,11620,11628,11637,11646],{"__ignoreMap":33},[79,11165,11166],{"class":81,"line":82},[79,11167,142],{"emptyLinePlaceholder":141},[79,11169,11170,11172,11175,11178,11180,11183],{"class":81,"line":116},[79,11171,100],{"class":106},[79,11173,11174],{"class":1705},"root",[79,11176,11177],{"class":85}," main_tree_to_execute",[79,11179,1381],{"class":106},[79,11181,11182],{"class":89},"\"MainTree\"",[79,11184,11185],{"class":106},">\n",[79,11187,11188,11191,11194,11197,11199,11201],{"class":81,"line":138},[79,11189,11190],{"class":106},"  \u003C",[79,11192,11193],{"class":1705},"BehaviorTree",[79,11195,11196],{"class":85}," ID",[79,11198,1381],{"class":106},[79,11200,11182],{"class":89},[79,11202,11185],{"class":106},[79,11204,11205,11208,11211,11214,11216,11219,11222,11224,11227],{"class":81,"line":145},[79,11206,11207],{"class":106},"    \u003C",[79,11209,11210],{"class":1705},"RecoveryNode",[79,11212,11213],{"class":85}," number_of_retries",[79,11215,1381],{"class":106},[79,11217,11218],{"class":89},"\"6\"",[79,11220,11221],{"class":85}," name",[79,11223,1381],{"class":106},[79,11225,11226],{"class":89},"\"NavigateRecovery\"",[79,11228,11185],{"class":106},[79,11230,11231,11234,11237,11239,11241,11244],{"class":81,"line":152},[79,11232,11233],{"class":106},"      \u003C",[79,11235,11236],{"class":1705},"PipelineSequence",[79,11238,11221],{"class":85},[79,11240,1381],{"class":106},[79,11242,11243],{"class":89},"\"NavigateWithReplanning\"",[79,11245,11185],{"class":106},[79,11247,11248,11251,11254,11257,11259,11262],{"class":81,"line":164},[79,11249,11250],{"class":106},"        \u003C",[79,11252,11253],{"class":1705},"RateController",[79,11255,11256],{"class":85}," hz",[79,11258,1381],{"class":106},[79,11260,11261],{"class":89},"\"1.0\"",[79,11263,11185],{"class":106},[79,11265,11266,11269,11271,11273,11275,11278,11280,11282,11285],{"class":81,"line":176},[79,11267,11268],{"class":106},"          \u003C",[79,11270,11210],{"class":1705},[79,11272,11213],{"class":85},[79,11274,1381],{"class":106},[79,11276,11277],{"class":89},"\"1\"",[79,11279,11221],{"class":85},[79,11281,1381],{"class":106},[79,11283,11284],{"class":89},"\"ComputePathToPose\"",[79,11286,11185],{"class":106},[79,11288,11289,11292,11295,11298,11300,11303,11306,11308,11311,11314,11316,11319],{"class":81,"line":181},[79,11290,11291],{"class":106},"            \u003C",[79,11293,11294],{"class":1705},"ComputePathToPose",[79,11296,11297],{"class":85}," goal",[79,11299,1381],{"class":106},[79,11301,11302],{"class":89},"\"{goal}\"",[79,11304,11305],{"class":85}," path",[79,11307,1381],{"class":106},[79,11309,11310],{"class":89},"\"{path}\"",[79,11312,11313],{"class":85}," planner_id",[79,11315,1381],{"class":106},[79,11317,11318],{"class":89},"\"GridBased\"",[79,11320,11321],{"class":106},"/>\n",[79,11323,11324,11326,11329,11331,11333,11336,11339,11341,11344],{"class":81,"line":187},[79,11325,11291],{"class":106},[79,11327,11328],{"class":1705},"ClearEntireCostmap",[79,11330,11221],{"class":85},[79,11332,1381],{"class":106},[79,11334,11335],{"class":89},"\"ClearGlobalCostmap-Context\"",[79,11337,11338],{"class":85}," service_name",[79,11340,1381],{"class":106},[79,11342,11343],{"class":89},"\"global_costmap/clear_entirely_global_costmap\"",[79,11345,11321],{"class":106},[79,11347,11348,11351,11353],{"class":81,"line":199},[79,11349,11350],{"class":106},"          \u003C/",[79,11352,11210],{"class":1705},[79,11354,11185],{"class":106},[79,11356,11357,11360,11362],{"class":81,"line":1393},[79,11358,11359],{"class":106},"        \u003C/",[79,11361,11253],{"class":1705},[79,11363,11185],{"class":106},[79,11365,11366,11368,11370,11372,11374,11376,11378,11380,11383],{"class":81,"line":1408},[79,11367,11250],{"class":106},[79,11369,11210],{"class":1705},[79,11371,11213],{"class":85},[79,11373,1381],{"class":106},[79,11375,11277],{"class":89},[79,11377,11221],{"class":85},[79,11379,1381],{"class":106},[79,11381,11382],{"class":89},"\"FollowPath\"",[79,11384,11185],{"class":106},[79,11386,11387,11389,11392,11394,11396,11398,11401,11403,11405],{"class":81,"line":1413},[79,11388,11268],{"class":106},[79,11390,11391],{"class":1705},"FollowPath",[79,11393,11305],{"class":85},[79,11395,1381],{"class":106},[79,11397,11310],{"class":89},[79,11399,11400],{"class":85}," controller_id",[79,11402,1381],{"class":106},[79,11404,11382],{"class":89},[79,11406,11321],{"class":106},[79,11408,11409,11411,11413,11415,11417,11420,11422,11424,11427],{"class":81,"line":1424},[79,11410,11268],{"class":106},[79,11412,11328],{"class":1705},[79,11414,11221],{"class":85},[79,11416,1381],{"class":106},[79,11418,11419],{"class":89},"\"ClearLocalCostmap-Context\"",[79,11421,11338],{"class":85},[79,11423,1381],{"class":106},[79,11425,11426],{"class":89},"\"local_costmap/clear_entirely_local_costmap\"",[79,11428,11321],{"class":106},[79,11430,11431,11433,11435],{"class":81,"line":1433},[79,11432,11359],{"class":106},[79,11434,11210],{"class":1705},[79,11436,11185],{"class":106},[79,11438,11439,11442,11444],{"class":81,"line":1447},[79,11440,11441],{"class":106},"      \u003C/",[79,11443,11236],{"class":1705},[79,11445,11185],{"class":106},[79,11447,11448,11450,11453,11455,11457,11460],{"class":81,"line":1460},[79,11449,11233],{"class":106},[79,11451,11452],{"class":1705},"ReactiveFallback",[79,11454,11221],{"class":85},[79,11456,1381],{"class":106},[79,11458,11459],{"class":89},"\"RecoveryFallback\"",[79,11461,11185],{"class":106},[79,11463,11464,11466,11469],{"class":81,"line":1470},[79,11465,11250],{"class":106},[79,11467,11468],{"class":1705},"GoalUpdated",[79,11470,11321],{"class":106},[79,11472,11473,11475,11478,11480,11482,11485],{"class":81,"line":1478},[79,11474,11250],{"class":106},[79,11476,11477],{"class":1705},"RoundRobin",[79,11479,11221],{"class":85},[79,11481,1381],{"class":106},[79,11483,11484],{"class":89},"\"RecoveryActions\"",[79,11486,11185],{"class":106},[79,11488,11489,11491,11494,11496,11498,11501],{"class":81,"line":1494},[79,11490,11268],{"class":106},[79,11492,11493],{"class":1705},"Sequence",[79,11495,11221],{"class":85},[79,11497,1381],{"class":106},[79,11499,11500],{"class":89},"\"ClearingActions\"",[79,11502,11185],{"class":106},[79,11504,11505,11507,11509,11511,11513,11516,11518,11520,11522],{"class":81,"line":1508},[79,11506,11291],{"class":106},[79,11508,11328],{"class":1705},[79,11510,11221],{"class":85},[79,11512,1381],{"class":106},[79,11514,11515],{"class":89},"\"ClearLocalCostmap-Subtree\"",[79,11517,11338],{"class":85},[79,11519,1381],{"class":106},[79,11521,11426],{"class":89},[79,11523,11321],{"class":106},[79,11525,11526,11528,11530,11532,11534,11537,11539,11541,11543],{"class":81,"line":1520},[79,11527,11291],{"class":106},[79,11529,11328],{"class":1705},[79,11531,11221],{"class":85},[79,11533,1381],{"class":106},[79,11535,11536],{"class":89},"\"ClearGlobalCostmap-Subtree\"",[79,11538,11338],{"class":85},[79,11540,1381],{"class":106},[79,11542,11343],{"class":89},[79,11544,11321],{"class":106},[79,11546,11547,11549,11551],{"class":81,"line":1525},[79,11548,11350],{"class":106},[79,11550,11493],{"class":1705},[79,11552,11185],{"class":106},[79,11554,11555,11557,11560,11563,11565,11568],{"class":81,"line":1536},[79,11556,11268],{"class":106},[79,11558,11559],{"class":1705},"Spin",[79,11561,11562],{"class":85}," spin_dist",[79,11564,1381],{"class":106},[79,11566,11567],{"class":89},"\"1.57\"",[79,11569,11321],{"class":106},[79,11571,11572,11574,11577,11580,11582,11585],{"class":81,"line":1547},[79,11573,11268],{"class":106},[79,11575,11576],{"class":1705},"Wait",[79,11578,11579],{"class":85}," wait_duration",[79,11581,1381],{"class":106},[79,11583,11584],{"class":89},"\"5\"",[79,11586,11321],{"class":106},[79,11588,11589,11591,11594,11597,11599,11602,11605,11607,11610],{"class":81,"line":1553},[79,11590,11268],{"class":106},[79,11592,11593],{"class":1705},"BackUp",[79,11595,11596],{"class":85}," backup_dist",[79,11598,1381],{"class":106},[79,11600,11601],{"class":89},"\"0.30\"",[79,11603,11604],{"class":85}," backup_speed",[79,11606,1381],{"class":106},[79,11608,11609],{"class":89},"\"0.05\"",[79,11611,11321],{"class":106},[79,11613,11614,11616,11618],{"class":81,"line":1564},[79,11615,11359],{"class":106},[79,11617,11477],{"class":1705},[79,11619,11185],{"class":106},[79,11621,11622,11624,11626],{"class":81,"line":1570},[79,11623,11441],{"class":106},[79,11625,11452],{"class":1705},[79,11627,11185],{"class":106},[79,11629,11630,11633,11635],{"class":81,"line":1583},[79,11631,11632],{"class":106},"    \u003C/",[79,11634,11210],{"class":1705},[79,11636,11185],{"class":106},[79,11638,11639,11642,11644],{"class":81,"line":1596},[79,11640,11641],{"class":106},"  \u003C/",[79,11643,11193],{"class":1705},[79,11645,11185],{"class":106},[79,11647,11648,11651,11653],{"class":81,"line":1608},[79,11649,11650],{"class":106},"\u003C/",[79,11652,11174],{"class":1705},[79,11654,11185],{"class":106},[19,11656,11657,11658,11661],{},"Continue by creating a new file named ",[76,11659,11660],{},"bt_planner_controller_behavior_poses.xml"," in the bts directory, and enter the following content:",[70,11663,11665],{"className":11159,"code":11664,"language":11161,"meta":33,"style":33},"\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",[76,11666,11667,11671,11685,11699,11719,11733,11748,11769,11778,11811,11839,11848,11868,11876,11884,11904,11924,11944,11952,11960,11974,11982,11996,12010,12030,12050,12058,12072,12086,12106,12114,12122,12130,12138],{"__ignoreMap":33},[79,11668,11669],{"class":81,"line":82},[79,11670,142],{"emptyLinePlaceholder":141},[79,11672,11673,11675,11677,11679,11681,11683],{"class":81,"line":116},[79,11674,100],{"class":106},[79,11676,11174],{"class":1705},[79,11678,11177],{"class":85},[79,11680,1381],{"class":106},[79,11682,11182],{"class":89},[79,11684,11185],{"class":106},[79,11686,11687,11689,11691,11693,11695,11697],{"class":81,"line":138},[79,11688,11190],{"class":106},[79,11690,11193],{"class":1705},[79,11692,11196],{"class":85},[79,11694,1381],{"class":106},[79,11696,11182],{"class":89},[79,11698,11185],{"class":106},[79,11700,11701,11703,11705,11707,11709,11711,11713,11715,11717],{"class":81,"line":145},[79,11702,11207],{"class":106},[79,11704,11210],{"class":1705},[79,11706,11213],{"class":85},[79,11708,1381],{"class":106},[79,11710,11218],{"class":89},[79,11712,11221],{"class":85},[79,11714,1381],{"class":106},[79,11716,11226],{"class":89},[79,11718,11185],{"class":106},[79,11720,11721,11723,11725,11727,11729,11731],{"class":81,"line":152},[79,11722,11233],{"class":106},[79,11724,11236],{"class":1705},[79,11726,11221],{"class":85},[79,11728,1381],{"class":106},[79,11730,11243],{"class":89},[79,11732,11185],{"class":106},[79,11734,11735,11737,11739,11741,11743,11746],{"class":81,"line":164},[79,11736,11250],{"class":106},[79,11738,11253],{"class":1705},[79,11740,11256],{"class":85},[79,11742,1381],{"class":106},[79,11744,11745],{"class":89},"\"0.333\"",[79,11747,11185],{"class":106},[79,11749,11750,11752,11754,11756,11758,11760,11762,11764,11767],{"class":81,"line":176},[79,11751,11268],{"class":106},[79,11753,11210],{"class":1705},[79,11755,11213],{"class":85},[79,11757,1381],{"class":106},[79,11759,11277],{"class":89},[79,11761,11221],{"class":85},[79,11763,1381],{"class":106},[79,11765,11766],{"class":89},"\"ComputePathThroughPoses\"",[79,11768,11185],{"class":106},[79,11770,11771,11773,11776],{"class":81,"line":181},[79,11772,11291],{"class":106},[79,11774,11775],{"class":1705},"ReactiveSequence",[79,11777,11185],{"class":106},[79,11779,11780,11783,11786,11789,11791,11794,11797,11799,11801,11804,11806,11809],{"class":81,"line":187},[79,11781,11782],{"class":106},"              \u003C",[79,11784,11785],{"class":1705},"RemovePassedGoals",[79,11787,11788],{"class":85}," input_goals",[79,11790,1381],{"class":106},[79,11792,11793],{"class":89},"\"{goals}\"",[79,11795,11796],{"class":85}," output_goals",[79,11798,1381],{"class":106},[79,11800,11793],{"class":89},[79,11802,11803],{"class":85}," radius",[79,11805,1381],{"class":106},[79,11807,11808],{"class":89},"\"0.7\"",[79,11810,11321],{"class":106},[79,11812,11813,11815,11818,11821,11823,11825,11827,11829,11831,11833,11835,11837],{"class":81,"line":199},[79,11814,11782],{"class":106},[79,11816,11817],{"class":1705},"ComputePathThroughPoses",[79,11819,11820],{"class":85}," goals",[79,11822,1381],{"class":106},[79,11824,11793],{"class":89},[79,11826,11305],{"class":85},[79,11828,1381],{"class":106},[79,11830,11310],{"class":89},[79,11832,11313],{"class":85},[79,11834,1381],{"class":106},[79,11836,11318],{"class":89},[79,11838,11321],{"class":106},[79,11840,11841,11844,11846],{"class":81,"line":1393},[79,11842,11843],{"class":106},"            \u003C/",[79,11845,11775],{"class":1705},[79,11847,11185],{"class":106},[79,11849,11850,11852,11854,11856,11858,11860,11862,11864,11866],{"class":81,"line":1408},[79,11851,11291],{"class":106},[79,11853,11328],{"class":1705},[79,11855,11221],{"class":85},[79,11857,1381],{"class":106},[79,11859,11335],{"class":89},[79,11861,11338],{"class":85},[79,11863,1381],{"class":106},[79,11865,11343],{"class":89},[79,11867,11321],{"class":106},[79,11869,11870,11872,11874],{"class":81,"line":1413},[79,11871,11350],{"class":106},[79,11873,11210],{"class":1705},[79,11875,11185],{"class":106},[79,11877,11878,11880,11882],{"class":81,"line":1424},[79,11879,11359],{"class":106},[79,11881,11253],{"class":1705},[79,11883,11185],{"class":106},[79,11885,11886,11888,11890,11892,11894,11896,11898,11900,11902],{"class":81,"line":1433},[79,11887,11250],{"class":106},[79,11889,11210],{"class":1705},[79,11891,11213],{"class":85},[79,11893,1381],{"class":106},[79,11895,11277],{"class":89},[79,11897,11221],{"class":85},[79,11899,1381],{"class":106},[79,11901,11382],{"class":89},[79,11903,11185],{"class":106},[79,11905,11906,11908,11910,11912,11914,11916,11918,11920,11922],{"class":81,"line":1447},[79,11907,11268],{"class":106},[79,11909,11391],{"class":1705},[79,11911,11305],{"class":85},[79,11913,1381],{"class":106},[79,11915,11310],{"class":89},[79,11917,11400],{"class":85},[79,11919,1381],{"class":106},[79,11921,11382],{"class":89},[79,11923,11321],{"class":106},[79,11925,11926,11928,11930,11932,11934,11936,11938,11940,11942],{"class":81,"line":1460},[79,11927,11268],{"class":106},[79,11929,11328],{"class":1705},[79,11931,11221],{"class":85},[79,11933,1381],{"class":106},[79,11935,11419],{"class":89},[79,11937,11338],{"class":85},[79,11939,1381],{"class":106},[79,11941,11426],{"class":89},[79,11943,11321],{"class":106},[79,11945,11946,11948,11950],{"class":81,"line":1470},[79,11947,11359],{"class":106},[79,11949,11210],{"class":1705},[79,11951,11185],{"class":106},[79,11953,11954,11956,11958],{"class":81,"line":1478},[79,11955,11441],{"class":106},[79,11957,11236],{"class":1705},[79,11959,11185],{"class":106},[79,11961,11962,11964,11966,11968,11970,11972],{"class":81,"line":1494},[79,11963,11233],{"class":106},[79,11965,11452],{"class":1705},[79,11967,11221],{"class":85},[79,11969,1381],{"class":106},[79,11971,11459],{"class":89},[79,11973,11185],{"class":106},[79,11975,11976,11978,11980],{"class":81,"line":1508},[79,11977,11250],{"class":106},[79,11979,11468],{"class":1705},[79,11981,11321],{"class":106},[79,11983,11984,11986,11988,11990,11992,11994],{"class":81,"line":1520},[79,11985,11250],{"class":106},[79,11987,11477],{"class":1705},[79,11989,11221],{"class":85},[79,11991,1381],{"class":106},[79,11993,11484],{"class":89},[79,11995,11185],{"class":106},[79,11997,11998,12000,12002,12004,12006,12008],{"class":81,"line":1525},[79,11999,11268],{"class":106},[79,12001,11493],{"class":1705},[79,12003,11221],{"class":85},[79,12005,1381],{"class":106},[79,12007,11500],{"class":89},[79,12009,11185],{"class":106},[79,12011,12012,12014,12016,12018,12020,12022,12024,12026,12028],{"class":81,"line":1536},[79,12013,11291],{"class":106},[79,12015,11328],{"class":1705},[79,12017,11221],{"class":85},[79,12019,1381],{"class":106},[79,12021,11515],{"class":89},[79,12023,11338],{"class":85},[79,12025,1381],{"class":106},[79,12027,11426],{"class":89},[79,12029,11321],{"class":106},[79,12031,12032,12034,12036,12038,12040,12042,12044,12046,12048],{"class":81,"line":1547},[79,12033,11291],{"class":106},[79,12035,11328],{"class":1705},[79,12037,11221],{"class":85},[79,12039,1381],{"class":106},[79,12041,11536],{"class":89},[79,12043,11338],{"class":85},[79,12045,1381],{"class":106},[79,12047,11343],{"class":89},[79,12049,11321],{"class":106},[79,12051,12052,12054,12056],{"class":81,"line":1553},[79,12053,11350],{"class":106},[79,12055,11493],{"class":1705},[79,12057,11185],{"class":106},[79,12059,12060,12062,12064,12066,12068,12070],{"class":81,"line":1564},[79,12061,11268],{"class":106},[79,12063,11559],{"class":1705},[79,12065,11562],{"class":85},[79,12067,1381],{"class":106},[79,12069,11567],{"class":89},[79,12071,11321],{"class":106},[79,12073,12074,12076,12078,12080,12082,12084],{"class":81,"line":1570},[79,12075,11268],{"class":106},[79,12077,11576],{"class":1705},[79,12079,11579],{"class":85},[79,12081,1381],{"class":106},[79,12083,11584],{"class":89},[79,12085,11321],{"class":106},[79,12087,12088,12090,12092,12094,12096,12098,12100,12102,12104],{"class":81,"line":1583},[79,12089,11268],{"class":106},[79,12091,11593],{"class":1705},[79,12093,11596],{"class":85},[79,12095,1381],{"class":106},[79,12097,11601],{"class":89},[79,12099,11604],{"class":85},[79,12101,1381],{"class":106},[79,12103,11609],{"class":89},[79,12105,11321],{"class":106},[79,12107,12108,12110,12112],{"class":81,"line":1596},[79,12109,11359],{"class":106},[79,12111,11477],{"class":1705},[79,12113,11185],{"class":106},[79,12115,12116,12118,12120],{"class":81,"line":1608},[79,12117,11441],{"class":106},[79,12119,11452],{"class":1705},[79,12121,11185],{"class":106},[79,12123,12124,12126,12128],{"class":81,"line":1621},[79,12125,11632],{"class":106},[79,12127,11210],{"class":1705},[79,12129,11185],{"class":106},[79,12131,12132,12134,12136],{"class":81,"line":1626},[79,12133,11641],{"class":106},[79,12135,11193],{"class":1705},[79,12137,11185],{"class":106},[79,12139,12140,12142,12144],{"class":81,"line":1637},[79,12141,11650],{"class":106},[79,12143,11174],{"class":1705},[79,12145,11185],{"class":106},[19,12147,1222,12148,11153,12150,2333],{},[76,12149,1270],{},[76,12151,12152],{},"bt.yaml",[70,12154,12156],{"className":1696,"code":12155,"language":1698,"meta":33,"style":33},"/**:\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",[76,12157,12158,12164,12170,12178,12187,12196,12206,12216,12226,12236,12245,12255,12265,12272,12280,12287,12294,12301,12308,12315,12322,12329,12336,12343,12350,12357,12364,12371,12378,12385,12392,12399,12406,12413,12420,12427,12434,12441,12448,12455,12462,12469,12476,12483],{"__ignoreMap":33},[79,12159,12160,12162],{"class":81,"line":82},[79,12161,6679],{"class":1705},[79,12163,1708],{"class":106},[79,12165,12166,12168],{"class":81,"line":116},[79,12167,1713],{"class":1705},[79,12169,1708],{"class":106},[79,12171,12172,12174,12176],{"class":81,"line":138},[79,12173,6692],{"class":1705},[79,12175,1723],{"class":106},[79,12177,9952],{"class":1251},[79,12179,12180,12183,12185],{"class":81,"line":145},[79,12181,12182],{"class":1705},"    global_frame",[79,12184,1723],{"class":106},[79,12186,1800],{"class":89},[79,12188,12189,12192,12194],{"class":81,"line":152},[79,12190,12191],{"class":1705},"    robot_base_frame",[79,12193,1723],{"class":106},[79,12195,1810],{"class":89},[79,12197,12198,12201,12203],{"class":81,"line":164},[79,12199,12200],{"class":1705},"    odom_topic",[79,12202,1723],{"class":106},[79,12204,12205],{"class":89},"/odom\n",[79,12207,12208,12211,12213],{"class":81,"line":176},[79,12209,12210],{"class":1705},"    default_bt_xml_filename",[79,12212,1723],{"class":106},[79,12214,12215],{"class":89},"\"navigate_w_replanning_and_recovery.xml\"\n",[79,12217,12218,12221,12223],{"class":81,"line":181},[79,12219,12220],{"class":1705},"    bt_loop_duration",[79,12222,1723],{"class":106},[79,12224,12225],{"class":1251},"10\n",[79,12227,12228,12231,12233],{"class":81,"line":187},[79,12229,12230],{"class":1705},"    default_server_timeout",[79,12232,1723],{"class":106},[79,12234,12235],{"class":1251},"20\n",[79,12237,12238,12241,12243],{"class":81,"line":199},[79,12239,12240],{"class":1705},"    enable_groot_monitoring",[79,12242,1723],{"class":106},[79,12244,9952],{"class":1251},[79,12246,12247,12250,12252],{"class":81,"line":1393},[79,12248,12249],{"class":1705},"    groot_zmq_publisher_port",[79,12251,1723],{"class":106},[79,12253,12254],{"class":1251},"1666\n",[79,12256,12257,12260,12262],{"class":81,"line":1408},[79,12258,12259],{"class":1705},"    groot_zmq_server_port",[79,12261,1723],{"class":106},[79,12263,12264],{"class":1251},"1667\n",[79,12266,12267,12270],{"class":81,"line":1413},[79,12268,12269],{"class":1705},"    plugin_lib_names",[79,12271,1708],{"class":106},[79,12273,12274,12277],{"class":81,"line":1424},[79,12275,12276],{"class":106},"    - ",[79,12278,12279],{"class":89},"nav2_compute_path_to_pose_action_bt_node\n",[79,12281,12282,12284],{"class":81,"line":1433},[79,12283,12276],{"class":106},[79,12285,12286],{"class":89},"nav2_compute_path_through_poses_action_bt_node\n",[79,12288,12289,12291],{"class":81,"line":1447},[79,12290,12276],{"class":106},[79,12292,12293],{"class":89},"nav2_follow_path_action_bt_node\n",[79,12295,12296,12298],{"class":81,"line":1460},[79,12297,12276],{"class":106},[79,12299,12300],{"class":89},"nav2_back_up_action_bt_node\n",[79,12302,12303,12305],{"class":81,"line":1470},[79,12304,12276],{"class":106},[79,12306,12307],{"class":89},"nav2_spin_action_bt_node\n",[79,12309,12310,12312],{"class":81,"line":1478},[79,12311,12276],{"class":106},[79,12313,12314],{"class":89},"nav2_wait_action_bt_node\n",[79,12316,12317,12319],{"class":81,"line":1494},[79,12318,12276],{"class":106},[79,12320,12321],{"class":89},"nav2_clear_costmap_service_bt_node\n",[79,12323,12324,12326],{"class":81,"line":1508},[79,12325,12276],{"class":106},[79,12327,12328],{"class":89},"nav2_is_stuck_condition_bt_node\n",[79,12330,12331,12333],{"class":81,"line":1520},[79,12332,12276],{"class":106},[79,12334,12335],{"class":89},"nav2_goal_reached_condition_bt_node\n",[79,12337,12338,12340],{"class":81,"line":1525},[79,12339,12276],{"class":106},[79,12341,12342],{"class":89},"nav2_goal_updated_condition_bt_node\n",[79,12344,12345,12347],{"class":81,"line":1536},[79,12346,12276],{"class":106},[79,12348,12349],{"class":89},"nav2_initial_pose_received_condition_bt_node\n",[79,12351,12352,12354],{"class":81,"line":1547},[79,12353,12276],{"class":106},[79,12355,12356],{"class":89},"nav2_reinitialize_global_localization_service_bt_node\n",[79,12358,12359,12361],{"class":81,"line":1553},[79,12360,12276],{"class":106},[79,12362,12363],{"class":89},"nav2_rate_controller_bt_node\n",[79,12365,12366,12368],{"class":81,"line":1564},[79,12367,12276],{"class":106},[79,12369,12370],{"class":89},"nav2_distance_controller_bt_node\n",[79,12372,12373,12375],{"class":81,"line":1570},[79,12374,12276],{"class":106},[79,12376,12377],{"class":89},"nav2_speed_controller_bt_node\n",[79,12379,12380,12382],{"class":81,"line":1583},[79,12381,12276],{"class":106},[79,12383,12384],{"class":89},"nav2_truncate_path_action_bt_node\n",[79,12386,12387,12389],{"class":81,"line":1596},[79,12388,12276],{"class":106},[79,12390,12391],{"class":89},"nav2_goal_updater_node_bt_node\n",[79,12393,12394,12396],{"class":81,"line":1608},[79,12395,12276],{"class":106},[79,12397,12398],{"class":89},"nav2_recovery_node_bt_node\n",[79,12400,12401,12403],{"class":81,"line":1621},[79,12402,12276],{"class":106},[79,12404,12405],{"class":89},"nav2_pipeline_sequence_bt_node\n",[79,12407,12408,12410],{"class":81,"line":1626},[79,12409,12276],{"class":106},[79,12411,12412],{"class":89},"nav2_round_robin_node_bt_node\n",[79,12414,12415,12417],{"class":81,"line":1637},[79,12416,12276],{"class":106},[79,12418,12419],{"class":89},"nav2_transform_available_condition_bt_node\n",[79,12421,12422,12424],{"class":81,"line":1642},[79,12423,12276],{"class":106},[79,12425,12426],{"class":89},"nav2_time_expired_condition_bt_node\n",[79,12428,12429,12431],{"class":81,"line":1648},[79,12430,12276],{"class":106},[79,12432,12433],{"class":89},"nav2_distance_traveled_condition_bt_node\n",[79,12435,12436,12438],{"class":81,"line":1654},[79,12437,12276],{"class":106},[79,12439,12440],{"class":89},"nav2_single_trigger_bt_node\n",[79,12442,12443,12445],{"class":81,"line":1660},[79,12444,12276],{"class":106},[79,12446,12447],{"class":89},"nav2_is_battery_low_condition_bt_node\n",[79,12449,12450,12452],{"class":81,"line":1665},[79,12451,12276],{"class":106},[79,12453,12454],{"class":89},"nav2_navigate_through_poses_action_bt_node\n",[79,12456,12457,12459],{"class":81,"line":2060},[79,12458,12276],{"class":106},[79,12460,12461],{"class":89},"nav2_navigate_to_pose_action_bt_node\n",[79,12463,12464,12466],{"class":81,"line":2071},[79,12465,12276],{"class":106},[79,12467,12468],{"class":89},"nav2_remove_passed_goals_action_bt_node\n",[79,12470,12471,12473],{"class":81,"line":2084},[79,12472,12276],{"class":106},[79,12474,12475],{"class":89},"nav2_planner_selector_bt_node\n",[79,12477,12478,12480],{"class":81,"line":2098},[79,12479,12276],{"class":106},[79,12481,12482],{"class":89},"nav2_controller_selector_bt_node\n",[79,12484,12485,12487],{"class":81,"line":2111},[79,12486,12276],{"class":106},[79,12488,12489],{"class":89},"nav2_goal_checker_selector_bt_node\n",[19,12491,12492],{},[22,12493,12494],{},"(2) Configuration files related to planner_server",[19,12496,1222,12497,11153,12499,2333],{},[76,12498,1270],{},[76,12500,12501],{},"planner.yaml",[70,12503,12505],{"className":1696,"code":12504,"language":1698,"meta":33,"style":33},"/**:\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",[76,12506,12507,12513,12519,12529,12537,12548,12555,12565,12574,12583,12592,12596,12602,12609,12616,12626,12635,12644,12653,12662,12666,12671,12681,12690,12699,12726,12733,12743,12752,12761,12768,12777,12786,12795,12804,12814,12823,12832,12842,12851,12858,12867,12875,12884,12893,12902,12912,12921,12930,12938,12944,12952,12960,12968,12976,12984,12992,13000,13008,13016,13023,13032,13041,13048,13057,13067,13077],{"__ignoreMap":33},[79,12508,12509,12511],{"class":81,"line":82},[79,12510,6679],{"class":1705},[79,12512,1708],{"class":106},[79,12514,12515,12517],{"class":81,"line":116},[79,12516,1713],{"class":1705},[79,12518,1708],{"class":106},[79,12520,12521,12524,12526],{"class":81,"line":138},[79,12522,12523],{"class":1705},"    expected_planner_frequency",[79,12525,1723],{"class":106},[79,12527,12528],{"class":1251},"20.0\n",[79,12530,12531,12533,12535],{"class":81,"line":145},[79,12532,6692],{"class":1705},[79,12534,1723],{"class":106},[79,12536,9952],{"class":1251},[79,12538,12539,12542,12544,12546],{"class":81,"line":152},[79,12540,12541],{"class":1705},"    planner_plugins",[79,12543,4989],{"class":106},[79,12545,11318],{"class":89},[79,12547,5005],{"class":106},[79,12549,12550,12553],{"class":81,"line":164},[79,12551,12552],{"class":1705},"    GridBased",[79,12554,1708],{"class":106},[79,12556,12557,12560,12562],{"class":81,"line":176},[79,12558,12559],{"class":1705},"      plugin",[79,12561,1723],{"class":106},[79,12563,12564],{"class":89},"\"nav2_navfn_planner/NavfnPlanner\"\n",[79,12566,12567,12570,12572],{"class":81,"line":181},[79,12568,12569],{"class":1705},"      tolerance",[79,12571,1723],{"class":106},[79,12573,1931],{"class":1251},[79,12575,12576,12579,12581],{"class":81,"line":187},[79,12577,12578],{"class":1705},"      use_astar",[79,12580,1723],{"class":106},[79,12582,1866],{"class":1251},[79,12584,12585,12588,12590],{"class":81,"line":199},[79,12586,12587],{"class":1705},"      allow_unknown",[79,12589,1723],{"class":106},[79,12591,1973],{"class":1251},[79,12593,12594],{"class":81,"line":1393},[79,12595,142],{"emptyLinePlaceholder":141},[79,12597,12598,12600],{"class":81,"line":1408},[79,12599,6679],{"class":1705},[79,12601,1708],{"class":106},[79,12603,12604,12607],{"class":81,"line":1413},[79,12605,12606],{"class":1705},"  global_costmap",[79,12608,1708],{"class":106},[79,12610,12611,12614],{"class":81,"line":1424},[79,12612,12613],{"class":1705},"    ros__parameters",[79,12615,1708],{"class":106},[79,12617,12618,12621,12623],{"class":81,"line":1433},[79,12619,12620],{"class":1705},"      update_frequency",[79,12622,1723],{"class":106},[79,12624,12625],{"class":1251},"1.0\n",[79,12627,12628,12631,12633],{"class":81,"line":1447},[79,12629,12630],{"class":1705},"      publish_frequency",[79,12632,1723],{"class":106},[79,12634,12625],{"class":1251},[79,12636,12637,12640,12642],{"class":81,"line":1460},[79,12638,12639],{"class":1705},"      global_frame",[79,12641,1723],{"class":106},[79,12643,1800],{"class":89},[79,12645,12646,12649,12651],{"class":81,"line":1470},[79,12647,12648],{"class":1705},"      robot_base_frame",[79,12650,1723],{"class":106},[79,12652,1810],{"class":89},[79,12654,12655,12658,12660],{"class":81,"line":1478},[79,12656,12657],{"class":1705},"      use_sim_time",[79,12659,1723],{"class":106},[79,12661,9952],{"class":1251},[79,12663,12664],{"class":81,"line":1494},[79,12665,142],{"emptyLinePlaceholder":141},[79,12667,12668],{"class":81,"line":1508},[79,12669,12670],{"class":148},"      # robot_radius: 0.2\n",[79,12672,12673,12676,12678],{"class":81,"line":1520},[79,12674,12675],{"class":1705},"      footprint",[79,12677,1723],{"class":106},[79,12679,12680],{"class":89},"\"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n",[79,12682,12683,12686,12688],{"class":81,"line":1525},[79,12684,12685],{"class":1705},"      resolution",[79,12687,1723],{"class":106},[79,12689,1909],{"class":1251},[79,12691,12692,12695,12697],{"class":81,"line":1536},[79,12693,12694],{"class":1705},"      track_unknown_space",[79,12696,1723],{"class":106},[79,12698,1973],{"class":1251},[79,12700,12701,12704,12706,12709,12711,12714,12716,12719,12721,12724],{"class":81,"line":1547},[79,12702,12703],{"class":1705},"      plugins",[79,12705,4989],{"class":106},[79,12707,12708],{"class":89},"\"static_layer\"",[79,12710,1500],{"class":106},[79,12712,12713],{"class":89},"\"obstacle_layer\"",[79,12715,1500],{"class":106},[79,12717,12718],{"class":89},"\"voxel_layer\"",[79,12720,1500],{"class":106},[79,12722,12723],{"class":89},"\"inflation_layer\"",[79,12725,5005],{"class":106},[79,12727,12728,12731],{"class":81,"line":1553},[79,12729,12730],{"class":1705},"      obstacle_layer",[79,12732,1708],{"class":106},[79,12734,12735,12738,12740],{"class":81,"line":1564},[79,12736,12737],{"class":1705},"        plugin",[79,12739,1723],{"class":106},[79,12741,12742],{"class":89},"\"nav2_costmap_2d::ObstacleLayer\"\n",[79,12744,12745,12748,12750],{"class":81,"line":1570},[79,12746,12747],{"class":1705},"        enabled",[79,12749,1723],{"class":106},[79,12751,9952],{"class":1251},[79,12753,12754,12757,12759],{"class":81,"line":1583},[79,12755,12756],{"class":1705},"        observation_sources",[79,12758,1723],{"class":106},[79,12760,7045],{"class":89},[79,12762,12763,12766],{"class":81,"line":1596},[79,12764,12765],{"class":1705},"        scan",[79,12767,1708],{"class":106},[79,12769,12770,12773,12775],{"class":81,"line":1608},[79,12771,12772],{"class":1705},"          topic",[79,12774,1723],{"class":106},[79,12776,1820],{"class":89},[79,12778,12779,12782,12784],{"class":81,"line":1621},[79,12780,12781],{"class":1705},"          max_obstacle_height",[79,12783,1723],{"class":106},[79,12785,1899],{"class":1251},[79,12787,12788,12791,12793],{"class":81,"line":1626},[79,12789,12790],{"class":1705},"          clearing",[79,12792,1723],{"class":106},[79,12794,9952],{"class":1251},[79,12796,12797,12800,12802],{"class":81,"line":1637},[79,12798,12799],{"class":1705},"          marking",[79,12801,1723],{"class":106},[79,12803,9952],{"class":1251},[79,12805,12806,12809,12811],{"class":81,"line":1642},[79,12807,12808],{"class":1705},"          data_type",[79,12810,1723],{"class":106},[79,12812,12813],{"class":89},"\"LaserScan\"\n",[79,12815,12816,12819,12821],{"class":81,"line":1648},[79,12817,12818],{"class":1705},"          raytrace_max_range",[79,12820,1723],{"class":106},[79,12822,2068],{"class":1251},[79,12824,12825,12828,12830],{"class":81,"line":1654},[79,12826,12827],{"class":1705},"          raytrace_min_range",[79,12829,1723],{"class":106},[79,12831,6918],{"class":1251},[79,12833,12834,12837,12839],{"class":81,"line":1660},[79,12835,12836],{"class":1705},"          obstacle_max_range",[79,12838,1723],{"class":106},[79,12840,12841],{"class":1251},"2.5\n",[79,12843,12844,12847,12849],{"class":81,"line":1665},[79,12845,12846],{"class":1705},"          obstacle_min_range",[79,12848,1723],{"class":106},[79,12850,6918],{"class":1251},[79,12852,12853,12856],{"class":81,"line":2060},[79,12854,12855],{"class":1705},"      voxel_layer",[79,12857,1708],{"class":106},[79,12859,12860,12862,12864],{"class":81,"line":2071},[79,12861,12737],{"class":1705},[79,12863,1723],{"class":106},[79,12865,12866],{"class":89},"\"nav2_costmap_2d::VoxelLayer\"\n",[79,12868,12869,12871,12873],{"class":81,"line":2084},[79,12870,12747],{"class":1705},[79,12872,1723],{"class":106},[79,12874,9952],{"class":1251},[79,12876,12877,12880,12882],{"class":81,"line":2098},[79,12878,12879],{"class":1705},"        publish_voxel_map",[79,12881,1723],{"class":106},[79,12883,9952],{"class":1251},[79,12885,12886,12889,12891],{"class":81,"line":2111},[79,12887,12888],{"class":1705},"        origin_z",[79,12890,1723],{"class":106},[79,12892,6918],{"class":1251},[79,12894,12895,12898,12900],{"class":81,"line":2125},[79,12896,12897],{"class":1705},"        z_resolution",[79,12899,1723],{"class":106},[79,12901,1909],{"class":1251},[79,12903,12904,12907,12909],{"class":81,"line":2136},[79,12905,12906],{"class":1705},"        z_voxels",[79,12908,1723],{"class":106},[79,12910,12911],{"class":1251},"16\n",[79,12913,12914,12917,12919],{"class":81,"line":2141},[79,12915,12916],{"class":1705},"        max_obstacle_height",[79,12918,1723],{"class":106},[79,12920,1899],{"class":1251},[79,12922,12923,12926,12928],{"class":81,"line":2151},[79,12924,12925],{"class":1705},"        mark_threshold",[79,12927,1723],{"class":106},[79,12929,5015],{"class":1251},[79,12931,12932,12934,12936],{"class":81,"line":2162},[79,12933,12756],{"class":1705},[79,12935,1723],{"class":106},[79,12937,7045],{"class":89},[79,12939,12940,12942],{"class":81,"line":2174},[79,12941,12765],{"class":1705},[79,12943,1708],{"class":106},[79,12945,12946,12948,12950],{"class":81,"line":2179},[79,12947,12772],{"class":1705},[79,12949,1723],{"class":106},[79,12951,1820],{"class":89},[79,12953,12954,12956,12958],{"class":81,"line":2190},[79,12955,12781],{"class":1705},[79,12957,1723],{"class":106},[79,12959,1899],{"class":1251},[79,12961,12962,12964,12966],{"class":81,"line":2200},[79,12963,12790],{"class":1705},[79,12965,1723],{"class":106},[79,12967,9952],{"class":1251},[79,12969,12970,12972,12974],{"class":81,"line":2211},[79,12971,12799],{"class":1705},[79,12973,1723],{"class":106},[79,12975,9952],{"class":1251},[79,12977,12978,12980,12982],{"class":81,"line":2216},[79,12979,12808],{"class":1705},[79,12981,1723],{"class":106},[79,12983,12813],{"class":89},[79,12985,12986,12988,12990],{"class":81,"line":2230},[79,12987,12818],{"class":1705},[79,12989,1723],{"class":106},[79,12991,2068],{"class":1251},[79,12993,12994,12996,12998],{"class":81,"line":2243},[79,12995,12827],{"class":1705},[79,12997,1723],{"class":106},[79,12999,6918],{"class":1251},[79,13001,13002,13004,13006],{"class":81,"line":2248},[79,13003,12836],{"class":1705},[79,13005,1723],{"class":106},[79,13007,12841],{"class":1251},[79,13009,13010,13012,13014],{"class":81,"line":2262},[79,13011,12846],{"class":1705},[79,13013,1723],{"class":106},[79,13015,6918],{"class":1251},[79,13017,13018,13021],{"class":81,"line":2276},[79,13019,13020],{"class":1705},"      static_layer",[79,13022,1708],{"class":106},[79,13024,13025,13027,13029],{"class":81,"line":2290},[79,13026,12737],{"class":1705},[79,13028,1723],{"class":106},[79,13030,13031],{"class":89},"\"nav2_costmap_2d::StaticLayer\"\n",[79,13033,13034,13037,13039],{"class":81,"line":2301},[79,13035,13036],{"class":1705},"        map_subscribe_transient_local",[79,13038,1723],{"class":106},[79,13040,9952],{"class":1251},[79,13042,13043,13046],{"class":81,"line":2311},[79,13044,13045],{"class":1705},"      inflation_layer",[79,13047,1708],{"class":106},[79,13049,13050,13052,13054],{"class":81,"line":6629},[79,13051,12737],{"class":1705},[79,13053,1723],{"class":106},[79,13055,13056],{"class":89},"\"nav2_costmap_2d::InflationLayer\"\n",[79,13058,13059,13062,13064],{"class":81,"line":6635},[79,13060,13061],{"class":1705},"        cost_scaling_factor",[79,13063,1723],{"class":106},[79,13065,13066],{"class":1251},"4.0\n",[79,13068,13069,13072,13074],{"class":81,"line":6641},[79,13070,13071],{"class":1705},"        inflation_radius",[79,13073,1723],{"class":106},[79,13075,13076],{"class":1251},"0.55\n",[79,13078,13079,13082,13084],{"class":81,"line":10145},[79,13080,13081],{"class":1705},"      always_send_full_costmap",[79,13083,1723],{"class":106},[79,13085,13086],{"class":1251},"False\n",[19,13088,13089],{},[22,13090,13091],{},"(3) Controller server related configuration files",[19,13093,1222,13094,11153,13096,2333],{},[76,13095,1270],{},[76,13097,13098],{},"controller.yaml",[70,13100,13102],{"className":1696,"code":13101,"language":1698,"meta":33,"style":33},"/**:\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",[76,13103,13104,13110,13116,13124,13133,13143,13152,13161,13165,13170,13179,13189,13202,13213,13217,13222,13229,13238,13247,13256,13260,13267,13276,13285,13294,13303,13307,13312,13319,13328,13337,13346,13355,13359,13364,13373,13382,13386,13391,13400,13409,13418,13427,13431,13436,13440,13445,13454,13463,13473,13482,13491,13501,13505,13510,13519,13529,13538,13548,13557,13567,13571,13576,13585,13594,13603,13612,13620,13662,13672,13682,13691,13701,13710,13719,13728,13737,13747,13756,13762,13769,13775,13783,13791,13799,13807,13815,13824,13834,13843,13851,13855,13860,13868,13886,13892,13900,13908,13916,13922,13930,13938,13946,13952,13960,13968,13976,13984,13992,13998,14006,14014,14022,14030,14038,14046,14054,14062,14070,14076,14084,14092,14100,14108,14116,14124,14132,14140,14148,14154,14162],{"__ignoreMap":33},[79,13105,13106,13108],{"class":81,"line":82},[79,13107,6679],{"class":1705},[79,13109,1708],{"class":106},[79,13111,13112,13114],{"class":81,"line":116},[79,13113,1713],{"class":1705},[79,13115,1708],{"class":106},[79,13117,13118,13120,13122],{"class":81,"line":138},[79,13119,6692],{"class":1705},[79,13121,1723],{"class":106},[79,13123,9952],{"class":1251},[79,13125,13126,13129,13131],{"class":81,"line":145},[79,13127,13128],{"class":1705},"    controller_frequency",[79,13130,1723],{"class":106},[79,13132,2034],{"class":1251},[79,13134,13135,13138,13140],{"class":81,"line":152},[79,13136,13137],{"class":1705},"    min_x_velocity_threshold",[79,13139,1723],{"class":106},[79,13141,13142],{"class":1251},"0.001\n",[79,13144,13145,13148,13150],{"class":81,"line":164},[79,13146,13147],{"class":1705},"    min_y_velocity_threshold",[79,13149,1723],{"class":106},[79,13151,1931],{"class":1251},[79,13153,13154,13157,13159],{"class":81,"line":176},[79,13155,13156],{"class":1705},"    min_theta_velocity_threshold",[79,13158,1723],{"class":106},[79,13160,13142],{"class":1251},[79,13162,13163],{"class":81,"line":181},[79,13164,142],{"emptyLinePlaceholder":141},[79,13166,13167],{"class":81,"line":187},[79,13168,13169],{"class":148},"    # failure_tolerance: 0.3\n",[79,13171,13172,13175,13177],{"class":81,"line":199},[79,13173,13174],{"class":1705},"    failure_tolerance",[79,13176,1723],{"class":106},[79,13178,12625],{"class":1251},[79,13180,13181,13184,13186],{"class":81,"line":1393},[79,13182,13183],{"class":1705},"    progress_checker_plugin",[79,13185,1723],{"class":106},[79,13187,13188],{"class":89},"\"progress_checker\"\n",[79,13190,13191,13194,13196,13199],{"class":81,"line":1408},[79,13192,13193],{"class":1705},"    goal_checker_plugins",[79,13195,4989],{"class":106},[79,13197,13198],{"class":89},"\"general_goal_checker\"",[79,13200,13201],{"class":106},"] \n",[79,13203,13204,13207,13209,13211],{"class":81,"line":1413},[79,13205,13206],{"class":1705},"    controller_plugins",[79,13208,4989],{"class":106},[79,13210,11382],{"class":89},[79,13212,5005],{"class":106},[79,13214,13215],{"class":81,"line":1424},[79,13216,142],{"emptyLinePlaceholder":141},[79,13218,13219],{"class":81,"line":1433},[79,13220,13221],{"class":148},"    # Progress checker parameters\n",[79,13223,13224,13227],{"class":81,"line":1447},[79,13225,13226],{"class":1705},"    progress_checker",[79,13228,1708],{"class":106},[79,13230,13231,13233,13235],{"class":81,"line":1460},[79,13232,12559],{"class":1705},[79,13234,1723],{"class":106},[79,13236,13237],{"class":89},"\"nav2_controller::SimpleProgressChecker\"\n",[79,13239,13240,13243,13245],{"class":81,"line":1470},[79,13241,13242],{"class":1705},"      required_movement_radius",[79,13244,1723],{"class":106},[79,13246,1931],{"class":1251},[79,13248,13249,13252,13254],{"class":81,"line":1478},[79,13250,13251],{"class":1705},"      movement_time_allowance",[79,13253,1723],{"class":106},[79,13255,2034],{"class":1251},[79,13257,13258],{"class":81,"line":1494},[79,13259,142],{"emptyLinePlaceholder":141},[79,13261,13262,13265],{"class":81,"line":1508},[79,13263,13264],{"class":1705},"    general_goal_checker",[79,13266,1708],{"class":106},[79,13268,13269,13272,13274],{"class":81,"line":1520},[79,13270,13271],{"class":1705},"      stateful",[79,13273,1723],{"class":106},[79,13275,9952],{"class":1251},[79,13277,13278,13280,13282],{"class":81,"line":1525},[79,13279,12559],{"class":1705},[79,13281,1723],{"class":106},[79,13283,13284],{"class":89},"\"nav2_controller::SimpleGoalChecker\"\n",[79,13286,13287,13290,13292],{"class":81,"line":1536},[79,13288,13289],{"class":1705},"      xy_goal_tolerance",[79,13291,1723],{"class":106},[79,13293,5035],{"class":1251},[79,13295,13296,13299,13301],{"class":81,"line":1547},[79,13297,13298],{"class":1705},"      yaw_goal_tolerance",[79,13300,1723],{"class":106},[79,13302,5035],{"class":1251},[79,13304,13305],{"class":81,"line":1553},[79,13306,142],{"emptyLinePlaceholder":141},[79,13308,13309],{"class":81,"line":1564},[79,13310,13311],{"class":148},"    # DWB parameters\n",[79,13313,13314,13317],{"class":81,"line":1570},[79,13315,13316],{"class":1705},"    FollowPath",[79,13318,1708],{"class":106},[79,13320,13321,13323,13325],{"class":81,"line":1583},[79,13322,12559],{"class":1705},[79,13324,1723],{"class":106},[79,13326,13327],{"class":89},"\"dwb_core::DWBLocalPlanner\"\n",[79,13329,13330,13333,13335],{"class":81,"line":1596},[79,13331,13332],{"class":1705},"      debug_trajectory_details",[79,13334,1723],{"class":106},[79,13336,9952],{"class":1251},[79,13338,13339,13342,13344],{"class":81,"line":1608},[79,13340,13341],{"class":1705},"      min_vel_x",[79,13343,1723],{"class":106},[79,13345,6918],{"class":1251},[79,13347,13348,13351,13353],{"class":81,"line":1621},[79,13349,13350],{"class":1705},"      min_vel_y",[79,13352,1723],{"class":106},[79,13354,6918],{"class":1251},[79,13356,13357],{"class":81,"line":1626},[79,13358,142],{"emptyLinePlaceholder":141},[79,13360,13361],{"class":81,"line":1637},[79,13362,13363],{"class":148},"      # max_vel_x: 0.15\n",[79,13365,13366,13369,13371],{"class":81,"line":1642},[79,13367,13368],{"class":1705},"      max_vel_x",[79,13370,1723],{"class":106},[79,13372,1941],{"class":1251},[79,13374,13375,13378,13380],{"class":81,"line":1648},[79,13376,13377],{"class":1705},"      max_vel_y",[79,13379,1723],{"class":106},[79,13381,6918],{"class":1251},[79,13383,13384],{"class":81,"line":1654},[79,13385,142],{"emptyLinePlaceholder":141},[79,13387,13388],{"class":81,"line":1660},[79,13389,13390],{"class":148},"      # max_vel_theta: 1.0\n",[79,13392,13393,13396,13398],{"class":81,"line":1665},[79,13394,13395],{"class":1705},"      max_vel_theta",[79,13397,1723],{"class":106},[79,13399,12625],{"class":1251},[79,13401,13402,13405,13407],{"class":81,"line":2060},[79,13403,13404],{"class":1705},"      min_speed_xy",[79,13406,1723],{"class":106},[79,13408,6918],{"class":1251},[79,13410,13411,13414,13416],{"class":81,"line":2071},[79,13412,13413],{"class":1705},"      max_speed_xy",[79,13415,1723],{"class":106},[79,13417,1941],{"class":1251},[79,13419,13420,13423,13425],{"class":81,"line":2084},[79,13421,13422],{"class":1705},"      min_speed_theta",[79,13424,1723],{"class":106},[79,13426,6918],{"class":1251},[79,13428,13429],{"class":81,"line":2098},[79,13430,142],{"emptyLinePlaceholder":141},[79,13432,13433],{"class":81,"line":2111},[79,13434,13435],{"class":148},"      # Add high threshold velocity for turtlebot 3 issue.\n",[79,13437,13438],{"class":81,"line":2125},[79,13439,142],{"emptyLinePlaceholder":141},[79,13441,13442],{"class":81,"line":2136},[79,13443,13444],{"class":148},"      # https://github.com/ROBOTIS-GIT/turtlebot3_simulations/issues/75\n",[79,13446,13447,13450,13452],{"class":81,"line":2141},[79,13448,13449],{"class":1705},"      acc_lim_x",[79,13451,1723],{"class":106},[79,13453,12625],{"class":1251},[79,13455,13456,13459,13461],{"class":81,"line":2151},[79,13457,13458],{"class":1705},"      acc_lim_y",[79,13460,1723],{"class":106},[79,13462,6918],{"class":1251},[79,13464,13465,13468,13470],{"class":81,"line":2162},[79,13466,13467],{"class":1705},"      acc_lim_theta",[79,13469,1723],{"class":106},[79,13471,13472],{"class":1251},"3.2\n",[79,13474,13475,13478,13480],{"class":81,"line":2174},[79,13476,13477],{"class":1705},"      decel_lim_x",[79,13479,1723],{"class":106},[79,13481,6839],{"class":1251},[79,13483,13484,13487,13489],{"class":81,"line":2179},[79,13485,13486],{"class":1705},"      decel_lim_y",[79,13488,1723],{"class":106},[79,13490,6918],{"class":1251},[79,13492,13493,13496,13498],{"class":81,"line":2190},[79,13494,13495],{"class":1705},"      decel_lim_theta",[79,13497,1723],{"class":106},[79,13499,13500],{"class":1251},"-3.2\n",[79,13502,13503],{"class":81,"line":2200},[79,13504,142],{"emptyLinePlaceholder":141},[79,13506,13507],{"class":81,"line":2211},[79,13508,13509],{"class":148},"      # vx_samples: 20\n",[79,13511,13512,13515,13517],{"class":81,"line":2216},[79,13513,13514],{"class":1705},"      vx_samples",[79,13516,1723],{"class":106},[79,13518,12235],{"class":1251},[79,13520,13521,13524,13526],{"class":81,"line":2230},[79,13522,13523],{"class":1705},"      vy_samples",[79,13525,1723],{"class":106},[79,13527,13528],{"class":1251},"5\n",[79,13530,13531,13534,13536],{"class":81,"line":2243},[79,13532,13533],{"class":1705},"      vtheta_samples",[79,13535,1723],{"class":106},[79,13537,12235],{"class":1251},[79,13539,13540,13543,13545],{"class":81,"line":2248},[79,13541,13542],{"class":1705},"      sim_time",[79,13544,1723],{"class":106},[79,13546,13547],{"class":1251},"1.7\n",[79,13549,13550,13553,13555],{"class":81,"line":2262},[79,13551,13552],{"class":1705},"      linear_granularity",[79,13554,1723],{"class":106},[79,13556,1909],{"class":1251},[79,13558,13559,13562,13564],{"class":81,"line":2276},[79,13560,13561],{"class":1705},"      angular_granularity",[79,13563,1723],{"class":106},[79,13565,13566],{"class":1251},"0.025\n",[79,13568,13569],{"class":81,"line":2290},[79,13570,142],{"emptyLinePlaceholder":141},[79,13572,13573],{"class":81,"line":2301},[79,13574,13575],{"class":148},"      # transform_tolerance: 0.2\n",[79,13577,13578,13581,13583],{"class":81,"line":2311},[79,13579,13580],{"class":1705},"      transform_tolerance",[79,13582,1723],{"class":106},[79,13584,12625],{"class":1251},[79,13586,13587,13589,13591],{"class":81,"line":6629},[79,13588,13289],{"class":1705},[79,13590,1723],{"class":106},[79,13592,13593],{"class":1251},"0.15\n",[79,13595,13596,13599,13601],{"class":81,"line":6635},[79,13597,13598],{"class":1705},"      trans_stopped_velocity",[79,13600,1723],{"class":106},[79,13602,5035],{"class":1251},[79,13604,13605,13608,13610],{"class":81,"line":6641},[79,13606,13607],{"class":1705},"      short_circuit_trajectory_evaluation",[79,13609,1723],{"class":106},[79,13611,9952],{"class":1251},[79,13613,13614,13616,13618],{"class":81,"line":10145},[79,13615,13271],{"class":1705},[79,13617,1723],{"class":106},[79,13619,9952],{"class":1251},[79,13621,13622,13625,13627,13630,13632,13635,13637,13640,13642,13645,13647,13650,13652,13655,13657,13660],{"class":81,"line":10157},[79,13623,13624],{"class":1705},"      critics",[79,13626,4989],{"class":106},[79,13628,13629],{"class":89},"\"RotateToGoal\"",[79,13631,1500],{"class":106},[79,13633,13634],{"class":89},"\"Oscillation\"",[79,13636,1500],{"class":106},[79,13638,13639],{"class":89},"\"BaseObstacle\"",[79,13641,1500],{"class":106},[79,13643,13644],{"class":89},"\"GoalAlign\"",[79,13646,1500],{"class":106},[79,13648,13649],{"class":89},"\"PathAlign\"",[79,13651,1500],{"class":106},[79,13653,13654],{"class":89},"\"PathDist\"",[79,13656,1500],{"class":106},[79,13658,13659],{"class":89},"\"GoalDist\"",[79,13661,5005],{"class":106},[79,13663,13664,13667,13669],{"class":81,"line":10169},[79,13665,13666],{"class":1705},"      BaseObstacle.scale",[79,13668,1723],{"class":106},[79,13670,13671],{"class":1251},"0.02\n",[79,13673,13674,13677,13679],{"class":81,"line":10180},[79,13675,13676],{"class":1705},"      PathAlign.scale",[79,13678,1723],{"class":106},[79,13680,13681],{"class":1251},"32.0\n",[79,13683,13684,13687,13689],{"class":81,"line":10191},[79,13685,13686],{"class":1705},"      PathAlign.forward_point_distance",[79,13688,1723],{"class":106},[79,13690,2005],{"class":1251},[79,13692,13693,13696,13698],{"class":81,"line":10200},[79,13694,13695],{"class":1705},"      GoalAlign.scale",[79,13697,1723],{"class":106},[79,13699,13700],{"class":1251},"24.0\n",[79,13702,13703,13706,13708],{"class":81,"line":10206},[79,13704,13705],{"class":1705},"      GoalAlign.forward_point_distance",[79,13707,1723],{"class":106},[79,13709,2005],{"class":1251},[79,13711,13712,13715,13717],{"class":81,"line":10215},[79,13713,13714],{"class":1705},"      PathDist.scale",[79,13716,1723],{"class":106},[79,13718,13681],{"class":1251},[79,13720,13721,13724,13726],{"class":81,"line":10220},[79,13722,13723],{"class":1705},"      GoalDist.scale",[79,13725,1723],{"class":106},[79,13727,13700],{"class":1251},[79,13729,13730,13733,13735],{"class":81,"line":10230},[79,13731,13732],{"class":1705},"      RotateToGoal.scale",[79,13734,1723],{"class":106},[79,13736,13681],{"class":1251},[79,13738,13739,13742,13744],{"class":81,"line":10246},[79,13740,13741],{"class":1705},"      RotateToGoal.slowing_factor",[79,13743,1723],{"class":106},[79,13745,13746],{"class":1251},"5.0\n",[79,13748,13749,13752,13754],{"class":81,"line":10251},[79,13750,13751],{"class":1705},"      RotateToGoal.lookahead_time",[79,13753,1723],{"class":106},[79,13755,6839],{"class":1251},[79,13757,13758,13760],{"class":81,"line":10256},[79,13759,6679],{"class":1705},[79,13761,1708],{"class":106},[79,13763,13764,13767],{"class":81,"line":10261},[79,13765,13766],{"class":1705},"  local_costmap",[79,13768,1708],{"class":106},[79,13770,13771,13773],{"class":81,"line":10271},[79,13772,12613],{"class":1705},[79,13774,1708],{"class":106},[79,13776,13777,13779,13781],{"class":81,"line":10283},[79,13778,12620],{"class":1705},[79,13780,1723],{"class":106},[79,13782,13746],{"class":1251},[79,13784,13785,13787,13789],{"class":81,"line":10295},[79,13786,12630],{"class":1705},[79,13788,1723],{"class":106},[79,13790,1899],{"class":1251},[79,13792,13793,13795,13797],{"class":81,"line":10306},[79,13794,12639],{"class":1705},[79,13796,1723],{"class":106},[79,13798,1790],{"class":89},[79,13800,13801,13803,13805],{"class":81,"line":10317},[79,13802,12648],{"class":1705},[79,13804,1723],{"class":106},[79,13806,1810],{"class":89},[79,13808,13809,13811,13813],{"class":81,"line":10326},[79,13810,12657],{"class":1705},[79,13812,1723],{"class":106},[79,13814,9952],{"class":1251},[79,13816,13817,13820,13822],{"class":81,"line":10332},[79,13818,13819],{"class":1705},"      rolling_window",[79,13821,1723],{"class":106},[79,13823,9952],{"class":1251},[79,13825,13826,13829,13831],{"class":81,"line":10341},[79,13827,13828],{"class":1705},"      width",[79,13830,1723],{"class":106},[79,13832,13833],{"class":1251},"2\n",[79,13835,13836,13839,13841],{"class":81,"line":10346},[79,13837,13838],{"class":1705},"      height",[79,13840,1723],{"class":106},[79,13842,13833],{"class":1251},[79,13844,13845,13847,13849],{"class":81,"line":10351},[79,13846,12685],{"class":1705},[79,13848,1723],{"class":106},[79,13850,1909],{"class":1251},[79,13852,13853],{"class":81,"line":10356},[79,13854,142],{"emptyLinePlaceholder":141},[79,13856,13857],{"class":81,"line":10366},[79,13858,13859],{"class":148},"      # robot_radius: 0.20\n",[79,13861,13862,13864,13866],{"class":81,"line":10378},[79,13863,12675],{"class":1705},[79,13865,1723],{"class":106},[79,13867,12680],{"class":89},[79,13869,13870,13872,13874,13876,13878,13880,13882,13884],{"class":81,"line":10390},[79,13871,12703],{"class":1705},[79,13873,4989],{"class":106},[79,13875,12713],{"class":89},[79,13877,1500],{"class":106},[79,13879,12718],{"class":89},[79,13881,1500],{"class":106},[79,13883,12723],{"class":89},[79,13885,5005],{"class":106},[79,13887,13888,13890],{"class":81,"line":10401},[79,13889,13045],{"class":1705},[79,13891,1708],{"class":106},[79,13893,13894,13896,13898],{"class":81,"line":10412},[79,13895,12737],{"class":1705},[79,13897,1723],{"class":106},[79,13899,13056],{"class":89},[79,13901,13902,13904,13906],{"class":81,"line":10421},[79,13903,13071],{"class":1705},[79,13905,1723],{"class":106},[79,13907,1931],{"class":1251},[79,13909,13910,13912,13914],{"class":81,"line":10427},[79,13911,13061],{"class":1705},[79,13913,1723],{"class":106},[79,13915,13066],{"class":1251},[79,13917,13918,13920],{"class":81,"line":10436},[79,13919,12730],{"class":1705},[79,13921,1708],{"class":106},[79,13923,13924,13926,13928],{"class":81,"line":10441},[79,13925,12737],{"class":1705},[79,13927,1723],{"class":106},[79,13929,12742],{"class":89},[79,13931,13932,13934,13936],{"class":81,"line":10446},[79,13933,12747],{"class":1705},[79,13935,1723],{"class":106},[79,13937,9952],{"class":1251},[79,13939,13940,13942,13944],{"class":81,"line":10451},[79,13941,12756],{"class":1705},[79,13943,1723],{"class":106},[79,13945,7045],{"class":89},[79,13947,13948,13950],{"class":81,"line":10461},[79,13949,12765],{"class":1705},[79,13951,1708],{"class":106},[79,13953,13954,13956,13958],{"class":81,"line":10473},[79,13955,12772],{"class":1705},[79,13957,1723],{"class":106},[79,13959,1820],{"class":89},[79,13961,13962,13964,13966],{"class":81,"line":10485},[79,13963,12781],{"class":1705},[79,13965,1723],{"class":106},[79,13967,1899],{"class":1251},[79,13969,13970,13972,13974],{"class":81,"line":10496},[79,13971,12790],{"class":1705},[79,13973,1723],{"class":106},[79,13975,9952],{"class":1251},[79,13977,13978,13980,13982],{"class":81,"line":10507},[79,13979,12799],{"class":1705},[79,13981,1723],{"class":106},[79,13983,9952],{"class":1251},[79,13985,13986,13988,13990],{"class":81,"line":10520},[79,13987,12808],{"class":1705},[79,13989,1723],{"class":106},[79,13991,12813],{"class":89},[79,13993,13994,13996],{"class":81,"line":10529},[79,13995,12855],{"class":1705},[79,13997,1708],{"class":106},[79,13999,14000,14002,14004],{"class":81,"line":10535},[79,14001,12737],{"class":1705},[79,14003,1723],{"class":106},[79,14005,12866],{"class":89},[79,14007,14008,14010,14012],{"class":81,"line":10544},[79,14009,12747],{"class":1705},[79,14011,1723],{"class":106},[79,14013,9952],{"class":1251},[79,14015,14016,14018,14020],{"class":81,"line":10549},[79,14017,12879],{"class":1705},[79,14019,1723],{"class":106},[79,14021,9952],{"class":1251},[79,14023,14024,14026,14028],{"class":81,"line":10558},[79,14025,12888],{"class":1705},[79,14027,1723],{"class":106},[79,14029,6918],{"class":1251},[79,14031,14032,14034,14036],{"class":81,"line":10571},[79,14033,12897],{"class":1705},[79,14035,1723],{"class":106},[79,14037,1909],{"class":1251},[79,14039,14040,14042,14044],{"class":81,"line":10585},[79,14041,12906],{"class":1705},[79,14043,1723],{"class":106},[79,14045,12911],{"class":1251},[79,14047,14048,14050,14052],{"class":81,"line":10590},[79,14049,12916],{"class":1705},[79,14051,1723],{"class":106},[79,14053,1899],{"class":1251},[79,14055,14056,14058,14060],{"class":81,"line":10595},[79,14057,12925],{"class":1705},[79,14059,1723],{"class":106},[79,14061,5015],{"class":1251},[79,14063,14064,14066,14068],{"class":81,"line":10600},[79,14065,12756],{"class":1705},[79,14067,1723],{"class":106},[79,14069,7045],{"class":89},[79,14071,14072,14074],{"class":81,"line":10610},[79,14073,12765],{"class":1705},[79,14075,1708],{"class":106},[79,14077,14078,14080,14082],{"class":81,"line":10622},[79,14079,12772],{"class":1705},[79,14081,1723],{"class":106},[79,14083,1820],{"class":89},[79,14085,14086,14088,14090],{"class":81,"line":10634},[79,14087,12781],{"class":1705},[79,14089,1723],{"class":106},[79,14091,1899],{"class":1251},[79,14093,14094,14096,14098],{"class":81,"line":10645},[79,14095,12790],{"class":1705},[79,14097,1723],{"class":106},[79,14099,9952],{"class":1251},[79,14101,14102,14104,14106],{"class":81,"line":10656},[79,14103,12799],{"class":1705},[79,14105,1723],{"class":106},[79,14107,9952],{"class":1251},[79,14109,14110,14112,14114],{"class":81,"line":10665},[79,14111,12808],{"class":1705},[79,14113,1723],{"class":106},[79,14115,12813],{"class":89},[79,14117,14118,14120,14122],{"class":81,"line":10671},[79,14119,12818],{"class":1705},[79,14121,1723],{"class":106},[79,14123,2068],{"class":1251},[79,14125,14126,14128,14130],{"class":81,"line":10680},[79,14127,12827],{"class":1705},[79,14129,1723],{"class":106},[79,14131,6918],{"class":1251},[79,14133,14134,14136,14138],{"class":81,"line":10685},[79,14135,12836],{"class":1705},[79,14137,1723],{"class":106},[79,14139,12841],{"class":1251},[79,14141,14142,14144,14146],{"class":81,"line":10690},[79,14143,12846],{"class":1705},[79,14145,1723],{"class":106},[79,14147,6918],{"class":1251},[79,14149,14150,14152],{"class":81,"line":10695},[79,14151,13020],{"class":1705},[79,14153,1708],{"class":106},[79,14155,14156,14158,14160],{"class":81,"line":10705},[79,14157,13036],{"class":1705},[79,14159,1723],{"class":106},[79,14161,9952],{"class":1251},[79,14163,14164,14166,14168],{"class":81,"line":10717},[79,14165,13081],{"class":1705},[79,14167,1723],{"class":106},[79,14169,9952],{"class":1251},[19,14171,14172],{},"Footprint",[47,14174,14175,14178],{},[50,14176,14177],{},"Convert millimeters to meters: length 0.96m, width 0.45m",[50,14179,14180,14181,14183],{},"Using the robot center (origin of the ",[76,14182,2522],{}," coordinate system) as the reference, calculate the coordinates of the rectangle's vertices:",[19,14185,14186,14189],{},[4400,14187,14188],{},"Note",": Vertices are arranged in clockwise or counterclockwise order, covering the robot's length and width boundaries. (Right-hand coordinate system)",[19,14191,14192],{},"For example, length 960, width 450, length 400",[70,14194,14198],{"className":14195,"code":14196,"language":14197,"meta":33,"style":33},"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",[76,14199,14200],{"__ignoreMap":33},[79,14201,14202,14205],{"class":81,"line":82},[79,14203,14204],{"class":106},"footprint: ",[79,14206,14207],{"class":1251},"[[0.48, 0.225], [0.48, -0.225], [-0.48, -0.225], [-0.48, 0.225]]\n",[19,14209,14210],{},[22,14211,14212],{},"(4) Configuration files related to behavior_server",[19,14214,1222,14215,11153,14217,2333],{},[76,14216,1270],{},[76,14218,14219],{},"behavior.yaml",[70,14221,14223],{"className":1696,"code":14222,"language":1698,"meta":33,"style":33},"/**:\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",[76,14224,14225,14231,14237,14247,14257,14266,14298,14305,14314,14321,14330,14337,14346,14353,14362,14369,14378,14386,14394,14402,14410,14419,14428,14438],{"__ignoreMap":33},[79,14226,14227,14229],{"class":81,"line":82},[79,14228,6679],{"class":1705},[79,14230,1708],{"class":106},[79,14232,14233,14235],{"class":81,"line":116},[79,14234,1713],{"class":1705},[79,14236,1708],{"class":106},[79,14238,14239,14242,14244],{"class":81,"line":138},[79,14240,14241],{"class":1705},"    costmap_topic",[79,14243,1723],{"class":106},[79,14245,14246],{"class":89},"local_costmap/costmap_raw\n",[79,14248,14249,14252,14254],{"class":81,"line":145},[79,14250,14251],{"class":1705},"    footprint_topic",[79,14253,1723],{"class":106},[79,14255,14256],{"class":89},"local_costmap/published_footprint\n",[79,14258,14259,14262,14264],{"class":81,"line":152},[79,14260,14261],{"class":1705},"    cycle_frequency",[79,14263,1723],{"class":106},[79,14265,13746],{"class":1251},[79,14267,14268,14271,14273,14276,14278,14281,14283,14286,14288,14291,14293,14296],{"class":81,"line":164},[79,14269,14270],{"class":1705},"    behavior_plugins",[79,14272,4989],{"class":106},[79,14274,14275],{"class":89},"\"spin\"",[79,14277,1500],{"class":106},[79,14279,14280],{"class":89},"\"backup\"",[79,14282,1500],{"class":106},[79,14284,14285],{"class":89},"\"drive_on_heading\"",[79,14287,1500],{"class":106},[79,14289,14290],{"class":89},"\"assisted_teleop\"",[79,14292,1500],{"class":106},[79,14294,14295],{"class":89},"\"wait\"",[79,14297,5005],{"class":106},[79,14299,14300,14303],{"class":81,"line":176},[79,14301,14302],{"class":1705},"    spin",[79,14304,1708],{"class":106},[79,14306,14307,14309,14311],{"class":81,"line":181},[79,14308,12559],{"class":1705},[79,14310,1723],{"class":106},[79,14312,14313],{"class":89},"\"nav2_behaviors/Spin\"\n",[79,14315,14316,14319],{"class":81,"line":187},[79,14317,14318],{"class":1705},"    backup",[79,14320,1708],{"class":106},[79,14322,14323,14325,14327],{"class":81,"line":199},[79,14324,12559],{"class":1705},[79,14326,1723],{"class":106},[79,14328,14329],{"class":89},"\"nav2_behaviors/BackUp\"\n",[79,14331,14332,14335],{"class":81,"line":1393},[79,14333,14334],{"class":1705},"    drive_on_heading",[79,14336,1708],{"class":106},[79,14338,14339,14341,14343],{"class":81,"line":1408},[79,14340,12559],{"class":1705},[79,14342,1723],{"class":106},[79,14344,14345],{"class":89},"\"nav2_behaviors/DriveOnHeading\"\n",[79,14347,14348,14351],{"class":81,"line":1413},[79,14349,14350],{"class":1705},"    wait",[79,14352,1708],{"class":106},[79,14354,14355,14357,14359],{"class":81,"line":1424},[79,14356,12559],{"class":1705},[79,14358,1723],{"class":106},[79,14360,14361],{"class":89},"\"nav2_behaviors/Wait\"\n",[79,14363,14364,14367],{"class":81,"line":1433},[79,14365,14366],{"class":1705},"    assisted_teleop",[79,14368,1708],{"class":106},[79,14370,14371,14373,14375],{"class":81,"line":1447},[79,14372,12559],{"class":1705},[79,14374,1723],{"class":106},[79,14376,14377],{"class":89},"\"nav2_behaviors/AssistedTeleop\"\n",[79,14379,14380,14382,14384],{"class":81,"line":1460},[79,14381,12182],{"class":1705},[79,14383,1723],{"class":106},[79,14385,1790],{"class":89},[79,14387,14388,14390,14392],{"class":81,"line":1470},[79,14389,12191],{"class":1705},[79,14391,1723],{"class":106},[79,14393,1810],{"class":89},[79,14395,14396,14398,14400],{"class":81,"line":1478},[79,14397,6978],{"class":1705},[79,14399,1723],{"class":106},[79,14401,2005],{"class":1251},[79,14403,14404,14406,14408],{"class":81,"line":1494},[79,14405,6692],{"class":1705},[79,14407,1723],{"class":106},[79,14409,9952],{"class":1251},[79,14411,14412,14415,14417],{"class":81,"line":1508},[79,14413,14414],{"class":1705},"    simulate_ahead_time",[79,14416,1723],{"class":106},[79,14418,1899],{"class":1251},[79,14420,14421,14424,14426],{"class":81,"line":1520},[79,14422,14423],{"class":1705},"    max_rotational_vel",[79,14425,1723],{"class":106},[79,14427,12625],{"class":1251},[79,14429,14430,14433,14435],{"class":81,"line":1525},[79,14431,14432],{"class":1705},"    min_rotational_vel",[79,14434,1723],{"class":106},[79,14436,14437],{"class":1251},"0.4\n",[79,14439,14440,14443,14445],{"class":81,"line":1536},[79,14441,14442],{"class":1705},"    rotational_acc_lim",[79,14444,1723],{"class":106},[79,14446,13472],{"class":1251},[19,14448,14449],{},[22,14450,14451],{},"(5) Waypoint Follower Related Configuration Files",[19,14453,1222,14454,11153,14456,2333],{},[76,14455,1270],{},[76,14457,14458],{},"waypoint.yaml",[70,14460,14462],{"className":1696,"code":14461,"language":1698,"meta":33,"style":33},"/**:\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",[76,14463,14464,14470,14476,14484,14493,14502,14512,14519,14528,14537],{"__ignoreMap":33},[79,14465,14466,14468],{"class":81,"line":82},[79,14467,6679],{"class":1705},[79,14469,1708],{"class":106},[79,14471,14472,14474],{"class":81,"line":116},[79,14473,1713],{"class":1705},[79,14475,1708],{"class":106},[79,14477,14478,14480,14482],{"class":81,"line":138},[79,14479,6692],{"class":1705},[79,14481,1723],{"class":106},[79,14483,9952],{"class":1251},[79,14485,14486,14489,14491],{"class":81,"line":145},[79,14487,14488],{"class":1705},"    loop_rate",[79,14490,1723],{"class":106},[79,14492,12235],{"class":1251},[79,14494,14495,14498,14500],{"class":81,"line":152},[79,14496,14497],{"class":1705},"    stop_on_failure",[79,14499,1723],{"class":106},[79,14501,1866],{"class":1251},[79,14503,14504,14507,14509],{"class":81,"line":164},[79,14505,14506],{"class":1705},"    waypoint_task_executor_plugin",[79,14508,1723],{"class":106},[79,14510,14511],{"class":89},"\"wait_at_waypoint\"\n",[79,14513,14514,14517],{"class":81,"line":176},[79,14515,14516],{"class":1705},"    wait_at_waypoint",[79,14518,1708],{"class":106},[79,14520,14521,14523,14525],{"class":81,"line":181},[79,14522,12559],{"class":1705},[79,14524,1723],{"class":106},[79,14526,14527],{"class":89},"\"nav2_waypoint_follower::WaitAtWaypoint\"\n",[79,14529,14530,14533,14535],{"class":81,"line":187},[79,14531,14532],{"class":1705},"      enabled",[79,14534,1723],{"class":106},[79,14536,9952],{"class":1251},[79,14538,14539,14542,14544],{"class":81,"line":199},[79,14540,14541],{"class":1705},"      waypoint_pause_duration",[79,14543,1723],{"class":106},[79,14545,14546],{"class":1251},"5000\n",[19,14548,14549],{},[22,14550,14551],{},"(6) velocity_smoother related configuration files",[19,14553,1222,14554,11153,14556,2333],{},[76,14555,1270],{},[76,14557,14558],{},"velocity.yaml",[70,14560,14562],{"className":1696,"code":14561,"language":1698,"meta":33,"style":33},"/**:\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",[76,14563,14564,14570,14576,14584,14593,14602,14612,14632,14653,14674,14695,14703,14712,14731],{"__ignoreMap":33},[79,14565,14566,14568],{"class":81,"line":82},[79,14567,6679],{"class":1705},[79,14569,1708],{"class":106},[79,14571,14572,14574],{"class":81,"line":116},[79,14573,1713],{"class":1705},[79,14575,1708],{"class":106},[79,14577,14578,14580,14582],{"class":81,"line":138},[79,14579,6692],{"class":1705},[79,14581,1723],{"class":106},[79,14583,9952],{"class":1251},[79,14585,14586,14589,14591],{"class":81,"line":145},[79,14587,14588],{"class":1705},"    smoothing_frequency",[79,14590,1723],{"class":106},[79,14592,12528],{"class":1251},[79,14594,14595,14598,14600],{"class":81,"line":152},[79,14596,14597],{"class":1705},"    scale_velocities",[79,14599,1723],{"class":106},[79,14601,13086],{"class":1251},[79,14603,14604,14607,14609],{"class":81,"line":164},[79,14605,14606],{"class":1705},"    feedback",[79,14608,1723],{"class":106},[79,14610,14611],{"class":89},"\"OPEN_LOOP\"\n",[79,14613,14614,14617,14619,14621,14623,14626,14628,14630],{"class":81,"line":176},[79,14615,14616],{"class":1705},"    max_velocity",[79,14618,4989],{"class":106},[79,14620,2044],{"class":1251},[79,14622,1500],{"class":106},[79,14624,14625],{"class":1251},"0.0",[79,14627,1500],{"class":106},[79,14629,2238],{"class":1251},[79,14631,5005],{"class":106},[79,14633,14634,14637,14639,14642,14644,14646,14648,14651],{"class":81,"line":181},[79,14635,14636],{"class":1705},"    min_velocity",[79,14638,4989],{"class":106},[79,14640,14641],{"class":1251},"-0.1",[79,14643,1500],{"class":106},[79,14645,14625],{"class":1251},[79,14647,1500],{"class":106},[79,14649,14650],{"class":1251},"-1.0",[79,14652,5005],{"class":106},[79,14654,14655,14658,14660,14663,14665,14667,14669,14672],{"class":81,"line":187},[79,14656,14657],{"class":1705},"    max_accel",[79,14659,4989],{"class":106},[79,14661,14662],{"class":1251},"2.5",[79,14664,1500],{"class":106},[79,14666,14625],{"class":1251},[79,14668,1500],{"class":106},[79,14670,14671],{"class":1251},"3.2",[79,14673,5005],{"class":106},[79,14675,14676,14679,14681,14684,14686,14688,14690,14693],{"class":81,"line":199},[79,14677,14678],{"class":1705},"    max_decel",[79,14680,4989],{"class":106},[79,14682,14683],{"class":1251},"-2.5",[79,14685,1500],{"class":106},[79,14687,14625],{"class":1251},[79,14689,1500],{"class":106},[79,14691,14692],{"class":1251},"-3.2",[79,14694,5005],{"class":106},[79,14696,14697,14699,14701],{"class":81,"line":1393},[79,14698,12200],{"class":1705},[79,14700,1723],{"class":106},[79,14702,6889],{"class":89},[79,14704,14705,14708,14710],{"class":81,"line":1408},[79,14706,14707],{"class":1705},"    odom_duration",[79,14709,1723],{"class":106},[79,14711,2005],{"class":1251},[79,14713,14714,14717,14719,14721,14723,14725,14727,14729],{"class":81,"line":1413},[79,14715,14716],{"class":1705},"    deadband_velocity",[79,14718,4989],{"class":106},[79,14720,14625],{"class":1251},[79,14722,1500],{"class":106},[79,14724,14625],{"class":1251},[79,14726,1500],{"class":106},[79,14728,14625],{"class":1251},[79,14730,5005],{"class":106},[79,14732,14733,14736,14738],{"class":81,"line":1424},[79,14734,14735],{"class":1705},"    velocity_timeout",[79,14737,1723],{"class":106},[79,14739,12625],{"class":1251},[19,14741,14742],{},[22,14743,14744],{},"(7) Configuration files related to smoother_server",[19,14746,1222,14747,11153,14749,2333],{},[76,14748,1270],{},[76,14750,14751],{},"smootherr.yaml",[70,14753,14755],{"className":1696,"code":14754,"language":1698,"meta":33,"style":33},"/**:\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",[76,14756,14757,14763,14769,14778,14787,14795,14803,14815,14822,14831,14840],{"__ignoreMap":33},[79,14758,14759,14761],{"class":81,"line":82},[79,14760,6679],{"class":1705},[79,14762,1708],{"class":106},[79,14764,14765,14767],{"class":81,"line":116},[79,14766,1713],{"class":1705},[79,14768,1708],{"class":106},[79,14770,14771,14773,14775],{"class":81,"line":138},[79,14772,14241],{"class":1705},[79,14774,1723],{"class":106},[79,14776,14777],{"class":89},"global_costmap/costmap_raw\n",[79,14779,14780,14782,14784],{"class":81,"line":145},[79,14781,14251],{"class":1705},[79,14783,1723],{"class":106},[79,14785,14786],{"class":89},"global_costmap/published_footprint\n",[79,14788,14789,14791,14793],{"class":81,"line":152},[79,14790,12191],{"class":1705},[79,14792,1723],{"class":106},[79,14794,1810],{"class":89},[79,14796,14797,14799,14801],{"class":81,"line":164},[79,14798,1936],{"class":1705},[79,14800,1723],{"class":106},[79,14802,2005],{"class":1251},[79,14804,14805,14808,14810,14813],{"class":81,"line":176},[79,14806,14807],{"class":1705},"    smoother_plugins",[79,14809,4989],{"class":106},[79,14811,14812],{"class":89},"\"simple_smoother\"",[79,14814,5005],{"class":106},[79,14816,14817,14820],{"class":81,"line":181},[79,14818,14819],{"class":1705},"    simple_smoother",[79,14821,1708],{"class":106},[79,14823,14824,14826,14828],{"class":81,"line":187},[79,14825,12559],{"class":1705},[79,14827,1723],{"class":106},[79,14829,14830],{"class":89},"\"nav2_smoother::SimpleSmoother\"\n",[79,14832,14833,14835,14837],{"class":81,"line":199},[79,14834,12569],{"class":1705},[79,14836,1723],{"class":106},[79,14838,14839],{"class":1251},"1.0e-10\n",[79,14841,14842,14845,14847],{"class":81,"line":1393},[79,14843,14844],{"class":1705},"      do_refinement",[79,14846,1723],{"class":106},[79,14848,9952],{"class":1251},[19,14850,14851],{},[22,14852,14853],{},"3. Launch Integration",[19,14855,14856,14857,5340],{},"When implementing navigation, it relies on map and localization functions. We can integrate the previous localization launch file and the currently written navigation core module launch file into a single launch file to simplify the startup of navigation functionality. Create a new launch file named ",[76,14858,14859],{},"bringup.launch.py",[70,14861,14863],{"className":1281,"code":14862,"language":1283,"meta":33,"style":33},"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",[76,14864,14865,14871,14875,14885,14889,14899,14910,14920,14930,14934,14938,14946,14950,14958,14964,14972,14976,14980,14994,15007,15011,15020,15024,15028,15033,15039,15044,15048,15052,15060,15070,15074,15078,15082,15091,15095,15099,15104,15110,15115,15119,15123,15131,15141,15145,15149,15153,15159,15163,15168,15173],{"__ignoreMap":33},[79,14866,14867,14869],{"class":81,"line":82},[79,14868,1290],{"class":99},[79,14870,1293],{"class":106},[79,14872,14873],{"class":81,"line":116},[79,14874,142],{"emptyLinePlaceholder":141},[79,14876,14877,14879,14881,14883],{"class":81,"line":138},[79,14878,1302],{"class":99},[79,14880,1353],{"class":106},[79,14882,1290],{"class":99},[79,14884,1358],{"class":106},[79,14886,14887],{"class":81,"line":145},[79,14888,142],{"emptyLinePlaceholder":141},[79,14890,14891,14893,14895,14897],{"class":81,"line":152},[79,14892,1302],{"class":99},[79,14894,1305],{"class":106},[79,14896,1290],{"class":99},[79,14898,1310],{"class":106},[79,14900,14901,14903,14905,14907],{"class":81,"line":164},[79,14902,1302],{"class":99},[79,14904,1317],{"class":106},[79,14906,1290],{"class":99},[79,14908,14909],{"class":106}," IncludeLaunchDescription, DeclareLaunchArgument\n",[79,14911,14912,14914,14916,14918],{"class":81,"line":176},[79,14913,1302],{"class":99},[79,14915,1329],{"class":106},[79,14917,1290],{"class":99},[79,14919,1334],{"class":106},[79,14921,14922,14924,14926,14928],{"class":81,"line":181},[79,14923,1302],{"class":99},[79,14925,6215],{"class":106},[79,14927,1290],{"class":99},[79,14929,6220],{"class":106},[79,14931,14932],{"class":81,"line":187},[79,14933,142],{"emptyLinePlaceholder":141},[79,14935,14936],{"class":81,"line":199},[79,14937,142],{"emptyLinePlaceholder":141},[79,14939,14940,14942,14944],{"class":81,"line":1393},[79,14941,1367],{"class":99},[79,14943,1370],{"class":85},[79,14945,1373],{"class":106},[79,14947,14948],{"class":81,"line":1408},[79,14949,142],{"emptyLinePlaceholder":141},[79,14951,14952,14954,14956],{"class":81,"line":1413},[79,14953,3200],{"class":106},[79,14955,1381],{"class":99},[79,14957,1421],{"class":106},[79,14959,14960,14962],{"class":81,"line":1424},[79,14961,1427],{"class":89},[79,14963,1430],{"class":106},[79,14965,14966,14968,14970],{"class":81,"line":1433},[79,14967,1437],{"class":1436},[79,14969,1381],{"class":99},[79,14971,6277],{"class":89},[79,14973,14974],{"class":81,"line":1447},[79,14975,3353],{"class":106},[79,14977,14978],{"class":81,"line":1460},[79,14979,142],{"emptyLinePlaceholder":141},[79,14981,14982,14985,14987,14989,14992],{"class":81,"line":1470},[79,14983,14984],{"class":106},"    amcl_pkg ",[79,14986,1381],{"class":99},[79,14988,9734],{"class":106},[79,14990,14991],{"class":89},"\"mycar_localization\"",[79,14993,1390],{"class":106},[79,14995,14996,14999,15001,15003,15005],{"class":81,"line":1478},[79,14997,14998],{"class":106},"    nav2_pkg ",[79,15000,1381],{"class":99},[79,15002,9734],{"class":106},[79,15004,9737],{"class":89},[79,15006,1390],{"class":106},[79,15008,15009],{"class":81,"line":1494},[79,15010,142],{"emptyLinePlaceholder":141},[79,15012,15013,15016,15018],{"class":81,"line":1508},[79,15014,15015],{"class":106},"    amcl_launch ",[79,15017,1381],{"class":99},[79,15019,6535],{"class":106},[79,15021,15022],{"class":81,"line":1520},[79,15023,6540],{"class":106},[79,15025,15026],{"class":81,"line":1525},[79,15027,6545],{"class":106},[79,15029,15030],{"class":81,"line":1536},[79,15031,15032],{"class":106},"                amcl_pkg,\n",[79,15034,15035,15037],{"class":81,"line":1547},[79,15036,6560],{"class":89},[79,15038,1430],{"class":106},[79,15040,15041],{"class":81,"line":1553},[79,15042,15043],{"class":89},"                'mycar_loca.launch.py'\n",[79,15045,15046],{"class":81,"line":1564},[79,15047,6572],{"class":106},[79,15049,15050],{"class":81,"line":1570},[79,15051,6577],{"class":106},[79,15053,15054,15056,15058],{"class":81,"line":1583},[79,15055,6582],{"class":1436},[79,15057,1381],{"class":99},[79,15059,6587],{"class":106},[79,15061,15062,15064,15066,15068],{"class":81,"line":1596},[79,15063,6592],{"class":89},[79,15065,3292],{"class":106},[79,15067,1387],{"class":89},[79,15069,1390],{"class":106},[79,15071,15072],{"class":81,"line":1608},[79,15073,6603],{"class":106},[79,15075,15076],{"class":81,"line":1621},[79,15077,3353],{"class":106},[79,15079,15080],{"class":81,"line":1626},[79,15081,142],{"emptyLinePlaceholder":141},[79,15083,15084,15087,15089],{"class":81,"line":1637},[79,15085,15086],{"class":106},"    nav2_launch ",[79,15088,1381],{"class":99},[79,15090,6535],{"class":106},[79,15092,15093],{"class":81,"line":1642},[79,15094,6540],{"class":106},[79,15096,15097],{"class":81,"line":1648},[79,15098,6545],{"class":106},[79,15100,15101],{"class":81,"line":1654},[79,15102,15103],{"class":106},"                nav2_pkg,\n",[79,15105,15106,15108],{"class":81,"line":1660},[79,15107,6560],{"class":89},[79,15109,1430],{"class":106},[79,15111,15112],{"class":81,"line":1665},[79,15113,15114],{"class":89},"                'nav2.launch.py'\n",[79,15116,15117],{"class":81,"line":2060},[79,15118,6572],{"class":106},[79,15120,15121],{"class":81,"line":2071},[79,15122,6577],{"class":106},[79,15124,15125,15127,15129],{"class":81,"line":2084},[79,15126,6582],{"class":1436},[79,15128,1381],{"class":99},[79,15130,6587],{"class":106},[79,15132,15133,15135,15137,15139],{"class":81,"line":2098},[79,15134,6592],{"class":89},[79,15136,3292],{"class":106},[79,15138,1387],{"class":89},[79,15140,1390],{"class":106},[79,15142,15143],{"class":81,"line":2111},[79,15144,6603],{"class":106},[79,15146,15147],{"class":81,"line":2125},[79,15148,3353],{"class":106},[79,15150,15151],{"class":81,"line":2136},[79,15152,142],{"emptyLinePlaceholder":141},[79,15154,15155,15157],{"class":81,"line":2141},[79,15156,1668],{"class":99},[79,15158,3436],{"class":106},[79,15160,15161],{"class":81,"line":2151},[79,15162,3441],{"class":106},[79,15164,15165],{"class":81,"line":2162},[79,15166,15167],{"class":106},"        amcl_launch,\n",[79,15169,15170],{"class":81,"line":2174},[79,15171,15172],{"class":106},"        nav2_launch\n",[79,15174,15175],{"class":81,"line":2179},[79,15176,3461],{"class":106},[19,15178,15179],{},[22,15180,15181],{},"4. Edit Configuration File",[19,15183,2329,15184,2333],{},[76,15185,2332],{},[70,15187,15189],{"className":2336,"code":15188,"language":2338,"meta":33,"style":33},"install(DIRECTORY launch params bts\n  DESTINATION share/${PROJECT_NAME}\n)\n",[76,15190,15191,15198,15204],{"__ignoreMap":33},[79,15192,15193,15195],{"class":81,"line":82},[79,15194,2345],{"class":99},[79,15196,15197],{"class":106},"(DIRECTORY launch params bts\n",[79,15199,15200,15202],{"class":81,"line":116},[79,15201,2353],{"class":106},[79,15203,2356],{"class":99},[79,15205,15206],{"class":81,"line":138},[79,15207,1390],{"class":106},[19,15209,15210],{},[22,15211,15212],{},"5. Compilation",[19,15214,2368],{},[70,15216,15218],{"className":72,"code":15217,"language":74,"meta":33,"style":33},"colcon build --packages-select mycar_navigation2\n",[76,15219,15220],{"__ignoreMap":33},[79,15221,15222,15224,15226,15228],{"class":81,"line":82},[79,15223,2378],{"class":85},[79,15225,2381],{"class":89},[79,15227,2384],{"class":1251},[79,15229,15230],{"class":89}," mycar_navigation2\n",[19,15232,15233],{},[22,15234,15235],{},"6. Execution",[19,15237,4124],{},[70,15239,15240],{"className":72,"code":2400,"language":74,"meta":33,"style":33},[76,15241,15242,15248],{"__ignoreMap":33},[79,15243,15244,15246],{"class":81,"line":82},[79,15245,934],{"class":1251},[79,15247,2409],{"class":89},[79,15249,15250,15252,15254,15256],{"class":81,"line":116},[79,15251,1239],{"class":85},[79,15253,2416],{"class":89},[79,15255,2419],{"class":89},[79,15257,2422],{"class":89},[19,15259,15260],{},"(2) Then, in the terminal, navigate to the current workspace and enter the following command to start the navigation function:",[70,15262,15264],{"className":72,"code":15263,"language":74,"meta":33,"style":33},". install/setup.bash\nros2 launch mycar_navigation2 bringup.launch.py use_sim_time:=True\n",[76,15265,15266,15272],{"__ignoreMap":33},[79,15267,15268,15270],{"class":81,"line":82},[79,15269,934],{"class":1251},[79,15271,2409],{"class":89},[79,15273,15274,15276,15278,15280,15283],{"class":81,"line":116},[79,15275,1239],{"class":85},[79,15277,2416],{"class":89},[79,15279,9529],{"class":89},[79,15281,15282],{"class":89}," bringup.launch.py",[79,15284,2452],{"class":89},[19,15286,15287,15288,15291,15292,15295,15296,15299],{},"(3) Start rviz2, load the ",[76,15289,15290],{},"nav2_default_view.rviz"," file under ",[76,15293,15294],{},"/opt/ros/humble/share/nav2_bringup/rviz",", set the initial pose for the robot, then set the target point through ",[76,15297,15298],{},"Nav2 Goal"," in the menu bar, and the robot will automatically navigate to the target point.",[70,15301,15303],{"className":72,"code":15302,"language":74,"meta":33,"style":33},"rviz2 -d /opt/ros/humble/share/nav2_bringup/rviz/nav2_default_view.rviz\n",[76,15304,15305],{"__ignoreMap":33},[79,15306,15307,15310,15313],{"class":81,"line":82},[79,15308,15309],{"class":85},"rviz2",[79,15311,15312],{"class":1251}," -d",[79,15314,15315],{"class":89}," /opt/ros/humble/share/nav2_bringup/rviz/nav2_default_view.rviz\n",[47,15317,15318,15326,15336],{},[50,15319,15320,15322,15323,15325],{},[76,15321,15309],{},": Launch the ",[76,15324,15309],{}," tool.",[50,15327,15328,15331,15332,15335],{},[76,15329,15330],{},"-d",": Specifies the ",[76,15333,15334],{},".rviz"," configuration file to load.",[50,15337,15338,15341,15342,15344],{},[76,15339,15340],{},"/opt/ros/humble/share/nav2_bringup/rviz/nav2_default_view.rviz",": Path to the ",[76,15343,15334],{}," configuration file.",[19,15346,15347,15348,15350,15351,15344],{},"After running this command, ",[76,15349,15309],{}," will start and load the ",[76,15352,15290],{},[19,15354,15355],{},"First use",[19,15357,15358,15361],{},[31,15359],{"alt":33,"src":15360},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1766.webp",[31,15362],{"alt":33,"src":15363},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1767.webp",[19,15365,15366],{},"As shown in the image above, the left image is for selecting the initial position, and the right image is for selecting the target position.",[19,15368,15369],{},"In the image above, the glowing rings around each obstacle and wall indicate the level of danger — the redder the color, the more dangerous it is for the robot to pass through that area.",[19,15371,15372],{},[31,15373],{"alt":33,"src":15374},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1768.webp",[19,15376,15377],{},[31,15378],{"alt":33,"src":15379},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1769.webp",[15,15381,15383],{"id":15382},"autonomous-exploration-slam","Autonomous Exploration SLAM",[19,15385,15386,15387,15390,15391,15394],{},"Navigation depends on maps and localization. For example, in the previous section ",[22,15388,15389],{},"Navigation Function Integration",", the navigation implementation integrated the localization functionality from the ",[22,15392,15393],{},"Localization AMCL"," section via a launch file. Similarly, during robot SLAM, map data and localization information are published. Therefore, navigation can also be combined directly with SLAM instead of relying on AMCL, achieving an autonomous exploration SLAM effect.",[19,15396,15397],{},[22,15398,15399],{},"1. Write the launch file",[19,15401,1222,15402,15404,15405,15408,15409,2333],{},[76,15403,1266],{}," directory of the ",[76,15406,15407],{},"mycar_navigation2"," package, create a new launch file named ",[76,15410,15411],{},"auto_slam.launch.py",[70,15413,15415],{"className":1281,"code":15414,"language":1283,"meta":33,"style":33},"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",[76,15416,15417,15423,15427,15437,15441,15451,15461,15473,15483,15494,15498,15502,15510,15514,15522,15528,15536,15540,15544,15553,15560,15571,15580,15584,15588,15600,15614,15618,15631,15644,15649,15662,15667,15671,15680,15684,15688,15693,15699,15704,15708,15712,15720,15726,15731,15741,15758,15762,15766,15770,15779,15783,15787,15792,15798,15803,15807,15811,15819,15825,15829,15837,15850,15854,15858,15862,15870,15874,15878,15882,15888,15892,15896,15900,15908,15914,15918,15922,15926,15934,15939,15944,15949,15954,15959],{"__ignoreMap":33},[79,15418,15419,15421],{"class":81,"line":82},[79,15420,1290],{"class":99},[79,15422,1293],{"class":106},[79,15424,15425],{"class":81,"line":116},[79,15426,142],{"emptyLinePlaceholder":141},[79,15428,15429,15431,15433,15435],{"class":81,"line":138},[79,15430,1302],{"class":99},[79,15432,1353],{"class":106},[79,15434,1290],{"class":99},[79,15436,1358],{"class":106},[79,15438,15439],{"class":81,"line":145},[79,15440,142],{"emptyLinePlaceholder":141},[79,15442,15443,15445,15447,15449],{"class":81,"line":152},[79,15444,1302],{"class":99},[79,15446,1305],{"class":106},[79,15448,1290],{"class":99},[79,15450,1310],{"class":106},[79,15452,15453,15455,15457,15459],{"class":81,"line":164},[79,15454,1302],{"class":99},[79,15456,1317],{"class":106},[79,15458,1290],{"class":99},[79,15460,6198],{"class":106},[79,15462,15463,15465,15468,15470],{"class":81,"line":176},[79,15464,1302],{"class":99},[79,15466,15467],{"class":106}," launch.conditions ",[79,15469,1290],{"class":99},[79,15471,15472],{"class":106}," IfCondition\n",[79,15474,15475,15477,15479,15481],{"class":81,"line":181},[79,15476,1302],{"class":99},[79,15478,6215],{"class":106},[79,15480,1290],{"class":99},[79,15482,6220],{"class":106},[79,15484,15485,15487,15489,15491],{"class":81,"line":187},[79,15486,1302],{"class":99},[79,15488,1329],{"class":106},[79,15490,1290],{"class":99},[79,15492,15493],{"class":106}," LaunchConfiguration, PythonExpression\n",[79,15495,15496],{"class":81,"line":199},[79,15497,142],{"emptyLinePlaceholder":141},[79,15499,15500],{"class":81,"line":1393},[79,15501,142],{"emptyLinePlaceholder":141},[79,15503,15504,15506,15508],{"class":81,"line":1408},[79,15505,1367],{"class":99},[79,15507,1370],{"class":85},[79,15509,1373],{"class":106},[79,15511,15512],{"class":81,"line":1413},[79,15513,142],{"emptyLinePlaceholder":141},[79,15515,15516,15518,15520],{"class":81,"line":1424},[79,15517,3200],{"class":106},[79,15519,1381],{"class":99},[79,15521,1421],{"class":106},[79,15523,15524,15526],{"class":81,"line":1433},[79,15525,1427],{"class":89},[79,15527,1430],{"class":106},[79,15529,15530,15532,15534],{"class":81,"line":1447},[79,15531,1437],{"class":1436},[79,15533,1381],{"class":99},[79,15535,6277],{"class":89},[79,15537,15538],{"class":81,"line":1460},[79,15539,3353],{"class":106},[79,15541,15542],{"class":81,"line":1470},[79,15543,142],{"emptyLinePlaceholder":141},[79,15545,15546,15549,15551],{"class":81,"line":1478},[79,15547,15548],{"class":106},"    slam_backend_arg ",[79,15550,1381],{"class":99},[79,15552,1421],{"class":106},[79,15554,15555,15558],{"class":81,"line":1494},[79,15556,15557],{"class":89},"        'slam_backend'",[79,15559,1430],{"class":106},[79,15561,15562,15564,15566,15569],{"class":81,"line":1508},[79,15563,1437],{"class":1436},[79,15565,1381],{"class":99},[79,15567,15568],{"class":89},"'cartographer'",[79,15570,1430],{"class":106},[79,15572,15573,15575,15577],{"class":81,"line":1520},[79,15574,1450],{"class":1436},[79,15576,1381],{"class":99},[79,15578,15579],{"class":89},"'SLAM backend: slam_toolbox or cartographer'\n",[79,15581,15582],{"class":81,"line":1525},[79,15583,3353],{"class":106},[79,15585,15586],{"class":81,"line":1536},[79,15587,142],{"emptyLinePlaceholder":141},[79,15589,15590,15592,15594,15596,15598],{"class":81,"line":1547},[79,15591,1378],{"class":106},[79,15593,1381],{"class":99},[79,15595,1384],{"class":106},[79,15597,1387],{"class":89},[79,15599,1390],{"class":106},[79,15601,15602,15605,15607,15609,15612],{"class":81,"line":1553},[79,15603,15604],{"class":106},"    slam_backend ",[79,15606,1381],{"class":99},[79,15608,1384],{"class":106},[79,15610,15611],{"class":89},"'slam_backend'",[79,15613,1390],{"class":106},[79,15615,15616],{"class":81,"line":1564},[79,15617,142],{"emptyLinePlaceholder":141},[79,15619,15620,15623,15625,15627,15629],{"class":81,"line":1570},[79,15621,15622],{"class":106},"    slam_toolbox_pkg ",[79,15624,1381],{"class":99},[79,15626,9734],{"class":106},[79,15628,1488],{"class":89},[79,15630,1390],{"class":106},[79,15632,15633,15636,15638,15640,15642],{"class":81,"line":1583},[79,15634,15635],{"class":106},"    cartographer_pkg ",[79,15637,1381],{"class":99},[79,15639,9734],{"class":106},[79,15641,3318],{"class":89},[79,15643,1390],{"class":106},[79,15645,15646],{"class":81,"line":1596},[79,15647,15648],{"class":148},"    # 从这开始修改: Jazzy auto_slam 引用 mycar_navigation2_jazzy，而不是 Humble 版本包\n",[79,15650,15651,15653,15655,15657,15660],{"class":81,"line":1608},[79,15652,14998],{"class":106},[79,15654,1381],{"class":99},[79,15656,9734],{"class":106},[79,15658,15659],{"class":89},"\"mycar_navigation2_jazzy\"",[79,15661,1390],{"class":106},[79,15663,15664],{"class":81,"line":1621},[79,15665,15666],{"class":148},"    # 从这结束\n",[79,15668,15669],{"class":81,"line":1626},[79,15670,142],{"emptyLinePlaceholder":141},[79,15672,15673,15676,15678],{"class":81,"line":1637},[79,15674,15675],{"class":106},"    slam_toolbox_launch ",[79,15677,1381],{"class":99},[79,15679,6535],{"class":106},[79,15681,15682],{"class":81,"line":1642},[79,15683,6540],{"class":106},[79,15685,15686],{"class":81,"line":1648},[79,15687,6545],{"class":106},[79,15689,15690],{"class":81,"line":1654},[79,15691,15692],{"class":106},"                slam_toolbox_pkg,\n",[79,15694,15695,15697],{"class":81,"line":1660},[79,15696,6560],{"class":89},[79,15698,1430],{"class":106},[79,15700,15701],{"class":81,"line":1665},[79,15702,15703],{"class":89},"                'online_sync_launch.py'\n",[79,15705,15706],{"class":81,"line":2060},[79,15707,6572],{"class":106},[79,15709,15710],{"class":81,"line":2071},[79,15711,6577],{"class":106},[79,15713,15714,15716,15718],{"class":81,"line":2084},[79,15715,6582],{"class":1436},[79,15717,1381],{"class":99},[79,15719,6587],{"class":106},[79,15721,15722,15724],{"class":81,"line":2098},[79,15723,6592],{"class":89},[79,15725,9937],{"class":106},[79,15727,15728],{"class":81,"line":2111},[79,15729,15730],{"class":106},"        }.items(),\n",[79,15732,15733,15736,15738],{"class":81,"line":2125},[79,15734,15735],{"class":1436},"        condition",[79,15737,1381],{"class":99},[79,15739,15740],{"class":106},"IfCondition(\n",[79,15742,15743,15746,15749,15752,15755],{"class":81,"line":2136},[79,15744,15745],{"class":106},"            PythonExpression([",[79,15747,15748],{"class":89},"\"'\"",[79,15750,15751],{"class":106},", slam_backend, ",[79,15753,15754],{"class":89},"\"' == 'slam_toolbox'\"",[79,15756,15757],{"class":106},"])\n",[79,15759,15760],{"class":81,"line":2141},[79,15761,9971],{"class":106},[79,15763,15764],{"class":81,"line":2151},[79,15765,3353],{"class":106},[79,15767,15768],{"class":81,"line":2162},[79,15769,142],{"emptyLinePlaceholder":141},[79,15771,15772,15775,15777],{"class":81,"line":2174},[79,15773,15774],{"class":106},"    cartographer_launch ",[79,15776,1381],{"class":99},[79,15778,6535],{"class":106},[79,15780,15781],{"class":81,"line":2179},[79,15782,6540],{"class":106},[79,15784,15785],{"class":81,"line":2190},[79,15786,6545],{"class":106},[79,15788,15789],{"class":81,"line":2200},[79,15790,15791],{"class":106},"                cartographer_pkg,\n",[79,15793,15794,15796],{"class":81,"line":2211},[79,15795,6560],{"class":89},[79,15797,1430],{"class":106},[79,15799,15800],{"class":81,"line":2216},[79,15801,15802],{"class":89},"                'cartographer.launch.py'\n",[79,15804,15805],{"class":81,"line":2230},[79,15806,6572],{"class":106},[79,15808,15809],{"class":81,"line":2243},[79,15810,6577],{"class":106},[79,15812,15813,15815,15817],{"class":81,"line":2248},[79,15814,6582],{"class":1436},[79,15816,1381],{"class":99},[79,15818,6587],{"class":106},[79,15820,15821,15823],{"class":81,"line":2262},[79,15822,6592],{"class":89},[79,15824,9937],{"class":106},[79,15826,15827],{"class":81,"line":2276},[79,15828,15730],{"class":106},[79,15830,15831,15833,15835],{"class":81,"line":2290},[79,15832,15735],{"class":1436},[79,15834,1381],{"class":99},[79,15836,15740],{"class":106},[79,15838,15839,15841,15843,15845,15848],{"class":81,"line":2301},[79,15840,15745],{"class":106},[79,15842,15748],{"class":89},[79,15844,15751],{"class":106},[79,15846,15847],{"class":89},"\"' == 'cartographer'\"",[79,15849,15757],{"class":106},[79,15851,15852],{"class":81,"line":2311},[79,15853,9971],{"class":106},[79,15855,15856],{"class":81,"line":6629},[79,15857,3353],{"class":106},[79,15859,15860],{"class":81,"line":6635},[79,15861,142],{"emptyLinePlaceholder":141},[79,15863,15864,15866,15868],{"class":81,"line":6641},[79,15865,15086],{"class":106},[79,15867,1381],{"class":99},[79,15869,6535],{"class":106},[79,15871,15872],{"class":81,"line":10145},[79,15873,6540],{"class":106},[79,15875,15876],{"class":81,"line":10157},[79,15877,6545],{"class":106},[79,15879,15880],{"class":81,"line":10169},[79,15881,15103],{"class":106},[79,15883,15884,15886],{"class":81,"line":10180},[79,15885,6560],{"class":89},[79,15887,1430],{"class":106},[79,15889,15890],{"class":81,"line":10191},[79,15891,15114],{"class":89},[79,15893,15894],{"class":81,"line":10200},[79,15895,6572],{"class":106},[79,15897,15898],{"class":81,"line":10206},[79,15899,6577],{"class":106},[79,15901,15902,15904,15906],{"class":81,"line":10215},[79,15903,6582],{"class":1436},[79,15905,1381],{"class":99},[79,15907,6587],{"class":106},[79,15909,15910,15912],{"class":81,"line":10220},[79,15911,6592],{"class":89},[79,15913,9937],{"class":106},[79,15915,15916],{"class":81,"line":10230},[79,15917,6603],{"class":106},[79,15919,15920],{"class":81,"line":10246},[79,15921,3353],{"class":106},[79,15923,15924],{"class":81,"line":10251},[79,15925,142],{"emptyLinePlaceholder":141},[79,15927,15928,15930,15932],{"class":81,"line":10256},[79,15929,1629],{"class":106},[79,15931,1381],{"class":99},[79,15933,1634],{"class":106},[79,15935,15936],{"class":81,"line":10261},[79,15937,15938],{"class":106},"    ld.add_action(use_sim_time_arg)\n",[79,15940,15941],{"class":81,"line":10271},[79,15942,15943],{"class":106},"    ld.add_action(slam_backend_arg)\n",[79,15945,15946],{"class":81,"line":10283},[79,15947,15948],{"class":106},"    ld.add_action(slam_toolbox_launch)\n",[79,15950,15951],{"class":81,"line":10295},[79,15952,15953],{"class":106},"    ld.add_action(cartographer_launch)\n",[79,15955,15956],{"class":81,"line":10306},[79,15957,15958],{"class":106},"    ld.add_action(nav2_launch)\n",[79,15960,15961,15963],{"class":81,"line":10317},[79,15962,1668],{"class":99},[79,15964,1671],{"class":106},[19,15966,15967],{},[22,15968,15969],{},"2. Compilation",[19,15971,2368],{},[70,15973,15974],{"className":72,"code":15217,"language":74,"meta":33,"style":33},[76,15975,15976],{"__ignoreMap":33},[79,15977,15978,15980,15982,15984],{"class":81,"line":82},[79,15979,2378],{"class":85},[79,15981,2381],{"class":89},[79,15983,2384],{"class":1251},[79,15985,15230],{"class":89},[19,15987,15988],{},[22,15989,15990],{},"3. Execution",[19,15992,4124],{},[70,15994,15995],{"className":72,"code":2400,"language":74,"meta":33,"style":33},[76,15996,15997,16003],{"__ignoreMap":33},[79,15998,15999,16001],{"class":81,"line":82},[79,16000,934],{"class":1251},[79,16002,2409],{"class":89},[79,16004,16005,16007,16009,16011],{"class":81,"line":116},[79,16006,1239],{"class":85},[79,16008,2416],{"class":89},[79,16010,2419],{"class":89},[79,16012,2422],{"class":89},[19,16014,16015],{},"(2) Then, in the terminal, navigate to the current workspace and enter the following command to start the autonomous SLAM function:",[70,16017,16019],{"className":72,"code":16018,"language":74,"meta":33,"style":33},". install/setup.bash\nros2 launch mycar_navigation2 auto_slam.launch.py use_sim_time:=True slam_backend:=cartographer\n",[76,16020,16021,16027],{"__ignoreMap":33},[79,16022,16023,16025],{"class":81,"line":82},[79,16024,934],{"class":1251},[79,16026,2409],{"class":89},[79,16028,16029,16031,16033,16035,16038,16041],{"class":81,"line":116},[79,16030,1239],{"class":85},[79,16032,2416],{"class":89},[79,16034,9529],{"class":89},[79,16036,16037],{"class":89}," auto_slam.launch.py",[79,16039,16040],{"class":89}," use_sim_time:=True",[79,16042,16043],{"class":89}," slam_backend:=cartographer\n",[19,16045,15287,16046,15291,16048,16050,16051,16053],{},[76,16047,15294],{},[76,16049,15290],{},", then set the target point through ",[76,16052,15298],{}," in the menu bar. The robot will automatically navigate to the target point and also perform mapping during navigation.",[70,16055,16056],{"className":72,"code":15302,"language":74,"meta":33,"style":33},[76,16057,16058],{"__ignoreMap":33},[79,16059,16060,16062,16064],{"class":81,"line":82},[79,16061,15309],{"class":85},[79,16063,15312],{"class":1251},[79,16065,15315],{"class":89},[19,16067,16068],{},[31,16069],{"alt":33,"src":16070},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1770.webp",[19,16072,16073],{},[31,16074],{"alt":33,"src":16075},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1771.webp",[10,16077,16079],{"id":16078},"multi-vehicle-formation","Multi-vehicle formation",[19,16081,16082],{},"Multi-vehicle platooning technology enables a group of vehicles to operate cooperatively without human intervention through advanced sensors, real-time data analysis, and highly intelligent control systems. As an advanced application of intelligent transportation systems, it has demonstrated significant potential and a wide range of use cases across multiple fields. For example:",[341,16084,16085,16088,16091],{},[19,16086,16087],{},"Time optimization: Multi-vehicle formation technology eliminates errors and delays in manual operations, reducing labor costs and operational risks.",[19,16089,16090],{},"Space optimization: Multi-vehicle platooning technology can reduce the gaps between vehicles, maximizing road utilization.",[19,16092,16093],{},"Performance optimization: Dense formation driving reduces aerodynamic drag, lowering energy and fuel consumption.",[19,16095,16096],{},"In summary, multi-vehicle formation technology plays a unique role and holds significant value in the field of robotics. This section will introduce how to implement multi-vehicle formation in ROS2.",[16098,16099,16100],"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":33,"searchDepth":116,"depth":116,"links":16102},[16103,16104,16105,16106,16107,16108],{"id":12,"depth":138,"text":13},{"id":300,"depth":138,"text":301},{"id":4192,"depth":138,"text":4193},{"id":5666,"depth":138,"text":5667},{"id":7268,"depth":138,"text":7269},{"id":16078,"depth":138,"text":16079},"/en-us/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","12.1",12010000,"2023-12-30","wiki/2023-12-30-ros2-tutorial","en-us:2023-12-30-ros2-tutorial","/en-us/wiki/2023-12-30-ros2-tutorial","Ros2 Tutorial","md","wiki/2023-12-30-ros2-tutorial/ch12-1-Humble版本",false,null,"en-US","en-us",{},{"title":5,"description":33},"/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch12-1-Humble版本","tJTJn2lOf93sfCa4ABsxiIibsh0IcGE8b96VuTlLyO4",[16129,16135,16140,16146,16152,16158,16164,16170,16171,16177,16183,16189,16195,16201,16207,16213,16219,16225,16230,16236,16241,16247,16253,16259,16265,16271,16277,16283,16289,16295,16301,16307,16313,16319,16325,16331,16337,16343,16349,16355,16361,16367,16373,16379,16385,16391,16397,16403,16409,16415,16421,16427,16433,16439,16445,16451,16457,16463,16469,16475],{"path":16130,"stem":16131,"title":16132,"date":16112,"chapter":16133,"chapterSort":16134,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch1-ros2-jie-shao","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch1-ROS2介绍","Introduction to ROS2","1",1000000,{"path":16136,"stem":16137,"title":16138,"date":16112,"chapter":2092,"chapterSort":16139,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch10-Stage_Ros2仿真平台","Stage_Ros2 Simulation Platform",10000000,{"path":16141,"stem":16142,"title":16143,"date":16112,"chapter":16144,"chapterSort":16145,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch11-1-gazeboclassic","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-1-GazeboClassic","Gezebo Classic","11.1",11010000,{"path":16147,"stem":16148,"title":16149,"date":16112,"chapter":16150,"chapterSort":16151,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch11-2-ignitiongazebo","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-2-IgnitionGazebo","Ignition Gazebo（Gazebo Fortress）","11.2",11020000,{"path":16153,"stem":16154,"title":16155,"date":16112,"chapter":16156,"chapterSort":16157,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch11-3-gazebosim","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-3-GazeboSim","Gz Sim（Gazebo Harmonic）","11.3",11030000,{"path":16159,"stem":16160,"title":16161,"date":16112,"chapter":16162,"chapterSort":16163,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-4-Igngz2gzsim","Migrate Ign Gazebo to Gz Sim","11.4",11040000,{"path":16165,"stem":16166,"title":16167,"date":16112,"chapter":16168,"chapterSort":16169,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch11-gezebo-fang-zhen-ping-tai","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch11-Gezebo仿真平台","Gazebo simulation platform","11",11000000,{"path":16109,"stem":16126,"title":5,"date":16112,"chapter":16110,"chapterSort":16111,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},{"path":16172,"stem":16173,"title":16174,"date":16112,"chapter":16175,"chapterSort":16176,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch12-2-Jazzy版本","Jazzy Navigation Simulation","12.2",12020000,{"path":16178,"stem":16179,"title":16180,"date":16112,"chapter":16181,"chapterSort":16182,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch12-3-humble2jazzy","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch12-3-Humble2Jazzy","Differences in Navigation between Humble and Jazzy","12.3",12030000,{"path":16184,"stem":16185,"title":16186,"date":16112,"chapter":16187,"chapterSort":16188,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch12-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch12-机器人导航Navigation2(仿真篇)","Robot Navigation with Navigation2 (Simulation)","12",12000000,{"path":16190,"stem":16191,"title":16192,"date":16112,"chapter":16193,"chapterSort":16194,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-1-boost-aiso","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-1-Boost.Aiso","Boost.Asio库","13.1.1",13010100,{"path":16196,"stem":16197,"title":16198,"date":16112,"chapter":16199,"chapterSort":16200,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-2-ros2-serial-driver","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-2-ros2_serial_driver","ROS2 Serial Driver Library","13.1.2",13010200,{"path":16202,"stem":16203,"title":16204,"date":16112,"chapter":16205,"chapterSort":16206,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-chuan-kou-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-1-串口通信","UART serial communication","13.1",13010000,{"path":16208,"stem":16209,"title":16210,"date":16112,"chapter":16211,"chapterSort":16212,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-1-socketcan","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-1-socketcan","SocketCAN","13.2.1",13020100,{"path":16214,"stem":16215,"title":16216,"date":16112,"chapter":16217,"chapterSort":16218,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-2-ros2-socketcan","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-2-ros2_socketcan","ROS2_SocketCAN","13.2.2",13020200,{"path":16220,"stem":16221,"title":16222,"date":16112,"chapter":16223,"chapterSort":16224,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-can-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-2-CAN通信","CAN communication","13.2",13020000,{"path":16226,"stem":16227,"title":16192,"date":16112,"chapter":16228,"chapterSort":16229,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-3-1-boost-aiso","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-3-1-Boost.Aiso","13.3.1",13030100,{"path":16231,"stem":16232,"title":16233,"date":16112,"chapter":16234,"chapterSort":16235,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-3-tcp-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-3-TCP通信","TCP communication","13.3",13030000,{"path":16237,"stem":16238,"title":16192,"date":16112,"chapter":16239,"chapterSort":16240,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-4-1-boost-aiso","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-4-1-Boost.Aiso","13.4.1",13040100,{"path":16242,"stem":16243,"title":16244,"date":16112,"chapter":16245,"chapterSort":16246,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-4-udp-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-4-UDP通信","UDP communication","13.4",13040000,{"path":16248,"stem":16249,"title":16250,"date":16112,"chapter":16251,"chapterSort":16252,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch13-linux-ying-jian-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch13-Linux硬件通信","Linux hardware communication","13",13000000,{"path":16254,"stem":16255,"title":16256,"date":16112,"chapter":16257,"chapterSort":16258,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-1-ji-qi-ren-zu-cheng","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-1-机器人组成","Robot Composition","14.1",14010000,{"path":16260,"stem":16261,"title":16262,"date":16112,"chapter":16263,"chapterSort":16264,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-1-yuan-cheng-kai-fa-ssh","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-1-远程开发SSH","Remote Development SSH","14.2.1",14020100,{"path":16266,"stem":16267,"title":16268,"date":16112,"chapter":16269,"chapterSort":16270,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-2-yuan-cheng-fang-wen-zhuo-mian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-2-远程访问桌面","Remote Desktop Access","14.2.2",14020200,{"path":16272,"stem":16273,"title":16274,"date":16112,"chapter":16275,"chapterSort":16276,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-gong-kong-ji-zhi-yuan-cheng-kai-fa-huan-jing","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-2-工控机之远程开发环境","Remote Development Environment for Industrial PC","14.2",14020000,{"path":16278,"stem":16279,"title":16280,"date":16112,"chapter":16281,"chapterSort":16282,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-3-gong-kong-ji-zhi-wai-jie-usb-she-bei","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-3-工控机之外接USB设备","External USB Devices for the Industrial PC","14.3",14030000,{"path":16284,"stem":16285,"title":16286,"date":16112,"chapter":16287,"chapterSort":16288,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-4-fen-bu-shi-da-jian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-4-分布式搭建","Distributed setup","14.4",14040000,{"path":16290,"stem":16291,"title":16292,"date":16112,"chapter":16293,"chapterSort":16294,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-5-you-hua-ri-zhi","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-5-优化日志","Optimize logs","14.5",14050000,{"path":16296,"stem":16297,"title":16298,"date":16112,"chapter":16299,"chapterSort":16300,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-1-li-cheng-ji-odom","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-1-里程计Odom","odometry","14.6.1",14060100,{"path":16302,"stem":16303,"title":16304,"date":16112,"chapter":16305,"chapterSort":16306,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-2-guan-xing-ji-imu","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-2-惯性计IMU","Inertial Measurement Unit (IMU)","14.6.2",14060200,{"path":16308,"stem":16309,"title":16310,"date":16112,"chapter":16311,"chapterSort":16312,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-3-ji-guang-lei-da-lidar","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-3-激光雷达LiDAR","LiDAR","14.6.3",14060300,{"path":16314,"stem":16315,"title":16316,"date":16112,"chapter":16317,"chapterSort":16318,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-4-xiang-ji-camera","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-4-相机Camera","Camera","14.6.4",14060400,{"path":16320,"stem":16321,"title":16322,"date":16112,"chapter":16323,"chapterSort":16324,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-5-quan-qiu-ding-wei-gnss","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-5-全球定位GNSS","Global Navigation Satellite System (GNSS)","14.6.5",14060500,{"path":16326,"stem":16327,"title":16328,"date":16112,"chapter":16329,"chapterSort":16330,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-6-shou-bing-joy","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-6-手柄joy","The query \"手柄JOY\" is a bit ambiguous. To help you better, could you please provide more details? For example:","14.6.6",14060600,{"path":16332,"stem":16333,"title":16334,"date":16112,"chapter":16335,"chapterSort":16336,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-7-jian-pan-kong-zhi-jie-dian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-7-键盘控制节点","Keyboard control node","14.6.7",14060700,{"path":16338,"stem":16339,"title":16340,"date":16112,"chapter":16341,"chapterSort":16342,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-ying-jian-ping-tai","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-6-硬件平台","Hardware platform","14.6",14060000,{"path":16344,"stem":16345,"title":16346,"date":16112,"chapter":16347,"chapterSort":16348,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-7-zuo-biao-xi-yu-hua-ti-guan-xi","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-7-坐标系与话题关系","Coordinate System and Topic Relationship","14.7",14070000,{"path":16350,"stem":16351,"title":16352,"date":16112,"chapter":16353,"chapterSort":16354,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-1-lun-shi-li-cheng-ji-biao-ding","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-1-轮式里程计标定","Wheel odometry calibration","14.8.1.1",14080101,{"path":16356,"stem":16357,"title":16358,"date":16112,"chapter":16359,"chapterSort":16360,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-2-lun-shi-li-cheng-ji-yu-imu-rong-he","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-2-轮式里程计与IMU融合","Fusion of Wheel Odometry and IMU","14.8.1.2",14080102,{"path":16362,"stem":16363,"title":16364,"date":16112,"chapter":16365,"chapterSort":16366,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-lun-shi-li-cheng-ji-biao-ding-yu-rong-he","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-1-轮式里程计标定与融合","Wheel odometry calibration and fusion","14.8.1",14080100,{"path":16368,"stem":16369,"title":16370,"date":16112,"chapter":16371,"chapterSort":16372,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-2-ji-guang-lei-da-gong-ju","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-2-激光雷达工具","Lidar Tool","14.8.2",14080200,{"path":16374,"stem":16375,"title":16376,"date":16112,"chapter":16377,"chapterSort":16378,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-3-xiang-ji-shi-yong-jin-jie","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-3-相机使用进阶","Advanced Camera Usage","14.8.3",14080300,{"path":16380,"stem":16381,"title":16382,"date":16112,"chapter":16383,"chapterSort":16384,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-ying-jian-ping-tai-jin-jie","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-8-硬件平台进阶","Advanced Hardware Platform","14.8",14080000,{"path":16386,"stem":16387,"title":16388,"date":16112,"chapter":16389,"chapterSort":16390,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch14-ji-qi-ren-ying-jian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch14-机器人硬件","Robot hardware","14",14000000,{"path":16392,"stem":16393,"title":16394,"date":16112,"chapter":16395,"chapterSort":16396,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch15-ros2-control","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch15-ROS2_Control","ROS2_Control","15",15000000,{"path":16398,"stem":16399,"title":16400,"date":16112,"chapter":16401,"chapterSort":16402,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch16-moveit2-gong-ye-ji-qi-ren-ji-xie-bi","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch16-Moveit2工业机器人机械臂","MoveIt2 industrial robot arm","16",16000000,{"path":16404,"stem":16405,"title":16406,"date":16112,"chapter":16407,"chapterSort":16408,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch17-ji-qi-ren-dao-hang-navigation2-shi-ti-pian","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch17-机器人导航Navigation2(实体篇)","Robot Navigation with Navigation2 (Physical Robot)","17",17000000,{"path":16410,"stem":16411,"title":16412,"date":16112,"chapter":16413,"chapterSort":16414,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch18-microros","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch18-MicroROS","MicroROS","18",18000000,{"path":16416,"stem":16417,"title":16418,"date":16112,"chapter":16419,"chapterSort":16420,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch19-webots-fang-zhen-ping-tai","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch19-Webots仿真平台","Webots simulation platform","19",19000000,{"path":16422,"stem":16423,"title":16424,"date":16112,"chapter":16425,"chapterSort":16426,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch2-ru-men-cao-zuo","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch2-入门操作","Getting Started","2",2000000,{"path":16428,"stem":16429,"title":16430,"date":16112,"chapter":16431,"chapterSort":16432,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch20-opencv","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch20-OpenCV","OpenCV","20",20000000,{"path":16434,"stem":16435,"title":16436,"date":16112,"chapter":16437,"chapterSort":16438,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch3-gong-zuo-kong-jian-yu-gong-neng-bao","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch3-工作空间与功能包","Workspace and Function Packages","3",3000000,{"path":16440,"stem":16441,"title":16442,"date":16112,"chapter":16443,"chapterSort":16444,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch4-si-da-tong-xin","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch4-四大通信","Four Major Communications","4",4000000,{"path":16446,"stem":16447,"title":16448,"date":16112,"chapter":16449,"chapterSort":16450,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch5-ros2-qi-ta-tong-xin-ji-zhi","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch5-ROS2其他通信机制","ROS2 Other Communication Mechanisms","5",5000000,{"path":16452,"stem":16453,"title":16454,"date":16112,"chapter":16455,"chapterSort":16456,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch6-launch","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch6-Launch","Launch","6",6000000,{"path":16458,"stem":16459,"title":16460,"date":16112,"chapter":16461,"chapterSort":16462,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch7-hui-su-rosbag2","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch7-回溯rosbag2","Replaying rosbag2","7",7000000,{"path":16464,"stem":16465,"title":16466,"date":16112,"chapter":16467,"chapterSort":16468,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch8-zuo-biao-bian-huan-tf","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch8-坐标变换TF","Coordinate Transformation TF","8",8000000,{"path":16470,"stem":16471,"title":16472,"date":16112,"chapter":16473,"chapterSort":16474,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":16119},"/en-us/wiki/2023-12-30-ros2-tutorial/ch9-ke-shi-hua-ping-tai-rviz2-yu-urdf-jian-mo-yu-yan","_i18n/en-us/wiki/2023-12-30-ros2-tutorial/ch9-可视化平台RVIZ2与URDF建模语言","Visualization Platform RVIZ2 and URDF Modeling Language","9",9000000,{"path":16115,"stem":16476,"title":16477,"date":16112,"chapter":16120,"chapterSort":16478,"docKey":16114,"docRoot":16115,"docTitle":16116,"isWikiDoc":141,"isWikiIndex":141},"_i18n/en-us/wiki/2023-12-30-ros2-tutorial/index","ROS2 Robot Operating System Tutorial",0,{"variants":16480},[16481,16482,16485,16488,16491],{"path":16109,"localeSlug":16122,"i18nKey":16118},{"path":16483,"localeSlug":16484,"i18nKey":16118},"/zh-hant/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","zh-hant",{"path":16486,"localeSlug":16487,"i18nKey":16118},"/zh-hk/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","zh-hk",{"path":16489,"localeSlug":16490,"i18nKey":16118},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","zh-tw",{"path":16492,"localeSlug":16493,"i18nKey":16118},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","zh-cn",[16109,16125,16483,16125,16486,16125,16489,16125,16492,16125],1780671800745]