[{"data":1,"prerenderedAt":14933},["ShallowReactive",2],{"wiki-page-/wiki/2023-12-30-ros2-tutorial/ch12-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian":3,"wiki-doc-items-/wiki/2023-12-30-ros2-tutorial/ch12-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian":14790},{"id":4,"title":5,"body":6,"chapter":14776,"chapterSort":14777,"date":14778,"description":32,"docKey":14779,"docRoot":14780,"docTitle":14781,"extension":14782,"isWikiDoc":139,"isWikiIndex":14783,"layout":14784,"meta":14785,"navigation":139,"path":14786,"seo":14787,"stem":14788,"wikiDepth":80,"__hash__":14789},"content/wiki/2023-12-30-ros2-tutorial/ch12-机器人导航Navigation2(仿真篇).md","机器人导航Navigation2(仿真篇)",{"type":7,"value":8,"toc":14768},"minimark",[9,13,17,24,27,34,37,42,45,58,61,64,67,207,214,217,220,225,257,260,280,283,286,294,298,302,305,308,311,326,329,333,336,351,354,357,359,366,369,395,398,424,427,436,498,502,505,508,526,529,534,580,583,664,669,705,710,823,833,1185,1188,1193,1196,1222,1227,1234,1627,1637,2262,2265,2270,2277,2304,2309,2312,2331,2417,2422,2425,2430,2433,2436,2439,2442,2445,2448,2453,2456,2461,2474,2477,2481,2484,2488,2519,2521,2553,2556,2559,2663,2668,2671,2682,2707,2710,2715,2748,2753,2788,2793,2873,2878,2883,2888,2911,2916,2939,2944,2967,2972,2977,2980,2984,2986,3007,3011,3016,3359,3362,3943,3945,3949,3953,3973,3977,3979,3995,3999,4002,4022,4025,4049,4052,4057,4062,4067,4070,4077,4099,4103,4107,4116,4120,4144,4148,4174,4178,4190,4228,4231,4235,4238,4243,4246,4270,4284,4289,4294,4297,4300,4313,4317,4324,4514,4518,4523,4808,4811,4817,4903,4908,4945,4949,4952,4959,4963,4986,4990,5010,5013,5017,5020,5041,5044,5061,5066,5071,5077,5097,5102,5105,5130,5136,5170,5180,5185,5195,5458,5469,5485,5490,5496,5503,5508,5513,5518,5522,5525,5531,5534,5537,5543,5548,5602,5607,5651,5656,5691,5696,5701,5762,5767,5818,5823,5861,5866,5895,5900,5955,5958,5963,5965,5989,5994,6000,6318,6339,6344,6727,6733,6738,6742,6762,6767,6769,6785,6790,6792,6815,6817,6839,6842,6859,6865,6872,6875,6881,6886,6904,6909,6914,6919,6922,6927,6930,6935,6938,6941,6944,6951,6956,6959,6966,6973,6978,6983,6986,6992,6995,7010,7014,7079,7082,7095,7101,7107,7110,7116,7119,7125,7129,7172,7177,7203,7207,7268,7271,7285,7290,7315,7320,7391,7396,7439,7444,7501,7506,7858,7861,7878,7883,7917,7922,8001,8006,8075,8080,8113,8118,8193,8198,8359,8362,8372,8376,8440,8444,8468,8473,8543,8547,8660,8663,8681,8686,8711,8716,8739,8744,8798,8801,8811,8815,8847,8851,8875,8879,8905,8909,9001,9004,9014,9018,9041,9045,9068,9072,9168,9172,9176,9178,9202,9206,9209,9215,10256,10259,10264,10267,10274,10772,10778,11262,11268,11605,11610,11615,12200,12205,12210,13307,13310,13321,13327,13330,13345,13350,13355,13582,13587,13592,13680,13685,13690,13871,13876,13881,13978,13983,13990,14189,14194,14198,14220,14225,14227,14243,14248,14250,14270,14273,14295,14310,14326,14355,14363,14371,14374,14377,14382,14387,14391,14402,14407,14413,14639,14644,14646,14660,14665,14667,14687,14690,14712,14722,14734,14739,14744,14747,14750,14761,14764],[10,11,12],"h3",{"id":12},"导航概述",[14,15,16],"h4",{"id":16},"导航简述",[18,19,20],"p",{},[21,22,23],"strong",{},"概念",[18,25,26],{},"机器人导航是指在没有人为干预的情况下，机器人可以自主地从一个位置移动到另一个位置。在ROS2中，导航实现最为常用的框架是Nav2。",[18,28,29],{},[30,31],"img",{"alt":32,"src":33},"","https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1745.webp",[18,35,36],{},"Nav2也即Navigation2，它继承自ROS的导航堆栈。它采用了与自动驾驶车辆相同的前沿技术，并经过优化和改造，专门适用于移动机器人和地面机器人的导航需求。这个项目赋予移动机器人穿越复杂环境的能力，使其能够完成用户定义的各种应用任务，几乎适用于任何类型的机器人动力学。Nav2不仅支持机器人从A点到B点的移动，还能设置中间姿态，并执行多种任务，如物体跟踪、全面覆盖导航等。作为全球100多家公司信赖的生产级高质量导航框架，Nav2以其卓越的可靠性和稳定性赢得了广泛赞誉。",[18,38,39],{},[21,40,41],{},"作用",[18,43,44],{},"Nav2在机器人导航领域作用显著，主要表现在以下几个方面。",[46,47,48,52,55],"ul",{},[49,50,51],"li",{},"Nav2具备多样的导航功能，支持激光雷达、摄像头等多种传感器输入，实时获取环境信息，实现智能路径规划和精确运动控制。它支持多种导航模式，满足不同应用需求，并具备强大的扩展性，可与ROS 2组件无缝集成。",[49,53,54],{},"Nav2性能卓越，采用高效算法和数据处理技术，确保机器人在导航过程中响应迅速且稳定。",[49,56,57],{},"安全方面，Nav2采用多种避障算法和参数调节功能，设定安全区域，提供诊断监控，确保机器人安全导航。",[18,59,60],{},"总之，Nav2为机器人的导航和应用提供了强大的支持。无论是工业领域的自动化生产，还是服务领域的智能机器人，Nav2都能够发挥重要作用，提升机器人的自主性和智能化水平。",[14,62,63],{"id":63},"导航安装",[18,65,66],{},"借助于Ubuntu的包资源管理器，可以使用二进制的方式安装Nav2，安装指令如下：",[68,69,73],"pre",{"className":70,"code":71,"language":72,"meta":32,"style":32},"language-bash shiki shiki-themes github-light github-dark","sudo apt install ros-\u003Cros2-distro>-navigation2\nsudo apt install ros-\u003Cros2-distro>-nav2-bringup\n\n# Humble\nsudo apt install ros-humble-navigation2\nsudo apt install ros-humble-nav2-bringup\n\n# Jazzy\nsudo apt install ros-jazzy-navigation2\nsudo apt install ros-jazzy-nav2-bringup\n","bash",[74,75,76,112,134,141,148,160,172,177,183,195],"code",{"__ignoreMap":32},[77,78,81,85,89,92,95,99,102,106,109],"span",{"class":79,"line":80},"line",1,[77,82,84],{"class":83},"sScJk","sudo",[77,86,88],{"class":87},"sZZnC"," apt",[77,90,91],{"class":87}," install",[77,93,94],{"class":87}," ros-",[77,96,98],{"class":97},"szBVR","\u003C",[77,100,101],{"class":87},"ros2-distr",[77,103,105],{"class":104},"sVt8B","o",[77,107,108],{"class":97},">",[77,110,111],{"class":87},"-navigation2\n",[77,113,115,117,119,121,123,125,127,129,131],{"class":79,"line":114},2,[77,116,84],{"class":83},[77,118,88],{"class":87},[77,120,91],{"class":87},[77,122,94],{"class":87},[77,124,98],{"class":97},[77,126,101],{"class":87},[77,128,105],{"class":104},[77,130,108],{"class":97},[77,132,133],{"class":87},"-nav2-bringup\n",[77,135,137],{"class":79,"line":136},3,[77,138,140],{"emptyLinePlaceholder":139},true,"\n",[77,142,144],{"class":79,"line":143},4,[77,145,147],{"class":146},"sJ8bj","# Humble\n",[77,149,151,153,155,157],{"class":79,"line":150},5,[77,152,84],{"class":83},[77,154,88],{"class":87},[77,156,91],{"class":87},[77,158,159],{"class":87}," ros-humble-navigation2\n",[77,161,163,165,167,169],{"class":79,"line":162},6,[77,164,84],{"class":83},[77,166,88],{"class":87},[77,168,91],{"class":87},[77,170,171],{"class":87}," ros-humble-nav2-bringup\n",[77,173,175],{"class":79,"line":174},7,[77,176,140],{"emptyLinePlaceholder":139},[77,178,180],{"class":79,"line":179},8,[77,181,182],{"class":146},"# Jazzy\n",[77,184,186,188,190,192],{"class":79,"line":185},9,[77,187,84],{"class":83},[77,189,88],{"class":87},[77,191,91],{"class":87},[77,193,194],{"class":87}," ros-jazzy-navigation2\n",[77,196,198,200,202,204],{"class":79,"line":197},10,[77,199,84],{"class":83},[77,201,88],{"class":87},[77,203,91],{"class":87},[77,205,206],{"class":87}," ros-jazzy-nav2-bringup\n",[18,208,209,210,213],{},"指令中的",[74,211,212],{},"\u003Cros2-distro>","请替换成当前所使用的ROS2版本。",[14,215,216],{"id":216},"导航条件",[18,218,219],{},"深入学习Nav2，需了解ROS2机器人基础知识，并配备仿真或实体机器人作为实践环境。",[18,221,222],{},[21,223,224],{},"ROS2基础",[46,226,227,233,239,245,251],{},[49,228,229,232],{},[21,230,231],{},"ROS2通信"," ：了解ROS2中的节点（Nodes）、话题（Topics）、服务（Services）、动作（Actions）等基本概念，以及如何通过这些机制实现节点间的通信。",[49,234,235,238],{},[21,236,237],{},"生命周期管理"," ：熟悉ROS2中的生命周期节点（Lifecycle Nodes），理解节点的启动、配置、激活、去激活、清理等状态转换过程，这对于管理复杂的ROS2系统至关重要。",[49,240,241,244],{},[21,242,243],{},"rviz2："," 熟练使用rviz2进行可视化调试，包括如何设置不同的显示类型（如点云、地图、路径等），以及如何通过rviz2与ROS2节点进行交互（如设置导航目标点、观察机器人状态等）。",[49,246,247,250],{},[21,248,249],{},"URDF："," 了解URDF（Unified Robot Description Format）文件，这是ROS中用于描述机器人模型的一种XML格式。熟悉如何编写和修改URDF文件，以便在仿真或实际环境中准确地表示机器人结构。",[49,252,253,256],{},[21,254,255],{},"TF坐标变换："," 掌握TF（Transform）库的使用，理解坐标变换在机器人导航中的重要性。学会如何设置和查询不同坐标系之间的变换关系，以确保机器人能够准确地定位自身和周围环境。",[18,258,259],{},"实践环境",[46,261,262,268,274],{},[49,263,264,267],{},[21,265,266],{},"仿真环境："," 搭建一个ROS2兼容的仿真环境，并配置好相应的机器人模型、传感器（如激光雷达、相机等）和仿真世界。确保仿真环境中的机器人能够接收速度指令、反馈里程计消息、发布传感器数据和TF坐标变换等。",[49,269,270,273],{},[21,271,272],{},"实体机器人："," 如果条件允许，准备一台实体机器人。这台机器人应该具备与仿真环境中相似的功能，即能够接收速度指令、反馈里程计消息、发布激光雷达等传感器数据以及发布TF坐标变换。同时，确保实体机器人已经安装了ROS2系统，并且已经配置好相应的驱动程序和算法库。",[49,275,276,279],{},[21,277,278],{},"Nav2软件包："," 安装并配置好Nav2软件包及其依赖项。Nav2是ROS2中用于机器人导航的综合性软件包，它包含了路径规划、避障、局部和全局地图维护等多个功能模块。确保Nav2软件包与您的ROS2版本兼容，并且已经根据需要进行了适当的配置。",[18,281,282],{},"通过掌握上述基础知识并准备好实践环境，您将能够更好地学习和应用Nav2进行机器人导航任务的开发与调试。",[14,284,285],{"id":285},"导航参数参考",[18,287,288],{},[289,290,291],"a",{"href":291,"rel":292},"https://docs.nav2.org/configuration/index.html",[293],"nofollow",[10,295,297],{"id":296},"slam-定位与建图","SLAM 定位与建图",[18,299,300],{},[21,301,23],{},[18,303,304],{},"SLAM（Simultaneous Localization and Mapping，即时定位与建图）是机器人学和自动导航领域的一种关键技术，允许机器人在未知环境中绘制环境地图。",[18,306,307],{},"在ROS 2下进行SLAM，通常涉及使用专门为ROS 2开发的SLAM相关软件包。这些软件包利用ROS 2的通讯框架（如话题、服务和action）来处理接收到的传感器数据，包括激光雷达、相机、惯性测量单元等。",[18,309,310],{},"以下列举了一些常见的在ROS2中使用的SLAM系统：",[312,313,314,320],"ol",{},[49,315,316,319],{},[21,317,318],{},"SLAM Toolbox"," ：SLAM Toolbox 是一种在 ROS 2 中普遍使用的 SLAM 解决方案，由 Steve Macenski 维护。它是为了替代原有的ROS中著名的gmapping包和Cartographer SLAM包而开发的，提供了2D激光SLAM领域中的多种功能。",[49,321,322,325],{},[21,323,324],{},"Cartographer for ROS 2"," ：Cartographer是由Google开发的一个2D和3D环境SLAM库。尽管它最初是为ROS开发的，但已经有为ROS 2创建的适配版本，可以在ROS 2生态系统内使用。",[18,327,328],{},"要在ROS 2中开始一个SLAM项目，还需要具体的传感器（例如激光雷达或摄像头），计算机要有足够的算力来运行SLAM算法，以及熟悉ROS 2节点、话题、服务、action、参数等知识，以实现有效的数据处理和通信。随着项目的发展，可能还需要考虑动态重配置、3D建图和路径规划等高级功能。",[18,330,331],{},[21,332,41],{},[18,334,335],{},"必须先说明的是：SLAM与Nav2并没有直接的依赖关系，它们是两种相对独立的技术框架。然而，在实际应用中，这两者却展现出紧密的联系与互补性。",[337,338,339,345],"blockquote",{},[18,340,341,344],{},[21,342,343],{},"独立性："," SLAM能够独立完成环境地图的构建，无需Nav2的介入。它依靠传感器数据来感知环境，并通过算法估计机器人的位置与姿态，从而构建出环境的地图。与此同时，Nav2也具备自主导航的能力。即使没有SLAM地图作为输入，它也能依赖其他来源的环境信息进行导航。",[18,346,347,350],{},[21,348,349],{},"互补性："," 尽管两者在技术上各自独立，但它们的结合却带来了显著的优势。Nav2能够利用SLAM创建的精确地图进行高效的路径规划，确保机器人能够顺利导航至目标位置。而SLAM则能借助Nav2的导航控制功能，在机器人移动过程中实时收集环境信息，从而进一步提高地图构建的效率和准确性。",[18,352,353],{},"因此，尽管SLAM与Nav2在技术上各自独立，但在构建完整的机器人导航系统中，它们的互补性使得机器人能够在复杂环境中实现更加自主、精准的建图或导航。",[14,355,356],{"id":356},"slam_toolbox概述",[18,358,23],{},[18,360,361,362,365],{},"SLAM Toolbox是一个基于开源软件的用来构建 ",[21,363,364],{},"2D地图"," 的工具集，旨在为研究人员和开发者提供一个快速构建和实现SLAM算法的平台。它集成了多种常用的SLAM算法，并提供了丰富的数据处理和滤波函数，以及地图构建和环境建模的工具。",[18,367,368],{},"功能",[46,370,371,377,383,389],{},[49,372,373,376],{},[21,374,375],{},"算法集成"," 包含基于卡尔曼滤波器和粒子滤波器的SLAM算法，以及基于图优化的SLAM算法等。",[49,378,379,382],{},[21,380,381],{},"数据处理"," 提供数据融合、数据预处理和异常检测等功能，支持激光雷达、摄像头、IMU等多种传感器数据的处理。",[49,384,385,388],{},[21,386,387],{},"地图构建"," 利用传感器数据和机器人运动信息构建准确的地图，并进行更新和优化。",[49,390,391,394],{},[21,392,393],{},"模块化设计"," 支持用户插入自己的算法或替换现有模块，实现高度定制化的SLAM解决方案。",[18,396,397],{},"优点",[46,399,400,406,412,418],{},[49,401,402,405],{},[21,403,404],{},"开源性和灵活性"," 作为开源软件，SLAM Toolbox提供了源代码和文档，用户可以自由修改和扩展算法。",[49,407,408,411],{},[21,409,410],{},"多种传感器支持"," 支持激光雷达、摄像头、IMU等多种传感器数据，适应不同应用场景的需求。",[49,413,414,417],{},[21,415,416],{},"高效性"," 利用现代C++的特性优化性能，确保在资源受限的硬件上也能高效运行。",[49,419,420,423],{},[21,421,422],{},"广泛的应用前景"," 适用于学术研究、无人机导航、自动驾驶汽车、室内机器人和工业自动化等多个领域。",[14,425,426],{"id":426},"slam_toolbox安装",[18,428,429,430,435],{},"借助于Advanced Packaging Tools(",[289,431,434],{"href":432,"rel":433},"https://c6.y.qq.com/base/fcgi-bin/u?__=bqEbdGxIB7mM",[293],"APT",")包资源管理器，可以使用二进制的方式安装slam_toolbox，安装指令如下：",[68,437,439],{"className":70,"code":438,"language":72,"meta":32,"style":32},"sudo apt install ros-\u003Cros2-distro>-slam-toolbox\n\n#humble\nsudo apt install ros-humble-slam-toolbox\n#jazzy\nsudo apt install ros-jazzy-slam-toolbox\n",[74,440,441,462,466,471,482,487],{"__ignoreMap":32},[77,442,443,445,447,449,451,453,455,457,459],{"class":79,"line":80},[77,444,84],{"class":83},[77,446,88],{"class":87},[77,448,91],{"class":87},[77,450,94],{"class":87},[77,452,98],{"class":97},[77,454,101],{"class":87},[77,456,105],{"class":104},[77,458,108],{"class":97},[77,460,461],{"class":87},"-slam-toolbox\n",[77,463,464],{"class":79,"line":114},[77,465,140],{"emptyLinePlaceholder":139},[77,467,468],{"class":79,"line":136},[77,469,470],{"class":146},"#humble\n",[77,472,473,475,477,479],{"class":79,"line":143},[77,474,84],{"class":83},[77,476,88],{"class":87},[77,478,91],{"class":87},[77,480,481],{"class":87}," ros-humble-slam-toolbox\n",[77,483,484],{"class":79,"line":150},[77,485,486],{"class":146},"#jazzy\n",[77,488,489,491,493,495],{"class":79,"line":162},[77,490,84],{"class":83},[77,492,88],{"class":87},[77,494,91],{"class":87},[77,496,497],{"class":87}," ros-jazzy-slam-toolbox\n",[18,499,209,500,213],{},[74,501,212],{},[14,503,504],{"id":504},"slam_toolbox节点说明",[18,506,507],{},"在slam_toolbox中常用的节点有两个：sync_slam_toolbox_node和async_slam_toolbox_node。",[337,509,510,515,518,523],{},[18,511,512],{},[21,513,514],{},"sync_slam_toolbox_node：",[18,516,517],{},"这是一个同步节点，会等待所有传感器数据到达后再处理，确保数据完整性和一致性，提高定位和建图准确性。但同步处理可能导致延迟，更适合对数据一致性和准确性要求高、实时性要求不高的场景。",[18,519,520],{},[21,521,522],{},"async_slam_toolbox_node：",[18,524,525],{},"与同步节点不同，这是一个异步节点，可以立即处理已接收的数据，减小延迟，提高响应速度。但异步处理可能导致数据不完全同步，定位和建图结果可能不如同步方式准确。因此，它更适合对实时性要求高、对数据一致性和准确性要求相对较低的场景。",[18,527,528],{},"在选择使用sync_slam_toolbox_node还是async_slam_toolbox_node时，需根据应用需求和环境权衡。若实时性关键且能接受一定定位或建图误差，选择async_slam_toolbox_node。若对数据一致性和准确性要求较高，且实时性非首要考虑，则选择sync_slam_toolbox_node。另外二者的主要区别在于数据处理的方式，而两个节点发布的话题、订阅的话题、发布的服务以及使用的参数等都是一样的。",[312,530,531],{},[49,532,533],{},"订阅的话题",[535,536,537,554],"table",{},[538,539,540],"thead",{},[541,542,543,548,551],"tr",{},[544,545,547],"th",{"align":546},"left","话题",[544,549,550],{"align":546},"类型",[544,552,553],{"align":546},"描述",[555,556,557,569],"tbody",{},[541,558,559,563,566],{},[560,561,562],"td",{"align":546},"/scan",[560,564,565],{"align":546},"sensor_msgs/msg/LaserScan",[560,567,568],{"align":546},"来自激光雷达输入的扫描数据",[541,570,571,574,577],{},[560,572,573],{"align":546},"/tf",[560,575,576],{"align":546},"tf2_msgs/msg/TFMessage",[560,578,579],{"align":546},"配置的odom_frame到base_frame的转换",[18,581,582],{},"虽然不订阅/odom,但是需要发布/odom,以改变坐标。",[535,584,585,598],{},[538,586,587],{},[541,588,589,592,595],{},[544,590,591],{"align":546},"特性",[544,593,594],{"align":546},"slam_toolbox",[544,596,597],{"align":546},"hector_slam",[555,599,600,611,622,633,644,653],{},[541,601,602,605,608],{},[560,603,604],{"align":546},"地图精度",[560,606,607],{"align":546},"高",[560,609,610],{"align":546},"中",[541,612,613,616,619],{},[560,614,615],{"align":546},"实时性",[560,617,618],{"align":546},"较好，但依赖优化（回环检测）",[560,620,621],{"align":546},"极高",[541,623,624,627,630],{},[560,625,626],{"align":546},"依赖数据",[560,628,629],{"align":546},"激光雷达、TF 树、里程计",[560,631,632],{"align":546},"激光雷达（可选 IMU）",[541,634,635,638,641],{},[560,636,637],{"align":546},"回环检测",[560,639,640],{"align":546},"支持",[560,642,643],{"align":546},"不支持",[541,645,646,649,651],{},[560,647,648],{"align":546},"长期运行",[560,650,640],{"align":546},[560,652,643],{"align":546},[541,654,655,658,661],{},[560,656,657],{"align":546},"适用场景",[560,659,660],{"align":546},"动态导航、复杂环境",[560,662,663],{"align":546},"简单环境，或无里程计时",[312,665,666],{"start":114},[49,667,668],{},"发布的话题",[535,670,671,681],{},[538,672,673],{},[541,674,675,677,679],{},[544,676,547],{"align":546},[544,678,550],{"align":546},[544,680,553],{"align":546},[555,682,683,694],{},[541,684,685,688,691],{},[560,686,687],{"align":546},"/map",[560,689,690],{"align":546},"nav_msgs/msg/OccupancyGrid",[560,692,693],{"align":546},"pose-graph（姿态图）在特定的更新频率（map_update_interval）下的占用栅格表示。",[541,695,696,699,702],{},[560,697,698],{"align":546},"/pose",[560,700,701],{"align":546},"geometry_msgs/msg/PoseWithCovarianceStamped",[560,703,704],{"align":546},"配置的map_frame中base_frame的位姿以及根据扫描匹配计算的协方差",[312,706,707],{"start":136},[49,708,709],{},"发布的服务",[535,711,712,722],{},[538,713,714],{},[541,715,716,718,720],{},[544,717,547],{"align":546},[544,719,550],{"align":546},[544,721,553],{"align":546},[555,723,724,735,746,757,768,779,790,801,812],{},[541,725,726,729,732],{},[560,727,728],{"align":546},"/slam_toolbox/clear_changes",[560,730,731],{"align":546},"slam_toolbox/srv/Clear",[560,733,734],{"align":546},"清除所有待处理的手动位姿图操作的更改",[541,736,737,740,743],{},[560,738,739],{"align":546},"/slam_toolbox/deserialize_map",[560,741,742],{"align":546},"slam_toolbox/srv/DeserializePoseGraph",[560,744,745],{"align":546},"从磁盘加载保存的序列化位姿图文件",[541,747,748,751,754],{},[560,749,750],{"align":546},"/slam_toolbox/dynamic_map",[560,752,753],{"align":546},"nav_msgs/OccupancyGrid",[560,755,756],{"align":546},"请求位姿图的当前状态作为占用网格",[541,758,759,762,765],{},[560,760,761],{"align":546},"/slam_toolbox/manual_loop_closure",[560,763,764],{"align":546},"slam_toolbox/srv/LoopClosure",[560,766,767],{"align":546},"请求对位姿图进行手动更改",[541,769,770,773,776],{},[560,771,772],{"align":546},"/slam_toolbox/pause_new_measurements",[560,774,775],{"align":546},"slam_toolbox/srv/Pause",[560,777,778],{"align":546},"暂停处理新传入的激光扫描",[541,780,781,784,787],{},[560,782,783],{"align":546},"/slam_toolbox/save_map",[560,785,786],{"align":546},"slam_toolbox/srv/SaveMap",[560,788,789],{"align":546},"保存可用于显示 AMCL 定位的地图图像文件。",[541,791,792,795,798],{},[560,793,794],{"align":546},"/slam_toolbox/serialize_map",[560,796,797],{"align":546},"slam_toolbox/srv/SerializePoseGraph",[560,799,800],{"align":546},"保存地图位姿图和数据，可用于继续建图、slam_toolbox 定位、离线操作等",[541,802,803,806,809],{},[560,804,805],{"align":546},"/slam_toolbox/toggle_interactive_mode",[560,807,808],{"align":546},"slam_toolbox/srv/ToggleInteractive",[560,810,811],{"align":546},"在交互模式与非交互模式之间切换，发布节点的交互式标记及其位置，以便在应用程序中进行更新",[541,813,814,817,820],{},[560,815,816],{"align":546},"/slam_toolbox/reset",[560,818,819],{"align":546},"slam_toolbox/srv/Reset",[560,821,822],{"align":546},"将当前地图重置回初始状态",[312,824,825],{"start":143},[49,826,827,828],{},"参数",[312,829,830],{},[49,831,832],{},"求解器参数",[46,834,835,841,847,853,859,865,871,882,888,894,900,906,912,918,924,930,936,942,948,954,960,966,972,978,984,990,996,1002,1008,1014,1025,1031,1037,1043,1049,1055,1061,1067,1073,1079,1085,1091,1097,1103,1109,1115,1121,1127,1133,1138,1144,1149,1155,1161,1167,1173,1179],{},[49,836,837,840],{},[21,838,839],{},"solver_plugin","  用于 karto 扫描解算器的非线性解算器类型。选项：solver_plugins::CeresSolver, - solver_plugins::SpaSolver, solver_plugins::G2oSolver. Default: solver_plugins::CeresSolver.",[49,842,843,846],{},[21,844,845],{},"ceres_linear_solver","  Ceres 使用的线性求解器。选项：SPARSE_NORMAL_CHOLESKY、SPARSE_SCHUR、ITERATIVE_SCHUR、CGNR。默认为 SPARSE_NORMAL_CHOLESKY。",[49,848,849,852],{},[21,850,851],{},"ceres_preconditioner","  与该求解器一起使用的预处理器。选项：JACOBI、IDENTITY（none）、SCHUR_JACOBI。默认为JACOBI。",[49,854,855,858],{},[21,856,857],{},"ceres_trust_strategy","  信任区域策略。行搜索策略没有公开，因为它们对于这种用途表现不佳。选项：LEVENBERG_MARQUARDT、DOGLEG。默认值：LEVENBERG_MARQUARDT。",[49,860,861,864],{},[21,862,863],{},"ceres_dogleg_type","  如果信任策略是 DOGLEG，则使用dogleg策略。选项：TRADITIONAL_DOGLEG、SUBSPACE_DOGLEG。默认值：TRADITIONAL_DOGLEG",[49,866,867,870],{},[21,868,869],{},"ceres_loss_function","  拒绝异常值的损失函数类型。没有一个等于损失平方。选项：None、HuberLoss、CauchyLoss。默认值：None。",[49,872,873,876,877],{},[21,874,875],{},"mode","  “建图”或“定位”模式，用于 Ceres 问题创建中的性能优化",[46,878,879],{},[49,880,881],{},"Toolbox参数",[49,883,884,887],{},[21,885,886],{},"odom_frame","  里程计坐标系",[49,889,890,893],{},[21,891,892],{},"map_frame","  地图坐标系",[49,895,896,899],{},[21,897,898],{},"base_frame","  基坐标系",[49,901,902,905],{},[21,903,904],{},"scan_topic","  扫描主题名， 注意是/scan 不是scan",[49,907,908,911],{},[21,909,910],{},"scan_queue_size","  扫描消息对队列长度。在异步模式下应始终设置为 1",[49,913,914,917],{},[21,915,916],{},"use_map_saver","  实例化地图服务程序并自行订阅map主题",[49,919,920,923],{},[21,921,922],{},"map_file_name","  启动时加载的位姿图文件的名称（如果可用）",[49,925,926,929],{},[21,927,928],{},"map_start_pose","  启动建图/定位时的位姿（如果可用）",[49,931,932,935],{},[21,933,934],{},"map_start_at_dock","  在dock（第一个节点）处启动姿势图加载（如果可用）。如果同时设置了pose和dock，优先使用pose",[49,937,938,941],{},[21,939,940],{},"debug_logging","  更改日志以进行调试",[49,943,944,947],{},[21,945,946],{},"throttle_scans","  在同步模式下限制的扫描次数",[49,949,950,953],{},[21,951,952],{},"transform_publish_period","  里程计odom变换发布周期。 0 不会发布变换。",[49,955,956,959],{},[21,957,958],{},"map_update_interval","  更新 2D 占用地图的时间间隔",[49,961,962,965],{},[21,963,964],{},"enable_interactive_mode","  是否允许启用交互模式。交互模式将保留映射到其 ID 的激光扫描缓存，以便在交互模式下进行可视化。结果，该进程的内存将会增加。在定位和长期建图模式下可以手动禁用此功能，因为它们会随着时间的推移增加内存利用率。对于建图或连续建图模式均有效。",[49,967,968,971],{},[21,969,970],{},"position_covariance_scale","  从扫描匹配发布姿势时缩放位置协方差的量。这可用于调整下游定位滤波器中位姿的影响。协方差表示测量的不确定性，因此扩大协方差将减小位姿对下游滤波器的影响。默认值：1.0",[49,973,974,977],{},[21,975,976],{},"yaw_covariance_scale","  从扫描匹配发布位姿时缩放偏航协方差的量。请参阅position_covariance_scale 的描述。默认值：1.0",[49,979,980,983],{},[21,981,982],{},"resolution","  生成的 2D 占用图的分辨率",[49,985,986,989],{},[21,987,988],{},"max_laser_range","  用于 2D 占用地图光栅化的最大激光范围",[49,991,992,995],{},[21,993,994],{},"minimum_time_interval","  在同步模式下处理的扫描之间的最短持续时间",[49,997,998,1001],{},[21,999,1000],{},"transform_timeout","  查找转换 TF 超时时间限制",[49,1003,1004,1007],{},[21,1005,1006],{},"tf_buffer_duration","  存储 TF 消息以供查询的时间。如果在同步模式下以倍速脱机运行，则设置高一些。",[49,1009,1010,1013],{},[21,1011,1012],{},"stack_size_to_use","  将堆栈大小重置为的字节数，以启用文件的序列化/反序列化。自由默认值为 40000000，但越少越好。",[49,1015,1016,1019,1020],{},[21,1017,1018],{},"minimum_travel_distance","  处理新扫描之前的最小行进距离",[46,1021,1022],{},[49,1023,1024],{},"匹配器参数",[49,1026,1027,1030],{},[21,1028,1029],{},"use_scan_matching","  是否使用扫描匹配来优化里程位姿",[49,1032,1033,1036],{},[21,1034,1035],{},"use_scan_barycenter","  是否使用重心或扫描位姿",[49,1038,1039,1042],{},[21,1040,1041],{},"minimum_travel_heading","  合理更新的最小航向变化",[49,1044,1045,1048],{},[21,1046,1047],{},"scan_buffer_size","  缓冲到链中的扫描次数，也用作定位模式循环缓冲区中的扫描次数",[49,1050,1051,1054],{},[21,1052,1053],{},"scan_buffer_maximum_scan_distance","  从缓冲区中删除之前扫描，距离之前位姿的最大距离",[49,1056,1057,1060],{},[21,1058,1059],{},"link_match_minimum_response_fine","  精细分辨率通过的阈值链接匹配算法响应",[49,1062,1063,1066],{},[21,1064,1065],{},"link_scan_maximum_distance","  有效链接扫描之间的最大距离",[49,1068,1069,1072],{},[21,1070,1071],{},"Loop_search_maximum_distance","  循环闭合时考虑的扫描距离的最大阈值",[49,1074,1075,1078],{},[21,1076,1077],{},"do_loop_close","  是否进行循环闭合（如果不确定，答案是“true”）",[49,1080,1081,1084],{},[21,1082,1083],{},"Loop_match_minimum_chain_size","  寻找循环闭合的扫描的最小链长度",[49,1086,1087,1090],{},[21,1088,1089],{},"Loop_match_maximum_variance_coarse","  粗略搜索中传递给细化的阈值方差",[49,1092,1093,1096],{},[21,1094,1095],{},"Loop_match_minimum_response_coarse","  粗略搜索中环路闭合算法的阈值响应要传递给细化",[49,1098,1099,1102],{},[21,1100,1101],{},"Loop_match_minimum_response_fine","  精细搜索中循环闭合算法的阈值响应传递给细化",[49,1104,1105,1108],{},[21,1106,1107],{},"correlation_search_space_dimension"," 搜索网格大小以进行扫描相关性",[49,1110,1111,1114],{},[21,1112,1113],{},"correlation_search_space_resolution","  搜索网格分辨率以进行扫描相关性",[49,1116,1117,1120],{},[21,1118,1119],{},"correlation_search_space_smear_deviation","  用于平滑响应的多模态涂抹量",[49,1122,1123,1126],{},[21,1124,1125],{},"loop_search_space_dimension","  循环闭合算法的搜索网格的大小",[49,1128,1129,1132],{},[21,1130,1131],{},"loop_search_space_resolution","  搜索网格分辨率以进行循环闭合",[49,1134,1135,1120],{},[21,1136,1137],{},"loop_search_space_smear_deviation",[49,1139,1140,1143],{},[21,1141,1142],{},"distance_variance_penalty","  应用于匹配扫描的惩罚，因为它与里程姿势不同",[49,1145,1146,1143],{},[21,1147,1148],{},"angle_variance_penalty",[49,1150,1151,1154],{},[21,1152,1153],{},"fine_search_angle_offset","  用于测试精细扫描匹配的角度范围",[49,1156,1157,1160],{},[21,1158,1159],{},"rough_search_angle_offset","  用于测试粗略扫描匹配的角度范围",[49,1162,1163,1166],{},[21,1164,1165],{},"coarse_angle_resolution","  在扫描匹配中测试的偏移范围内的角度分辨率",[49,1168,1169,1172],{},[21,1170,1171],{},"minimum_angle_penalty","  确保尺寸不会膨胀的最小惩罚角度",[49,1174,1175,1178],{},[21,1176,1177],{},"minimum_distance_penalty","  扫描可以确保大小不会爆炸的最小惩罚",[49,1180,1181,1184],{},[21,1182,1183],{},"use_response_expansion","  如果没有找到可行的匹配，是否自动增加搜索网格大小",[14,1186,1187],{"id":1187},"slam_toolbox基本使用",[312,1189,1190],{},[49,1191,1192],{},"准备工作",[18,1194,1195],{},"在src目录下，请先调用如下指令在工作空间的src目录下创建一个功能包：",[68,1197,1199],{"className":70,"code":1198,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_slam_slam_toolbox --dependencies slam_toolbox\n",[74,1200,1201],{"__ignoreMap":32},[77,1202,1203,1206,1209,1212,1215,1219],{"class":79,"line":80},[77,1204,1205],{"class":83},"ros2",[77,1207,1208],{"class":87}," pkg",[77,1210,1211],{"class":87}," create",[77,1213,1214],{"class":87}," mycar_slam_slam_toolbox",[77,1216,1218],{"class":1217},"sj4cs"," --dependencies",[77,1220,1221],{"class":87}," slam_toolbox\n",[312,1223,1224],{"start":114},[49,1225,1226],{},"编写launch文件与参数文件",[18,1228,1229,1230,1233],{},"在功能包下，新建launch目录和params目录，launch目录下新建",[74,1231,1232],{},"online_sync_launch.py","文件并输入如下内容：",[68,1235,1239],{"className":1236,"code":1237,"language":1238,"meta":32,"style":32},"language-python shiki shiki-themes github-light github-dark","import os\n\nfrom launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument\nfrom launch.substitutions import LaunchConfiguration\nfrom launch_ros.actions import Node\nfrom ament_index_python.packages import get_package_share_directory\n\ndef generate_launch_description():\n    use_sim_time = LaunchConfiguration('use_sim_time')\n    slam_params_file = LaunchConfiguration('slam_params_file')\n\n    declare_use_sim_time_argument = DeclareLaunchArgument(\n        'use_sim_time',\n        default_value='false',\n        description='Use simulation/Gazebo clock')\n    declare_slam_params_file_cmd = DeclareLaunchArgument(\n        'slam_params_file',\n        default_value=os.path.join(get_package_share_directory(\"mycar_slam_slam_toolbox\"),\n                                   'params', 'mapper_params_online_sync.yaml'),\n        description='Full path to the ROS2 parameters file to use for the slam_toolbox node')\n\n    start_sync_slam_toolbox_node = Node(\n        parameters=[\n          slam_params_file,\n          {'use_sim_time': use_sim_time}\n        ],\n        package='slam_toolbox',\n        executable='sync_slam_toolbox_node',\n        name='slam_toolbox',\n        output='screen')\n\n    ld = LaunchDescription()\n\n    ld.add_action(declare_use_sim_time_argument)\n    ld.add_action(declare_slam_params_file_cmd)\n    ld.add_action(start_sync_slam_toolbox_node)\n\n    return ld\n","python",[74,1240,1241,1249,1253,1266,1278,1290,1302,1314,1318,1329,1346,1361,1366,1377,1386,1400,1413,1423,1431,1447,1461,1473,1478,1489,1500,1506,1517,1523,1536,1549,1561,1574,1579,1590,1595,1601,1607,1613,1618],{"__ignoreMap":32},[77,1242,1243,1246],{"class":79,"line":80},[77,1244,1245],{"class":97},"import",[77,1247,1248],{"class":104}," os\n",[77,1250,1251],{"class":79,"line":114},[77,1252,140],{"emptyLinePlaceholder":139},[77,1254,1255,1258,1261,1263],{"class":79,"line":136},[77,1256,1257],{"class":97},"from",[77,1259,1260],{"class":104}," launch ",[77,1262,1245],{"class":97},[77,1264,1265],{"class":104}," LaunchDescription\n",[77,1267,1268,1270,1273,1275],{"class":79,"line":143},[77,1269,1257],{"class":97},[77,1271,1272],{"class":104}," launch.actions ",[77,1274,1245],{"class":97},[77,1276,1277],{"class":104}," DeclareLaunchArgument\n",[77,1279,1280,1282,1285,1287],{"class":79,"line":150},[77,1281,1257],{"class":97},[77,1283,1284],{"class":104}," launch.substitutions ",[77,1286,1245],{"class":97},[77,1288,1289],{"class":104}," LaunchConfiguration\n",[77,1291,1292,1294,1297,1299],{"class":79,"line":162},[77,1293,1257],{"class":97},[77,1295,1296],{"class":104}," launch_ros.actions ",[77,1298,1245],{"class":97},[77,1300,1301],{"class":104}," Node\n",[77,1303,1304,1306,1309,1311],{"class":79,"line":174},[77,1305,1257],{"class":97},[77,1307,1308],{"class":104}," ament_index_python.packages ",[77,1310,1245],{"class":97},[77,1312,1313],{"class":104}," get_package_share_directory\n",[77,1315,1316],{"class":79,"line":179},[77,1317,140],{"emptyLinePlaceholder":139},[77,1319,1320,1323,1326],{"class":79,"line":185},[77,1321,1322],{"class":97},"def",[77,1324,1325],{"class":83}," generate_launch_description",[77,1327,1328],{"class":104},"():\n",[77,1330,1331,1334,1337,1340,1343],{"class":79,"line":197},[77,1332,1333],{"class":104},"    use_sim_time ",[77,1335,1336],{"class":97},"=",[77,1338,1339],{"class":104}," LaunchConfiguration(",[77,1341,1342],{"class":87},"'use_sim_time'",[77,1344,1345],{"class":104},")\n",[77,1347,1349,1352,1354,1356,1359],{"class":79,"line":1348},11,[77,1350,1351],{"class":104},"    slam_params_file ",[77,1353,1336],{"class":97},[77,1355,1339],{"class":104},[77,1357,1358],{"class":87},"'slam_params_file'",[77,1360,1345],{"class":104},[77,1362,1364],{"class":79,"line":1363},12,[77,1365,140],{"emptyLinePlaceholder":139},[77,1367,1369,1372,1374],{"class":79,"line":1368},13,[77,1370,1371],{"class":104},"    declare_use_sim_time_argument ",[77,1373,1336],{"class":97},[77,1375,1376],{"class":104}," DeclareLaunchArgument(\n",[77,1378,1380,1383],{"class":79,"line":1379},14,[77,1381,1382],{"class":87},"        'use_sim_time'",[77,1384,1385],{"class":104},",\n",[77,1387,1389,1393,1395,1398],{"class":79,"line":1388},15,[77,1390,1392],{"class":1391},"s4XuR","        default_value",[77,1394,1336],{"class":97},[77,1396,1397],{"class":87},"'false'",[77,1399,1385],{"class":104},[77,1401,1403,1406,1408,1411],{"class":79,"line":1402},16,[77,1404,1405],{"class":1391},"        description",[77,1407,1336],{"class":97},[77,1409,1410],{"class":87},"'Use simulation/Gazebo clock'",[77,1412,1345],{"class":104},[77,1414,1416,1419,1421],{"class":79,"line":1415},17,[77,1417,1418],{"class":104},"    declare_slam_params_file_cmd ",[77,1420,1336],{"class":97},[77,1422,1376],{"class":104},[77,1424,1426,1429],{"class":79,"line":1425},18,[77,1427,1428],{"class":87},"        'slam_params_file'",[77,1430,1385],{"class":104},[77,1432,1434,1436,1438,1441,1444],{"class":79,"line":1433},19,[77,1435,1392],{"class":1391},[77,1437,1336],{"class":97},[77,1439,1440],{"class":104},"os.path.join(get_package_share_directory(",[77,1442,1443],{"class":87},"\"mycar_slam_slam_toolbox\"",[77,1445,1446],{"class":104},"),\n",[77,1448,1450,1453,1456,1459],{"class":79,"line":1449},20,[77,1451,1452],{"class":87},"                                   'params'",[77,1454,1455],{"class":104},", ",[77,1457,1458],{"class":87},"'mapper_params_online_sync.yaml'",[77,1460,1446],{"class":104},[77,1462,1464,1466,1468,1471],{"class":79,"line":1463},21,[77,1465,1405],{"class":1391},[77,1467,1336],{"class":97},[77,1469,1470],{"class":87},"'Full path to the ROS2 parameters file to use for the slam_toolbox node'",[77,1472,1345],{"class":104},[77,1474,1476],{"class":79,"line":1475},22,[77,1477,140],{"emptyLinePlaceholder":139},[77,1479,1481,1484,1486],{"class":79,"line":1480},23,[77,1482,1483],{"class":104},"    start_sync_slam_toolbox_node ",[77,1485,1336],{"class":97},[77,1487,1488],{"class":104}," Node(\n",[77,1490,1492,1495,1497],{"class":79,"line":1491},24,[77,1493,1494],{"class":1391},"        parameters",[77,1496,1336],{"class":97},[77,1498,1499],{"class":104},"[\n",[77,1501,1503],{"class":79,"line":1502},25,[77,1504,1505],{"class":104},"          slam_params_file,\n",[77,1507,1509,1512,1514],{"class":79,"line":1508},26,[77,1510,1511],{"class":104},"          {",[77,1513,1342],{"class":87},[77,1515,1516],{"class":104},": use_sim_time}\n",[77,1518,1520],{"class":79,"line":1519},27,[77,1521,1522],{"class":104},"        ],\n",[77,1524,1526,1529,1531,1534],{"class":79,"line":1525},28,[77,1527,1528],{"class":1391},"        package",[77,1530,1336],{"class":97},[77,1532,1533],{"class":87},"'slam_toolbox'",[77,1535,1385],{"class":104},[77,1537,1539,1542,1544,1547],{"class":79,"line":1538},29,[77,1540,1541],{"class":1391},"        executable",[77,1543,1336],{"class":97},[77,1545,1546],{"class":87},"'sync_slam_toolbox_node'",[77,1548,1385],{"class":104},[77,1550,1552,1555,1557,1559],{"class":79,"line":1551},30,[77,1553,1554],{"class":1391},"        name",[77,1556,1336],{"class":97},[77,1558,1533],{"class":87},[77,1560,1385],{"class":104},[77,1562,1564,1567,1569,1572],{"class":79,"line":1563},31,[77,1565,1566],{"class":1391},"        output",[77,1568,1336],{"class":97},[77,1570,1571],{"class":87},"'screen'",[77,1573,1345],{"class":104},[77,1575,1577],{"class":79,"line":1576},32,[77,1578,140],{"emptyLinePlaceholder":139},[77,1580,1582,1585,1587],{"class":79,"line":1581},33,[77,1583,1584],{"class":104},"    ld ",[77,1586,1336],{"class":97},[77,1588,1589],{"class":104}," LaunchDescription()\n",[77,1591,1593],{"class":79,"line":1592},34,[77,1594,140],{"emptyLinePlaceholder":139},[77,1596,1598],{"class":79,"line":1597},35,[77,1599,1600],{"class":104},"    ld.add_action(declare_use_sim_time_argument)\n",[77,1602,1604],{"class":79,"line":1603},36,[77,1605,1606],{"class":104},"    ld.add_action(declare_slam_params_file_cmd)\n",[77,1608,1610],{"class":79,"line":1609},37,[77,1611,1612],{"class":104},"    ld.add_action(start_sync_slam_toolbox_node)\n",[77,1614,1616],{"class":79,"line":1615},38,[77,1617,140],{"emptyLinePlaceholder":139},[77,1619,1621,1624],{"class":79,"line":1620},39,[77,1622,1623],{"class":97},"    return",[77,1625,1626],{"class":104}," ld\n",[18,1628,1629,1630,1633,1634,1636],{},"该launch文件主要是加载了slam_toolbox下的sync_slam_toolbox_node节点，并且会从当前功能包的params下读取一个名为",[74,1631,1632],{},"mapper_params_online_sync.yaml","的配置文件。这个配置文件还不存在，接下来需要在params目录下新建",[74,1635,1632],{},"文件，并输入如下内容：",[68,1638,1642],{"className":1639,"code":1640,"language":1641,"meta":32,"style":32},"language-yaml shiki shiki-themes github-light github-dark","slam_toolbox:\n  ros__parameters:\n    solver_plugin: solver_plugins::CeresSolver\n    ceres_linear_solver: SPARSE_NORMAL_CHOLESKY\n    ceres_preconditioner: SCHUR_JACOBI\n    ceres_trust_strategy: LEVENBERG_MARQUARDT\n    ceres_dogleg_type: TRADITIONAL_DOGLEG\n    ceres_loss_function: None\n\n    odom_frame: odom\n    map_frame: map\n    base_frame: base_link\n    scan_topic: /scan\n    mode: mapping #localization\n\n    #map_file_name: test_steve\n    #map_start_pose: [0.0, 0.0, 0.0]\n    #map_start_at_dock: true\n\n    debug_logging: false\n    throttle_scans: 1\n    transform_publish_period: 0.02 \n    map_update_interval: 2.0\n    resolution: 0.05\n    max_laser_range: 20.0 \n    minimum_time_interval: 0.5\n    transform_timeout: 0.2\n    tf_buffer_duration: 30.0\n    stack_size_to_use: 40000000 \n    enable_interactive_mode: true\n\n    use_scan_matching: true\n    use_scan_barycenter: true\n    minimum_travel_distance: 0.1\n    minimum_travel_heading: 0.1\n    scan_buffer_size: 100\n    scan_buffer_maximum_scan_distance: 10.0\n    link_match_minimum_response_fine: 0.1  \n    link_scan_maximum_distance: 1.5\n    loop_search_maximum_distance: 3.0\n    do_loop_closing: true \n    loop_match_minimum_chain_size: 10           \n    loop_match_maximum_variance_coarse: 3.0  \n    loop_match_minimum_response_coarse: 0.35    \n    loop_match_minimum_response_fine: 0.45\n\n    correlation_search_space_dimension: 0.5\n    correlation_search_space_resolution: 0.01\n    correlation_search_space_smear_deviation: 0.1 \n\n    loop_search_space_dimension: 8.0\n    loop_search_space_resolution: 0.05\n    loop_search_space_smear_deviation: 0.03\n\n    distance_variance_penalty: 0.5      \n    angle_variance_penalty: 1.0    \n\n    fine_search_angle_offset: 0.00349     \n    coarse_search_angle_offset: 0.349   \n    coarse_angle_resolution: 0.0349        \n    minimum_angle_penalty: 0.9\n    minimum_distance_penalty: 0.5\n    use_response_expansion: true\n","yaml",[74,1643,1644,1652,1659,1670,1680,1690,1700,1710,1720,1724,1734,1744,1754,1764,1777,1781,1786,1791,1796,1800,1810,1820,1833,1843,1853,1865,1875,1885,1895,1907,1917,1921,1930,1939,1949,1958,1968,1978,1991,2001,2012,2025,2039,2052,2066,2077,2082,2092,2103,2115,2120,2131,2141,2152,2157,2171,2184,2189,2203,2217,2231,2242,2252],{"__ignoreMap":32},[77,1645,1646,1649],{"class":79,"line":80},[77,1647,594],{"class":1648},"s9eBZ",[77,1650,1651],{"class":104},":\n",[77,1653,1654,1657],{"class":79,"line":114},[77,1655,1656],{"class":1648},"  ros__parameters",[77,1658,1651],{"class":104},[77,1660,1661,1664,1667],{"class":79,"line":136},[77,1662,1663],{"class":1648},"    solver_plugin",[77,1665,1666],{"class":104},": ",[77,1668,1669],{"class":87},"solver_plugins::CeresSolver\n",[77,1671,1672,1675,1677],{"class":79,"line":143},[77,1673,1674],{"class":1648},"    ceres_linear_solver",[77,1676,1666],{"class":104},[77,1678,1679],{"class":87},"SPARSE_NORMAL_CHOLESKY\n",[77,1681,1682,1685,1687],{"class":79,"line":150},[77,1683,1684],{"class":1648},"    ceres_preconditioner",[77,1686,1666],{"class":104},[77,1688,1689],{"class":87},"SCHUR_JACOBI\n",[77,1691,1692,1695,1697],{"class":79,"line":162},[77,1693,1694],{"class":1648},"    ceres_trust_strategy",[77,1696,1666],{"class":104},[77,1698,1699],{"class":87},"LEVENBERG_MARQUARDT\n",[77,1701,1702,1705,1707],{"class":79,"line":174},[77,1703,1704],{"class":1648},"    ceres_dogleg_type",[77,1706,1666],{"class":104},[77,1708,1709],{"class":87},"TRADITIONAL_DOGLEG\n",[77,1711,1712,1715,1717],{"class":79,"line":179},[77,1713,1714],{"class":1648},"    ceres_loss_function",[77,1716,1666],{"class":104},[77,1718,1719],{"class":87},"None\n",[77,1721,1722],{"class":79,"line":185},[77,1723,140],{"emptyLinePlaceholder":139},[77,1725,1726,1729,1731],{"class":79,"line":197},[77,1727,1728],{"class":1648},"    odom_frame",[77,1730,1666],{"class":104},[77,1732,1733],{"class":87},"odom\n",[77,1735,1736,1739,1741],{"class":79,"line":1348},[77,1737,1738],{"class":1648},"    map_frame",[77,1740,1666],{"class":104},[77,1742,1743],{"class":87},"map\n",[77,1745,1746,1749,1751],{"class":79,"line":1363},[77,1747,1748],{"class":1648},"    base_frame",[77,1750,1666],{"class":104},[77,1752,1753],{"class":87},"base_link\n",[77,1755,1756,1759,1761],{"class":79,"line":1368},[77,1757,1758],{"class":1648},"    scan_topic",[77,1760,1666],{"class":104},[77,1762,1763],{"class":87},"/scan\n",[77,1765,1766,1769,1771,1774],{"class":79,"line":1379},[77,1767,1768],{"class":1648},"    mode",[77,1770,1666],{"class":104},[77,1772,1773],{"class":87},"mapping",[77,1775,1776],{"class":146}," #localization\n",[77,1778,1779],{"class":79,"line":1388},[77,1780,140],{"emptyLinePlaceholder":139},[77,1782,1783],{"class":79,"line":1402},[77,1784,1785],{"class":146},"    #map_file_name: test_steve\n",[77,1787,1788],{"class":79,"line":1415},[77,1789,1790],{"class":146},"    #map_start_pose: [0.0, 0.0, 0.0]\n",[77,1792,1793],{"class":79,"line":1425},[77,1794,1795],{"class":146},"    #map_start_at_dock: true\n",[77,1797,1798],{"class":79,"line":1433},[77,1799,140],{"emptyLinePlaceholder":139},[77,1801,1802,1805,1807],{"class":79,"line":1449},[77,1803,1804],{"class":1648},"    debug_logging",[77,1806,1666],{"class":104},[77,1808,1809],{"class":1217},"false\n",[77,1811,1812,1815,1817],{"class":79,"line":1463},[77,1813,1814],{"class":1648},"    throttle_scans",[77,1816,1666],{"class":104},[77,1818,1819],{"class":1217},"1\n",[77,1821,1822,1825,1827,1830],{"class":79,"line":1475},[77,1823,1824],{"class":1648},"    transform_publish_period",[77,1826,1666],{"class":104},[77,1828,1829],{"class":1217},"0.02",[77,1831,1832],{"class":104}," \n",[77,1834,1835,1838,1840],{"class":79,"line":1480},[77,1836,1837],{"class":1648},"    map_update_interval",[77,1839,1666],{"class":104},[77,1841,1842],{"class":1217},"2.0\n",[77,1844,1845,1848,1850],{"class":79,"line":1491},[77,1846,1847],{"class":1648},"    resolution",[77,1849,1666],{"class":104},[77,1851,1852],{"class":1217},"0.05\n",[77,1854,1855,1858,1860,1863],{"class":79,"line":1502},[77,1856,1857],{"class":1648},"    max_laser_range",[77,1859,1666],{"class":104},[77,1861,1862],{"class":1217},"20.0",[77,1864,1832],{"class":104},[77,1866,1867,1870,1872],{"class":79,"line":1508},[77,1868,1869],{"class":1648},"    minimum_time_interval",[77,1871,1666],{"class":104},[77,1873,1874],{"class":1217},"0.5\n",[77,1876,1877,1880,1882],{"class":79,"line":1519},[77,1878,1879],{"class":1648},"    transform_timeout",[77,1881,1666],{"class":104},[77,1883,1884],{"class":1217},"0.2\n",[77,1886,1887,1890,1892],{"class":79,"line":1525},[77,1888,1889],{"class":1648},"    tf_buffer_duration",[77,1891,1666],{"class":104},[77,1893,1894],{"class":1217},"30.0\n",[77,1896,1897,1900,1902,1905],{"class":79,"line":1538},[77,1898,1899],{"class":1648},"    stack_size_to_use",[77,1901,1666],{"class":104},[77,1903,1904],{"class":1217},"40000000",[77,1906,1832],{"class":104},[77,1908,1909,1912,1914],{"class":79,"line":1551},[77,1910,1911],{"class":1648},"    enable_interactive_mode",[77,1913,1666],{"class":104},[77,1915,1916],{"class":1217},"true\n",[77,1918,1919],{"class":79,"line":1563},[77,1920,140],{"emptyLinePlaceholder":139},[77,1922,1923,1926,1928],{"class":79,"line":1576},[77,1924,1925],{"class":1648},"    use_scan_matching",[77,1927,1666],{"class":104},[77,1929,1916],{"class":1217},[77,1931,1932,1935,1937],{"class":79,"line":1581},[77,1933,1934],{"class":1648},"    use_scan_barycenter",[77,1936,1666],{"class":104},[77,1938,1916],{"class":1217},[77,1940,1941,1944,1946],{"class":79,"line":1592},[77,1942,1943],{"class":1648},"    minimum_travel_distance",[77,1945,1666],{"class":104},[77,1947,1948],{"class":1217},"0.1\n",[77,1950,1951,1954,1956],{"class":79,"line":1597},[77,1952,1953],{"class":1648},"    minimum_travel_heading",[77,1955,1666],{"class":104},[77,1957,1948],{"class":1217},[77,1959,1960,1963,1965],{"class":79,"line":1603},[77,1961,1962],{"class":1648},"    scan_buffer_size",[77,1964,1666],{"class":104},[77,1966,1967],{"class":1217},"100\n",[77,1969,1970,1973,1975],{"class":79,"line":1609},[77,1971,1972],{"class":1648},"    scan_buffer_maximum_scan_distance",[77,1974,1666],{"class":104},[77,1976,1977],{"class":1217},"10.0\n",[77,1979,1980,1983,1985,1988],{"class":79,"line":1615},[77,1981,1982],{"class":1648},"    link_match_minimum_response_fine",[77,1984,1666],{"class":104},[77,1986,1987],{"class":1217},"0.1",[77,1989,1990],{"class":104},"  \n",[77,1992,1993,1996,1998],{"class":79,"line":1620},[77,1994,1995],{"class":1648},"    link_scan_maximum_distance",[77,1997,1666],{"class":104},[77,1999,2000],{"class":1217},"1.5\n",[77,2002,2004,2007,2009],{"class":79,"line":2003},40,[77,2005,2006],{"class":1648},"    loop_search_maximum_distance",[77,2008,1666],{"class":104},[77,2010,2011],{"class":1217},"3.0\n",[77,2013,2015,2018,2020,2023],{"class":79,"line":2014},41,[77,2016,2017],{"class":1648},"    do_loop_closing",[77,2019,1666],{"class":104},[77,2021,2022],{"class":1217},"true",[77,2024,1832],{"class":104},[77,2026,2028,2031,2033,2036],{"class":79,"line":2027},42,[77,2029,2030],{"class":1648},"    loop_match_minimum_chain_size",[77,2032,1666],{"class":104},[77,2034,2035],{"class":1217},"10",[77,2037,2038],{"class":104},"           \n",[77,2040,2042,2045,2047,2050],{"class":79,"line":2041},43,[77,2043,2044],{"class":1648},"    loop_match_maximum_variance_coarse",[77,2046,1666],{"class":104},[77,2048,2049],{"class":1217},"3.0",[77,2051,1990],{"class":104},[77,2053,2055,2058,2060,2063],{"class":79,"line":2054},44,[77,2056,2057],{"class":1648},"    loop_match_minimum_response_coarse",[77,2059,1666],{"class":104},[77,2061,2062],{"class":1217},"0.35",[77,2064,2065],{"class":104},"    \n",[77,2067,2069,2072,2074],{"class":79,"line":2068},45,[77,2070,2071],{"class":1648},"    loop_match_minimum_response_fine",[77,2073,1666],{"class":104},[77,2075,2076],{"class":1217},"0.45\n",[77,2078,2080],{"class":79,"line":2079},46,[77,2081,140],{"emptyLinePlaceholder":139},[77,2083,2085,2088,2090],{"class":79,"line":2084},47,[77,2086,2087],{"class":1648},"    correlation_search_space_dimension",[77,2089,1666],{"class":104},[77,2091,1874],{"class":1217},[77,2093,2095,2098,2100],{"class":79,"line":2094},48,[77,2096,2097],{"class":1648},"    correlation_search_space_resolution",[77,2099,1666],{"class":104},[77,2101,2102],{"class":1217},"0.01\n",[77,2104,2106,2109,2111,2113],{"class":79,"line":2105},49,[77,2107,2108],{"class":1648},"    correlation_search_space_smear_deviation",[77,2110,1666],{"class":104},[77,2112,1987],{"class":1217},[77,2114,1832],{"class":104},[77,2116,2118],{"class":79,"line":2117},50,[77,2119,140],{"emptyLinePlaceholder":139},[77,2121,2123,2126,2128],{"class":79,"line":2122},51,[77,2124,2125],{"class":1648},"    loop_search_space_dimension",[77,2127,1666],{"class":104},[77,2129,2130],{"class":1217},"8.0\n",[77,2132,2134,2137,2139],{"class":79,"line":2133},52,[77,2135,2136],{"class":1648},"    loop_search_space_resolution",[77,2138,1666],{"class":104},[77,2140,1852],{"class":1217},[77,2142,2144,2147,2149],{"class":79,"line":2143},53,[77,2145,2146],{"class":1648},"    loop_search_space_smear_deviation",[77,2148,1666],{"class":104},[77,2150,2151],{"class":1217},"0.03\n",[77,2153,2155],{"class":79,"line":2154},54,[77,2156,140],{"emptyLinePlaceholder":139},[77,2158,2160,2163,2165,2168],{"class":79,"line":2159},55,[77,2161,2162],{"class":1648},"    distance_variance_penalty",[77,2164,1666],{"class":104},[77,2166,2167],{"class":1217},"0.5",[77,2169,2170],{"class":104},"      \n",[77,2172,2174,2177,2179,2182],{"class":79,"line":2173},56,[77,2175,2176],{"class":1648},"    angle_variance_penalty",[77,2178,1666],{"class":104},[77,2180,2181],{"class":1217},"1.0",[77,2183,2065],{"class":104},[77,2185,2187],{"class":79,"line":2186},57,[77,2188,140],{"emptyLinePlaceholder":139},[77,2190,2192,2195,2197,2200],{"class":79,"line":2191},58,[77,2193,2194],{"class":1648},"    fine_search_angle_offset",[77,2196,1666],{"class":104},[77,2198,2199],{"class":1217},"0.00349",[77,2201,2202],{"class":104},"     \n",[77,2204,2206,2209,2211,2214],{"class":79,"line":2205},59,[77,2207,2208],{"class":1648},"    coarse_search_angle_offset",[77,2210,1666],{"class":104},[77,2212,2213],{"class":1217},"0.349",[77,2215,2216],{"class":104},"   \n",[77,2218,2220,2223,2225,2228],{"class":79,"line":2219},60,[77,2221,2222],{"class":1648},"    coarse_angle_resolution",[77,2224,1666],{"class":104},[77,2226,2227],{"class":1217},"0.0349",[77,2229,2230],{"class":104},"        \n",[77,2232,2234,2237,2239],{"class":79,"line":2233},61,[77,2235,2236],{"class":1648},"    minimum_angle_penalty",[77,2238,1666],{"class":104},[77,2240,2241],{"class":1217},"0.9\n",[77,2243,2245,2248,2250],{"class":79,"line":2244},62,[77,2246,2247],{"class":1648},"    minimum_distance_penalty",[77,2249,1666],{"class":104},[77,2251,1874],{"class":1217},[77,2253,2255,2258,2260],{"class":79,"line":2254},63,[77,2256,2257],{"class":1648},"    use_response_expansion",[77,2259,1666],{"class":104},[77,2261,1916],{"class":1217},[18,2263,2264],{},"配置文件的内容需要根据实际情况进行动态调整。",[312,2266,2267],{"start":136},[49,2268,2269],{},"编辑配置文件",[18,2271,2272,2273,2276],{},"打开",[74,2274,2275],{},"CMakeLists.txt"," 并输入如下内容：",[68,2278,2282],{"className":2279,"code":2280,"language":2281,"meta":32,"style":32},"language-cmake shiki shiki-themes github-light github-dark","install(DIRECTORY launch params\n  DESTINATION share/${PROJECT_NAME}\n)\n","cmake",[74,2283,2284,2292,2300],{"__ignoreMap":32},[77,2285,2286,2289],{"class":79,"line":80},[77,2287,2288],{"class":97},"install",[77,2290,2291],{"class":104},"(DIRECTORY launch params\n",[77,2293,2294,2297],{"class":79,"line":114},[77,2295,2296],{"class":104},"  DESTINATION share/",[77,2298,2299],{"class":97},"${PROJECT_NAME}\n",[77,2301,2302],{"class":79,"line":136},[77,2303,1345],{"class":104},[312,2305,2306],{"start":143},[49,2307,2308],{},"编译",[18,2310,2311],{},"终端中进入当前工作空间，编译功能包：",[68,2313,2315],{"className":70,"code":2314,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_slam_slam_toolbox\n",[74,2316,2317],{"__ignoreMap":32},[77,2318,2319,2322,2325,2328],{"class":79,"line":80},[77,2320,2321],{"class":83},"colcon",[77,2323,2324],{"class":87}," build",[77,2326,2327],{"class":1217}," --packages-select",[77,2329,2330],{"class":87}," mycar_slam_slam_toolbox\n",[312,2332,2333],{"start":150},[49,2334,2335,2336,2341,2367,2372,2397,2405,2408,2409,2412,2413,2416],{},"执行",[312,2337,2338],{},[49,2339,2340],{},"请先调用如下指令启动仿真环境：",[68,2342,2344],{"className":70,"code":2343,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch demo_gazebo_sim gazebo_sim_robot_world.launch.py\n",[74,2345,2346,2354],{"__ignoreMap":32},[77,2347,2348,2351],{"class":79,"line":80},[77,2349,2350],{"class":1217},".",[77,2352,2353],{"class":87}," install/setup.bash\n",[77,2355,2356,2358,2361,2364],{"class":79,"line":114},[77,2357,1205],{"class":83},[77,2359,2360],{"class":87}," launch",[77,2362,2363],{"class":87}," demo_gazebo_sim",[77,2365,2366],{"class":87}," gazebo_sim_robot_world.launch.py\n",[312,2368,2369],{"start":136},[49,2370,2371],{},"然后在终端下进入当前工作空间，输入如下指令：",[68,2373,2375],{"className":70,"code":2374,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_slam_slam_toolbox online_sync_launch.py use_sim_time:=True\n",[74,2376,2377,2383],{"__ignoreMap":32},[77,2378,2379,2381],{"class":79,"line":80},[77,2380,2350],{"class":1217},[77,2382,2353],{"class":87},[77,2384,2385,2387,2389,2391,2394],{"class":79,"line":114},[77,2386,1205],{"class":83},[77,2388,2360],{"class":87},[77,2390,1214],{"class":87},[77,2392,2393],{"class":87}," online_sync_launch.py",[77,2395,2396],{"class":87}," use_sim_time:=True\n",[312,2398,2399,2402],{"start":150},[49,2400,2401],{},"启动rviz2，将Fixed Frame设置为map，添加map插件并将话题设置为/map，即可显示slam_toolbox创建的地图了，当机器人运动时，地图也会随之更新。",[49,2403,2404],{},"use_sim_time:=True参数表示使用仿真的时间。",[2406,2407],"br",{},"  最后需要说明的是，本节内容使用的是",[74,2410,2411],{},"sync_slam_toolbox_node"," 节点，即以同步方式建图，而异步建图节点",[74,2414,2415],{},"async_slam_toolbox_node"," 的使用与同步类似。",[18,2418,2419],{},[30,2420],{"alt":32,"src":2421},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1746.webp",[18,2423,2424],{},"我们用键盘控制节点去控制机器人跑满整张地图，",[18,2426,2427],{},[30,2428],{"alt":32,"src":2429},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1747.webp",[18,2431,2432],{},"黑色：障碍物",[18,2434,2435],{},"白色：无障碍物区",[18,2437,2438],{},"灰色：未知区",[18,2440,2441],{},"SLAM是建图与定位，以上就是建图，那么定位是啥呢？",[18,2443,2444],{},"定位就是Slam会发布一个/tf，这里面会包含机器人到map之间的坐标变换。",[18,2446,2447],{},"这个/tf发布的具体是map到odom的坐标变换，所以需要你自己去处理odom和base_link之间的坐标关系。",[18,2449,2450],{},[30,2451],{"alt":32,"src":2452},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1748.webp",[18,2454,2455],{},"这样的设计，可以让整条坐标树是一个链式结构，避免base_link或者base_foot_print出现两个父类，这样计算量会变大。",[18,2457,2458],{},[21,2459,2460],{},"注意事项：",[312,2462,2463],{},[49,2464,2465,2466],{},"突然烂图\n",[312,2467,2468,2471],{},[49,2469,2470],{},"如果你的环境很简单，那么跑图的时候可能会突然烂图，这个时候，大概率是do_loop_closing的问题，你把do_loop_closing设置成false再试试。\n这个东西是SLAM用激光检测形状来匹配之前走过的路，如果他匹配到的形状差不多他会把当前这段轨迹和以前的轨迹连起来，然后重新优化整张 pose graph，让地图整体更一致。\n主要是为了防止odom会漂，因为 odom 会漂，机器人最后回到起点时，SLAM 可能觉得位置差了几十厘米，但是可以通过激光雷达矫正。",[49,2472,2473],{},"在窄通道尽量直线过去，不要原地旋转等等，这种窄通道炸了大概率是scan matching相关参数的问题。",[14,2475,2476],{"id":2476},"cartographer概述",[18,2478,2479],{},[21,2480,23],{},[18,2482,2483],{},"Cartographer是Google推出的一套基于图优化的激光SLAM算法库，支持二维和三维地图的构建。它结合了激光雷达和惯性测量单元（IMU）的数据，通过高效的算法实现实时、准确的定位和建图。",[18,2485,2486],{},[21,2487,368],{},[46,2489,2490,2496,2502,2508,2513],{},[49,2491,2492,2495],{},[21,2493,2494],{},"并行扫描匹配"," 利用并行计算技术加快扫描匹配速度，提高建图效率。",[49,2497,2498,2501],{},[21,2499,2500],{},"位姿图优化"," 通过图优化技术估计机器人的姿态和地图的拓扑结构，减少累积误差。",[49,2503,2504,2507],{},[21,2505,2506],{},"实时地图更新"," 在机器人移动过程中实时更新地图，确保地图的准确性和时效性。",[49,2509,2510,2512],{},[21,2511,637],{}," 通过回环检测识别机器人曾经访问过的区域，进一步减少累积误差，提高地图的全局一致性。",[49,2514,2515,2518],{},[21,2516,2517],{},"多传感器融合"," 支持激光雷达、IMU、里程计等多种传感器数据的融合，提高定位和建图的精度。",[18,2520,397],{},[46,2522,2523,2529,2535,2541,2547],{},[49,2524,2525,2528],{},[21,2526,2527],{},"高效稳定"," Cartographer的算法经过精心设计和优化，能够在复杂环境中高效稳定地运行。",[49,2530,2531,2534],{},[21,2532,2533],{},"高精度"," 通过图优化和回环检测技术提供高精度的定位和建图结果。",[49,2536,2537,2540],{},[21,2538,2539],{},"灵活性"," 支持二维和三维地图构建，适应不同应用场景的需求。",[49,2542,2543,2546],{},[21,2544,2545],{},"开源免费"," Cartographer是开源项目，用户可以免费获取和使用其源代码和文档。",[49,2548,2549,2552],{},[21,2550,2551],{},"社区支持"," 拥有活跃的社区支持体系，用户可以获取来自全球开发者的帮助和支持。",[14,2554,2555],{"id":2555},"cartographer安装",[18,2557,2558],{},"借助于Ubuntu的包资源管理器，可以使用二进制的方式安装cartographer，安装指令如下：",[68,2560,2562],{"className":70,"code":2561,"language":72,"meta":32,"style":32},"sudo apt install ros-\u003Cros2-distro>-cartographer\nsudo apt install ros-\u003Cros2-distro>-cartographer-ros\n\n# humble\nsudo apt install ros-humble-cartographer\nsudo apt install ros-humble-cartographer-ros\n#jazzy\nsudo apt install ros-jazzy-cartographer\nsudo apt install ros-jazzy-cartographer-ros\n",[74,2563,2564,2585,2606,2610,2615,2626,2637,2641,2652],{"__ignoreMap":32},[77,2565,2566,2568,2570,2572,2574,2576,2578,2580,2582],{"class":79,"line":80},[77,2567,84],{"class":83},[77,2569,88],{"class":87},[77,2571,91],{"class":87},[77,2573,94],{"class":87},[77,2575,98],{"class":97},[77,2577,101],{"class":87},[77,2579,105],{"class":104},[77,2581,108],{"class":97},[77,2583,2584],{"class":87},"-cartographer\n",[77,2586,2587,2589,2591,2593,2595,2597,2599,2601,2603],{"class":79,"line":114},[77,2588,84],{"class":83},[77,2590,88],{"class":87},[77,2592,91],{"class":87},[77,2594,94],{"class":87},[77,2596,98],{"class":97},[77,2598,101],{"class":87},[77,2600,105],{"class":104},[77,2602,108],{"class":97},[77,2604,2605],{"class":87},"-cartographer-ros\n",[77,2607,2608],{"class":79,"line":136},[77,2609,140],{"emptyLinePlaceholder":139},[77,2611,2612],{"class":79,"line":143},[77,2613,2614],{"class":146},"# humble\n",[77,2616,2617,2619,2621,2623],{"class":79,"line":150},[77,2618,84],{"class":83},[77,2620,88],{"class":87},[77,2622,91],{"class":87},[77,2624,2625],{"class":87}," ros-humble-cartographer\n",[77,2627,2628,2630,2632,2634],{"class":79,"line":162},[77,2629,84],{"class":83},[77,2631,88],{"class":87},[77,2633,91],{"class":87},[77,2635,2636],{"class":87}," ros-humble-cartographer-ros\n",[77,2638,2639],{"class":79,"line":174},[77,2640,486],{"class":146},[77,2642,2643,2645,2647,2649],{"class":79,"line":179},[77,2644,84],{"class":83},[77,2646,88],{"class":87},[77,2648,91],{"class":87},[77,2650,2651],{"class":87}," ros-jazzy-cartographer\n",[77,2653,2654,2656,2658,2660],{"class":79,"line":185},[77,2655,84],{"class":83},[77,2657,88],{"class":87},[77,2659,91],{"class":87},[77,2661,2662],{"class":87}," ros-jazzy-cartographer-ros\n",[18,2664,2665,2666,213],{},"上述两条安装指令中，前者用于安装cartographer的核心库，这个包不直接与ROS2集成，而是作为一个独立的算法库存在，为地图构建和定位提供底层的计算支持。后者则是cartographer在ROS2环境下的封装，它提供了与ROS2系统的接口，使得Cartographer算法能够在ROS2环境中运行。另外指令中的",[74,2667,212],{},[14,2669,2670],{"id":2670},"cartographer节点说明",[18,2672,2673,2674,2677,2678,2681],{},"在Cartographer框架中，",[74,2675,2676],{},"cartographer_node","和",[74,2679,2680],{},"cartographer_occupancy_grid_node","是两个关键的节点，它们各自承担着不同的角色和功能。详细介绍如下。",[337,2683,2684,2689,2692,2697],{},[18,2685,2686],{},[21,2687,2688],{},"cartographer_node：",[18,2690,2691],{},"主要负责订阅来自各种传感器的数据（如激光雷达、IMU、里程计等），并基于这些数据实时构建地图。它采用子图（submap）的方法来逐步构建和更新地图，确保定位的准确性和建图的实时性。",[18,2693,2694],{},[21,2695,2696],{},"cartographer_occupancy_grid_node：",[18,2698,2699,2700,2702,2703,2706],{},"该节点负责接收",[74,2701,2676],{},"发布的子图列表（",[74,2704,2705],{},"/submap_list","），并将其拼接成完整的栅格地图（occupancy grid map），然后发布这个地图。这个节点是地图生成的最终环节，它使得Cartographer能够输出人类可读且易于可视化的地图。",[18,2708,2709],{},"这两个节点的协同工作，前者负责实时构建和更新地图，后者则负责将子图拼接成完整的栅格地图并发布，使得Cartographer能够高效地实现SLAM功能。",[312,2711,2712],{},[49,2713,2714],{},"cartographer_node订阅的话题",[535,2716,2717,2727],{},[538,2718,2719],{},[541,2720,2721,2723,2725],{},[544,2722,547],{"align":546},[544,2724,550],{"align":546},[544,2726,553],{"align":546},[555,2728,2729,2737],{},[541,2730,2731,2733,2735],{},[560,2732,562],{"align":546},[560,2734,565],{"align":546},[560,2736,568],{"align":546},[541,2738,2739,2742,2745],{},[560,2740,2741],{"align":546},"/odom",[560,2743,2744],{"align":546},"nav_msgs/msg/Odometry",[560,2746,2747],{"align":546},"里程计消息",[312,2749,2750],{"start":114},[49,2751,2752],{},"cartographer_node发布的话题",[535,2754,2755,2765],{},[538,2756,2757],{},[541,2758,2759,2761,2763],{},[544,2760,547],{"align":546},[544,2762,550],{"align":546},[544,2764,553],{"align":546},[555,2766,2767,2778],{},[541,2768,2769,2772,2775],{},[560,2770,2771],{"align":546},"/scan_matched_points2",[560,2773,2774],{"align":546},"sensors_msgs/msg/PointCloud2",[560,2776,2777],{"align":546},"匹配好的点云数据，用于scan-to-submap matching",[541,2779,2780,2782,2785],{},[560,2781,2705],{"align":546},[560,2783,2784],{"align":546},"cartographer_ros_msgs/SubmapList",[560,2786,2787],{"align":546},"发布构建好的子图列表",[312,2789,2790],{"start":136},[49,2791,2792],{},"cartographer_node发布的服务",[535,2794,2795,2805],{},[538,2796,2797],{},[541,2798,2799,2801,2803],{},[544,2800,547],{"align":546},[544,2802,550],{"align":546},[544,2804,553],{"align":546},[555,2806,2807,2818,2829,2840,2851,2862],{},[541,2808,2809,2812,2815],{},[560,2810,2811],{"align":546},"/submap_query",[560,2813,2814],{"align":546},"cartographer_ros_msgs/srv/SubmapQuery",[560,2816,2817],{"align":546},"提供查询子图的服务，获取到查询的子图",[541,2819,2820,2823,2826],{},[560,2821,2822],{"align":546},"/start_trajectory",[560,2824,2825],{"align":546},"cartographer_ros_msgs/srv/StartTrajectory",[560,2827,2828],{"align":546},"开始一条轨迹",[541,2830,2831,2834,2837],{},[560,2832,2833],{"align":546},"/finish_trajectory",[560,2835,2836],{"align":546},"cartographer_ros_msgs/srv/FinishTrajectory",[560,2838,2839],{"align":546},"结束一条给定ID的轨迹",[541,2841,2842,2845,2848],{},[560,2843,2844],{"align":546},"/write_state",[560,2846,2847],{"align":546},"cartographer_ros_msgs/srv/WriteState",[560,2849,2850],{"align":546},"将当前状态写入磁盘文件中",[541,2852,2853,2856,2859],{},[560,2854,2855],{"align":546},"/get_trajectory_states",[560,2857,2858],{"align":546},"cartographer_ros_msgs/srv/GetTrajectoryStates",[560,2860,2861],{"align":546},"获取指定轨迹的状态",[541,2863,2864,2867,2870],{},[560,2865,2866],{"align":546},"/read_metrics",[560,2868,2869],{"align":546},"cartographer_ros_msgs/srv/ReadMetrics",[560,2871,2872],{"align":546},"读取性能指标",[312,2874,2875],{"start":143},[49,2876,2877],{},"cartographer_node参数",[18,2879,2880,2882],{},[74,2881,2676],{},"节点需要接收一个参数配置文件，该配置文件包含了地图构建、轨迹跟踪等所需的各项参数。",[312,2884,2885],{"start":150},[49,2886,2887],{},"cartographer_occupancy_grid_node订阅的话题",[535,2889,2890,2900],{},[538,2891,2892],{},[541,2893,2894,2896,2898],{},[544,2895,547],{"align":546},[544,2897,550],{"align":546},[544,2899,553],{"align":546},[555,2901,2902],{},[541,2903,2904,2906,2908],{},[560,2905,2705],{"align":546},[560,2907,2784],{"align":546},[560,2909,2910],{"align":546},"子图列表",[312,2912,2913],{"start":162},[49,2914,2915],{},"cartographer_occupancy_grid_node发布的话题",[535,2917,2918,2928],{},[538,2919,2920],{},[541,2921,2922,2924,2926],{},[544,2923,547],{"align":546},[544,2925,550],{"align":546},[544,2927,553],{"align":546},[555,2929,2930],{},[541,2931,2932,2934,2936],{},[560,2933,687],{"align":546},[560,2935,690],{"align":546},[560,2937,2938],{"align":546},"发布的栅格地图",[312,2940,2941],{"start":174},[49,2942,2943],{},"cartographer_occupancy_grid_node请求的服务",[535,2945,2946,2956],{},[538,2947,2948],{},[541,2949,2950,2952,2954],{},[544,2951,547],{"align":546},[544,2953,550],{"align":546},[544,2955,553],{"align":546},[555,2957,2958],{},[541,2959,2960,2962,2964],{},[560,2961,2811],{"align":546},[560,2963,2814],{"align":546},[560,2965,2966],{"align":546},"获取子图",[312,2968,2969],{"start":179},[49,2970,2971],{},"cartographer_occupancy_grid_node参数",[18,2973,2974,2976],{},[74,2975,2680],{},"节点需要配置地图的分辨率和更新周期等参数，以确保生成的栅格地图满足特定的精度和实时性要求。",[14,2978,2979],{"id":2979},"cartogarpher基本使用",[312,2981,2982],{},[49,2983,1192],{},[18,2985,1195],{},[68,2987,2989],{"className":70,"code":2988,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_slam_cartographer --dependencies cartographer\n",[74,2990,2991],{"__ignoreMap":32},[77,2992,2993,2995,2997,2999,3002,3004],{"class":79,"line":80},[77,2994,1205],{"class":83},[77,2996,1208],{"class":87},[77,2998,1211],{"class":87},[77,3000,3001],{"class":87}," mycar_slam_cartographer",[77,3003,1218],{"class":1217},[77,3005,3006],{"class":87}," cartographer\n",[312,3008,3009],{"start":114},[49,3010,1226],{},[18,3012,1229,3013,1233],{},[74,3014,3015],{},"cartographer.launch.py",[68,3017,3019],{"className":1236,"code":3018,"language":1238,"meta":32,"style":32},"from launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument\nfrom launch.substitutions import LaunchConfiguration\nfrom launch_ros.actions import Node\nimport os\nfrom ament_index_python.packages import get_package_share_directory\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument('use_sim_time', default_value = 'false')\n    resolution_arg = DeclareLaunchArgument('resolution', default_value='0.05')\n\n    cartographer_node = Node(\n        package = 'cartographer_ros',\n        executable = 'cartographer_node',\n        parameters = [{'use_sim_time': LaunchConfiguration('use_sim_time')}],\n        arguments = [\n            '-configuration_directory', os.path.join(get_package_share_directory(\"mycar_slam_cartographer\"),\"params\"),\n            '-configuration_basename', 'mycar.lua'],\n        output = 'screen'\n    )\n\n    cartographer_occupancy_grid_node = Node(\n        package = 'cartographer_ros',\n        executable = 'cartographer_occupancy_grid_node',\n        parameters = [\n            {'use_sim_time': LaunchConfiguration('use_sim_time')},\n            {'resolution': LaunchConfiguration('resolution')}],\n    )\n\n    return LaunchDescription([\n        use_sim_time_arg,\n        resolution_arg,\n        cartographer_node,\n        cartographer_occupancy_grid_node,\n    ])\n",[74,3020,3021,3031,3041,3051,3061,3067,3077,3081,3089,3093,3118,3141,3145,3154,3165,3176,3195,3205,3224,3237,3246,3251,3255,3264,3274,3285,3293,3307,3319,3323,3327,3334,3339,3344,3349,3354],{"__ignoreMap":32},[77,3022,3023,3025,3027,3029],{"class":79,"line":80},[77,3024,1257],{"class":97},[77,3026,1260],{"class":104},[77,3028,1245],{"class":97},[77,3030,1265],{"class":104},[77,3032,3033,3035,3037,3039],{"class":79,"line":114},[77,3034,1257],{"class":97},[77,3036,1272],{"class":104},[77,3038,1245],{"class":97},[77,3040,1277],{"class":104},[77,3042,3043,3045,3047,3049],{"class":79,"line":136},[77,3044,1257],{"class":97},[77,3046,1284],{"class":104},[77,3048,1245],{"class":97},[77,3050,1289],{"class":104},[77,3052,3053,3055,3057,3059],{"class":79,"line":143},[77,3054,1257],{"class":97},[77,3056,1296],{"class":104},[77,3058,1245],{"class":97},[77,3060,1301],{"class":104},[77,3062,3063,3065],{"class":79,"line":150},[77,3064,1245],{"class":97},[77,3066,1248],{"class":104},[77,3068,3069,3071,3073,3075],{"class":79,"line":162},[77,3070,1257],{"class":97},[77,3072,1308],{"class":104},[77,3074,1245],{"class":97},[77,3076,1313],{"class":104},[77,3078,3079],{"class":79,"line":174},[77,3080,140],{"emptyLinePlaceholder":139},[77,3082,3083,3085,3087],{"class":79,"line":179},[77,3084,1322],{"class":97},[77,3086,1325],{"class":83},[77,3088,1328],{"class":104},[77,3090,3091],{"class":79,"line":185},[77,3092,140],{"emptyLinePlaceholder":139},[77,3094,3095,3098,3100,3103,3105,3107,3110,3113,3116],{"class":79,"line":197},[77,3096,3097],{"class":104},"    use_sim_time_arg ",[77,3099,1336],{"class":97},[77,3101,3102],{"class":104}," DeclareLaunchArgument(",[77,3104,1342],{"class":87},[77,3106,1455],{"class":104},[77,3108,3109],{"class":1391},"default_value",[77,3111,3112],{"class":97}," =",[77,3114,3115],{"class":87}," 'false'",[77,3117,1345],{"class":104},[77,3119,3120,3123,3125,3127,3130,3132,3134,3136,3139],{"class":79,"line":1348},[77,3121,3122],{"class":104},"    resolution_arg ",[77,3124,1336],{"class":97},[77,3126,3102],{"class":104},[77,3128,3129],{"class":87},"'resolution'",[77,3131,1455],{"class":104},[77,3133,3109],{"class":1391},[77,3135,1336],{"class":97},[77,3137,3138],{"class":87},"'0.05'",[77,3140,1345],{"class":104},[77,3142,3143],{"class":79,"line":1363},[77,3144,140],{"emptyLinePlaceholder":139},[77,3146,3147,3150,3152],{"class":79,"line":1368},[77,3148,3149],{"class":104},"    cartographer_node ",[77,3151,1336],{"class":97},[77,3153,1488],{"class":104},[77,3155,3156,3158,3160,3163],{"class":79,"line":1379},[77,3157,1528],{"class":1391},[77,3159,3112],{"class":97},[77,3161,3162],{"class":87}," 'cartographer_ros'",[77,3164,1385],{"class":104},[77,3166,3167,3169,3171,3174],{"class":79,"line":1388},[77,3168,1541],{"class":1391},[77,3170,3112],{"class":97},[77,3172,3173],{"class":87}," 'cartographer_node'",[77,3175,1385],{"class":104},[77,3177,3178,3180,3182,3185,3187,3190,3192],{"class":79,"line":1402},[77,3179,1494],{"class":1391},[77,3181,3112],{"class":97},[77,3183,3184],{"class":104}," [{",[77,3186,1342],{"class":87},[77,3188,3189],{"class":104},": LaunchConfiguration(",[77,3191,1342],{"class":87},[77,3193,3194],{"class":104},")}],\n",[77,3196,3197,3200,3202],{"class":79,"line":1415},[77,3198,3199],{"class":1391},"        arguments",[77,3201,3112],{"class":97},[77,3203,3204],{"class":104}," [\n",[77,3206,3207,3210,3213,3216,3219,3222],{"class":79,"line":1425},[77,3208,3209],{"class":87},"            '-configuration_directory'",[77,3211,3212],{"class":104},", os.path.join(get_package_share_directory(",[77,3214,3215],{"class":87},"\"mycar_slam_cartographer\"",[77,3217,3218],{"class":104},"),",[77,3220,3221],{"class":87},"\"params\"",[77,3223,1446],{"class":104},[77,3225,3226,3229,3231,3234],{"class":79,"line":1433},[77,3227,3228],{"class":87},"            '-configuration_basename'",[77,3230,1455],{"class":104},[77,3232,3233],{"class":87},"'mycar.lua'",[77,3235,3236],{"class":104},"],\n",[77,3238,3239,3241,3243],{"class":79,"line":1449},[77,3240,1566],{"class":1391},[77,3242,3112],{"class":97},[77,3244,3245],{"class":87}," 'screen'\n",[77,3247,3248],{"class":79,"line":1463},[77,3249,3250],{"class":104},"    )\n",[77,3252,3253],{"class":79,"line":1475},[77,3254,140],{"emptyLinePlaceholder":139},[77,3256,3257,3260,3262],{"class":79,"line":1480},[77,3258,3259],{"class":104},"    cartographer_occupancy_grid_node ",[77,3261,1336],{"class":97},[77,3263,1488],{"class":104},[77,3265,3266,3268,3270,3272],{"class":79,"line":1491},[77,3267,1528],{"class":1391},[77,3269,3112],{"class":97},[77,3271,3162],{"class":87},[77,3273,1385],{"class":104},[77,3275,3276,3278,3280,3283],{"class":79,"line":1502},[77,3277,1541],{"class":1391},[77,3279,3112],{"class":97},[77,3281,3282],{"class":87}," 'cartographer_occupancy_grid_node'",[77,3284,1385],{"class":104},[77,3286,3287,3289,3291],{"class":79,"line":1508},[77,3288,1494],{"class":1391},[77,3290,3112],{"class":97},[77,3292,3204],{"class":104},[77,3294,3295,3298,3300,3302,3304],{"class":79,"line":1519},[77,3296,3297],{"class":104},"            {",[77,3299,1342],{"class":87},[77,3301,3189],{"class":104},[77,3303,1342],{"class":87},[77,3305,3306],{"class":104},")},\n",[77,3308,3309,3311,3313,3315,3317],{"class":79,"line":1525},[77,3310,3297],{"class":104},[77,3312,3129],{"class":87},[77,3314,3189],{"class":104},[77,3316,3129],{"class":87},[77,3318,3194],{"class":104},[77,3320,3321],{"class":79,"line":1538},[77,3322,3250],{"class":104},[77,3324,3325],{"class":79,"line":1551},[77,3326,140],{"emptyLinePlaceholder":139},[77,3328,3329,3331],{"class":79,"line":1563},[77,3330,1623],{"class":97},[77,3332,3333],{"class":104}," LaunchDescription([\n",[77,3335,3336],{"class":79,"line":1576},[77,3337,3338],{"class":104},"        use_sim_time_arg,\n",[77,3340,3341],{"class":79,"line":1581},[77,3342,3343],{"class":104},"        resolution_arg,\n",[77,3345,3346],{"class":79,"line":1592},[77,3347,3348],{"class":104},"        cartographer_node,\n",[77,3350,3351],{"class":79,"line":1597},[77,3352,3353],{"class":104},"        cartographer_occupancy_grid_node,\n",[77,3355,3356],{"class":79,"line":1603},[77,3357,3358],{"class":104},"    ])\n",[18,3360,3361],{},"该launch文件主要是加载了cartographer_ros下的cartographer_node与cartographer_occupancy_grid_node节点，并且会从当前功能包的params下读取一个名为mycar.lua的配置文件。这个配置文件还不存在，接下来需要在params目录下新建mycar.lua文件，并输入如下内容：",[68,3363,3367],{"className":3364,"code":3365,"language":3366,"meta":32,"style":32},"language-lua shiki shiki-themes github-light github-dark","include \"map_builder.lua\" -- 地图构建器\ninclude \"trajectory_builder.lua\" -- 轨迹构建器\n\noptions = {\n  map_builder = MAP_BUILDER,\n  trajectory_builder = TRAJECTORY_BUILDER,\n  map_frame = \"map\",  -- 地图坐标系\n  tracking_frame = \"base_link\", -- 跟踪的坐标系，可以是基坐标系、雷达或imu的坐标系\n  published_frame = \"odom\", -- cartographer发布的位姿（pose）的坐标系\n  odom_frame = \"carto_odom\",  -- cartographer 计算后优化的里程计，并非机器人本身里程计\n  provide_odom_frame = false, -- 是否发布cartographer的里程计\n  publish_frame_projected_to_2d = true, -- 是否转换成2d(无俯仰、滚动的情况下为 true)\n  use_odometry = true, -- 是否订阅里程计数据\n  use_nav_sat = false, -- 是否订阅GPS\n  use_landmarks = false, -- 是否订阅路标\n  num_laser_scans = 1, -- 订阅的雷达的数量\n  num_multi_echo_laser_scans = 0, -- 订阅的多层回波激光雷达数量\n  num_subdivisions_per_laser_scan = 1, -- 将激光雷达的数据拆分成多少部分发布\n  num_point_clouds = 0, -- 订阅多线激光雷达的数量\n  lookup_transform_timeout_sec = 1.5, -- 坐标变换超时时间\n  submap_publish_period_sec = 0.5, -- 发布子图的时间间隔\n  pose_publish_period_sec = 5e-3, -- 发布pose的时间间隔\n  trajectory_publish_period_sec = 30e-3, -- 发布轨迹的时间间隔\n  rangefinder_sampling_ratio = 1., -- 雷达采样比例\n  odometry_sampling_ratio = 0.8, -- 里程计采样比例(如果里程计精度低，可以减小该设置值)\n  fixed_frame_pose_sampling_ratio = 1., -- 参考坐标系采样比例\n  imu_sampling_ratio = 1.,-- imu采样比例\n  landmarks_sampling_ratio = 1., -- 路标采样比例\n}\n\nMAP_BUILDER.use_trajectory_builder_2d = true -- 启用2D轨迹构建器\n\nTRAJECTORY_BUILDER_2D.min_range = 0.15 -- 最小雷达有效距离\nTRAJECTORY_BUILDER_2D.max_range = 6.0 -- 最大雷达有效距离\nTRAJECTORY_BUILDER_2D.missing_data_ray_length = 3. -- 缺失数据的射线长度\nTRAJECTORY_BUILDER_2D.use_imu_data = false -- 是否使用 imu 数据\nTRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true -- 是否使用在线相关扫描匹配\nTRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) -- 运动滤波器的最大角度限制（以弧度为单位）\n\nPOSE_GRAPH.constraint_builder.min_score = 0.65 -- 建约束时的最小分数\nPOSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 -- 全局定位时的最小分数\n\n-- POSE_GRAPH.optimize_every_n_nodes = 0\n\nreturn options\n","lua",[74,3368,3369,3380,3390,3394,3404,3414,3424,3440,3455,3470,3485,3500,3515,3529,3543,3557,3572,3587,3601,3615,3630,3645,3660,3675,3690,3705,3719,3734,3748,3753,3757,3772,3776,3792,3807,3822,3836,3850,3878,3882,3903,3922,3926,3931,3935],{"__ignoreMap":32},[77,3370,3371,3374,3377],{"class":79,"line":80},[77,3372,3373],{"class":1217},"include",[77,3375,3376],{"class":87}," \"map_builder.lua\" ",[77,3378,3379],{"class":146},"-- 地图构建器\n",[77,3381,3382,3384,3387],{"class":79,"line":114},[77,3383,3373],{"class":1217},[77,3385,3386],{"class":87}," \"trajectory_builder.lua\" ",[77,3388,3389],{"class":146},"-- 轨迹构建器\n",[77,3391,3392],{"class":79,"line":136},[77,3393,140],{"emptyLinePlaceholder":139},[77,3395,3396,3399,3401],{"class":79,"line":143},[77,3397,3398],{"class":104},"options ",[77,3400,1336],{"class":97},[77,3402,3403],{"class":104}," {\n",[77,3405,3406,3409,3411],{"class":79,"line":150},[77,3407,3408],{"class":104},"  map_builder ",[77,3410,1336],{"class":97},[77,3412,3413],{"class":104}," MAP_BUILDER,\n",[77,3415,3416,3419,3421],{"class":79,"line":162},[77,3417,3418],{"class":104},"  trajectory_builder ",[77,3420,1336],{"class":97},[77,3422,3423],{"class":104}," TRAJECTORY_BUILDER,\n",[77,3425,3426,3429,3431,3434,3437],{"class":79,"line":174},[77,3427,3428],{"class":104},"  map_frame ",[77,3430,1336],{"class":97},[77,3432,3433],{"class":87}," \"map\"",[77,3435,3436],{"class":104},",  ",[77,3438,3439],{"class":146},"-- 地图坐标系\n",[77,3441,3442,3445,3447,3450,3452],{"class":79,"line":179},[77,3443,3444],{"class":104},"  tracking_frame ",[77,3446,1336],{"class":97},[77,3448,3449],{"class":87}," \"base_link\"",[77,3451,1455],{"class":104},[77,3453,3454],{"class":146},"-- 跟踪的坐标系，可以是基坐标系、雷达或imu的坐标系\n",[77,3456,3457,3460,3462,3465,3467],{"class":79,"line":185},[77,3458,3459],{"class":104},"  published_frame ",[77,3461,1336],{"class":97},[77,3463,3464],{"class":87}," \"odom\"",[77,3466,1455],{"class":104},[77,3468,3469],{"class":146},"-- cartographer发布的位姿（pose）的坐标系\n",[77,3471,3472,3475,3477,3480,3482],{"class":79,"line":197},[77,3473,3474],{"class":104},"  odom_frame ",[77,3476,1336],{"class":97},[77,3478,3479],{"class":87}," \"carto_odom\"",[77,3481,3436],{"class":104},[77,3483,3484],{"class":146},"-- cartographer 计算后优化的里程计，并非机器人本身里程计\n",[77,3486,3487,3490,3492,3495,3497],{"class":79,"line":1348},[77,3488,3489],{"class":104},"  provide_odom_frame ",[77,3491,1336],{"class":97},[77,3493,3494],{"class":1217}," false",[77,3496,1455],{"class":104},[77,3498,3499],{"class":146},"-- 是否发布cartographer的里程计\n",[77,3501,3502,3505,3507,3510,3512],{"class":79,"line":1363},[77,3503,3504],{"class":104},"  publish_frame_projected_to_2d ",[77,3506,1336],{"class":97},[77,3508,3509],{"class":1217}," true",[77,3511,1455],{"class":104},[77,3513,3514],{"class":146},"-- 是否转换成2d(无俯仰、滚动的情况下为 true)\n",[77,3516,3517,3520,3522,3524,3526],{"class":79,"line":1368},[77,3518,3519],{"class":104},"  use_odometry ",[77,3521,1336],{"class":97},[77,3523,3509],{"class":1217},[77,3525,1455],{"class":104},[77,3527,3528],{"class":146},"-- 是否订阅里程计数据\n",[77,3530,3531,3534,3536,3538,3540],{"class":79,"line":1379},[77,3532,3533],{"class":104},"  use_nav_sat ",[77,3535,1336],{"class":97},[77,3537,3494],{"class":1217},[77,3539,1455],{"class":104},[77,3541,3542],{"class":146},"-- 是否订阅GPS\n",[77,3544,3545,3548,3550,3552,3554],{"class":79,"line":1388},[77,3546,3547],{"class":104},"  use_landmarks ",[77,3549,1336],{"class":97},[77,3551,3494],{"class":1217},[77,3553,1455],{"class":104},[77,3555,3556],{"class":146},"-- 是否订阅路标\n",[77,3558,3559,3562,3564,3567,3569],{"class":79,"line":1402},[77,3560,3561],{"class":104},"  num_laser_scans ",[77,3563,1336],{"class":97},[77,3565,3566],{"class":1217}," 1",[77,3568,1455],{"class":104},[77,3570,3571],{"class":146},"-- 订阅的雷达的数量\n",[77,3573,3574,3577,3579,3582,3584],{"class":79,"line":1415},[77,3575,3576],{"class":104},"  num_multi_echo_laser_scans ",[77,3578,1336],{"class":97},[77,3580,3581],{"class":1217}," 0",[77,3583,1455],{"class":104},[77,3585,3586],{"class":146},"-- 订阅的多层回波激光雷达数量\n",[77,3588,3589,3592,3594,3596,3598],{"class":79,"line":1425},[77,3590,3591],{"class":104},"  num_subdivisions_per_laser_scan ",[77,3593,1336],{"class":97},[77,3595,3566],{"class":1217},[77,3597,1455],{"class":104},[77,3599,3600],{"class":146},"-- 将激光雷达的数据拆分成多少部分发布\n",[77,3602,3603,3606,3608,3610,3612],{"class":79,"line":1433},[77,3604,3605],{"class":104},"  num_point_clouds ",[77,3607,1336],{"class":97},[77,3609,3581],{"class":1217},[77,3611,1455],{"class":104},[77,3613,3614],{"class":146},"-- 订阅多线激光雷达的数量\n",[77,3616,3617,3620,3622,3625,3627],{"class":79,"line":1449},[77,3618,3619],{"class":104},"  lookup_transform_timeout_sec ",[77,3621,1336],{"class":97},[77,3623,3624],{"class":1217}," 1.5",[77,3626,1455],{"class":104},[77,3628,3629],{"class":146},"-- 坐标变换超时时间\n",[77,3631,3632,3635,3637,3640,3642],{"class":79,"line":1463},[77,3633,3634],{"class":104},"  submap_publish_period_sec ",[77,3636,1336],{"class":97},[77,3638,3639],{"class":1217}," 0.5",[77,3641,1455],{"class":104},[77,3643,3644],{"class":146},"-- 发布子图的时间间隔\n",[77,3646,3647,3650,3652,3655,3657],{"class":79,"line":1475},[77,3648,3649],{"class":104},"  pose_publish_period_sec ",[77,3651,1336],{"class":97},[77,3653,3654],{"class":1217}," 5e-3",[77,3656,1455],{"class":104},[77,3658,3659],{"class":146},"-- 发布pose的时间间隔\n",[77,3661,3662,3665,3667,3670,3672],{"class":79,"line":1480},[77,3663,3664],{"class":104},"  trajectory_publish_period_sec ",[77,3666,1336],{"class":97},[77,3668,3669],{"class":1217}," 30e-3",[77,3671,1455],{"class":104},[77,3673,3674],{"class":146},"-- 发布轨迹的时间间隔\n",[77,3676,3677,3680,3682,3685,3687],{"class":79,"line":1491},[77,3678,3679],{"class":104},"  rangefinder_sampling_ratio ",[77,3681,1336],{"class":97},[77,3683,3684],{"class":1217}," 1.",[77,3686,1455],{"class":104},[77,3688,3689],{"class":146},"-- 雷达采样比例\n",[77,3691,3692,3695,3697,3700,3702],{"class":79,"line":1502},[77,3693,3694],{"class":104},"  odometry_sampling_ratio ",[77,3696,1336],{"class":97},[77,3698,3699],{"class":1217}," 0.8",[77,3701,1455],{"class":104},[77,3703,3704],{"class":146},"-- 里程计采样比例(如果里程计精度低，可以减小该设置值)\n",[77,3706,3707,3710,3712,3714,3716],{"class":79,"line":1508},[77,3708,3709],{"class":104},"  fixed_frame_pose_sampling_ratio ",[77,3711,1336],{"class":97},[77,3713,3684],{"class":1217},[77,3715,1455],{"class":104},[77,3717,3718],{"class":146},"-- 参考坐标系采样比例\n",[77,3720,3721,3724,3726,3728,3731],{"class":79,"line":1519},[77,3722,3723],{"class":104},"  imu_sampling_ratio ",[77,3725,1336],{"class":97},[77,3727,3684],{"class":1217},[77,3729,3730],{"class":104},",",[77,3732,3733],{"class":146},"-- imu采样比例\n",[77,3735,3736,3739,3741,3743,3745],{"class":79,"line":1525},[77,3737,3738],{"class":104},"  landmarks_sampling_ratio ",[77,3740,1336],{"class":97},[77,3742,3684],{"class":1217},[77,3744,1455],{"class":104},[77,3746,3747],{"class":146},"-- 路标采样比例\n",[77,3749,3750],{"class":79,"line":1538},[77,3751,3752],{"class":104},"}\n",[77,3754,3755],{"class":79,"line":1551},[77,3756,140],{"emptyLinePlaceholder":139},[77,3758,3759,3762,3765,3767,3769],{"class":79,"line":1563},[77,3760,3761],{"class":104},"MAP_BUILDER.",[77,3763,3764],{"class":83},"use_trajectory_builder_2d",[77,3766,3112],{"class":97},[77,3768,3509],{"class":1217},[77,3770,3771],{"class":146}," -- 启用2D轨迹构建器\n",[77,3773,3774],{"class":79,"line":1576},[77,3775,140],{"emptyLinePlaceholder":139},[77,3777,3778,3781,3784,3786,3789],{"class":79,"line":1581},[77,3779,3780],{"class":104},"TRAJECTORY_BUILDER_2D.",[77,3782,3783],{"class":83},"min_range",[77,3785,3112],{"class":97},[77,3787,3788],{"class":1217}," 0.15",[77,3790,3791],{"class":146}," -- 最小雷达有效距离\n",[77,3793,3794,3796,3799,3801,3804],{"class":79,"line":1592},[77,3795,3780],{"class":104},[77,3797,3798],{"class":83},"max_range",[77,3800,3112],{"class":97},[77,3802,3803],{"class":1217}," 6.0",[77,3805,3806],{"class":146}," -- 最大雷达有效距离\n",[77,3808,3809,3811,3814,3816,3819],{"class":79,"line":1597},[77,3810,3780],{"class":104},[77,3812,3813],{"class":83},"missing_data_ray_length",[77,3815,3112],{"class":97},[77,3817,3818],{"class":1217}," 3.",[77,3820,3821],{"class":146}," -- 缺失数据的射线长度\n",[77,3823,3824,3826,3829,3831,3833],{"class":79,"line":1603},[77,3825,3780],{"class":104},[77,3827,3828],{"class":83},"use_imu_data",[77,3830,3112],{"class":97},[77,3832,3494],{"class":1217},[77,3834,3835],{"class":146}," -- 是否使用 imu 数据\n",[77,3837,3838,3840,3843,3845,3847],{"class":79,"line":1609},[77,3839,3780],{"class":104},[77,3841,3842],{"class":83},"use_online_correlative_scan_matching",[77,3844,3112],{"class":97},[77,3846,3509],{"class":1217},[77,3848,3849],{"class":146}," -- 是否使用在线相关扫描匹配\n",[77,3851,3852,3854,3857,3859,3862,3864,3867,3870,3872,3875],{"class":79,"line":1615},[77,3853,3780],{"class":104},[77,3855,3856],{"class":83},"motion_filter",[77,3858,2350],{"class":104},[77,3860,3861],{"class":83},"max_angle_radians",[77,3863,3112],{"class":97},[77,3865,3866],{"class":1217}," math.rad",[77,3868,3869],{"class":104},"(",[77,3871,1987],{"class":1217},[77,3873,3874],{"class":104},") ",[77,3876,3877],{"class":146},"-- 运动滤波器的最大角度限制（以弧度为单位）\n",[77,3879,3880],{"class":79,"line":1620},[77,3881,140],{"emptyLinePlaceholder":139},[77,3883,3884,3887,3890,3892,3895,3897,3900],{"class":79,"line":2003},[77,3885,3886],{"class":104},"POSE_GRAPH.",[77,3888,3889],{"class":83},"constraint_builder",[77,3891,2350],{"class":104},[77,3893,3894],{"class":83},"min_score",[77,3896,3112],{"class":97},[77,3898,3899],{"class":1217}," 0.65",[77,3901,3902],{"class":146}," -- 建约束时的最小分数\n",[77,3904,3905,3907,3909,3911,3914,3916,3919],{"class":79,"line":2014},[77,3906,3886],{"class":104},[77,3908,3889],{"class":83},[77,3910,2350],{"class":104},[77,3912,3913],{"class":83},"global_localization_min_score",[77,3915,3112],{"class":97},[77,3917,3918],{"class":1217}," 0.7",[77,3920,3921],{"class":146}," -- 全局定位时的最小分数\n",[77,3923,3924],{"class":79,"line":2027},[77,3925,140],{"emptyLinePlaceholder":139},[77,3927,3928],{"class":79,"line":2041},[77,3929,3930],{"class":146},"-- POSE_GRAPH.optimize_every_n_nodes = 0\n",[77,3932,3933],{"class":79,"line":2054},[77,3934,140],{"emptyLinePlaceholder":139},[77,3936,3937,3940],{"class":79,"line":2068},[77,3938,3939],{"class":97},"return",[77,3941,3942],{"class":104}," options\n",[18,3944,2264],{},[312,3946,3947],{"start":136},[49,3948,2269],{},[18,3950,2272,3951,2276],{},[74,3952,2275],{},[68,3954,3955],{"className":2279,"code":2280,"language":2281,"meta":32,"style":32},[74,3956,3957,3963,3969],{"__ignoreMap":32},[77,3958,3959,3961],{"class":79,"line":80},[77,3960,2288],{"class":97},[77,3962,2291],{"class":104},[77,3964,3965,3967],{"class":79,"line":114},[77,3966,2296],{"class":104},[77,3968,2299],{"class":97},[77,3970,3971],{"class":79,"line":136},[77,3972,1345],{"class":104},[312,3974,3975],{"start":143},[49,3976,2308],{},[18,3978,2311],{},[68,3980,3982],{"className":70,"code":3981,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_slam_cartographer\n",[74,3983,3984],{"__ignoreMap":32},[77,3985,3986,3988,3990,3992],{"class":79,"line":80},[77,3987,2321],{"class":83},[77,3989,2324],{"class":87},[77,3991,2327],{"class":1217},[77,3993,3994],{"class":87}," mycar_slam_cartographer\n",[312,3996,3997],{"start":150},[49,3998,2335],{},[18,4000,4001],{},"（1）请先调用如下指令启动仿真环境：",[68,4003,4004],{"className":70,"code":2343,"language":72,"meta":32,"style":32},[74,4005,4006,4012],{"__ignoreMap":32},[77,4007,4008,4010],{"class":79,"line":80},[77,4009,2350],{"class":1217},[77,4011,2353],{"class":87},[77,4013,4014,4016,4018,4020],{"class":79,"line":114},[77,4015,1205],{"class":83},[77,4017,2360],{"class":87},[77,4019,2363],{"class":87},[77,4021,2366],{"class":87},[18,4023,4024],{},"（2）然后在终端下进入当前工作空间，输入如下指令：",[68,4026,4028],{"className":70,"code":4027,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_slam_cartographer cartographer.launch.py use_sim_time:=True\n",[74,4029,4030,4036],{"__ignoreMap":32},[77,4031,4032,4034],{"class":79,"line":80},[77,4033,2350],{"class":1217},[77,4035,2353],{"class":87},[77,4037,4038,4040,4042,4044,4047],{"class":79,"line":114},[77,4039,1205],{"class":83},[77,4041,2360],{"class":87},[77,4043,3001],{"class":87},[77,4045,4046],{"class":87}," cartographer.launch.py",[77,4048,2396],{"class":87},[18,4050,4051],{},"（3）启动rviz2，将Fixed Frame设置为map，添加map插件并将话题设置为/map，即可显示创建的地图了，当机器人运动时，地图也会随之更新。",[18,4053,4054],{},[30,4055],{"alt":32,"src":4056},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1749.webp",[18,4058,4059],{},[30,4060],{"alt":32,"src":4061},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1750.webp",[18,4063,4064],{},[30,4065],{"alt":32,"src":4066},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1751.webp",[10,4068,4069],{"id":4069},"地图服务",[18,4071,4072,4073,4076],{},"SLAM建图时，地图数据是保存在内存中的，这也意味着，一旦节点关闭，数据也会一并被释放，而更合理的实现应该是将构建的地图序列化到的磁盘以持久化存储，并且后期还要通过反序列化读取磁盘的地图数据以做其他操作。在Nav2中已经已经封装好了地图序列化和反序列化的相关功能包，该包是：",[74,4074,4075],{},"nav2_map_server","。",[18,4078,4079,4080,4082,4083,4085,4086,2677,4089,4092,4093,4095,4096,4098],{},"在",[74,4081,4075],{},"中，可以通过话题和服务接口与Nav2系统的其余部分进行交互。",[74,4084,4075],{},"包下有两个重要的节点，分别是",[74,4087,4088],{},"map_saver_cli",[74,4090,4091],{},"map_server","，通过",[74,4094,4088],{},"节点则可以保存地图，而",[74,4097,4091],{},"节点则可以在启动时显示地图。",[14,4100,4102],{"id":4101},"保存地图序列化","保存地图(序列化)",[4104,4105,4106],"h5",{"id":4106},"地图保存节点说明",[18,4108,4079,4109,4111,4112,4115],{},[74,4110,4075],{},"中的地图保存节点是",[74,4113,4114],{},"map_saver_server","，该节点相关信息如下。",[312,4117,4118],{},[49,4119,533],{},[535,4121,4122,4133],{},[538,4123,4124],{},[541,4125,4126,4128,4131],{},[544,4127,547],{"align":546},[544,4129,4130],{"align":546},"接口",[544,4132,553],{"align":546},[555,4134,4135],{},[541,4136,4137,4139,4141],{},[560,4138,687],{"align":546},[560,4140,690],{"align":546},[560,4142,4143],{"align":546},"SLAM节点发布的地图数据",[312,4145,4146],{"start":114},[49,4147,827],{},[46,4149,4150,4156,4162,4168],{},[49,4151,4152,4155],{},[21,4153,4154],{},"save_map_timeout","  保存地图操作的最大等待时间。",[49,4157,4158,4161],{},[21,4159,4160],{},"free_thresh_default","  栅格单元被认为未被占用的概率阈值。",[49,4163,4164,4167],{},[21,4165,4166],{},"occupied_thresh_default","  栅格单元被认为占用的概率阈值。",[49,4169,4170,4173],{},[21,4171,4172],{},"map_subscribe_transient_local","  节点重启后消息不保留，默认为 true。",[312,4175,4176],{"start":136},[49,4177,4088],{},[18,4179,4180,4181,4183,4184,4186,4187,4189],{},"另外，而为了便于使用，在",[74,4182,4114],{},"的基础之上还封装了一个名为",[74,4185,4088],{},"的可执行程序，它可以以实参的方式更方便的设置地图保存相关数据，并且后续执行时也是调用",[74,4188,4088],{},"，其实参列表如下：",[46,4191,4192,4198,4204,4210,4216,4222],{},[49,4193,4194,4197],{},[21,4195,4196],{},"-t"," 订阅的地图话题。",[49,4199,4200,4203],{},[21,4201,4202],{},"-f"," 地图存储路径。",[49,4205,4206,4209],{},[21,4207,4208],{},"--occ"," 栅格单元被认为占用的概率阈值。",[49,4211,4212,4215],{},[21,4213,4214],{},"--free"," 栅格单元被认为未被占用的概率阈值。",[49,4217,4218,4221],{},[21,4219,4220],{},"--fmt"," 图片格式。",[49,4223,4224,4227],{},[21,4225,4226],{},"--mode"," 地图模式，trinary(默认)或scale或raw。",[4104,4229,4230],{"id":4230},"地图保存基本操作",[18,4232,4233],{},[21,4234,1192],{},[18,4236,4237],{},"请先启动仿真或实体机器人，然后启动SLAM相关节点，实现基本的建图功能。",[18,4239,4240],{},[21,4241,4242],{},"保存地图",[18,4244,4245],{},"SLAM建图完毕，在终端下进入工作空间，调用如下指令保存地图：",[68,4247,4249],{"className":70,"code":4248,"language":72,"meta":32,"style":32},"ros2 run nav2_map_server map_saver_cli -f map/my_map\n",[74,4250,4251],{"__ignoreMap":32},[77,4252,4253,4255,4258,4261,4264,4267],{"class":79,"line":80},[77,4254,1205],{"class":83},[77,4256,4257],{"class":87}," run",[77,4259,4260],{"class":87}," nav2_map_server",[77,4262,4263],{"class":87}," map_saver_cli",[77,4265,4266],{"class":1217}," -f",[77,4268,4269],{"class":87}," map/my_map\n",[18,4271,4272,4273,4277,4278,2677,4281,4076],{},"上述指令将订阅/map话题，并把/map话题里的数据保存为文件，在工作空间下的map目录(",[4274,4275,4276],"em",{},"需要自行创建该目录，否则将会抛出异常",")中，生成两个文件，分别名为：",[74,4279,4280],{},"my_map.yaml",[74,4282,4283],{},"my_map.pgm",[18,4285,4286],{},[30,4287],{"alt":32,"src":4288},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1752.webp",[18,4290,4291],{},[30,4292],{"alt":32,"src":4293},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1753.webp",[4104,4295,4296],{"id":4296},"地图接口",[18,4298,4299],{},"在Nav2中地图相关的接口主要有两个：",[46,4301,4302,4308],{},[49,4303,4304,4307],{},[21,4305,4306],{},"nav_msgs/msg/MapMetaData"," 地图元数据，包括地图的宽度、高度、分辨率等。",[49,4309,4310,4312],{},[21,4311,690],{}," 地图栅格数据，一般会在rviz中以图形化的方式显示。",[18,4314,4315],{},[21,4316,4306],{},[18,4318,4319,4320,4323],{},"调用指令",[74,4321,4322],{},"ros2 interface show nav_msgs/msg/MapMetaData","查看接口格式，显示如下内容（注释已汉化）：",[68,4325,4327],{"className":70,"code":4326,"language":72,"meta":32,"style":32},"\n# 它包含了关于OccupancyGrid特性的基本信息\n\n# 地图加载时间\nbuiltin_interfaces/Time map_load_time\n        int32 sec\n        uint32 nanosec\n\n# 地图分辨率 [米/像素]\nfloat32 resolution\n\n# 地图宽度 [像素]\nuint32 width\n\n# 地图高度 [像素]\nuint32 height\n\n#地图的原点坐标[米，米，弧度]。这是地图中单元格(0,0)左下角在现实世界中的位置和方向。\ngeometry_msgs/Pose origin\n        Point position\n                float64 x\n                float64 y\n                float64 z\n        Quaternion orientation\n                float64 x 0\n                float64 y 0\n                float64 z 0\n                float64 w 1\n",[74,4328,4329,4333,4338,4342,4347,4355,4363,4371,4375,4380,4388,4392,4397,4405,4409,4414,4421,4425,4430,4438,4446,4454,4461,4468,4476,4486,4495,4504],{"__ignoreMap":32},[77,4330,4331],{"class":79,"line":80},[77,4332,140],{"emptyLinePlaceholder":139},[77,4334,4335],{"class":79,"line":114},[77,4336,4337],{"class":146},"# 它包含了关于OccupancyGrid特性的基本信息\n",[77,4339,4340],{"class":79,"line":136},[77,4341,140],{"emptyLinePlaceholder":139},[77,4343,4344],{"class":79,"line":143},[77,4345,4346],{"class":146},"# 地图加载时间\n",[77,4348,4349,4352],{"class":79,"line":150},[77,4350,4351],{"class":83},"builtin_interfaces/Time",[77,4353,4354],{"class":87}," map_load_time\n",[77,4356,4357,4360],{"class":79,"line":162},[77,4358,4359],{"class":83},"        int32",[77,4361,4362],{"class":87}," sec\n",[77,4364,4365,4368],{"class":79,"line":174},[77,4366,4367],{"class":83},"        uint32",[77,4369,4370],{"class":87}," nanosec\n",[77,4372,4373],{"class":79,"line":179},[77,4374,140],{"emptyLinePlaceholder":139},[77,4376,4377],{"class":79,"line":185},[77,4378,4379],{"class":146},"# 地图分辨率 [米/像素]\n",[77,4381,4382,4385],{"class":79,"line":197},[77,4383,4384],{"class":83},"float32",[77,4386,4387],{"class":87}," resolution\n",[77,4389,4390],{"class":79,"line":1348},[77,4391,140],{"emptyLinePlaceholder":139},[77,4393,4394],{"class":79,"line":1363},[77,4395,4396],{"class":146},"# 地图宽度 [像素]\n",[77,4398,4399,4402],{"class":79,"line":1368},[77,4400,4401],{"class":83},"uint32",[77,4403,4404],{"class":87}," width\n",[77,4406,4407],{"class":79,"line":1379},[77,4408,140],{"emptyLinePlaceholder":139},[77,4410,4411],{"class":79,"line":1388},[77,4412,4413],{"class":146},"# 地图高度 [像素]\n",[77,4415,4416,4418],{"class":79,"line":1402},[77,4417,4401],{"class":83},[77,4419,4420],{"class":87}," height\n",[77,4422,4423],{"class":79,"line":1415},[77,4424,140],{"emptyLinePlaceholder":139},[77,4426,4427],{"class":79,"line":1425},[77,4428,4429],{"class":146},"#地图的原点坐标[米，米，弧度]。这是地图中单元格(0,0)左下角在现实世界中的位置和方向。\n",[77,4431,4432,4435],{"class":79,"line":1433},[77,4433,4434],{"class":83},"geometry_msgs/Pose",[77,4436,4437],{"class":87}," origin\n",[77,4439,4440,4443],{"class":79,"line":1449},[77,4441,4442],{"class":83},"        Point",[77,4444,4445],{"class":87}," position\n",[77,4447,4448,4451],{"class":79,"line":1463},[77,4449,4450],{"class":83},"                float64",[77,4452,4453],{"class":87}," x\n",[77,4455,4456,4458],{"class":79,"line":1475},[77,4457,4450],{"class":83},[77,4459,4460],{"class":87}," y\n",[77,4462,4463,4465],{"class":79,"line":1480},[77,4464,4450],{"class":83},[77,4466,4467],{"class":87}," z\n",[77,4469,4470,4473],{"class":79,"line":1491},[77,4471,4472],{"class":83},"        Quaternion",[77,4474,4475],{"class":87}," orientation\n",[77,4477,4478,4480,4483],{"class":79,"line":1502},[77,4479,4450],{"class":83},[77,4481,4482],{"class":87}," x",[77,4484,4485],{"class":1217}," 0\n",[77,4487,4488,4490,4493],{"class":79,"line":1508},[77,4489,4450],{"class":83},[77,4491,4492],{"class":87}," y",[77,4494,4485],{"class":1217},[77,4496,4497,4499,4502],{"class":79,"line":1519},[77,4498,4450],{"class":83},[77,4500,4501],{"class":87}," z",[77,4503,4485],{"class":1217},[77,4505,4506,4508,4511],{"class":79,"line":1525},[77,4507,4450],{"class":83},[77,4509,4510],{"class":87}," w",[77,4512,4513],{"class":1217}," 1\n",[18,4515,4516],{},[21,4517,690],{},[18,4519,4319,4520,4323],{},[74,4521,4522],{},"ros2 interface show nav_msgs/msg/OccupancyGrid",[68,4524,4526],{"className":70,"code":4525,"language":72,"meta":32,"style":32},"\n# 它代表一个二维网格地图。\nstd_msgs/Header header\n        builtin_interfaces/Time stamp\n                int32 sec\n                uint32 nanosec\n        string frame_id\n\n# 地图元数据\nMapMetaData info\n        builtin_interfaces/Time map_load_time\n                int32 sec\n                uint32 nanosec\n        float32 resolution\n        uint32 width\n        uint32 height\n        geometry_msgs/Pose origin\n                Point position\n                        float64 x\n                        float64 y\n                        float64 z\n                Quaternion orientation\n                        float64 x 0\n                        float64 y 0\n                        float64 z 0\n                        float64 w 1\n\n# 地图数据按照行优先的顺序进行排列，\n\n# 这意味着首先填充第一行的所有单元格，\n\n# 然后填充第二行，依此类推。\n\n# 起始单元格是(0,0)，也就是地图的左上角。\n\n# 单元格(1, 0)紧接着(0,0)，是x方向上紧邻的下一个单元格。\n\n# 而单元格(0, 1)则位于第一行的第二个位置，其索引等于地图的宽度（info.width），\n\n# 然后才是(1, 1)单元格，即第二行的第二个单元格。\n\n# 关于地图数据的值，它们根据具体的应用需求来定义。但在很多情况下，\n\n# 会使用0表示该单元格是未占用的，即机器人可以安全通过；\n\n# 1表示该单元格是确定占用的，即存在障碍物；\n\n# 而-1表示该单元格的状态是未知的，即机器人尚未探测到该区域的状态。\nint8[] data\n",[74,4527,4528,4532,4537,4545,4553,4560,4567,4575,4579,4584,4592,4598,4604,4610,4617,4623,4629,4636,4643,4650,4656,4662,4669,4677,4685,4693,4701,4705,4710,4714,4719,4723,4728,4732,4737,4741,4746,4750,4755,4759,4764,4768,4773,4777,4782,4786,4791,4795,4800],{"__ignoreMap":32},[77,4529,4530],{"class":79,"line":80},[77,4531,140],{"emptyLinePlaceholder":139},[77,4533,4534],{"class":79,"line":114},[77,4535,4536],{"class":146},"# 它代表一个二维网格地图。\n",[77,4538,4539,4542],{"class":79,"line":136},[77,4540,4541],{"class":83},"std_msgs/Header",[77,4543,4544],{"class":87}," header\n",[77,4546,4547,4550],{"class":79,"line":143},[77,4548,4549],{"class":83},"        builtin_interfaces/Time",[77,4551,4552],{"class":87}," stamp\n",[77,4554,4555,4558],{"class":79,"line":150},[77,4556,4557],{"class":83},"                int32",[77,4559,4362],{"class":87},[77,4561,4562,4565],{"class":79,"line":162},[77,4563,4564],{"class":83},"                uint32",[77,4566,4370],{"class":87},[77,4568,4569,4572],{"class":79,"line":174},[77,4570,4571],{"class":83},"        string",[77,4573,4574],{"class":87}," frame_id\n",[77,4576,4577],{"class":79,"line":179},[77,4578,140],{"emptyLinePlaceholder":139},[77,4580,4581],{"class":79,"line":185},[77,4582,4583],{"class":146},"# 地图元数据\n",[77,4585,4586,4589],{"class":79,"line":197},[77,4587,4588],{"class":83},"MapMetaData",[77,4590,4591],{"class":87}," info\n",[77,4593,4594,4596],{"class":79,"line":1348},[77,4595,4549],{"class":83},[77,4597,4354],{"class":87},[77,4599,4600,4602],{"class":79,"line":1363},[77,4601,4557],{"class":83},[77,4603,4362],{"class":87},[77,4605,4606,4608],{"class":79,"line":1368},[77,4607,4564],{"class":83},[77,4609,4370],{"class":87},[77,4611,4612,4615],{"class":79,"line":1379},[77,4613,4614],{"class":83},"        float32",[77,4616,4387],{"class":87},[77,4618,4619,4621],{"class":79,"line":1388},[77,4620,4367],{"class":83},[77,4622,4404],{"class":87},[77,4624,4625,4627],{"class":79,"line":1402},[77,4626,4367],{"class":83},[77,4628,4420],{"class":87},[77,4630,4631,4634],{"class":79,"line":1415},[77,4632,4633],{"class":83},"        geometry_msgs/Pose",[77,4635,4437],{"class":87},[77,4637,4638,4641],{"class":79,"line":1425},[77,4639,4640],{"class":83},"                Point",[77,4642,4445],{"class":87},[77,4644,4645,4648],{"class":79,"line":1433},[77,4646,4647],{"class":83},"                        float64",[77,4649,4453],{"class":87},[77,4651,4652,4654],{"class":79,"line":1449},[77,4653,4647],{"class":83},[77,4655,4460],{"class":87},[77,4657,4658,4660],{"class":79,"line":1463},[77,4659,4647],{"class":83},[77,4661,4467],{"class":87},[77,4663,4664,4667],{"class":79,"line":1475},[77,4665,4666],{"class":83},"                Quaternion",[77,4668,4475],{"class":87},[77,4670,4671,4673,4675],{"class":79,"line":1480},[77,4672,4647],{"class":83},[77,4674,4482],{"class":87},[77,4676,4485],{"class":1217},[77,4678,4679,4681,4683],{"class":79,"line":1491},[77,4680,4647],{"class":83},[77,4682,4492],{"class":87},[77,4684,4485],{"class":1217},[77,4686,4687,4689,4691],{"class":79,"line":1502},[77,4688,4647],{"class":83},[77,4690,4501],{"class":87},[77,4692,4485],{"class":1217},[77,4694,4695,4697,4699],{"class":79,"line":1508},[77,4696,4647],{"class":83},[77,4698,4510],{"class":87},[77,4700,4513],{"class":1217},[77,4702,4703],{"class":79,"line":1519},[77,4704,140],{"emptyLinePlaceholder":139},[77,4706,4707],{"class":79,"line":1525},[77,4708,4709],{"class":146},"# 地图数据按照行优先的顺序进行排列，\n",[77,4711,4712],{"class":79,"line":1538},[77,4713,140],{"emptyLinePlaceholder":139},[77,4715,4716],{"class":79,"line":1551},[77,4717,4718],{"class":146},"# 这意味着首先填充第一行的所有单元格，\n",[77,4720,4721],{"class":79,"line":1563},[77,4722,140],{"emptyLinePlaceholder":139},[77,4724,4725],{"class":79,"line":1576},[77,4726,4727],{"class":146},"# 然后填充第二行，依此类推。\n",[77,4729,4730],{"class":79,"line":1581},[77,4731,140],{"emptyLinePlaceholder":139},[77,4733,4734],{"class":79,"line":1592},[77,4735,4736],{"class":146},"# 起始单元格是(0,0)，也就是地图的左上角。\n",[77,4738,4739],{"class":79,"line":1597},[77,4740,140],{"emptyLinePlaceholder":139},[77,4742,4743],{"class":79,"line":1603},[77,4744,4745],{"class":146},"# 单元格(1, 0)紧接着(0,0)，是x方向上紧邻的下一个单元格。\n",[77,4747,4748],{"class":79,"line":1609},[77,4749,140],{"emptyLinePlaceholder":139},[77,4751,4752],{"class":79,"line":1615},[77,4753,4754],{"class":146},"# 而单元格(0, 1)则位于第一行的第二个位置，其索引等于地图的宽度（info.width），\n",[77,4756,4757],{"class":79,"line":1620},[77,4758,140],{"emptyLinePlaceholder":139},[77,4760,4761],{"class":79,"line":2003},[77,4762,4763],{"class":146},"# 然后才是(1, 1)单元格，即第二行的第二个单元格。\n",[77,4765,4766],{"class":79,"line":2014},[77,4767,140],{"emptyLinePlaceholder":139},[77,4769,4770],{"class":79,"line":2027},[77,4771,4772],{"class":146},"# 关于地图数据的值，它们根据具体的应用需求来定义。但在很多情况下，\n",[77,4774,4775],{"class":79,"line":2041},[77,4776,140],{"emptyLinePlaceholder":139},[77,4778,4779],{"class":79,"line":2054},[77,4780,4781],{"class":146},"# 会使用0表示该单元格是未占用的，即机器人可以安全通过；\n",[77,4783,4784],{"class":79,"line":2068},[77,4785,140],{"emptyLinePlaceholder":139},[77,4787,4788],{"class":79,"line":2079},[77,4789,4790],{"class":146},"# 1表示该单元格是确定占用的，即存在障碍物；\n",[77,4792,4793],{"class":79,"line":2084},[77,4794,140],{"emptyLinePlaceholder":139},[77,4796,4797],{"class":79,"line":2094},[77,4798,4799],{"class":146},"# 而-1表示该单元格的状态是未知的，即机器人尚未探测到该区域的状态。\n",[77,4801,4802,4805],{"class":79,"line":2105},[77,4803,4804],{"class":83},"int8[]",[77,4806,4807],{"class":87}," data\n",[4104,4809,4810],{"id":4810},"地图存储格式",[18,4812,4813,4814,4816],{},"在 ",[21,4815,4230],{},"  一节中，地图保存后后生成两个文件，这两个文件就是用来存储序列化后的地图数据的。其中，my_map.pgm是一张图片资源，使用图片查看程序打开即可，而my_map.yaml保存的是地图的元数据信息，用于描述图片，内容格式如下：",[68,4818,4820],{"className":1639,"code":4819,"language":1641,"meta":32,"style":32},"image: my_map.pgm\nmode: trinary\nresolution: 0.05\norigin: [-0.955, -10.9, 0]\nnegate: 0\noccupied_thresh: 0.65\nfree_thresh: 0.25\n",[74,4821,4822,4832,4841,4849,4873,4883,4893],{"__ignoreMap":32},[77,4823,4824,4827,4829],{"class":79,"line":80},[77,4825,4826],{"class":1648},"image",[77,4828,1666],{"class":104},[77,4830,4831],{"class":87},"my_map.pgm\n",[77,4833,4834,4836,4838],{"class":79,"line":114},[77,4835,875],{"class":1648},[77,4837,1666],{"class":104},[77,4839,4840],{"class":87},"trinary\n",[77,4842,4843,4845,4847],{"class":79,"line":136},[77,4844,982],{"class":1648},[77,4846,1666],{"class":104},[77,4848,1852],{"class":1217},[77,4850,4851,4854,4857,4860,4862,4865,4867,4870],{"class":79,"line":143},[77,4852,4853],{"class":1648},"origin",[77,4855,4856],{"class":104},": [",[77,4858,4859],{"class":1217},"-0.955",[77,4861,1455],{"class":104},[77,4863,4864],{"class":1217},"-10.9",[77,4866,1455],{"class":104},[77,4868,4869],{"class":1217},"0",[77,4871,4872],{"class":104},"]\n",[77,4874,4875,4878,4880],{"class":79,"line":150},[77,4876,4877],{"class":1648},"negate",[77,4879,1666],{"class":104},[77,4881,4882],{"class":1217},"0\n",[77,4884,4885,4888,4890],{"class":79,"line":162},[77,4886,4887],{"class":1648},"occupied_thresh",[77,4889,1666],{"class":104},[77,4891,4892],{"class":1217},"0.65\n",[77,4894,4895,4898,4900],{"class":79,"line":174},[77,4896,4897],{"class":1648},"free_thresh",[77,4899,1666],{"class":104},[77,4901,4902],{"class":1217},"0.25\n",[18,4904,4905],{},[21,4906,4907],{},"参数解释：",[46,4909,4910,4915,4920,4925,4930,4935,4940],{},[49,4911,4912,4914],{},[21,4913,4826],{},"  被描述的图片资源路径，可以是绝对路径也可以是相对路径。",[49,4916,4917,4919],{},[21,4918,982],{}," 图片分片率(单位: m/像素)。",[49,4921,4922,4924],{},[21,4923,4853],{}," 地图中左下像素的二维姿态，为（x，y，z），偏航为逆时针旋转（偏航=0 表示无旋转）。",[49,4926,4927,4929],{},[21,4928,4887],{}," 占用概率大于此阈值的像素被视为完全占用。",[49,4931,4932,4934],{},[21,4933,4897],{}," 占用率小于此阈值的像素被视为完全空闲。",[49,4936,4937,4939],{},[21,4938,4877],{}," 是否应该颠倒白色/黑色 自由/占用的语义。",[49,4941,4942,4944],{},[21,4943,875],{},"  地图模式，trinary(默认)或scale或raw。",[14,4946,4948],{"id":4947},"读取地图反序列化","读取地图(反序列化)",[4104,4950,4951],{"id":4951},"地图读取节点说明",[18,4953,4079,4954,4956,4957,4115],{},[74,4955,4075],{},"中的地图读取节点是",[74,4958,4091],{},[18,4960,4961],{},[21,4962,668],{},[535,4964,4965,4975],{},[538,4966,4967],{},[541,4968,4969,4971,4973],{},[544,4970,547],{"align":546},[544,4972,4130],{"align":546},[544,4974,553],{"align":546},[555,4976,4977],{},[541,4978,4979,4981,4983],{},[560,4980,687],{"align":546},[560,4982,690],{"align":546},[560,4984,4985],{"align":546},"地图数据",[18,4987,4988],{},[21,4989,827],{},[46,4991,4992,4998,5004],{},[49,4993,4994,4997],{},[21,4995,4996],{},"frame_id","  地图坐标系名称。",[49,4999,5000,5003],{},[21,5001,5002],{},"topic_name","  话题名称。",[49,5005,5006,5009],{},[21,5007,5008],{},"yaml_filename","  地图数据源。",[4104,5011,5012],{"id":5012},"地图读取基本操作",[18,5014,5015],{},[21,5016,1192],{},[18,5018,5019],{},"请先调用如下指令在工作空间的src目录下创建一个功能包：",[68,5021,5023],{"className":70,"code":5022,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_map_server --dependencies nav2_map_server\n",[74,5024,5025],{"__ignoreMap":32},[77,5026,5027,5029,5031,5033,5036,5038],{"class":79,"line":80},[77,5028,1205],{"class":83},[77,5030,1208],{"class":87},[77,5032,1211],{"class":87},[77,5034,5035],{"class":87}," mycar_map_server",[77,5037,1218],{"class":1217},[77,5039,5040],{"class":87}," nav2_map_server\n",[18,5042,5043],{},"在功能包下，新建launch文件夹，并在CMakeLists.txt中添加如下配置：",[68,5045,5047],{"className":2279,"code":5046,"language":2281,"meta":32,"style":32},"install(DIRECTORY launch DESTINATION share/${PROJECT_NAME})\n",[74,5048,5049],{"__ignoreMap":32},[77,5050,5051,5053,5056,5059],{"class":79,"line":80},[77,5052,2288],{"class":97},[77,5054,5055],{"class":104},"(DIRECTORY launch DESTINATION share/",[77,5057,5058],{"class":97},"${PROJECT_NAME}",[77,5060,1345],{"class":104},[18,5062,5063],{},[30,5064],{"alt":32,"src":5065},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1754.webp",[18,5067,5068],{},[21,5069,5070],{},"读取地图",[18,5072,5073,5074,5076],{},"使用",[74,5075,4091],{},"读取地图时，常用的方式有两种，分别是使用终端指令与launch文件集成。两种方式效果一致，都可以以话题的方式发布地图消息。",[68,5078,5080],{"className":70,"code":5079,"language":72,"meta":32,"style":32},"colcon build\nsource ./install/setup.bash\n",[74,5081,5082,5089],{"__ignoreMap":32},[77,5083,5084,5086],{"class":79,"line":80},[77,5085,2321],{"class":83},[77,5087,5088],{"class":87}," build\n",[77,5090,5091,5094],{"class":79,"line":114},[77,5092,5093],{"class":1217},"source",[77,5095,5096],{"class":87}," ./install/setup.bash\n",[18,5098,5099],{},[21,5100,5101],{},"方式1：终端指令",[18,5103,5104],{},"请在终端下进入工作空间，输入如下指令：",[68,5106,5108],{"className":70,"code":5107,"language":72,"meta":32,"style":32},"ros2 run nav2_map_server map_server --ros-args -p yaml_filename:=map/my_map.yaml\n",[74,5109,5110],{"__ignoreMap":32},[77,5111,5112,5114,5116,5118,5121,5124,5127],{"class":79,"line":80},[77,5113,1205],{"class":83},[77,5115,4257],{"class":87},[77,5117,4260],{"class":87},[77,5119,5120],{"class":87}," map_server",[77,5122,5123],{"class":1217}," --ros-args",[77,5125,5126],{"class":1217}," -p",[77,5128,5129],{"class":87}," yaml_filename:=map/my_map.yaml\n",[18,5131,5132,5133,5135],{},"由于",[74,5134,4091],{},"是具有生命周期的节点，所以接下来还需要对节点进行配置和激活，请新开终端执行如下指令：",[68,5137,5139],{"className":70,"code":5138,"language":72,"meta":32,"style":32},"ros2 lifecycle set /map_server configure\nros2 lifecycle set /map_server activate\n",[74,5140,5141,5157],{"__ignoreMap":32},[77,5142,5143,5145,5148,5151,5154],{"class":79,"line":80},[77,5144,1205],{"class":83},[77,5146,5147],{"class":87}," lifecycle",[77,5149,5150],{"class":87}," set",[77,5152,5153],{"class":87}," /map_server",[77,5155,5156],{"class":87}," configure\n",[77,5158,5159,5161,5163,5165,5167],{"class":79,"line":114},[77,5160,1205],{"class":83},[77,5162,5147],{"class":87},[77,5164,5150],{"class":87},[77,5166,5153],{"class":87},[77,5168,5169],{"class":87}," activate\n",[18,5171,5172,5173,5176,5177,5179],{},"执行完毕若无异常，再调用",[74,5174,5175],{},"ros2 topic list","即可查看到",[74,5178,687],{},"话题了，说明地图消息已经被发布了。",[18,5181,5182],{},[21,5183,5184],{},"方式2：launch集成",[18,5186,5187,5188,5190,5191,5194],{},"方式1需要手动设置",[74,5189,4091],{},"生命周期，步骤稍显繁琐，因此，我们还可以将该节点集成进launch文件，以简化启动步骤。在launch目录下新建名为",[74,5192,5193],{},"map_server.launch.py","的文件，并输入如下内容：",[68,5196,5198],{"className":1236,"code":5197,"language":1238,"meta":32,"style":32},"import os\nfrom launch import LaunchDescription\nfrom launch_ros.actions import Node\ndef generate_launch_description():\n  map_file = os.path.join('map', 'my_map.yaml')\n  map_server_node = Node(\n      package='nav2_map_server',\n      executable='map_server',\n      name='map_server',\n      output='screen',\n      parameters=[{'use_sim_time': True},\n                  {'yaml_filename':map_file}]\n  )\n  manager_mapper_node = Node(\n    package='nav2_lifecycle_manager',\n    executable='lifecycle_manager',\n    name='lifecycle_manager_mapper',\n    output='screen',\n    parameters=[{'use_sim_time': True},\n      {'autostart': True},\n      {'node_names': ['map_server']}]\n  )\n  return LaunchDescription([map_server_node,manager_mapper_node])\n",[74,5199,5200,5206,5216,5226,5234,5254,5263,5275,5287,5298,5309,5329,5340,5345,5354,5366,5378,5390,5401,5418,5432,5446,5450],{"__ignoreMap":32},[77,5201,5202,5204],{"class":79,"line":80},[77,5203,1245],{"class":97},[77,5205,1248],{"class":104},[77,5207,5208,5210,5212,5214],{"class":79,"line":114},[77,5209,1257],{"class":97},[77,5211,1260],{"class":104},[77,5213,1245],{"class":97},[77,5215,1265],{"class":104},[77,5217,5218,5220,5222,5224],{"class":79,"line":136},[77,5219,1257],{"class":97},[77,5221,1296],{"class":104},[77,5223,1245],{"class":97},[77,5225,1301],{"class":104},[77,5227,5228,5230,5232],{"class":79,"line":143},[77,5229,1322],{"class":97},[77,5231,1325],{"class":83},[77,5233,1328],{"class":104},[77,5235,5236,5239,5241,5244,5247,5249,5252],{"class":79,"line":150},[77,5237,5238],{"class":104},"  map_file ",[77,5240,1336],{"class":97},[77,5242,5243],{"class":104}," os.path.join(",[77,5245,5246],{"class":87},"'map'",[77,5248,1455],{"class":104},[77,5250,5251],{"class":87},"'my_map.yaml'",[77,5253,1345],{"class":104},[77,5255,5256,5259,5261],{"class":79,"line":162},[77,5257,5258],{"class":104},"  map_server_node ",[77,5260,1336],{"class":97},[77,5262,1488],{"class":104},[77,5264,5265,5268,5270,5273],{"class":79,"line":174},[77,5266,5267],{"class":1391},"      package",[77,5269,1336],{"class":97},[77,5271,5272],{"class":87},"'nav2_map_server'",[77,5274,1385],{"class":104},[77,5276,5277,5280,5282,5285],{"class":79,"line":179},[77,5278,5279],{"class":1391},"      executable",[77,5281,1336],{"class":97},[77,5283,5284],{"class":87},"'map_server'",[77,5286,1385],{"class":104},[77,5288,5289,5292,5294,5296],{"class":79,"line":185},[77,5290,5291],{"class":1391},"      name",[77,5293,1336],{"class":97},[77,5295,5284],{"class":87},[77,5297,1385],{"class":104},[77,5299,5300,5303,5305,5307],{"class":79,"line":197},[77,5301,5302],{"class":1391},"      output",[77,5304,1336],{"class":97},[77,5306,1571],{"class":87},[77,5308,1385],{"class":104},[77,5310,5311,5314,5316,5319,5321,5323,5326],{"class":79,"line":1348},[77,5312,5313],{"class":1391},"      parameters",[77,5315,1336],{"class":97},[77,5317,5318],{"class":104},"[{",[77,5320,1342],{"class":87},[77,5322,1666],{"class":104},[77,5324,5325],{"class":1217},"True",[77,5327,5328],{"class":104},"},\n",[77,5330,5331,5334,5337],{"class":79,"line":1363},[77,5332,5333],{"class":104},"                  {",[77,5335,5336],{"class":87},"'yaml_filename'",[77,5338,5339],{"class":104},":map_file}]\n",[77,5341,5342],{"class":79,"line":1368},[77,5343,5344],{"class":104},"  )\n",[77,5346,5347,5350,5352],{"class":79,"line":1379},[77,5348,5349],{"class":104},"  manager_mapper_node ",[77,5351,1336],{"class":97},[77,5353,1488],{"class":104},[77,5355,5356,5359,5361,5364],{"class":79,"line":1388},[77,5357,5358],{"class":1391},"    package",[77,5360,1336],{"class":97},[77,5362,5363],{"class":87},"'nav2_lifecycle_manager'",[77,5365,1385],{"class":104},[77,5367,5368,5371,5373,5376],{"class":79,"line":1402},[77,5369,5370],{"class":1391},"    executable",[77,5372,1336],{"class":97},[77,5374,5375],{"class":87},"'lifecycle_manager'",[77,5377,1385],{"class":104},[77,5379,5380,5383,5385,5388],{"class":79,"line":1415},[77,5381,5382],{"class":1391},"    name",[77,5384,1336],{"class":97},[77,5386,5387],{"class":87},"'lifecycle_manager_mapper'",[77,5389,1385],{"class":104},[77,5391,5392,5395,5397,5399],{"class":79,"line":1425},[77,5393,5394],{"class":1391},"    output",[77,5396,1336],{"class":97},[77,5398,1571],{"class":87},[77,5400,1385],{"class":104},[77,5402,5403,5406,5408,5410,5412,5414,5416],{"class":79,"line":1433},[77,5404,5405],{"class":1391},"    parameters",[77,5407,1336],{"class":97},[77,5409,5318],{"class":104},[77,5411,1342],{"class":87},[77,5413,1666],{"class":104},[77,5415,5325],{"class":1217},[77,5417,5328],{"class":104},[77,5419,5420,5423,5426,5428,5430],{"class":79,"line":1449},[77,5421,5422],{"class":104},"      {",[77,5424,5425],{"class":87},"'autostart'",[77,5427,1666],{"class":104},[77,5429,5325],{"class":1217},[77,5431,5328],{"class":104},[77,5433,5434,5436,5439,5441,5443],{"class":79,"line":1463},[77,5435,5422],{"class":104},[77,5437,5438],{"class":87},"'node_names'",[77,5440,4856],{"class":104},[77,5442,5284],{"class":87},[77,5444,5445],{"class":104},"]}]\n",[77,5447,5448],{"class":79,"line":1475},[77,5449,5344],{"class":104},[77,5451,5452,5455],{"class":79,"line":1480},[77,5453,5454],{"class":97},"  return",[77,5456,5457],{"class":104}," LaunchDescription([map_server_node,manager_mapper_node])\n",[18,5459,5460,5461,5464,5465,5468],{},"在该文件中，使用了功能包中",[74,5462,5463],{},"nav2_lifecycle_manager","中的",[74,5466,5467],{},"lifecycle_manager","组件，该组件可以自动的配置、激活其所管理的具有生命周期的节点。构建功能包后并执行该launch文件，其最终效果与方式一类似。",[68,5470,5472],{"className":70,"code":5471,"language":72,"meta":32,"style":32},"ros2 launch mycar_map_server map_server.launch.py\n",[74,5473,5474],{"__ignoreMap":32},[77,5475,5476,5478,5480,5482],{"class":79,"line":80},[77,5477,1205],{"class":83},[77,5479,2360],{"class":87},[77,5481,5035],{"class":87},[77,5483,5484],{"class":87}," map_server.launch.py\n",[18,5486,5487],{},[21,5488,5489],{},"显示地图",[18,5491,5492,5493],{},"打开rviz2，然后添加Map插件，并将话题设置为/map，并将该话题的",[74,5494,5495],{},"Durability Policy",[18,5497,5498,5499,5502],{},"选项设置为",[74,5500,5501],{},"Transient Local","，就可以正常显示地图数据了。",[18,5504,5505],{},[30,5506],{"alt":32,"src":5507},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1755.webp",[18,5509,5510],{},[30,5511],{"alt":32,"src":5512},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1756.webp",[18,5514,5515],{},[30,5516],{"alt":32,"src":5517},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1757.webp",[10,5519,5521],{"id":5520},"amcl自适应蒙特卡洛定位","AMCL自适应蒙特卡洛定位",[18,5523,5524],{},"定位是机器人在已知地图上确定自身位置的过程，为机器人的导航提供了基础信息。",[18,5526,5527,5528,4076],{},"Nav2中的定位技术技术称之为AMCL，全称Adaptive Monte Carlo Localization，即自适应蒙特卡洛定位，是一种基于粒子滤波器的定位算法。它通过蒙特卡洛方法进行自适应定位，利用对机器人周围环境的感知和观测数据的分析，来确定机器人在环境中的位置和姿态。在Nav2中对应的功能包为",[74,5529,5530],{},"nav2_amcl",[18,5532,5533],{},"在AMCL中，粒子滤波器的核心思想是使用一组粒子（样本）来代表机器人在地图上的可能位置。每个粒子都有一个权重，表示该粒子所代表的位置的置信度。算法会根据机器人的运动模型和传感器数据来更新这些粒子的位置和权重。随着时间的推移，粒子会逐渐收敛到机器人实际位置附近，从而实现对机器人位置的准确估计。",[14,5535,5536],{"id":5536},"定位节点说明",[18,5538,5539,5540,5542],{},"功能包",[74,5541,5530],{},"中的核心节点为amcl。该节点相关信息如下。",[18,5544,5545],{},[21,5546,5547],{},"1.订阅的话题",[535,5549,5550,5560],{},[538,5551,5552],{},[541,5553,5554,5556,5558],{},[544,5555,547],{"align":546},[544,5557,4130],{"align":546},[544,5559,553],{"align":546},[555,5561,5562,5571,5581,5592],{},[541,5563,5564,5566,5569],{},[560,5565,687],{"align":546},[560,5567,5568],{"align":546},"/nav_msgs/msg/OccupancyGrid",[560,5570,4985],{"align":546},[541,5572,5573,5575,5578],{},[560,5574,562],{"align":546},[560,5576,5577],{"align":546},"/sensor_msgs/msg/LaserScan",[560,5579,5580],{"align":546},"激光雷达数据",[541,5582,5583,5586,5589],{},[560,5584,5585],{"align":546},"/initialpose",[560,5587,5588],{"align":546},"/geometry_msgs/msg/PoseWithCovarianceStamped",[560,5590,5591],{"align":546},"用来初始化粒子滤波器的均值和协方差",[541,5593,5594,5596,5599],{},[560,5595,573],{"align":546},[560,5597,5598],{"align":546},"/tf2_msgs/msg/TFMessage",[560,5600,5601],{"align":546},"坐标变换消息",[18,5603,5604],{},[21,5605,5606],{},"2.发布的话题",[535,5608,5609,5619],{},[538,5610,5611],{},[541,5612,5613,5615,5617],{},[544,5614,547],{"align":546},[544,5616,4130],{"align":546},[544,5618,553],{"align":546},[555,5620,5621,5631,5642],{},[541,5622,5623,5626,5628],{},[560,5624,5625],{"align":546},"/amcl_pose",[560,5627,5588],{"align":546},[560,5629,5630],{"align":546},"机器人在地图中的位姿估计",[541,5632,5633,5636,5639],{},[560,5634,5635],{"align":546},"/particle_cloud",[560,5637,5638],{"align":546},"/nav2_msgs/msg/ParticleCloud",[560,5640,5641],{"align":546},"位姿估计集合，rviz中可以被 PoseArray 订阅然后图形化显示机器人的位姿估计集合",[541,5643,5644,5646,5648],{},[560,5645,573],{"align":546},[560,5647,5598],{"align":546},[560,5649,5650],{"align":546},"发布从 odom 与 map 的转换",[18,5652,5653],{},[21,5654,5655],{},"3.发布的服务",[535,5657,5658,5668],{},[538,5659,5660],{},[541,5661,5662,5664,5666],{},[544,5663,547],{"align":546},[544,5665,4130],{"align":546},[544,5667,553],{"align":546},[555,5669,5670,5681],{},[541,5671,5672,5675,5678],{},[560,5673,5674],{"align":546},"/reinitialize_global_localization",[560,5676,5677],{"align":546},"std_srvs/srv/Empty",[560,5679,5680],{"align":546},"在全局范围内初始化粒子位姿",[541,5682,5683,5686,5688],{},[560,5684,5685],{"align":546},"/request_nomotion_update",[560,5687,5677],{"align":546},[560,5689,5690],{"align":546},"在没有运动模型更新的情况下手动触发粒子群的更新",[18,5692,5693],{},[21,5694,5695],{},"4.参数",[18,5697,5698],{},[21,5699,5700],{},"通用参数",[46,5702,5703,5712,5722,5731,5740,5748,5754],{},[49,5704,5705,5708,5709,5711],{},[74,5706,5707],{},"bond_disable_heartbeat_timeout",": 设置为",[74,5710,2022],{},"时，禁用amcl节点与其他节点之间基于心跳的超时检测。这通常用于当节点之间的连接非常稳定，不需要频繁的心跳检测来确认连接状态时。",[49,5713,5714,5717,5718,5721],{},[74,5715,5716],{},"base_frame_id",": 定义机器人基坐标系的ID，通常是",[74,5719,5720],{},"base_link","或类似的名称。",[49,5723,5724,5727,5728,4076],{},[74,5725,5726],{},"global_frame_id",": 定义全局地图坐标系的ID，通常是",[74,5729,5730],{},"map",[49,5732,5733,5736,5737,4076],{},[74,5734,5735],{},"odom_frame_id",": 定义里程计坐标系的ID，通常是",[74,5738,5739],{},"odom",[49,5741,5742,5708,5745,5747],{},[74,5743,5744],{},"tf_broadcast",[74,5746,2022],{},"时，amcl节点会发布从里程计坐标系到全局地图坐标系的变换。",[49,5749,5750,5753],{},[74,5751,5752],{},"transform_tolerance",": 设置TF变换的容忍度，用于处理TF树中的时间不一致性。",[49,5755,5756,5708,5759,5761],{},[74,5757,5758],{},"use_sim_time",[74,5760,2022],{},"时，amcl将使用ROS 2的模拟时间（如果可用）。这在仿真环境中很有用。",[18,5763,5764],{},[21,5765,5766],{},"激光模型参数",[46,5768,5769,5779,5788,5794],{},[49,5770,5771,5774,5775,5778],{},[74,5772,5773],{},"laser_model_type",": 设置激光模型类型，",[74,5776,5777],{},"likelihood_field","是一种常用的模型，它考虑了激光束击中障碍物的概率。",[49,5780,5781,2677,5784,5787],{},[74,5782,5783],{},"laser_max_range",[74,5785,5786],{},"laser_min_range",": 分别设置激光雷达的最大和最小探测范围。",[49,5789,5790,5793],{},[74,5791,5792],{},"laser_likelihood_max_dist",": 设置激光模型考虑的最大距离，超过这个距离的数据将被忽略。",[49,5795,5796,5799,5800,5803,5804,5803,5807,5810,5811,5813,5814,5817],{},[74,5797,5798],{},"do_beamskip","和相关参数（",[74,5801,5802],{},"beam_skip_distance","、",[74,5805,5806],{},"beam_skip_threshold",[74,5808,5809],{},"beam_skip_error_threshold","）: 这些参数用于控制是否跳过某些激光束的处理，以减少计算量。然而，",[74,5812,5798],{},"被设置为",[74,5815,5816],{},"false","，意味着不跳过任何激光束。",[18,5819,5820],{},[21,5821,5822],{},"粒子滤波器参数",[46,5824,5825,5837,5846,5852],{},[49,5826,5827,5830,5833,5836],{},[74,5828,5829],{},"alpha1",[21,5831,5832],{},"到",[74,5834,5835],{},"alpha5",": 这些参数用于控制粒子滤波器中的权重更新过程，但它们的具体作用可能因amcl的实现而异。在标准的amcl实现中，这些参数可能不是直接使用的。",[49,5838,5839,2677,5842,5845],{},[74,5840,5841],{},"max_particles",[74,5843,5844],{},"min_particles",": 分别设置粒子滤波器的最大和最小粒子数。",[49,5847,5848,5851],{},[74,5849,5850],{},"resample_interval",": 设置在重采样前需要的滤波更新次数。",[49,5853,5854,2677,5857,5860],{},[74,5855,5856],{},"pf_err",[74,5858,5859],{},"pf_z",": 这些参数用于控制粒子滤波器的性能，但它们的具体作用可能依赖于amcl的实现细节。",[18,5862,5863],{},[21,5864,5865],{},"初始位姿参数",[46,5867,5868,5880,5887],{},[49,5869,5870,5873,5874,5813,5877,5879],{},[74,5871,5872],{},"initial_pose",": 定义了机器人的初始位姿（x, y, yaw, z），但在实际使用中，如果",[74,5875,5876],{},"set_initial_pose",[74,5878,2022],{},"，则这个初始位姿可能会被通过服务请求设置的初始位姿所覆盖。",[49,5881,5882,5708,5884,5886],{},[74,5883,5876],{},[74,5885,2022],{},"时，允许通过服务请求来设置机器人的初始位姿。",[49,5888,5889,5708,5892,5894],{},[74,5890,5891],{},"always_reset_initial_pose",[74,5893,5816],{},"时，表示不会在每个定位会话开始时自动重置初始位姿。",[18,5896,5897],{},[21,5898,5899],{},"其他参数",[46,5901,5902,5911,5917,5922,5928,5937],{},[49,5903,5904,5907,5908,5910],{},[74,5905,5906],{},"first_map_only",": 当设置为",[74,5909,5816],{},"时，表示amcl将订阅并处理不断更新的地图话题。",[49,5912,5913,5916],{},[74,5914,5915],{},"map_topic",": 定义地图话题的名称，amcl将订阅这个话题以获取地图信息。",[49,5918,5919,5921],{},[74,5920,904],{},": 定义激光雷达扫描数据话题的名称，amcl将订阅这个话题以获取用于定位的数据。",[49,5923,5924,5927],{},[74,5925,5926],{},"save_pose_rate",": 设置保存机器人位姿的速率（以Hz为单位）。",[49,5929,5930,2677,5933,5936],{},[74,5931,5932],{},"recovery_alpha_fast",[74,5934,5935],{},"recovery_alpha_slow",": 这些参数在标准的amcl实现中可能不是直接使用的，它们可能属于某个特定版本的amcl或扩展。",[49,5938,5939,5803,5942,5803,5945,5803,5948,2677,5951,5954],{},[74,5940,5941],{},"z_hit",[74,5943,5944],{},"z_rand",[74,5946,5947],{},"z_short",[74,5949,5950],{},"z_max",[74,5952,5953],{},"sigma_hit",": 这些参数定义了激光模型中的概率分布，用于计算激光束击中障碍物或随机位置的概率。",[14,5956,5957],{"id":5957},"定位节点基本操作",[18,5959,5960],{},[21,5961,5962],{},"1.准备工作",[18,5964,5019],{},[68,5966,5968],{"className":70,"code":5967,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_localization --dependencies nav2_amcl mycar_map_server\n",[74,5969,5970],{"__ignoreMap":32},[77,5971,5972,5974,5976,5978,5981,5983,5986],{"class":79,"line":80},[77,5973,1205],{"class":83},[77,5975,1208],{"class":87},[77,5977,1211],{"class":87},[77,5979,5980],{"class":87}," mycar_localization",[77,5982,1218],{"class":1217},[77,5984,5985],{"class":87}," nav2_amcl",[77,5987,5988],{"class":87}," mycar_map_server\n",[18,5990,5991],{},[21,5992,5993],{},"2.编写launch文件与参数文件",[18,5995,5996,5997,5194],{},"在功能包下，新建launch和params文件夹，在launch目录下新建名为",[74,5998,5999],{},"mycar_loca.launch.py",[68,6001,6003],{"className":1236,"code":6002,"language":1238,"meta":32,"style":32},"import os\nfrom ament_index_python.packages import get_package_share_directory\nfrom launch import LaunchDescription\nfrom launch_ros.actions import Node\nfrom launch.actions import IncludeLaunchDescription\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\n\ndef generate_launch_description():\n    amcl_yaml = os.path.join(get_package_share_directory('mycar_localization'),\n        'params', 'amcl.yaml')\n    amcl_node = Node(\n        package='nav2_amcl',\n        executable='amcl',\n        name='amcl',\n        output='screen',\n        parameters=[amcl_yaml]\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=[{'use_sim_time': True},\n            {'autostart': True},\n            {'node_names': ['amcl']}]\n    )\n    map_server_launch = IncludeLaunchDescription(\n        launch_description_source=PythonLaunchDescriptionSource(\n            launch_file_path=([get_package_share_directory(\"mycar_map_server\"),\"/launch/map_server.launch.py\"])\n        )\n    )\n    return LaunchDescription([amcl_node,manager_localization_node,map_server_launch])\n",[74,6004,6005,6011,6021,6031,6041,6052,6064,6068,6076,6091,6103,6112,6123,6134,6144,6154,6163,6167,6176,6186,6196,6207,6217,6233,6245,6257,6261,6271,6281,6302,6307,6311],{"__ignoreMap":32},[77,6006,6007,6009],{"class":79,"line":80},[77,6008,1245],{"class":97},[77,6010,1248],{"class":104},[77,6012,6013,6015,6017,6019],{"class":79,"line":114},[77,6014,1257],{"class":97},[77,6016,1308],{"class":104},[77,6018,1245],{"class":97},[77,6020,1313],{"class":104},[77,6022,6023,6025,6027,6029],{"class":79,"line":136},[77,6024,1257],{"class":97},[77,6026,1260],{"class":104},[77,6028,1245],{"class":97},[77,6030,1265],{"class":104},[77,6032,6033,6035,6037,6039],{"class":79,"line":143},[77,6034,1257],{"class":97},[77,6036,1296],{"class":104},[77,6038,1245],{"class":97},[77,6040,1301],{"class":104},[77,6042,6043,6045,6047,6049],{"class":79,"line":150},[77,6044,1257],{"class":97},[77,6046,1272],{"class":104},[77,6048,1245],{"class":97},[77,6050,6051],{"class":104}," IncludeLaunchDescription\n",[77,6053,6054,6056,6059,6061],{"class":79,"line":162},[77,6055,1257],{"class":97},[77,6057,6058],{"class":104}," launch.launch_description_sources ",[77,6060,1245],{"class":97},[77,6062,6063],{"class":104}," PythonLaunchDescriptionSource\n",[77,6065,6066],{"class":79,"line":174},[77,6067,140],{"emptyLinePlaceholder":139},[77,6069,6070,6072,6074],{"class":79,"line":179},[77,6071,1322],{"class":97},[77,6073,1325],{"class":83},[77,6075,1328],{"class":104},[77,6077,6078,6081,6083,6086,6089],{"class":79,"line":185},[77,6079,6080],{"class":104},"    amcl_yaml ",[77,6082,1336],{"class":97},[77,6084,6085],{"class":104}," os.path.join(get_package_share_directory(",[77,6087,6088],{"class":87},"'mycar_localization'",[77,6090,1446],{"class":104},[77,6092,6093,6096,6098,6101],{"class":79,"line":197},[77,6094,6095],{"class":87},"        'params'",[77,6097,1455],{"class":104},[77,6099,6100],{"class":87},"'amcl.yaml'",[77,6102,1345],{"class":104},[77,6104,6105,6108,6110],{"class":79,"line":1348},[77,6106,6107],{"class":104},"    amcl_node ",[77,6109,1336],{"class":97},[77,6111,1488],{"class":104},[77,6113,6114,6116,6118,6121],{"class":79,"line":1363},[77,6115,1528],{"class":1391},[77,6117,1336],{"class":97},[77,6119,6120],{"class":87},"'nav2_amcl'",[77,6122,1385],{"class":104},[77,6124,6125,6127,6129,6132],{"class":79,"line":1368},[77,6126,1541],{"class":1391},[77,6128,1336],{"class":97},[77,6130,6131],{"class":87},"'amcl'",[77,6133,1385],{"class":104},[77,6135,6136,6138,6140,6142],{"class":79,"line":1379},[77,6137,1554],{"class":1391},[77,6139,1336],{"class":97},[77,6141,6131],{"class":87},[77,6143,1385],{"class":104},[77,6145,6146,6148,6150,6152],{"class":79,"line":1388},[77,6147,1566],{"class":1391},[77,6149,1336],{"class":97},[77,6151,1571],{"class":87},[77,6153,1385],{"class":104},[77,6155,6156,6158,6160],{"class":79,"line":1402},[77,6157,1494],{"class":1391},[77,6159,1336],{"class":97},[77,6161,6162],{"class":104},"[amcl_yaml]\n",[77,6164,6165],{"class":79,"line":1415},[77,6166,3250],{"class":104},[77,6168,6169,6172,6174],{"class":79,"line":1425},[77,6170,6171],{"class":104},"    manager_localization_node ",[77,6173,1336],{"class":97},[77,6175,1488],{"class":104},[77,6177,6178,6180,6182,6184],{"class":79,"line":1433},[77,6179,1528],{"class":1391},[77,6181,1336],{"class":97},[77,6183,5363],{"class":87},[77,6185,1385],{"class":104},[77,6187,6188,6190,6192,6194],{"class":79,"line":1449},[77,6189,1541],{"class":1391},[77,6191,1336],{"class":97},[77,6193,5375],{"class":87},[77,6195,1385],{"class":104},[77,6197,6198,6200,6202,6205],{"class":79,"line":1463},[77,6199,1554],{"class":1391},[77,6201,1336],{"class":97},[77,6203,6204],{"class":87},"'lifecycle_manager_localization'",[77,6206,1385],{"class":104},[77,6208,6209,6211,6213,6215],{"class":79,"line":1475},[77,6210,1566],{"class":1391},[77,6212,1336],{"class":97},[77,6214,1571],{"class":87},[77,6216,1385],{"class":104},[77,6218,6219,6221,6223,6225,6227,6229,6231],{"class":79,"line":1480},[77,6220,1494],{"class":1391},[77,6222,1336],{"class":97},[77,6224,5318],{"class":104},[77,6226,1342],{"class":87},[77,6228,1666],{"class":104},[77,6230,5325],{"class":1217},[77,6232,5328],{"class":104},[77,6234,6235,6237,6239,6241,6243],{"class":79,"line":1491},[77,6236,3297],{"class":104},[77,6238,5425],{"class":87},[77,6240,1666],{"class":104},[77,6242,5325],{"class":1217},[77,6244,5328],{"class":104},[77,6246,6247,6249,6251,6253,6255],{"class":79,"line":1502},[77,6248,3297],{"class":104},[77,6250,5438],{"class":87},[77,6252,4856],{"class":104},[77,6254,6131],{"class":87},[77,6256,5445],{"class":104},[77,6258,6259],{"class":79,"line":1508},[77,6260,3250],{"class":104},[77,6262,6263,6266,6268],{"class":79,"line":1519},[77,6264,6265],{"class":104},"    map_server_launch ",[77,6267,1336],{"class":97},[77,6269,6270],{"class":104}," IncludeLaunchDescription(\n",[77,6272,6273,6276,6278],{"class":79,"line":1525},[77,6274,6275],{"class":1391},"        launch_description_source",[77,6277,1336],{"class":97},[77,6279,6280],{"class":104},"PythonLaunchDescriptionSource(\n",[77,6282,6283,6286,6288,6291,6294,6296,6299],{"class":79,"line":1538},[77,6284,6285],{"class":1391},"            launch_file_path",[77,6287,1336],{"class":97},[77,6289,6290],{"class":104},"([get_package_share_directory(",[77,6292,6293],{"class":87},"\"mycar_map_server\"",[77,6295,3218],{"class":104},[77,6297,6298],{"class":87},"\"/launch/map_server.launch.py\"",[77,6300,6301],{"class":104},"])\n",[77,6303,6304],{"class":79,"line":1551},[77,6305,6306],{"class":104},"        )\n",[77,6308,6309],{"class":79,"line":1563},[77,6310,3250],{"class":104},[77,6312,6313,6315],{"class":79,"line":1576},[77,6314,1623],{"class":97},[77,6316,6317],{"class":104}," LaunchDescription([amcl_node,manager_localization_node,map_server_launch])\n",[18,6319,6320,6321,6324,6325,6328,6329,6332,6333,6335,6336,6338],{},"在上述代码中，创建了",[74,6322,6323],{},"amcl","节点，并从",[74,6326,6327],{},"params","目录加载了名为",[74,6330,6331],{},"amcl.yaml","的配置文件，且由于",[74,6334,6323],{},"也是拥有生命周期的节点，所以将其添加进了生命周期管理器。最后，定位必须依赖于地图信息，因此又包含了 ",[21,6337,5012],{},"  中的launch文件，以加载地图。",[18,6340,6341,6342,5194],{},"在params目录下新建名为",[74,6343,6331],{},[68,6345,6347],{"className":1639,"code":6346,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    use_sim_time: True\n    alpha1: 0.2\n    alpha2: 0.2\n    alpha3: 0.2\n    alpha4: 0.2\n    alpha5: 0.2\n    base_frame_id: \"base_link\"\n    beam_skip_distance: 0.5\n    beam_skip_error_threshold: 0.9\n    beam_skip_threshold: 0.3\n    do_beamskip: false\n    global_frame_id: \"map\"\n    lambda_short: 0.1\n    laser_likelihood_max_dist: 2.0\n    laser_max_range: 100.0\n    laser_min_range: -1.0\n    laser_model_type: \"likelihood_field\"\n    max_beams: 60\n    max_particles: 2000\n    min_particles: 500\n    odom_frame_id: \"odom\"\n    pf_err: 0.05\n    pf_z: 0.99\n    recovery_alpha_fast: 0.0\n    recovery_alpha_slow: 0.0\n    resample_interval: 1\n    robot_model_type: \"nav2_amcl::DifferentialMotionModel\"\n    save_pose_rate: 0.5\n    sigma_hit: 0.2\n    tf_broadcast: true\n    transform_tolerance: 2.0\n    update_min_a: 0.2\n    update_min_d: 0.25\n    z_hit: 0.5\n    z_max: 0.05\n    z_rand: 0.5\n    z_short: 0.05\n    scan_topic: scan\n    set_initial_pose: false\n",[74,6348,6349,6356,6362,6372,6381,6390,6399,6408,6417,6427,6436,6445,6455,6464,6474,6483,6492,6502,6512,6522,6532,6542,6552,6562,6571,6581,6591,6600,6609,6619,6628,6637,6646,6655,6664,6673,6682,6691,6700,6709,6718],{"__ignoreMap":32},[77,6350,6351,6354],{"class":79,"line":80},[77,6352,6353],{"class":1648},"/**",[77,6355,1651],{"class":104},[77,6357,6358,6360],{"class":79,"line":114},[77,6359,1656],{"class":1648},[77,6361,1651],{"class":104},[77,6363,6364,6367,6369],{"class":79,"line":136},[77,6365,6366],{"class":1648},"    use_sim_time",[77,6368,1666],{"class":104},[77,6370,6371],{"class":1217},"True\n",[77,6373,6374,6377,6379],{"class":79,"line":143},[77,6375,6376],{"class":1648},"    alpha1",[77,6378,1666],{"class":104},[77,6380,1884],{"class":1217},[77,6382,6383,6386,6388],{"class":79,"line":150},[77,6384,6385],{"class":1648},"    alpha2",[77,6387,1666],{"class":104},[77,6389,1884],{"class":1217},[77,6391,6392,6395,6397],{"class":79,"line":162},[77,6393,6394],{"class":1648},"    alpha3",[77,6396,1666],{"class":104},[77,6398,1884],{"class":1217},[77,6400,6401,6404,6406],{"class":79,"line":174},[77,6402,6403],{"class":1648},"    alpha4",[77,6405,1666],{"class":104},[77,6407,1884],{"class":1217},[77,6409,6410,6413,6415],{"class":79,"line":179},[77,6411,6412],{"class":1648},"    alpha5",[77,6414,1666],{"class":104},[77,6416,1884],{"class":1217},[77,6418,6419,6422,6424],{"class":79,"line":185},[77,6420,6421],{"class":1648},"    base_frame_id",[77,6423,1666],{"class":104},[77,6425,6426],{"class":87},"\"base_link\"\n",[77,6428,6429,6432,6434],{"class":79,"line":197},[77,6430,6431],{"class":1648},"    beam_skip_distance",[77,6433,1666],{"class":104},[77,6435,1874],{"class":1217},[77,6437,6438,6441,6443],{"class":79,"line":1348},[77,6439,6440],{"class":1648},"    beam_skip_error_threshold",[77,6442,1666],{"class":104},[77,6444,2241],{"class":1217},[77,6446,6447,6450,6452],{"class":79,"line":1363},[77,6448,6449],{"class":1648},"    beam_skip_threshold",[77,6451,1666],{"class":104},[77,6453,6454],{"class":1217},"0.3\n",[77,6456,6457,6460,6462],{"class":79,"line":1368},[77,6458,6459],{"class":1648},"    do_beamskip",[77,6461,1666],{"class":104},[77,6463,1809],{"class":1217},[77,6465,6466,6469,6471],{"class":79,"line":1379},[77,6467,6468],{"class":1648},"    global_frame_id",[77,6470,1666],{"class":104},[77,6472,6473],{"class":87},"\"map\"\n",[77,6475,6476,6479,6481],{"class":79,"line":1388},[77,6477,6478],{"class":1648},"    lambda_short",[77,6480,1666],{"class":104},[77,6482,1948],{"class":1217},[77,6484,6485,6488,6490],{"class":79,"line":1402},[77,6486,6487],{"class":1648},"    laser_likelihood_max_dist",[77,6489,1666],{"class":104},[77,6491,1842],{"class":1217},[77,6493,6494,6497,6499],{"class":79,"line":1415},[77,6495,6496],{"class":1648},"    laser_max_range",[77,6498,1666],{"class":104},[77,6500,6501],{"class":1217},"100.0\n",[77,6503,6504,6507,6509],{"class":79,"line":1425},[77,6505,6506],{"class":1648},"    laser_min_range",[77,6508,1666],{"class":104},[77,6510,6511],{"class":1217},"-1.0\n",[77,6513,6514,6517,6519],{"class":79,"line":1433},[77,6515,6516],{"class":1648},"    laser_model_type",[77,6518,1666],{"class":104},[77,6520,6521],{"class":87},"\"likelihood_field\"\n",[77,6523,6524,6527,6529],{"class":79,"line":1449},[77,6525,6526],{"class":1648},"    max_beams",[77,6528,1666],{"class":104},[77,6530,6531],{"class":1217},"60\n",[77,6533,6534,6537,6539],{"class":79,"line":1463},[77,6535,6536],{"class":1648},"    max_particles",[77,6538,1666],{"class":104},[77,6540,6541],{"class":1217},"2000\n",[77,6543,6544,6547,6549],{"class":79,"line":1475},[77,6545,6546],{"class":1648},"    min_particles",[77,6548,1666],{"class":104},[77,6550,6551],{"class":1217},"500\n",[77,6553,6554,6557,6559],{"class":79,"line":1480},[77,6555,6556],{"class":1648},"    odom_frame_id",[77,6558,1666],{"class":104},[77,6560,6561],{"class":87},"\"odom\"\n",[77,6563,6564,6567,6569],{"class":79,"line":1491},[77,6565,6566],{"class":1648},"    pf_err",[77,6568,1666],{"class":104},[77,6570,1852],{"class":1217},[77,6572,6573,6576,6578],{"class":79,"line":1502},[77,6574,6575],{"class":1648},"    pf_z",[77,6577,1666],{"class":104},[77,6579,6580],{"class":1217},"0.99\n",[77,6582,6583,6586,6588],{"class":79,"line":1508},[77,6584,6585],{"class":1648},"    recovery_alpha_fast",[77,6587,1666],{"class":104},[77,6589,6590],{"class":1217},"0.0\n",[77,6592,6593,6596,6598],{"class":79,"line":1519},[77,6594,6595],{"class":1648},"    recovery_alpha_slow",[77,6597,1666],{"class":104},[77,6599,6590],{"class":1217},[77,6601,6602,6605,6607],{"class":79,"line":1525},[77,6603,6604],{"class":1648},"    resample_interval",[77,6606,1666],{"class":104},[77,6608,1819],{"class":1217},[77,6610,6611,6614,6616],{"class":79,"line":1538},[77,6612,6613],{"class":1648},"    robot_model_type",[77,6615,1666],{"class":104},[77,6617,6618],{"class":87},"\"nav2_amcl::DifferentialMotionModel\"\n",[77,6620,6621,6624,6626],{"class":79,"line":1551},[77,6622,6623],{"class":1648},"    save_pose_rate",[77,6625,1666],{"class":104},[77,6627,1874],{"class":1217},[77,6629,6630,6633,6635],{"class":79,"line":1563},[77,6631,6632],{"class":1648},"    sigma_hit",[77,6634,1666],{"class":104},[77,6636,1884],{"class":1217},[77,6638,6639,6642,6644],{"class":79,"line":1576},[77,6640,6641],{"class":1648},"    tf_broadcast",[77,6643,1666],{"class":104},[77,6645,1916],{"class":1217},[77,6647,6648,6651,6653],{"class":79,"line":1581},[77,6649,6650],{"class":1648},"    transform_tolerance",[77,6652,1666],{"class":104},[77,6654,1842],{"class":1217},[77,6656,6657,6660,6662],{"class":79,"line":1592},[77,6658,6659],{"class":1648},"    update_min_a",[77,6661,1666],{"class":104},[77,6663,1884],{"class":1217},[77,6665,6666,6669,6671],{"class":79,"line":1597},[77,6667,6668],{"class":1648},"    update_min_d",[77,6670,1666],{"class":104},[77,6672,4902],{"class":1217},[77,6674,6675,6678,6680],{"class":79,"line":1603},[77,6676,6677],{"class":1648},"    z_hit",[77,6679,1666],{"class":104},[77,6681,1874],{"class":1217},[77,6683,6684,6687,6689],{"class":79,"line":1609},[77,6685,6686],{"class":1648},"    z_max",[77,6688,1666],{"class":104},[77,6690,1852],{"class":1217},[77,6692,6693,6696,6698],{"class":79,"line":1615},[77,6694,6695],{"class":1648},"    z_rand",[77,6697,1666],{"class":104},[77,6699,1874],{"class":1217},[77,6701,6702,6705,6707],{"class":79,"line":1620},[77,6703,6704],{"class":1648},"    z_short",[77,6706,1666],{"class":104},[77,6708,1852],{"class":1217},[77,6710,6711,6713,6715],{"class":79,"line":2003},[77,6712,1758],{"class":1648},[77,6714,1666],{"class":104},[77,6716,6717],{"class":87},"scan\n",[77,6719,6720,6723,6725],{"class":79,"line":2014},[77,6721,6722],{"class":1648},"    set_initial_pose",[77,6724,1666],{"class":104},[77,6726,1809],{"class":1217},[18,6728,6729,6730,6732],{},"关于参数的具体含义，可以参考 ",[21,6731,5536],{}," 中参数相关内容。",[18,6734,6735],{},[21,6736,6737],{},"3.编辑配置文件",[18,6739,2272,6740,2276],{},[74,6741,2275],{},[68,6743,6744],{"className":2279,"code":2280,"language":2281,"meta":32,"style":32},[74,6745,6746,6752,6758],{"__ignoreMap":32},[77,6747,6748,6750],{"class":79,"line":80},[77,6749,2288],{"class":97},[77,6751,2291],{"class":104},[77,6753,6754,6756],{"class":79,"line":114},[77,6755,2296],{"class":104},[77,6757,2299],{"class":97},[77,6759,6760],{"class":79,"line":136},[77,6761,1345],{"class":104},[18,6763,6764],{},[21,6765,6766],{},"4.编译",[18,6768,2311],{},[68,6770,6772],{"className":70,"code":6771,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_localization\n",[74,6773,6774],{"__ignoreMap":32},[77,6775,6776,6778,6780,6782],{"class":79,"line":80},[77,6777,2321],{"class":83},[77,6779,2324],{"class":87},[77,6781,2327],{"class":1217},[77,6783,6784],{"class":87}," mycar_localization\n",[18,6786,6787],{},[21,6788,6789],{},"5.执行",[18,6791,4001],{},[68,6793,6795],{"className":70,"code":6794,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch stage_ros2 my_house.launch.py\n",[74,6796,6797,6803],{"__ignoreMap":32},[77,6798,6799,6801],{"class":79,"line":80},[77,6800,2350],{"class":1217},[77,6802,2353],{"class":87},[77,6804,6805,6807,6809,6812],{"class":79,"line":114},[77,6806,1205],{"class":83},[77,6808,2360],{"class":87},[77,6810,6811],{"class":87}," stage_ros2",[77,6813,6814],{"class":87}," my_house.launch.py\n",[18,6816,4024],{},[68,6818,6820],{"className":70,"code":6819,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_localization mycar_loca.launch.py\n",[74,6821,6822,6828],{"__ignoreMap":32},[77,6823,6824,6826],{"class":79,"line":80},[77,6825,2350],{"class":1217},[77,6827,2353],{"class":87},[77,6829,6830,6832,6834,6836],{"class":79,"line":114},[77,6831,1205],{"class":83},[77,6833,2360],{"class":87},[77,6835,5980],{"class":87},[77,6837,6838],{"class":87}," mycar_loca.launch.py\n",[18,6840,6841],{},"（3）启动键盘控制节点以作备用：",[68,6843,6845],{"className":70,"code":6844,"language":72,"meta":32,"style":32},"ros2 run teleop_twist_keyboard teleop_twist_keyboard\n",[74,6846,6847],{"__ignoreMap":32},[77,6848,6849,6851,6853,6856],{"class":79,"line":80},[77,6850,1205],{"class":83},[77,6852,4257],{"class":87},[77,6854,6855],{"class":87}," teleop_twist_keyboard",[77,6857,6858],{"class":87}," teleop_twist_keyboard\n",[18,6860,6861,6862,6864],{},"（4）在rviz2中，将Fixed Frme设置为map，添加TF插件，按照 ",[21,6863,5012],{},"  添加并显示地图。",[18,6866,6867,6868,6871],{},"接下来，点击rviz2菜单栏的",[74,6869,6870],{},"2D Pose Estimate","在地图中为机器人设置一个初始位姿。",[18,6873,6874],{},"这里需要给一个大概的机器人位置和机器人的朝向，不是很准确也可以，机器人会在运动中逐渐通过AMCL校准。",[18,6876,6877,6878,6880],{},"先点击",[74,6879,6870],{},"，左键在地图上点击机器人所在位置，长摁别松手，鼠标往机器人朝向的位置划，出现下方这种绿色箭头，再松手即可。",[18,6882,6883],{},[30,6884],{"alt":32,"src":6885},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1758.webp",[18,6887,6888,6889,6892,6893,6895,6896,6899,6900,6903],{},"再添加",[74,6890,6891],{},"ParticleCloud","插件，将话题设置为",[74,6894,5635],{},"，并将话题下",[74,6897,6898],{},"Reliability Policy","设置为",[74,6901,6902],{},"Best Effort","，最后使用键盘控制机器人运动时，会发现，机器人周边会出现点云，并且随着机器人的运动，点云会出现不同程度的收敛或发散。",[18,6905,6906],{},[30,6907],{"alt":32,"src":6908},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1759.webp",[18,6910,6911],{},[30,6912],{"alt":32,"src":6913},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1760.webp",[18,6915,6916],{},[30,6917],{"alt":32,"src":6918},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1761.webp",[18,6920,6921],{},"即便你的机器人撞墙了，rviz2和Gazebo的机器人位置完全偏移了，只要再让机器人运动一会儿，机器人位置会被重新预估出来，AMCL非常强。",[18,6923,6924],{},[30,6925],{"alt":32,"src":6926},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1762.webp",[18,6928,6929],{},"如上图位置已经完全偏移了。",[18,6931,6932],{},[30,6933],{"alt":32,"src":6934},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1763.webp",[18,6936,6937],{},"经过一段时间行驶，姿态位置再次被预估成功。",[10,6939,6940],{"id":6940},"导航服务器",[18,6942,6943],{},"本节将介绍导航服务器中核心节点，实现基本导航功能，并将导航与SLAM集成，以实现自主探索建图。",[18,6945,6946,6947,6950],{},"下方网站是官方NAV2的各个节点的参数说明(",[21,6948,6949],{},"调参的时候非常常用的网站","):",[18,6952,6953],{},[289,6954,291],{"href":291,"rel":6955},[293],[18,6957,6958],{},"看不懂的英文可以用沉浸式翻译这个chrome插件来翻译,可以进行中英文对照翻译,非常好用.",[18,6960,6961],{},[289,6962,6965],{"href":6963,"rel":6964},"https://chromewebstore.google.com/detail/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AF%91-%E7%BD%91%E9%A1%B5%E7%BF%BB%E8%AF%91%E6%8F%92%E4%BB%B6-pdf%E7%BF%BB%E8%AF%91-%E5%85%8D%E8%B4%B9/bpoadfkcbjbfhfodiogcnhhhpibjhbnh?utm%5C_source=official&pli=1",[293],"https://chromewebstore.google.com/detail/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AF%91-%E7%BD%91%E9%A1%B5%E7%BF%BB%E8%AF%91%E6%8F%92%E4%BB%B6-pdf%E7%BF%BB%E8%AF%91-%E5%85%8D%E8%B4%B9/bpoadfkcbjbfhfodiogcnhhhpibjhbnh?utm\\_source=official&pli=1",[18,6967,6968],{},[289,6969,6972],{"href":6970,"rel":6971},"https://microsoftedge.microsoft.com/addons/detail/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AF%91-%E7%BD%91%E9%A1%B5%E7%BF%BB%E8%AF%91%E6%8F%92%E4%BB%B6-pdf%E7%BF%BB%E8%AF%91-/amkbmndfnliijdhojkpoglbnaaahippg?utm%5C_source=official",[293],"https://microsoftedge.microsoft.com/addons/detail/%E6%B2%89%E6%B5%B8%E5%BC%8F%E7%BF%BB%E8%AF%91-%E7%BD%91%E9%A1%B5%E7%BF%BB%E8%AF%91%E6%8F%92%E4%BB%B6-pdf%E7%BF%BB%E8%AF%91-/amkbmndfnliijdhojkpoglbnaaahippg?utm\\_source=official",[18,6974,6975],{},[30,6976],{"alt":32,"src":6977},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1764.webp",[18,6979,6980],{},[30,6981],{"alt":32,"src":6982},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1765.webp",[18,6984,6985],{},"不会用这个插件的话,也可以看鱼香ROS翻译好的版本(但是网站不稳定):",[18,6987,6988],{},[289,6989,6990],{"href":6990,"rel":6991},"http://fishros.org/doc/nav2/configuration/index.html",[293],[14,6993,6994],{"id":6994},"生命周期管理节点说明",[18,6996,6997,6998,7000,7001,7003,7004,7006,7007,7009],{},"Nav2中通过的",[74,6999,5463],{},"功能包下的",[74,7002,5467],{},"节点管理其他节点的生命周期状态转换。",[74,7005,5467],{},"节点通过ROS 2的生命周期节点（Lifecycle Node）机制，提供了一种标准化的方法来控制Nav2中各个节点的状态转换。这些状态包括未配置（Unconfigured）、非活动（Inactive）、活动（Active）和结束（Finalized）等。通过精细控制这些状态转换，",[74,7008,5467],{},"节点能够确保Nav2系统的各个部分在正确的时机启动、运行和停止，从而提高系统的可靠性和稳定性。",[18,7011,7012],{},[21,7013,827],{},[46,7015,7016,7025,7034,7042,7048,7054,7068,7074],{},[49,7017,7018,7021,7022,7024],{},[74,7019,7020],{},"/bond_disable_heartbeat_timeout",": 该参数与节点之间的通信绑定（bonding）有关。节点之间的通信可以通过绑定来增强可靠性，而心跳超时是检测节点是否仍然活跃的一种方式。设置为",[74,7023,5816],{},"意味着启用心跳超时检测。",[49,7026,7027,7030,7031,7033],{},[74,7028,7029],{},"attempt_respawn_reconnection",": 取值为bool值，设置为",[74,7032,2022],{},"时，表示如果管理的节点意外终止，生命周期管理器将尝试重新启动它。",[49,7035,7036,7030,7039,7041],{},[74,7037,7038],{},"autostart",[74,7040,2022],{},"时，表示在生命周期管理器启动时，它将自动尝试启动其管理的节点。",[49,7043,7044,7047],{},[74,7045,7046],{},"bond_respawn_max_duration",": 重新连接或重新启动节点时的最大持续时间。",[49,7049,7050,7053],{},[74,7051,7052],{},"bond_timeout",": 与节点之间的通信绑定超时有关。如果在这个时间内没有收到来自另一个节点的消息，则认为该节点已经断开连接。",[49,7055,7056,7059,7060],{},[74,7057,7058],{},"diagnostic_updater",":",[46,7061,7062],{},[49,7063,7064,7067],{},[74,7065,7066],{},"period",": 诊断更新器的更新周期。诊断更新器用于收集和发布有关节点状态的诊断信息，定义了这些信息更新的频率。",[49,7069,7070,7073],{},[74,7071,7072],{},"node_names",": 由该生命周期管理器管理的节点名称列表。",[49,7075,7076,7078],{},[74,7077,5758],{},":是否使用仿真实践。",[14,7080,7081],{"id":7081},"行为树节点说明",[18,7083,7084,7087,7088,7000,7091,7094],{},[21,7085,7086],{},"行为树（BT）"," 是一种在智能体（如机器人或电脑游戏中的虚拟实体）中构建不同任务之间切换结构的方式。它是一种形式化的图形建模语言，以层次化的节点组织为特征，用于描述和规划复杂系统中各种实体的交互和决策。",[74,7089,7090],{},"nav2_bt_navigator",[74,7092,7093],{},"/bt_navigator","是Nav2中的行为树导航器节点，它实现了基于行为树的导航策略。行为树是一种用于描述复杂行为的树状结构，通过组合不同的行为节点，可以灵活地定义机器人的导航行为，包括路径规划、避障、恢复等。以下是官网。",[18,7096,7097],{},[289,7098,7099],{"href":7099,"rel":7100},"https://www.behaviortree.dev/",[293],[18,7102,7103],{},[289,7104,7105],{"href":7105,"rel":7106},"https://arxiv.org/abs/1709.00084",[293],[18,7108,7109],{},"github链接如下：",[18,7111,7112],{},[289,7113,7114],{"href":7114,"rel":7115},"https://github.com/BehaviorTree/BehaviorTree.CPP",[293],[18,7117,7118],{},"BT可视化工具Groot2下载：",[18,7120,7121],{},[289,7122,7123],{"href":7123,"rel":7124},"https://www.behaviortree.dev/groot/",[293],[312,7126,7127],{},[49,7128,533],{},[535,7130,7131,7141],{},[538,7132,7133],{},[541,7134,7135,7137,7139],{},[544,7136,547],{"align":546},[544,7138,4130],{"align":546},[544,7140,553],{"align":546},[555,7142,7143,7154,7163],{},[541,7144,7145,7148,7151],{},[560,7146,7147],{"align":546},"/goal_pose",[560,7149,7150],{"align":546},"geometry_msgs/msg/PoseStamped",[560,7152,7153],{"align":546},"导航目标点，用于触发导航任务",[541,7155,7156,7158,7160],{},[560,7157,573],{"align":546},[560,7159,576],{"align":546},[560,7161,7162],{"align":546},"坐标变换消息，用于不同坐标系之间的转换",[541,7164,7165,7167,7169],{},[560,7166,2741],{"align":546},[560,7168,2744],{"align":546},[560,7170,7171],{"align":546},"里程计数据，提供机器人位置和运动信息",[312,7173,7174],{"start":114},[49,7175,7176],{},"请求的Action",[535,7178,7179,7190],{},[538,7180,7181],{},[541,7182,7183,7186,7188],{},[544,7184,7185],{"align":546},"Action",[544,7187,4130],{"align":546},[544,7189,553],{"align":546},[555,7191,7192],{},[541,7193,7194,7197,7200],{},[560,7195,7196],{"align":546},"/navigate_to_pose",[560,7198,7199],{"align":546},"nav2_msgs/action/NavigateToPose",[560,7201,7202],{"align":546},"请求导航到指定位姿的Action，包括目标位姿和容忍度等参数",[312,7204,7205],{"start":136},[49,7206,827],{},[46,7208,7209,7214,7220,7226,7232,7238,7244,7250,7256,7262],{},[49,7210,7211,7213],{},[74,7212,5758],{},": 指定是否使用模拟时间而非实际时间。",[49,7215,7216,7219],{},[74,7217,7218],{},"global_frame",": 定义全局坐标系的名称，通常为地图坐标系。",[49,7221,7222,7225],{},[74,7223,7224],{},"robot_base_frame",": 指定机器人基座的坐标系名称。",[49,7227,7228,7231],{},[74,7229,7230],{},"odom_topic",": 里程计数据的ROS话题名称。",[49,7233,7234,7237],{},[74,7235,7236],{},"bt_loop_duration",": 行为树执行循环的持续时间（单位可能根据实现而异）。",[49,7239,7240,7243],{},[74,7241,7242],{},"default_server_timeout",": 导航服务器操作的默认超时时间。",[49,7245,7246,7249],{},[74,7247,7248],{},"enable_groot_monitoring",": 启用或禁用Groot监控功能。",[49,7251,7252,7255],{},[74,7253,7254],{},"groot_zmq_publisher_port",": Groot监控中ZeroMQ发布者的端口号。",[49,7257,7258,7261],{},[74,7259,7260],{},"groot_zmq_server_port",": Groot监控中ZeroMQ服务器的端口号。",[49,7263,7264,7267],{},[74,7265,7266],{},"plugin_lib_names",": 包含导航所需插件的库名称列表。",[14,7269,7270],{"id":7270},"规划器节点说明",[18,7272,7273,7274,7000,7277,7280,7281,7284],{},"在Nav2 导航框架中",[74,7275,7276],{},"nav2_planner",[74,7278,7279],{},"planner_server","节点，负责处理路径规划请求，生成从当前位置到目标位置的路径。该节点在执行时需要依赖于",[74,7282,7283],{},"/global_costmap/global_costmap","节点提供的地图消息。",[312,7286,7287],{},[49,7288,7289],{},"planner_server发布的话题",[535,7291,7292,7302],{},[538,7293,7294],{},[541,7295,7296,7298,7300],{},[544,7297,547],{"align":546},[544,7299,4130],{"align":546},[544,7301,553],{"align":546},[555,7303,7304],{},[541,7305,7306,7309,7312],{},[560,7307,7308],{"align":546},"/plan",[560,7310,7311],{"align":546},"nav_msgs/msg/Path",[560,7313,7314],{"align":546},"当前位置到目标点的全局路径",[312,7316,7317],{"start":114},[49,7318,7319],{},"planner_server 参数",[46,7321,7322,7330,7368,7374,7383],{},[49,7323,7324,7326,7327,7329],{},[74,7325,7020],{},": 这个参数控制是否禁用心跳超时检测，在ROS 2中，节点之间的通信绑定（bonding）机制用于增强通信的可靠性。心跳超时是检测节点是否仍然活跃的一种机制。如果该参数设置为",[74,7328,2022],{},"，则表示禁用了心跳超时检测，这可能在某些特定的网络环境下或当确信节点间通信非常稳定时使用。",[49,7331,7332,7335,7336],{},[74,7333,7334],{},"GridBased",": 这是一个配置块，专门用于设置基于网格的规划器的参数。基于网格的规划器通常使用地图的网格化表示来规划路径。",[46,7337,7338,7344,7350,7356,7362],{},[49,7339,7340,7343],{},[74,7341,7342],{},"allow_unknown",": 控制规划器是否允许在地图的未知（即未探索）区域中规划路径。",[49,7345,7346,7349],{},[74,7347,7348],{},"plugin",": 指定使用的规划器插件。",[49,7351,7352,7355],{},[74,7353,7354],{},"tolerance",": 设置规划路径时的容忍度，通常用于考虑机器人尺寸和定位的不确定性。",[49,7357,7358,7361],{},[74,7359,7360],{},"use_astar",": 控制是否使用A* 算法进行路径规划*。A** 算法是一种启发式搜索算法，能够找到从起点到终点的最短路径。",[49,7363,7364,7367],{},[74,7365,7366],{},"use_final_approach_orientation",": 控制规划器是否在路径的终点附近考虑机器人的最终朝向。",[49,7369,7370,7373],{},[74,7371,7372],{},"expected_planner_frequency",": 这个参数表示对规划器生成新路径的频率的预期值。它帮助系统监控规划器的性能，并可能用于调试或性能优化。",[49,7375,7376,7379,7380,7382],{},[74,7377,7378],{},"planner_plugins",": 这是一个列表，指定了可用的规划器插件。在这个例子中，它只包含了一个",[74,7381,7334],{},"规划器，但理论上可以包含多个不同类型的规划器，以适应不同的导航需求。",[49,7384,7385,7387,7388,7390],{},[74,7386,5758],{},": 这个参数控制是否使用模拟时间。在仿真环境中，时间是由仿真软件控制的，而不是由实际的物理时钟控制的。将此参数设置为",[74,7389,2022],{},"允许节点在仿真环境中正常运行，而无需依赖实际的系统时间。这对于开发和测试导航算法非常有用。",[312,7392,7393],{"start":136},[49,7394,7395],{},"/global_costmap/global_costmap订阅的话题",[535,7397,7398,7408],{},[538,7399,7400],{},[541,7401,7402,7404,7406],{},[544,7403,547],{"align":546},[544,7405,4130],{"align":546},[544,7407,553],{"align":546},[555,7409,7410,7421,7430],{},[541,7411,7412,7415,7418],{},[560,7413,7414],{"align":546},"/global_costmap/footprint",[560,7416,7417],{"align":546},"geometry_msgs/msg/Polygon",[560,7419,7420],{"align":546},"机器人（或任何移动平台）的足迹（footprint）信息。足迹是机器人在地图上占据的空间形状，通常用多边形表示。",[541,7422,7423,7425,7427],{},[560,7424,687],{"align":546},[560,7426,690],{"align":546},[560,7428,7429],{"align":546},"发布环境地图，特别是用于导航的占用网格图（Occupancy Grid Map）。",[541,7431,7432,7434,7436],{},[560,7433,562],{"align":546},[560,7435,565],{"align":546},[560,7437,7438],{"align":546},"激光扫描数据。",[312,7440,7441],{"start":143},[49,7442,7443],{},"/global_costmap/global_costmap发布的话题",[535,7445,7446,7456],{},[538,7447,7448],{},[541,7449,7450,7452,7454],{},[544,7451,547],{"align":546},[544,7453,4130],{"align":546},[544,7455,553],{"align":546},[555,7457,7458,7468,7479,7490],{},[541,7459,7460,7463,7465],{},[560,7461,7462],{"align":546},"/global_costmap/costmap",[560,7464,690],{"align":546},[560,7466,7467],{"align":546},"发布全局代价地图的当前状态。",[541,7469,7470,7473,7476],{},[560,7471,7472],{"align":546},"/global_costmap/costmap_raw",[560,7474,7475],{"align":546},"nav2_msgs/msg/Costmap",[560,7477,7478],{"align":546},"未经进一步处理的原始代价地图数据。",[541,7480,7481,7484,7487],{},[560,7482,7483],{"align":546},"/global_costmap/costmap_updates",[560,7485,7486],{"align":546},"map_msgs/msg/OccupancyGridUpdate",[560,7488,7489],{"align":546},"全局代价地图的更新，该消息可以高效更新地图。",[541,7491,7492,7495,7498],{},[560,7493,7494],{"align":546},"/global_costmap/published_footprint",[560,7496,7497],{"align":546},"geometry_msgs/msg/PolygonStamped",[560,7499,7500],{"align":546},"发布机器人的足迹（footprint），即机器人在地图上占据的空间形状。",[312,7502,7503],{"start":150},[49,7504,7505],{},"/global_costmap/global_costmap参数",[46,7507,7508,7513,7519,7525,7531,7537,7543,7548,7557,7600,7606,7611,7617,7667,7676,7682,7688,7693,7698,7704,7710,7749,7755,7760,7766,7772,7778,7784,7789],{},[49,7509,7510,7512],{},[74,7511,7020],{},": 控制是否禁用心跳超时检测，这在节点间通信绑定时用于监控对方节点的活跃度。",[49,7514,7515,7518],{},[74,7516,7517],{},"always_send_full_costmap",": 控制是否总是发送完整的代价地图信息，而不是仅发送变化的部分。",[49,7520,7521,7524],{},[74,7522,7523],{},"clearable_layers",": 列出可以被清除的代价图层，这些图层中的障碍物信息可以通过某种方式（如传感器数据）被更新或清除。",[49,7526,7527,7530],{},[74,7528,7529],{},"filters",": 定义应用于代价地图的过滤器列表，用于预处理或修改地图数据。",[49,7532,7533,7536],{},[74,7534,7535],{},"footprint",": 指定机器人在地图上的足迹形状，即机器人占据的空间范围。",[49,7538,7539,7542],{},[74,7540,7541],{},"footprint_padding",": 为机器人的足迹添加额外的填充空间，以考虑机器人运动时的额外空间需求。",[49,7544,7545,7547],{},[74,7546,7218],{},": 定义全局代价地图所使用的参考坐标系。",[49,7549,7550,2677,7553,7556],{},[74,7551,7552],{},"height",[74,7554,7555],{},"width",": 定义全局代价地图的高度和宽度（以单元格数计）。",[49,7558,7559,7562,7563],{},[74,7560,7561],{},"inflation_layer",": 配置膨胀层的参数，膨胀层用于在障碍物周围增加一定宽度的“缓冲区”，以避免机器人与障碍物过近。",[46,7564,7565,7571,7577,7583,7589,7595],{},[49,7566,7567,7570],{},[74,7568,7569],{},"cost_scaling_factor",": 膨胀成本的缩放因子。",[49,7572,7573,7576],{},[74,7574,7575],{},"enabled",": 控制膨胀层是否启用。",[49,7578,7579,7582],{},[74,7580,7581],{},"inflate_around_unknown",": 控制是否在未知空间周围进行膨胀。",[49,7584,7585,7588],{},[74,7586,7587],{},"inflate_unknown",": 控制是否将未知空间视为障碍物并进行膨胀。",[49,7590,7591,7594],{},[74,7592,7593],{},"inflation_radius",": 膨胀的半径。",[49,7596,7597,7599],{},[74,7598,7348],{},": 指定使用的膨胀层插件。",[49,7601,7602,7605],{},[74,7603,7604],{},"lethal_cost_threshold",": 定义代价地图中视为“致命”障碍物的成本阈值。",[49,7607,7608,7610],{},[74,7609,5915],{},": 指定订阅以获取地图信息的ROS话题。",[49,7612,7613,7616],{},[74,7614,7615],{},"observation_sources",": 定义代价地图的观测源，即哪些传感器或数据源用于更新地图。",[49,7618,7619,7622,7623],{},[74,7620,7621],{},"obstacle_layer",": 配置障碍物层的参数，障碍物层负责处理传感器观测到的障碍物信息。",[46,7624,7625,7631,7636,7642,7651,7656,7661],{},[49,7626,7627,7630],{},[74,7628,7629],{},"combination_method",": 定义如何组合多个观测源的信息。",[49,7632,7633,7635],{},[74,7634,7575],{},": 控制障碍物层是否启用。",[49,7637,7638,7641],{},[74,7639,7640],{},"footprint_clearing_enabled",": 控制是否清除机器人足迹内的障碍物信息。",[49,7643,7644,2677,7647,7650],{},[74,7645,7646],{},"max_obstacle_height",[74,7648,7649],{},"min_obstacle_height",": 定义障碍物的高度范围。",[49,7652,7653,7655],{},[74,7654,7615],{},": 指定障碍物信息的来源。",[49,7657,7658,7660],{},[74,7659,7348],{},": 指定使用的障碍物层插件。",[49,7662,7663,7666],{},[74,7664,7665],{},"scan",": 包含与激光扫描相关的配置，如扫描数据的处理方式。",[49,7668,7669,2677,7672,7675],{},[74,7670,7671],{},"origin_x",[74,7673,7674],{},"origin_y",": 定义全局代价地图原点的坐标。",[49,7677,7678,7681],{},[74,7679,7680],{},"plugins",": 列出启用的代价地图插件，这些插件定义了如何构建和更新代价地图。",[49,7683,7684,7687],{},[74,7685,7686],{},"publish_frequency",": 定义发布代价地图的频率。",[49,7689,7690,7692],{},[74,7691,982],{},": 定义代价地图的分辨率，即每个单元格代表的实际物理尺寸。",[49,7694,7695,7697],{},[74,7696,7224],{},": 定义机器人基座的参考坐标系。",[49,7699,7700,7703],{},[74,7701,7702],{},"robot_radius",": 定义机器人的半径，用于计算机器人在地图上的占用空间。",[49,7705,7706,7709],{},[74,7707,7708],{},"rolling_window",": 控制是否使用滚动窗口（即动态变化的地图区域）而非固定大小的地图。",[49,7711,7712,7715,7716],{},[74,7713,7714],{},"static_layer",": 配置静态层的参数，静态层负责处理地图中的静态障碍物信息。",[46,7717,7718,7723,7728,7733,7738,7744],{},[49,7719,7720,7722],{},[74,7721,7575],{},": 控制静态层是否启用。",[49,7724,7725,7727],{},[74,7726,4172],{},": 控制是否订阅瞬态本地地图更新。",[49,7729,7730,7732],{},[74,7731,5915],{},": 指定静态地图的ROS话题（如果不同于全局地图）。",[49,7734,7735,7737],{},[74,7736,7348],{},": 指定使用的静态层插件。",[49,7739,7740,7743],{},[74,7741,7742],{},"subscribe_to_updates",": 控制是否订阅地图更新。",[49,7745,7746,7748],{},[74,7747,5752],{},": 定义坐标变换的容忍度。",[49,7750,7751,7754],{},[74,7752,7753],{},"track_unknown_space",": 控制是否跟踪地图中的未知空间。",[49,7756,7757,7759],{},[74,7758,5752],{},": 定义在坐标变换过程中允许的误差范围。",[49,7761,7762,7765],{},[74,7763,7764],{},"trinary_costmap",": 控制是否使用三态代价地图（空闲、占用、未知），而不是仅使用二态（空闲、占用）。",[49,7767,7768,7771],{},[74,7769,7770],{},"unknown_cost_value",": 定义在代价地图中表示未知空间的值。",[49,7773,7774,7777],{},[74,7775,7776],{},"update_frequency",": 定义更新代价地图的频率。",[49,7779,7780,7783],{},[74,7781,7782],{},"use_maximum",": 控制是否使用多个观测源中的最大值来更新代价地图。",[49,7785,7786,7788],{},[74,7787,5758],{},": 控制是否使用仿真时间（在仿真环境中很有用）。",[49,7790,7791,7794,7795],{},[74,7792,7793],{},"voxel_layer",": 配置体素层的参数，体素层使用体素网格来表示三维空间中的障碍物信息。",[46,7796,7797,7802,7807,7816,7823,7828,7834,7839,7845,7849],{},[49,7798,7799,7801],{},[74,7800,7575],{},": 控制体素层是否启用。",[49,7803,7804,7806],{},[74,7805,7640],{},": 控制是否清除机器人足迹内的体素信息。",[49,7808,7809,2677,7812,7815],{},[74,7810,7811],{},"mark_threshold",[74,7813,7814],{},"unknown_threshold",": 定义将体素视为障碍物或未知的阈值。",[49,7817,7818,2677,7820,7822],{},[74,7819,7646],{},[74,7821,7649],{},": 定义体素表示的障碍物的高度范围。",[49,7824,7825,7827],{},[74,7826,7615],{},": 指定体素信息的来源。",[49,7829,7830,7833],{},[74,7831,7832],{},"origin_z",": 定义体素网格在Z轴上的原点。",[49,7835,7836,7838],{},[74,7837,7348],{},": 指定使用的体素层插件。",[49,7840,7841,7844],{},[74,7842,7843],{},"publish_voxel_map",": 控制是否发布体素地图。",[49,7846,7847,7666],{},[74,7848,7665],{},[49,7850,7851,2677,7854,7857],{},[74,7852,7853],{},"z_resolution",[74,7855,7856],{},"z_voxels",": 定义体素网格在Z轴上的分辨率和体素数。",[14,7859,7860],{"id":7860},"控制器节点说明",[18,7862,7863,7864,7867,7868,7871,7872,7874,7875,7284],{},"在Nav2导航系统中",[74,7865,7866],{},"nav2_controller","功能包的",[74,7869,7870],{},"controller_server","负责处理导航任务中的控制请求，确保机器人能够按照规划的路径进行移动。其主要功能是根据",[74,7873,7276],{},"模块计算出的全局或局部路径，生成速度、方向控制的命令，即控制机器人沿着规划好的路径行走。该节点在执行时还需要依赖于",[74,7876,7877],{},"/local_costmap/local_costmap",[18,7879,7880],{},[21,7881,7882],{},"1.controller_server订阅的话题",[535,7884,7885,7895],{},[538,7886,7887],{},[541,7888,7889,7891,7893],{},[544,7890,547],{"align":546},[544,7892,4130],{"align":546},[544,7894,553],{"align":546},[555,7896,7897,7906],{},[541,7898,7899,7901,7903],{},[560,7900,2741],{"align":546},[560,7902,2744],{"align":546},[560,7904,7905],{"align":546},"机器人的里程计信息，包含位置、速度和姿态",[541,7907,7908,7911,7914],{},[560,7909,7910],{"align":546},"/speed_limit",[560,7912,7913],{"align":546},"nav2_msgs/msg/SpeedLimit",[560,7915,7916],{"align":546},"导航过程中的速度限制信息，用于动态调整机器人的移动速度",[18,7918,7919],{},[21,7920,7921],{},"2.controller_server发布的话题",[535,7923,7924,7936],{},[538,7925,7926],{},[541,7927,7928,7931,7934],{},[544,7929,7930],{"align":546},"话题名称",[544,7932,7933],{"align":546},"消息类型",[544,7935,553],{"align":546},[555,7937,7938,7949,7960,7970,7981,7991],{},[541,7939,7940,7943,7946],{},[560,7941,7942],{"align":546},"/cmd_vel_nav",[560,7944,7945],{"align":546},"geometry_msgs/msg/Twist",[560,7947,7948],{"align":546},"发布控制命令，包括线性和角速度，用于控制机器人按照规划路径移动。",[541,7950,7951,7954,7957],{},[560,7952,7953],{"align":546},"/cost_cloud",[560,7955,7956],{"align":546},"sensor_msgs/msg/PointCloud2",[560,7958,7959],{"align":546},"发布成本地图中的点云数据，用于避障和路径规划。",[541,7961,7962,7965,7967],{},[560,7963,7964],{"align":546},"/local_plan",[560,7966,7311],{"align":546},[560,7968,7969],{"align":546},"发布局部路径规划结果，即机器人应如何到达当前目标点附近的一个点。",[541,7971,7972,7975,7978],{},[560,7973,7974],{"align":546},"/marker",[560,7976,7977],{"align":546},"visualization_msgs/msg/MarkerArray",[560,7979,7980],{"align":546},"发布可视化标记，用于在RViz等可视化工具中显示路径、障碍物等信息。",[541,7982,7983,7986,7988],{},[560,7984,7985],{"align":546},"/received_global_plan",[560,7987,7311],{"align":546},[560,7989,7990],{"align":546},"发布从全局规划器接收到的全局路径，即当前位置到目标点的路径。",[541,7992,7993,7996,7998],{},[560,7994,7995],{"align":546},"/transformed_global_plan",[560,7997,7311],{"align":546},[560,7999,8000],{"align":546},"发布经过坐标变换的全局路径，确保路径与机器人的当前坐标系一致。",[18,8002,8003],{},[21,8004,8005],{},"3.controller_server参数",[46,8007,8008,8042,8045,8048,8051,8054,8057,8060,8063,8066,8069,8072],{},[49,8009,8010,8011],{},"FollowPath: 这个部分定义了一个名为FollowPath的插件或配置集，它可能是一个路径跟随行为或算法的配置。它包含了多个子参数和子配置，用于定义如何跟随路径。",[46,8012,8013,8027,8030,8033,8036,8039],{},[49,8014,8015,8016],{},"BaseObstacle: 定义了基本的障碍物评估参数，用于在路径跟随过程中避免障碍物。",[46,8017,8018,8021,8024],{},[49,8019,8020],{},"class: 指定了类的名称，这里是BaseObstacle，表示这是一个基本障碍物评估组件。",[49,8022,8023],{},"scale: 定义了该障碍物评估在整体评估中的权重或影响程度。",[49,8025,8026],{},"sum_scores: 指示是否累加多个障碍物的分数，false可能表示使用最大值或其他逻辑。",[49,8028,8029],{},"GoalAlign, GoalDist, PathAlign, PathDist, RotateToGoal, Oscillation: 这些都是路径跟随过程中的不同评估或行为组件，每个都有其特定的参数和用途，如对齐目标、保持与目标或路径的距离、减少振荡等。",[49,8031,8032],{},"acc_lim_theta, acc_lim_x, acc_lim_y: 这些参数定义了机器人在不同方向上的加速度限制。",[49,8034,8035],{},"critics: 指定了哪些评估组件（或“批评家”）将被用于路径跟随决策。",[49,8037,8038],{},"debug_trajectory_details: 指示是否发布轨迹的详细调试信息。",[49,8040,8041],{},"其他与速度、加速度、时间粒度、轨迹生成等相关的参数，共同定义了路径跟随算法的行为和性能。",[49,8043,8044],{},"controller_frequency: 指定了控制器（可能是FollowPath或其他控制器）的运行频率，以赫兹为单位。",[49,8046,8047],{},"controller_plugins: 指定了将要使用的控制器插件列表，这里只包含了FollowPath。",[49,8049,8050],{},"failure_tolerance: 定义了容忍失败的时间或距离，用于在评估控制器是否失败时提供一定的缓冲。",[49,8052,8053],{},"general_goal_checker: 定义了一个通用的目标检查器，用于确定机器人是否已达到其目标位置和方向。",[49,8055,8056],{},"goal_checker_plugins: 指定了将要使用的目标检查器插件列表。",[49,8058,8059],{},"min_theta_velocity_threshold, min_x_velocity_threshold, min_y_velocity_threshold: 这些定义了机器人在不同方向上的最小速度阈值，低于这些阈值可能被视为停止或静止。",[49,8061,8062],{},"odom_topic: 指定了里程计信息的ROS主题。",[49,8064,8065],{},"progress_checker: 定义了一个进度检查器，用于评估机器人是否在向目标移动。",[49,8067,8068],{},"qos_overrides: 定义了ROS服务或主题的QoS（服务质量）覆盖设置，用于调整消息传递的可靠性和性能。",[49,8070,8071],{},"speed_limit_topic: 指定了速度限制信息的ROS主题。",[49,8073,8074],{},"use_sim_time: 指示是否使用模拟时间，这在ROS仿真环境中非常有用。",[18,8076,8077],{},[21,8078,8079],{},"4./local_costmap/local_costmap订阅的话题",[535,8081,8082,8092],{},[538,8083,8084],{},[541,8085,8086,8088,8090],{},[544,8087,547],{"align":546},[544,8089,4130],{"align":546},[544,8091,553],{"align":546},[555,8093,8094,8104],{},[541,8095,8096,8099,8101],{},[560,8097,8098],{"align":546},"/local_costmap/footprint",[560,8100,7417],{"align":546},[560,8102,8103],{"align":546},"机器人或移动平台的足迹多边形，用于本地代价地图的计算",[541,8105,8106,8108,8110],{},[560,8107,562],{"align":546},[560,8109,565],{"align":546},[560,8111,8112],{"align":546},"激光扫描仪的扫描数据，用于环境感知和避障",[18,8114,8115],{},[21,8116,8117],{},"5./local_costmap/local_costmap发布的话题",[535,8119,8120,8130],{},[538,8121,8122],{},[541,8123,8124,8126,8128],{},[544,8125,547],{"align":546},[544,8127,4130],{"align":546},[544,8129,553],{"align":546},[555,8131,8132,8142,8152,8162,8172,8182],{},[541,8133,8134,8137,8139],{},[560,8135,8136],{"align":546},"/local_costmap/clearing_endpoints",[560,8138,7956],{"align":546},[560,8140,8141],{"align":546},"清除成本图上的障碍物点云数据，通常用于动态障碍物处理",[541,8143,8144,8147,8149],{},[560,8145,8146],{"align":546},"/local_costmap/costmap",[560,8148,690],{"align":546},[560,8150,8151],{"align":546},"本地成本图，表示机器人周围环境的可通行性",[541,8153,8154,8157,8159],{},[560,8155,8156],{"align":546},"/local_costmap/costmap_raw",[560,8158,7475],{"align":546},[560,8160,8161],{"align":546},"未经处理的本地成本图，可能包含更详细的信息",[541,8163,8164,8167,8169],{},[560,8165,8166],{"align":546},"/local_costmap/costmap_updates",[560,8168,7486],{"align":546},[560,8170,8171],{"align":546},"本地成本图的更新信息，包括哪些区域发生了变化",[541,8173,8174,8177,8179],{},[560,8175,8176],{"align":546},"/local_costmap/published_footprint",[560,8178,7497],{"align":546},[560,8180,8181],{"align":546},"发布的机器人足迹多边形，时间戳表示发布时间",[541,8183,8184,8187,8190],{},[560,8185,8186],{"align":546},"/local_costmap/voxel_grid",[560,8188,8189],{"align":546},"nav2_msgs/msg/VoxelGrid",[560,8191,8192],{"align":546},"体素网格数据，用于成本图生成中的空间划分和优化",[18,8194,8195],{},[21,8196,8197],{},"6./local_costmap/local_costmap参数",[46,8199,8200,8208,8216,8229,8234,8239,8244,8249,8254,8259,8264,8269,8274,8279,8286,8291,8296,8301,8306,8311,8319,8324,8329,8334,8339,8344,8349,8354],{},[49,8201,8202,8204,8205,8207],{},[74,8203,7020],{},": 是否禁用节点间的心跳超时检查。当设置为",[74,8206,2022],{},"时，表示禁用该功能，可能用于减少网络通信量或适应特定网络环境。",[49,8209,8210,8212,8213,8215],{},[74,8211,7517],{},": 是否总是发送完整的成本图。当设置为",[74,8214,2022],{},"时，节点将不依赖于增量更新，而是始终发送完整的成本图数据。",[49,8217,8218,8220,8221,5803,8223,2677,8225,8228],{},[74,8219,7523],{},": 指定可以被清除的层列表。在这个例子中，包括",[74,8222,7621],{},[74,8224,7793],{},[74,8226,8227],{},"range_layer","，这意味着这些层中的障碍物数据可以被清除。",[49,8230,8231,8233],{},[74,8232,7529],{},": 用于指定应用于成本图的过滤器列表。此处为空，表示没有应用任何过滤器。",[49,8235,8236,8238],{},[74,8237,7535],{},": 机器人的足迹多边形，定义了机器人在二维空间中的物理占用区域。",[49,8240,8241,8243],{},[74,8242,7541],{},": 足迹的填充量，用于在计算成本图时给机器人足迹添加额外的空间。",[49,8245,8246,8248],{},[74,8247,7218],{},": 全局参考坐标系的名称，通常用于定位和导航任务。",[49,8250,8251,8253],{},[74,8252,7552],{},": 成本图的高度（以单元格数量计）。",[49,8255,8256,8258],{},[74,8257,7561],{},": 膨胀层的配置，用于在障碍物周围添加一定范围的膨胀区域，使机器人与障碍物保持安全距离。",[49,8260,8261,8263],{},[74,8262,7604],{},": 致命成本阈值，超过此阈值的成本值表示不可通行的区域。",[49,8265,8266,8268],{},[74,8267,5915],{},": 订阅的地图主题名称，用于获取全局地图信息。",[49,8270,8271,8273],{},[74,8272,7615],{},": 观察源的配置，用于指定哪些传感器数据将被用于更新成本图。此处为空字符串，可能是默认值或配置方式的不同。",[49,8275,8276,8278],{},[74,8277,7621],{},": 障碍物层的配置，用于处理来自传感器（如激光雷达）的障碍物数据。",[49,8280,8281,3730,8283,8285],{},[74,8282,7671],{},[74,8284,7674],{},": 成本图原点的X和Y坐标，定义了成本图在全局坐标系中的位置。",[49,8287,8288,8290],{},[74,8289,7680],{},": 启用的插件列表，定义了成本图使用的不同层（如障碍物层、膨胀层等）。",[49,8292,8293,8295],{},[74,8294,7686],{},": 成本图的发布频率（以Hz为单位）。",[49,8297,8298,8300],{},[74,8299,982],{},": 成本图的分辨率（以米/单元格计）。",[49,8302,8303,8305],{},[74,8304,7224],{},": 机器人基座的参考坐标系名称，用于定位机器人。",[49,8307,8308,8310],{},[74,8309,7702],{},": 机器人的半径，用于在成本图中表示机器人的物理尺寸。",[49,8312,8313,8315,8316,8318],{},[74,8314,7708],{},": 是否使用滚动窗口。当设置为",[74,8317,2022],{},"时，成本图将随着机器人的移动而更新其位置和范围。",[49,8320,8321,8323],{},[74,8322,7753],{},": 是否跟踪未知空间。在某些情况下，这可能用于处理未探索或未知的区域。",[49,8325,8326,8328],{},[74,8327,5752],{},": 变换容差，定义了接受变换的时间差和角度差的阈值。",[49,8330,8331,8333],{},[74,8332,7764],{},": 是否使用三态成本图（通常是自由、占用、未知）。",[49,8335,8336,8338],{},[74,8337,7770],{},": 未知区域在成本图中的成本值。",[49,8340,8341,8343],{},[74,8342,7776],{},": 成本图的更新频率（以Hz为单位），不同于发布频率。",[49,8345,8346,8348],{},[74,8347,7782],{},": 是否在多个源提供相同位置的成本信息时使用最大值。",[49,8350,8351,8353],{},[74,8352,5758],{},": 是否使用模拟时间而非系统时间。这在仿真环境中很有用。",[49,8355,8356,8358],{},[74,8357,7793],{},": 体素层的配置，用于将三维空间划分为体素（体积像素），以提高成本图的处理效率。",[14,8360,8361],{"id":8361},"恢复器节点说明",[18,8363,8364,8365,7867,8368,8371],{},"恢复行为是机器人导航过程中一个至关重要的部分，它允许机器人在遇到障碍、卡住或其他导航问题时采取一系列预定义的动作来尝试恢复。在Nav2中由",[74,8366,8367],{},"nav2_behaviors",[74,8369,8370],{},"behavior_server","实现这一功能。",[18,8373,8374],{},[21,8375,5547],{},[535,8377,8378,8388],{},[538,8379,8380],{},[541,8381,8382,8384,8386],{},[544,8383,547],{"align":546},[544,8385,4130],{"align":546},[544,8387,553],{"align":546},[555,8389,8390,8401,8411,8420,8429],{},[541,8391,8392,8395,8398],{},[560,8393,8394],{"align":546},"/clock",[560,8396,8397],{"align":546},"rosgraph_msgs/msg/Clock",[560,8399,8400],{"align":546},"ROS系统时间",[541,8402,8403,8406,8408],{},[560,8404,8405],{"align":546},"/cmd_vel_teleop",[560,8407,7945],{"align":546},[560,8409,8410],{"align":546},"遥操作命令，用于控制机器人的线性和角速度",[541,8412,8413,8415,8417],{},[560,8414,8156],{"align":546},[560,8416,7475],{"align":546},[560,8418,8419],{"align":546},"局部代价地图的原始数据",[541,8421,8422,8424,8426],{},[560,8423,8176],{"align":546},[560,8425,7497],{"align":546},[560,8427,8428],{"align":546},"机器人在局部代价地图中的已发布足迹",[541,8430,8431,8434,8437],{},[560,8432,8433],{"align":546},"/preempt_teleop",[560,8435,8436],{"align":546},"std_msgs/msg/Empty",[560,8438,8439],{"align":546},"遥操作抢占信号，用于中断当前遥操作",[18,8441,8442],{},[21,8443,5606],{},[535,8445,8446,8456],{},[538,8447,8448],{},[541,8449,8450,8452,8454],{},[544,8451,547],{"align":546},[544,8453,4130],{"align":546},[544,8455,553],{"align":546},[555,8457,8458],{},[541,8459,8460,8463,8465],{},[560,8461,8462],{"align":546},"/cmd_vel",[560,8464,7945],{"align":546},[560,8466,8467],{"align":546},"发送给底层控制器的速度命令",[18,8469,8470],{},[21,8471,8472],{},"3.提供的Action服务器",[535,8474,8475,8486],{},[538,8476,8477],{},[541,8478,8479,8481,8484],{},[544,8480,547],{"align":546},[544,8482,8483],{"align":546},"Action接口",[544,8485,553],{"align":546},[555,8487,8488,8499,8510,8521,8532],{},[541,8489,8490,8493,8496],{},[560,8491,8492],{"align":546},"/assisted_teleop",[560,8494,8495],{"align":546},"nav2_msgs/action/AssistedTeleop",[560,8497,8498],{"align":546},"遥控辅助操作服务，允许用户在导航时提供方向性输入",[541,8500,8501,8504,8507],{},[560,8502,8503],{"align":546},"/backup",[560,8505,8506],{"align":546},"nav2_msgs/action/BackUp",[560,8508,8509],{"align":546},"后退动作服务，用于在特定情况下使机器人后退",[541,8511,8512,8515,8518],{},[560,8513,8514],{"align":546},"/drive_on_heading",[560,8516,8517],{"align":546},"nav2_msgs/action/DriveOnHeading",[560,8519,8520],{"align":546},"按指定航向行驶的动作服务",[541,8522,8523,8526,8529],{},[560,8524,8525],{"align":546},"/spin",[560,8527,8528],{"align":546},"nav2_msgs/action/Spin",[560,8530,8531],{"align":546},"旋转动作服务，允许机器人在原地旋转",[541,8533,8534,8537,8540],{},[560,8535,8536],{"align":546},"/wait",[560,8538,8539],{"align":546},"nav2_msgs/action/Wait",[560,8541,8542],{"align":546},"等待动作服务，使机器人在当前位置等待一定时间",[18,8544,8545],{},[21,8546,5695],{},[46,8548,8549,8554,8562,8567,8572,8580,8598,8604,8610,8616,8622,8634,8640,8646,8655],{},[49,8550,8551,8553],{},[74,8552,5758],{},": 该参数指定是否使用模拟时间而非实际时间。这在仿真环境中非常有用，因为仿真环境可以加速或减速时间流逝，而不需要等待实际时间的流逝。",[49,8555,8556,8558,8559,8561],{},[74,8557,7218],{},": 定义全局坐标系的名称，该坐标系通常用于导航任务中的定位和路径规划。在这里，它被设置为",[74,8560,5739],{},"，意味着使用里程计数据来作为全局坐标系的参考。",[49,8563,8564,8566],{},[74,8565,7224],{},": 指定机器人基座的坐标系名称。这是机器人上用于定位和运动控制的参考点，通常与机器人的物理中心或驱动轮的中心相对应。",[49,8568,8569,8571],{},[74,8570,7230],{},": 这是一个ROS话题名称，用于发布里程计数据。里程计数据包含了机器人随时间推移的位置和姿态变化信息，是导航和定位系统的关键输入之一。",[49,8573,8574,8576,8577,8579],{},[74,8575,7020],{},"：这个参数可能用于配置ROS节点之间的心跳检测机制。将其设置为",[74,8578,2022],{},"可能意味着禁用或调整心跳超时的行为，以便在特定情况下（如仿真环境）避免不必要的超时错误。",[49,8581,8582,3730,8585,3730,8588,3730,8591,3730,8594,8597],{},[74,8583,8584],{},"assisted_teleop",[74,8586,8587],{},"backup",[74,8589,8590],{},"drive_on_heading",[74,8592,8593],{},"spin",[74,8595,8596],{},"wait",": 这些是行为树中可能使用的行为插件的配置项。每个插件都定义了机器人可以执行的一种特定行为，如辅助遥操作、后退、按指定方向行驶、原地旋转和等待。",[49,8599,8600,8603],{},[74,8601,8602],{},"behavior_plugins",": 列出了在行为树中可用的行为插件名称。",[49,8605,8606,8609],{},[74,8607,8608],{},"cmd_vel_teleop",": 指定了用于遥操作的速度控制命令的ROS话题名称。",[49,8611,8612,8615],{},[74,8613,8614],{},"costmap_topic",": 定义了局部代价地图的ROS话题名称，代价地图用于表示环境中的障碍物和可通行区域。",[49,8617,8618,8621],{},[74,8619,8620],{},"cycle_frequency",": 定义了导航系统更新其状态和规划新路径的频率（以赫兹为单位）。",[49,8623,8624,3730,8627,3730,8630,8633],{},[74,8625,8626],{},"max_rotational_vel",[74,8628,8629],{},"min_rotational_vel",[74,8631,8632],{},"rotational_acc_lim",": 这些参数定义了机器人旋转时的最大速度、最小速度和加速度限制。",[49,8635,8636,8639],{},[74,8637,8638],{},"projection_time",": 与代价地图的更新或预测未来障碍物位置有关的时间参数。",[49,8641,8642,8645],{},[74,8643,8644],{},"footprint_topic",": 定义了发布机器人足迹（即机器人占据的空间）的ROS话题名称。",[49,8647,8648,3730,8651,8654],{},[74,8649,8650],{},"simulate_ahead_time",[74,8652,8653],{},"simulation_time_step",": 这些参数与仿真环境相关，可能用于控制仿真过程中的时间流逝和步长。",[49,8656,8657,8659],{},[74,8658,5752],{},": 定义了坐标变换时的容差范围，用于处理不同坐标系之间的微小差异。",[14,8661,8662],{"id":8662},"航点跟随节点说明",[18,8664,8665,8666,8669,8670,8673,8674,2677,8677,8680],{},"在Nav2 导航堆栈中，",[74,8667,8668],{},"nav2_waypoint_follower","包下的",[74,8671,8672],{},"/waypoint_follower","节点负责跟踪由路径规划器生成的一系列航点（waypoints），以确保机器人能够沿着预定的路径安全、准确地移动。该节点的主要功能是根据当前机器人位置和速度信息，以及由路径规划器（如",[74,8675,8676],{},"nav2_global_planner",[74,8678,8679],{},"nav2_local_planner","）提供的航点列表，计算出控制指令来控制机器人的运动。这些控制指令可能包括线性和角速度命令，或者更具体的运动学或动力学命令，具体取决于机器人的类型和配置。",[18,8682,8683],{},[21,8684,8685],{},"1.提供的Action服务器",[535,8687,8688,8698],{},[538,8689,8690],{},[541,8691,8692,8694,8696],{},[544,8693,547],{"align":546},[544,8695,8483],{"align":546},[544,8697,553],{"align":546},[555,8699,8700],{},[541,8701,8702,8705,8708],{},[560,8703,8704],{"align":546},"/follow_waypoints",[560,8706,8707],{"align":546},"nav2_msgs/action/FollowWaypoints",[560,8709,8710],{"align":546},"允许客户端请求planner_server按照一系列路点进行导航",[18,8712,8713],{},[21,8714,8715],{},"2.请求的Action服务",[535,8717,8718,8728],{},[538,8719,8720],{},[541,8721,8722,8724,8726],{},[544,8723,547],{"align":546},[544,8725,8483],{"align":546},[544,8727,553],{"align":546},[555,8729,8730],{},[541,8731,8732,8734,8736],{},[560,8733,7196],{"align":546},[560,8735,7199],{"align":546},[560,8737,8738],{"align":546},"允许planner_server（或调用它的节点）请求导航到指定的位姿",[18,8740,8741],{},[21,8742,8743],{},"3.参数",[46,8745,8746,8751,8757,8763,8768,8774],{},[49,8747,8748,8750],{},[74,8749,5758],{},": 指定是否使用模拟时间而非实际时间进行节点的计时和同步。这在仿真环境中特别有用，因为仿真环境可能无法提供与真实时间完全同步的时钟。",[49,8752,8753,8756],{},[74,8754,8755],{},"loop_rate",": 定义了节点的主循环速率，即节点每秒执行其主要任务（如处理数据、发布信息等）的次数。这个参数对于控制节点的响应性和资源使用非常重要。",[49,8758,8759,8762],{},[74,8760,8761],{},"stop_on_failure",": 指明当导航任务遇到无法克服的障碍或达到其他失败条件时，节点是否应该停止执行。这对于确保在失败情况下系统能够安全地停止并等待进一步指令很重要。",[49,8764,8765,8767],{},[74,8766,5707],{},": 涉及节点间通信的可靠性机制。Bond是ROS 2中用于节点间稳定通信的一种机制，其中心跳信号用于检测节点是否仍然活跃。将此参数设置为true会禁用心跳超时检测，这可能在某些特定的网络配置或应用场景中是有用的。",[49,8769,8770,8773],{},[74,8771,8772],{},"waypoint_task_executor_plugin",": 指定了在执行路径点导航任务时要使用的插件。路径点导航通常涉及一系列预先定义的点，机器人需要按顺序访问这些点。这个参数允许用户指定用于执行这种类型任务的特定插件或算法。",[49,8775,8776,8779,8780],{},[74,8777,8778],{},"wait_at_waypoint",": 这是一个复合参数，用于配置在路径点等待的特定行为。",[46,8781,8782,8787,8792],{},[49,8783,8784,8786],{},[74,8785,7575],{},": 启用或禁用在到达每个路径点时等待的功能。",[49,8788,8789,8791],{},[74,8790,7348],{},": 指定实现等待功能的插件类型。这允许用户根据需要选择不同的等待策略或行为。",[49,8793,8794,8797],{},[74,8795,8796],{},"waypoint_pause_duration",": 定义了在每个路径点处等待的持续时间（以毫秒为单位）。这可以用于确保机器人在移动到下一个路径点之前已经稳定或已经完成了某些操作。",[14,8799,8800],{"id":8800},"路径平滑节点说明",[18,8802,8803,8804,7000,8807,8810],{},"在Nav2框架中",[74,8805,8806],{},"nav2_smoother",[74,8808,8809],{},"smoother_server","节点通过加载和运行各种平滑器插件，对规划出的路径进行平滑处理，使得机器人能够更流畅、连续且安全地移动。这一功能对于提高机器人的导航性能和减少硬件磨损具有重要意义。",[18,8812,8813],{},[21,8814,5547],{},[535,8816,8817,8827],{},[538,8818,8819],{},[541,8820,8821,8823,8825],{},[544,8822,547],{"align":546},[544,8824,4130],{"align":546},[544,8826,553],{"align":546},[555,8828,8829,8838],{},[541,8830,8831,8833,8835],{},[560,8832,7472],{"align":546},[560,8834,7475],{"align":546},[560,8836,8837],{"align":546},"全局代价地图的原始数据，用于路径规划",[541,8839,8840,8842,8844],{},[560,8841,7494],{"align":546},[560,8843,7497],{"align":546},[560,8845,8846],{"align":546},"机器人在全局代价地图中的足迹表示",[18,8848,8849],{},[21,8850,5606],{},[535,8852,8853,8863],{},[538,8854,8855],{},[541,8856,8857,8859,8861],{},[544,8858,547],{"align":546},[544,8860,4130],{"align":546},[544,8862,553],{"align":546},[555,8864,8865],{},[541,8866,8867,8870,8872],{},[560,8868,8869],{"align":546},"/plan_smoothed",[560,8871,7311],{"align":546},[560,8873,8874],{"align":546},"经过平滑处理后的全局路径",[18,8876,8877],{},[21,8878,8472],{},[535,8880,8881,8892],{},[538,8882,8883],{},[541,8884,8885,8887,8890],{},[544,8886,547],{"align":546},[544,8888,8889],{"align":546},"动作类型",[544,8891,553],{"align":546},[555,8893,8894],{},[541,8895,8896,8899,8902],{},[560,8897,8898],{"align":546},"/smooth_path",[560,8900,8901],{"align":546},"nav2_msgs/action/SmoothPath",[560,8903,8904],{"align":546},"提供平滑路径的服务，接受路径平滑的请求，并返回平滑后的路径。这允许客户端（如行为树）异步地请求路径平滑，并在平滑完成后接收结果。",[18,8906,8907],{},[21,8908,5695],{},[46,8910,8911,8916,8921,8926,8931,8976,8985,8990],{},[49,8912,8913,8915],{},[74,8914,7020],{},": 指示是否禁用Bond的心跳超时功能。在分布式系统中，Bond用于管理节点间的连接和心跳，此参数用于调整心跳相关的行为。",[49,8917,8918,8920],{},[74,8919,8614],{},": 代价地图数据的ROS话题名称，通常是全局代价地图的原始数据。",[49,8922,8923,8925],{},[74,8924,8644],{},": 机器人足迹（即机器人在地图上的占用区域）的ROS话题名称，用于在全局代价地图中表示机器人的物理尺寸。",[49,8927,8928,8930],{},[74,8929,7224],{},": 指定机器人基座的坐标系名称，这是机器人导航中用于定位和移动的参考点。",[49,8932,8933,7059,8936],{},[74,8934,8935],{},"simple_smoother",[46,8937,8938,8944,8950,8959,8964,8970],{},[49,8939,8940,8943],{},[74,8941,8942],{},"do_refinement",": 指示是否启用路径的细化（或进一步优化）过程。",[49,8945,8946,8949],{},[74,8947,8948],{},"max_its",": 平滑过程中允许的最大迭代次数，用于控制平滑算法的收敛时间。",[49,8951,8952,8954,8955,8958],{},[74,8953,7348],{},": 平滑插件的类型，这里是",[74,8956,8957],{},"nav2_smoother::SimpleSmoother","，表示使用简单的平滑算法。",[49,8960,8961,8963],{},[74,8962,7354],{},": 平滑算法的收敛容差，当路径变化小于此值时，认为平滑过程已完成。",[49,8965,8966,8969],{},[74,8967,8968],{},"w_data",": 平滑过程中数据项（如障碍物距离）的权重。",[49,8971,8972,8975],{},[74,8973,8974],{},"w_smooth",": 平滑过程中平滑项（如路径曲率）的权重。",[49,8977,8978,8981,8982,8984],{},[74,8979,8980],{},"smoother_plugins",": 定义的平滑插件列表，这里列出了",[74,8983,8935],{},"，表示将使用此插件进行路径平滑。",[49,8986,8987,8989],{},[74,8988,5752],{},": 坐标变换的容差，用于处理不同坐标系之间的转换时的不确定性。",[49,8991,8992,8994,8995,8997,8998,9000],{},[74,8993,5758],{},": 指定是否使用模拟时间而非实际时间。在仿真环境中，这通常设置为",[74,8996,2022],{},"，以匹配仿真器的虚拟时间；在真实环境中，应设置为",[74,8999,5816],{},"以使用ROS系统的实际时间。",[14,9002,9003],{"id":9003},"速度平滑节点说明",[18,9005,9006,9007,8669,9010,9013],{},"Nav2框架中的",[74,9008,9009],{},"nav2_velocity_smoother",[74,9011,9012],{},"velocity_smoother","节点主要负责平滑由Nav2框架发送给机器人控制器的速度指令。其核心功能是实现速度和加速度平滑。这一功能对于确保机器人在导航过程中的稳定性和安全性至关重要。",[18,9015,9016],{},[21,9017,5547],{},[535,9019,9020,9030],{},[538,9021,9022],{},[541,9023,9024,9026,9028],{},[544,9025,547],{"align":546},[544,9027,4130],{"align":546},[544,9029,553],{"align":546},[555,9031,9032],{},[541,9033,9034,9036,9038],{},[560,9035,7942],{"align":546},[560,9037,7945],{"align":546},[560,9039,9040],{"align":546},"接收来自其他节点的速度控制指令的话题",[18,9042,9043],{},[21,9044,5606],{},[535,9046,9047,9057],{},[538,9048,9049],{},[541,9050,9051,9053,9055],{},[544,9052,547],{"align":546},[544,9054,4130],{"align":546},[544,9056,553],{"align":546},[555,9058,9059],{},[541,9060,9061,9063,9065],{},[560,9062,8462],{"align":546},[560,9064,7945],{"align":546},[560,9066,9067],{"align":546},"发布经过处理或平滑后的速度控制指令的话题",[18,9069,9070],{},[21,9071,8743],{},[46,9073,9074,9082,9088,9098,9104,9110,9116,9122,9131,9139,9148,9154,9159],{},[49,9075,9076,9078,9079,9081],{},[74,9077,5707],{},": 指示是否禁用节点间的心跳超时机制。如果为",[74,9080,2022],{},"，则节点间的心跳检测不会因超时而断开连接。",[49,9083,9084,9087],{},[74,9085,9086],{},"deadband_velocity",": 定义在哪些速度分量上应用死区平滑（即忽略小于此阈值的微小速度变化）。这里分别为X轴、Y轴和偏航角速度（theta）设置了死区值。",[49,9089,9090,9093,9094,9097],{},[74,9091,9092],{},"feedback",": 指定速度平滑器的反馈类型。",[74,9095,9096],{},"OPEN_LOOP","表示开环控制，即不考虑机器人的实际速度反馈进行速度调整。",[49,9099,9100,9103],{},[74,9101,9102],{},"max_accel",": 定义机器人在各个方向上的最大加速度限制，包括X轴、Y轴和偏航角速度（theta）。",[49,9105,9106,9109],{},[74,9107,9108],{},"max_decel",": 定义机器人在各个方向上的最大减速度限制，包括X轴、Y轴和偏航角速度（theta）。注意，减速度值以负数表示。",[49,9111,9112,9115],{},[74,9113,9114],{},"max_velocity",": 定义机器人在各个方向上的最大速度限制，包括X轴、Y轴和偏航角速度（theta）。",[49,9117,9118,9121],{},[74,9119,9120],{},"min_velocity",": 定义机器人在各个方向上的最小速度限制，包括X轴、Y轴和偏航角速度（theta）。这通常用于避免发送过小的速度指令给底层控制器。",[49,9123,9124,9127,9128,9130],{},[74,9125,9126],{},"odom_duration",": 与里程计数据相关的参数，但在此上下文中可能不直接用于",[74,9129,9012],{},"节点，可能是遗留或与其他功能相关联。",[49,9132,9133,9135,9136,9138],{},[74,9134,7230],{},": 指定里程计数据的ROS话题名称，",[74,9137,9012],{},"节点将订阅此话题以获取机器人的运动信息。",[49,9140,9141,9144,9145,9147],{},[74,9142,9143],{},"scale_velocities",": 指示是否根据加速度限制同比例调整速度的其他分量。如果为",[74,9146,5816],{},"，则不会进行速度缩放。",[49,9149,9150,9153],{},[74,9151,9152],{},"smoothing_frequency",": 定义速度平滑操作的执行频率（Hz），即每秒进行多少次平滑计算。",[49,9155,9156,9158],{},[74,9157,5758],{},": 指定是否使用模拟时间而非实际系统时间。这对于仿真环境特别有用，可以确保时间的一致性和可预测性。",[49,9160,9161,9164,9165,9167],{},[74,9162,9163],{},"velocity_timeout",": 如果在指定时间内未接收到新的速度指令，则",[74,9166,9012],{},"节点将停止发布速度指令，并可能发送零速度指令以停止机器人运动。这是为了防止在失去速度控制时机器人继续移动。",[14,9169,9171],{"id":9170},"导航功能集成重要","导航功能集成(重要)",[18,9173,9174],{},[21,9175,5962],{},[18,9177,5019],{},[68,9179,9181],{"className":70,"code":9180,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_navigation2 --dependencies navigation2 nav2_common\n",[74,9182,9183],{"__ignoreMap":32},[77,9184,9185,9187,9189,9191,9194,9196,9199],{"class":79,"line":80},[77,9186,1205],{"class":83},[77,9188,1208],{"class":87},[77,9190,1211],{"class":87},[77,9192,9193],{"class":87}," mycar_navigation2",[77,9195,1218],{"class":1217},[77,9197,9198],{"class":87}," navigation2",[77,9200,9201],{"class":87}," nav2_common\n",[18,9203,9204],{},[21,9205,5993],{},[18,9207,9208],{},"在功能包下，新建launch目录、params目录和bts目录。",[18,9210,9211,9212,1233],{},"launch目录下新建",[74,9213,9214],{},"nav2.launch.py",[68,9216,9218],{"className":1236,"code":9217,"language":1238,"meta":32,"style":32},"import os\n\nfrom ament_index_python.packages import get_package_share_directory\nfrom launch import LaunchDescription\nfrom launch_ros.actions import Node\n\ndef generate_launch_description():\n\n    current_pkg = get_package_share_directory(\"mycar_navigation2\")\n    bt_params = os.path.join(get_package_share_directory(\"mycar_navigation2\"),\"params\",\"bt.yaml\")\n    planner_params = os.path.join(get_package_share_directory(\"mycar_navigation2\"),\"params\",\"planner.yaml\")       \n    controller_params = os.path.join(get_package_share_directory(\"mycar_navigation2\"),\"params\",\"controller.yaml\")       \n    behavior_params = os.path.join(get_package_share_directory(\"mycar_navigation2\"),\"params\",\"behavior.yaml\")       \n    waypoint_params = os.path.join(get_package_share_directory(\"mycar_navigation2\"),\"params\",\"waypoint.yaml\")       \n    velocity_params = os.path.join(get_package_share_directory(\"mycar_navigation2\"),\"params\",\"velocity.yaml\")       \n    smoother_params = os.path.join(get_package_share_directory(\"mycar_navigation2\"),\"params\",\"smoother.yaml\")       \n\n    planner_server_node = Node(\n        package='nav2_planner',\n        executable='planner_server',\n        name='planner_server',\n        output='screen',\n        parameters=[planner_params],\n        )\n\n    controller_server_node = Node(\n        package='nav2_controller',\n        executable='controller_server',\n        output='screen',\n        parameters=[controller_params],\n        remappings=[('cmd_vel', 'cmd_vel_nav')]\n    )\n\n    behavior_server_node = Node(\n        package='nav2_behaviors',\n        executable='behavior_server',\n        name='behavior_server',\n        output='screen',\n        parameters=[behavior_params]\n    )\n\n    waypoint_node = Node(\n        package='nav2_waypoint_follower',\n        executable='waypoint_follower',\n        name='waypoint_follower',\n        output='screen',\n        parameters=[waypoint_params]\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=[velocity_params],\n        remappings=\n                [('cmd_vel', 'cmd_vel_nav'), ('cmd_vel_smoothed', 'cmd_vel')]\n    )\n    smoother_server_node = Node(\n        package='nav2_smoother',\n        executable='smoother_server',\n        name='smoother_server',\n        output='screen',\n        parameters=[smoother_params],\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            {\"default_nav_to_pose_bt_xml\": os.path.join(current_pkg,\"bts\",\"bt_planner_controller_behavior.xml\")},\n            {\"default_nav_through_poses_bt_xml\": os.path.join(current_pkg,\"bts\",\"bt_planner_controller_behavior_poses.xml\")}\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=[{'use_sim_time': True},\n                    {'autostart': True},\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    return LaunchDescription([\n        lifecycle_manager_node,\n        bt_navigator_node,\n        planner_server_node,\n        controller_server_node,\n        behavior_server_node,\n        waypoint_node,\n        velocity_smoother_node,\n        smoother_server_node\n    ])\n",[74,9219,9220,9226,9230,9240,9250,9260,9264,9272,9276,9291,9313,9336,9358,9380,9402,9424,9446,9450,9459,9470,9481,9491,9501,9510,9514,9518,9527,9538,9549,9559,9568,9589,9593,9597,9606,9617,9628,9638,9648,9657,9661,9665,9674,9685,9696,9706,9716,9725,9729,9733,9742,9753,9764,9774,9784,9796,9805,9812,9835,9839,9848,9859,9870,9880,9891,9901,9906,9916,9928,9940,9951,9963,9972,9978,9999,10019,10025,10030,10035,10045,10056,10067,10079,10090,10107,10121,10131,10139,10147,10155,10163,10171,10179,10185,10191,10196,10203,10209,10215,10221,10227,10233,10239,10245,10251],{"__ignoreMap":32},[77,9221,9222,9224],{"class":79,"line":80},[77,9223,1245],{"class":97},[77,9225,1248],{"class":104},[77,9227,9228],{"class":79,"line":114},[77,9229,140],{"emptyLinePlaceholder":139},[77,9231,9232,9234,9236,9238],{"class":79,"line":136},[77,9233,1257],{"class":97},[77,9235,1308],{"class":104},[77,9237,1245],{"class":97},[77,9239,1313],{"class":104},[77,9241,9242,9244,9246,9248],{"class":79,"line":143},[77,9243,1257],{"class":97},[77,9245,1260],{"class":104},[77,9247,1245],{"class":97},[77,9249,1265],{"class":104},[77,9251,9252,9254,9256,9258],{"class":79,"line":150},[77,9253,1257],{"class":97},[77,9255,1296],{"class":104},[77,9257,1245],{"class":97},[77,9259,1301],{"class":104},[77,9261,9262],{"class":79,"line":162},[77,9263,140],{"emptyLinePlaceholder":139},[77,9265,9266,9268,9270],{"class":79,"line":174},[77,9267,1322],{"class":97},[77,9269,1325],{"class":83},[77,9271,1328],{"class":104},[77,9273,9274],{"class":79,"line":179},[77,9275,140],{"emptyLinePlaceholder":139},[77,9277,9278,9281,9283,9286,9289],{"class":79,"line":185},[77,9279,9280],{"class":104},"    current_pkg ",[77,9282,1336],{"class":97},[77,9284,9285],{"class":104}," get_package_share_directory(",[77,9287,9288],{"class":87},"\"mycar_navigation2\"",[77,9290,1345],{"class":104},[77,9292,9293,9296,9298,9300,9302,9304,9306,9308,9311],{"class":79,"line":197},[77,9294,9295],{"class":104},"    bt_params ",[77,9297,1336],{"class":97},[77,9299,6085],{"class":104},[77,9301,9288],{"class":87},[77,9303,3218],{"class":104},[77,9305,3221],{"class":87},[77,9307,3730],{"class":104},[77,9309,9310],{"class":87},"\"bt.yaml\"",[77,9312,1345],{"class":104},[77,9314,9315,9318,9320,9322,9324,9326,9328,9330,9333],{"class":79,"line":1348},[77,9316,9317],{"class":104},"    planner_params ",[77,9319,1336],{"class":97},[77,9321,6085],{"class":104},[77,9323,9288],{"class":87},[77,9325,3218],{"class":104},[77,9327,3221],{"class":87},[77,9329,3730],{"class":104},[77,9331,9332],{"class":87},"\"planner.yaml\"",[77,9334,9335],{"class":104},")       \n",[77,9337,9338,9341,9343,9345,9347,9349,9351,9353,9356],{"class":79,"line":1363},[77,9339,9340],{"class":104},"    controller_params ",[77,9342,1336],{"class":97},[77,9344,6085],{"class":104},[77,9346,9288],{"class":87},[77,9348,3218],{"class":104},[77,9350,3221],{"class":87},[77,9352,3730],{"class":104},[77,9354,9355],{"class":87},"\"controller.yaml\"",[77,9357,9335],{"class":104},[77,9359,9360,9363,9365,9367,9369,9371,9373,9375,9378],{"class":79,"line":1368},[77,9361,9362],{"class":104},"    behavior_params ",[77,9364,1336],{"class":97},[77,9366,6085],{"class":104},[77,9368,9288],{"class":87},[77,9370,3218],{"class":104},[77,9372,3221],{"class":87},[77,9374,3730],{"class":104},[77,9376,9377],{"class":87},"\"behavior.yaml\"",[77,9379,9335],{"class":104},[77,9381,9382,9385,9387,9389,9391,9393,9395,9397,9400],{"class":79,"line":1379},[77,9383,9384],{"class":104},"    waypoint_params ",[77,9386,1336],{"class":97},[77,9388,6085],{"class":104},[77,9390,9288],{"class":87},[77,9392,3218],{"class":104},[77,9394,3221],{"class":87},[77,9396,3730],{"class":104},[77,9398,9399],{"class":87},"\"waypoint.yaml\"",[77,9401,9335],{"class":104},[77,9403,9404,9407,9409,9411,9413,9415,9417,9419,9422],{"class":79,"line":1388},[77,9405,9406],{"class":104},"    velocity_params ",[77,9408,1336],{"class":97},[77,9410,6085],{"class":104},[77,9412,9288],{"class":87},[77,9414,3218],{"class":104},[77,9416,3221],{"class":87},[77,9418,3730],{"class":104},[77,9420,9421],{"class":87},"\"velocity.yaml\"",[77,9423,9335],{"class":104},[77,9425,9426,9429,9431,9433,9435,9437,9439,9441,9444],{"class":79,"line":1402},[77,9427,9428],{"class":104},"    smoother_params ",[77,9430,1336],{"class":97},[77,9432,6085],{"class":104},[77,9434,9288],{"class":87},[77,9436,3218],{"class":104},[77,9438,3221],{"class":87},[77,9440,3730],{"class":104},[77,9442,9443],{"class":87},"\"smoother.yaml\"",[77,9445,9335],{"class":104},[77,9447,9448],{"class":79,"line":1415},[77,9449,140],{"emptyLinePlaceholder":139},[77,9451,9452,9455,9457],{"class":79,"line":1425},[77,9453,9454],{"class":104},"    planner_server_node ",[77,9456,1336],{"class":97},[77,9458,1488],{"class":104},[77,9460,9461,9463,9465,9468],{"class":79,"line":1433},[77,9462,1528],{"class":1391},[77,9464,1336],{"class":97},[77,9466,9467],{"class":87},"'nav2_planner'",[77,9469,1385],{"class":104},[77,9471,9472,9474,9476,9479],{"class":79,"line":1449},[77,9473,1541],{"class":1391},[77,9475,1336],{"class":97},[77,9477,9478],{"class":87},"'planner_server'",[77,9480,1385],{"class":104},[77,9482,9483,9485,9487,9489],{"class":79,"line":1463},[77,9484,1554],{"class":1391},[77,9486,1336],{"class":97},[77,9488,9478],{"class":87},[77,9490,1385],{"class":104},[77,9492,9493,9495,9497,9499],{"class":79,"line":1475},[77,9494,1566],{"class":1391},[77,9496,1336],{"class":97},[77,9498,1571],{"class":87},[77,9500,1385],{"class":104},[77,9502,9503,9505,9507],{"class":79,"line":1480},[77,9504,1494],{"class":1391},[77,9506,1336],{"class":97},[77,9508,9509],{"class":104},"[planner_params],\n",[77,9511,9512],{"class":79,"line":1491},[77,9513,6306],{"class":104},[77,9515,9516],{"class":79,"line":1502},[77,9517,140],{"emptyLinePlaceholder":139},[77,9519,9520,9523,9525],{"class":79,"line":1508},[77,9521,9522],{"class":104},"    controller_server_node ",[77,9524,1336],{"class":97},[77,9526,1488],{"class":104},[77,9528,9529,9531,9533,9536],{"class":79,"line":1519},[77,9530,1528],{"class":1391},[77,9532,1336],{"class":97},[77,9534,9535],{"class":87},"'nav2_controller'",[77,9537,1385],{"class":104},[77,9539,9540,9542,9544,9547],{"class":79,"line":1525},[77,9541,1541],{"class":1391},[77,9543,1336],{"class":97},[77,9545,9546],{"class":87},"'controller_server'",[77,9548,1385],{"class":104},[77,9550,9551,9553,9555,9557],{"class":79,"line":1538},[77,9552,1566],{"class":1391},[77,9554,1336],{"class":97},[77,9556,1571],{"class":87},[77,9558,1385],{"class":104},[77,9560,9561,9563,9565],{"class":79,"line":1551},[77,9562,1494],{"class":1391},[77,9564,1336],{"class":97},[77,9566,9567],{"class":104},"[controller_params],\n",[77,9569,9570,9573,9575,9578,9581,9583,9586],{"class":79,"line":1563},[77,9571,9572],{"class":1391},"        remappings",[77,9574,1336],{"class":97},[77,9576,9577],{"class":104},"[(",[77,9579,9580],{"class":87},"'cmd_vel'",[77,9582,1455],{"class":104},[77,9584,9585],{"class":87},"'cmd_vel_nav'",[77,9587,9588],{"class":104},")]\n",[77,9590,9591],{"class":79,"line":1576},[77,9592,3250],{"class":104},[77,9594,9595],{"class":79,"line":1581},[77,9596,140],{"emptyLinePlaceholder":139},[77,9598,9599,9602,9604],{"class":79,"line":1592},[77,9600,9601],{"class":104},"    behavior_server_node ",[77,9603,1336],{"class":97},[77,9605,1488],{"class":104},[77,9607,9608,9610,9612,9615],{"class":79,"line":1597},[77,9609,1528],{"class":1391},[77,9611,1336],{"class":97},[77,9613,9614],{"class":87},"'nav2_behaviors'",[77,9616,1385],{"class":104},[77,9618,9619,9621,9623,9626],{"class":79,"line":1603},[77,9620,1541],{"class":1391},[77,9622,1336],{"class":97},[77,9624,9625],{"class":87},"'behavior_server'",[77,9627,1385],{"class":104},[77,9629,9630,9632,9634,9636],{"class":79,"line":1609},[77,9631,1554],{"class":1391},[77,9633,1336],{"class":97},[77,9635,9625],{"class":87},[77,9637,1385],{"class":104},[77,9639,9640,9642,9644,9646],{"class":79,"line":1615},[77,9641,1566],{"class":1391},[77,9643,1336],{"class":97},[77,9645,1571],{"class":87},[77,9647,1385],{"class":104},[77,9649,9650,9652,9654],{"class":79,"line":1620},[77,9651,1494],{"class":1391},[77,9653,1336],{"class":97},[77,9655,9656],{"class":104},"[behavior_params]\n",[77,9658,9659],{"class":79,"line":2003},[77,9660,3250],{"class":104},[77,9662,9663],{"class":79,"line":2014},[77,9664,140],{"emptyLinePlaceholder":139},[77,9666,9667,9670,9672],{"class":79,"line":2027},[77,9668,9669],{"class":104},"    waypoint_node ",[77,9671,1336],{"class":97},[77,9673,1488],{"class":104},[77,9675,9676,9678,9680,9683],{"class":79,"line":2041},[77,9677,1528],{"class":1391},[77,9679,1336],{"class":97},[77,9681,9682],{"class":87},"'nav2_waypoint_follower'",[77,9684,1385],{"class":104},[77,9686,9687,9689,9691,9694],{"class":79,"line":2054},[77,9688,1541],{"class":1391},[77,9690,1336],{"class":97},[77,9692,9693],{"class":87},"'waypoint_follower'",[77,9695,1385],{"class":104},[77,9697,9698,9700,9702,9704],{"class":79,"line":2068},[77,9699,1554],{"class":1391},[77,9701,1336],{"class":97},[77,9703,9693],{"class":87},[77,9705,1385],{"class":104},[77,9707,9708,9710,9712,9714],{"class":79,"line":2079},[77,9709,1566],{"class":1391},[77,9711,1336],{"class":97},[77,9713,1571],{"class":87},[77,9715,1385],{"class":104},[77,9717,9718,9720,9722],{"class":79,"line":2084},[77,9719,1494],{"class":1391},[77,9721,1336],{"class":97},[77,9723,9724],{"class":104},"[waypoint_params]\n",[77,9726,9727],{"class":79,"line":2094},[77,9728,3250],{"class":104},[77,9730,9731],{"class":79,"line":2105},[77,9732,140],{"emptyLinePlaceholder":139},[77,9734,9735,9738,9740],{"class":79,"line":2117},[77,9736,9737],{"class":104},"    velocity_smoother_node ",[77,9739,1336],{"class":97},[77,9741,1488],{"class":104},[77,9743,9744,9746,9748,9751],{"class":79,"line":2122},[77,9745,1528],{"class":1391},[77,9747,1336],{"class":97},[77,9749,9750],{"class":87},"'nav2_velocity_smoother'",[77,9752,1385],{"class":104},[77,9754,9755,9757,9759,9762],{"class":79,"line":2133},[77,9756,1541],{"class":1391},[77,9758,1336],{"class":97},[77,9760,9761],{"class":87},"'velocity_smoother'",[77,9763,1385],{"class":104},[77,9765,9766,9768,9770,9772],{"class":79,"line":2143},[77,9767,1554],{"class":1391},[77,9769,1336],{"class":97},[77,9771,9761],{"class":87},[77,9773,1385],{"class":104},[77,9775,9776,9778,9780,9782],{"class":79,"line":2154},[77,9777,1566],{"class":1391},[77,9779,1336],{"class":97},[77,9781,1571],{"class":87},[77,9783,1385],{"class":104},[77,9785,9786,9789,9791,9794],{"class":79,"line":2159},[77,9787,9788],{"class":1391},"        respawn_delay",[77,9790,1336],{"class":97},[77,9792,9793],{"class":1217},"2.0",[77,9795,1385],{"class":104},[77,9797,9798,9800,9802],{"class":79,"line":2173},[77,9799,1494],{"class":1391},[77,9801,1336],{"class":97},[77,9803,9804],{"class":104},"[velocity_params],\n",[77,9806,9807,9809],{"class":79,"line":2186},[77,9808,9572],{"class":1391},[77,9810,9811],{"class":97},"=\n",[77,9813,9814,9817,9819,9821,9823,9826,9829,9831,9833],{"class":79,"line":2191},[77,9815,9816],{"class":104},"                [(",[77,9818,9580],{"class":87},[77,9820,1455],{"class":104},[77,9822,9585],{"class":87},[77,9824,9825],{"class":104},"), (",[77,9827,9828],{"class":87},"'cmd_vel_smoothed'",[77,9830,1455],{"class":104},[77,9832,9580],{"class":87},[77,9834,9588],{"class":104},[77,9836,9837],{"class":79,"line":2205},[77,9838,3250],{"class":104},[77,9840,9841,9844,9846],{"class":79,"line":2219},[77,9842,9843],{"class":104},"    smoother_server_node ",[77,9845,1336],{"class":97},[77,9847,1488],{"class":104},[77,9849,9850,9852,9854,9857],{"class":79,"line":2233},[77,9851,1528],{"class":1391},[77,9853,1336],{"class":97},[77,9855,9856],{"class":87},"'nav2_smoother'",[77,9858,1385],{"class":104},[77,9860,9861,9863,9865,9868],{"class":79,"line":2244},[77,9862,1541],{"class":1391},[77,9864,1336],{"class":97},[77,9866,9867],{"class":87},"'smoother_server'",[77,9869,1385],{"class":104},[77,9871,9872,9874,9876,9878],{"class":79,"line":2254},[77,9873,1554],{"class":1391},[77,9875,1336],{"class":97},[77,9877,9867],{"class":87},[77,9879,1385],{"class":104},[77,9881,9883,9885,9887,9889],{"class":79,"line":9882},64,[77,9884,1566],{"class":1391},[77,9886,1336],{"class":97},[77,9888,1571],{"class":87},[77,9890,1385],{"class":104},[77,9892,9894,9896,9898],{"class":79,"line":9893},65,[77,9895,1494],{"class":1391},[77,9897,1336],{"class":97},[77,9899,9900],{"class":104},"[smoother_params],\n",[77,9902,9904],{"class":79,"line":9903},66,[77,9905,3250],{"class":104},[77,9907,9909,9912,9914],{"class":79,"line":9908},67,[77,9910,9911],{"class":104},"    bt_navigator_node ",[77,9913,1336],{"class":97},[77,9915,1488],{"class":104},[77,9917,9919,9921,9923,9926],{"class":79,"line":9918},68,[77,9920,1528],{"class":1391},[77,9922,1336],{"class":97},[77,9924,9925],{"class":87},"'nav2_bt_navigator'",[77,9927,1385],{"class":104},[77,9929,9931,9933,9935,9938],{"class":79,"line":9930},69,[77,9932,1541],{"class":1391},[77,9934,1336],{"class":97},[77,9936,9937],{"class":87},"'bt_navigator'",[77,9939,1385],{"class":104},[77,9941,9943,9945,9947,9949],{"class":79,"line":9942},70,[77,9944,1554],{"class":1391},[77,9946,1336],{"class":97},[77,9948,9937],{"class":87},[77,9950,1385],{"class":104},[77,9952,9954,9956,9958,9960],{"class":79,"line":9953},71,[77,9955,1566],{"class":1391},[77,9957,1336],{"class":97},[77,9959,1571],{"class":87},[77,9961,9962],{"class":104},",      \n",[77,9964,9966,9968,9970],{"class":79,"line":9965},72,[77,9967,1494],{"class":1391},[77,9969,1336],{"class":97},[77,9971,1499],{"class":104},[77,9973,9975],{"class":79,"line":9974},73,[77,9976,9977],{"class":104},"            bt_params,\n",[77,9979,9981,9983,9986,9989,9992,9994,9997],{"class":79,"line":9980},74,[77,9982,3297],{"class":104},[77,9984,9985],{"class":87},"\"default_nav_to_pose_bt_xml\"",[77,9987,9988],{"class":104},": os.path.join(current_pkg,",[77,9990,9991],{"class":87},"\"bts\"",[77,9993,3730],{"class":104},[77,9995,9996],{"class":87},"\"bt_planner_controller_behavior.xml\"",[77,9998,3306],{"class":104},[77,10000,10002,10004,10007,10009,10011,10013,10016],{"class":79,"line":10001},75,[77,10003,3297],{"class":104},[77,10005,10006],{"class":87},"\"default_nav_through_poses_bt_xml\"",[77,10008,9988],{"class":104},[77,10010,9991],{"class":87},[77,10012,3730],{"class":104},[77,10014,10015],{"class":87},"\"bt_planner_controller_behavior_poses.xml\"",[77,10017,10018],{"class":104},")}\n",[77,10020,10022],{"class":79,"line":10021},76,[77,10023,10024],{"class":104},"            ],\n",[77,10026,10028],{"class":79,"line":10027},77,[77,10029,6306],{"class":104},[77,10031,10033],{"class":79,"line":10032},78,[77,10034,140],{"emptyLinePlaceholder":139},[77,10036,10038,10041,10043],{"class":79,"line":10037},79,[77,10039,10040],{"class":104},"    lifecycle_manager_node ",[77,10042,1336],{"class":97},[77,10044,1488],{"class":104},[77,10046,10048,10050,10052,10054],{"class":79,"line":10047},80,[77,10049,1528],{"class":1391},[77,10051,1336],{"class":97},[77,10053,5363],{"class":87},[77,10055,1385],{"class":104},[77,10057,10059,10061,10063,10065],{"class":79,"line":10058},81,[77,10060,1541],{"class":1391},[77,10062,1336],{"class":97},[77,10064,5375],{"class":87},[77,10066,1385],{"class":104},[77,10068,10070,10072,10074,10077],{"class":79,"line":10069},82,[77,10071,1554],{"class":1391},[77,10073,1336],{"class":97},[77,10075,10076],{"class":87},"'lifecycle_manager_navigation'",[77,10078,1385],{"class":104},[77,10080,10082,10084,10086,10088],{"class":79,"line":10081},83,[77,10083,1566],{"class":1391},[77,10085,1336],{"class":97},[77,10087,1571],{"class":87},[77,10089,1385],{"class":104},[77,10091,10093,10095,10097,10099,10101,10103,10105],{"class":79,"line":10092},84,[77,10094,1494],{"class":1391},[77,10096,1336],{"class":97},[77,10098,5318],{"class":104},[77,10100,1342],{"class":87},[77,10102,1666],{"class":104},[77,10104,5325],{"class":1217},[77,10106,5328],{"class":104},[77,10108,10110,10113,10115,10117,10119],{"class":79,"line":10109},85,[77,10111,10112],{"class":104},"                    {",[77,10114,5425],{"class":87},[77,10116,1666],{"class":104},[77,10118,5325],{"class":1217},[77,10120,5328],{"class":104},[77,10122,10124,10126,10128],{"class":79,"line":10123},86,[77,10125,10112],{"class":104},[77,10127,5438],{"class":87},[77,10129,10130],{"class":104},": [\n",[77,10132,10134,10137],{"class":79,"line":10133},87,[77,10135,10136],{"class":87},"                        'bt_navigator'",[77,10138,1385],{"class":104},[77,10140,10142,10145],{"class":79,"line":10141},88,[77,10143,10144],{"class":87},"                        'planner_server'",[77,10146,1385],{"class":104},[77,10148,10150,10153],{"class":79,"line":10149},89,[77,10151,10152],{"class":87},"                        'controller_server'",[77,10154,1385],{"class":104},[77,10156,10158,10161],{"class":79,"line":10157},90,[77,10159,10160],{"class":87},"                        'behavior_server'",[77,10162,1385],{"class":104},[77,10164,10166,10169],{"class":79,"line":10165},91,[77,10167,10168],{"class":87},"                        'waypoint_follower'",[77,10170,1385],{"class":104},[77,10172,10174,10177],{"class":79,"line":10173},92,[77,10175,10176],{"class":87},"                        'velocity_smoother'",[77,10178,1385],{"class":104},[77,10180,10182],{"class":79,"line":10181},93,[77,10183,10184],{"class":87},"                        'smoother_server'\n",[77,10186,10188],{"class":79,"line":10187},94,[77,10189,10190],{"class":104},"                    ]}])\n",[77,10192,10194],{"class":79,"line":10193},95,[77,10195,140],{"emptyLinePlaceholder":139},[77,10197,10199,10201],{"class":79,"line":10198},96,[77,10200,1623],{"class":97},[77,10202,3333],{"class":104},[77,10204,10206],{"class":79,"line":10205},97,[77,10207,10208],{"class":104},"        lifecycle_manager_node,\n",[77,10210,10212],{"class":79,"line":10211},98,[77,10213,10214],{"class":104},"        bt_navigator_node,\n",[77,10216,10218],{"class":79,"line":10217},99,[77,10219,10220],{"class":104},"        planner_server_node,\n",[77,10222,10224],{"class":79,"line":10223},100,[77,10225,10226],{"class":104},"        controller_server_node,\n",[77,10228,10230],{"class":79,"line":10229},101,[77,10231,10232],{"class":104},"        behavior_server_node,\n",[77,10234,10236],{"class":79,"line":10235},102,[77,10237,10238],{"class":104},"        waypoint_node,\n",[77,10240,10242],{"class":79,"line":10241},103,[77,10243,10244],{"class":104},"        velocity_smoother_node,\n",[77,10246,10248],{"class":79,"line":10247},104,[77,10249,10250],{"class":104},"        smoother_server_node\n",[77,10252,10254],{"class":79,"line":10253},105,[77,10255,3358],{"class":104},[18,10257,10258],{},"该launch文件主要是加载了生命周期管理器、行为树、规划器、控制器、恢复器、航点跟踪、路径平滑以及速度平滑等节点。并且除了生命周期管理器节点外，每个节点都还会加载一个配置文件，接下来需要编辑这些配置文。",[18,10260,10261],{},[21,10262,10263],{},"（1）bt_navigator相关配置文件",[18,10265,10266],{},"bt_navigator相关配置文件有两个，分别是描述行为树的xml文件，以及yaml格式的参数文件，前者存储在bts目录下，后者存储在params目录下。",[18,10268,10269,10270,10273],{},"请在bts目录下，新建一个名为",[74,10271,10272],{},"bt_planner_controller_behavior.xml","的文件并输入如下内容：",[68,10275,10279],{"className":10276,"code":10277,"language":10278,"meta":32,"style":32},"language-xml shiki shiki-themes github-light github-dark","\n\u003Croot main_tree_to_execute=\"MainTree\">\n  \u003CBehaviorTree ID=\"MainTree\">\n    \u003CRecoveryNode number_of_retries=\"6\" name=\"NavigateRecovery\">\n      \u003CPipelineSequence name=\"NavigateWithReplanning\">\n        \u003CRateController hz=\"1.0\">\n          \u003CRecoveryNode number_of_retries=\"1\" name=\"ComputePathToPose\">\n            \u003CComputePathToPose goal=\"{goal}\" path=\"{path}\" planner_id=\"GridBased\"/>\n            \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Context\" service_name=\"global_costmap/clear_entirely_global_costmap\"/>\n          \u003C/RecoveryNode>\n        \u003C/RateController>\n        \u003CRecoveryNode number_of_retries=\"1\" name=\"FollowPath\">\n          \u003CFollowPath path=\"{path}\" controller_id=\"FollowPath\"/>\n          \u003CClearEntireCostmap name=\"ClearLocalCostmap-Context\" service_name=\"local_costmap/clear_entirely_local_costmap\"/>\n        \u003C/RecoveryNode>\n      \u003C/PipelineSequence>\n      \u003CReactiveFallback name=\"RecoveryFallback\">\n        \u003CGoalUpdated/>\n        \u003CRoundRobin name=\"RecoveryActions\">\n          \u003CSequence name=\"ClearingActions\">\n            \u003CClearEntireCostmap name=\"ClearLocalCostmap-Subtree\" service_name=\"local_costmap/clear_entirely_local_costmap\"/>\n            \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Subtree\" service_name=\"global_costmap/clear_entirely_global_costmap\"/>\n          \u003C/Sequence>\n          \u003CSpin spin_dist=\"1.57\"/>\n          \u003CWait wait_duration=\"5\"/>\n          \u003CBackUp backup_dist=\"0.30\" backup_speed=\"0.05\"/>\n        \u003C/RoundRobin>\n      \u003C/ReactiveFallback>\n    \u003C/RecoveryNode>\n  \u003C/BehaviorTree>\n\u003C/root>\n","xml",[74,10280,10281,10285,10303,10320,10346,10363,10381,10404,10439,10463,10472,10481,10502,10524,10546,10554,10563,10579,10588,10604,10620,10641,10662,10670,10687,10704,10729,10737,10745,10754,10763],{"__ignoreMap":32},[77,10282,10283],{"class":79,"line":80},[77,10284,140],{"emptyLinePlaceholder":139},[77,10286,10287,10289,10292,10295,10297,10300],{"class":79,"line":114},[77,10288,98],{"class":104},[77,10290,10291],{"class":1648},"root",[77,10293,10294],{"class":83}," main_tree_to_execute",[77,10296,1336],{"class":104},[77,10298,10299],{"class":87},"\"MainTree\"",[77,10301,10302],{"class":104},">\n",[77,10304,10305,10308,10311,10314,10316,10318],{"class":79,"line":136},[77,10306,10307],{"class":104},"  \u003C",[77,10309,10310],{"class":1648},"BehaviorTree",[77,10312,10313],{"class":83}," ID",[77,10315,1336],{"class":104},[77,10317,10299],{"class":87},[77,10319,10302],{"class":104},[77,10321,10322,10325,10328,10331,10333,10336,10339,10341,10344],{"class":79,"line":143},[77,10323,10324],{"class":104},"    \u003C",[77,10326,10327],{"class":1648},"RecoveryNode",[77,10329,10330],{"class":83}," number_of_retries",[77,10332,1336],{"class":104},[77,10334,10335],{"class":87},"\"6\"",[77,10337,10338],{"class":83}," name",[77,10340,1336],{"class":104},[77,10342,10343],{"class":87},"\"NavigateRecovery\"",[77,10345,10302],{"class":104},[77,10347,10348,10351,10354,10356,10358,10361],{"class":79,"line":150},[77,10349,10350],{"class":104},"      \u003C",[77,10352,10353],{"class":1648},"PipelineSequence",[77,10355,10338],{"class":83},[77,10357,1336],{"class":104},[77,10359,10360],{"class":87},"\"NavigateWithReplanning\"",[77,10362,10302],{"class":104},[77,10364,10365,10368,10371,10374,10376,10379],{"class":79,"line":162},[77,10366,10367],{"class":104},"        \u003C",[77,10369,10370],{"class":1648},"RateController",[77,10372,10373],{"class":83}," hz",[77,10375,1336],{"class":104},[77,10377,10378],{"class":87},"\"1.0\"",[77,10380,10302],{"class":104},[77,10382,10383,10386,10388,10390,10392,10395,10397,10399,10402],{"class":79,"line":174},[77,10384,10385],{"class":104},"          \u003C",[77,10387,10327],{"class":1648},[77,10389,10330],{"class":83},[77,10391,1336],{"class":104},[77,10393,10394],{"class":87},"\"1\"",[77,10396,10338],{"class":83},[77,10398,1336],{"class":104},[77,10400,10401],{"class":87},"\"ComputePathToPose\"",[77,10403,10302],{"class":104},[77,10405,10406,10409,10412,10415,10417,10420,10423,10425,10428,10431,10433,10436],{"class":79,"line":179},[77,10407,10408],{"class":104},"            \u003C",[77,10410,10411],{"class":1648},"ComputePathToPose",[77,10413,10414],{"class":83}," goal",[77,10416,1336],{"class":104},[77,10418,10419],{"class":87},"\"{goal}\"",[77,10421,10422],{"class":83}," path",[77,10424,1336],{"class":104},[77,10426,10427],{"class":87},"\"{path}\"",[77,10429,10430],{"class":83}," planner_id",[77,10432,1336],{"class":104},[77,10434,10435],{"class":87},"\"GridBased\"",[77,10437,10438],{"class":104},"/>\n",[77,10440,10441,10443,10446,10448,10450,10453,10456,10458,10461],{"class":79,"line":185},[77,10442,10408],{"class":104},[77,10444,10445],{"class":1648},"ClearEntireCostmap",[77,10447,10338],{"class":83},[77,10449,1336],{"class":104},[77,10451,10452],{"class":87},"\"ClearGlobalCostmap-Context\"",[77,10454,10455],{"class":83}," service_name",[77,10457,1336],{"class":104},[77,10459,10460],{"class":87},"\"global_costmap/clear_entirely_global_costmap\"",[77,10462,10438],{"class":104},[77,10464,10465,10468,10470],{"class":79,"line":197},[77,10466,10467],{"class":104},"          \u003C/",[77,10469,10327],{"class":1648},[77,10471,10302],{"class":104},[77,10473,10474,10477,10479],{"class":79,"line":1348},[77,10475,10476],{"class":104},"        \u003C/",[77,10478,10370],{"class":1648},[77,10480,10302],{"class":104},[77,10482,10483,10485,10487,10489,10491,10493,10495,10497,10500],{"class":79,"line":1363},[77,10484,10367],{"class":104},[77,10486,10327],{"class":1648},[77,10488,10330],{"class":83},[77,10490,1336],{"class":104},[77,10492,10394],{"class":87},[77,10494,10338],{"class":83},[77,10496,1336],{"class":104},[77,10498,10499],{"class":87},"\"FollowPath\"",[77,10501,10302],{"class":104},[77,10503,10504,10506,10509,10511,10513,10515,10518,10520,10522],{"class":79,"line":1368},[77,10505,10385],{"class":104},[77,10507,10508],{"class":1648},"FollowPath",[77,10510,10422],{"class":83},[77,10512,1336],{"class":104},[77,10514,10427],{"class":87},[77,10516,10517],{"class":83}," controller_id",[77,10519,1336],{"class":104},[77,10521,10499],{"class":87},[77,10523,10438],{"class":104},[77,10525,10526,10528,10530,10532,10534,10537,10539,10541,10544],{"class":79,"line":1379},[77,10527,10385],{"class":104},[77,10529,10445],{"class":1648},[77,10531,10338],{"class":83},[77,10533,1336],{"class":104},[77,10535,10536],{"class":87},"\"ClearLocalCostmap-Context\"",[77,10538,10455],{"class":83},[77,10540,1336],{"class":104},[77,10542,10543],{"class":87},"\"local_costmap/clear_entirely_local_costmap\"",[77,10545,10438],{"class":104},[77,10547,10548,10550,10552],{"class":79,"line":1388},[77,10549,10476],{"class":104},[77,10551,10327],{"class":1648},[77,10553,10302],{"class":104},[77,10555,10556,10559,10561],{"class":79,"line":1402},[77,10557,10558],{"class":104},"      \u003C/",[77,10560,10353],{"class":1648},[77,10562,10302],{"class":104},[77,10564,10565,10567,10570,10572,10574,10577],{"class":79,"line":1415},[77,10566,10350],{"class":104},[77,10568,10569],{"class":1648},"ReactiveFallback",[77,10571,10338],{"class":83},[77,10573,1336],{"class":104},[77,10575,10576],{"class":87},"\"RecoveryFallback\"",[77,10578,10302],{"class":104},[77,10580,10581,10583,10586],{"class":79,"line":1425},[77,10582,10367],{"class":104},[77,10584,10585],{"class":1648},"GoalUpdated",[77,10587,10438],{"class":104},[77,10589,10590,10592,10595,10597,10599,10602],{"class":79,"line":1433},[77,10591,10367],{"class":104},[77,10593,10594],{"class":1648},"RoundRobin",[77,10596,10338],{"class":83},[77,10598,1336],{"class":104},[77,10600,10601],{"class":87},"\"RecoveryActions\"",[77,10603,10302],{"class":104},[77,10605,10606,10608,10611,10613,10615,10618],{"class":79,"line":1449},[77,10607,10385],{"class":104},[77,10609,10610],{"class":1648},"Sequence",[77,10612,10338],{"class":83},[77,10614,1336],{"class":104},[77,10616,10617],{"class":87},"\"ClearingActions\"",[77,10619,10302],{"class":104},[77,10621,10622,10624,10626,10628,10630,10633,10635,10637,10639],{"class":79,"line":1463},[77,10623,10408],{"class":104},[77,10625,10445],{"class":1648},[77,10627,10338],{"class":83},[77,10629,1336],{"class":104},[77,10631,10632],{"class":87},"\"ClearLocalCostmap-Subtree\"",[77,10634,10455],{"class":83},[77,10636,1336],{"class":104},[77,10638,10543],{"class":87},[77,10640,10438],{"class":104},[77,10642,10643,10645,10647,10649,10651,10654,10656,10658,10660],{"class":79,"line":1475},[77,10644,10408],{"class":104},[77,10646,10445],{"class":1648},[77,10648,10338],{"class":83},[77,10650,1336],{"class":104},[77,10652,10653],{"class":87},"\"ClearGlobalCostmap-Subtree\"",[77,10655,10455],{"class":83},[77,10657,1336],{"class":104},[77,10659,10460],{"class":87},[77,10661,10438],{"class":104},[77,10663,10664,10666,10668],{"class":79,"line":1480},[77,10665,10467],{"class":104},[77,10667,10610],{"class":1648},[77,10669,10302],{"class":104},[77,10671,10672,10674,10677,10680,10682,10685],{"class":79,"line":1491},[77,10673,10385],{"class":104},[77,10675,10676],{"class":1648},"Spin",[77,10678,10679],{"class":83}," spin_dist",[77,10681,1336],{"class":104},[77,10683,10684],{"class":87},"\"1.57\"",[77,10686,10438],{"class":104},[77,10688,10689,10691,10694,10697,10699,10702],{"class":79,"line":1502},[77,10690,10385],{"class":104},[77,10692,10693],{"class":1648},"Wait",[77,10695,10696],{"class":83}," wait_duration",[77,10698,1336],{"class":104},[77,10700,10701],{"class":87},"\"5\"",[77,10703,10438],{"class":104},[77,10705,10706,10708,10711,10714,10716,10719,10722,10724,10727],{"class":79,"line":1508},[77,10707,10385],{"class":104},[77,10709,10710],{"class":1648},"BackUp",[77,10712,10713],{"class":83}," backup_dist",[77,10715,1336],{"class":104},[77,10717,10718],{"class":87},"\"0.30\"",[77,10720,10721],{"class":83}," backup_speed",[77,10723,1336],{"class":104},[77,10725,10726],{"class":87},"\"0.05\"",[77,10728,10438],{"class":104},[77,10730,10731,10733,10735],{"class":79,"line":1519},[77,10732,10476],{"class":104},[77,10734,10594],{"class":1648},[77,10736,10302],{"class":104},[77,10738,10739,10741,10743],{"class":79,"line":1525},[77,10740,10558],{"class":104},[77,10742,10569],{"class":1648},[77,10744,10302],{"class":104},[77,10746,10747,10750,10752],{"class":79,"line":1538},[77,10748,10749],{"class":104},"    \u003C/",[77,10751,10327],{"class":1648},[77,10753,10302],{"class":104},[77,10755,10756,10759,10761],{"class":79,"line":1551},[77,10757,10758],{"class":104},"  \u003C/",[77,10760,10310],{"class":1648},[77,10762,10302],{"class":104},[77,10764,10765,10768,10770],{"class":79,"line":1563},[77,10766,10767],{"class":104},"\u003C/",[77,10769,10291],{"class":1648},[77,10771,10302],{"class":104},[18,10773,10774,10775,5194],{},"继续在bts目录下新建一个名为",[74,10776,10777],{},"bt_planner_controller_behavior_poses.xml",[68,10779,10781],{"className":10276,"code":10780,"language":10278,"meta":32,"style":32},"\n\u003Croot main_tree_to_execute=\"MainTree\">\n  \u003CBehaviorTree ID=\"MainTree\">\n    \u003CRecoveryNode number_of_retries=\"6\" name=\"NavigateRecovery\">\n      \u003CPipelineSequence name=\"NavigateWithReplanning\">\n        \u003CRateController hz=\"0.333\">\n          \u003CRecoveryNode number_of_retries=\"1\" name=\"ComputePathThroughPoses\">\n            \u003CReactiveSequence>\n              \u003CRemovePassedGoals input_goals=\"{goals}\" output_goals=\"{goals}\" radius=\"0.7\"/>\n              \u003CComputePathThroughPoses goals=\"{goals}\" path=\"{path}\" planner_id=\"GridBased\"/>\n            \u003C/ReactiveSequence>\n            \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Context\" service_name=\"global_costmap/clear_entirely_global_costmap\"/>\n          \u003C/RecoveryNode>\n        \u003C/RateController>\n        \u003CRecoveryNode number_of_retries=\"1\" name=\"FollowPath\">\n          \u003CFollowPath path=\"{path}\" controller_id=\"FollowPath\"/>\n          \u003CClearEntireCostmap name=\"ClearLocalCostmap-Context\" service_name=\"local_costmap/clear_entirely_local_costmap\"/>\n        \u003C/RecoveryNode>\n      \u003C/PipelineSequence>\n      \u003CReactiveFallback name=\"RecoveryFallback\">\n        \u003CGoalUpdated/>\n        \u003CRoundRobin name=\"RecoveryActions\">\n          \u003CSequence name=\"ClearingActions\">\n            \u003CClearEntireCostmap name=\"ClearLocalCostmap-Subtree\" service_name=\"local_costmap/clear_entirely_local_costmap\"/>\n            \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Subtree\" service_name=\"global_costmap/clear_entirely_global_costmap\"/>\n          \u003C/Sequence>\n          \u003CSpin spin_dist=\"1.57\"/>\n          \u003CWait wait_duration=\"5\"/>\n          \u003CBackUp backup_dist=\"0.30\" backup_speed=\"0.05\"/>\n        \u003C/RoundRobin>\n      \u003C/ReactiveFallback>\n    \u003C/RecoveryNode>\n  \u003C/BehaviorTree>\n\u003C/root>\n",[74,10782,10783,10787,10801,10815,10835,10849,10864,10885,10894,10927,10955,10964,10984,10992,11000,11020,11040,11060,11068,11076,11090,11098,11112,11126,11146,11166,11174,11188,11202,11222,11230,11238,11246,11254],{"__ignoreMap":32},[77,10784,10785],{"class":79,"line":80},[77,10786,140],{"emptyLinePlaceholder":139},[77,10788,10789,10791,10793,10795,10797,10799],{"class":79,"line":114},[77,10790,98],{"class":104},[77,10792,10291],{"class":1648},[77,10794,10294],{"class":83},[77,10796,1336],{"class":104},[77,10798,10299],{"class":87},[77,10800,10302],{"class":104},[77,10802,10803,10805,10807,10809,10811,10813],{"class":79,"line":136},[77,10804,10307],{"class":104},[77,10806,10310],{"class":1648},[77,10808,10313],{"class":83},[77,10810,1336],{"class":104},[77,10812,10299],{"class":87},[77,10814,10302],{"class":104},[77,10816,10817,10819,10821,10823,10825,10827,10829,10831,10833],{"class":79,"line":143},[77,10818,10324],{"class":104},[77,10820,10327],{"class":1648},[77,10822,10330],{"class":83},[77,10824,1336],{"class":104},[77,10826,10335],{"class":87},[77,10828,10338],{"class":83},[77,10830,1336],{"class":104},[77,10832,10343],{"class":87},[77,10834,10302],{"class":104},[77,10836,10837,10839,10841,10843,10845,10847],{"class":79,"line":150},[77,10838,10350],{"class":104},[77,10840,10353],{"class":1648},[77,10842,10338],{"class":83},[77,10844,1336],{"class":104},[77,10846,10360],{"class":87},[77,10848,10302],{"class":104},[77,10850,10851,10853,10855,10857,10859,10862],{"class":79,"line":162},[77,10852,10367],{"class":104},[77,10854,10370],{"class":1648},[77,10856,10373],{"class":83},[77,10858,1336],{"class":104},[77,10860,10861],{"class":87},"\"0.333\"",[77,10863,10302],{"class":104},[77,10865,10866,10868,10870,10872,10874,10876,10878,10880,10883],{"class":79,"line":174},[77,10867,10385],{"class":104},[77,10869,10327],{"class":1648},[77,10871,10330],{"class":83},[77,10873,1336],{"class":104},[77,10875,10394],{"class":87},[77,10877,10338],{"class":83},[77,10879,1336],{"class":104},[77,10881,10882],{"class":87},"\"ComputePathThroughPoses\"",[77,10884,10302],{"class":104},[77,10886,10887,10889,10892],{"class":79,"line":179},[77,10888,10408],{"class":104},[77,10890,10891],{"class":1648},"ReactiveSequence",[77,10893,10302],{"class":104},[77,10895,10896,10899,10902,10905,10907,10910,10913,10915,10917,10920,10922,10925],{"class":79,"line":185},[77,10897,10898],{"class":104},"              \u003C",[77,10900,10901],{"class":1648},"RemovePassedGoals",[77,10903,10904],{"class":83}," input_goals",[77,10906,1336],{"class":104},[77,10908,10909],{"class":87},"\"{goals}\"",[77,10911,10912],{"class":83}," output_goals",[77,10914,1336],{"class":104},[77,10916,10909],{"class":87},[77,10918,10919],{"class":83}," radius",[77,10921,1336],{"class":104},[77,10923,10924],{"class":87},"\"0.7\"",[77,10926,10438],{"class":104},[77,10928,10929,10931,10934,10937,10939,10941,10943,10945,10947,10949,10951,10953],{"class":79,"line":197},[77,10930,10898],{"class":104},[77,10932,10933],{"class":1648},"ComputePathThroughPoses",[77,10935,10936],{"class":83}," goals",[77,10938,1336],{"class":104},[77,10940,10909],{"class":87},[77,10942,10422],{"class":83},[77,10944,1336],{"class":104},[77,10946,10427],{"class":87},[77,10948,10430],{"class":83},[77,10950,1336],{"class":104},[77,10952,10435],{"class":87},[77,10954,10438],{"class":104},[77,10956,10957,10960,10962],{"class":79,"line":1348},[77,10958,10959],{"class":104},"            \u003C/",[77,10961,10891],{"class":1648},[77,10963,10302],{"class":104},[77,10965,10966,10968,10970,10972,10974,10976,10978,10980,10982],{"class":79,"line":1363},[77,10967,10408],{"class":104},[77,10969,10445],{"class":1648},[77,10971,10338],{"class":83},[77,10973,1336],{"class":104},[77,10975,10452],{"class":87},[77,10977,10455],{"class":83},[77,10979,1336],{"class":104},[77,10981,10460],{"class":87},[77,10983,10438],{"class":104},[77,10985,10986,10988,10990],{"class":79,"line":1368},[77,10987,10467],{"class":104},[77,10989,10327],{"class":1648},[77,10991,10302],{"class":104},[77,10993,10994,10996,10998],{"class":79,"line":1379},[77,10995,10476],{"class":104},[77,10997,10370],{"class":1648},[77,10999,10302],{"class":104},[77,11001,11002,11004,11006,11008,11010,11012,11014,11016,11018],{"class":79,"line":1388},[77,11003,10367],{"class":104},[77,11005,10327],{"class":1648},[77,11007,10330],{"class":83},[77,11009,1336],{"class":104},[77,11011,10394],{"class":87},[77,11013,10338],{"class":83},[77,11015,1336],{"class":104},[77,11017,10499],{"class":87},[77,11019,10302],{"class":104},[77,11021,11022,11024,11026,11028,11030,11032,11034,11036,11038],{"class":79,"line":1402},[77,11023,10385],{"class":104},[77,11025,10508],{"class":1648},[77,11027,10422],{"class":83},[77,11029,1336],{"class":104},[77,11031,10427],{"class":87},[77,11033,10517],{"class":83},[77,11035,1336],{"class":104},[77,11037,10499],{"class":87},[77,11039,10438],{"class":104},[77,11041,11042,11044,11046,11048,11050,11052,11054,11056,11058],{"class":79,"line":1415},[77,11043,10385],{"class":104},[77,11045,10445],{"class":1648},[77,11047,10338],{"class":83},[77,11049,1336],{"class":104},[77,11051,10536],{"class":87},[77,11053,10455],{"class":83},[77,11055,1336],{"class":104},[77,11057,10543],{"class":87},[77,11059,10438],{"class":104},[77,11061,11062,11064,11066],{"class":79,"line":1425},[77,11063,10476],{"class":104},[77,11065,10327],{"class":1648},[77,11067,10302],{"class":104},[77,11069,11070,11072,11074],{"class":79,"line":1433},[77,11071,10558],{"class":104},[77,11073,10353],{"class":1648},[77,11075,10302],{"class":104},[77,11077,11078,11080,11082,11084,11086,11088],{"class":79,"line":1449},[77,11079,10350],{"class":104},[77,11081,10569],{"class":1648},[77,11083,10338],{"class":83},[77,11085,1336],{"class":104},[77,11087,10576],{"class":87},[77,11089,10302],{"class":104},[77,11091,11092,11094,11096],{"class":79,"line":1463},[77,11093,10367],{"class":104},[77,11095,10585],{"class":1648},[77,11097,10438],{"class":104},[77,11099,11100,11102,11104,11106,11108,11110],{"class":79,"line":1475},[77,11101,10367],{"class":104},[77,11103,10594],{"class":1648},[77,11105,10338],{"class":83},[77,11107,1336],{"class":104},[77,11109,10601],{"class":87},[77,11111,10302],{"class":104},[77,11113,11114,11116,11118,11120,11122,11124],{"class":79,"line":1480},[77,11115,10385],{"class":104},[77,11117,10610],{"class":1648},[77,11119,10338],{"class":83},[77,11121,1336],{"class":104},[77,11123,10617],{"class":87},[77,11125,10302],{"class":104},[77,11127,11128,11130,11132,11134,11136,11138,11140,11142,11144],{"class":79,"line":1491},[77,11129,10408],{"class":104},[77,11131,10445],{"class":1648},[77,11133,10338],{"class":83},[77,11135,1336],{"class":104},[77,11137,10632],{"class":87},[77,11139,10455],{"class":83},[77,11141,1336],{"class":104},[77,11143,10543],{"class":87},[77,11145,10438],{"class":104},[77,11147,11148,11150,11152,11154,11156,11158,11160,11162,11164],{"class":79,"line":1502},[77,11149,10408],{"class":104},[77,11151,10445],{"class":1648},[77,11153,10338],{"class":83},[77,11155,1336],{"class":104},[77,11157,10653],{"class":87},[77,11159,10455],{"class":83},[77,11161,1336],{"class":104},[77,11163,10460],{"class":87},[77,11165,10438],{"class":104},[77,11167,11168,11170,11172],{"class":79,"line":1508},[77,11169,10467],{"class":104},[77,11171,10610],{"class":1648},[77,11173,10302],{"class":104},[77,11175,11176,11178,11180,11182,11184,11186],{"class":79,"line":1519},[77,11177,10385],{"class":104},[77,11179,10676],{"class":1648},[77,11181,10679],{"class":83},[77,11183,1336],{"class":104},[77,11185,10684],{"class":87},[77,11187,10438],{"class":104},[77,11189,11190,11192,11194,11196,11198,11200],{"class":79,"line":1525},[77,11191,10385],{"class":104},[77,11193,10693],{"class":1648},[77,11195,10696],{"class":83},[77,11197,1336],{"class":104},[77,11199,10701],{"class":87},[77,11201,10438],{"class":104},[77,11203,11204,11206,11208,11210,11212,11214,11216,11218,11220],{"class":79,"line":1538},[77,11205,10385],{"class":104},[77,11207,10710],{"class":1648},[77,11209,10713],{"class":83},[77,11211,1336],{"class":104},[77,11213,10718],{"class":87},[77,11215,10721],{"class":83},[77,11217,1336],{"class":104},[77,11219,10726],{"class":87},[77,11221,10438],{"class":104},[77,11223,11224,11226,11228],{"class":79,"line":1551},[77,11225,10476],{"class":104},[77,11227,10594],{"class":1648},[77,11229,10302],{"class":104},[77,11231,11232,11234,11236],{"class":79,"line":1563},[77,11233,10558],{"class":104},[77,11235,10569],{"class":1648},[77,11237,10302],{"class":104},[77,11239,11240,11242,11244],{"class":79,"line":1576},[77,11241,10749],{"class":104},[77,11243,10327],{"class":1648},[77,11245,10302],{"class":104},[77,11247,11248,11250,11252],{"class":79,"line":1581},[77,11249,10758],{"class":104},[77,11251,10310],{"class":1648},[77,11253,10302],{"class":104},[77,11255,11256,11258,11260],{"class":79,"line":1592},[77,11257,10767],{"class":104},[77,11259,10291],{"class":1648},[77,11261,10302],{"class":104},[18,11263,11264,11265,5194],{},"在params目录下新建一个名为",[74,11266,11267],{},"bt.yaml",[68,11269,11271],{"className":1639,"code":11270,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    use_sim_time: True\n    global_frame: map\n    robot_base_frame: base_link\n    odom_topic: /odom\n    default_bt_xml_filename: \"navigate_w_replanning_and_recovery.xml\"\n    bt_loop_duration: 10\n    default_server_timeout: 20\n    enable_groot_monitoring: True\n    groot_zmq_publisher_port: 1666\n    groot_zmq_server_port: 1667\n    plugin_lib_names:\n    - nav2_compute_path_to_pose_action_bt_node\n    - nav2_compute_path_through_poses_action_bt_node\n    - nav2_follow_path_action_bt_node\n    - nav2_back_up_action_bt_node\n    - nav2_spin_action_bt_node\n    - nav2_wait_action_bt_node\n    - nav2_clear_costmap_service_bt_node\n    - nav2_is_stuck_condition_bt_node\n    - nav2_goal_reached_condition_bt_node\n    - nav2_goal_updated_condition_bt_node\n    - nav2_initial_pose_received_condition_bt_node\n    - nav2_reinitialize_global_localization_service_bt_node\n    - nav2_rate_controller_bt_node\n    - nav2_distance_controller_bt_node\n    - nav2_speed_controller_bt_node\n    - nav2_truncate_path_action_bt_node\n    - nav2_goal_updater_node_bt_node\n    - nav2_recovery_node_bt_node\n    - nav2_pipeline_sequence_bt_node\n    - nav2_round_robin_node_bt_node\n    - nav2_transform_available_condition_bt_node\n    - nav2_time_expired_condition_bt_node\n    - nav2_distance_traveled_condition_bt_node\n    - nav2_single_trigger_bt_node\n    - nav2_is_battery_low_condition_bt_node\n    - nav2_navigate_through_poses_action_bt_node\n    - nav2_navigate_to_pose_action_bt_node\n    - nav2_remove_passed_goals_action_bt_node\n    - nav2_planner_selector_bt_node\n    - nav2_controller_selector_bt_node\n    - nav2_goal_checker_selector_bt_node\n",[74,11272,11273,11279,11285,11293,11302,11311,11321,11331,11341,11351,11360,11370,11380,11387,11395,11402,11409,11416,11423,11430,11437,11444,11451,11458,11465,11472,11479,11486,11493,11500,11507,11514,11521,11528,11535,11542,11549,11556,11563,11570,11577,11584,11591,11598],{"__ignoreMap":32},[77,11274,11275,11277],{"class":79,"line":80},[77,11276,6353],{"class":1648},[77,11278,1651],{"class":104},[77,11280,11281,11283],{"class":79,"line":114},[77,11282,1656],{"class":1648},[77,11284,1651],{"class":104},[77,11286,11287,11289,11291],{"class":79,"line":136},[77,11288,6366],{"class":1648},[77,11290,1666],{"class":104},[77,11292,6371],{"class":1217},[77,11294,11295,11298,11300],{"class":79,"line":143},[77,11296,11297],{"class":1648},"    global_frame",[77,11299,1666],{"class":104},[77,11301,1743],{"class":87},[77,11303,11304,11307,11309],{"class":79,"line":150},[77,11305,11306],{"class":1648},"    robot_base_frame",[77,11308,1666],{"class":104},[77,11310,1753],{"class":87},[77,11312,11313,11316,11318],{"class":79,"line":162},[77,11314,11315],{"class":1648},"    odom_topic",[77,11317,1666],{"class":104},[77,11319,11320],{"class":87},"/odom\n",[77,11322,11323,11326,11328],{"class":79,"line":174},[77,11324,11325],{"class":1648},"    default_bt_xml_filename",[77,11327,1666],{"class":104},[77,11329,11330],{"class":87},"\"navigate_w_replanning_and_recovery.xml\"\n",[77,11332,11333,11336,11338],{"class":79,"line":179},[77,11334,11335],{"class":1648},"    bt_loop_duration",[77,11337,1666],{"class":104},[77,11339,11340],{"class":1217},"10\n",[77,11342,11343,11346,11348],{"class":79,"line":185},[77,11344,11345],{"class":1648},"    default_server_timeout",[77,11347,1666],{"class":104},[77,11349,11350],{"class":1217},"20\n",[77,11352,11353,11356,11358],{"class":79,"line":197},[77,11354,11355],{"class":1648},"    enable_groot_monitoring",[77,11357,1666],{"class":104},[77,11359,6371],{"class":1217},[77,11361,11362,11365,11367],{"class":79,"line":1348},[77,11363,11364],{"class":1648},"    groot_zmq_publisher_port",[77,11366,1666],{"class":104},[77,11368,11369],{"class":1217},"1666\n",[77,11371,11372,11375,11377],{"class":79,"line":1363},[77,11373,11374],{"class":1648},"    groot_zmq_server_port",[77,11376,1666],{"class":104},[77,11378,11379],{"class":1217},"1667\n",[77,11381,11382,11385],{"class":79,"line":1368},[77,11383,11384],{"class":1648},"    plugin_lib_names",[77,11386,1651],{"class":104},[77,11388,11389,11392],{"class":79,"line":1379},[77,11390,11391],{"class":104},"    - ",[77,11393,11394],{"class":87},"nav2_compute_path_to_pose_action_bt_node\n",[77,11396,11397,11399],{"class":79,"line":1388},[77,11398,11391],{"class":104},[77,11400,11401],{"class":87},"nav2_compute_path_through_poses_action_bt_node\n",[77,11403,11404,11406],{"class":79,"line":1402},[77,11405,11391],{"class":104},[77,11407,11408],{"class":87},"nav2_follow_path_action_bt_node\n",[77,11410,11411,11413],{"class":79,"line":1415},[77,11412,11391],{"class":104},[77,11414,11415],{"class":87},"nav2_back_up_action_bt_node\n",[77,11417,11418,11420],{"class":79,"line":1425},[77,11419,11391],{"class":104},[77,11421,11422],{"class":87},"nav2_spin_action_bt_node\n",[77,11424,11425,11427],{"class":79,"line":1433},[77,11426,11391],{"class":104},[77,11428,11429],{"class":87},"nav2_wait_action_bt_node\n",[77,11431,11432,11434],{"class":79,"line":1449},[77,11433,11391],{"class":104},[77,11435,11436],{"class":87},"nav2_clear_costmap_service_bt_node\n",[77,11438,11439,11441],{"class":79,"line":1463},[77,11440,11391],{"class":104},[77,11442,11443],{"class":87},"nav2_is_stuck_condition_bt_node\n",[77,11445,11446,11448],{"class":79,"line":1475},[77,11447,11391],{"class":104},[77,11449,11450],{"class":87},"nav2_goal_reached_condition_bt_node\n",[77,11452,11453,11455],{"class":79,"line":1480},[77,11454,11391],{"class":104},[77,11456,11457],{"class":87},"nav2_goal_updated_condition_bt_node\n",[77,11459,11460,11462],{"class":79,"line":1491},[77,11461,11391],{"class":104},[77,11463,11464],{"class":87},"nav2_initial_pose_received_condition_bt_node\n",[77,11466,11467,11469],{"class":79,"line":1502},[77,11468,11391],{"class":104},[77,11470,11471],{"class":87},"nav2_reinitialize_global_localization_service_bt_node\n",[77,11473,11474,11476],{"class":79,"line":1508},[77,11475,11391],{"class":104},[77,11477,11478],{"class":87},"nav2_rate_controller_bt_node\n",[77,11480,11481,11483],{"class":79,"line":1519},[77,11482,11391],{"class":104},[77,11484,11485],{"class":87},"nav2_distance_controller_bt_node\n",[77,11487,11488,11490],{"class":79,"line":1525},[77,11489,11391],{"class":104},[77,11491,11492],{"class":87},"nav2_speed_controller_bt_node\n",[77,11494,11495,11497],{"class":79,"line":1538},[77,11496,11391],{"class":104},[77,11498,11499],{"class":87},"nav2_truncate_path_action_bt_node\n",[77,11501,11502,11504],{"class":79,"line":1551},[77,11503,11391],{"class":104},[77,11505,11506],{"class":87},"nav2_goal_updater_node_bt_node\n",[77,11508,11509,11511],{"class":79,"line":1563},[77,11510,11391],{"class":104},[77,11512,11513],{"class":87},"nav2_recovery_node_bt_node\n",[77,11515,11516,11518],{"class":79,"line":1576},[77,11517,11391],{"class":104},[77,11519,11520],{"class":87},"nav2_pipeline_sequence_bt_node\n",[77,11522,11523,11525],{"class":79,"line":1581},[77,11524,11391],{"class":104},[77,11526,11527],{"class":87},"nav2_round_robin_node_bt_node\n",[77,11529,11530,11532],{"class":79,"line":1592},[77,11531,11391],{"class":104},[77,11533,11534],{"class":87},"nav2_transform_available_condition_bt_node\n",[77,11536,11537,11539],{"class":79,"line":1597},[77,11538,11391],{"class":104},[77,11540,11541],{"class":87},"nav2_time_expired_condition_bt_node\n",[77,11543,11544,11546],{"class":79,"line":1603},[77,11545,11391],{"class":104},[77,11547,11548],{"class":87},"nav2_distance_traveled_condition_bt_node\n",[77,11550,11551,11553],{"class":79,"line":1609},[77,11552,11391],{"class":104},[77,11554,11555],{"class":87},"nav2_single_trigger_bt_node\n",[77,11557,11558,11560],{"class":79,"line":1615},[77,11559,11391],{"class":104},[77,11561,11562],{"class":87},"nav2_is_battery_low_condition_bt_node\n",[77,11564,11565,11567],{"class":79,"line":1620},[77,11566,11391],{"class":104},[77,11568,11569],{"class":87},"nav2_navigate_through_poses_action_bt_node\n",[77,11571,11572,11574],{"class":79,"line":2003},[77,11573,11391],{"class":104},[77,11575,11576],{"class":87},"nav2_navigate_to_pose_action_bt_node\n",[77,11578,11579,11581],{"class":79,"line":2014},[77,11580,11391],{"class":104},[77,11582,11583],{"class":87},"nav2_remove_passed_goals_action_bt_node\n",[77,11585,11586,11588],{"class":79,"line":2027},[77,11587,11391],{"class":104},[77,11589,11590],{"class":87},"nav2_planner_selector_bt_node\n",[77,11592,11593,11595],{"class":79,"line":2041},[77,11594,11391],{"class":104},[77,11596,11597],{"class":87},"nav2_controller_selector_bt_node\n",[77,11599,11600,11602],{"class":79,"line":2054},[77,11601,11391],{"class":104},[77,11603,11604],{"class":87},"nav2_goal_checker_selector_bt_node\n",[18,11606,11607],{},[21,11608,11609],{},"（2）planner_server相关配置文件",[18,11611,11264,11612,5194],{},[74,11613,11614],{},"planner.yaml",[68,11616,11618],{"className":1639,"code":11617,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    expected_planner_frequency: 20.0\n    use_sim_time: True\n    planner_plugins: [\"GridBased\"]\n    GridBased:\n      plugin: \"nav2_navfn_planner/NavfnPlanner\"\n      tolerance: 0.5\n      use_astar: false\n      allow_unknown: true\n\n/**:\n  global_costmap:\n    ros__parameters:\n      update_frequency: 1.0\n      publish_frequency: 1.0\n      global_frame: map\n      robot_base_frame: base_link\n      use_sim_time: True\n\n      # robot_radius: 0.2\n      footprint: \"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n      resolution: 0.05\n      track_unknown_space: true\n      plugins: [\"static_layer\", \"obstacle_layer\", \"voxel_layer\", \"inflation_layer\"]\n      obstacle_layer:\n        plugin: \"nav2_costmap_2d::ObstacleLayer\"\n        enabled: True\n        observation_sources: scan\n        scan:\n          topic: /scan\n          max_obstacle_height: 2.0\n          clearing: True\n          marking: True\n          data_type: \"LaserScan\"\n          raytrace_max_range: 3.0\n          raytrace_min_range: 0.0\n          obstacle_max_range: 2.5\n          obstacle_min_range: 0.0\n      voxel_layer:\n        plugin: \"nav2_costmap_2d::VoxelLayer\"\n        enabled: True\n        publish_voxel_map: True\n        origin_z: 0.0\n        z_resolution: 0.05\n        z_voxels: 16\n        max_obstacle_height: 2.0\n        mark_threshold: 0\n        observation_sources: scan\n        scan:\n          topic: /scan\n          max_obstacle_height: 2.0\n          clearing: True\n          marking: True\n          data_type: \"LaserScan\"\n          raytrace_max_range: 3.0\n          raytrace_min_range: 0.0\n          obstacle_max_range: 2.5\n          obstacle_min_range: 0.0\n      static_layer:\n        plugin: \"nav2_costmap_2d::StaticLayer\"\n        map_subscribe_transient_local: True\n      inflation_layer:\n        plugin: \"nav2_costmap_2d::InflationLayer\"\n        cost_scaling_factor: 4.0\n        inflation_radius: 0.55\n      always_send_full_costmap: False\n",[74,11619,11620,11626,11632,11642,11650,11661,11668,11678,11687,11696,11705,11709,11715,11722,11729,11739,11748,11757,11766,11775,11779,11784,11794,11803,11812,11839,11846,11856,11865,11874,11881,11890,11899,11908,11917,11927,11936,11945,11955,11964,11971,11980,11988,11997,12006,12015,12025,12034,12043,12051,12057,12065,12073,12081,12089,12097,12105,12113,12121,12129,12136,12145,12154,12161,12170,12180,12190],{"__ignoreMap":32},[77,11621,11622,11624],{"class":79,"line":80},[77,11623,6353],{"class":1648},[77,11625,1651],{"class":104},[77,11627,11628,11630],{"class":79,"line":114},[77,11629,1656],{"class":1648},[77,11631,1651],{"class":104},[77,11633,11634,11637,11639],{"class":79,"line":136},[77,11635,11636],{"class":1648},"    expected_planner_frequency",[77,11638,1666],{"class":104},[77,11640,11641],{"class":1217},"20.0\n",[77,11643,11644,11646,11648],{"class":79,"line":143},[77,11645,6366],{"class":1648},[77,11647,1666],{"class":104},[77,11649,6371],{"class":1217},[77,11651,11652,11655,11657,11659],{"class":79,"line":150},[77,11653,11654],{"class":1648},"    planner_plugins",[77,11656,4856],{"class":104},[77,11658,10435],{"class":87},[77,11660,4872],{"class":104},[77,11662,11663,11666],{"class":79,"line":162},[77,11664,11665],{"class":1648},"    GridBased",[77,11667,1651],{"class":104},[77,11669,11670,11673,11675],{"class":79,"line":174},[77,11671,11672],{"class":1648},"      plugin",[77,11674,1666],{"class":104},[77,11676,11677],{"class":87},"\"nav2_navfn_planner/NavfnPlanner\"\n",[77,11679,11680,11683,11685],{"class":79,"line":179},[77,11681,11682],{"class":1648},"      tolerance",[77,11684,1666],{"class":104},[77,11686,1874],{"class":1217},[77,11688,11689,11692,11694],{"class":79,"line":185},[77,11690,11691],{"class":1648},"      use_astar",[77,11693,1666],{"class":104},[77,11695,1809],{"class":1217},[77,11697,11698,11701,11703],{"class":79,"line":197},[77,11699,11700],{"class":1648},"      allow_unknown",[77,11702,1666],{"class":104},[77,11704,1916],{"class":1217},[77,11706,11707],{"class":79,"line":1348},[77,11708,140],{"emptyLinePlaceholder":139},[77,11710,11711,11713],{"class":79,"line":1363},[77,11712,6353],{"class":1648},[77,11714,1651],{"class":104},[77,11716,11717,11720],{"class":79,"line":1368},[77,11718,11719],{"class":1648},"  global_costmap",[77,11721,1651],{"class":104},[77,11723,11724,11727],{"class":79,"line":1379},[77,11725,11726],{"class":1648},"    ros__parameters",[77,11728,1651],{"class":104},[77,11730,11731,11734,11736],{"class":79,"line":1388},[77,11732,11733],{"class":1648},"      update_frequency",[77,11735,1666],{"class":104},[77,11737,11738],{"class":1217},"1.0\n",[77,11740,11741,11744,11746],{"class":79,"line":1402},[77,11742,11743],{"class":1648},"      publish_frequency",[77,11745,1666],{"class":104},[77,11747,11738],{"class":1217},[77,11749,11750,11753,11755],{"class":79,"line":1415},[77,11751,11752],{"class":1648},"      global_frame",[77,11754,1666],{"class":104},[77,11756,1743],{"class":87},[77,11758,11759,11762,11764],{"class":79,"line":1425},[77,11760,11761],{"class":1648},"      robot_base_frame",[77,11763,1666],{"class":104},[77,11765,1753],{"class":87},[77,11767,11768,11771,11773],{"class":79,"line":1433},[77,11769,11770],{"class":1648},"      use_sim_time",[77,11772,1666],{"class":104},[77,11774,6371],{"class":1217},[77,11776,11777],{"class":79,"line":1449},[77,11778,140],{"emptyLinePlaceholder":139},[77,11780,11781],{"class":79,"line":1463},[77,11782,11783],{"class":146},"      # robot_radius: 0.2\n",[77,11785,11786,11789,11791],{"class":79,"line":1475},[77,11787,11788],{"class":1648},"      footprint",[77,11790,1666],{"class":104},[77,11792,11793],{"class":87},"\"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n",[77,11795,11796,11799,11801],{"class":79,"line":1480},[77,11797,11798],{"class":1648},"      resolution",[77,11800,1666],{"class":104},[77,11802,1852],{"class":1217},[77,11804,11805,11808,11810],{"class":79,"line":1491},[77,11806,11807],{"class":1648},"      track_unknown_space",[77,11809,1666],{"class":104},[77,11811,1916],{"class":1217},[77,11813,11814,11817,11819,11822,11824,11827,11829,11832,11834,11837],{"class":79,"line":1502},[77,11815,11816],{"class":1648},"      plugins",[77,11818,4856],{"class":104},[77,11820,11821],{"class":87},"\"static_layer\"",[77,11823,1455],{"class":104},[77,11825,11826],{"class":87},"\"obstacle_layer\"",[77,11828,1455],{"class":104},[77,11830,11831],{"class":87},"\"voxel_layer\"",[77,11833,1455],{"class":104},[77,11835,11836],{"class":87},"\"inflation_layer\"",[77,11838,4872],{"class":104},[77,11840,11841,11844],{"class":79,"line":1508},[77,11842,11843],{"class":1648},"      obstacle_layer",[77,11845,1651],{"class":104},[77,11847,11848,11851,11853],{"class":79,"line":1519},[77,11849,11850],{"class":1648},"        plugin",[77,11852,1666],{"class":104},[77,11854,11855],{"class":87},"\"nav2_costmap_2d::ObstacleLayer\"\n",[77,11857,11858,11861,11863],{"class":79,"line":1525},[77,11859,11860],{"class":1648},"        enabled",[77,11862,1666],{"class":104},[77,11864,6371],{"class":1217},[77,11866,11867,11870,11872],{"class":79,"line":1538},[77,11868,11869],{"class":1648},"        observation_sources",[77,11871,1666],{"class":104},[77,11873,6717],{"class":87},[77,11875,11876,11879],{"class":79,"line":1551},[77,11877,11878],{"class":1648},"        scan",[77,11880,1651],{"class":104},[77,11882,11883,11886,11888],{"class":79,"line":1563},[77,11884,11885],{"class":1648},"          topic",[77,11887,1666],{"class":104},[77,11889,1763],{"class":87},[77,11891,11892,11895,11897],{"class":79,"line":1576},[77,11893,11894],{"class":1648},"          max_obstacle_height",[77,11896,1666],{"class":104},[77,11898,1842],{"class":1217},[77,11900,11901,11904,11906],{"class":79,"line":1581},[77,11902,11903],{"class":1648},"          clearing",[77,11905,1666],{"class":104},[77,11907,6371],{"class":1217},[77,11909,11910,11913,11915],{"class":79,"line":1592},[77,11911,11912],{"class":1648},"          marking",[77,11914,1666],{"class":104},[77,11916,6371],{"class":1217},[77,11918,11919,11922,11924],{"class":79,"line":1597},[77,11920,11921],{"class":1648},"          data_type",[77,11923,1666],{"class":104},[77,11925,11926],{"class":87},"\"LaserScan\"\n",[77,11928,11929,11932,11934],{"class":79,"line":1603},[77,11930,11931],{"class":1648},"          raytrace_max_range",[77,11933,1666],{"class":104},[77,11935,2011],{"class":1217},[77,11937,11938,11941,11943],{"class":79,"line":1609},[77,11939,11940],{"class":1648},"          raytrace_min_range",[77,11942,1666],{"class":104},[77,11944,6590],{"class":1217},[77,11946,11947,11950,11952],{"class":79,"line":1615},[77,11948,11949],{"class":1648},"          obstacle_max_range",[77,11951,1666],{"class":104},[77,11953,11954],{"class":1217},"2.5\n",[77,11956,11957,11960,11962],{"class":79,"line":1620},[77,11958,11959],{"class":1648},"          obstacle_min_range",[77,11961,1666],{"class":104},[77,11963,6590],{"class":1217},[77,11965,11966,11969],{"class":79,"line":2003},[77,11967,11968],{"class":1648},"      voxel_layer",[77,11970,1651],{"class":104},[77,11972,11973,11975,11977],{"class":79,"line":2014},[77,11974,11850],{"class":1648},[77,11976,1666],{"class":104},[77,11978,11979],{"class":87},"\"nav2_costmap_2d::VoxelLayer\"\n",[77,11981,11982,11984,11986],{"class":79,"line":2027},[77,11983,11860],{"class":1648},[77,11985,1666],{"class":104},[77,11987,6371],{"class":1217},[77,11989,11990,11993,11995],{"class":79,"line":2041},[77,11991,11992],{"class":1648},"        publish_voxel_map",[77,11994,1666],{"class":104},[77,11996,6371],{"class":1217},[77,11998,11999,12002,12004],{"class":79,"line":2054},[77,12000,12001],{"class":1648},"        origin_z",[77,12003,1666],{"class":104},[77,12005,6590],{"class":1217},[77,12007,12008,12011,12013],{"class":79,"line":2068},[77,12009,12010],{"class":1648},"        z_resolution",[77,12012,1666],{"class":104},[77,12014,1852],{"class":1217},[77,12016,12017,12020,12022],{"class":79,"line":2079},[77,12018,12019],{"class":1648},"        z_voxels",[77,12021,1666],{"class":104},[77,12023,12024],{"class":1217},"16\n",[77,12026,12027,12030,12032],{"class":79,"line":2084},[77,12028,12029],{"class":1648},"        max_obstacle_height",[77,12031,1666],{"class":104},[77,12033,1842],{"class":1217},[77,12035,12036,12039,12041],{"class":79,"line":2094},[77,12037,12038],{"class":1648},"        mark_threshold",[77,12040,1666],{"class":104},[77,12042,4882],{"class":1217},[77,12044,12045,12047,12049],{"class":79,"line":2105},[77,12046,11869],{"class":1648},[77,12048,1666],{"class":104},[77,12050,6717],{"class":87},[77,12052,12053,12055],{"class":79,"line":2117},[77,12054,11878],{"class":1648},[77,12056,1651],{"class":104},[77,12058,12059,12061,12063],{"class":79,"line":2122},[77,12060,11885],{"class":1648},[77,12062,1666],{"class":104},[77,12064,1763],{"class":87},[77,12066,12067,12069,12071],{"class":79,"line":2133},[77,12068,11894],{"class":1648},[77,12070,1666],{"class":104},[77,12072,1842],{"class":1217},[77,12074,12075,12077,12079],{"class":79,"line":2143},[77,12076,11903],{"class":1648},[77,12078,1666],{"class":104},[77,12080,6371],{"class":1217},[77,12082,12083,12085,12087],{"class":79,"line":2154},[77,12084,11912],{"class":1648},[77,12086,1666],{"class":104},[77,12088,6371],{"class":1217},[77,12090,12091,12093,12095],{"class":79,"line":2159},[77,12092,11921],{"class":1648},[77,12094,1666],{"class":104},[77,12096,11926],{"class":87},[77,12098,12099,12101,12103],{"class":79,"line":2173},[77,12100,11931],{"class":1648},[77,12102,1666],{"class":104},[77,12104,2011],{"class":1217},[77,12106,12107,12109,12111],{"class":79,"line":2186},[77,12108,11940],{"class":1648},[77,12110,1666],{"class":104},[77,12112,6590],{"class":1217},[77,12114,12115,12117,12119],{"class":79,"line":2191},[77,12116,11949],{"class":1648},[77,12118,1666],{"class":104},[77,12120,11954],{"class":1217},[77,12122,12123,12125,12127],{"class":79,"line":2205},[77,12124,11959],{"class":1648},[77,12126,1666],{"class":104},[77,12128,6590],{"class":1217},[77,12130,12131,12134],{"class":79,"line":2219},[77,12132,12133],{"class":1648},"      static_layer",[77,12135,1651],{"class":104},[77,12137,12138,12140,12142],{"class":79,"line":2233},[77,12139,11850],{"class":1648},[77,12141,1666],{"class":104},[77,12143,12144],{"class":87},"\"nav2_costmap_2d::StaticLayer\"\n",[77,12146,12147,12150,12152],{"class":79,"line":2244},[77,12148,12149],{"class":1648},"        map_subscribe_transient_local",[77,12151,1666],{"class":104},[77,12153,6371],{"class":1217},[77,12155,12156,12159],{"class":79,"line":2254},[77,12157,12158],{"class":1648},"      inflation_layer",[77,12160,1651],{"class":104},[77,12162,12163,12165,12167],{"class":79,"line":9882},[77,12164,11850],{"class":1648},[77,12166,1666],{"class":104},[77,12168,12169],{"class":87},"\"nav2_costmap_2d::InflationLayer\"\n",[77,12171,12172,12175,12177],{"class":79,"line":9893},[77,12173,12174],{"class":1648},"        cost_scaling_factor",[77,12176,1666],{"class":104},[77,12178,12179],{"class":1217},"4.0\n",[77,12181,12182,12185,12187],{"class":79,"line":9903},[77,12183,12184],{"class":1648},"        inflation_radius",[77,12186,1666],{"class":104},[77,12188,12189],{"class":1217},"0.55\n",[77,12191,12192,12195,12197],{"class":79,"line":9908},[77,12193,12194],{"class":1648},"      always_send_full_costmap",[77,12196,1666],{"class":104},[77,12198,12199],{"class":1217},"False\n",[18,12201,12202],{},[21,12203,12204],{},"（3）controller_server相关配置文件",[18,12206,11264,12207,5194],{},[74,12208,12209],{},"controller.yaml",[68,12211,12213],{"className":1639,"code":12212,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    use_sim_time: True\n    controller_frequency: 10.0\n    min_x_velocity_threshold: 0.001\n    min_y_velocity_threshold: 0.5\n    min_theta_velocity_threshold: 0.001\n\n    # failure_tolerance: 0.3\n    failure_tolerance: 1.0\n    progress_checker_plugin: \"progress_checker\"\n    goal_checker_plugins: [\"general_goal_checker\"] \n    controller_plugins: [\"FollowPath\"]\n\n    # Progress checker parameters\n    progress_checker:\n      plugin: \"nav2_controller::SimpleProgressChecker\"\n      required_movement_radius: 0.5\n      movement_time_allowance: 10.0\n\n    general_goal_checker:\n      stateful: True\n      plugin: \"nav2_controller::SimpleGoalChecker\"\n      xy_goal_tolerance: 0.25\n      yaw_goal_tolerance: 0.25\n\n    # DWB parameters\n    FollowPath:\n      plugin: \"dwb_core::DWBLocalPlanner\"\n      debug_trajectory_details: True\n      min_vel_x: 0.0\n      min_vel_y: 0.0\n\n      # max_vel_x: 0.15\n      max_vel_x: 0.2\n      max_vel_y: 0.0\n\n      # max_vel_theta: 1.0\n      max_vel_theta: 1.0\n      min_speed_xy: 0.0\n      max_speed_xy: 0.2\n      min_speed_theta: 0.0\n\n      # Add high threshold velocity for turtlebot 3 issue.\n\n      # https://github.com/ROBOTIS-GIT/turtlebot3_simulations/issues/75\n      acc_lim_x: 1.0\n      acc_lim_y: 0.0\n      acc_lim_theta: 3.2\n      decel_lim_x: -1.0\n      decel_lim_y: 0.0\n      decel_lim_theta: -3.2\n\n      # vx_samples: 20\n      vx_samples: 20\n      vy_samples: 5\n      vtheta_samples: 20\n      sim_time: 1.7\n      linear_granularity: 0.05\n      angular_granularity: 0.025\n\n      # transform_tolerance: 0.2\n      transform_tolerance: 1.0\n      xy_goal_tolerance: 0.15\n      trans_stopped_velocity: 0.25\n      short_circuit_trajectory_evaluation: True\n      stateful: True\n      critics: [\"RotateToGoal\", \"Oscillation\", \"BaseObstacle\", \"GoalAlign\", \"PathAlign\", \"PathDist\", \"GoalDist\"]\n      BaseObstacle.scale: 0.02\n      PathAlign.scale: 32.0\n      PathAlign.forward_point_distance: 0.1\n      GoalAlign.scale: 24.0\n      GoalAlign.forward_point_distance: 0.1\n      PathDist.scale: 32.0\n      GoalDist.scale: 24.0\n      RotateToGoal.scale: 32.0\n      RotateToGoal.slowing_factor: 5.0\n      RotateToGoal.lookahead_time: -1.0\n/**:\n  local_costmap:\n    ros__parameters:\n      update_frequency: 5.0\n      publish_frequency: 2.0\n      global_frame: odom\n      robot_base_frame: base_link\n      use_sim_time: True\n      rolling_window: True\n      width: 2\n      height: 2\n      resolution: 0.05\n\n      # robot_radius: 0.20\n      footprint: \"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n      plugins: [\"obstacle_layer\", \"voxel_layer\", \"inflation_layer\"]\n      inflation_layer:\n        plugin: \"nav2_costmap_2d::InflationLayer\"\n        inflation_radius: 0.5\n        cost_scaling_factor: 4.0\n      obstacle_layer:\n        plugin: \"nav2_costmap_2d::ObstacleLayer\"\n        enabled: True\n        observation_sources: scan\n        scan:\n          topic: /scan\n          max_obstacle_height: 2.0\n          clearing: True\n          marking: True\n          data_type: \"LaserScan\"\n      voxel_layer:\n        plugin: \"nav2_costmap_2d::VoxelLayer\"\n        enabled: True\n        publish_voxel_map: True\n        origin_z: 0.0\n        z_resolution: 0.05\n        z_voxels: 16\n        max_obstacle_height: 2.0\n        mark_threshold: 0\n        observation_sources: scan\n        scan:\n          topic: /scan\n          max_obstacle_height: 2.0\n          clearing: True\n          marking: True\n          data_type: \"LaserScan\"\n          raytrace_max_range: 3.0\n          raytrace_min_range: 0.0\n          obstacle_max_range: 2.5\n          obstacle_min_range: 0.0\n      static_layer:\n        map_subscribe_transient_local: True\n      always_send_full_costmap: True\n",[74,12214,12215,12221,12227,12235,12244,12254,12263,12272,12276,12281,12290,12300,12313,12324,12328,12333,12340,12349,12358,12367,12371,12378,12387,12396,12405,12414,12418,12423,12430,12439,12448,12457,12466,12470,12475,12484,12493,12497,12502,12511,12520,12529,12538,12542,12547,12551,12556,12565,12574,12584,12593,12602,12612,12616,12621,12630,12640,12649,12659,12668,12678,12682,12687,12696,12705,12714,12723,12731,12773,12783,12793,12802,12812,12821,12830,12839,12848,12858,12867,12873,12880,12886,12894,12902,12910,12918,12926,12935,12945,12954,12962,12966,12971,12979,12997,13003,13011,13019,13027,13033,13041,13049,13057,13063,13071,13079,13088,13097,13106,13113,13122,13131,13140,13149,13158,13167,13176,13185,13194,13201,13210,13219,13228,13237,13246,13255,13264,13273,13282,13289,13298],{"__ignoreMap":32},[77,12216,12217,12219],{"class":79,"line":80},[77,12218,6353],{"class":1648},[77,12220,1651],{"class":104},[77,12222,12223,12225],{"class":79,"line":114},[77,12224,1656],{"class":1648},[77,12226,1651],{"class":104},[77,12228,12229,12231,12233],{"class":79,"line":136},[77,12230,6366],{"class":1648},[77,12232,1666],{"class":104},[77,12234,6371],{"class":1217},[77,12236,12237,12240,12242],{"class":79,"line":143},[77,12238,12239],{"class":1648},"    controller_frequency",[77,12241,1666],{"class":104},[77,12243,1977],{"class":1217},[77,12245,12246,12249,12251],{"class":79,"line":150},[77,12247,12248],{"class":1648},"    min_x_velocity_threshold",[77,12250,1666],{"class":104},[77,12252,12253],{"class":1217},"0.001\n",[77,12255,12256,12259,12261],{"class":79,"line":162},[77,12257,12258],{"class":1648},"    min_y_velocity_threshold",[77,12260,1666],{"class":104},[77,12262,1874],{"class":1217},[77,12264,12265,12268,12270],{"class":79,"line":174},[77,12266,12267],{"class":1648},"    min_theta_velocity_threshold",[77,12269,1666],{"class":104},[77,12271,12253],{"class":1217},[77,12273,12274],{"class":79,"line":179},[77,12275,140],{"emptyLinePlaceholder":139},[77,12277,12278],{"class":79,"line":185},[77,12279,12280],{"class":146},"    # failure_tolerance: 0.3\n",[77,12282,12283,12286,12288],{"class":79,"line":197},[77,12284,12285],{"class":1648},"    failure_tolerance",[77,12287,1666],{"class":104},[77,12289,11738],{"class":1217},[77,12291,12292,12295,12297],{"class":79,"line":1348},[77,12293,12294],{"class":1648},"    progress_checker_plugin",[77,12296,1666],{"class":104},[77,12298,12299],{"class":87},"\"progress_checker\"\n",[77,12301,12302,12305,12307,12310],{"class":79,"line":1363},[77,12303,12304],{"class":1648},"    goal_checker_plugins",[77,12306,4856],{"class":104},[77,12308,12309],{"class":87},"\"general_goal_checker\"",[77,12311,12312],{"class":104},"] \n",[77,12314,12315,12318,12320,12322],{"class":79,"line":1368},[77,12316,12317],{"class":1648},"    controller_plugins",[77,12319,4856],{"class":104},[77,12321,10499],{"class":87},[77,12323,4872],{"class":104},[77,12325,12326],{"class":79,"line":1379},[77,12327,140],{"emptyLinePlaceholder":139},[77,12329,12330],{"class":79,"line":1388},[77,12331,12332],{"class":146},"    # Progress checker parameters\n",[77,12334,12335,12338],{"class":79,"line":1402},[77,12336,12337],{"class":1648},"    progress_checker",[77,12339,1651],{"class":104},[77,12341,12342,12344,12346],{"class":79,"line":1415},[77,12343,11672],{"class":1648},[77,12345,1666],{"class":104},[77,12347,12348],{"class":87},"\"nav2_controller::SimpleProgressChecker\"\n",[77,12350,12351,12354,12356],{"class":79,"line":1425},[77,12352,12353],{"class":1648},"      required_movement_radius",[77,12355,1666],{"class":104},[77,12357,1874],{"class":1217},[77,12359,12360,12363,12365],{"class":79,"line":1433},[77,12361,12362],{"class":1648},"      movement_time_allowance",[77,12364,1666],{"class":104},[77,12366,1977],{"class":1217},[77,12368,12369],{"class":79,"line":1449},[77,12370,140],{"emptyLinePlaceholder":139},[77,12372,12373,12376],{"class":79,"line":1463},[77,12374,12375],{"class":1648},"    general_goal_checker",[77,12377,1651],{"class":104},[77,12379,12380,12383,12385],{"class":79,"line":1475},[77,12381,12382],{"class":1648},"      stateful",[77,12384,1666],{"class":104},[77,12386,6371],{"class":1217},[77,12388,12389,12391,12393],{"class":79,"line":1480},[77,12390,11672],{"class":1648},[77,12392,1666],{"class":104},[77,12394,12395],{"class":87},"\"nav2_controller::SimpleGoalChecker\"\n",[77,12397,12398,12401,12403],{"class":79,"line":1491},[77,12399,12400],{"class":1648},"      xy_goal_tolerance",[77,12402,1666],{"class":104},[77,12404,4902],{"class":1217},[77,12406,12407,12410,12412],{"class":79,"line":1502},[77,12408,12409],{"class":1648},"      yaw_goal_tolerance",[77,12411,1666],{"class":104},[77,12413,4902],{"class":1217},[77,12415,12416],{"class":79,"line":1508},[77,12417,140],{"emptyLinePlaceholder":139},[77,12419,12420],{"class":79,"line":1519},[77,12421,12422],{"class":146},"    # DWB parameters\n",[77,12424,12425,12428],{"class":79,"line":1525},[77,12426,12427],{"class":1648},"    FollowPath",[77,12429,1651],{"class":104},[77,12431,12432,12434,12436],{"class":79,"line":1538},[77,12433,11672],{"class":1648},[77,12435,1666],{"class":104},[77,12437,12438],{"class":87},"\"dwb_core::DWBLocalPlanner\"\n",[77,12440,12441,12444,12446],{"class":79,"line":1551},[77,12442,12443],{"class":1648},"      debug_trajectory_details",[77,12445,1666],{"class":104},[77,12447,6371],{"class":1217},[77,12449,12450,12453,12455],{"class":79,"line":1563},[77,12451,12452],{"class":1648},"      min_vel_x",[77,12454,1666],{"class":104},[77,12456,6590],{"class":1217},[77,12458,12459,12462,12464],{"class":79,"line":1576},[77,12460,12461],{"class":1648},"      min_vel_y",[77,12463,1666],{"class":104},[77,12465,6590],{"class":1217},[77,12467,12468],{"class":79,"line":1581},[77,12469,140],{"emptyLinePlaceholder":139},[77,12471,12472],{"class":79,"line":1592},[77,12473,12474],{"class":146},"      # max_vel_x: 0.15\n",[77,12476,12477,12480,12482],{"class":79,"line":1597},[77,12478,12479],{"class":1648},"      max_vel_x",[77,12481,1666],{"class":104},[77,12483,1884],{"class":1217},[77,12485,12486,12489,12491],{"class":79,"line":1603},[77,12487,12488],{"class":1648},"      max_vel_y",[77,12490,1666],{"class":104},[77,12492,6590],{"class":1217},[77,12494,12495],{"class":79,"line":1609},[77,12496,140],{"emptyLinePlaceholder":139},[77,12498,12499],{"class":79,"line":1615},[77,12500,12501],{"class":146},"      # max_vel_theta: 1.0\n",[77,12503,12504,12507,12509],{"class":79,"line":1620},[77,12505,12506],{"class":1648},"      max_vel_theta",[77,12508,1666],{"class":104},[77,12510,11738],{"class":1217},[77,12512,12513,12516,12518],{"class":79,"line":2003},[77,12514,12515],{"class":1648},"      min_speed_xy",[77,12517,1666],{"class":104},[77,12519,6590],{"class":1217},[77,12521,12522,12525,12527],{"class":79,"line":2014},[77,12523,12524],{"class":1648},"      max_speed_xy",[77,12526,1666],{"class":104},[77,12528,1884],{"class":1217},[77,12530,12531,12534,12536],{"class":79,"line":2027},[77,12532,12533],{"class":1648},"      min_speed_theta",[77,12535,1666],{"class":104},[77,12537,6590],{"class":1217},[77,12539,12540],{"class":79,"line":2041},[77,12541,140],{"emptyLinePlaceholder":139},[77,12543,12544],{"class":79,"line":2054},[77,12545,12546],{"class":146},"      # Add high threshold velocity for turtlebot 3 issue.\n",[77,12548,12549],{"class":79,"line":2068},[77,12550,140],{"emptyLinePlaceholder":139},[77,12552,12553],{"class":79,"line":2079},[77,12554,12555],{"class":146},"      # https://github.com/ROBOTIS-GIT/turtlebot3_simulations/issues/75\n",[77,12557,12558,12561,12563],{"class":79,"line":2084},[77,12559,12560],{"class":1648},"      acc_lim_x",[77,12562,1666],{"class":104},[77,12564,11738],{"class":1217},[77,12566,12567,12570,12572],{"class":79,"line":2094},[77,12568,12569],{"class":1648},"      acc_lim_y",[77,12571,1666],{"class":104},[77,12573,6590],{"class":1217},[77,12575,12576,12579,12581],{"class":79,"line":2105},[77,12577,12578],{"class":1648},"      acc_lim_theta",[77,12580,1666],{"class":104},[77,12582,12583],{"class":1217},"3.2\n",[77,12585,12586,12589,12591],{"class":79,"line":2117},[77,12587,12588],{"class":1648},"      decel_lim_x",[77,12590,1666],{"class":104},[77,12592,6511],{"class":1217},[77,12594,12595,12598,12600],{"class":79,"line":2122},[77,12596,12597],{"class":1648},"      decel_lim_y",[77,12599,1666],{"class":104},[77,12601,6590],{"class":1217},[77,12603,12604,12607,12609],{"class":79,"line":2133},[77,12605,12606],{"class":1648},"      decel_lim_theta",[77,12608,1666],{"class":104},[77,12610,12611],{"class":1217},"-3.2\n",[77,12613,12614],{"class":79,"line":2143},[77,12615,140],{"emptyLinePlaceholder":139},[77,12617,12618],{"class":79,"line":2154},[77,12619,12620],{"class":146},"      # vx_samples: 20\n",[77,12622,12623,12626,12628],{"class":79,"line":2159},[77,12624,12625],{"class":1648},"      vx_samples",[77,12627,1666],{"class":104},[77,12629,11350],{"class":1217},[77,12631,12632,12635,12637],{"class":79,"line":2173},[77,12633,12634],{"class":1648},"      vy_samples",[77,12636,1666],{"class":104},[77,12638,12639],{"class":1217},"5\n",[77,12641,12642,12645,12647],{"class":79,"line":2186},[77,12643,12644],{"class":1648},"      vtheta_samples",[77,12646,1666],{"class":104},[77,12648,11350],{"class":1217},[77,12650,12651,12654,12656],{"class":79,"line":2191},[77,12652,12653],{"class":1648},"      sim_time",[77,12655,1666],{"class":104},[77,12657,12658],{"class":1217},"1.7\n",[77,12660,12661,12664,12666],{"class":79,"line":2205},[77,12662,12663],{"class":1648},"      linear_granularity",[77,12665,1666],{"class":104},[77,12667,1852],{"class":1217},[77,12669,12670,12673,12675],{"class":79,"line":2219},[77,12671,12672],{"class":1648},"      angular_granularity",[77,12674,1666],{"class":104},[77,12676,12677],{"class":1217},"0.025\n",[77,12679,12680],{"class":79,"line":2233},[77,12681,140],{"emptyLinePlaceholder":139},[77,12683,12684],{"class":79,"line":2244},[77,12685,12686],{"class":146},"      # transform_tolerance: 0.2\n",[77,12688,12689,12692,12694],{"class":79,"line":2254},[77,12690,12691],{"class":1648},"      transform_tolerance",[77,12693,1666],{"class":104},[77,12695,11738],{"class":1217},[77,12697,12698,12700,12702],{"class":79,"line":9882},[77,12699,12400],{"class":1648},[77,12701,1666],{"class":104},[77,12703,12704],{"class":1217},"0.15\n",[77,12706,12707,12710,12712],{"class":79,"line":9893},[77,12708,12709],{"class":1648},"      trans_stopped_velocity",[77,12711,1666],{"class":104},[77,12713,4902],{"class":1217},[77,12715,12716,12719,12721],{"class":79,"line":9903},[77,12717,12718],{"class":1648},"      short_circuit_trajectory_evaluation",[77,12720,1666],{"class":104},[77,12722,6371],{"class":1217},[77,12724,12725,12727,12729],{"class":79,"line":9908},[77,12726,12382],{"class":1648},[77,12728,1666],{"class":104},[77,12730,6371],{"class":1217},[77,12732,12733,12736,12738,12741,12743,12746,12748,12751,12753,12756,12758,12761,12763,12766,12768,12771],{"class":79,"line":9918},[77,12734,12735],{"class":1648},"      critics",[77,12737,4856],{"class":104},[77,12739,12740],{"class":87},"\"RotateToGoal\"",[77,12742,1455],{"class":104},[77,12744,12745],{"class":87},"\"Oscillation\"",[77,12747,1455],{"class":104},[77,12749,12750],{"class":87},"\"BaseObstacle\"",[77,12752,1455],{"class":104},[77,12754,12755],{"class":87},"\"GoalAlign\"",[77,12757,1455],{"class":104},[77,12759,12760],{"class":87},"\"PathAlign\"",[77,12762,1455],{"class":104},[77,12764,12765],{"class":87},"\"PathDist\"",[77,12767,1455],{"class":104},[77,12769,12770],{"class":87},"\"GoalDist\"",[77,12772,4872],{"class":104},[77,12774,12775,12778,12780],{"class":79,"line":9930},[77,12776,12777],{"class":1648},"      BaseObstacle.scale",[77,12779,1666],{"class":104},[77,12781,12782],{"class":1217},"0.02\n",[77,12784,12785,12788,12790],{"class":79,"line":9942},[77,12786,12787],{"class":1648},"      PathAlign.scale",[77,12789,1666],{"class":104},[77,12791,12792],{"class":1217},"32.0\n",[77,12794,12795,12798,12800],{"class":79,"line":9953},[77,12796,12797],{"class":1648},"      PathAlign.forward_point_distance",[77,12799,1666],{"class":104},[77,12801,1948],{"class":1217},[77,12803,12804,12807,12809],{"class":79,"line":9965},[77,12805,12806],{"class":1648},"      GoalAlign.scale",[77,12808,1666],{"class":104},[77,12810,12811],{"class":1217},"24.0\n",[77,12813,12814,12817,12819],{"class":79,"line":9974},[77,12815,12816],{"class":1648},"      GoalAlign.forward_point_distance",[77,12818,1666],{"class":104},[77,12820,1948],{"class":1217},[77,12822,12823,12826,12828],{"class":79,"line":9980},[77,12824,12825],{"class":1648},"      PathDist.scale",[77,12827,1666],{"class":104},[77,12829,12792],{"class":1217},[77,12831,12832,12835,12837],{"class":79,"line":10001},[77,12833,12834],{"class":1648},"      GoalDist.scale",[77,12836,1666],{"class":104},[77,12838,12811],{"class":1217},[77,12840,12841,12844,12846],{"class":79,"line":10021},[77,12842,12843],{"class":1648},"      RotateToGoal.scale",[77,12845,1666],{"class":104},[77,12847,12792],{"class":1217},[77,12849,12850,12853,12855],{"class":79,"line":10027},[77,12851,12852],{"class":1648},"      RotateToGoal.slowing_factor",[77,12854,1666],{"class":104},[77,12856,12857],{"class":1217},"5.0\n",[77,12859,12860,12863,12865],{"class":79,"line":10032},[77,12861,12862],{"class":1648},"      RotateToGoal.lookahead_time",[77,12864,1666],{"class":104},[77,12866,6511],{"class":1217},[77,12868,12869,12871],{"class":79,"line":10037},[77,12870,6353],{"class":1648},[77,12872,1651],{"class":104},[77,12874,12875,12878],{"class":79,"line":10047},[77,12876,12877],{"class":1648},"  local_costmap",[77,12879,1651],{"class":104},[77,12881,12882,12884],{"class":79,"line":10058},[77,12883,11726],{"class":1648},[77,12885,1651],{"class":104},[77,12887,12888,12890,12892],{"class":79,"line":10069},[77,12889,11733],{"class":1648},[77,12891,1666],{"class":104},[77,12893,12857],{"class":1217},[77,12895,12896,12898,12900],{"class":79,"line":10081},[77,12897,11743],{"class":1648},[77,12899,1666],{"class":104},[77,12901,1842],{"class":1217},[77,12903,12904,12906,12908],{"class":79,"line":10092},[77,12905,11752],{"class":1648},[77,12907,1666],{"class":104},[77,12909,1733],{"class":87},[77,12911,12912,12914,12916],{"class":79,"line":10109},[77,12913,11761],{"class":1648},[77,12915,1666],{"class":104},[77,12917,1753],{"class":87},[77,12919,12920,12922,12924],{"class":79,"line":10123},[77,12921,11770],{"class":1648},[77,12923,1666],{"class":104},[77,12925,6371],{"class":1217},[77,12927,12928,12931,12933],{"class":79,"line":10133},[77,12929,12930],{"class":1648},"      rolling_window",[77,12932,1666],{"class":104},[77,12934,6371],{"class":1217},[77,12936,12937,12940,12942],{"class":79,"line":10141},[77,12938,12939],{"class":1648},"      width",[77,12941,1666],{"class":104},[77,12943,12944],{"class":1217},"2\n",[77,12946,12947,12950,12952],{"class":79,"line":10149},[77,12948,12949],{"class":1648},"      height",[77,12951,1666],{"class":104},[77,12953,12944],{"class":1217},[77,12955,12956,12958,12960],{"class":79,"line":10157},[77,12957,11798],{"class":1648},[77,12959,1666],{"class":104},[77,12961,1852],{"class":1217},[77,12963,12964],{"class":79,"line":10165},[77,12965,140],{"emptyLinePlaceholder":139},[77,12967,12968],{"class":79,"line":10173},[77,12969,12970],{"class":146},"      # robot_radius: 0.20\n",[77,12972,12973,12975,12977],{"class":79,"line":10181},[77,12974,11788],{"class":1648},[77,12976,1666],{"class":104},[77,12978,11793],{"class":87},[77,12980,12981,12983,12985,12987,12989,12991,12993,12995],{"class":79,"line":10187},[77,12982,11816],{"class":1648},[77,12984,4856],{"class":104},[77,12986,11826],{"class":87},[77,12988,1455],{"class":104},[77,12990,11831],{"class":87},[77,12992,1455],{"class":104},[77,12994,11836],{"class":87},[77,12996,4872],{"class":104},[77,12998,12999,13001],{"class":79,"line":10193},[77,13000,12158],{"class":1648},[77,13002,1651],{"class":104},[77,13004,13005,13007,13009],{"class":79,"line":10198},[77,13006,11850],{"class":1648},[77,13008,1666],{"class":104},[77,13010,12169],{"class":87},[77,13012,13013,13015,13017],{"class":79,"line":10205},[77,13014,12184],{"class":1648},[77,13016,1666],{"class":104},[77,13018,1874],{"class":1217},[77,13020,13021,13023,13025],{"class":79,"line":10211},[77,13022,12174],{"class":1648},[77,13024,1666],{"class":104},[77,13026,12179],{"class":1217},[77,13028,13029,13031],{"class":79,"line":10217},[77,13030,11843],{"class":1648},[77,13032,1651],{"class":104},[77,13034,13035,13037,13039],{"class":79,"line":10223},[77,13036,11850],{"class":1648},[77,13038,1666],{"class":104},[77,13040,11855],{"class":87},[77,13042,13043,13045,13047],{"class":79,"line":10229},[77,13044,11860],{"class":1648},[77,13046,1666],{"class":104},[77,13048,6371],{"class":1217},[77,13050,13051,13053,13055],{"class":79,"line":10235},[77,13052,11869],{"class":1648},[77,13054,1666],{"class":104},[77,13056,6717],{"class":87},[77,13058,13059,13061],{"class":79,"line":10241},[77,13060,11878],{"class":1648},[77,13062,1651],{"class":104},[77,13064,13065,13067,13069],{"class":79,"line":10247},[77,13066,11885],{"class":1648},[77,13068,1666],{"class":104},[77,13070,1763],{"class":87},[77,13072,13073,13075,13077],{"class":79,"line":10253},[77,13074,11894],{"class":1648},[77,13076,1666],{"class":104},[77,13078,1842],{"class":1217},[77,13080,13082,13084,13086],{"class":79,"line":13081},106,[77,13083,11903],{"class":1648},[77,13085,1666],{"class":104},[77,13087,6371],{"class":1217},[77,13089,13091,13093,13095],{"class":79,"line":13090},107,[77,13092,11912],{"class":1648},[77,13094,1666],{"class":104},[77,13096,6371],{"class":1217},[77,13098,13100,13102,13104],{"class":79,"line":13099},108,[77,13101,11921],{"class":1648},[77,13103,1666],{"class":104},[77,13105,11926],{"class":87},[77,13107,13109,13111],{"class":79,"line":13108},109,[77,13110,11968],{"class":1648},[77,13112,1651],{"class":104},[77,13114,13116,13118,13120],{"class":79,"line":13115},110,[77,13117,11850],{"class":1648},[77,13119,1666],{"class":104},[77,13121,11979],{"class":87},[77,13123,13125,13127,13129],{"class":79,"line":13124},111,[77,13126,11860],{"class":1648},[77,13128,1666],{"class":104},[77,13130,6371],{"class":1217},[77,13132,13134,13136,13138],{"class":79,"line":13133},112,[77,13135,11992],{"class":1648},[77,13137,1666],{"class":104},[77,13139,6371],{"class":1217},[77,13141,13143,13145,13147],{"class":79,"line":13142},113,[77,13144,12001],{"class":1648},[77,13146,1666],{"class":104},[77,13148,6590],{"class":1217},[77,13150,13152,13154,13156],{"class":79,"line":13151},114,[77,13153,12010],{"class":1648},[77,13155,1666],{"class":104},[77,13157,1852],{"class":1217},[77,13159,13161,13163,13165],{"class":79,"line":13160},115,[77,13162,12019],{"class":1648},[77,13164,1666],{"class":104},[77,13166,12024],{"class":1217},[77,13168,13170,13172,13174],{"class":79,"line":13169},116,[77,13171,12029],{"class":1648},[77,13173,1666],{"class":104},[77,13175,1842],{"class":1217},[77,13177,13179,13181,13183],{"class":79,"line":13178},117,[77,13180,12038],{"class":1648},[77,13182,1666],{"class":104},[77,13184,4882],{"class":1217},[77,13186,13188,13190,13192],{"class":79,"line":13187},118,[77,13189,11869],{"class":1648},[77,13191,1666],{"class":104},[77,13193,6717],{"class":87},[77,13195,13197,13199],{"class":79,"line":13196},119,[77,13198,11878],{"class":1648},[77,13200,1651],{"class":104},[77,13202,13204,13206,13208],{"class":79,"line":13203},120,[77,13205,11885],{"class":1648},[77,13207,1666],{"class":104},[77,13209,1763],{"class":87},[77,13211,13213,13215,13217],{"class":79,"line":13212},121,[77,13214,11894],{"class":1648},[77,13216,1666],{"class":104},[77,13218,1842],{"class":1217},[77,13220,13222,13224,13226],{"class":79,"line":13221},122,[77,13223,11903],{"class":1648},[77,13225,1666],{"class":104},[77,13227,6371],{"class":1217},[77,13229,13231,13233,13235],{"class":79,"line":13230},123,[77,13232,11912],{"class":1648},[77,13234,1666],{"class":104},[77,13236,6371],{"class":1217},[77,13238,13240,13242,13244],{"class":79,"line":13239},124,[77,13241,11921],{"class":1648},[77,13243,1666],{"class":104},[77,13245,11926],{"class":87},[77,13247,13249,13251,13253],{"class":79,"line":13248},125,[77,13250,11931],{"class":1648},[77,13252,1666],{"class":104},[77,13254,2011],{"class":1217},[77,13256,13258,13260,13262],{"class":79,"line":13257},126,[77,13259,11940],{"class":1648},[77,13261,1666],{"class":104},[77,13263,6590],{"class":1217},[77,13265,13267,13269,13271],{"class":79,"line":13266},127,[77,13268,11949],{"class":1648},[77,13270,1666],{"class":104},[77,13272,11954],{"class":1217},[77,13274,13276,13278,13280],{"class":79,"line":13275},128,[77,13277,11959],{"class":1648},[77,13279,1666],{"class":104},[77,13281,6590],{"class":1217},[77,13283,13285,13287],{"class":79,"line":13284},129,[77,13286,12133],{"class":1648},[77,13288,1651],{"class":104},[77,13290,13292,13294,13296],{"class":79,"line":13291},130,[77,13293,12149],{"class":1648},[77,13295,1666],{"class":104},[77,13297,6371],{"class":1217},[77,13299,13301,13303,13305],{"class":79,"line":13300},131,[77,13302,12194],{"class":1648},[77,13304,1666],{"class":104},[77,13306,6371],{"class":1217},[18,13308,13309],{},"Footprint",[46,13311,13312,13315],{},[49,13313,13314],{},"将毫米转换为米：长0.96m，宽0.45m",[49,13316,13317,13318,13320],{},"以机器人中心（",[74,13319,5720],{},"坐标系原点）为基准，计算矩形顶点坐标：",[18,13322,13323,13326],{},[4274,13324,13325],{},"说明","：顶点按顺时针或逆时针顺序排列，覆盖机器人长宽边界。（右手坐标系）",[18,13328,13329],{},"例如长960宽450长400",[68,13331,13335],{"className":13332,"code":13333,"language":13334,"meta":32,"style":32},"language-cpp shiki shiki-themes github-light github-dark","footprint: [[0.48, 0.225], [0.48, -0.225], [-0.48, -0.225], [-0.48, 0.225]]\n","cpp",[74,13336,13337],{"__ignoreMap":32},[77,13338,13339,13342],{"class":79,"line":80},[77,13340,13341],{"class":104},"footprint: ",[77,13343,13344],{"class":1217},"[[0.48, 0.225], [0.48, -0.225], [-0.48, -0.225], [-0.48, 0.225]]\n",[18,13346,13347],{},[21,13348,13349],{},"（4）behavior_server相关配置文件",[18,13351,11264,13352,5194],{},[74,13353,13354],{},"behavior.yaml",[68,13356,13358],{"className":1639,"code":13357,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    costmap_topic: local_costmap/costmap_raw\n    footprint_topic: local_costmap/published_footprint\n    cycle_frequency: 5.0\n    behavior_plugins: [\"spin\", \"backup\", \"drive_on_heading\", \"assisted_teleop\", \"wait\"]\n    spin:\n      plugin: \"nav2_behaviors/Spin\"\n    backup:\n      plugin: \"nav2_behaviors/BackUp\"\n    drive_on_heading:\n      plugin: \"nav2_behaviors/DriveOnHeading\"\n    wait:\n      plugin: \"nav2_behaviors/Wait\"\n    assisted_teleop:\n      plugin: \"nav2_behaviors/AssistedTeleop\"\n    global_frame: odom\n    robot_base_frame: base_link\n    transform_tolerance: 0.1\n    use_sim_time: True\n    simulate_ahead_time: 2.0\n    max_rotational_vel: 1.0\n    min_rotational_vel: 0.4\n    rotational_acc_lim: 3.2\n",[74,13359,13360,13366,13372,13382,13392,13401,13433,13440,13449,13456,13465,13472,13481,13488,13497,13504,13513,13521,13529,13537,13545,13554,13563,13573],{"__ignoreMap":32},[77,13361,13362,13364],{"class":79,"line":80},[77,13363,6353],{"class":1648},[77,13365,1651],{"class":104},[77,13367,13368,13370],{"class":79,"line":114},[77,13369,1656],{"class":1648},[77,13371,1651],{"class":104},[77,13373,13374,13377,13379],{"class":79,"line":136},[77,13375,13376],{"class":1648},"    costmap_topic",[77,13378,1666],{"class":104},[77,13380,13381],{"class":87},"local_costmap/costmap_raw\n",[77,13383,13384,13387,13389],{"class":79,"line":143},[77,13385,13386],{"class":1648},"    footprint_topic",[77,13388,1666],{"class":104},[77,13390,13391],{"class":87},"local_costmap/published_footprint\n",[77,13393,13394,13397,13399],{"class":79,"line":150},[77,13395,13396],{"class":1648},"    cycle_frequency",[77,13398,1666],{"class":104},[77,13400,12857],{"class":1217},[77,13402,13403,13406,13408,13411,13413,13416,13418,13421,13423,13426,13428,13431],{"class":79,"line":162},[77,13404,13405],{"class":1648},"    behavior_plugins",[77,13407,4856],{"class":104},[77,13409,13410],{"class":87},"\"spin\"",[77,13412,1455],{"class":104},[77,13414,13415],{"class":87},"\"backup\"",[77,13417,1455],{"class":104},[77,13419,13420],{"class":87},"\"drive_on_heading\"",[77,13422,1455],{"class":104},[77,13424,13425],{"class":87},"\"assisted_teleop\"",[77,13427,1455],{"class":104},[77,13429,13430],{"class":87},"\"wait\"",[77,13432,4872],{"class":104},[77,13434,13435,13438],{"class":79,"line":174},[77,13436,13437],{"class":1648},"    spin",[77,13439,1651],{"class":104},[77,13441,13442,13444,13446],{"class":79,"line":179},[77,13443,11672],{"class":1648},[77,13445,1666],{"class":104},[77,13447,13448],{"class":87},"\"nav2_behaviors/Spin\"\n",[77,13450,13451,13454],{"class":79,"line":185},[77,13452,13453],{"class":1648},"    backup",[77,13455,1651],{"class":104},[77,13457,13458,13460,13462],{"class":79,"line":197},[77,13459,11672],{"class":1648},[77,13461,1666],{"class":104},[77,13463,13464],{"class":87},"\"nav2_behaviors/BackUp\"\n",[77,13466,13467,13470],{"class":79,"line":1348},[77,13468,13469],{"class":1648},"    drive_on_heading",[77,13471,1651],{"class":104},[77,13473,13474,13476,13478],{"class":79,"line":1363},[77,13475,11672],{"class":1648},[77,13477,1666],{"class":104},[77,13479,13480],{"class":87},"\"nav2_behaviors/DriveOnHeading\"\n",[77,13482,13483,13486],{"class":79,"line":1368},[77,13484,13485],{"class":1648},"    wait",[77,13487,1651],{"class":104},[77,13489,13490,13492,13494],{"class":79,"line":1379},[77,13491,11672],{"class":1648},[77,13493,1666],{"class":104},[77,13495,13496],{"class":87},"\"nav2_behaviors/Wait\"\n",[77,13498,13499,13502],{"class":79,"line":1388},[77,13500,13501],{"class":1648},"    assisted_teleop",[77,13503,1651],{"class":104},[77,13505,13506,13508,13510],{"class":79,"line":1402},[77,13507,11672],{"class":1648},[77,13509,1666],{"class":104},[77,13511,13512],{"class":87},"\"nav2_behaviors/AssistedTeleop\"\n",[77,13514,13515,13517,13519],{"class":79,"line":1415},[77,13516,11297],{"class":1648},[77,13518,1666],{"class":104},[77,13520,1733],{"class":87},[77,13522,13523,13525,13527],{"class":79,"line":1425},[77,13524,11306],{"class":1648},[77,13526,1666],{"class":104},[77,13528,1753],{"class":87},[77,13530,13531,13533,13535],{"class":79,"line":1433},[77,13532,6650],{"class":1648},[77,13534,1666],{"class":104},[77,13536,1948],{"class":1217},[77,13538,13539,13541,13543],{"class":79,"line":1449},[77,13540,6366],{"class":1648},[77,13542,1666],{"class":104},[77,13544,6371],{"class":1217},[77,13546,13547,13550,13552],{"class":79,"line":1463},[77,13548,13549],{"class":1648},"    simulate_ahead_time",[77,13551,1666],{"class":104},[77,13553,1842],{"class":1217},[77,13555,13556,13559,13561],{"class":79,"line":1475},[77,13557,13558],{"class":1648},"    max_rotational_vel",[77,13560,1666],{"class":104},[77,13562,11738],{"class":1217},[77,13564,13565,13568,13570],{"class":79,"line":1480},[77,13566,13567],{"class":1648},"    min_rotational_vel",[77,13569,1666],{"class":104},[77,13571,13572],{"class":1217},"0.4\n",[77,13574,13575,13578,13580],{"class":79,"line":1491},[77,13576,13577],{"class":1648},"    rotational_acc_lim",[77,13579,1666],{"class":104},[77,13581,12583],{"class":1217},[18,13583,13584],{},[21,13585,13586],{},"（5）waypoint_follower相关配置文件",[18,13588,11264,13589,5194],{},[74,13590,13591],{},"waypoint.yaml",[68,13593,13595],{"className":1639,"code":13594,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    use_sim_time: True\n    loop_rate: 20\n    stop_on_failure: false\n    waypoint_task_executor_plugin: \"wait_at_waypoint\"\n    wait_at_waypoint:\n      plugin: \"nav2_waypoint_follower::WaitAtWaypoint\"\n      enabled: True\n      waypoint_pause_duration: 5000\n",[74,13596,13597,13603,13609,13617,13626,13635,13645,13652,13661,13670],{"__ignoreMap":32},[77,13598,13599,13601],{"class":79,"line":80},[77,13600,6353],{"class":1648},[77,13602,1651],{"class":104},[77,13604,13605,13607],{"class":79,"line":114},[77,13606,1656],{"class":1648},[77,13608,1651],{"class":104},[77,13610,13611,13613,13615],{"class":79,"line":136},[77,13612,6366],{"class":1648},[77,13614,1666],{"class":104},[77,13616,6371],{"class":1217},[77,13618,13619,13622,13624],{"class":79,"line":143},[77,13620,13621],{"class":1648},"    loop_rate",[77,13623,1666],{"class":104},[77,13625,11350],{"class":1217},[77,13627,13628,13631,13633],{"class":79,"line":150},[77,13629,13630],{"class":1648},"    stop_on_failure",[77,13632,1666],{"class":104},[77,13634,1809],{"class":1217},[77,13636,13637,13640,13642],{"class":79,"line":162},[77,13638,13639],{"class":1648},"    waypoint_task_executor_plugin",[77,13641,1666],{"class":104},[77,13643,13644],{"class":87},"\"wait_at_waypoint\"\n",[77,13646,13647,13650],{"class":79,"line":174},[77,13648,13649],{"class":1648},"    wait_at_waypoint",[77,13651,1651],{"class":104},[77,13653,13654,13656,13658],{"class":79,"line":179},[77,13655,11672],{"class":1648},[77,13657,1666],{"class":104},[77,13659,13660],{"class":87},"\"nav2_waypoint_follower::WaitAtWaypoint\"\n",[77,13662,13663,13666,13668],{"class":79,"line":185},[77,13664,13665],{"class":1648},"      enabled",[77,13667,1666],{"class":104},[77,13669,6371],{"class":1217},[77,13671,13672,13675,13677],{"class":79,"line":197},[77,13673,13674],{"class":1648},"      waypoint_pause_duration",[77,13676,1666],{"class":104},[77,13678,13679],{"class":1217},"5000\n",[18,13681,13682],{},[21,13683,13684],{},"（6）velocity_smoother相关配置文件",[18,13686,11264,13687,5194],{},[74,13688,13689],{},"velocity.yaml",[68,13691,13693],{"className":1639,"code":13692,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    use_sim_time: True\n    smoothing_frequency: 20.0\n    scale_velocities: False\n    feedback: \"OPEN_LOOP\"\n    max_velocity: [0.1, 0.0, 1.0]\n    min_velocity: [-0.1, 0.0, -1.0]\n    max_accel: [2.5, 0.0, 3.2]\n    max_decel: [-2.5, 0.0, -3.2]\n    odom_topic: \"odom\"\n    odom_duration: 0.1\n    deadband_velocity: [0.0, 0.0, 0.0]\n    velocity_timeout: 1.0\n",[74,13694,13695,13701,13707,13715,13724,13733,13743,13763,13784,13805,13826,13834,13843,13862],{"__ignoreMap":32},[77,13696,13697,13699],{"class":79,"line":80},[77,13698,6353],{"class":1648},[77,13700,1651],{"class":104},[77,13702,13703,13705],{"class":79,"line":114},[77,13704,1656],{"class":1648},[77,13706,1651],{"class":104},[77,13708,13709,13711,13713],{"class":79,"line":136},[77,13710,6366],{"class":1648},[77,13712,1666],{"class":104},[77,13714,6371],{"class":1217},[77,13716,13717,13720,13722],{"class":79,"line":143},[77,13718,13719],{"class":1648},"    smoothing_frequency",[77,13721,1666],{"class":104},[77,13723,11641],{"class":1217},[77,13725,13726,13729,13731],{"class":79,"line":150},[77,13727,13728],{"class":1648},"    scale_velocities",[77,13730,1666],{"class":104},[77,13732,12199],{"class":1217},[77,13734,13735,13738,13740],{"class":79,"line":162},[77,13736,13737],{"class":1648},"    feedback",[77,13739,1666],{"class":104},[77,13741,13742],{"class":87},"\"OPEN_LOOP\"\n",[77,13744,13745,13748,13750,13752,13754,13757,13759,13761],{"class":79,"line":174},[77,13746,13747],{"class":1648},"    max_velocity",[77,13749,4856],{"class":104},[77,13751,1987],{"class":1217},[77,13753,1455],{"class":104},[77,13755,13756],{"class":1217},"0.0",[77,13758,1455],{"class":104},[77,13760,2181],{"class":1217},[77,13762,4872],{"class":104},[77,13764,13765,13768,13770,13773,13775,13777,13779,13782],{"class":79,"line":179},[77,13766,13767],{"class":1648},"    min_velocity",[77,13769,4856],{"class":104},[77,13771,13772],{"class":1217},"-0.1",[77,13774,1455],{"class":104},[77,13776,13756],{"class":1217},[77,13778,1455],{"class":104},[77,13780,13781],{"class":1217},"-1.0",[77,13783,4872],{"class":104},[77,13785,13786,13789,13791,13794,13796,13798,13800,13803],{"class":79,"line":185},[77,13787,13788],{"class":1648},"    max_accel",[77,13790,4856],{"class":104},[77,13792,13793],{"class":1217},"2.5",[77,13795,1455],{"class":104},[77,13797,13756],{"class":1217},[77,13799,1455],{"class":104},[77,13801,13802],{"class":1217},"3.2",[77,13804,4872],{"class":104},[77,13806,13807,13810,13812,13815,13817,13819,13821,13824],{"class":79,"line":197},[77,13808,13809],{"class":1648},"    max_decel",[77,13811,4856],{"class":104},[77,13813,13814],{"class":1217},"-2.5",[77,13816,1455],{"class":104},[77,13818,13756],{"class":1217},[77,13820,1455],{"class":104},[77,13822,13823],{"class":1217},"-3.2",[77,13825,4872],{"class":104},[77,13827,13828,13830,13832],{"class":79,"line":1348},[77,13829,11315],{"class":1648},[77,13831,1666],{"class":104},[77,13833,6561],{"class":87},[77,13835,13836,13839,13841],{"class":79,"line":1363},[77,13837,13838],{"class":1648},"    odom_duration",[77,13840,1666],{"class":104},[77,13842,1948],{"class":1217},[77,13844,13845,13848,13850,13852,13854,13856,13858,13860],{"class":79,"line":1368},[77,13846,13847],{"class":1648},"    deadband_velocity",[77,13849,4856],{"class":104},[77,13851,13756],{"class":1217},[77,13853,1455],{"class":104},[77,13855,13756],{"class":1217},[77,13857,1455],{"class":104},[77,13859,13756],{"class":1217},[77,13861,4872],{"class":104},[77,13863,13864,13867,13869],{"class":79,"line":1379},[77,13865,13866],{"class":1648},"    velocity_timeout",[77,13868,1666],{"class":104},[77,13870,11738],{"class":1217},[18,13872,13873],{},[21,13874,13875],{},"（7）smoother_server相关配置文件",[18,13877,11264,13878,5194],{},[74,13879,13880],{},"smootherr.yaml",[68,13882,13884],{"className":1639,"code":13883,"language":1641,"meta":32,"style":32},"/**:\n  ros__parameters:\n    costmap_topic: global_costmap/costmap_raw\n    footprint_topic: global_costmap/published_footprint\n    robot_base_frame: base_link\n    transform_timeout: 0.1\n    smoother_plugins: [\"simple_smoother\"]\n    simple_smoother:\n      plugin: \"nav2_smoother::SimpleSmoother\"\n      tolerance: 1.0e-10\n      do_refinement: True\n",[74,13885,13886,13892,13898,13907,13916,13924,13932,13944,13951,13960,13969],{"__ignoreMap":32},[77,13887,13888,13890],{"class":79,"line":80},[77,13889,6353],{"class":1648},[77,13891,1651],{"class":104},[77,13893,13894,13896],{"class":79,"line":114},[77,13895,1656],{"class":1648},[77,13897,1651],{"class":104},[77,13899,13900,13902,13904],{"class":79,"line":136},[77,13901,13376],{"class":1648},[77,13903,1666],{"class":104},[77,13905,13906],{"class":87},"global_costmap/costmap_raw\n",[77,13908,13909,13911,13913],{"class":79,"line":143},[77,13910,13386],{"class":1648},[77,13912,1666],{"class":104},[77,13914,13915],{"class":87},"global_costmap/published_footprint\n",[77,13917,13918,13920,13922],{"class":79,"line":150},[77,13919,11306],{"class":1648},[77,13921,1666],{"class":104},[77,13923,1753],{"class":87},[77,13925,13926,13928,13930],{"class":79,"line":162},[77,13927,1879],{"class":1648},[77,13929,1666],{"class":104},[77,13931,1948],{"class":1217},[77,13933,13934,13937,13939,13942],{"class":79,"line":174},[77,13935,13936],{"class":1648},"    smoother_plugins",[77,13938,4856],{"class":104},[77,13940,13941],{"class":87},"\"simple_smoother\"",[77,13943,4872],{"class":104},[77,13945,13946,13949],{"class":79,"line":179},[77,13947,13948],{"class":1648},"    simple_smoother",[77,13950,1651],{"class":104},[77,13952,13953,13955,13957],{"class":79,"line":185},[77,13954,11672],{"class":1648},[77,13956,1666],{"class":104},[77,13958,13959],{"class":87},"\"nav2_smoother::SimpleSmoother\"\n",[77,13961,13962,13964,13966],{"class":79,"line":197},[77,13963,11682],{"class":1648},[77,13965,1666],{"class":104},[77,13967,13968],{"class":1217},"1.0e-10\n",[77,13970,13971,13974,13976],{"class":79,"line":1348},[77,13972,13973],{"class":1648},"      do_refinement",[77,13975,1666],{"class":104},[77,13977,6371],{"class":1217},[18,13979,13980],{},[21,13981,13982],{},"3.launch集成",[18,13984,13985,13986,13989],{},"导航实现时，需要依赖于地图与定位功能，我们可以在一个launch文件中集成之前的定位launch以及当前编写的导航核心模块的launch，以简化导航功能的启动，在launch目录下新建一个名为",[74,13987,13988],{},"bringup.launch.py","的launch文件，并输入如下内容：",[68,13991,13993],{"className":1236,"code":13992,"language":1238,"meta":32,"style":32},"import os\n\nfrom ament_index_python.packages import get_package_share_directory\n\nfrom launch import LaunchDescription\nfrom launch.actions import IncludeLaunchDescription\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\n\ndef generate_launch_description():\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(os.path.join(amcl_pkg,'launch',\n                                                    'mycar_loca.launch.py'))\n        )\n\n    nav2_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(os.path.join(nav2_pkg,'launch', \n                                                    'nav2.launch.py'))\n        )\n\n    ld = LaunchDescription()\n    ld.add_action(amcl_launch)\n    ld.add_action(nav2_launch)\n    return ld\n",[74,13994,13995,14001,14005,14015,14019,14029,14039,14049,14053,14061,14065,14079,14092,14096,14105,14115,14123,14127,14131,14140,14150,14157,14161,14165,14173,14178,14183],{"__ignoreMap":32},[77,13996,13997,13999],{"class":79,"line":80},[77,13998,1245],{"class":97},[77,14000,1248],{"class":104},[77,14002,14003],{"class":79,"line":114},[77,14004,140],{"emptyLinePlaceholder":139},[77,14006,14007,14009,14011,14013],{"class":79,"line":136},[77,14008,1257],{"class":97},[77,14010,1308],{"class":104},[77,14012,1245],{"class":97},[77,14014,1313],{"class":104},[77,14016,14017],{"class":79,"line":143},[77,14018,140],{"emptyLinePlaceholder":139},[77,14020,14021,14023,14025,14027],{"class":79,"line":150},[77,14022,1257],{"class":97},[77,14024,1260],{"class":104},[77,14026,1245],{"class":97},[77,14028,1265],{"class":104},[77,14030,14031,14033,14035,14037],{"class":79,"line":162},[77,14032,1257],{"class":97},[77,14034,1272],{"class":104},[77,14036,1245],{"class":97},[77,14038,6051],{"class":104},[77,14040,14041,14043,14045,14047],{"class":79,"line":174},[77,14042,1257],{"class":97},[77,14044,6058],{"class":104},[77,14046,1245],{"class":97},[77,14048,6063],{"class":104},[77,14050,14051],{"class":79,"line":179},[77,14052,140],{"emptyLinePlaceholder":139},[77,14054,14055,14057,14059],{"class":79,"line":185},[77,14056,1322],{"class":97},[77,14058,1325],{"class":83},[77,14060,1328],{"class":104},[77,14062,14063],{"class":79,"line":197},[77,14064,140],{"emptyLinePlaceholder":139},[77,14066,14067,14070,14072,14074,14077],{"class":79,"line":1348},[77,14068,14069],{"class":104},"    amcl_pkg ",[77,14071,1336],{"class":97},[77,14073,9285],{"class":104},[77,14075,14076],{"class":87},"\"mycar_localization\"",[77,14078,1345],{"class":104},[77,14080,14081,14084,14086,14088,14090],{"class":79,"line":1363},[77,14082,14083],{"class":104},"    nav2_pkg ",[77,14085,1336],{"class":97},[77,14087,9285],{"class":104},[77,14089,9288],{"class":87},[77,14091,1345],{"class":104},[77,14093,14094],{"class":79,"line":1368},[77,14095,140],{"emptyLinePlaceholder":139},[77,14097,14098,14101,14103],{"class":79,"line":1379},[77,14099,14100],{"class":104},"    amcl_launch ",[77,14102,1336],{"class":97},[77,14104,6270],{"class":104},[77,14106,14107,14110,14113],{"class":79,"line":1388},[77,14108,14109],{"class":104},"        PythonLaunchDescriptionSource(os.path.join(amcl_pkg,",[77,14111,14112],{"class":87},"'launch'",[77,14114,1385],{"class":104},[77,14116,14117,14120],{"class":79,"line":1402},[77,14118,14119],{"class":87},"                                                    'mycar_loca.launch.py'",[77,14121,14122],{"class":104},"))\n",[77,14124,14125],{"class":79,"line":1415},[77,14126,6306],{"class":104},[77,14128,14129],{"class":79,"line":1425},[77,14130,140],{"emptyLinePlaceholder":139},[77,14132,14133,14136,14138],{"class":79,"line":1433},[77,14134,14135],{"class":104},"    nav2_launch ",[77,14137,1336],{"class":97},[77,14139,6270],{"class":104},[77,14141,14142,14145,14147],{"class":79,"line":1449},[77,14143,14144],{"class":104},"        PythonLaunchDescriptionSource(os.path.join(nav2_pkg,",[77,14146,14112],{"class":87},[77,14148,14149],{"class":104},", \n",[77,14151,14152,14155],{"class":79,"line":1463},[77,14153,14154],{"class":87},"                                                    'nav2.launch.py'",[77,14156,14122],{"class":104},[77,14158,14159],{"class":79,"line":1475},[77,14160,6306],{"class":104},[77,14162,14163],{"class":79,"line":1480},[77,14164,140],{"emptyLinePlaceholder":139},[77,14166,14167,14169,14171],{"class":79,"line":1491},[77,14168,1584],{"class":104},[77,14170,1336],{"class":97},[77,14172,1589],{"class":104},[77,14174,14175],{"class":79,"line":1502},[77,14176,14177],{"class":104},"    ld.add_action(amcl_launch)\n",[77,14179,14180],{"class":79,"line":1508},[77,14181,14182],{"class":104},"    ld.add_action(nav2_launch)\n",[77,14184,14185,14187],{"class":79,"line":1519},[77,14186,1623],{"class":97},[77,14188,1626],{"class":104},[18,14190,14191],{},[21,14192,14193],{},"4.编辑配置文件",[18,14195,2272,14196,2276],{},[74,14197,2275],{},[68,14199,14201],{"className":2279,"code":14200,"language":2281,"meta":32,"style":32},"install(DIRECTORY launch params bts\n  DESTINATION share/${PROJECT_NAME}\n)\n",[74,14202,14203,14210,14216],{"__ignoreMap":32},[77,14204,14205,14207],{"class":79,"line":80},[77,14206,2288],{"class":97},[77,14208,14209],{"class":104},"(DIRECTORY launch params bts\n",[77,14211,14212,14214],{"class":79,"line":114},[77,14213,2296],{"class":104},[77,14215,2299],{"class":97},[77,14217,14218],{"class":79,"line":136},[77,14219,1345],{"class":104},[18,14221,14222],{},[21,14223,14224],{},"5.编译",[18,14226,2311],{},[68,14228,14230],{"className":70,"code":14229,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_navigation2\n",[74,14231,14232],{"__ignoreMap":32},[77,14233,14234,14236,14238,14240],{"class":79,"line":80},[77,14235,2321],{"class":83},[77,14237,2324],{"class":87},[77,14239,2327],{"class":1217},[77,14241,14242],{"class":87}," mycar_navigation2\n",[18,14244,14245],{},[21,14246,14247],{},"6.执行",[18,14249,4001],{},[68,14251,14252],{"className":70,"code":6794,"language":72,"meta":32,"style":32},[74,14253,14254,14260],{"__ignoreMap":32},[77,14255,14256,14258],{"class":79,"line":80},[77,14257,2350],{"class":1217},[77,14259,2353],{"class":87},[77,14261,14262,14264,14266,14268],{"class":79,"line":114},[77,14263,1205],{"class":83},[77,14265,2360],{"class":87},[77,14267,6811],{"class":87},[77,14269,6814],{"class":87},[18,14271,14272],{},"（2）然后在终端下进入当前工作空间，输入如下指令启动导航功能：",[68,14274,14276],{"className":70,"code":14275,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_navigation2 bringup.launch.py\n",[74,14277,14278,14284],{"__ignoreMap":32},[77,14279,14280,14282],{"class":79,"line":80},[77,14281,2350],{"class":1217},[77,14283,2353],{"class":87},[77,14285,14286,14288,14290,14292],{"class":79,"line":114},[77,14287,1205],{"class":83},[77,14289,2360],{"class":87},[77,14291,9193],{"class":87},[77,14293,14294],{"class":87}," bringup.launch.py\n",[18,14296,14297,14298,14301,14302,14305,14306,14309],{},"（3）启动rviz2，加载",[74,14299,14300],{},"/opt/ros/humble/share/nav2_bringup/rviz","下的",[74,14303,14304],{},"nav2_default_view.rviz","文件，为机器人设置初始位姿后，再通过菜单栏的",[74,14307,14308],{},"Nav2 Goal","设置目标点，机器人就可以自动导航至目标点了。",[68,14311,14313],{"className":70,"code":14312,"language":72,"meta":32,"style":32},"rviz2 -d /opt/ros/humble/share/nav2_bringup/rviz/nav2_default_view.rviz\n",[74,14314,14315],{"__ignoreMap":32},[77,14316,14317,14320,14323],{"class":79,"line":80},[77,14318,14319],{"class":83},"rviz2",[77,14321,14322],{"class":1217}," -d",[77,14324,14325],{"class":87}," /opt/ros/humble/share/nav2_bringup/rviz/nav2_default_view.rviz\n",[46,14327,14328,14336,14346],{},[49,14329,14330,14332,14333,14335],{},[74,14331,14319],{},"：启动 ",[74,14334,14319],{}," 工具。",[49,14337,14338,14341,14342,14345],{},[74,14339,14340],{},"-d","：指定要加载的 ",[74,14343,14344],{},".rviz"," 配置文件。",[49,14347,14348,14351,14352,14354],{},[74,14349,14350],{},"/opt/ros/humble/share/nav2_bringup/rviz/nav2_default_view.rviz","：",[74,14353,14344],{}," 配置文件的路径。",[18,14356,14357,14358,14360,14361,14345],{},"运行该命令后，",[74,14359,14319],{}," 将启动并加载 ",[74,14362,14304],{},[18,14364,14365,14368],{},[30,14366],{"alt":32,"src":14367},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1766.webp",[30,14369],{"alt":32,"src":14370},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1767.webp",[18,14372,14373],{},"如上图，左图是选择初始位置，右图是选择目标位置。",[18,14375,14376],{},"上图中，每个障碍物和墙附近的光圈是危险程度，颜色越红表示机器人经过此地越危险。",[18,14378,14379],{},[30,14380],{"alt":32,"src":14381},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1768.webp",[18,14383,14384],{},[30,14385],{"alt":32,"src":14386},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1769.webp",[14,14388,14390],{"id":14389},"自主探索slam","自主探索SLAM",[18,14392,14393,14394,14397,14398,14401],{},"导航需要依赖于地图与定位，例如在上一节 ",[21,14395,14396],{},"导航功能集成"," 中，导航实现时就是以launch文件的方式集成了 ",[21,14399,14400],{},"定位AMCL"," 一节中的定位功能，而机器人SLAM时，也是发布地图数据与定位信息的，所以导航时也可以不借助于amcl而是直接与SLAM结合，达到自主探索的SLAM效果。",[18,14403,14404],{},[21,14405,14406],{},"1.编写launch文件",[18,14408,14409,14410,13989],{},"在功能包mycar_navigation2的launch目录下新建名为",[74,14411,14412],{},"auto_slam.launch.py",[68,14414,14416],{"className":1236,"code":14415,"language":1238,"meta":32,"style":32},"import os\n\nfrom ament_index_python.packages import get_package_share_directory\n\nfrom launch import LaunchDescription\nfrom launch.actions import IncludeLaunchDescription\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\n\ndef generate_launch_description():\n\n    slam_pkg = get_package_share_directory(\"mycar_slam_slam_toolbox\")\n    nav2_pkg = get_package_share_directory(\"mycar_navigation2\")\n\n    slam_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(os.path.join(slam_pkg,'launch',\n                                                    'online_sync_launch.py'))\n        )\n\n    # slam_launch = IncludeLaunchDescription(\n\n    #     PythonLaunchDescriptionSource(os.path.join(slam_pkg,'launch',\n\n    #                                                 'online_async_launch.py'))\n\n    #     )\n\n    nav2_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(os.path.join(nav2_pkg,'launch', \n                                                    'nav2.launch.py'))\n        )\n\n    ld = LaunchDescription()\n    ld.add_action(slam_launch)\n    ld.add_action(nav2_launch)\n    return ld\n",[74,14417,14418,14424,14428,14438,14442,14452,14462,14472,14476,14484,14488,14501,14513,14517,14526,14535,14542,14546,14550,14555,14559,14564,14568,14573,14577,14582,14586,14594,14602,14608,14612,14616,14624,14629,14633],{"__ignoreMap":32},[77,14419,14420,14422],{"class":79,"line":80},[77,14421,1245],{"class":97},[77,14423,1248],{"class":104},[77,14425,14426],{"class":79,"line":114},[77,14427,140],{"emptyLinePlaceholder":139},[77,14429,14430,14432,14434,14436],{"class":79,"line":136},[77,14431,1257],{"class":97},[77,14433,1308],{"class":104},[77,14435,1245],{"class":97},[77,14437,1313],{"class":104},[77,14439,14440],{"class":79,"line":143},[77,14441,140],{"emptyLinePlaceholder":139},[77,14443,14444,14446,14448,14450],{"class":79,"line":150},[77,14445,1257],{"class":97},[77,14447,1260],{"class":104},[77,14449,1245],{"class":97},[77,14451,1265],{"class":104},[77,14453,14454,14456,14458,14460],{"class":79,"line":162},[77,14455,1257],{"class":97},[77,14457,1272],{"class":104},[77,14459,1245],{"class":97},[77,14461,6051],{"class":104},[77,14463,14464,14466,14468,14470],{"class":79,"line":174},[77,14465,1257],{"class":97},[77,14467,6058],{"class":104},[77,14469,1245],{"class":97},[77,14471,6063],{"class":104},[77,14473,14474],{"class":79,"line":179},[77,14475,140],{"emptyLinePlaceholder":139},[77,14477,14478,14480,14482],{"class":79,"line":185},[77,14479,1322],{"class":97},[77,14481,1325],{"class":83},[77,14483,1328],{"class":104},[77,14485,14486],{"class":79,"line":197},[77,14487,140],{"emptyLinePlaceholder":139},[77,14489,14490,14493,14495,14497,14499],{"class":79,"line":1348},[77,14491,14492],{"class":104},"    slam_pkg ",[77,14494,1336],{"class":97},[77,14496,9285],{"class":104},[77,14498,1443],{"class":87},[77,14500,1345],{"class":104},[77,14502,14503,14505,14507,14509,14511],{"class":79,"line":1363},[77,14504,14083],{"class":104},[77,14506,1336],{"class":97},[77,14508,9285],{"class":104},[77,14510,9288],{"class":87},[77,14512,1345],{"class":104},[77,14514,14515],{"class":79,"line":1368},[77,14516,140],{"emptyLinePlaceholder":139},[77,14518,14519,14522,14524],{"class":79,"line":1379},[77,14520,14521],{"class":104},"    slam_launch ",[77,14523,1336],{"class":97},[77,14525,6270],{"class":104},[77,14527,14528,14531,14533],{"class":79,"line":1388},[77,14529,14530],{"class":104},"        PythonLaunchDescriptionSource(os.path.join(slam_pkg,",[77,14532,14112],{"class":87},[77,14534,1385],{"class":104},[77,14536,14537,14540],{"class":79,"line":1402},[77,14538,14539],{"class":87},"                                                    'online_sync_launch.py'",[77,14541,14122],{"class":104},[77,14543,14544],{"class":79,"line":1415},[77,14545,6306],{"class":104},[77,14547,14548],{"class":79,"line":1425},[77,14549,140],{"emptyLinePlaceholder":139},[77,14551,14552],{"class":79,"line":1433},[77,14553,14554],{"class":146},"    # slam_launch = IncludeLaunchDescription(\n",[77,14556,14557],{"class":79,"line":1449},[77,14558,140],{"emptyLinePlaceholder":139},[77,14560,14561],{"class":79,"line":1463},[77,14562,14563],{"class":146},"    #     PythonLaunchDescriptionSource(os.path.join(slam_pkg,'launch',\n",[77,14565,14566],{"class":79,"line":1475},[77,14567,140],{"emptyLinePlaceholder":139},[77,14569,14570],{"class":79,"line":1480},[77,14571,14572],{"class":146},"    #                                                 'online_async_launch.py'))\n",[77,14574,14575],{"class":79,"line":1491},[77,14576,140],{"emptyLinePlaceholder":139},[77,14578,14579],{"class":79,"line":1502},[77,14580,14581],{"class":146},"    #     )\n",[77,14583,14584],{"class":79,"line":1508},[77,14585,140],{"emptyLinePlaceholder":139},[77,14587,14588,14590,14592],{"class":79,"line":1519},[77,14589,14135],{"class":104},[77,14591,1336],{"class":97},[77,14593,6270],{"class":104},[77,14595,14596,14598,14600],{"class":79,"line":1525},[77,14597,14144],{"class":104},[77,14599,14112],{"class":87},[77,14601,14149],{"class":104},[77,14603,14604,14606],{"class":79,"line":1538},[77,14605,14154],{"class":87},[77,14607,14122],{"class":104},[77,14609,14610],{"class":79,"line":1551},[77,14611,6306],{"class":104},[77,14613,14614],{"class":79,"line":1563},[77,14615,140],{"emptyLinePlaceholder":139},[77,14617,14618,14620,14622],{"class":79,"line":1576},[77,14619,1584],{"class":104},[77,14621,1336],{"class":97},[77,14623,1589],{"class":104},[77,14625,14626],{"class":79,"line":1581},[77,14627,14628],{"class":104},"    ld.add_action(slam_launch)\n",[77,14630,14631],{"class":79,"line":1592},[77,14632,14182],{"class":104},[77,14634,14635,14637],{"class":79,"line":1597},[77,14636,1623],{"class":97},[77,14638,1626],{"class":104},[18,14640,14641],{},[21,14642,14643],{},"2.编译",[18,14645,2311],{},[68,14647,14648],{"className":70,"code":14229,"language":72,"meta":32,"style":32},[74,14649,14650],{"__ignoreMap":32},[77,14651,14652,14654,14656,14658],{"class":79,"line":80},[77,14653,2321],{"class":83},[77,14655,2324],{"class":87},[77,14657,2327],{"class":1217},[77,14659,14242],{"class":87},[18,14661,14662],{},[21,14663,14664],{},"3.执行",[18,14666,4001],{},[68,14668,14669],{"className":70,"code":6794,"language":72,"meta":32,"style":32},[74,14670,14671,14677],{"__ignoreMap":32},[77,14672,14673,14675],{"class":79,"line":80},[77,14674,2350],{"class":1217},[77,14676,2353],{"class":87},[77,14678,14679,14681,14683,14685],{"class":79,"line":114},[77,14680,1205],{"class":83},[77,14682,2360],{"class":87},[77,14684,6811],{"class":87},[77,14686,6814],{"class":87},[18,14688,14689],{},"（2）然后在终端下进入当前工作空间，输入如下指令启动自主SLAM功能：",[68,14691,14693],{"className":70,"code":14692,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_navigation2 auto_slam.launch.py\n",[74,14694,14695,14701],{"__ignoreMap":32},[77,14696,14697,14699],{"class":79,"line":80},[77,14698,2350],{"class":1217},[77,14700,2353],{"class":87},[77,14702,14703,14705,14707,14709],{"class":79,"line":114},[77,14704,1205],{"class":83},[77,14706,2360],{"class":87},[77,14708,9193],{"class":87},[77,14710,14711],{"class":87}," auto_slam.launch.py\n",[18,14713,14297,14714,14301,14716,14718,14719,14721],{},[74,14715,14300],{},[74,14717,14304],{},"文件，再通过菜单栏的",[74,14720,14308],{},"设置目标点，机器人就可以自动导航至目标点，并且导航中还会实现建图的功能。",[68,14723,14724],{"className":70,"code":14312,"language":72,"meta":32,"style":32},[74,14725,14726],{"__ignoreMap":32},[77,14727,14728,14730,14732],{"class":79,"line":80},[77,14729,14319],{"class":83},[77,14731,14322],{"class":1217},[77,14733,14325],{"class":87},[18,14735,14736],{},[30,14737],{"alt":32,"src":14738},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1770.webp",[18,14740,14741],{},[30,14742],{"alt":32,"src":14743},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1771.webp",[10,14745,14746],{"id":14746},"多车编队",[18,14748,14749],{},"多车编队技术通过先进的传感器、实时数据分析和高度智能化的控制系统，使得一组车辆能够在没有人工干预的情况下实现协同运行，作为一种先进的智能交通系统应用，已经在多个领域展现出其巨大的潜力和广泛的应用场景。比如：",[337,14751,14752,14755,14758],{},[18,14753,14754],{},"时间优化：多车编队技术消除了人为操作中的误差和延误，降低了人力资源成本和运营风险。",[18,14756,14757],{},"空间优化：多车编队技术可以减少车辆间的空隙，最大化道路利用率。",[18,14759,14760],{},"性能优化：密集编队行驶减少了空气动力学阻力，降低了能耗和燃料消耗。",[18,14762,14763],{},"总之，多车编队技术在机器人领域有着独特的作用和价值。本节将介绍如何在ROS2中实现多车编队。",[14765,14766,14767],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":32,"searchDepth":114,"depth":114,"links":14769},[14770,14771,14772,14773,14774,14775],{"id":12,"depth":136,"text":12},{"id":296,"depth":136,"text":297},{"id":4069,"depth":136,"text":4069},{"id":5520,"depth":136,"text":5521},{"id":6940,"depth":136,"text":6940},{"id":14746,"depth":136,"text":14746},"12",12000000,"2023-12-30","2023-12-30-ros2-tutorial","/wiki/2023-12-30-ros2-tutorial","Ros2 Tutorial","md",false,null,{},"/wiki/2023-12-30-ros2-tutorial/ch12-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian",{"title":5,"description":32},"wiki/2023-12-30-ros2-tutorial/ch12-机器人导航Navigation2(仿真篇)","vAghwjT4XI4m7mnWnNf1pecLa5Vj3tfrE8BbND39EGo",[14791,14797,14802,14808,14814,14820,14826,14832,14833,14839,14845,14851,14857,14863,14869,14875,14881,14887,14893,14899,14905,14911,14917,14923,14929],{"path":14792,"stem":14793,"title":14794,"date":14778,"chapter":14795,"chapterSort":14796,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch1-ros2-jie-shao","wiki/2023-12-30-ros2-tutorial/ch1-ROS2介绍","ROS2介绍","1",1000000,{"path":14798,"stem":14799,"title":14800,"date":14778,"chapter":2035,"chapterSort":14801,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch10-stage-ros2-fang-zhen-ping-tai","wiki/2023-12-30-ros2-tutorial/ch10-Stage_Ros2仿真平台","Stage_Ros2仿真平台",10000000,{"path":14803,"stem":14804,"title":14805,"date":14778,"chapter":14806,"chapterSort":14807,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch11-1-gazeboclassic","wiki/2023-12-30-ros2-tutorial/ch11-1-GazeboClassic","Gezebo Classic","11.1",11010000,{"path":14809,"stem":14810,"title":14811,"date":14778,"chapter":14812,"chapterSort":14813,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch11-2-ignitiongazebo","wiki/2023-12-30-ros2-tutorial/ch11-2-IgnitionGazebo","Ignition Gazebo（Gazebo Fortress）","11.2",11020000,{"path":14815,"stem":14816,"title":14817,"date":14778,"chapter":14818,"chapterSort":14819,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch11-3-gazebosim","wiki/2023-12-30-ros2-tutorial/ch11-3-GazeboSim","Gz Sim（Gazebo Harmonic）","11.3",11030000,{"path":14821,"stem":14822,"title":14823,"date":14778,"chapter":14824,"chapterSort":14825,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch11-4-igngz2gzsim","wiki/2023-12-30-ros2-tutorial/ch11-4-Igngz2gzsim","将Ign Gazebo迁移至Gz Sim","11.4",11040000,{"path":14827,"stem":14828,"title":14829,"date":14778,"chapter":14830,"chapterSort":14831,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch11-gezebo-fang-zhen-ping-tai","wiki/2023-12-30-ros2-tutorial/ch11-Gezebo仿真平台","Gezebo仿真平台","11",11000000,{"path":14786,"stem":14788,"title":5,"date":14778,"chapter":14776,"chapterSort":14777,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},{"path":14834,"stem":14835,"title":14836,"date":14778,"chapter":14837,"chapterSort":14838,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch13-ros2serial","wiki/2023-12-30-ros2-tutorial/ch13-ROS2Serial","ROS2 Serial","13",13000000,{"path":14840,"stem":14841,"title":14842,"date":14778,"chapter":14843,"chapterSort":14844,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch14-ji-qi-ren-ying-jian","wiki/2023-12-30-ros2-tutorial/ch14-机器人硬件","机器人硬件","14",14000000,{"path":14846,"stem":14847,"title":14848,"date":14778,"chapter":14849,"chapterSort":14850,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch15-ros2-control","wiki/2023-12-30-ros2-tutorial/ch15-ROS2_Control","ROS2_Control","15",15000000,{"path":14852,"stem":14853,"title":14854,"date":14778,"chapter":14855,"chapterSort":14856,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch16-moveit2-gong-ye-ji-qi-ren-ji-xie-bi","wiki/2023-12-30-ros2-tutorial/ch16-Moveit2工业机器人机械臂","Moveit2工业机器人机械臂","16",16000000,{"path":14858,"stem":14859,"title":14860,"date":14778,"chapter":14861,"chapterSort":14862,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch17-ji-qi-ren-dao-hang-navigation2-shi-ti-pian","wiki/2023-12-30-ros2-tutorial/ch17-机器人导航Navigation2(实体篇)","机器人导航Navigation2(实体篇)","17",17000000,{"path":14864,"stem":14865,"title":14866,"date":14778,"chapter":14867,"chapterSort":14868,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch18-microros","wiki/2023-12-30-ros2-tutorial/ch18-MicroROS","MicroROS","18",18000000,{"path":14870,"stem":14871,"title":14872,"date":14778,"chapter":14873,"chapterSort":14874,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch19-webots-fang-zhen-ping-tai","wiki/2023-12-30-ros2-tutorial/ch19-Webots仿真平台","Webots仿真平台","19",19000000,{"path":14876,"stem":14877,"title":14878,"date":14778,"chapter":14879,"chapterSort":14880,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch2-ru-men-cao-zuo","wiki/2023-12-30-ros2-tutorial/ch2-入门操作","入门操作","2",2000000,{"path":14882,"stem":14883,"title":14884,"date":14778,"chapter":14885,"chapterSort":14886,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch20-opencv","wiki/2023-12-30-ros2-tutorial/ch20-OpenCV","OpenCV","20",20000000,{"path":14888,"stem":14889,"title":14890,"date":14778,"chapter":14891,"chapterSort":14892,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch3-gong-zuo-kong-jian-yu-gong-neng-bao","wiki/2023-12-30-ros2-tutorial/ch3-工作空间与功能包","工作空间与功能包","3",3000000,{"path":14894,"stem":14895,"title":14896,"date":14778,"chapter":14897,"chapterSort":14898,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch4-si-da-tong-xin","wiki/2023-12-30-ros2-tutorial/ch4-四大通信","四大通信","4",4000000,{"path":14900,"stem":14901,"title":14902,"date":14778,"chapter":14903,"chapterSort":14904,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch5-ros2-qi-ta-tong-xin-ji-zhi","wiki/2023-12-30-ros2-tutorial/ch5-ROS2其他通信机制","ROS2其他通信机制","5",5000000,{"path":14906,"stem":14907,"title":14908,"date":14778,"chapter":14909,"chapterSort":14910,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch6-launch","wiki/2023-12-30-ros2-tutorial/ch6-Launch","Launch","6",6000000,{"path":14912,"stem":14913,"title":14914,"date":14778,"chapter":14915,"chapterSort":14916,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch7-hui-su-rosbag2","wiki/2023-12-30-ros2-tutorial/ch7-回溯rosbag2","回溯rosbag2","7",7000000,{"path":14918,"stem":14919,"title":14920,"date":14778,"chapter":14921,"chapterSort":14922,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch8-zuo-biao-bian-huan-tf","wiki/2023-12-30-ros2-tutorial/ch8-坐标变换TF","坐标变换TF","8",8000000,{"path":14924,"stem":14925,"title":14926,"date":14778,"chapter":14927,"chapterSort":14928,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":14783},"/wiki/2023-12-30-ros2-tutorial/ch9-ke-shi-hua-ping-tai-rviz2-yu-urdf-jian-mo-yu-yan","wiki/2023-12-30-ros2-tutorial/ch9-可视化平台RVIZ2与URDF建模语言","可视化平台RVIZ2与URDF建模语言","9",9000000,{"path":14780,"stem":14930,"title":14931,"date":14778,"chapter":14784,"chapterSort":14932,"docKey":14779,"docRoot":14780,"docTitle":14781,"isWikiDoc":139,"isWikiIndex":139},"wiki/2023-12-30-ros2-tutorial/index","ROS2机器人操作系统教程",0,1778560329540]