[{"data":1,"prerenderedAt":16518},["ShallowReactive",2],{"wiki-page-/zh-cn/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben":3,"wiki-doc-items-/zh-cn/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben":16151,"language-switcher-data-/zh-cn/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben":16502,"wiki-i18n-paths-/zh-cn/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben":16517},{"id":4,"title":5,"body":6,"canonicalPath":16133,"chapter":16134,"chapterSort":16135,"date":16136,"description":32,"docI18nKey":16137,"docKey":16138,"docRoot":16139,"docTitle":16140,"extension":16141,"i18nKey":16142,"isBlogPost":16143,"isWikiDoc":139,"isWikiIndex":16143,"layout":16144,"legacyPath":16145,"locale":16146,"localeSlug":16147,"meta":16148,"navigation":139,"path":16133,"seo":16149,"sourcePath":16145,"sourceStem":16142,"stem":16142,"wikiDepth":80,"__hash__":16150},"content/wiki/2023-12-30-ros2-tutorial/ch12-2-Jazzy版本.md","Jazzy导航仿真",{"type":7,"value":8,"toc":16125},"minimark",[9,13,17,24,27,34,37,42,45,58,61,64,67,204,211,214,217,222,254,257,277,280,283,291,295,299,302,305,308,323,326,330,333,348,351,354,356,363,366,392,395,421,424,433,494,498,501,504,522,525,530,576,579,660,665,701,706,819,829,1181,1184,1189,1192,1218,1223,1230,1623,1633,2258,2261,2266,2273,2300,2305,2308,2327,2413,2418,2421,2426,2429,2432,2435,2438,2441,2444,2449,2452,2457,2470,2473,2477,2480,2484,2515,2517,2549,2552,2555,2657,2662,2665,2676,2701,2704,2709,2742,2747,2782,2787,2867,2872,2877,2882,2905,2910,2933,2938,2961,2966,2971,2974,2978,2980,3001,3005,3010,3353,3356,3937,3939,3943,3947,3967,3971,3973,3989,3993,3996,4016,4019,4043,4046,4051,4056,4061,4064,4071,4093,4097,4101,4110,4114,4138,4142,4168,4172,4184,4222,4225,4229,4232,4237,4240,4264,4278,4283,4288,4291,4294,4307,4311,4318,4508,4512,4517,4802,4805,4811,4897,4902,4939,4943,4946,4953,4957,4980,4984,5004,5007,5011,5014,5035,5038,5055,5060,5065,5071,5091,5096,5099,5124,5130,5164,5174,5179,5189,5452,5463,5479,5484,5490,5497,5502,5507,5512,5516,5519,5525,5528,5531,5537,5542,5596,5601,5645,5650,5685,5690,5695,5756,5761,5812,5817,5855,5860,5889,5894,5949,5952,5957,5959,5983,5988,5994,6485,6506,6511,6896,6902,6907,6911,6931,6936,6938,6954,6959,6961,6981,6983,7007,7010,7027,7033,7040,7043,7049,7054,7072,7077,7082,7087,7090,7095,7098,7103,7106,7109,7112,7119,7124,7127,7133,7139,7144,7149,7152,7158,7161,7176,7180,7245,7248,7261,7267,7273,7276,7282,7285,7291,7295,7338,7343,7369,7373,7434,7437,7451,7456,7481,7486,7557,7562,7605,7610,7667,7672,8024,8027,8044,8049,8083,8088,8167,8172,8241,8246,8279,8284,8359,8364,8525,8528,8538,8542,8606,8610,8634,8639,8709,8713,8826,8829,8847,8852,8877,8882,8905,8910,8964,8967,8977,8981,9013,9017,9041,9045,9071,9075,9167,9170,9180,9184,9207,9211,9234,9238,9334,9337,9356,9360,9362,9386,9390,9393,9399,10964,10967,10972,10975,10982,11727,11733,12432,12438,12607,12612,12617,13182,13187,13192,14190,14193,14204,14210,14213,14228,14233,14238,14494,14499,14504,14592,14597,14602,14784,14789,14794,14891,14896,14903,15220,15225,15229,15251,15256,15258,15274,15279,15281,15301,15304,15328,15343,15359,15388,15396,15399,15407,15410,15413,15418,15423,15427,15437,15442,15448,15990,15995,15997,16011,16016,16018,16038,16041,16069,16079,16091,16096,16101,16104,16107,16118,16121],[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# Jazzy\nsudo apt install ros-jazzy-navigation2\nsudo apt install ros-jazzy-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,182,193],"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","# Jazzy\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-jazzy-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-jazzy-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,147],{"class":146},[77,183,185,187,189,191],{"class":79,"line":184},9,[77,186,84],{"class":83},[77,188,88],{"class":87},[77,190,91],{"class":87},[77,192,159],{"class":87},[77,194,196,198,200,202],{"class":79,"line":195},10,[77,197,84],{"class":83},[77,199,88],{"class":87},[77,201,91],{"class":87},[77,203,171],{"class":87},[18,205,206,207,210],{},"指令中的",[74,208,209],{},"\u003Cros2-distro>","请替换成当前所使用的ROS2版本。",[14,212,213],{"id":213},"导航条件",[18,215,216],{},"深入学习Nav2，需了解ROS2机器人基础知识，并配备仿真或实体机器人作为实践环境。",[18,218,219],{},[21,220,221],{},"ROS2基础",[46,223,224,230,236,242,248],{},[49,225,226,229],{},[21,227,228],{},"ROS2通信"," ：了解ROS2中的节点（Nodes）、话题（Topics）、服务（Services）、动作（Actions）等基本概念，以及如何通过这些机制实现节点间的通信。",[49,231,232,235],{},[21,233,234],{},"生命周期管理"," ：熟悉ROS2中的生命周期节点（Lifecycle Nodes），理解节点的启动、配置、激活、去激活、清理等状态转换过程，这对于管理复杂的ROS2系统至关重要。",[49,237,238,241],{},[21,239,240],{},"rviz2："," 熟练使用rviz2进行可视化调试，包括如何设置不同的显示类型（如点云、地图、路径等），以及如何通过rviz2与ROS2节点进行交互（如设置导航目标点、观察机器人状态等）。",[49,243,244,247],{},[21,245,246],{},"URDF："," 了解URDF（Unified Robot Description Format）文件，这是ROS中用于描述机器人模型的一种XML格式。熟悉如何编写和修改URDF文件，以便在仿真或实际环境中准确地表示机器人结构。",[49,249,250,253],{},[21,251,252],{},"TF坐标变换："," 掌握TF（Transform）库的使用，理解坐标变换在机器人导航中的重要性。学会如何设置和查询不同坐标系之间的变换关系，以确保机器人能够准确地定位自身和周围环境。",[18,255,256],{},"实践环境",[46,258,259,265,271],{},[49,260,261,264],{},[21,262,263],{},"仿真环境："," 搭建一个ROS2兼容的仿真环境，并配置好相应的机器人模型、传感器（如激光雷达、相机等）和仿真世界。确保仿真环境中的机器人能够接收速度指令、反馈里程计消息、发布传感器数据和TF坐标变换等。",[49,266,267,270],{},[21,268,269],{},"实体机器人："," 如果条件允许，准备一台实体机器人。这台机器人应该具备与仿真环境中相似的功能，即能够接收速度指令、反馈里程计消息、发布激光雷达等传感器数据以及发布TF坐标变换。同时，确保实体机器人已经安装了ROS2系统，并且已经配置好相应的驱动程序和算法库。",[49,272,273,276],{},[21,274,275],{},"Nav2软件包："," 安装并配置好Nav2软件包及其依赖项。Nav2是ROS2中用于机器人导航的综合性软件包，它包含了路径规划、避障、局部和全局地图维护等多个功能模块。确保Nav2软件包与您的ROS2版本兼容，并且已经根据需要进行了适当的配置。",[18,278,279],{},"通过掌握上述基础知识并准备好实践环境，您将能够更好地学习和应用Nav2进行机器人导航任务的开发与调试。",[14,281,282],{"id":282},"导航参数参考",[18,284,285],{},[286,287,288],"a",{"href":288,"rel":289},"https://docs.nav2.org/configuration/index.html",[290],"nofollow",[10,292,294],{"id":293},"slam-定位与建图","SLAM 定位与建图",[18,296,297],{},[21,298,23],{},[18,300,301],{},"SLAM（Simultaneous Localization and Mapping，即时定位与建图）是机器人学和自动导航领域的一种关键技术，允许机器人在未知环境中绘制环境地图。",[18,303,304],{},"在ROS 2下进行SLAM，通常涉及使用专门为ROS 2开发的SLAM相关软件包。这些软件包利用ROS 2的通讯框架（如话题、服务和action）来处理接收到的传感器数据，包括激光雷达、相机、惯性测量单元等。",[18,306,307],{},"以下列举了一些常见的在ROS2中使用的SLAM系统：",[309,310,311,317],"ol",{},[49,312,313,316],{},[21,314,315],{},"SLAM Toolbox"," ：SLAM Toolbox 是一种在 ROS 2 中普遍使用的 SLAM 解决方案，由 Steve Macenski 维护。它是为了替代原有的ROS中著名的gmapping包和Cartographer SLAM包而开发的，提供了2D激光SLAM领域中的多种功能。",[49,318,319,322],{},[21,320,321],{},"Cartographer for ROS 2"," ：Cartographer是由Google开发的一个2D和3D环境SLAM库。尽管它最初是为ROS开发的，但已经有为ROS 2创建的适配版本，可以在ROS 2生态系统内使用。",[18,324,325],{},"要在ROS 2中开始一个SLAM项目，还需要具体的传感器（例如激光雷达或摄像头），计算机要有足够的算力来运行SLAM算法，以及熟悉ROS 2节点、话题、服务、action、参数等知识，以实现有效的数据处理和通信。随着项目的发展，可能还需要考虑动态重配置、3D建图和路径规划等高级功能。",[18,327,328],{},[21,329,41],{},[18,331,332],{},"必须先说明的是：SLAM与Nav2并没有直接的依赖关系，它们是两种相对独立的技术框架。然而，在实际应用中，这两者却展现出紧密的联系与互补性。",[334,335,336,342],"blockquote",{},[18,337,338,341],{},[21,339,340],{},"独立性："," SLAM能够独立完成环境地图的构建，无需Nav2的介入。它依靠传感器数据来感知环境，并通过算法估计机器人的位置与姿态，从而构建出环境的地图。与此同时，Nav2也具备自主导航的能力。即使没有SLAM地图作为输入，它也能依赖其他来源的环境信息进行导航。",[18,343,344,347],{},[21,345,346],{},"互补性："," 尽管两者在技术上各自独立，但它们的结合却带来了显著的优势。Nav2能够利用SLAM创建的精确地图进行高效的路径规划，确保机器人能够顺利导航至目标位置。而SLAM则能借助Nav2的导航控制功能，在机器人移动过程中实时收集环境信息，从而进一步提高地图构建的效率和准确性。",[18,349,350],{},"因此，尽管SLAM与Nav2在技术上各自独立，但在构建完整的机器人导航系统中，它们的互补性使得机器人能够在复杂环境中实现更加自主、精准的建图或导航。",[14,352,353],{"id":353},"slam_toolbox概述",[18,355,23],{},[18,357,358,359,362],{},"SLAM Toolbox是一个基于开源软件的用来构建 ",[21,360,361],{},"2D地图"," 的工具集，旨在为研究人员和开发者提供一个快速构建和实现SLAM算法的平台。它集成了多种常用的SLAM算法，并提供了丰富的数据处理和滤波函数，以及地图构建和环境建模的工具。",[18,364,365],{},"功能",[46,367,368,374,380,386],{},[49,369,370,373],{},[21,371,372],{},"算法集成"," 包含基于卡尔曼滤波器和粒子滤波器的SLAM算法，以及基于图优化的SLAM算法等。",[49,375,376,379],{},[21,377,378],{},"数据处理"," 提供数据融合、数据预处理和异常检测等功能，支持激光雷达、摄像头、IMU等多种传感器数据的处理。",[49,381,382,385],{},[21,383,384],{},"地图构建"," 利用传感器数据和机器人运动信息构建准确的地图，并进行更新和优化。",[49,387,388,391],{},[21,389,390],{},"模块化设计"," 支持用户插入自己的算法或替换现有模块，实现高度定制化的SLAM解决方案。",[18,393,394],{},"优点",[46,396,397,403,409,415],{},[49,398,399,402],{},[21,400,401],{},"开源性和灵活性"," 作为开源软件，SLAM Toolbox提供了源代码和文档，用户可以自由修改和扩展算法。",[49,404,405,408],{},[21,406,407],{},"多种传感器支持"," 支持激光雷达、摄像头、IMU等多种传感器数据，适应不同应用场景的需求。",[49,410,411,414],{},[21,412,413],{},"高效性"," 利用现代C++的特性优化性能，确保在资源受限的硬件上也能高效运行。",[49,416,417,420],{},[21,418,419],{},"广泛的应用前景"," 适用于学术研究、无人机导航、自动驾驶汽车、室内机器人和工业自动化等多个领域。",[14,422,423],{"id":423},"slam_toolbox安装",[18,425,426,427,432],{},"借助于Advanced Packaging Tools(",[286,428,431],{"href":429,"rel":430},"https://c6.y.qq.com/base/fcgi-bin/u?__=bqEbdGxIB7mM",[290],"APT",")包资源管理器，可以使用二进制的方式安装slam_toolbox，安装指令如下：",[68,434,436],{"className":70,"code":435,"language":72,"meta":32,"style":32},"sudo apt install ros-\u003Cros2-distro>-slam-toolbox\n\n#humble\nsudo apt install ros-jazzy-slam-toolbox\n#jazzy\nsudo apt install ros-jazzy-slam-toolbox\n",[74,437,438,459,463,468,479,484],{"__ignoreMap":32},[77,439,440,442,444,446,448,450,452,454,456],{"class":79,"line":80},[77,441,84],{"class":83},[77,443,88],{"class":87},[77,445,91],{"class":87},[77,447,94],{"class":87},[77,449,98],{"class":97},[77,451,101],{"class":87},[77,453,105],{"class":104},[77,455,108],{"class":97},[77,457,458],{"class":87},"-slam-toolbox\n",[77,460,461],{"class":79,"line":114},[77,462,140],{"emptyLinePlaceholder":139},[77,464,465],{"class":79,"line":136},[77,466,467],{"class":146},"#humble\n",[77,469,470,472,474,476],{"class":79,"line":143},[77,471,84],{"class":83},[77,473,88],{"class":87},[77,475,91],{"class":87},[77,477,478],{"class":87}," ros-jazzy-slam-toolbox\n",[77,480,481],{"class":79,"line":150},[77,482,483],{"class":146},"#jazzy\n",[77,485,486,488,490,492],{"class":79,"line":162},[77,487,84],{"class":83},[77,489,88],{"class":87},[77,491,91],{"class":87},[77,493,478],{"class":87},[18,495,206,496,210],{},[74,497,209],{},[14,499,500],{"id":500},"slam_toolbox节点说明",[18,502,503],{},"在slam_toolbox中常用的节点有两个：sync_slam_toolbox_node和async_slam_toolbox_node。",[334,505,506,511,514,519],{},[18,507,508],{},[21,509,510],{},"sync_slam_toolbox_node：",[18,512,513],{},"这是一个同步节点，会等待所有传感器数据到达后再处理，确保数据完整性和一致性，提高定位和建图准确性。但同步处理可能导致延迟，更适合对数据一致性和准确性要求高、实时性要求不高的场景。",[18,515,516],{},[21,517,518],{},"async_slam_toolbox_node：",[18,520,521],{},"与同步节点不同，这是一个异步节点，可以立即处理已接收的数据，减小延迟，提高响应速度。但异步处理可能导致数据不完全同步，定位和建图结果可能不如同步方式准确。因此，它更适合对实时性要求高、对数据一致性和准确性要求相对较低的场景。",[18,523,524],{},"在选择使用sync_slam_toolbox_node还是async_slam_toolbox_node时，需根据应用需求和环境权衡。若实时性关键且能接受一定定位或建图误差，选择async_slam_toolbox_node。若对数据一致性和准确性要求较高，且实时性非首要考虑，则选择sync_slam_toolbox_node。另外二者的主要区别在于数据处理的方式，而两个节点发布的话题、订阅的话题、发布的服务以及使用的参数等都是一样的。",[309,526,527],{},[49,528,529],{},"订阅的话题",[531,532,533,550],"table",{},[534,535,536],"thead",{},[537,538,539,544,547],"tr",{},[540,541,543],"th",{"align":542},"left","话题",[540,545,546],{"align":542},"类型",[540,548,549],{"align":542},"描述",[551,552,553,565],"tbody",{},[537,554,555,559,562],{},[556,557,558],"td",{"align":542},"/scan",[556,560,561],{"align":542},"sensor_msgs/msg/LaserScan",[556,563,564],{"align":542},"来自激光雷达输入的扫描数据",[537,566,567,570,573],{},[556,568,569],{"align":542},"/tf",[556,571,572],{"align":542},"tf2_msgs/msg/TFMessage",[556,574,575],{"align":542},"配置的odom_frame到base_frame的转换",[18,577,578],{},"虽然不订阅/odom,但是需要发布/odom,以改变坐标。",[531,580,581,594],{},[534,582,583],{},[537,584,585,588,591],{},[540,586,587],{"align":542},"特性",[540,589,590],{"align":542},"slam_toolbox",[540,592,593],{"align":542},"hector_slam",[551,595,596,607,618,629,640,649],{},[537,597,598,601,604],{},[556,599,600],{"align":542},"地图精度",[556,602,603],{"align":542},"高",[556,605,606],{"align":542},"中",[537,608,609,612,615],{},[556,610,611],{"align":542},"实时性",[556,613,614],{"align":542},"较好，但依赖优化（回环检测）",[556,616,617],{"align":542},"极高",[537,619,620,623,626],{},[556,621,622],{"align":542},"依赖数据",[556,624,625],{"align":542},"激光雷达、TF 树、里程计",[556,627,628],{"align":542},"激光雷达（可选 IMU）",[537,630,631,634,637],{},[556,632,633],{"align":542},"回环检测",[556,635,636],{"align":542},"支持",[556,638,639],{"align":542},"不支持",[537,641,642,645,647],{},[556,643,644],{"align":542},"长期运行",[556,646,636],{"align":542},[556,648,639],{"align":542},[537,650,651,654,657],{},[556,652,653],{"align":542},"适用场景",[556,655,656],{"align":542},"动态导航、复杂环境",[556,658,659],{"align":542},"简单环境，或无里程计时",[309,661,662],{"start":114},[49,663,664],{},"发布的话题",[531,666,667,677],{},[534,668,669],{},[537,670,671,673,675],{},[540,672,543],{"align":542},[540,674,546],{"align":542},[540,676,549],{"align":542},[551,678,679,690],{},[537,680,681,684,687],{},[556,682,683],{"align":542},"/map",[556,685,686],{"align":542},"nav_msgs/msg/OccupancyGrid",[556,688,689],{"align":542},"pose-graph（姿态图）在特定的更新频率（map_update_interval）下的占用栅格表示。",[537,691,692,695,698],{},[556,693,694],{"align":542},"/pose",[556,696,697],{"align":542},"geometry_msgs/msg/PoseWithCovarianceStamped",[556,699,700],{"align":542},"配置的map_frame中base_frame的位姿以及根据扫描匹配计算的协方差",[309,702,703],{"start":136},[49,704,705],{},"发布的服务",[531,707,708,718],{},[534,709,710],{},[537,711,712,714,716],{},[540,713,543],{"align":542},[540,715,546],{"align":542},[540,717,549],{"align":542},[551,719,720,731,742,753,764,775,786,797,808],{},[537,721,722,725,728],{},[556,723,724],{"align":542},"/slam_toolbox/clear_changes",[556,726,727],{"align":542},"slam_toolbox/srv/Clear",[556,729,730],{"align":542},"清除所有待处理的手动位姿图操作的更改",[537,732,733,736,739],{},[556,734,735],{"align":542},"/slam_toolbox/deserialize_map",[556,737,738],{"align":542},"slam_toolbox/srv/DeserializePoseGraph",[556,740,741],{"align":542},"从磁盘加载保存的序列化位姿图文件",[537,743,744,747,750],{},[556,745,746],{"align":542},"/slam_toolbox/dynamic_map",[556,748,749],{"align":542},"nav_msgs/OccupancyGrid",[556,751,752],{"align":542},"请求位姿图的当前状态作为占用网格",[537,754,755,758,761],{},[556,756,757],{"align":542},"/slam_toolbox/manual_loop_closure",[556,759,760],{"align":542},"slam_toolbox/srv/LoopClosure",[556,762,763],{"align":542},"请求对位姿图进行手动更改",[537,765,766,769,772],{},[556,767,768],{"align":542},"/slam_toolbox/pause_new_measurements",[556,770,771],{"align":542},"slam_toolbox/srv/Pause",[556,773,774],{"align":542},"暂停处理新传入的激光扫描",[537,776,777,780,783],{},[556,778,779],{"align":542},"/slam_toolbox/save_map",[556,781,782],{"align":542},"slam_toolbox/srv/SaveMap",[556,784,785],{"align":542},"保存可用于显示 AMCL 定位的地图图像文件。",[537,787,788,791,794],{},[556,789,790],{"align":542},"/slam_toolbox/serialize_map",[556,792,793],{"align":542},"slam_toolbox/srv/SerializePoseGraph",[556,795,796],{"align":542},"保存地图位姿图和数据，可用于继续建图、slam_toolbox 定位、离线操作等",[537,798,799,802,805],{},[556,800,801],{"align":542},"/slam_toolbox/toggle_interactive_mode",[556,803,804],{"align":542},"slam_toolbox/srv/ToggleInteractive",[556,806,807],{"align":542},"在交互模式与非交互模式之间切换，发布节点的交互式标记及其位置，以便在应用程序中进行更新",[537,809,810,813,816],{},[556,811,812],{"align":542},"/slam_toolbox/reset",[556,814,815],{"align":542},"slam_toolbox/srv/Reset",[556,817,818],{"align":542},"将当前地图重置回初始状态",[309,820,821],{"start":143},[49,822,823,824],{},"参数",[309,825,826],{},[49,827,828],{},"求解器参数",[46,830,831,837,843,849,855,861,867,878,884,890,896,902,908,914,920,926,932,938,944,950,956,962,968,974,980,986,992,998,1004,1010,1021,1027,1033,1039,1045,1051,1057,1063,1069,1075,1081,1087,1093,1099,1105,1111,1117,1123,1129,1134,1140,1145,1151,1157,1163,1169,1175],{},[49,832,833,836],{},[21,834,835],{},"solver_plugin","  用于 karto 扫描解算器的非线性解算器类型。选项：solver_plugins::CeresSolver, - solver_plugins::SpaSolver, solver_plugins::G2oSolver. Default: solver_plugins::CeresSolver.",[49,838,839,842],{},[21,840,841],{},"ceres_linear_solver","  Ceres 使用的线性求解器。选项：SPARSE_NORMAL_CHOLESKY、SPARSE_SCHUR、ITERATIVE_SCHUR、CGNR。默认为 SPARSE_NORMAL_CHOLESKY。",[49,844,845,848],{},[21,846,847],{},"ceres_preconditioner","  与该求解器一起使用的预处理器。选项：JACOBI、IDENTITY（none）、SCHUR_JACOBI。默认为JACOBI。",[49,850,851,854],{},[21,852,853],{},"ceres_trust_strategy","  信任区域策略。行搜索策略没有公开，因为它们对于这种用途表现不佳。选项：LEVENBERG_MARQUARDT、DOGLEG。默认值：LEVENBERG_MARQUARDT。",[49,856,857,860],{},[21,858,859],{},"ceres_dogleg_type","  如果信任策略是 DOGLEG，则使用dogleg策略。选项：TRADITIONAL_DOGLEG、SUBSPACE_DOGLEG。默认值：TRADITIONAL_DOGLEG",[49,862,863,866],{},[21,864,865],{},"ceres_loss_function","  拒绝异常值的损失函数类型。没有一个等于损失平方。选项：None、HuberLoss、CauchyLoss。默认值：None。",[49,868,869,872,873],{},[21,870,871],{},"mode","  “建图”或“定位”模式，用于 Ceres 问题创建中的性能优化",[46,874,875],{},[49,876,877],{},"Toolbox参数",[49,879,880,883],{},[21,881,882],{},"odom_frame","  里程计坐标系",[49,885,886,889],{},[21,887,888],{},"map_frame","  地图坐标系",[49,891,892,895],{},[21,893,894],{},"base_frame","  基坐标系",[49,897,898,901],{},[21,899,900],{},"scan_topic","  扫描主题名， 注意是/scan 不是scan",[49,903,904,907],{},[21,905,906],{},"scan_queue_size","  扫描消息对队列长度。在异步模式下应始终设置为 1",[49,909,910,913],{},[21,911,912],{},"use_map_saver","  实例化地图服务程序并自行订阅map主题",[49,915,916,919],{},[21,917,918],{},"map_file_name","  启动时加载的位姿图文件的名称（如果可用）",[49,921,922,925],{},[21,923,924],{},"map_start_pose","  启动建图/定位时的位姿（如果可用）",[49,927,928,931],{},[21,929,930],{},"map_start_at_dock","  在dock（第一个节点）处启动姿势图加载（如果可用）。如果同时设置了pose和dock，优先使用pose",[49,933,934,937],{},[21,935,936],{},"debug_logging","  更改日志以进行调试",[49,939,940,943],{},[21,941,942],{},"throttle_scans","  在同步模式下限制的扫描次数",[49,945,946,949],{},[21,947,948],{},"transform_publish_period","  里程计odom变换发布周期。 0 不会发布变换。",[49,951,952,955],{},[21,953,954],{},"map_update_interval","  更新 2D 占用地图的时间间隔",[49,957,958,961],{},[21,959,960],{},"enable_interactive_mode","  是否允许启用交互模式。交互模式将保留映射到其 ID 的激光扫描缓存，以便在交互模式下进行可视化。结果，该进程的内存将会增加。在定位和长期建图模式下可以手动禁用此功能，因为它们会随着时间的推移增加内存利用率。对于建图或连续建图模式均有效。",[49,963,964,967],{},[21,965,966],{},"position_covariance_scale","  从扫描匹配发布姿势时缩放位置协方差的量。这可用于调整下游定位滤波器中位姿的影响。协方差表示测量的不确定性，因此扩大协方差将减小位姿对下游滤波器的影响。默认值：1.0",[49,969,970,973],{},[21,971,972],{},"yaw_covariance_scale","  从扫描匹配发布位姿时缩放偏航协方差的量。请参阅position_covariance_scale 的描述。默认值：1.0",[49,975,976,979],{},[21,977,978],{},"resolution","  生成的 2D 占用图的分辨率",[49,981,982,985],{},[21,983,984],{},"max_laser_range","  用于 2D 占用地图光栅化的最大激光范围",[49,987,988,991],{},[21,989,990],{},"minimum_time_interval","  在同步模式下处理的扫描之间的最短持续时间",[49,993,994,997],{},[21,995,996],{},"transform_timeout","  查找转换 TF 超时时间限制",[49,999,1000,1003],{},[21,1001,1002],{},"tf_buffer_duration","  存储 TF 消息以供查询的时间。如果在同步模式下以倍速脱机运行，则设置高一些。",[49,1005,1006,1009],{},[21,1007,1008],{},"stack_size_to_use","  将堆栈大小重置为的字节数，以启用文件的序列化/反序列化。自由默认值为 40000000，但越少越好。",[49,1011,1012,1015,1016],{},[21,1013,1014],{},"minimum_travel_distance","  处理新扫描之前的最小行进距离",[46,1017,1018],{},[49,1019,1020],{},"匹配器参数",[49,1022,1023,1026],{},[21,1024,1025],{},"use_scan_matching","  是否使用扫描匹配来优化里程位姿",[49,1028,1029,1032],{},[21,1030,1031],{},"use_scan_barycenter","  是否使用重心或扫描位姿",[49,1034,1035,1038],{},[21,1036,1037],{},"minimum_travel_heading","  合理更新的最小航向变化",[49,1040,1041,1044],{},[21,1042,1043],{},"scan_buffer_size","  缓冲到链中的扫描次数，也用作定位模式循环缓冲区中的扫描次数",[49,1046,1047,1050],{},[21,1048,1049],{},"scan_buffer_maximum_scan_distance","  从缓冲区中删除之前扫描，距离之前位姿的最大距离",[49,1052,1053,1056],{},[21,1054,1055],{},"link_match_minimum_response_fine","  精细分辨率通过的阈值链接匹配算法响应",[49,1058,1059,1062],{},[21,1060,1061],{},"link_scan_maximum_distance","  有效链接扫描之间的最大距离",[49,1064,1065,1068],{},[21,1066,1067],{},"Loop_search_maximum_distance","  循环闭合时考虑的扫描距离的最大阈值",[49,1070,1071,1074],{},[21,1072,1073],{},"do_loop_close","  是否进行循环闭合（如果不确定，答案是“true”）",[49,1076,1077,1080],{},[21,1078,1079],{},"Loop_match_minimum_chain_size","  寻找循环闭合的扫描的最小链长度",[49,1082,1083,1086],{},[21,1084,1085],{},"Loop_match_maximum_variance_coarse","  粗略搜索中传递给细化的阈值方差",[49,1088,1089,1092],{},[21,1090,1091],{},"Loop_match_minimum_response_coarse","  粗略搜索中环路闭合算法的阈值响应要传递给细化",[49,1094,1095,1098],{},[21,1096,1097],{},"Loop_match_minimum_response_fine","  精细搜索中循环闭合算法的阈值响应传递给细化",[49,1100,1101,1104],{},[21,1102,1103],{},"correlation_search_space_dimension"," 搜索网格大小以进行扫描相关性",[49,1106,1107,1110],{},[21,1108,1109],{},"correlation_search_space_resolution","  搜索网格分辨率以进行扫描相关性",[49,1112,1113,1116],{},[21,1114,1115],{},"correlation_search_space_smear_deviation","  用于平滑响应的多模态涂抹量",[49,1118,1119,1122],{},[21,1120,1121],{},"loop_search_space_dimension","  循环闭合算法的搜索网格的大小",[49,1124,1125,1128],{},[21,1126,1127],{},"loop_search_space_resolution","  搜索网格分辨率以进行循环闭合",[49,1130,1131,1116],{},[21,1132,1133],{},"loop_search_space_smear_deviation",[49,1135,1136,1139],{},[21,1137,1138],{},"distance_variance_penalty","  应用于匹配扫描的惩罚，因为它与里程姿势不同",[49,1141,1142,1139],{},[21,1143,1144],{},"angle_variance_penalty",[49,1146,1147,1150],{},[21,1148,1149],{},"fine_search_angle_offset","  用于测试精细扫描匹配的角度范围",[49,1152,1153,1156],{},[21,1154,1155],{},"rough_search_angle_offset","  用于测试粗略扫描匹配的角度范围",[49,1158,1159,1162],{},[21,1160,1161],{},"coarse_angle_resolution","  在扫描匹配中测试的偏移范围内的角度分辨率",[49,1164,1165,1168],{},[21,1166,1167],{},"minimum_angle_penalty","  确保尺寸不会膨胀的最小惩罚角度",[49,1170,1171,1174],{},[21,1172,1173],{},"minimum_distance_penalty","  扫描可以确保大小不会爆炸的最小惩罚",[49,1176,1177,1180],{},[21,1178,1179],{},"use_response_expansion","  如果没有找到可行的匹配，是否自动增加搜索网格大小",[14,1182,1183],{"id":1183},"slam_toolbox基本使用",[309,1185,1186],{},[49,1187,1188],{},"准备工作",[18,1190,1191],{},"在src目录下，请先调用如下指令在工作空间的src目录下创建一个功能包：",[68,1193,1195],{"className":70,"code":1194,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_slam_slam_toolbox --dependencies slam_toolbox\n",[74,1196,1197],{"__ignoreMap":32},[77,1198,1199,1202,1205,1208,1211,1215],{"class":79,"line":80},[77,1200,1201],{"class":83},"ros2",[77,1203,1204],{"class":87}," pkg",[77,1206,1207],{"class":87}," create",[77,1209,1210],{"class":87}," mycar_slam_slam_toolbox",[77,1212,1214],{"class":1213},"sj4cs"," --dependencies",[77,1216,1217],{"class":87}," slam_toolbox\n",[309,1219,1220],{"start":114},[49,1221,1222],{},"编写launch文件与参数文件",[18,1224,1225,1226,1229],{},"在功能包下，新建launch目录和params目录，launch目录下新建",[74,1227,1228],{},"online_sync_launch.py","文件并输入如下内容：",[68,1231,1235],{"className":1232,"code":1233,"language":1234,"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,1236,1237,1245,1249,1262,1274,1286,1298,1310,1314,1325,1342,1357,1362,1373,1382,1396,1409,1419,1427,1443,1457,1469,1474,1485,1496,1502,1513,1519,1532,1545,1557,1570,1575,1586,1591,1597,1603,1609,1614],{"__ignoreMap":32},[77,1238,1239,1242],{"class":79,"line":80},[77,1240,1241],{"class":97},"import",[77,1243,1244],{"class":104}," os\n",[77,1246,1247],{"class":79,"line":114},[77,1248,140],{"emptyLinePlaceholder":139},[77,1250,1251,1254,1257,1259],{"class":79,"line":136},[77,1252,1253],{"class":97},"from",[77,1255,1256],{"class":104}," launch ",[77,1258,1241],{"class":97},[77,1260,1261],{"class":104}," LaunchDescription\n",[77,1263,1264,1266,1269,1271],{"class":79,"line":143},[77,1265,1253],{"class":97},[77,1267,1268],{"class":104}," launch.actions ",[77,1270,1241],{"class":97},[77,1272,1273],{"class":104}," DeclareLaunchArgument\n",[77,1275,1276,1278,1281,1283],{"class":79,"line":150},[77,1277,1253],{"class":97},[77,1279,1280],{"class":104}," launch.substitutions ",[77,1282,1241],{"class":97},[77,1284,1285],{"class":104}," LaunchConfiguration\n",[77,1287,1288,1290,1293,1295],{"class":79,"line":162},[77,1289,1253],{"class":97},[77,1291,1292],{"class":104}," launch_ros.actions ",[77,1294,1241],{"class":97},[77,1296,1297],{"class":104}," Node\n",[77,1299,1300,1302,1305,1307],{"class":79,"line":174},[77,1301,1253],{"class":97},[77,1303,1304],{"class":104}," ament_index_python.packages ",[77,1306,1241],{"class":97},[77,1308,1309],{"class":104}," get_package_share_directory\n",[77,1311,1312],{"class":79,"line":179},[77,1313,140],{"emptyLinePlaceholder":139},[77,1315,1316,1319,1322],{"class":79,"line":184},[77,1317,1318],{"class":97},"def",[77,1320,1321],{"class":83}," generate_launch_description",[77,1323,1324],{"class":104},"():\n",[77,1326,1327,1330,1333,1336,1339],{"class":79,"line":195},[77,1328,1329],{"class":104},"    use_sim_time ",[77,1331,1332],{"class":97},"=",[77,1334,1335],{"class":104}," LaunchConfiguration(",[77,1337,1338],{"class":87},"'use_sim_time'",[77,1340,1341],{"class":104},")\n",[77,1343,1345,1348,1350,1352,1355],{"class":79,"line":1344},11,[77,1346,1347],{"class":104},"    slam_params_file ",[77,1349,1332],{"class":97},[77,1351,1335],{"class":104},[77,1353,1354],{"class":87},"'slam_params_file'",[77,1356,1341],{"class":104},[77,1358,1360],{"class":79,"line":1359},12,[77,1361,140],{"emptyLinePlaceholder":139},[77,1363,1365,1368,1370],{"class":79,"line":1364},13,[77,1366,1367],{"class":104},"    declare_use_sim_time_argument ",[77,1369,1332],{"class":97},[77,1371,1372],{"class":104}," DeclareLaunchArgument(\n",[77,1374,1376,1379],{"class":79,"line":1375},14,[77,1377,1378],{"class":87},"        'use_sim_time'",[77,1380,1381],{"class":104},",\n",[77,1383,1385,1389,1391,1394],{"class":79,"line":1384},15,[77,1386,1388],{"class":1387},"s4XuR","        default_value",[77,1390,1332],{"class":97},[77,1392,1393],{"class":87},"'false'",[77,1395,1381],{"class":104},[77,1397,1399,1402,1404,1407],{"class":79,"line":1398},16,[77,1400,1401],{"class":1387},"        description",[77,1403,1332],{"class":97},[77,1405,1406],{"class":87},"'Use simulation/Gazebo clock'",[77,1408,1341],{"class":104},[77,1410,1412,1415,1417],{"class":79,"line":1411},17,[77,1413,1414],{"class":104},"    declare_slam_params_file_cmd ",[77,1416,1332],{"class":97},[77,1418,1372],{"class":104},[77,1420,1422,1425],{"class":79,"line":1421},18,[77,1423,1424],{"class":87},"        'slam_params_file'",[77,1426,1381],{"class":104},[77,1428,1430,1432,1434,1437,1440],{"class":79,"line":1429},19,[77,1431,1388],{"class":1387},[77,1433,1332],{"class":97},[77,1435,1436],{"class":104},"os.path.join(get_package_share_directory(",[77,1438,1439],{"class":87},"\"mycar_slam_slam_toolbox\"",[77,1441,1442],{"class":104},"),\n",[77,1444,1446,1449,1452,1455],{"class":79,"line":1445},20,[77,1447,1448],{"class":87},"                                   'params'",[77,1450,1451],{"class":104},", ",[77,1453,1454],{"class":87},"'mapper_params_online_sync.yaml'",[77,1456,1442],{"class":104},[77,1458,1460,1462,1464,1467],{"class":79,"line":1459},21,[77,1461,1401],{"class":1387},[77,1463,1332],{"class":97},[77,1465,1466],{"class":87},"'Full path to the ROS2 parameters file to use for the slam_toolbox node'",[77,1468,1341],{"class":104},[77,1470,1472],{"class":79,"line":1471},22,[77,1473,140],{"emptyLinePlaceholder":139},[77,1475,1477,1480,1482],{"class":79,"line":1476},23,[77,1478,1479],{"class":104},"    start_sync_slam_toolbox_node ",[77,1481,1332],{"class":97},[77,1483,1484],{"class":104}," Node(\n",[77,1486,1488,1491,1493],{"class":79,"line":1487},24,[77,1489,1490],{"class":1387},"        parameters",[77,1492,1332],{"class":97},[77,1494,1495],{"class":104},"[\n",[77,1497,1499],{"class":79,"line":1498},25,[77,1500,1501],{"class":104},"          slam_params_file,\n",[77,1503,1505,1508,1510],{"class":79,"line":1504},26,[77,1506,1507],{"class":104},"          {",[77,1509,1338],{"class":87},[77,1511,1512],{"class":104},": use_sim_time}\n",[77,1514,1516],{"class":79,"line":1515},27,[77,1517,1518],{"class":104},"        ],\n",[77,1520,1522,1525,1527,1530],{"class":79,"line":1521},28,[77,1523,1524],{"class":1387},"        package",[77,1526,1332],{"class":97},[77,1528,1529],{"class":87},"'slam_toolbox'",[77,1531,1381],{"class":104},[77,1533,1535,1538,1540,1543],{"class":79,"line":1534},29,[77,1536,1537],{"class":1387},"        executable",[77,1539,1332],{"class":97},[77,1541,1542],{"class":87},"'sync_slam_toolbox_node'",[77,1544,1381],{"class":104},[77,1546,1548,1551,1553,1555],{"class":79,"line":1547},30,[77,1549,1550],{"class":1387},"        name",[77,1552,1332],{"class":97},[77,1554,1529],{"class":87},[77,1556,1381],{"class":104},[77,1558,1560,1563,1565,1568],{"class":79,"line":1559},31,[77,1561,1562],{"class":1387},"        output",[77,1564,1332],{"class":97},[77,1566,1567],{"class":87},"'screen'",[77,1569,1341],{"class":104},[77,1571,1573],{"class":79,"line":1572},32,[77,1574,140],{"emptyLinePlaceholder":139},[77,1576,1578,1581,1583],{"class":79,"line":1577},33,[77,1579,1580],{"class":104},"    ld ",[77,1582,1332],{"class":97},[77,1584,1585],{"class":104}," LaunchDescription()\n",[77,1587,1589],{"class":79,"line":1588},34,[77,1590,140],{"emptyLinePlaceholder":139},[77,1592,1594],{"class":79,"line":1593},35,[77,1595,1596],{"class":104},"    ld.add_action(declare_use_sim_time_argument)\n",[77,1598,1600],{"class":79,"line":1599},36,[77,1601,1602],{"class":104},"    ld.add_action(declare_slam_params_file_cmd)\n",[77,1604,1606],{"class":79,"line":1605},37,[77,1607,1608],{"class":104},"    ld.add_action(start_sync_slam_toolbox_node)\n",[77,1610,1612],{"class":79,"line":1611},38,[77,1613,140],{"emptyLinePlaceholder":139},[77,1615,1617,1620],{"class":79,"line":1616},39,[77,1618,1619],{"class":97},"    return",[77,1621,1622],{"class":104}," ld\n",[18,1624,1625,1626,1629,1630,1632],{},"该launch文件主要是加载了slam_toolbox下的sync_slam_toolbox_node节点，并且会从当前功能包的params下读取一个名为",[74,1627,1628],{},"mapper_params_online_sync.yaml","的配置文件。这个配置文件还不存在，接下来需要在params目录下新建",[74,1631,1628],{},"文件，并输入如下内容：",[68,1634,1638],{"className":1635,"code":1636,"language":1637,"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,1639,1640,1648,1655,1666,1676,1686,1696,1706,1716,1720,1730,1740,1750,1760,1773,1777,1782,1787,1792,1796,1806,1816,1829,1839,1849,1861,1871,1881,1891,1903,1913,1917,1926,1935,1945,1954,1964,1974,1987,1997,2008,2021,2035,2048,2062,2073,2078,2088,2099,2111,2116,2127,2137,2148,2153,2167,2180,2185,2199,2213,2227,2238,2248],{"__ignoreMap":32},[77,1641,1642,1645],{"class":79,"line":80},[77,1643,590],{"class":1644},"s9eBZ",[77,1646,1647],{"class":104},":\n",[77,1649,1650,1653],{"class":79,"line":114},[77,1651,1652],{"class":1644},"  ros__parameters",[77,1654,1647],{"class":104},[77,1656,1657,1660,1663],{"class":79,"line":136},[77,1658,1659],{"class":1644},"    solver_plugin",[77,1661,1662],{"class":104},": ",[77,1664,1665],{"class":87},"solver_plugins::CeresSolver\n",[77,1667,1668,1671,1673],{"class":79,"line":143},[77,1669,1670],{"class":1644},"    ceres_linear_solver",[77,1672,1662],{"class":104},[77,1674,1675],{"class":87},"SPARSE_NORMAL_CHOLESKY\n",[77,1677,1678,1681,1683],{"class":79,"line":150},[77,1679,1680],{"class":1644},"    ceres_preconditioner",[77,1682,1662],{"class":104},[77,1684,1685],{"class":87},"SCHUR_JACOBI\n",[77,1687,1688,1691,1693],{"class":79,"line":162},[77,1689,1690],{"class":1644},"    ceres_trust_strategy",[77,1692,1662],{"class":104},[77,1694,1695],{"class":87},"LEVENBERG_MARQUARDT\n",[77,1697,1698,1701,1703],{"class":79,"line":174},[77,1699,1700],{"class":1644},"    ceres_dogleg_type",[77,1702,1662],{"class":104},[77,1704,1705],{"class":87},"TRADITIONAL_DOGLEG\n",[77,1707,1708,1711,1713],{"class":79,"line":179},[77,1709,1710],{"class":1644},"    ceres_loss_function",[77,1712,1662],{"class":104},[77,1714,1715],{"class":87},"None\n",[77,1717,1718],{"class":79,"line":184},[77,1719,140],{"emptyLinePlaceholder":139},[77,1721,1722,1725,1727],{"class":79,"line":195},[77,1723,1724],{"class":1644},"    odom_frame",[77,1726,1662],{"class":104},[77,1728,1729],{"class":87},"odom\n",[77,1731,1732,1735,1737],{"class":79,"line":1344},[77,1733,1734],{"class":1644},"    map_frame",[77,1736,1662],{"class":104},[77,1738,1739],{"class":87},"map\n",[77,1741,1742,1745,1747],{"class":79,"line":1359},[77,1743,1744],{"class":1644},"    base_frame",[77,1746,1662],{"class":104},[77,1748,1749],{"class":87},"base_link\n",[77,1751,1752,1755,1757],{"class":79,"line":1364},[77,1753,1754],{"class":1644},"    scan_topic",[77,1756,1662],{"class":104},[77,1758,1759],{"class":87},"/scan\n",[77,1761,1762,1765,1767,1770],{"class":79,"line":1375},[77,1763,1764],{"class":1644},"    mode",[77,1766,1662],{"class":104},[77,1768,1769],{"class":87},"mapping",[77,1771,1772],{"class":146}," #localization\n",[77,1774,1775],{"class":79,"line":1384},[77,1776,140],{"emptyLinePlaceholder":139},[77,1778,1779],{"class":79,"line":1398},[77,1780,1781],{"class":146},"    #map_file_name: test_steve\n",[77,1783,1784],{"class":79,"line":1411},[77,1785,1786],{"class":146},"    #map_start_pose: [0.0, 0.0, 0.0]\n",[77,1788,1789],{"class":79,"line":1421},[77,1790,1791],{"class":146},"    #map_start_at_dock: true\n",[77,1793,1794],{"class":79,"line":1429},[77,1795,140],{"emptyLinePlaceholder":139},[77,1797,1798,1801,1803],{"class":79,"line":1445},[77,1799,1800],{"class":1644},"    debug_logging",[77,1802,1662],{"class":104},[77,1804,1805],{"class":1213},"false\n",[77,1807,1808,1811,1813],{"class":79,"line":1459},[77,1809,1810],{"class":1644},"    throttle_scans",[77,1812,1662],{"class":104},[77,1814,1815],{"class":1213},"1\n",[77,1817,1818,1821,1823,1826],{"class":79,"line":1471},[77,1819,1820],{"class":1644},"    transform_publish_period",[77,1822,1662],{"class":104},[77,1824,1825],{"class":1213},"0.02",[77,1827,1828],{"class":104}," \n",[77,1830,1831,1834,1836],{"class":79,"line":1476},[77,1832,1833],{"class":1644},"    map_update_interval",[77,1835,1662],{"class":104},[77,1837,1838],{"class":1213},"2.0\n",[77,1840,1841,1844,1846],{"class":79,"line":1487},[77,1842,1843],{"class":1644},"    resolution",[77,1845,1662],{"class":104},[77,1847,1848],{"class":1213},"0.05\n",[77,1850,1851,1854,1856,1859],{"class":79,"line":1498},[77,1852,1853],{"class":1644},"    max_laser_range",[77,1855,1662],{"class":104},[77,1857,1858],{"class":1213},"20.0",[77,1860,1828],{"class":104},[77,1862,1863,1866,1868],{"class":79,"line":1504},[77,1864,1865],{"class":1644},"    minimum_time_interval",[77,1867,1662],{"class":104},[77,1869,1870],{"class":1213},"0.5\n",[77,1872,1873,1876,1878],{"class":79,"line":1515},[77,1874,1875],{"class":1644},"    transform_timeout",[77,1877,1662],{"class":104},[77,1879,1880],{"class":1213},"0.2\n",[77,1882,1883,1886,1888],{"class":79,"line":1521},[77,1884,1885],{"class":1644},"    tf_buffer_duration",[77,1887,1662],{"class":104},[77,1889,1890],{"class":1213},"30.0\n",[77,1892,1893,1896,1898,1901],{"class":79,"line":1534},[77,1894,1895],{"class":1644},"    stack_size_to_use",[77,1897,1662],{"class":104},[77,1899,1900],{"class":1213},"40000000",[77,1902,1828],{"class":104},[77,1904,1905,1908,1910],{"class":79,"line":1547},[77,1906,1907],{"class":1644},"    enable_interactive_mode",[77,1909,1662],{"class":104},[77,1911,1912],{"class":1213},"true\n",[77,1914,1915],{"class":79,"line":1559},[77,1916,140],{"emptyLinePlaceholder":139},[77,1918,1919,1922,1924],{"class":79,"line":1572},[77,1920,1921],{"class":1644},"    use_scan_matching",[77,1923,1662],{"class":104},[77,1925,1912],{"class":1213},[77,1927,1928,1931,1933],{"class":79,"line":1577},[77,1929,1930],{"class":1644},"    use_scan_barycenter",[77,1932,1662],{"class":104},[77,1934,1912],{"class":1213},[77,1936,1937,1940,1942],{"class":79,"line":1588},[77,1938,1939],{"class":1644},"    minimum_travel_distance",[77,1941,1662],{"class":104},[77,1943,1944],{"class":1213},"0.1\n",[77,1946,1947,1950,1952],{"class":79,"line":1593},[77,1948,1949],{"class":1644},"    minimum_travel_heading",[77,1951,1662],{"class":104},[77,1953,1944],{"class":1213},[77,1955,1956,1959,1961],{"class":79,"line":1599},[77,1957,1958],{"class":1644},"    scan_buffer_size",[77,1960,1662],{"class":104},[77,1962,1963],{"class":1213},"100\n",[77,1965,1966,1969,1971],{"class":79,"line":1605},[77,1967,1968],{"class":1644},"    scan_buffer_maximum_scan_distance",[77,1970,1662],{"class":104},[77,1972,1973],{"class":1213},"10.0\n",[77,1975,1976,1979,1981,1984],{"class":79,"line":1611},[77,1977,1978],{"class":1644},"    link_match_minimum_response_fine",[77,1980,1662],{"class":104},[77,1982,1983],{"class":1213},"0.1",[77,1985,1986],{"class":104},"  \n",[77,1988,1989,1992,1994],{"class":79,"line":1616},[77,1990,1991],{"class":1644},"    link_scan_maximum_distance",[77,1993,1662],{"class":104},[77,1995,1996],{"class":1213},"1.5\n",[77,1998,2000,2003,2005],{"class":79,"line":1999},40,[77,2001,2002],{"class":1644},"    loop_search_maximum_distance",[77,2004,1662],{"class":104},[77,2006,2007],{"class":1213},"3.0\n",[77,2009,2011,2014,2016,2019],{"class":79,"line":2010},41,[77,2012,2013],{"class":1644},"    do_loop_closing",[77,2015,1662],{"class":104},[77,2017,2018],{"class":1213},"true",[77,2020,1828],{"class":104},[77,2022,2024,2027,2029,2032],{"class":79,"line":2023},42,[77,2025,2026],{"class":1644},"    loop_match_minimum_chain_size",[77,2028,1662],{"class":104},[77,2030,2031],{"class":1213},"10",[77,2033,2034],{"class":104},"           \n",[77,2036,2038,2041,2043,2046],{"class":79,"line":2037},43,[77,2039,2040],{"class":1644},"    loop_match_maximum_variance_coarse",[77,2042,1662],{"class":104},[77,2044,2045],{"class":1213},"3.0",[77,2047,1986],{"class":104},[77,2049,2051,2054,2056,2059],{"class":79,"line":2050},44,[77,2052,2053],{"class":1644},"    loop_match_minimum_response_coarse",[77,2055,1662],{"class":104},[77,2057,2058],{"class":1213},"0.35",[77,2060,2061],{"class":104},"    \n",[77,2063,2065,2068,2070],{"class":79,"line":2064},45,[77,2066,2067],{"class":1644},"    loop_match_minimum_response_fine",[77,2069,1662],{"class":104},[77,2071,2072],{"class":1213},"0.45\n",[77,2074,2076],{"class":79,"line":2075},46,[77,2077,140],{"emptyLinePlaceholder":139},[77,2079,2081,2084,2086],{"class":79,"line":2080},47,[77,2082,2083],{"class":1644},"    correlation_search_space_dimension",[77,2085,1662],{"class":104},[77,2087,1870],{"class":1213},[77,2089,2091,2094,2096],{"class":79,"line":2090},48,[77,2092,2093],{"class":1644},"    correlation_search_space_resolution",[77,2095,1662],{"class":104},[77,2097,2098],{"class":1213},"0.01\n",[77,2100,2102,2105,2107,2109],{"class":79,"line":2101},49,[77,2103,2104],{"class":1644},"    correlation_search_space_smear_deviation",[77,2106,1662],{"class":104},[77,2108,1983],{"class":1213},[77,2110,1828],{"class":104},[77,2112,2114],{"class":79,"line":2113},50,[77,2115,140],{"emptyLinePlaceholder":139},[77,2117,2119,2122,2124],{"class":79,"line":2118},51,[77,2120,2121],{"class":1644},"    loop_search_space_dimension",[77,2123,1662],{"class":104},[77,2125,2126],{"class":1213},"8.0\n",[77,2128,2130,2133,2135],{"class":79,"line":2129},52,[77,2131,2132],{"class":1644},"    loop_search_space_resolution",[77,2134,1662],{"class":104},[77,2136,1848],{"class":1213},[77,2138,2140,2143,2145],{"class":79,"line":2139},53,[77,2141,2142],{"class":1644},"    loop_search_space_smear_deviation",[77,2144,1662],{"class":104},[77,2146,2147],{"class":1213},"0.03\n",[77,2149,2151],{"class":79,"line":2150},54,[77,2152,140],{"emptyLinePlaceholder":139},[77,2154,2156,2159,2161,2164],{"class":79,"line":2155},55,[77,2157,2158],{"class":1644},"    distance_variance_penalty",[77,2160,1662],{"class":104},[77,2162,2163],{"class":1213},"0.5",[77,2165,2166],{"class":104},"      \n",[77,2168,2170,2173,2175,2178],{"class":79,"line":2169},56,[77,2171,2172],{"class":1644},"    angle_variance_penalty",[77,2174,1662],{"class":104},[77,2176,2177],{"class":1213},"1.0",[77,2179,2061],{"class":104},[77,2181,2183],{"class":79,"line":2182},57,[77,2184,140],{"emptyLinePlaceholder":139},[77,2186,2188,2191,2193,2196],{"class":79,"line":2187},58,[77,2189,2190],{"class":1644},"    fine_search_angle_offset",[77,2192,1662],{"class":104},[77,2194,2195],{"class":1213},"0.00349",[77,2197,2198],{"class":104},"     \n",[77,2200,2202,2205,2207,2210],{"class":79,"line":2201},59,[77,2203,2204],{"class":1644},"    coarse_search_angle_offset",[77,2206,1662],{"class":104},[77,2208,2209],{"class":1213},"0.349",[77,2211,2212],{"class":104},"   \n",[77,2214,2216,2219,2221,2224],{"class":79,"line":2215},60,[77,2217,2218],{"class":1644},"    coarse_angle_resolution",[77,2220,1662],{"class":104},[77,2222,2223],{"class":1213},"0.0349",[77,2225,2226],{"class":104},"        \n",[77,2228,2230,2233,2235],{"class":79,"line":2229},61,[77,2231,2232],{"class":1644},"    minimum_angle_penalty",[77,2234,1662],{"class":104},[77,2236,2237],{"class":1213},"0.9\n",[77,2239,2241,2244,2246],{"class":79,"line":2240},62,[77,2242,2243],{"class":1644},"    minimum_distance_penalty",[77,2245,1662],{"class":104},[77,2247,1870],{"class":1213},[77,2249,2251,2254,2256],{"class":79,"line":2250},63,[77,2252,2253],{"class":1644},"    use_response_expansion",[77,2255,1662],{"class":104},[77,2257,1912],{"class":1213},[18,2259,2260],{},"配置文件的内容需要根据实际情况进行动态调整。",[309,2262,2263],{"start":136},[49,2264,2265],{},"编辑配置文件",[18,2267,2268,2269,2272],{},"打开",[74,2270,2271],{},"CMakeLists.txt"," 并输入如下内容：",[68,2274,2278],{"className":2275,"code":2276,"language":2277,"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,2279,2280,2288,2296],{"__ignoreMap":32},[77,2281,2282,2285],{"class":79,"line":80},[77,2283,2284],{"class":97},"install",[77,2286,2287],{"class":104},"(DIRECTORY launch params\n",[77,2289,2290,2293],{"class":79,"line":114},[77,2291,2292],{"class":104},"  DESTINATION share/",[77,2294,2295],{"class":97},"${PROJECT_NAME}\n",[77,2297,2298],{"class":79,"line":136},[77,2299,1341],{"class":104},[309,2301,2302],{"start":143},[49,2303,2304],{},"编译",[18,2306,2307],{},"终端中进入当前工作空间，编译功能包：",[68,2309,2311],{"className":70,"code":2310,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_slam_slam_toolbox\n",[74,2312,2313],{"__ignoreMap":32},[77,2314,2315,2318,2321,2324],{"class":79,"line":80},[77,2316,2317],{"class":83},"colcon",[77,2319,2320],{"class":87}," build",[77,2322,2323],{"class":1213}," --packages-select",[77,2325,2326],{"class":87}," mycar_slam_slam_toolbox\n",[309,2328,2329],{"start":150},[49,2330,2331,2332,2337,2363,2368,2393,2401,2404,2405,2408,2409,2412],{},"执行",[309,2333,2334],{},[49,2335,2336],{},"请先调用如下指令启动仿真环境：",[68,2338,2340],{"className":70,"code":2339,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch demo_gazebo_sim gazebo_sim_robot_world.launch.py\n",[74,2341,2342,2350],{"__ignoreMap":32},[77,2343,2344,2347],{"class":79,"line":80},[77,2345,2346],{"class":1213},".",[77,2348,2349],{"class":87}," install/setup.bash\n",[77,2351,2352,2354,2357,2360],{"class":79,"line":114},[77,2353,1201],{"class":83},[77,2355,2356],{"class":87}," launch",[77,2358,2359],{"class":87}," demo_gazebo_sim",[77,2361,2362],{"class":87}," gazebo_sim_robot_world.launch.py\n",[309,2364,2365],{"start":136},[49,2366,2367],{},"然后在终端下进入当前工作空间，输入如下指令：",[68,2369,2371],{"className":70,"code":2370,"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,2372,2373,2379],{"__ignoreMap":32},[77,2374,2375,2377],{"class":79,"line":80},[77,2376,2346],{"class":1213},[77,2378,2349],{"class":87},[77,2380,2381,2383,2385,2387,2390],{"class":79,"line":114},[77,2382,1201],{"class":83},[77,2384,2356],{"class":87},[77,2386,1210],{"class":87},[77,2388,2389],{"class":87}," online_sync_launch.py",[77,2391,2392],{"class":87}," use_sim_time:=True\n",[309,2394,2395,2398],{"start":150},[49,2396,2397],{},"启动rviz2，将Fixed Frame设置为map，添加map插件并将话题设置为/map，即可显示slam_toolbox创建的地图了，当机器人运动时，地图也会随之更新。",[49,2399,2400],{},"use_sim_time:=True参数表示使用仿真的时间。",[2402,2403],"br",{},"  最后需要说明的是，本节内容使用的是",[74,2406,2407],{},"sync_slam_toolbox_node"," 节点，即以同步方式建图，而异步建图节点",[74,2410,2411],{},"async_slam_toolbox_node"," 的使用与同步类似。",[18,2414,2415],{},[30,2416],{"alt":32,"src":2417},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1746.webp",[18,2419,2420],{},"我们用键盘控制节点去控制机器人跑满整张地图，",[18,2422,2423],{},[30,2424],{"alt":32,"src":2425},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1747.webp",[18,2427,2428],{},"黑色：障碍物",[18,2430,2431],{},"白色：无障碍物区",[18,2433,2434],{},"灰色：未知区",[18,2436,2437],{},"SLAM是建图与定位，以上就是建图，那么定位是啥呢？",[18,2439,2440],{},"定位就是Slam会发布一个/tf，这里面会包含机器人到map之间的坐标变换。",[18,2442,2443],{},"这个/tf发布的具体是map到odom的坐标变换，所以需要你自己去处理odom和base_link之间的坐标关系。",[18,2445,2446],{},[30,2447],{"alt":32,"src":2448},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1748.webp",[18,2450,2451],{},"这样的设计，可以让整条坐标树是一个链式结构，避免base_link或者base_foot_print出现两个父类，这样计算量会变大。",[18,2453,2454],{},[21,2455,2456],{},"注意事项：",[309,2458,2459],{},[49,2460,2461,2462],{},"突然烂图\n",[309,2463,2464,2467],{},[49,2465,2466],{},"如果你的环境很简单，那么跑图的时候可能会突然烂图，这个时候，大概率是do_loop_closing的问题，你把do_loop_closing设置成false再试试。\n这个东西是SLAM用激光检测形状来匹配之前走过的路，如果他匹配到的形状差不多他会把当前这段轨迹和以前的轨迹连起来，然后重新优化整张 pose graph，让地图整体更一致。\n主要是为了防止odom会漂，因为 odom 会漂，机器人最后回到起点时，SLAM 可能觉得位置差了几十厘米，但是可以通过激光雷达矫正。",[49,2468,2469],{},"在窄通道尽量直线过去，不要原地旋转等等，这种窄通道炸了大概率是scan matching相关参数的问题。",[14,2471,2472],{"id":2472},"cartographer概述",[18,2474,2475],{},[21,2476,23],{},[18,2478,2479],{},"Cartographer是Google推出的一套基于图优化的激光SLAM算法库，支持二维和三维地图的构建。它结合了激光雷达和惯性测量单元（IMU）的数据，通过高效的算法实现实时、准确的定位和建图。",[18,2481,2482],{},[21,2483,365],{},[46,2485,2486,2492,2498,2504,2509],{},[49,2487,2488,2491],{},[21,2489,2490],{},"并行扫描匹配"," 利用并行计算技术加快扫描匹配速度，提高建图效率。",[49,2493,2494,2497],{},[21,2495,2496],{},"位姿图优化"," 通过图优化技术估计机器人的姿态和地图的拓扑结构，减少累积误差。",[49,2499,2500,2503],{},[21,2501,2502],{},"实时地图更新"," 在机器人移动过程中实时更新地图，确保地图的准确性和时效性。",[49,2505,2506,2508],{},[21,2507,633],{}," 通过回环检测识别机器人曾经访问过的区域，进一步减少累积误差，提高地图的全局一致性。",[49,2510,2511,2514],{},[21,2512,2513],{},"多传感器融合"," 支持激光雷达、IMU、里程计等多种传感器数据的融合，提高定位和建图的精度。",[18,2516,394],{},[46,2518,2519,2525,2531,2537,2543],{},[49,2520,2521,2524],{},[21,2522,2523],{},"高效稳定"," Cartographer的算法经过精心设计和优化，能够在复杂环境中高效稳定地运行。",[49,2526,2527,2530],{},[21,2528,2529],{},"高精度"," 通过图优化和回环检测技术提供高精度的定位和建图结果。",[49,2532,2533,2536],{},[21,2534,2535],{},"灵活性"," 支持二维和三维地图构建，适应不同应用场景的需求。",[49,2538,2539,2542],{},[21,2540,2541],{},"开源免费"," Cartographer是开源项目，用户可以免费获取和使用其源代码和文档。",[49,2544,2545,2548],{},[21,2546,2547],{},"社区支持"," 拥有活跃的社区支持体系，用户可以获取来自全球开发者的帮助和支持。",[14,2550,2551],{"id":2551},"cartographer安装",[18,2553,2554],{},"借助于Ubuntu的包资源管理器，可以使用二进制的方式安装cartographer，安装指令如下：",[68,2556,2558],{"className":70,"code":2557,"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-jazzy-cartographer\nsudo apt install ros-jazzy-cartographer-ros\n#jazzy\nsudo apt install ros-jazzy-cartographer\nsudo apt install ros-jazzy-cartographer-ros\n",[74,2559,2560,2581,2602,2606,2611,2622,2633,2637,2647],{"__ignoreMap":32},[77,2561,2562,2564,2566,2568,2570,2572,2574,2576,2578],{"class":79,"line":80},[77,2563,84],{"class":83},[77,2565,88],{"class":87},[77,2567,91],{"class":87},[77,2569,94],{"class":87},[77,2571,98],{"class":97},[77,2573,101],{"class":87},[77,2575,105],{"class":104},[77,2577,108],{"class":97},[77,2579,2580],{"class":87},"-cartographer\n",[77,2582,2583,2585,2587,2589,2591,2593,2595,2597,2599],{"class":79,"line":114},[77,2584,84],{"class":83},[77,2586,88],{"class":87},[77,2588,91],{"class":87},[77,2590,94],{"class":87},[77,2592,98],{"class":97},[77,2594,101],{"class":87},[77,2596,105],{"class":104},[77,2598,108],{"class":97},[77,2600,2601],{"class":87},"-cartographer-ros\n",[77,2603,2604],{"class":79,"line":136},[77,2605,140],{"emptyLinePlaceholder":139},[77,2607,2608],{"class":79,"line":143},[77,2609,2610],{"class":146},"# humble\n",[77,2612,2613,2615,2617,2619],{"class":79,"line":150},[77,2614,84],{"class":83},[77,2616,88],{"class":87},[77,2618,91],{"class":87},[77,2620,2621],{"class":87}," ros-jazzy-cartographer\n",[77,2623,2624,2626,2628,2630],{"class":79,"line":162},[77,2625,84],{"class":83},[77,2627,88],{"class":87},[77,2629,91],{"class":87},[77,2631,2632],{"class":87}," ros-jazzy-cartographer-ros\n",[77,2634,2635],{"class":79,"line":174},[77,2636,483],{"class":146},[77,2638,2639,2641,2643,2645],{"class":79,"line":179},[77,2640,84],{"class":83},[77,2642,88],{"class":87},[77,2644,91],{"class":87},[77,2646,2621],{"class":87},[77,2648,2649,2651,2653,2655],{"class":79,"line":184},[77,2650,84],{"class":83},[77,2652,88],{"class":87},[77,2654,91],{"class":87},[77,2656,2632],{"class":87},[18,2658,2659,2660,210],{},"上述两条安装指令中，前者用于安装cartographer的核心库，这个包不直接与ROS2集成，而是作为一个独立的算法库存在，为地图构建和定位提供底层的计算支持。后者则是cartographer在ROS2环境下的封装，它提供了与ROS2系统的接口，使得Cartographer算法能够在ROS2环境中运行。另外指令中的",[74,2661,209],{},[14,2663,2664],{"id":2664},"cartographer节点说明",[18,2666,2667,2668,2671,2672,2675],{},"在Cartographer框架中，",[74,2669,2670],{},"cartographer_node","和",[74,2673,2674],{},"cartographer_occupancy_grid_node","是两个关键的节点，它们各自承担着不同的角色和功能。详细介绍如下。",[334,2677,2678,2683,2686,2691],{},[18,2679,2680],{},[21,2681,2682],{},"cartographer_node：",[18,2684,2685],{},"主要负责订阅来自各种传感器的数据（如激光雷达、IMU、里程计等），并基于这些数据实时构建地图。它采用子图（submap）的方法来逐步构建和更新地图，确保定位的准确性和建图的实时性。",[18,2687,2688],{},[21,2689,2690],{},"cartographer_occupancy_grid_node：",[18,2692,2693,2694,2696,2697,2700],{},"该节点负责接收",[74,2695,2670],{},"发布的子图列表（",[74,2698,2699],{},"/submap_list","），并将其拼接成完整的栅格地图（occupancy grid map），然后发布这个地图。这个节点是地图生成的最终环节，它使得Cartographer能够输出人类可读且易于可视化的地图。",[18,2702,2703],{},"这两个节点的协同工作，前者负责实时构建和更新地图，后者则负责将子图拼接成完整的栅格地图并发布，使得Cartographer能够高效地实现SLAM功能。",[309,2705,2706],{},[49,2707,2708],{},"cartographer_node订阅的话题",[531,2710,2711,2721],{},[534,2712,2713],{},[537,2714,2715,2717,2719],{},[540,2716,543],{"align":542},[540,2718,546],{"align":542},[540,2720,549],{"align":542},[551,2722,2723,2731],{},[537,2724,2725,2727,2729],{},[556,2726,558],{"align":542},[556,2728,561],{"align":542},[556,2730,564],{"align":542},[537,2732,2733,2736,2739],{},[556,2734,2735],{"align":542},"/odom",[556,2737,2738],{"align":542},"nav_msgs/msg/Odometry",[556,2740,2741],{"align":542},"里程计消息",[309,2743,2744],{"start":114},[49,2745,2746],{},"cartographer_node发布的话题",[531,2748,2749,2759],{},[534,2750,2751],{},[537,2752,2753,2755,2757],{},[540,2754,543],{"align":542},[540,2756,546],{"align":542},[540,2758,549],{"align":542},[551,2760,2761,2772],{},[537,2762,2763,2766,2769],{},[556,2764,2765],{"align":542},"/scan_matched_points2",[556,2767,2768],{"align":542},"sensors_msgs/msg/PointCloud2",[556,2770,2771],{"align":542},"匹配好的点云数据，用于scan-to-submap matching",[537,2773,2774,2776,2779],{},[556,2775,2699],{"align":542},[556,2777,2778],{"align":542},"cartographer_ros_msgs/SubmapList",[556,2780,2781],{"align":542},"发布构建好的子图列表",[309,2783,2784],{"start":136},[49,2785,2786],{},"cartographer_node发布的服务",[531,2788,2789,2799],{},[534,2790,2791],{},[537,2792,2793,2795,2797],{},[540,2794,543],{"align":542},[540,2796,546],{"align":542},[540,2798,549],{"align":542},[551,2800,2801,2812,2823,2834,2845,2856],{},[537,2802,2803,2806,2809],{},[556,2804,2805],{"align":542},"/submap_query",[556,2807,2808],{"align":542},"cartographer_ros_msgs/srv/SubmapQuery",[556,2810,2811],{"align":542},"提供查询子图的服务，获取到查询的子图",[537,2813,2814,2817,2820],{},[556,2815,2816],{"align":542},"/start_trajectory",[556,2818,2819],{"align":542},"cartographer_ros_msgs/srv/StartTrajectory",[556,2821,2822],{"align":542},"开始一条轨迹",[537,2824,2825,2828,2831],{},[556,2826,2827],{"align":542},"/finish_trajectory",[556,2829,2830],{"align":542},"cartographer_ros_msgs/srv/FinishTrajectory",[556,2832,2833],{"align":542},"结束一条给定ID的轨迹",[537,2835,2836,2839,2842],{},[556,2837,2838],{"align":542},"/write_state",[556,2840,2841],{"align":542},"cartographer_ros_msgs/srv/WriteState",[556,2843,2844],{"align":542},"将当前状态写入磁盘文件中",[537,2846,2847,2850,2853],{},[556,2848,2849],{"align":542},"/get_trajectory_states",[556,2851,2852],{"align":542},"cartographer_ros_msgs/srv/GetTrajectoryStates",[556,2854,2855],{"align":542},"获取指定轨迹的状态",[537,2857,2858,2861,2864],{},[556,2859,2860],{"align":542},"/read_metrics",[556,2862,2863],{"align":542},"cartographer_ros_msgs/srv/ReadMetrics",[556,2865,2866],{"align":542},"读取性能指标",[309,2868,2869],{"start":143},[49,2870,2871],{},"cartographer_node参数",[18,2873,2874,2876],{},[74,2875,2670],{},"节点需要接收一个参数配置文件，该配置文件包含了地图构建、轨迹跟踪等所需的各项参数。",[309,2878,2879],{"start":150},[49,2880,2881],{},"cartographer_occupancy_grid_node订阅的话题",[531,2883,2884,2894],{},[534,2885,2886],{},[537,2887,2888,2890,2892],{},[540,2889,543],{"align":542},[540,2891,546],{"align":542},[540,2893,549],{"align":542},[551,2895,2896],{},[537,2897,2898,2900,2902],{},[556,2899,2699],{"align":542},[556,2901,2778],{"align":542},[556,2903,2904],{"align":542},"子图列表",[309,2906,2907],{"start":162},[49,2908,2909],{},"cartographer_occupancy_grid_node发布的话题",[531,2911,2912,2922],{},[534,2913,2914],{},[537,2915,2916,2918,2920],{},[540,2917,543],{"align":542},[540,2919,546],{"align":542},[540,2921,549],{"align":542},[551,2923,2924],{},[537,2925,2926,2928,2930],{},[556,2927,683],{"align":542},[556,2929,686],{"align":542},[556,2931,2932],{"align":542},"发布的栅格地图",[309,2934,2935],{"start":174},[49,2936,2937],{},"cartographer_occupancy_grid_node请求的服务",[531,2939,2940,2950],{},[534,2941,2942],{},[537,2943,2944,2946,2948],{},[540,2945,543],{"align":542},[540,2947,546],{"align":542},[540,2949,549],{"align":542},[551,2951,2952],{},[537,2953,2954,2956,2958],{},[556,2955,2805],{"align":542},[556,2957,2808],{"align":542},[556,2959,2960],{"align":542},"获取子图",[309,2962,2963],{"start":179},[49,2964,2965],{},"cartographer_occupancy_grid_node参数",[18,2967,2968,2970],{},[74,2969,2674],{},"节点需要配置地图的分辨率和更新周期等参数，以确保生成的栅格地图满足特定的精度和实时性要求。",[14,2972,2973],{"id":2973},"cartogarpher基本使用",[309,2975,2976],{},[49,2977,1188],{},[18,2979,1191],{},[68,2981,2983],{"className":70,"code":2982,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_slam_cartographer --dependencies cartographer\n",[74,2984,2985],{"__ignoreMap":32},[77,2986,2987,2989,2991,2993,2996,2998],{"class":79,"line":80},[77,2988,1201],{"class":83},[77,2990,1204],{"class":87},[77,2992,1207],{"class":87},[77,2994,2995],{"class":87}," mycar_slam_cartographer",[77,2997,1214],{"class":1213},[77,2999,3000],{"class":87}," cartographer\n",[309,3002,3003],{"start":114},[49,3004,1222],{},[18,3006,1225,3007,1229],{},[74,3008,3009],{},"cartographer.launch.py",[68,3011,3013],{"className":1232,"code":3012,"language":1234,"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,3014,3015,3025,3035,3045,3055,3061,3071,3075,3083,3087,3112,3135,3139,3148,3159,3170,3189,3199,3218,3231,3240,3245,3249,3258,3268,3279,3287,3301,3313,3317,3321,3328,3333,3338,3343,3348],{"__ignoreMap":32},[77,3016,3017,3019,3021,3023],{"class":79,"line":80},[77,3018,1253],{"class":97},[77,3020,1256],{"class":104},[77,3022,1241],{"class":97},[77,3024,1261],{"class":104},[77,3026,3027,3029,3031,3033],{"class":79,"line":114},[77,3028,1253],{"class":97},[77,3030,1268],{"class":104},[77,3032,1241],{"class":97},[77,3034,1273],{"class":104},[77,3036,3037,3039,3041,3043],{"class":79,"line":136},[77,3038,1253],{"class":97},[77,3040,1280],{"class":104},[77,3042,1241],{"class":97},[77,3044,1285],{"class":104},[77,3046,3047,3049,3051,3053],{"class":79,"line":143},[77,3048,1253],{"class":97},[77,3050,1292],{"class":104},[77,3052,1241],{"class":97},[77,3054,1297],{"class":104},[77,3056,3057,3059],{"class":79,"line":150},[77,3058,1241],{"class":97},[77,3060,1244],{"class":104},[77,3062,3063,3065,3067,3069],{"class":79,"line":162},[77,3064,1253],{"class":97},[77,3066,1304],{"class":104},[77,3068,1241],{"class":97},[77,3070,1309],{"class":104},[77,3072,3073],{"class":79,"line":174},[77,3074,140],{"emptyLinePlaceholder":139},[77,3076,3077,3079,3081],{"class":79,"line":179},[77,3078,1318],{"class":97},[77,3080,1321],{"class":83},[77,3082,1324],{"class":104},[77,3084,3085],{"class":79,"line":184},[77,3086,140],{"emptyLinePlaceholder":139},[77,3088,3089,3092,3094,3097,3099,3101,3104,3107,3110],{"class":79,"line":195},[77,3090,3091],{"class":104},"    use_sim_time_arg ",[77,3093,1332],{"class":97},[77,3095,3096],{"class":104}," DeclareLaunchArgument(",[77,3098,1338],{"class":87},[77,3100,1451],{"class":104},[77,3102,3103],{"class":1387},"default_value",[77,3105,3106],{"class":97}," =",[77,3108,3109],{"class":87}," 'false'",[77,3111,1341],{"class":104},[77,3113,3114,3117,3119,3121,3124,3126,3128,3130,3133],{"class":79,"line":1344},[77,3115,3116],{"class":104},"    resolution_arg ",[77,3118,1332],{"class":97},[77,3120,3096],{"class":104},[77,3122,3123],{"class":87},"'resolution'",[77,3125,1451],{"class":104},[77,3127,3103],{"class":1387},[77,3129,1332],{"class":97},[77,3131,3132],{"class":87},"'0.05'",[77,3134,1341],{"class":104},[77,3136,3137],{"class":79,"line":1359},[77,3138,140],{"emptyLinePlaceholder":139},[77,3140,3141,3144,3146],{"class":79,"line":1364},[77,3142,3143],{"class":104},"    cartographer_node ",[77,3145,1332],{"class":97},[77,3147,1484],{"class":104},[77,3149,3150,3152,3154,3157],{"class":79,"line":1375},[77,3151,1524],{"class":1387},[77,3153,3106],{"class":97},[77,3155,3156],{"class":87}," 'cartographer_ros'",[77,3158,1381],{"class":104},[77,3160,3161,3163,3165,3168],{"class":79,"line":1384},[77,3162,1537],{"class":1387},[77,3164,3106],{"class":97},[77,3166,3167],{"class":87}," 'cartographer_node'",[77,3169,1381],{"class":104},[77,3171,3172,3174,3176,3179,3181,3184,3186],{"class":79,"line":1398},[77,3173,1490],{"class":1387},[77,3175,3106],{"class":97},[77,3177,3178],{"class":104}," [{",[77,3180,1338],{"class":87},[77,3182,3183],{"class":104},": LaunchConfiguration(",[77,3185,1338],{"class":87},[77,3187,3188],{"class":104},")}],\n",[77,3190,3191,3194,3196],{"class":79,"line":1411},[77,3192,3193],{"class":1387},"        arguments",[77,3195,3106],{"class":97},[77,3197,3198],{"class":104}," [\n",[77,3200,3201,3204,3207,3210,3213,3216],{"class":79,"line":1421},[77,3202,3203],{"class":87},"            '-configuration_directory'",[77,3205,3206],{"class":104},", os.path.join(get_package_share_directory(",[77,3208,3209],{"class":87},"\"mycar_slam_cartographer\"",[77,3211,3212],{"class":104},"),",[77,3214,3215],{"class":87},"\"params\"",[77,3217,1442],{"class":104},[77,3219,3220,3223,3225,3228],{"class":79,"line":1429},[77,3221,3222],{"class":87},"            '-configuration_basename'",[77,3224,1451],{"class":104},[77,3226,3227],{"class":87},"'mycar.lua'",[77,3229,3230],{"class":104},"],\n",[77,3232,3233,3235,3237],{"class":79,"line":1445},[77,3234,1562],{"class":1387},[77,3236,3106],{"class":97},[77,3238,3239],{"class":87}," 'screen'\n",[77,3241,3242],{"class":79,"line":1459},[77,3243,3244],{"class":104},"    )\n",[77,3246,3247],{"class":79,"line":1471},[77,3248,140],{"emptyLinePlaceholder":139},[77,3250,3251,3254,3256],{"class":79,"line":1476},[77,3252,3253],{"class":104},"    cartographer_occupancy_grid_node ",[77,3255,1332],{"class":97},[77,3257,1484],{"class":104},[77,3259,3260,3262,3264,3266],{"class":79,"line":1487},[77,3261,1524],{"class":1387},[77,3263,3106],{"class":97},[77,3265,3156],{"class":87},[77,3267,1381],{"class":104},[77,3269,3270,3272,3274,3277],{"class":79,"line":1498},[77,3271,1537],{"class":1387},[77,3273,3106],{"class":97},[77,3275,3276],{"class":87}," 'cartographer_occupancy_grid_node'",[77,3278,1381],{"class":104},[77,3280,3281,3283,3285],{"class":79,"line":1504},[77,3282,1490],{"class":1387},[77,3284,3106],{"class":97},[77,3286,3198],{"class":104},[77,3288,3289,3292,3294,3296,3298],{"class":79,"line":1515},[77,3290,3291],{"class":104},"            {",[77,3293,1338],{"class":87},[77,3295,3183],{"class":104},[77,3297,1338],{"class":87},[77,3299,3300],{"class":104},")},\n",[77,3302,3303,3305,3307,3309,3311],{"class":79,"line":1521},[77,3304,3291],{"class":104},[77,3306,3123],{"class":87},[77,3308,3183],{"class":104},[77,3310,3123],{"class":87},[77,3312,3188],{"class":104},[77,3314,3315],{"class":79,"line":1534},[77,3316,3244],{"class":104},[77,3318,3319],{"class":79,"line":1547},[77,3320,140],{"emptyLinePlaceholder":139},[77,3322,3323,3325],{"class":79,"line":1559},[77,3324,1619],{"class":97},[77,3326,3327],{"class":104}," LaunchDescription([\n",[77,3329,3330],{"class":79,"line":1572},[77,3331,3332],{"class":104},"        use_sim_time_arg,\n",[77,3334,3335],{"class":79,"line":1577},[77,3336,3337],{"class":104},"        resolution_arg,\n",[77,3339,3340],{"class":79,"line":1588},[77,3341,3342],{"class":104},"        cartographer_node,\n",[77,3344,3345],{"class":79,"line":1593},[77,3346,3347],{"class":104},"        cartographer_occupancy_grid_node,\n",[77,3349,3350],{"class":79,"line":1599},[77,3351,3352],{"class":104},"    ])\n",[18,3354,3355],{},"该launch文件主要是加载了cartographer_ros下的cartographer_node与cartographer_occupancy_grid_node节点，并且会从当前功能包的params下读取一个名为mycar.lua的配置文件。这个配置文件还不存在，接下来需要在params目录下新建mycar.lua文件，并输入如下内容：",[68,3357,3361],{"className":3358,"code":3359,"language":3360,"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,3362,3363,3374,3384,3388,3398,3408,3418,3434,3449,3464,3479,3494,3509,3523,3537,3551,3566,3581,3595,3609,3624,3639,3654,3669,3684,3699,3713,3728,3742,3747,3751,3766,3770,3786,3801,3816,3830,3844,3872,3876,3897,3916,3920,3925,3929],{"__ignoreMap":32},[77,3364,3365,3368,3371],{"class":79,"line":80},[77,3366,3367],{"class":1213},"include",[77,3369,3370],{"class":87}," \"map_builder.lua\" ",[77,3372,3373],{"class":146},"-- 地图构建器\n",[77,3375,3376,3378,3381],{"class":79,"line":114},[77,3377,3367],{"class":1213},[77,3379,3380],{"class":87}," \"trajectory_builder.lua\" ",[77,3382,3383],{"class":146},"-- 轨迹构建器\n",[77,3385,3386],{"class":79,"line":136},[77,3387,140],{"emptyLinePlaceholder":139},[77,3389,3390,3393,3395],{"class":79,"line":143},[77,3391,3392],{"class":104},"options ",[77,3394,1332],{"class":97},[77,3396,3397],{"class":104}," {\n",[77,3399,3400,3403,3405],{"class":79,"line":150},[77,3401,3402],{"class":104},"  map_builder ",[77,3404,1332],{"class":97},[77,3406,3407],{"class":104}," MAP_BUILDER,\n",[77,3409,3410,3413,3415],{"class":79,"line":162},[77,3411,3412],{"class":104},"  trajectory_builder ",[77,3414,1332],{"class":97},[77,3416,3417],{"class":104}," TRAJECTORY_BUILDER,\n",[77,3419,3420,3423,3425,3428,3431],{"class":79,"line":174},[77,3421,3422],{"class":104},"  map_frame ",[77,3424,1332],{"class":97},[77,3426,3427],{"class":87}," \"map\"",[77,3429,3430],{"class":104},",  ",[77,3432,3433],{"class":146},"-- 地图坐标系\n",[77,3435,3436,3439,3441,3444,3446],{"class":79,"line":179},[77,3437,3438],{"class":104},"  tracking_frame ",[77,3440,1332],{"class":97},[77,3442,3443],{"class":87}," \"base_link\"",[77,3445,1451],{"class":104},[77,3447,3448],{"class":146},"-- 跟踪的坐标系，可以是基坐标系、雷达或imu的坐标系\n",[77,3450,3451,3454,3456,3459,3461],{"class":79,"line":184},[77,3452,3453],{"class":104},"  published_frame ",[77,3455,1332],{"class":97},[77,3457,3458],{"class":87}," \"odom\"",[77,3460,1451],{"class":104},[77,3462,3463],{"class":146},"-- cartographer发布的位姿（pose）的坐标系\n",[77,3465,3466,3469,3471,3474,3476],{"class":79,"line":195},[77,3467,3468],{"class":104},"  odom_frame ",[77,3470,1332],{"class":97},[77,3472,3473],{"class":87}," \"carto_odom\"",[77,3475,3430],{"class":104},[77,3477,3478],{"class":146},"-- cartographer 计算后优化的里程计，并非机器人本身里程计\n",[77,3480,3481,3484,3486,3489,3491],{"class":79,"line":1344},[77,3482,3483],{"class":104},"  provide_odom_frame ",[77,3485,1332],{"class":97},[77,3487,3488],{"class":1213}," false",[77,3490,1451],{"class":104},[77,3492,3493],{"class":146},"-- 是否发布cartographer的里程计\n",[77,3495,3496,3499,3501,3504,3506],{"class":79,"line":1359},[77,3497,3498],{"class":104},"  publish_frame_projected_to_2d ",[77,3500,1332],{"class":97},[77,3502,3503],{"class":1213}," true",[77,3505,1451],{"class":104},[77,3507,3508],{"class":146},"-- 是否转换成2d(无俯仰、滚动的情况下为 true)\n",[77,3510,3511,3514,3516,3518,3520],{"class":79,"line":1364},[77,3512,3513],{"class":104},"  use_odometry ",[77,3515,1332],{"class":97},[77,3517,3503],{"class":1213},[77,3519,1451],{"class":104},[77,3521,3522],{"class":146},"-- 是否订阅里程计数据\n",[77,3524,3525,3528,3530,3532,3534],{"class":79,"line":1375},[77,3526,3527],{"class":104},"  use_nav_sat ",[77,3529,1332],{"class":97},[77,3531,3488],{"class":1213},[77,3533,1451],{"class":104},[77,3535,3536],{"class":146},"-- 是否订阅GPS\n",[77,3538,3539,3542,3544,3546,3548],{"class":79,"line":1384},[77,3540,3541],{"class":104},"  use_landmarks ",[77,3543,1332],{"class":97},[77,3545,3488],{"class":1213},[77,3547,1451],{"class":104},[77,3549,3550],{"class":146},"-- 是否订阅路标\n",[77,3552,3553,3556,3558,3561,3563],{"class":79,"line":1398},[77,3554,3555],{"class":104},"  num_laser_scans ",[77,3557,1332],{"class":97},[77,3559,3560],{"class":1213}," 1",[77,3562,1451],{"class":104},[77,3564,3565],{"class":146},"-- 订阅的雷达的数量\n",[77,3567,3568,3571,3573,3576,3578],{"class":79,"line":1411},[77,3569,3570],{"class":104},"  num_multi_echo_laser_scans ",[77,3572,1332],{"class":97},[77,3574,3575],{"class":1213}," 0",[77,3577,1451],{"class":104},[77,3579,3580],{"class":146},"-- 订阅的多层回波激光雷达数量\n",[77,3582,3583,3586,3588,3590,3592],{"class":79,"line":1421},[77,3584,3585],{"class":104},"  num_subdivisions_per_laser_scan ",[77,3587,1332],{"class":97},[77,3589,3560],{"class":1213},[77,3591,1451],{"class":104},[77,3593,3594],{"class":146},"-- 将激光雷达的数据拆分成多少部分发布\n",[77,3596,3597,3600,3602,3604,3606],{"class":79,"line":1429},[77,3598,3599],{"class":104},"  num_point_clouds ",[77,3601,1332],{"class":97},[77,3603,3575],{"class":1213},[77,3605,1451],{"class":104},[77,3607,3608],{"class":146},"-- 订阅多线激光雷达的数量\n",[77,3610,3611,3614,3616,3619,3621],{"class":79,"line":1445},[77,3612,3613],{"class":104},"  lookup_transform_timeout_sec ",[77,3615,1332],{"class":97},[77,3617,3618],{"class":1213}," 1.5",[77,3620,1451],{"class":104},[77,3622,3623],{"class":146},"-- 坐标变换超时时间\n",[77,3625,3626,3629,3631,3634,3636],{"class":79,"line":1459},[77,3627,3628],{"class":104},"  submap_publish_period_sec ",[77,3630,1332],{"class":97},[77,3632,3633],{"class":1213}," 0.5",[77,3635,1451],{"class":104},[77,3637,3638],{"class":146},"-- 发布子图的时间间隔\n",[77,3640,3641,3644,3646,3649,3651],{"class":79,"line":1471},[77,3642,3643],{"class":104},"  pose_publish_period_sec ",[77,3645,1332],{"class":97},[77,3647,3648],{"class":1213}," 5e-3",[77,3650,1451],{"class":104},[77,3652,3653],{"class":146},"-- 发布pose的时间间隔\n",[77,3655,3656,3659,3661,3664,3666],{"class":79,"line":1476},[77,3657,3658],{"class":104},"  trajectory_publish_period_sec ",[77,3660,1332],{"class":97},[77,3662,3663],{"class":1213}," 30e-3",[77,3665,1451],{"class":104},[77,3667,3668],{"class":146},"-- 发布轨迹的时间间隔\n",[77,3670,3671,3674,3676,3679,3681],{"class":79,"line":1487},[77,3672,3673],{"class":104},"  rangefinder_sampling_ratio ",[77,3675,1332],{"class":97},[77,3677,3678],{"class":1213}," 1.",[77,3680,1451],{"class":104},[77,3682,3683],{"class":146},"-- 雷达采样比例\n",[77,3685,3686,3689,3691,3694,3696],{"class":79,"line":1498},[77,3687,3688],{"class":104},"  odometry_sampling_ratio ",[77,3690,1332],{"class":97},[77,3692,3693],{"class":1213}," 0.8",[77,3695,1451],{"class":104},[77,3697,3698],{"class":146},"-- 里程计采样比例(如果里程计精度低，可以减小该设置值)\n",[77,3700,3701,3704,3706,3708,3710],{"class":79,"line":1504},[77,3702,3703],{"class":104},"  fixed_frame_pose_sampling_ratio ",[77,3705,1332],{"class":97},[77,3707,3678],{"class":1213},[77,3709,1451],{"class":104},[77,3711,3712],{"class":146},"-- 参考坐标系采样比例\n",[77,3714,3715,3718,3720,3722,3725],{"class":79,"line":1515},[77,3716,3717],{"class":104},"  imu_sampling_ratio ",[77,3719,1332],{"class":97},[77,3721,3678],{"class":1213},[77,3723,3724],{"class":104},",",[77,3726,3727],{"class":146},"-- imu采样比例\n",[77,3729,3730,3733,3735,3737,3739],{"class":79,"line":1521},[77,3731,3732],{"class":104},"  landmarks_sampling_ratio ",[77,3734,1332],{"class":97},[77,3736,3678],{"class":1213},[77,3738,1451],{"class":104},[77,3740,3741],{"class":146},"-- 路标采样比例\n",[77,3743,3744],{"class":79,"line":1534},[77,3745,3746],{"class":104},"}\n",[77,3748,3749],{"class":79,"line":1547},[77,3750,140],{"emptyLinePlaceholder":139},[77,3752,3753,3756,3759,3761,3763],{"class":79,"line":1559},[77,3754,3755],{"class":104},"MAP_BUILDER.",[77,3757,3758],{"class":83},"use_trajectory_builder_2d",[77,3760,3106],{"class":97},[77,3762,3503],{"class":1213},[77,3764,3765],{"class":146}," -- 启用2D轨迹构建器\n",[77,3767,3768],{"class":79,"line":1572},[77,3769,140],{"emptyLinePlaceholder":139},[77,3771,3772,3775,3778,3780,3783],{"class":79,"line":1577},[77,3773,3774],{"class":104},"TRAJECTORY_BUILDER_2D.",[77,3776,3777],{"class":83},"min_range",[77,3779,3106],{"class":97},[77,3781,3782],{"class":1213}," 0.15",[77,3784,3785],{"class":146}," -- 最小雷达有效距离\n",[77,3787,3788,3790,3793,3795,3798],{"class":79,"line":1588},[77,3789,3774],{"class":104},[77,3791,3792],{"class":83},"max_range",[77,3794,3106],{"class":97},[77,3796,3797],{"class":1213}," 6.0",[77,3799,3800],{"class":146}," -- 最大雷达有效距离\n",[77,3802,3803,3805,3808,3810,3813],{"class":79,"line":1593},[77,3804,3774],{"class":104},[77,3806,3807],{"class":83},"missing_data_ray_length",[77,3809,3106],{"class":97},[77,3811,3812],{"class":1213}," 3.",[77,3814,3815],{"class":146}," -- 缺失数据的射线长度\n",[77,3817,3818,3820,3823,3825,3827],{"class":79,"line":1599},[77,3819,3774],{"class":104},[77,3821,3822],{"class":83},"use_imu_data",[77,3824,3106],{"class":97},[77,3826,3488],{"class":1213},[77,3828,3829],{"class":146}," -- 是否使用 imu 数据\n",[77,3831,3832,3834,3837,3839,3841],{"class":79,"line":1605},[77,3833,3774],{"class":104},[77,3835,3836],{"class":83},"use_online_correlative_scan_matching",[77,3838,3106],{"class":97},[77,3840,3503],{"class":1213},[77,3842,3843],{"class":146}," -- 是否使用在线相关扫描匹配\n",[77,3845,3846,3848,3851,3853,3856,3858,3861,3864,3866,3869],{"class":79,"line":1611},[77,3847,3774],{"class":104},[77,3849,3850],{"class":83},"motion_filter",[77,3852,2346],{"class":104},[77,3854,3855],{"class":83},"max_angle_radians",[77,3857,3106],{"class":97},[77,3859,3860],{"class":1213}," math.rad",[77,3862,3863],{"class":104},"(",[77,3865,1983],{"class":1213},[77,3867,3868],{"class":104},") ",[77,3870,3871],{"class":146},"-- 运动滤波器的最大角度限制（以弧度为单位）\n",[77,3873,3874],{"class":79,"line":1616},[77,3875,140],{"emptyLinePlaceholder":139},[77,3877,3878,3881,3884,3886,3889,3891,3894],{"class":79,"line":1999},[77,3879,3880],{"class":104},"POSE_GRAPH.",[77,3882,3883],{"class":83},"constraint_builder",[77,3885,2346],{"class":104},[77,3887,3888],{"class":83},"min_score",[77,3890,3106],{"class":97},[77,3892,3893],{"class":1213}," 0.65",[77,3895,3896],{"class":146}," -- 建约束时的最小分数\n",[77,3898,3899,3901,3903,3905,3908,3910,3913],{"class":79,"line":2010},[77,3900,3880],{"class":104},[77,3902,3883],{"class":83},[77,3904,2346],{"class":104},[77,3906,3907],{"class":83},"global_localization_min_score",[77,3909,3106],{"class":97},[77,3911,3912],{"class":1213}," 0.7",[77,3914,3915],{"class":146}," -- 全局定位时的最小分数\n",[77,3917,3918],{"class":79,"line":2023},[77,3919,140],{"emptyLinePlaceholder":139},[77,3921,3922],{"class":79,"line":2037},[77,3923,3924],{"class":146},"-- POSE_GRAPH.optimize_every_n_nodes = 0\n",[77,3926,3927],{"class":79,"line":2050},[77,3928,140],{"emptyLinePlaceholder":139},[77,3930,3931,3934],{"class":79,"line":2064},[77,3932,3933],{"class":97},"return",[77,3935,3936],{"class":104}," options\n",[18,3938,2260],{},[309,3940,3941],{"start":136},[49,3942,2265],{},[18,3944,2268,3945,2272],{},[74,3946,2271],{},[68,3948,3949],{"className":2275,"code":2276,"language":2277,"meta":32,"style":32},[74,3950,3951,3957,3963],{"__ignoreMap":32},[77,3952,3953,3955],{"class":79,"line":80},[77,3954,2284],{"class":97},[77,3956,2287],{"class":104},[77,3958,3959,3961],{"class":79,"line":114},[77,3960,2292],{"class":104},[77,3962,2295],{"class":97},[77,3964,3965],{"class":79,"line":136},[77,3966,1341],{"class":104},[309,3968,3969],{"start":143},[49,3970,2304],{},[18,3972,2307],{},[68,3974,3976],{"className":70,"code":3975,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_slam_cartographer\n",[74,3977,3978],{"__ignoreMap":32},[77,3979,3980,3982,3984,3986],{"class":79,"line":80},[77,3981,2317],{"class":83},[77,3983,2320],{"class":87},[77,3985,2323],{"class":1213},[77,3987,3988],{"class":87}," mycar_slam_cartographer\n",[309,3990,3991],{"start":150},[49,3992,2331],{},[18,3994,3995],{},"（1）请先调用如下指令启动仿真环境：",[68,3997,3998],{"className":70,"code":2339,"language":72,"meta":32,"style":32},[74,3999,4000,4006],{"__ignoreMap":32},[77,4001,4002,4004],{"class":79,"line":80},[77,4003,2346],{"class":1213},[77,4005,2349],{"class":87},[77,4007,4008,4010,4012,4014],{"class":79,"line":114},[77,4009,1201],{"class":83},[77,4011,2356],{"class":87},[77,4013,2359],{"class":87},[77,4015,2362],{"class":87},[18,4017,4018],{},"（2）然后在终端下进入当前工作空间，输入如下指令：",[68,4020,4022],{"className":70,"code":4021,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_slam_cartographer cartographer.launch.py use_sim_time:=True\n",[74,4023,4024,4030],{"__ignoreMap":32},[77,4025,4026,4028],{"class":79,"line":80},[77,4027,2346],{"class":1213},[77,4029,2349],{"class":87},[77,4031,4032,4034,4036,4038,4041],{"class":79,"line":114},[77,4033,1201],{"class":83},[77,4035,2356],{"class":87},[77,4037,2995],{"class":87},[77,4039,4040],{"class":87}," cartographer.launch.py",[77,4042,2392],{"class":87},[18,4044,4045],{},"（3）启动rviz2，将Fixed Frame设置为map，添加map插件并将话题设置为/map，即可显示创建的地图了，当机器人运动时，地图也会随之更新。",[18,4047,4048],{},[30,4049],{"alt":32,"src":4050},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1749.webp",[18,4052,4053],{},[30,4054],{"alt":32,"src":4055},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1750.webp",[18,4057,4058],{},[30,4059],{"alt":32,"src":4060},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1751.webp",[10,4062,4063],{"id":4063},"地图服务",[18,4065,4066,4067,4070],{},"SLAM建图时，地图数据是保存在内存中的，这也意味着，一旦节点关闭，数据也会一并被释放，而更合理的实现应该是将构建的地图序列化到的磁盘以持久化存储，并且后期还要通过反序列化读取磁盘的地图数据以做其他操作。在Nav2中已经已经封装好了地图序列化和反序列化的相关功能包，该包是：",[74,4068,4069],{},"nav2_map_server","。",[18,4072,4073,4074,4076,4077,4079,4080,2671,4083,4086,4087,4089,4090,4092],{},"在",[74,4075,4069],{},"中，可以通过话题和服务接口与Nav2系统的其余部分进行交互。",[74,4078,4069],{},"包下有两个重要的节点，分别是",[74,4081,4082],{},"map_saver_cli",[74,4084,4085],{},"map_server","，通过",[74,4088,4082],{},"节点则可以保存地图，而",[74,4091,4085],{},"节点则可以在启动时显示地图。",[14,4094,4096],{"id":4095},"保存地图序列化","保存地图(序列化)",[4098,4099,4100],"h5",{"id":4100},"地图保存节点说明",[18,4102,4073,4103,4105,4106,4109],{},[74,4104,4069],{},"中的地图保存节点是",[74,4107,4108],{},"map_saver_server","，该节点相关信息如下。",[309,4111,4112],{},[49,4113,529],{},[531,4115,4116,4127],{},[534,4117,4118],{},[537,4119,4120,4122,4125],{},[540,4121,543],{"align":542},[540,4123,4124],{"align":542},"接口",[540,4126,549],{"align":542},[551,4128,4129],{},[537,4130,4131,4133,4135],{},[556,4132,683],{"align":542},[556,4134,686],{"align":542},[556,4136,4137],{"align":542},"SLAM节点发布的地图数据",[309,4139,4140],{"start":114},[49,4141,823],{},[46,4143,4144,4150,4156,4162],{},[49,4145,4146,4149],{},[21,4147,4148],{},"save_map_timeout","  保存地图操作的最大等待时间。",[49,4151,4152,4155],{},[21,4153,4154],{},"free_thresh_default","  栅格单元被认为未被占用的概率阈值。",[49,4157,4158,4161],{},[21,4159,4160],{},"occupied_thresh_default","  栅格单元被认为占用的概率阈值。",[49,4163,4164,4167],{},[21,4165,4166],{},"map_subscribe_transient_local","  节点重启后消息不保留，默认为 true。",[309,4169,4170],{"start":136},[49,4171,4082],{},[18,4173,4174,4175,4177,4178,4180,4181,4183],{},"另外，而为了便于使用，在",[74,4176,4108],{},"的基础之上还封装了一个名为",[74,4179,4082],{},"的可执行程序，它可以以实参的方式更方便的设置地图保存相关数据，并且后续执行时也是调用",[74,4182,4082],{},"，其实参列表如下：",[46,4185,4186,4192,4198,4204,4210,4216],{},[49,4187,4188,4191],{},[21,4189,4190],{},"-t"," 订阅的地图话题。",[49,4193,4194,4197],{},[21,4195,4196],{},"-f"," 地图存储路径。",[49,4199,4200,4203],{},[21,4201,4202],{},"--occ"," 栅格单元被认为占用的概率阈值。",[49,4205,4206,4209],{},[21,4207,4208],{},"--free"," 栅格单元被认为未被占用的概率阈值。",[49,4211,4212,4215],{},[21,4213,4214],{},"--fmt"," 图片格式。",[49,4217,4218,4221],{},[21,4219,4220],{},"--mode"," 地图模式，trinary(默认)或scale或raw。",[4098,4223,4224],{"id":4224},"地图保存基本操作",[18,4226,4227],{},[21,4228,1188],{},[18,4230,4231],{},"请先启动仿真或实体机器人，然后启动SLAM相关节点，实现基本的建图功能。",[18,4233,4234],{},[21,4235,4236],{},"保存地图",[18,4238,4239],{},"SLAM建图完毕，在终端下进入工作空间，调用如下指令保存地图：",[68,4241,4243],{"className":70,"code":4242,"language":72,"meta":32,"style":32},"ros2 run nav2_map_server map_saver_cli -f map/my_map\n",[74,4244,4245],{"__ignoreMap":32},[77,4246,4247,4249,4252,4255,4258,4261],{"class":79,"line":80},[77,4248,1201],{"class":83},[77,4250,4251],{"class":87}," run",[77,4253,4254],{"class":87}," nav2_map_server",[77,4256,4257],{"class":87}," map_saver_cli",[77,4259,4260],{"class":1213}," -f",[77,4262,4263],{"class":87}," map/my_map\n",[18,4265,4266,4267,4271,4272,2671,4275,4070],{},"上述指令将订阅/map话题，并把/map话题里的数据保存为文件，在工作空间下的map目录(",[4268,4269,4270],"em",{},"需要自行创建该目录，否则将会抛出异常",")中，生成两个文件，分别名为：",[74,4273,4274],{},"my_map.yaml",[74,4276,4277],{},"my_map.pgm",[18,4279,4280],{},[30,4281],{"alt":32,"src":4282},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1752.webp",[18,4284,4285],{},[30,4286],{"alt":32,"src":4287},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1753.webp",[4098,4289,4290],{"id":4290},"地图接口",[18,4292,4293],{},"在Nav2中地图相关的接口主要有两个：",[46,4295,4296,4302],{},[49,4297,4298,4301],{},[21,4299,4300],{},"nav_msgs/msg/MapMetaData"," 地图元数据，包括地图的宽度、高度、分辨率等。",[49,4303,4304,4306],{},[21,4305,686],{}," 地图栅格数据，一般会在rviz中以图形化的方式显示。",[18,4308,4309],{},[21,4310,4300],{},[18,4312,4313,4314,4317],{},"调用指令",[74,4315,4316],{},"ros2 interface show nav_msgs/msg/MapMetaData","查看接口格式，显示如下内容（注释已汉化）：",[68,4319,4321],{"className":70,"code":4320,"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,4322,4323,4327,4332,4336,4341,4349,4357,4365,4369,4374,4382,4386,4391,4399,4403,4408,4415,4419,4424,4432,4440,4448,4455,4462,4470,4480,4489,4498],{"__ignoreMap":32},[77,4324,4325],{"class":79,"line":80},[77,4326,140],{"emptyLinePlaceholder":139},[77,4328,4329],{"class":79,"line":114},[77,4330,4331],{"class":146},"# 它包含了关于OccupancyGrid特性的基本信息\n",[77,4333,4334],{"class":79,"line":136},[77,4335,140],{"emptyLinePlaceholder":139},[77,4337,4338],{"class":79,"line":143},[77,4339,4340],{"class":146},"# 地图加载时间\n",[77,4342,4343,4346],{"class":79,"line":150},[77,4344,4345],{"class":83},"builtin_interfaces/Time",[77,4347,4348],{"class":87}," map_load_time\n",[77,4350,4351,4354],{"class":79,"line":162},[77,4352,4353],{"class":83},"        int32",[77,4355,4356],{"class":87}," sec\n",[77,4358,4359,4362],{"class":79,"line":174},[77,4360,4361],{"class":83},"        uint32",[77,4363,4364],{"class":87}," nanosec\n",[77,4366,4367],{"class":79,"line":179},[77,4368,140],{"emptyLinePlaceholder":139},[77,4370,4371],{"class":79,"line":184},[77,4372,4373],{"class":146},"# 地图分辨率 [米/像素]\n",[77,4375,4376,4379],{"class":79,"line":195},[77,4377,4378],{"class":83},"float32",[77,4380,4381],{"class":87}," resolution\n",[77,4383,4384],{"class":79,"line":1344},[77,4385,140],{"emptyLinePlaceholder":139},[77,4387,4388],{"class":79,"line":1359},[77,4389,4390],{"class":146},"# 地图宽度 [像素]\n",[77,4392,4393,4396],{"class":79,"line":1364},[77,4394,4395],{"class":83},"uint32",[77,4397,4398],{"class":87}," width\n",[77,4400,4401],{"class":79,"line":1375},[77,4402,140],{"emptyLinePlaceholder":139},[77,4404,4405],{"class":79,"line":1384},[77,4406,4407],{"class":146},"# 地图高度 [像素]\n",[77,4409,4410,4412],{"class":79,"line":1398},[77,4411,4395],{"class":83},[77,4413,4414],{"class":87}," height\n",[77,4416,4417],{"class":79,"line":1411},[77,4418,140],{"emptyLinePlaceholder":139},[77,4420,4421],{"class":79,"line":1421},[77,4422,4423],{"class":146},"#地图的原点坐标[米，米，弧度]。这是地图中单元格(0,0)左下角在现实世界中的位置和方向。\n",[77,4425,4426,4429],{"class":79,"line":1429},[77,4427,4428],{"class":83},"geometry_msgs/Pose",[77,4430,4431],{"class":87}," origin\n",[77,4433,4434,4437],{"class":79,"line":1445},[77,4435,4436],{"class":83},"        Point",[77,4438,4439],{"class":87}," position\n",[77,4441,4442,4445],{"class":79,"line":1459},[77,4443,4444],{"class":83},"                float64",[77,4446,4447],{"class":87}," x\n",[77,4449,4450,4452],{"class":79,"line":1471},[77,4451,4444],{"class":83},[77,4453,4454],{"class":87}," y\n",[77,4456,4457,4459],{"class":79,"line":1476},[77,4458,4444],{"class":83},[77,4460,4461],{"class":87}," z\n",[77,4463,4464,4467],{"class":79,"line":1487},[77,4465,4466],{"class":83},"        Quaternion",[77,4468,4469],{"class":87}," orientation\n",[77,4471,4472,4474,4477],{"class":79,"line":1498},[77,4473,4444],{"class":83},[77,4475,4476],{"class":87}," x",[77,4478,4479],{"class":1213}," 0\n",[77,4481,4482,4484,4487],{"class":79,"line":1504},[77,4483,4444],{"class":83},[77,4485,4486],{"class":87}," y",[77,4488,4479],{"class":1213},[77,4490,4491,4493,4496],{"class":79,"line":1515},[77,4492,4444],{"class":83},[77,4494,4495],{"class":87}," z",[77,4497,4479],{"class":1213},[77,4499,4500,4502,4505],{"class":79,"line":1521},[77,4501,4444],{"class":83},[77,4503,4504],{"class":87}," w",[77,4506,4507],{"class":1213}," 1\n",[18,4509,4510],{},[21,4511,686],{},[18,4513,4313,4514,4317],{},[74,4515,4516],{},"ros2 interface show nav_msgs/msg/OccupancyGrid",[68,4518,4520],{"className":70,"code":4519,"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,4521,4522,4526,4531,4539,4547,4554,4561,4569,4573,4578,4586,4592,4598,4604,4611,4617,4623,4630,4637,4644,4650,4656,4663,4671,4679,4687,4695,4699,4704,4708,4713,4717,4722,4726,4731,4735,4740,4744,4749,4753,4758,4762,4767,4771,4776,4780,4785,4789,4794],{"__ignoreMap":32},[77,4523,4524],{"class":79,"line":80},[77,4525,140],{"emptyLinePlaceholder":139},[77,4527,4528],{"class":79,"line":114},[77,4529,4530],{"class":146},"# 它代表一个二维网格地图。\n",[77,4532,4533,4536],{"class":79,"line":136},[77,4534,4535],{"class":83},"std_msgs/Header",[77,4537,4538],{"class":87}," header\n",[77,4540,4541,4544],{"class":79,"line":143},[77,4542,4543],{"class":83},"        builtin_interfaces/Time",[77,4545,4546],{"class":87}," stamp\n",[77,4548,4549,4552],{"class":79,"line":150},[77,4550,4551],{"class":83},"                int32",[77,4553,4356],{"class":87},[77,4555,4556,4559],{"class":79,"line":162},[77,4557,4558],{"class":83},"                uint32",[77,4560,4364],{"class":87},[77,4562,4563,4566],{"class":79,"line":174},[77,4564,4565],{"class":83},"        string",[77,4567,4568],{"class":87}," frame_id\n",[77,4570,4571],{"class":79,"line":179},[77,4572,140],{"emptyLinePlaceholder":139},[77,4574,4575],{"class":79,"line":184},[77,4576,4577],{"class":146},"# 地图元数据\n",[77,4579,4580,4583],{"class":79,"line":195},[77,4581,4582],{"class":83},"MapMetaData",[77,4584,4585],{"class":87}," info\n",[77,4587,4588,4590],{"class":79,"line":1344},[77,4589,4543],{"class":83},[77,4591,4348],{"class":87},[77,4593,4594,4596],{"class":79,"line":1359},[77,4595,4551],{"class":83},[77,4597,4356],{"class":87},[77,4599,4600,4602],{"class":79,"line":1364},[77,4601,4558],{"class":83},[77,4603,4364],{"class":87},[77,4605,4606,4609],{"class":79,"line":1375},[77,4607,4608],{"class":83},"        float32",[77,4610,4381],{"class":87},[77,4612,4613,4615],{"class":79,"line":1384},[77,4614,4361],{"class":83},[77,4616,4398],{"class":87},[77,4618,4619,4621],{"class":79,"line":1398},[77,4620,4361],{"class":83},[77,4622,4414],{"class":87},[77,4624,4625,4628],{"class":79,"line":1411},[77,4626,4627],{"class":83},"        geometry_msgs/Pose",[77,4629,4431],{"class":87},[77,4631,4632,4635],{"class":79,"line":1421},[77,4633,4634],{"class":83},"                Point",[77,4636,4439],{"class":87},[77,4638,4639,4642],{"class":79,"line":1429},[77,4640,4641],{"class":83},"                        float64",[77,4643,4447],{"class":87},[77,4645,4646,4648],{"class":79,"line":1445},[77,4647,4641],{"class":83},[77,4649,4454],{"class":87},[77,4651,4652,4654],{"class":79,"line":1459},[77,4653,4641],{"class":83},[77,4655,4461],{"class":87},[77,4657,4658,4661],{"class":79,"line":1471},[77,4659,4660],{"class":83},"                Quaternion",[77,4662,4469],{"class":87},[77,4664,4665,4667,4669],{"class":79,"line":1476},[77,4666,4641],{"class":83},[77,4668,4476],{"class":87},[77,4670,4479],{"class":1213},[77,4672,4673,4675,4677],{"class":79,"line":1487},[77,4674,4641],{"class":83},[77,4676,4486],{"class":87},[77,4678,4479],{"class":1213},[77,4680,4681,4683,4685],{"class":79,"line":1498},[77,4682,4641],{"class":83},[77,4684,4495],{"class":87},[77,4686,4479],{"class":1213},[77,4688,4689,4691,4693],{"class":79,"line":1504},[77,4690,4641],{"class":83},[77,4692,4504],{"class":87},[77,4694,4507],{"class":1213},[77,4696,4697],{"class":79,"line":1515},[77,4698,140],{"emptyLinePlaceholder":139},[77,4700,4701],{"class":79,"line":1521},[77,4702,4703],{"class":146},"# 地图数据按照行优先的顺序进行排列，\n",[77,4705,4706],{"class":79,"line":1534},[77,4707,140],{"emptyLinePlaceholder":139},[77,4709,4710],{"class":79,"line":1547},[77,4711,4712],{"class":146},"# 这意味着首先填充第一行的所有单元格，\n",[77,4714,4715],{"class":79,"line":1559},[77,4716,140],{"emptyLinePlaceholder":139},[77,4718,4719],{"class":79,"line":1572},[77,4720,4721],{"class":146},"# 然后填充第二行，依此类推。\n",[77,4723,4724],{"class":79,"line":1577},[77,4725,140],{"emptyLinePlaceholder":139},[77,4727,4728],{"class":79,"line":1588},[77,4729,4730],{"class":146},"# 起始单元格是(0,0)，也就是地图的左上角。\n",[77,4732,4733],{"class":79,"line":1593},[77,4734,140],{"emptyLinePlaceholder":139},[77,4736,4737],{"class":79,"line":1599},[77,4738,4739],{"class":146},"# 单元格(1, 0)紧接着(0,0)，是x方向上紧邻的下一个单元格。\n",[77,4741,4742],{"class":79,"line":1605},[77,4743,140],{"emptyLinePlaceholder":139},[77,4745,4746],{"class":79,"line":1611},[77,4747,4748],{"class":146},"# 而单元格(0, 1)则位于第一行的第二个位置，其索引等于地图的宽度（info.width），\n",[77,4750,4751],{"class":79,"line":1616},[77,4752,140],{"emptyLinePlaceholder":139},[77,4754,4755],{"class":79,"line":1999},[77,4756,4757],{"class":146},"# 然后才是(1, 1)单元格，即第二行的第二个单元格。\n",[77,4759,4760],{"class":79,"line":2010},[77,4761,140],{"emptyLinePlaceholder":139},[77,4763,4764],{"class":79,"line":2023},[77,4765,4766],{"class":146},"# 关于地图数据的值，它们根据具体的应用需求来定义。但在很多情况下，\n",[77,4768,4769],{"class":79,"line":2037},[77,4770,140],{"emptyLinePlaceholder":139},[77,4772,4773],{"class":79,"line":2050},[77,4774,4775],{"class":146},"# 会使用0表示该单元格是未占用的，即机器人可以安全通过；\n",[77,4777,4778],{"class":79,"line":2064},[77,4779,140],{"emptyLinePlaceholder":139},[77,4781,4782],{"class":79,"line":2075},[77,4783,4784],{"class":146},"# 1表示该单元格是确定占用的，即存在障碍物；\n",[77,4786,4787],{"class":79,"line":2080},[77,4788,140],{"emptyLinePlaceholder":139},[77,4790,4791],{"class":79,"line":2090},[77,4792,4793],{"class":146},"# 而-1表示该单元格的状态是未知的，即机器人尚未探测到该区域的状态。\n",[77,4795,4796,4799],{"class":79,"line":2101},[77,4797,4798],{"class":83},"int8[]",[77,4800,4801],{"class":87}," data\n",[4098,4803,4804],{"id":4804},"地图存储格式",[18,4806,4807,4808,4810],{},"在 ",[21,4809,4224],{},"  一节中，地图保存后后生成两个文件，这两个文件就是用来存储序列化后的地图数据的。其中，my_map.pgm是一张图片资源，使用图片查看程序打开即可，而my_map.yaml保存的是地图的元数据信息，用于描述图片，内容格式如下：",[68,4812,4814],{"className":1635,"code":4813,"language":1637,"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,4815,4816,4826,4835,4843,4867,4877,4887],{"__ignoreMap":32},[77,4817,4818,4821,4823],{"class":79,"line":80},[77,4819,4820],{"class":1644},"image",[77,4822,1662],{"class":104},[77,4824,4825],{"class":87},"my_map.pgm\n",[77,4827,4828,4830,4832],{"class":79,"line":114},[77,4829,871],{"class":1644},[77,4831,1662],{"class":104},[77,4833,4834],{"class":87},"trinary\n",[77,4836,4837,4839,4841],{"class":79,"line":136},[77,4838,978],{"class":1644},[77,4840,1662],{"class":104},[77,4842,1848],{"class":1213},[77,4844,4845,4848,4851,4854,4856,4859,4861,4864],{"class":79,"line":143},[77,4846,4847],{"class":1644},"origin",[77,4849,4850],{"class":104},": [",[77,4852,4853],{"class":1213},"-0.955",[77,4855,1451],{"class":104},[77,4857,4858],{"class":1213},"-10.9",[77,4860,1451],{"class":104},[77,4862,4863],{"class":1213},"0",[77,4865,4866],{"class":104},"]\n",[77,4868,4869,4872,4874],{"class":79,"line":150},[77,4870,4871],{"class":1644},"negate",[77,4873,1662],{"class":104},[77,4875,4876],{"class":1213},"0\n",[77,4878,4879,4882,4884],{"class":79,"line":162},[77,4880,4881],{"class":1644},"occupied_thresh",[77,4883,1662],{"class":104},[77,4885,4886],{"class":1213},"0.65\n",[77,4888,4889,4892,4894],{"class":79,"line":174},[77,4890,4891],{"class":1644},"free_thresh",[77,4893,1662],{"class":104},[77,4895,4896],{"class":1213},"0.25\n",[18,4898,4899],{},[21,4900,4901],{},"参数解释：",[46,4903,4904,4909,4914,4919,4924,4929,4934],{},[49,4905,4906,4908],{},[21,4907,4820],{},"  被描述的图片资源路径，可以是绝对路径也可以是相对路径。",[49,4910,4911,4913],{},[21,4912,978],{}," 图片分片率(单位: m/像素)。",[49,4915,4916,4918],{},[21,4917,4847],{}," 地图中左下像素的二维姿态，为（x，y，z），偏航为逆时针旋转（偏航=0 表示无旋转）。",[49,4920,4921,4923],{},[21,4922,4881],{}," 占用概率大于此阈值的像素被视为完全占用。",[49,4925,4926,4928],{},[21,4927,4891],{}," 占用率小于此阈值的像素被视为完全空闲。",[49,4930,4931,4933],{},[21,4932,4871],{}," 是否应该颠倒白色/黑色 自由/占用的语义。",[49,4935,4936,4938],{},[21,4937,871],{},"  地图模式，trinary(默认)或scale或raw。",[14,4940,4942],{"id":4941},"读取地图反序列化","读取地图(反序列化)",[4098,4944,4945],{"id":4945},"地图读取节点说明",[18,4947,4073,4948,4950,4951,4109],{},[74,4949,4069],{},"中的地图读取节点是",[74,4952,4085],{},[18,4954,4955],{},[21,4956,664],{},[531,4958,4959,4969],{},[534,4960,4961],{},[537,4962,4963,4965,4967],{},[540,4964,543],{"align":542},[540,4966,4124],{"align":542},[540,4968,549],{"align":542},[551,4970,4971],{},[537,4972,4973,4975,4977],{},[556,4974,683],{"align":542},[556,4976,686],{"align":542},[556,4978,4979],{"align":542},"地图数据",[18,4981,4982],{},[21,4983,823],{},[46,4985,4986,4992,4998],{},[49,4987,4988,4991],{},[21,4989,4990],{},"frame_id","  地图坐标系名称。",[49,4993,4994,4997],{},[21,4995,4996],{},"topic_name","  话题名称。",[49,4999,5000,5003],{},[21,5001,5002],{},"yaml_filename","  地图数据源。",[4098,5005,5006],{"id":5006},"地图读取基本操作",[18,5008,5009],{},[21,5010,1188],{},[18,5012,5013],{},"请先调用如下指令在工作空间的src目录下创建一个功能包：",[68,5015,5017],{"className":70,"code":5016,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_map_server --dependencies nav2_map_server\n",[74,5018,5019],{"__ignoreMap":32},[77,5020,5021,5023,5025,5027,5030,5032],{"class":79,"line":80},[77,5022,1201],{"class":83},[77,5024,1204],{"class":87},[77,5026,1207],{"class":87},[77,5028,5029],{"class":87}," mycar_map_server",[77,5031,1214],{"class":1213},[77,5033,5034],{"class":87}," nav2_map_server\n",[18,5036,5037],{},"在功能包下，新建launch文件夹，并在CMakeLists.txt中添加如下配置：",[68,5039,5041],{"className":2275,"code":5040,"language":2277,"meta":32,"style":32},"install(DIRECTORY launch DESTINATION share/${PROJECT_NAME})\n",[74,5042,5043],{"__ignoreMap":32},[77,5044,5045,5047,5050,5053],{"class":79,"line":80},[77,5046,2284],{"class":97},[77,5048,5049],{"class":104},"(DIRECTORY launch DESTINATION share/",[77,5051,5052],{"class":97},"${PROJECT_NAME}",[77,5054,1341],{"class":104},[18,5056,5057],{},[30,5058],{"alt":32,"src":5059},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1754.webp",[18,5061,5062],{},[21,5063,5064],{},"读取地图",[18,5066,5067,5068,5070],{},"使用",[74,5069,4085],{},"读取地图时，常用的方式有两种，分别是使用终端指令与launch文件集成。两种方式效果一致，都可以以话题的方式发布地图消息。",[68,5072,5074],{"className":70,"code":5073,"language":72,"meta":32,"style":32},"colcon build\nsource ./install/setup.bash\n",[74,5075,5076,5083],{"__ignoreMap":32},[77,5077,5078,5080],{"class":79,"line":80},[77,5079,2317],{"class":83},[77,5081,5082],{"class":87}," build\n",[77,5084,5085,5088],{"class":79,"line":114},[77,5086,5087],{"class":1213},"source",[77,5089,5090],{"class":87}," ./install/setup.bash\n",[18,5092,5093],{},[21,5094,5095],{},"方式1：终端指令",[18,5097,5098],{},"请在终端下进入工作空间，输入如下指令：",[68,5100,5102],{"className":70,"code":5101,"language":72,"meta":32,"style":32},"ros2 run nav2_map_server map_server --ros-args -p yaml_filename:=map/my_map.yaml\n",[74,5103,5104],{"__ignoreMap":32},[77,5105,5106,5108,5110,5112,5115,5118,5121],{"class":79,"line":80},[77,5107,1201],{"class":83},[77,5109,4251],{"class":87},[77,5111,4254],{"class":87},[77,5113,5114],{"class":87}," map_server",[77,5116,5117],{"class":1213}," --ros-args",[77,5119,5120],{"class":1213}," -p",[77,5122,5123],{"class":87}," yaml_filename:=map/my_map.yaml\n",[18,5125,5126,5127,5129],{},"由于",[74,5128,4085],{},"是具有生命周期的节点，所以接下来还需要对节点进行配置和激活，请新开终端执行如下指令：",[68,5131,5133],{"className":70,"code":5132,"language":72,"meta":32,"style":32},"ros2 lifecycle set /map_server configure\nros2 lifecycle set /map_server activate\n",[74,5134,5135,5151],{"__ignoreMap":32},[77,5136,5137,5139,5142,5145,5148],{"class":79,"line":80},[77,5138,1201],{"class":83},[77,5140,5141],{"class":87}," lifecycle",[77,5143,5144],{"class":87}," set",[77,5146,5147],{"class":87}," /map_server",[77,5149,5150],{"class":87}," configure\n",[77,5152,5153,5155,5157,5159,5161],{"class":79,"line":114},[77,5154,1201],{"class":83},[77,5156,5141],{"class":87},[77,5158,5144],{"class":87},[77,5160,5147],{"class":87},[77,5162,5163],{"class":87}," activate\n",[18,5165,5166,5167,5170,5171,5173],{},"执行完毕若无异常，再调用",[74,5168,5169],{},"ros2 topic list","即可查看到",[74,5172,683],{},"话题了，说明地图消息已经被发布了。",[18,5175,5176],{},[21,5177,5178],{},"方式2：launch集成",[18,5180,5181,5182,5184,5185,5188],{},"方式1需要手动设置",[74,5183,4085],{},"生命周期，步骤稍显繁琐，因此，我们还可以将该节点集成进launch文件，以简化启动步骤。在launch目录下新建名为",[74,5186,5187],{},"map_server.launch.py","的文件，并输入如下内容：",[68,5190,5192],{"className":1232,"code":5191,"language":1234,"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,5193,5194,5200,5210,5220,5228,5248,5257,5269,5281,5292,5303,5323,5334,5339,5348,5360,5372,5384,5395,5412,5426,5440,5444],{"__ignoreMap":32},[77,5195,5196,5198],{"class":79,"line":80},[77,5197,1241],{"class":97},[77,5199,1244],{"class":104},[77,5201,5202,5204,5206,5208],{"class":79,"line":114},[77,5203,1253],{"class":97},[77,5205,1256],{"class":104},[77,5207,1241],{"class":97},[77,5209,1261],{"class":104},[77,5211,5212,5214,5216,5218],{"class":79,"line":136},[77,5213,1253],{"class":97},[77,5215,1292],{"class":104},[77,5217,1241],{"class":97},[77,5219,1297],{"class":104},[77,5221,5222,5224,5226],{"class":79,"line":143},[77,5223,1318],{"class":97},[77,5225,1321],{"class":83},[77,5227,1324],{"class":104},[77,5229,5230,5233,5235,5238,5241,5243,5246],{"class":79,"line":150},[77,5231,5232],{"class":104},"  map_file ",[77,5234,1332],{"class":97},[77,5236,5237],{"class":104}," os.path.join(",[77,5239,5240],{"class":87},"'map'",[77,5242,1451],{"class":104},[77,5244,5245],{"class":87},"'my_map.yaml'",[77,5247,1341],{"class":104},[77,5249,5250,5253,5255],{"class":79,"line":162},[77,5251,5252],{"class":104},"  map_server_node ",[77,5254,1332],{"class":97},[77,5256,1484],{"class":104},[77,5258,5259,5262,5264,5267],{"class":79,"line":174},[77,5260,5261],{"class":1387},"      package",[77,5263,1332],{"class":97},[77,5265,5266],{"class":87},"'nav2_map_server'",[77,5268,1381],{"class":104},[77,5270,5271,5274,5276,5279],{"class":79,"line":179},[77,5272,5273],{"class":1387},"      executable",[77,5275,1332],{"class":97},[77,5277,5278],{"class":87},"'map_server'",[77,5280,1381],{"class":104},[77,5282,5283,5286,5288,5290],{"class":79,"line":184},[77,5284,5285],{"class":1387},"      name",[77,5287,1332],{"class":97},[77,5289,5278],{"class":87},[77,5291,1381],{"class":104},[77,5293,5294,5297,5299,5301],{"class":79,"line":195},[77,5295,5296],{"class":1387},"      output",[77,5298,1332],{"class":97},[77,5300,1567],{"class":87},[77,5302,1381],{"class":104},[77,5304,5305,5308,5310,5313,5315,5317,5320],{"class":79,"line":1344},[77,5306,5307],{"class":1387},"      parameters",[77,5309,1332],{"class":97},[77,5311,5312],{"class":104},"[{",[77,5314,1338],{"class":87},[77,5316,1662],{"class":104},[77,5318,5319],{"class":1213},"True",[77,5321,5322],{"class":104},"},\n",[77,5324,5325,5328,5331],{"class":79,"line":1359},[77,5326,5327],{"class":104},"                  {",[77,5329,5330],{"class":87},"'yaml_filename'",[77,5332,5333],{"class":104},":map_file}]\n",[77,5335,5336],{"class":79,"line":1364},[77,5337,5338],{"class":104},"  )\n",[77,5340,5341,5344,5346],{"class":79,"line":1375},[77,5342,5343],{"class":104},"  manager_mapper_node ",[77,5345,1332],{"class":97},[77,5347,1484],{"class":104},[77,5349,5350,5353,5355,5358],{"class":79,"line":1384},[77,5351,5352],{"class":1387},"    package",[77,5354,1332],{"class":97},[77,5356,5357],{"class":87},"'nav2_lifecycle_manager'",[77,5359,1381],{"class":104},[77,5361,5362,5365,5367,5370],{"class":79,"line":1398},[77,5363,5364],{"class":1387},"    executable",[77,5366,1332],{"class":97},[77,5368,5369],{"class":87},"'lifecycle_manager'",[77,5371,1381],{"class":104},[77,5373,5374,5377,5379,5382],{"class":79,"line":1411},[77,5375,5376],{"class":1387},"    name",[77,5378,1332],{"class":97},[77,5380,5381],{"class":87},"'lifecycle_manager_mapper'",[77,5383,1381],{"class":104},[77,5385,5386,5389,5391,5393],{"class":79,"line":1421},[77,5387,5388],{"class":1387},"    output",[77,5390,1332],{"class":97},[77,5392,1567],{"class":87},[77,5394,1381],{"class":104},[77,5396,5397,5400,5402,5404,5406,5408,5410],{"class":79,"line":1429},[77,5398,5399],{"class":1387},"    parameters",[77,5401,1332],{"class":97},[77,5403,5312],{"class":104},[77,5405,1338],{"class":87},[77,5407,1662],{"class":104},[77,5409,5319],{"class":1213},[77,5411,5322],{"class":104},[77,5413,5414,5417,5420,5422,5424],{"class":79,"line":1445},[77,5415,5416],{"class":104},"      {",[77,5418,5419],{"class":87},"'autostart'",[77,5421,1662],{"class":104},[77,5423,5319],{"class":1213},[77,5425,5322],{"class":104},[77,5427,5428,5430,5433,5435,5437],{"class":79,"line":1459},[77,5429,5416],{"class":104},[77,5431,5432],{"class":87},"'node_names'",[77,5434,4850],{"class":104},[77,5436,5278],{"class":87},[77,5438,5439],{"class":104},"]}]\n",[77,5441,5442],{"class":79,"line":1471},[77,5443,5338],{"class":104},[77,5445,5446,5449],{"class":79,"line":1476},[77,5447,5448],{"class":97},"  return",[77,5450,5451],{"class":104}," LaunchDescription([map_server_node,manager_mapper_node])\n",[18,5453,5454,5455,5458,5459,5462],{},"在该文件中，使用了功能包中",[74,5456,5457],{},"nav2_lifecycle_manager","中的",[74,5460,5461],{},"lifecycle_manager","组件，该组件可以自动的配置、激活其所管理的具有生命周期的节点。构建功能包后并执行该launch文件，其最终效果与方式一类似。",[68,5464,5466],{"className":70,"code":5465,"language":72,"meta":32,"style":32},"ros2 launch mycar_map_server map_server.launch.py\n",[74,5467,5468],{"__ignoreMap":32},[77,5469,5470,5472,5474,5476],{"class":79,"line":80},[77,5471,1201],{"class":83},[77,5473,2356],{"class":87},[77,5475,5029],{"class":87},[77,5477,5478],{"class":87}," map_server.launch.py\n",[18,5480,5481],{},[21,5482,5483],{},"显示地图",[18,5485,5486,5487],{},"打开rviz2，然后添加Map插件，并将话题设置为/map，并将该话题的",[74,5488,5489],{},"Durability Policy",[18,5491,5492,5493,5496],{},"选项设置为",[74,5494,5495],{},"Transient Local","，就可以正常显示地图数据了。",[18,5498,5499],{},[30,5500],{"alt":32,"src":5501},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1755.webp",[18,5503,5504],{},[30,5505],{"alt":32,"src":5506},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1756.webp",[18,5508,5509],{},[30,5510],{"alt":32,"src":5511},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1757.webp",[10,5513,5515],{"id":5514},"amcl自适应蒙特卡洛定位","AMCL自适应蒙特卡洛定位",[18,5517,5518],{},"定位是机器人在已知地图上确定自身位置的过程，为机器人的导航提供了基础信息。",[18,5520,5521,5522,4070],{},"Nav2中的定位技术技术称之为AMCL，全称Adaptive Monte Carlo Localization，即自适应蒙特卡洛定位，是一种基于粒子滤波器的定位算法。它通过蒙特卡洛方法进行自适应定位，利用对机器人周围环境的感知和观测数据的分析，来确定机器人在环境中的位置和姿态。在Nav2中对应的功能包为",[74,5523,5524],{},"nav2_amcl",[18,5526,5527],{},"在AMCL中，粒子滤波器的核心思想是使用一组粒子（样本）来代表机器人在地图上的可能位置。每个粒子都有一个权重，表示该粒子所代表的位置的置信度。算法会根据机器人的运动模型和传感器数据来更新这些粒子的位置和权重。随着时间的推移，粒子会逐渐收敛到机器人实际位置附近，从而实现对机器人位置的准确估计。",[14,5529,5530],{"id":5530},"定位节点说明",[18,5532,5533,5534,5536],{},"功能包",[74,5535,5524],{},"中的核心节点为amcl。该节点相关信息如下。",[18,5538,5539],{},[21,5540,5541],{},"1.订阅的话题",[531,5543,5544,5554],{},[534,5545,5546],{},[537,5547,5548,5550,5552],{},[540,5549,543],{"align":542},[540,5551,4124],{"align":542},[540,5553,549],{"align":542},[551,5555,5556,5565,5575,5586],{},[537,5557,5558,5560,5563],{},[556,5559,683],{"align":542},[556,5561,5562],{"align":542},"/nav_msgs/msg/OccupancyGrid",[556,5564,4979],{"align":542},[537,5566,5567,5569,5572],{},[556,5568,558],{"align":542},[556,5570,5571],{"align":542},"/sensor_msgs/msg/LaserScan",[556,5573,5574],{"align":542},"激光雷达数据",[537,5576,5577,5580,5583],{},[556,5578,5579],{"align":542},"/initialpose",[556,5581,5582],{"align":542},"/geometry_msgs/msg/PoseWithCovarianceStamped",[556,5584,5585],{"align":542},"用来初始化粒子滤波器的均值和协方差",[537,5587,5588,5590,5593],{},[556,5589,569],{"align":542},[556,5591,5592],{"align":542},"/tf2_msgs/msg/TFMessage",[556,5594,5595],{"align":542},"坐标变换消息",[18,5597,5598],{},[21,5599,5600],{},"2.发布的话题",[531,5602,5603,5613],{},[534,5604,5605],{},[537,5606,5607,5609,5611],{},[540,5608,543],{"align":542},[540,5610,4124],{"align":542},[540,5612,549],{"align":542},[551,5614,5615,5625,5636],{},[537,5616,5617,5620,5622],{},[556,5618,5619],{"align":542},"/amcl_pose",[556,5621,5582],{"align":542},[556,5623,5624],{"align":542},"机器人在地图中的位姿估计",[537,5626,5627,5630,5633],{},[556,5628,5629],{"align":542},"/particle_cloud",[556,5631,5632],{"align":542},"/nav2_msgs/msg/ParticleCloud",[556,5634,5635],{"align":542},"位姿估计集合，rviz中可以被 PoseArray 订阅然后图形化显示机器人的位姿估计集合",[537,5637,5638,5640,5642],{},[556,5639,569],{"align":542},[556,5641,5592],{"align":542},[556,5643,5644],{"align":542},"发布从 odom 与 map 的转换",[18,5646,5647],{},[21,5648,5649],{},"3.发布的服务",[531,5651,5652,5662],{},[534,5653,5654],{},[537,5655,5656,5658,5660],{},[540,5657,543],{"align":542},[540,5659,4124],{"align":542},[540,5661,549],{"align":542},[551,5663,5664,5675],{},[537,5665,5666,5669,5672],{},[556,5667,5668],{"align":542},"/reinitialize_global_localization",[556,5670,5671],{"align":542},"std_srvs/srv/Empty",[556,5673,5674],{"align":542},"在全局范围内初始化粒子位姿",[537,5676,5677,5680,5682],{},[556,5678,5679],{"align":542},"/request_nomotion_update",[556,5681,5671],{"align":542},[556,5683,5684],{"align":542},"在没有运动模型更新的情况下手动触发粒子群的更新",[18,5686,5687],{},[21,5688,5689],{},"4.参数",[18,5691,5692],{},[21,5693,5694],{},"通用参数",[46,5696,5697,5706,5716,5725,5734,5742,5748],{},[49,5698,5699,5702,5703,5705],{},[74,5700,5701],{},"bond_disable_heartbeat_timeout",": 设置为",[74,5704,2018],{},"时，禁用amcl节点与其他节点之间基于心跳的超时检测。这通常用于当节点之间的连接非常稳定，不需要频繁的心跳检测来确认连接状态时。",[49,5707,5708,5711,5712,5715],{},[74,5709,5710],{},"base_frame_id",": 定义机器人基坐标系的ID，通常是",[74,5713,5714],{},"base_link","或类似的名称。",[49,5717,5718,5721,5722,4070],{},[74,5719,5720],{},"global_frame_id",": 定义全局地图坐标系的ID，通常是",[74,5723,5724],{},"map",[49,5726,5727,5730,5731,4070],{},[74,5728,5729],{},"odom_frame_id",": 定义里程计坐标系的ID，通常是",[74,5732,5733],{},"odom",[49,5735,5736,5702,5739,5741],{},[74,5737,5738],{},"tf_broadcast",[74,5740,2018],{},"时，amcl节点会发布从里程计坐标系到全局地图坐标系的变换。",[49,5743,5744,5747],{},[74,5745,5746],{},"transform_tolerance",": 设置TF变换的容忍度，用于处理TF树中的时间不一致性。",[49,5749,5750,5702,5753,5755],{},[74,5751,5752],{},"use_sim_time",[74,5754,2018],{},"时，amcl将使用ROS 2的模拟时间（如果可用）。这在仿真环境中很有用。",[18,5757,5758],{},[21,5759,5760],{},"激光模型参数",[46,5762,5763,5773,5782,5788],{},[49,5764,5765,5768,5769,5772],{},[74,5766,5767],{},"laser_model_type",": 设置激光模型类型，",[74,5770,5771],{},"likelihood_field","是一种常用的模型，它考虑了激光束击中障碍物的概率。",[49,5774,5775,2671,5778,5781],{},[74,5776,5777],{},"laser_max_range",[74,5779,5780],{},"laser_min_range",": 分别设置激光雷达的最大和最小探测范围。",[49,5783,5784,5787],{},[74,5785,5786],{},"laser_likelihood_max_dist",": 设置激光模型考虑的最大距离，超过这个距离的数据将被忽略。",[49,5789,5790,5793,5794,5797,5798,5797,5801,5804,5805,5807,5808,5811],{},[74,5791,5792],{},"do_beamskip","和相关参数（",[74,5795,5796],{},"beam_skip_distance","、",[74,5799,5800],{},"beam_skip_threshold",[74,5802,5803],{},"beam_skip_error_threshold","）: 这些参数用于控制是否跳过某些激光束的处理，以减少计算量。然而，",[74,5806,5792],{},"被设置为",[74,5809,5810],{},"false","，意味着不跳过任何激光束。",[18,5813,5814],{},[21,5815,5816],{},"粒子滤波器参数",[46,5818,5819,5831,5840,5846],{},[49,5820,5821,5824,5827,5830],{},[74,5822,5823],{},"alpha1",[21,5825,5826],{},"到",[74,5828,5829],{},"alpha5",": 这些参数用于控制粒子滤波器中的权重更新过程，但它们的具体作用可能因amcl的实现而异。在标准的amcl实现中，这些参数可能不是直接使用的。",[49,5832,5833,2671,5836,5839],{},[74,5834,5835],{},"max_particles",[74,5837,5838],{},"min_particles",": 分别设置粒子滤波器的最大和最小粒子数。",[49,5841,5842,5845],{},[74,5843,5844],{},"resample_interval",": 设置在重采样前需要的滤波更新次数。",[49,5847,5848,2671,5851,5854],{},[74,5849,5850],{},"pf_err",[74,5852,5853],{},"pf_z",": 这些参数用于控制粒子滤波器的性能，但它们的具体作用可能依赖于amcl的实现细节。",[18,5856,5857],{},[21,5858,5859],{},"初始位姿参数",[46,5861,5862,5874,5881],{},[49,5863,5864,5867,5868,5807,5871,5873],{},[74,5865,5866],{},"initial_pose",": 定义了机器人的初始位姿（x, y, yaw, z），但在实际使用中，如果",[74,5869,5870],{},"set_initial_pose",[74,5872,2018],{},"，则这个初始位姿可能会被通过服务请求设置的初始位姿所覆盖。",[49,5875,5876,5702,5878,5880],{},[74,5877,5870],{},[74,5879,2018],{},"时，允许通过服务请求来设置机器人的初始位姿。",[49,5882,5883,5702,5886,5888],{},[74,5884,5885],{},"always_reset_initial_pose",[74,5887,5810],{},"时，表示不会在每个定位会话开始时自动重置初始位姿。",[18,5890,5891],{},[21,5892,5893],{},"其他参数",[46,5895,5896,5905,5911,5916,5922,5931],{},[49,5897,5898,5901,5902,5904],{},[74,5899,5900],{},"first_map_only",": 当设置为",[74,5903,5810],{},"时，表示amcl将订阅并处理不断更新的地图话题。",[49,5906,5907,5910],{},[74,5908,5909],{},"map_topic",": 定义地图话题的名称，amcl将订阅这个话题以获取地图信息。",[49,5912,5913,5915],{},[74,5914,900],{},": 定义激光雷达扫描数据话题的名称，amcl将订阅这个话题以获取用于定位的数据。",[49,5917,5918,5921],{},[74,5919,5920],{},"save_pose_rate",": 设置保存机器人位姿的速率（以Hz为单位）。",[49,5923,5924,2671,5927,5930],{},[74,5925,5926],{},"recovery_alpha_fast",[74,5928,5929],{},"recovery_alpha_slow",": 这些参数在标准的amcl实现中可能不是直接使用的，它们可能属于某个特定版本的amcl或扩展。",[49,5932,5933,5797,5936,5797,5939,5797,5942,2671,5945,5948],{},[74,5934,5935],{},"z_hit",[74,5937,5938],{},"z_rand",[74,5940,5941],{},"z_short",[74,5943,5944],{},"z_max",[74,5946,5947],{},"sigma_hit",": 这些参数定义了激光模型中的概率分布，用于计算激光束击中障碍物或随机位置的概率。",[14,5950,5951],{"id":5951},"定位节点基本操作",[18,5953,5954],{},[21,5955,5956],{},"1.准备工作",[18,5958,5013],{},[68,5960,5962],{"className":70,"code":5961,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_localization --dependencies nav2_amcl mycar_map_server\n",[74,5963,5964],{"__ignoreMap":32},[77,5965,5966,5968,5970,5972,5975,5977,5980],{"class":79,"line":80},[77,5967,1201],{"class":83},[77,5969,1204],{"class":87},[77,5971,1207],{"class":87},[77,5973,5974],{"class":87}," mycar_localization",[77,5976,1214],{"class":1213},[77,5978,5979],{"class":87}," nav2_amcl",[77,5981,5982],{"class":87}," mycar_map_server\n",[18,5984,5985],{},[21,5986,5987],{},"2.编写launch文件与参数文件",[18,5989,5990,5991,5188],{},"在功能包下，新建launch和params文件夹，在launch目录下新建名为",[74,5992,5993],{},"mycar_loca.launch.py",[68,5995,5997],{"className":1232,"code":5996,"language":1234,"meta":32,"style":32},"import os\nfrom ament_index_python.packages import get_package_share_directory\n\nfrom launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument, IncludeLaunchDescription\nfrom launch.substitutions import LaunchConfiguration\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\n\nfrom launch_ros.actions import Node\n\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument(\n        'use_sim_time',\n        default_value='false'\n    )\n\n    amcl_yaml = os.path.join(\n        get_package_share_directory('mycar_localization'),\n        'params',\n        'amcl.yaml'\n    )\n\n    amcl_node = Node(\n        package='nav2_amcl',\n        executable='amcl',\n        name='amcl',\n        output='screen',\n        parameters=[\n            amcl_yaml,\n            {'use_sim_time': LaunchConfiguration('use_sim_time')} # 覆盖掉yaml里的use_sim_time参数,以launch启动的设置为准.\n        ]\n    )\n\n    manager_localization_node = Node(\n        package='nav2_lifecycle_manager',\n        executable='lifecycle_manager',\n        name='lifecycle_manager_localization',\n        output='screen',\n        parameters=[\n            {'use_sim_time': LaunchConfiguration('use_sim_time')},\n            {'autostart': True},\n            {'node_names': ['amcl']}\n        ]\n    )\n\n    map_server_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                get_package_share_directory('mycar_map_server'),\n                'launch',\n                'map_server.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': LaunchConfiguration('use_sim_time')\n        }.items()\n    )\n\n    return LaunchDescription([\n        use_sim_time_arg,\n        map_server_launch,\n        amcl_node,\n        manager_localization_node,\n    ])\n",[74,5998,5999,6005,6015,6019,6029,6040,6050,6062,6066,6076,6080,6084,6092,6096,6104,6110,6119,6123,6127,6137,6147,6154,6159,6163,6167,6176,6187,6198,6208,6218,6226,6231,6247,6252,6256,6260,6269,6279,6289,6300,6310,6318,6330,6342,6355,6359,6363,6367,6377,6382,6387,6397,6404,6409,6414,6419,6429,6440,6445,6449,6453,6459,6463,6468,6474,6480],{"__ignoreMap":32},[77,6000,6001,6003],{"class":79,"line":80},[77,6002,1241],{"class":97},[77,6004,1244],{"class":104},[77,6006,6007,6009,6011,6013],{"class":79,"line":114},[77,6008,1253],{"class":97},[77,6010,1304],{"class":104},[77,6012,1241],{"class":97},[77,6014,1309],{"class":104},[77,6016,6017],{"class":79,"line":136},[77,6018,140],{"emptyLinePlaceholder":139},[77,6020,6021,6023,6025,6027],{"class":79,"line":143},[77,6022,1253],{"class":97},[77,6024,1256],{"class":104},[77,6026,1241],{"class":97},[77,6028,1261],{"class":104},[77,6030,6031,6033,6035,6037],{"class":79,"line":150},[77,6032,1253],{"class":97},[77,6034,1268],{"class":104},[77,6036,1241],{"class":97},[77,6038,6039],{"class":104}," DeclareLaunchArgument, IncludeLaunchDescription\n",[77,6041,6042,6044,6046,6048],{"class":79,"line":162},[77,6043,1253],{"class":97},[77,6045,1280],{"class":104},[77,6047,1241],{"class":97},[77,6049,1285],{"class":104},[77,6051,6052,6054,6057,6059],{"class":79,"line":174},[77,6053,1253],{"class":97},[77,6055,6056],{"class":104}," launch.launch_description_sources ",[77,6058,1241],{"class":97},[77,6060,6061],{"class":104}," PythonLaunchDescriptionSource\n",[77,6063,6064],{"class":79,"line":179},[77,6065,140],{"emptyLinePlaceholder":139},[77,6067,6068,6070,6072,6074],{"class":79,"line":184},[77,6069,1253],{"class":97},[77,6071,1292],{"class":104},[77,6073,1241],{"class":97},[77,6075,1297],{"class":104},[77,6077,6078],{"class":79,"line":195},[77,6079,140],{"emptyLinePlaceholder":139},[77,6081,6082],{"class":79,"line":1344},[77,6083,140],{"emptyLinePlaceholder":139},[77,6085,6086,6088,6090],{"class":79,"line":1359},[77,6087,1318],{"class":97},[77,6089,1321],{"class":83},[77,6091,1324],{"class":104},[77,6093,6094],{"class":79,"line":1364},[77,6095,140],{"emptyLinePlaceholder":139},[77,6097,6098,6100,6102],{"class":79,"line":1375},[77,6099,3091],{"class":104},[77,6101,1332],{"class":97},[77,6103,1372],{"class":104},[77,6105,6106,6108],{"class":79,"line":1384},[77,6107,1378],{"class":87},[77,6109,1381],{"class":104},[77,6111,6112,6114,6116],{"class":79,"line":1398},[77,6113,1388],{"class":1387},[77,6115,1332],{"class":97},[77,6117,6118],{"class":87},"'false'\n",[77,6120,6121],{"class":79,"line":1411},[77,6122,3244],{"class":104},[77,6124,6125],{"class":79,"line":1421},[77,6126,140],{"emptyLinePlaceholder":139},[77,6128,6129,6132,6134],{"class":79,"line":1429},[77,6130,6131],{"class":104},"    amcl_yaml ",[77,6133,1332],{"class":97},[77,6135,6136],{"class":104}," os.path.join(\n",[77,6138,6139,6142,6145],{"class":79,"line":1445},[77,6140,6141],{"class":104},"        get_package_share_directory(",[77,6143,6144],{"class":87},"'mycar_localization'",[77,6146,1442],{"class":104},[77,6148,6149,6152],{"class":79,"line":1459},[77,6150,6151],{"class":87},"        'params'",[77,6153,1381],{"class":104},[77,6155,6156],{"class":79,"line":1471},[77,6157,6158],{"class":87},"        'amcl.yaml'\n",[77,6160,6161],{"class":79,"line":1476},[77,6162,3244],{"class":104},[77,6164,6165],{"class":79,"line":1487},[77,6166,140],{"emptyLinePlaceholder":139},[77,6168,6169,6172,6174],{"class":79,"line":1498},[77,6170,6171],{"class":104},"    amcl_node ",[77,6173,1332],{"class":97},[77,6175,1484],{"class":104},[77,6177,6178,6180,6182,6185],{"class":79,"line":1504},[77,6179,1524],{"class":1387},[77,6181,1332],{"class":97},[77,6183,6184],{"class":87},"'nav2_amcl'",[77,6186,1381],{"class":104},[77,6188,6189,6191,6193,6196],{"class":79,"line":1515},[77,6190,1537],{"class":1387},[77,6192,1332],{"class":97},[77,6194,6195],{"class":87},"'amcl'",[77,6197,1381],{"class":104},[77,6199,6200,6202,6204,6206],{"class":79,"line":1521},[77,6201,1550],{"class":1387},[77,6203,1332],{"class":97},[77,6205,6195],{"class":87},[77,6207,1381],{"class":104},[77,6209,6210,6212,6214,6216],{"class":79,"line":1534},[77,6211,1562],{"class":1387},[77,6213,1332],{"class":97},[77,6215,1567],{"class":87},[77,6217,1381],{"class":104},[77,6219,6220,6222,6224],{"class":79,"line":1547},[77,6221,1490],{"class":1387},[77,6223,1332],{"class":97},[77,6225,1495],{"class":104},[77,6227,6228],{"class":79,"line":1559},[77,6229,6230],{"class":104},"            amcl_yaml,\n",[77,6232,6233,6235,6237,6239,6241,6244],{"class":79,"line":1572},[77,6234,3291],{"class":104},[77,6236,1338],{"class":87},[77,6238,3183],{"class":104},[77,6240,1338],{"class":87},[77,6242,6243],{"class":104},")} ",[77,6245,6246],{"class":146},"# 覆盖掉yaml里的use_sim_time参数,以launch启动的设置为准.\n",[77,6248,6249],{"class":79,"line":1577},[77,6250,6251],{"class":104},"        ]\n",[77,6253,6254],{"class":79,"line":1588},[77,6255,3244],{"class":104},[77,6257,6258],{"class":79,"line":1593},[77,6259,140],{"emptyLinePlaceholder":139},[77,6261,6262,6265,6267],{"class":79,"line":1599},[77,6263,6264],{"class":104},"    manager_localization_node ",[77,6266,1332],{"class":97},[77,6268,1484],{"class":104},[77,6270,6271,6273,6275,6277],{"class":79,"line":1605},[77,6272,1524],{"class":1387},[77,6274,1332],{"class":97},[77,6276,5357],{"class":87},[77,6278,1381],{"class":104},[77,6280,6281,6283,6285,6287],{"class":79,"line":1611},[77,6282,1537],{"class":1387},[77,6284,1332],{"class":97},[77,6286,5369],{"class":87},[77,6288,1381],{"class":104},[77,6290,6291,6293,6295,6298],{"class":79,"line":1616},[77,6292,1550],{"class":1387},[77,6294,1332],{"class":97},[77,6296,6297],{"class":87},"'lifecycle_manager_localization'",[77,6299,1381],{"class":104},[77,6301,6302,6304,6306,6308],{"class":79,"line":1999},[77,6303,1562],{"class":1387},[77,6305,1332],{"class":97},[77,6307,1567],{"class":87},[77,6309,1381],{"class":104},[77,6311,6312,6314,6316],{"class":79,"line":2010},[77,6313,1490],{"class":1387},[77,6315,1332],{"class":97},[77,6317,1495],{"class":104},[77,6319,6320,6322,6324,6326,6328],{"class":79,"line":2023},[77,6321,3291],{"class":104},[77,6323,1338],{"class":87},[77,6325,3183],{"class":104},[77,6327,1338],{"class":87},[77,6329,3300],{"class":104},[77,6331,6332,6334,6336,6338,6340],{"class":79,"line":2037},[77,6333,3291],{"class":104},[77,6335,5419],{"class":87},[77,6337,1662],{"class":104},[77,6339,5319],{"class":1213},[77,6341,5322],{"class":104},[77,6343,6344,6346,6348,6350,6352],{"class":79,"line":2050},[77,6345,3291],{"class":104},[77,6347,5432],{"class":87},[77,6349,4850],{"class":104},[77,6351,6195],{"class":87},[77,6353,6354],{"class":104},"]}\n",[77,6356,6357],{"class":79,"line":2064},[77,6358,6251],{"class":104},[77,6360,6361],{"class":79,"line":2075},[77,6362,3244],{"class":104},[77,6364,6365],{"class":79,"line":2080},[77,6366,140],{"emptyLinePlaceholder":139},[77,6368,6369,6372,6374],{"class":79,"line":2090},[77,6370,6371],{"class":104},"    map_server_launch ",[77,6373,1332],{"class":97},[77,6375,6376],{"class":104}," IncludeLaunchDescription(\n",[77,6378,6379],{"class":79,"line":2101},[77,6380,6381],{"class":104},"        PythonLaunchDescriptionSource(\n",[77,6383,6384],{"class":79,"line":2113},[77,6385,6386],{"class":104},"            os.path.join(\n",[77,6388,6389,6392,6395],{"class":79,"line":2118},[77,6390,6391],{"class":104},"                get_package_share_directory(",[77,6393,6394],{"class":87},"'mycar_map_server'",[77,6396,1442],{"class":104},[77,6398,6399,6402],{"class":79,"line":2129},[77,6400,6401],{"class":87},"                'launch'",[77,6403,1381],{"class":104},[77,6405,6406],{"class":79,"line":2139},[77,6407,6408],{"class":87},"                'map_server.launch.py'\n",[77,6410,6411],{"class":79,"line":2150},[77,6412,6413],{"class":104},"            )\n",[77,6415,6416],{"class":79,"line":2155},[77,6417,6418],{"class":104},"        ),\n",[77,6420,6421,6424,6426],{"class":79,"line":2169},[77,6422,6423],{"class":1387},"        launch_arguments",[77,6425,1332],{"class":97},[77,6427,6428],{"class":104},"{\n",[77,6430,6431,6434,6436,6438],{"class":79,"line":2182},[77,6432,6433],{"class":87},"            'use_sim_time'",[77,6435,3183],{"class":104},[77,6437,1338],{"class":87},[77,6439,1341],{"class":104},[77,6441,6442],{"class":79,"line":2187},[77,6443,6444],{"class":104},"        }.items()\n",[77,6446,6447],{"class":79,"line":2201},[77,6448,3244],{"class":104},[77,6450,6451],{"class":79,"line":2215},[77,6452,140],{"emptyLinePlaceholder":139},[77,6454,6455,6457],{"class":79,"line":2229},[77,6456,1619],{"class":97},[77,6458,3327],{"class":104},[77,6460,6461],{"class":79,"line":2240},[77,6462,3332],{"class":104},[77,6464,6465],{"class":79,"line":2250},[77,6466,6467],{"class":104},"        map_server_launch,\n",[77,6469,6471],{"class":79,"line":6470},64,[77,6472,6473],{"class":104},"        amcl_node,\n",[77,6475,6477],{"class":79,"line":6476},65,[77,6478,6479],{"class":104},"        manager_localization_node,\n",[77,6481,6483],{"class":79,"line":6482},66,[77,6484,3352],{"class":104},[18,6486,6487,6488,6491,6492,6495,6496,6499,6500,6502,6503,6505],{},"在上述代码中，创建了",[74,6489,6490],{},"amcl","节点，并从",[74,6493,6494],{},"params","目录加载了名为",[74,6497,6498],{},"amcl.yaml","的配置文件，且由于",[74,6501,6490],{},"也是拥有生命周期的节点，所以将其添加进了生命周期管理器。最后，定位必须依赖于地图信息，因此又包含了 ",[21,6504,5006],{},"  中的launch文件，以加载地图。",[18,6507,6508,6509,5188],{},"在params目录下新建名为",[74,6510,6498],{},[68,6512,6514],{"className":1635,"code":6513,"language":1637,"meta":32,"style":32},"/**:\n  ros__parameters:\n    use_sim_time: True  # 由launch的设置覆盖\n    alpha1: 0.2\n    alpha2: 0.2\n    alpha3: 0.2\n    alpha4: 0.2\n    alpha5: 0.2\n    base_frame_id: \"base_link\"\n    beam_skip_distance: 0.5\n    beam_skip_error_threshold: 0.9\n    beam_skip_threshold: 0.3\n    do_beamskip: false\n    global_frame_id: \"map\"\n    lambda_short: 0.1\n    laser_likelihood_max_dist: 2.0\n    laser_max_range: 100.0\n    laser_min_range: -1.0\n    laser_model_type: \"likelihood_field\"\n    max_beams: 60\n    max_particles: 2000\n    min_particles: 500\n    odom_frame_id: \"odom\"\n    pf_err: 0.05\n    pf_z: 0.99\n    recovery_alpha_fast: 0.0\n    recovery_alpha_slow: 0.0\n    resample_interval: 1\n    robot_model_type: \"nav2_amcl::DifferentialMotionModel\"\n    save_pose_rate: 0.5\n    sigma_hit: 0.2\n    tf_broadcast: true\n    transform_tolerance: 2.0\n    update_min_a: 0.2\n    update_min_d: 0.25\n    z_hit: 0.5\n    z_max: 0.05\n    z_rand: 0.5\n    z_short: 0.05\n    scan_topic: scan\n    set_initial_pose: false\n",[74,6515,6516,6523,6529,6541,6550,6559,6568,6577,6586,6596,6605,6614,6624,6633,6643,6652,6661,6671,6681,6691,6701,6711,6721,6731,6740,6750,6760,6769,6778,6788,6797,6806,6815,6824,6833,6842,6851,6860,6869,6878,6887],{"__ignoreMap":32},[77,6517,6518,6521],{"class":79,"line":80},[77,6519,6520],{"class":1644},"/**",[77,6522,1647],{"class":104},[77,6524,6525,6527],{"class":79,"line":114},[77,6526,1652],{"class":1644},[77,6528,1647],{"class":104},[77,6530,6531,6534,6536,6538],{"class":79,"line":136},[77,6532,6533],{"class":1644},"    use_sim_time",[77,6535,1662],{"class":104},[77,6537,5319],{"class":1213},[77,6539,6540],{"class":146},"  # 由launch的设置覆盖\n",[77,6542,6543,6546,6548],{"class":79,"line":143},[77,6544,6545],{"class":1644},"    alpha1",[77,6547,1662],{"class":104},[77,6549,1880],{"class":1213},[77,6551,6552,6555,6557],{"class":79,"line":150},[77,6553,6554],{"class":1644},"    alpha2",[77,6556,1662],{"class":104},[77,6558,1880],{"class":1213},[77,6560,6561,6564,6566],{"class":79,"line":162},[77,6562,6563],{"class":1644},"    alpha3",[77,6565,1662],{"class":104},[77,6567,1880],{"class":1213},[77,6569,6570,6573,6575],{"class":79,"line":174},[77,6571,6572],{"class":1644},"    alpha4",[77,6574,1662],{"class":104},[77,6576,1880],{"class":1213},[77,6578,6579,6582,6584],{"class":79,"line":179},[77,6580,6581],{"class":1644},"    alpha5",[77,6583,1662],{"class":104},[77,6585,1880],{"class":1213},[77,6587,6588,6591,6593],{"class":79,"line":184},[77,6589,6590],{"class":1644},"    base_frame_id",[77,6592,1662],{"class":104},[77,6594,6595],{"class":87},"\"base_link\"\n",[77,6597,6598,6601,6603],{"class":79,"line":195},[77,6599,6600],{"class":1644},"    beam_skip_distance",[77,6602,1662],{"class":104},[77,6604,1870],{"class":1213},[77,6606,6607,6610,6612],{"class":79,"line":1344},[77,6608,6609],{"class":1644},"    beam_skip_error_threshold",[77,6611,1662],{"class":104},[77,6613,2237],{"class":1213},[77,6615,6616,6619,6621],{"class":79,"line":1359},[77,6617,6618],{"class":1644},"    beam_skip_threshold",[77,6620,1662],{"class":104},[77,6622,6623],{"class":1213},"0.3\n",[77,6625,6626,6629,6631],{"class":79,"line":1364},[77,6627,6628],{"class":1644},"    do_beamskip",[77,6630,1662],{"class":104},[77,6632,1805],{"class":1213},[77,6634,6635,6638,6640],{"class":79,"line":1375},[77,6636,6637],{"class":1644},"    global_frame_id",[77,6639,1662],{"class":104},[77,6641,6642],{"class":87},"\"map\"\n",[77,6644,6645,6648,6650],{"class":79,"line":1384},[77,6646,6647],{"class":1644},"    lambda_short",[77,6649,1662],{"class":104},[77,6651,1944],{"class":1213},[77,6653,6654,6657,6659],{"class":79,"line":1398},[77,6655,6656],{"class":1644},"    laser_likelihood_max_dist",[77,6658,1662],{"class":104},[77,6660,1838],{"class":1213},[77,6662,6663,6666,6668],{"class":79,"line":1411},[77,6664,6665],{"class":1644},"    laser_max_range",[77,6667,1662],{"class":104},[77,6669,6670],{"class":1213},"100.0\n",[77,6672,6673,6676,6678],{"class":79,"line":1421},[77,6674,6675],{"class":1644},"    laser_min_range",[77,6677,1662],{"class":104},[77,6679,6680],{"class":1213},"-1.0\n",[77,6682,6683,6686,6688],{"class":79,"line":1429},[77,6684,6685],{"class":1644},"    laser_model_type",[77,6687,1662],{"class":104},[77,6689,6690],{"class":87},"\"likelihood_field\"\n",[77,6692,6693,6696,6698],{"class":79,"line":1445},[77,6694,6695],{"class":1644},"    max_beams",[77,6697,1662],{"class":104},[77,6699,6700],{"class":1213},"60\n",[77,6702,6703,6706,6708],{"class":79,"line":1459},[77,6704,6705],{"class":1644},"    max_particles",[77,6707,1662],{"class":104},[77,6709,6710],{"class":1213},"2000\n",[77,6712,6713,6716,6718],{"class":79,"line":1471},[77,6714,6715],{"class":1644},"    min_particles",[77,6717,1662],{"class":104},[77,6719,6720],{"class":1213},"500\n",[77,6722,6723,6726,6728],{"class":79,"line":1476},[77,6724,6725],{"class":1644},"    odom_frame_id",[77,6727,1662],{"class":104},[77,6729,6730],{"class":87},"\"odom\"\n",[77,6732,6733,6736,6738],{"class":79,"line":1487},[77,6734,6735],{"class":1644},"    pf_err",[77,6737,1662],{"class":104},[77,6739,1848],{"class":1213},[77,6741,6742,6745,6747],{"class":79,"line":1498},[77,6743,6744],{"class":1644},"    pf_z",[77,6746,1662],{"class":104},[77,6748,6749],{"class":1213},"0.99\n",[77,6751,6752,6755,6757],{"class":79,"line":1504},[77,6753,6754],{"class":1644},"    recovery_alpha_fast",[77,6756,1662],{"class":104},[77,6758,6759],{"class":1213},"0.0\n",[77,6761,6762,6765,6767],{"class":79,"line":1515},[77,6763,6764],{"class":1644},"    recovery_alpha_slow",[77,6766,1662],{"class":104},[77,6768,6759],{"class":1213},[77,6770,6771,6774,6776],{"class":79,"line":1521},[77,6772,6773],{"class":1644},"    resample_interval",[77,6775,1662],{"class":104},[77,6777,1815],{"class":1213},[77,6779,6780,6783,6785],{"class":79,"line":1534},[77,6781,6782],{"class":1644},"    robot_model_type",[77,6784,1662],{"class":104},[77,6786,6787],{"class":87},"\"nav2_amcl::DifferentialMotionModel\"\n",[77,6789,6790,6793,6795],{"class":79,"line":1547},[77,6791,6792],{"class":1644},"    save_pose_rate",[77,6794,1662],{"class":104},[77,6796,1870],{"class":1213},[77,6798,6799,6802,6804],{"class":79,"line":1559},[77,6800,6801],{"class":1644},"    sigma_hit",[77,6803,1662],{"class":104},[77,6805,1880],{"class":1213},[77,6807,6808,6811,6813],{"class":79,"line":1572},[77,6809,6810],{"class":1644},"    tf_broadcast",[77,6812,1662],{"class":104},[77,6814,1912],{"class":1213},[77,6816,6817,6820,6822],{"class":79,"line":1577},[77,6818,6819],{"class":1644},"    transform_tolerance",[77,6821,1662],{"class":104},[77,6823,1838],{"class":1213},[77,6825,6826,6829,6831],{"class":79,"line":1588},[77,6827,6828],{"class":1644},"    update_min_a",[77,6830,1662],{"class":104},[77,6832,1880],{"class":1213},[77,6834,6835,6838,6840],{"class":79,"line":1593},[77,6836,6837],{"class":1644},"    update_min_d",[77,6839,1662],{"class":104},[77,6841,4896],{"class":1213},[77,6843,6844,6847,6849],{"class":79,"line":1599},[77,6845,6846],{"class":1644},"    z_hit",[77,6848,1662],{"class":104},[77,6850,1870],{"class":1213},[77,6852,6853,6856,6858],{"class":79,"line":1605},[77,6854,6855],{"class":1644},"    z_max",[77,6857,1662],{"class":104},[77,6859,1848],{"class":1213},[77,6861,6862,6865,6867],{"class":79,"line":1611},[77,6863,6864],{"class":1644},"    z_rand",[77,6866,1662],{"class":104},[77,6868,1870],{"class":1213},[77,6870,6871,6874,6876],{"class":79,"line":1616},[77,6872,6873],{"class":1644},"    z_short",[77,6875,1662],{"class":104},[77,6877,1848],{"class":1213},[77,6879,6880,6882,6884],{"class":79,"line":1999},[77,6881,1754],{"class":1644},[77,6883,1662],{"class":104},[77,6885,6886],{"class":87},"scan\n",[77,6888,6889,6892,6894],{"class":79,"line":2010},[77,6890,6891],{"class":1644},"    set_initial_pose",[77,6893,1662],{"class":104},[77,6895,1805],{"class":1213},[18,6897,6898,6899,6901],{},"关于参数的具体含义，可以参考 ",[21,6900,5530],{}," 中参数相关内容。",[18,6903,6904],{},[21,6905,6906],{},"3.编辑配置文件",[18,6908,2268,6909,2272],{},[74,6910,2271],{},[68,6912,6913],{"className":2275,"code":2276,"language":2277,"meta":32,"style":32},[74,6914,6915,6921,6927],{"__ignoreMap":32},[77,6916,6917,6919],{"class":79,"line":80},[77,6918,2284],{"class":97},[77,6920,2287],{"class":104},[77,6922,6923,6925],{"class":79,"line":114},[77,6924,2292],{"class":104},[77,6926,2295],{"class":97},[77,6928,6929],{"class":79,"line":136},[77,6930,1341],{"class":104},[18,6932,6933],{},[21,6934,6935],{},"4.编译",[18,6937,2307],{},[68,6939,6941],{"className":70,"code":6940,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_localization\n",[74,6942,6943],{"__ignoreMap":32},[77,6944,6945,6947,6949,6951],{"class":79,"line":80},[77,6946,2317],{"class":83},[77,6948,2320],{"class":87},[77,6950,2323],{"class":1213},[77,6952,6953],{"class":87}," mycar_localization\n",[18,6955,6956],{},[21,6957,6958],{},"5.执行",[18,6960,3995],{},[68,6962,6963],{"className":70,"code":2339,"language":72,"meta":32,"style":32},[74,6964,6965,6971],{"__ignoreMap":32},[77,6966,6967,6969],{"class":79,"line":80},[77,6968,2346],{"class":1213},[77,6970,2349],{"class":87},[77,6972,6973,6975,6977,6979],{"class":79,"line":114},[77,6974,1201],{"class":83},[77,6976,2356],{"class":87},[77,6978,2359],{"class":87},[77,6980,2362],{"class":87},[18,6982,4018],{},[68,6984,6986],{"className":70,"code":6985,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_localization mycar_loca.launch.py use_sim_time:=True\n",[74,6987,6988,6994],{"__ignoreMap":32},[77,6989,6990,6992],{"class":79,"line":80},[77,6991,2346],{"class":1213},[77,6993,2349],{"class":87},[77,6995,6996,6998,7000,7002,7005],{"class":79,"line":114},[77,6997,1201],{"class":83},[77,6999,2356],{"class":87},[77,7001,5974],{"class":87},[77,7003,7004],{"class":87}," mycar_loca.launch.py",[77,7006,2392],{"class":87},[18,7008,7009],{},"（3）启动键盘控制节点以作备用：",[68,7011,7013],{"className":70,"code":7012,"language":72,"meta":32,"style":32},"ros2 run teleop_twist_keyboard teleop_twist_keyboard\n",[74,7014,7015],{"__ignoreMap":32},[77,7016,7017,7019,7021,7024],{"class":79,"line":80},[77,7018,1201],{"class":83},[77,7020,4251],{"class":87},[77,7022,7023],{"class":87}," teleop_twist_keyboard",[77,7025,7026],{"class":87}," teleop_twist_keyboard\n",[18,7028,7029,7030,7032],{},"（4）在rviz2中，将Fixed Frme设置为map，添加TF插件，按照 ",[21,7031,5006],{},"  添加并显示地图。",[18,7034,7035,7036,7039],{},"接下来，点击rviz2菜单栏的",[74,7037,7038],{},"2D Pose Estimate","在地图中为机器人设置一个初始位姿。",[18,7041,7042],{},"这里需要给一个大概的机器人位置和机器人的朝向，不是很准确也可以，机器人会在运动中逐渐通过AMCL校准。",[18,7044,7045,7046,7048],{},"先点击",[74,7047,7038],{},"，左键在地图上点击机器人所在位置，长摁别松手，鼠标往机器人朝向的位置划，出现下方这种绿色箭头，再松手即可。",[18,7050,7051],{},[30,7052],{"alt":32,"src":7053},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1758.webp",[18,7055,7056,7057,7060,7061,7063,7064,7067,7068,7071],{},"再添加",[74,7058,7059],{},"ParticleCloud","插件，将话题设置为",[74,7062,5629],{},"，并将话题下",[74,7065,7066],{},"Reliability Policy","设置为",[74,7069,7070],{},"Best Effort","，最后使用键盘控制机器人运动时，会发现，机器人周边会出现点云，并且随着机器人的运动，点云会出现不同程度的收敛或发散。",[18,7073,7074],{},[30,7075],{"alt":32,"src":7076},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1759.webp",[18,7078,7079],{},[30,7080],{"alt":32,"src":7081},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1760.webp",[18,7083,7084],{},[30,7085],{"alt":32,"src":7086},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1761.webp",[18,7088,7089],{},"即便你的机器人撞墙了，rviz2和Gazebo的机器人位置完全偏移了，只要再让机器人运动一会儿，机器人位置会被重新预估出来，AMCL非常强。",[18,7091,7092],{},[30,7093],{"alt":32,"src":7094},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1762.webp",[18,7096,7097],{},"如上图位置已经完全偏移了。",[18,7099,7100],{},[30,7101],{"alt":32,"src":7102},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1763.webp",[18,7104,7105],{},"经过一段时间行驶，姿态位置再次被预估成功。",[10,7107,7108],{"id":7108},"导航服务器",[18,7110,7111],{},"本节将介绍导航服务器中核心节点，实现基本导航功能，并将导航与SLAM集成，以实现自主探索建图。",[18,7113,7114,7115,7118],{},"下方网站是官方NAV2的各个节点的参数说明(",[21,7116,7117],{},"调参的时候非常常用的网站","):",[18,7120,7121],{},[286,7122,288],{"href":288,"rel":7123},[290],[18,7125,7126],{},"看不懂的英文可以用沉浸式翻译这个chrome插件来翻译,可以进行中英文对照翻译,非常好用.",[18,7128,7129],{},[286,7130,7131],{"href":7131,"rel":7132},"https://chromewebstore.google.com/detail/immersive-translate-trans/bpoadfkcbjbfhfodiogcnhhhpibjhbnh?utm%5C_source=official&pli=1",[290],[18,7134,7135],{},[286,7136,7137],{"href":7137,"rel":7138},"https://microsoftedge.microsoft.com/addons/detail/immersive-translate-tra/amkbmndfnliijdhojkpoglbnaaahippg",[290],[18,7140,7141],{},[30,7142],{"alt":32,"src":7143},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1764.webp",[18,7145,7146],{},[30,7147],{"alt":32,"src":7148},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1765.webp",[18,7150,7151],{},"不会用这个插件的话,也可以看鱼香ROS翻译好的版本(但是网站不稳定):",[18,7153,7154],{},[286,7155,7156],{"href":7156,"rel":7157},"http://fishros.org/doc/nav2/configuration/index.html",[290],[14,7159,7160],{"id":7160},"生命周期管理节点说明",[18,7162,7163,7164,7166,7167,7169,7170,7172,7173,7175],{},"Nav2中通过的",[74,7165,5457],{},"功能包下的",[74,7168,5461],{},"节点管理其他节点的生命周期状态转换。",[74,7171,5461],{},"节点通过ROS 2的生命周期节点（Lifecycle Node）机制，提供了一种标准化的方法来控制Nav2中各个节点的状态转换。这些状态包括未配置（Unconfigured）、非活动（Inactive）、活动（Active）和结束（Finalized）等。通过精细控制这些状态转换，",[74,7174,5461],{},"节点能够确保Nav2系统的各个部分在正确的时机启动、运行和停止，从而提高系统的可靠性和稳定性。",[18,7177,7178],{},[21,7179,823],{},[46,7181,7182,7191,7200,7208,7214,7220,7234,7240],{},[49,7183,7184,7187,7188,7190],{},[74,7185,7186],{},"/bond_disable_heartbeat_timeout",": 该参数与节点之间的通信绑定（bonding）有关。节点之间的通信可以通过绑定来增强可靠性，而心跳超时是检测节点是否仍然活跃的一种方式。设置为",[74,7189,5810],{},"意味着启用心跳超时检测。",[49,7192,7193,7196,7197,7199],{},[74,7194,7195],{},"attempt_respawn_reconnection",": 取值为bool值，设置为",[74,7198,2018],{},"时，表示如果管理的节点意外终止，生命周期管理器将尝试重新启动它。",[49,7201,7202,7196,7205,7207],{},[74,7203,7204],{},"autostart",[74,7206,2018],{},"时，表示在生命周期管理器启动时，它将自动尝试启动其管理的节点。",[49,7209,7210,7213],{},[74,7211,7212],{},"bond_respawn_max_duration",": 重新连接或重新启动节点时的最大持续时间。",[49,7215,7216,7219],{},[74,7217,7218],{},"bond_timeout",": 与节点之间的通信绑定超时有关。如果在这个时间内没有收到来自另一个节点的消息，则认为该节点已经断开连接。",[49,7221,7222,7225,7226],{},[74,7223,7224],{},"diagnostic_updater",":",[46,7227,7228],{},[49,7229,7230,7233],{},[74,7231,7232],{},"period",": 诊断更新器的更新周期。诊断更新器用于收集和发布有关节点状态的诊断信息，定义了这些信息更新的频率。",[49,7235,7236,7239],{},[74,7237,7238],{},"node_names",": 由该生命周期管理器管理的节点名称列表。",[49,7241,7242,7244],{},[74,7243,5752],{},":是否使用仿真实践。",[14,7246,7247],{"id":7247},"行为树节点说明",[18,7249,7250,7253,7254,7166,7257,7260],{},[21,7251,7252],{},"行为树（BT）"," 是一种在智能体（如机器人或电脑游戏中的虚拟实体）中构建不同任务之间切换结构的方式。它是一种形式化的图形建模语言，以层次化的节点组织为特征，用于描述和规划复杂系统中各种实体的交互和决策。",[74,7255,7256],{},"nav2_bt_navigator",[74,7258,7259],{},"/bt_navigator","是Nav2中的行为树导航器节点，它实现了基于行为树的导航策略。行为树是一种用于描述复杂行为的树状结构，通过组合不同的行为节点，可以灵活地定义机器人的导航行为，包括路径规划、避障、恢复等。以下是官网。",[18,7262,7263],{},[286,7264,7265],{"href":7265,"rel":7266},"https://www.behaviortree.dev/",[290],[18,7268,7269],{},[286,7270,7271],{"href":7271,"rel":7272},"https://arxiv.org/abs/1709.00084",[290],[18,7274,7275],{},"github链接如下：",[18,7277,7278],{},[286,7279,7280],{"href":7280,"rel":7281},"https://github.com/BehaviorTree/BehaviorTree.CPP",[290],[18,7283,7284],{},"BT可视化工具Groot2下载：",[18,7286,7287],{},[286,7288,7289],{"href":7289,"rel":7290},"https://www.behaviortree.dev/groot/",[290],[309,7292,7293],{},[49,7294,529],{},[531,7296,7297,7307],{},[534,7298,7299],{},[537,7300,7301,7303,7305],{},[540,7302,543],{"align":542},[540,7304,4124],{"align":542},[540,7306,549],{"align":542},[551,7308,7309,7320,7329],{},[537,7310,7311,7314,7317],{},[556,7312,7313],{"align":542},"/goal_pose",[556,7315,7316],{"align":542},"geometry_msgs/msg/PoseStamped",[556,7318,7319],{"align":542},"导航目标点，用于触发导航任务",[537,7321,7322,7324,7326],{},[556,7323,569],{"align":542},[556,7325,572],{"align":542},[556,7327,7328],{"align":542},"坐标变换消息，用于不同坐标系之间的转换",[537,7330,7331,7333,7335],{},[556,7332,2735],{"align":542},[556,7334,2738],{"align":542},[556,7336,7337],{"align":542},"里程计数据，提供机器人位置和运动信息",[309,7339,7340],{"start":114},[49,7341,7342],{},"请求的Action",[531,7344,7345,7356],{},[534,7346,7347],{},[537,7348,7349,7352,7354],{},[540,7350,7351],{"align":542},"Action",[540,7353,4124],{"align":542},[540,7355,549],{"align":542},[551,7357,7358],{},[537,7359,7360,7363,7366],{},[556,7361,7362],{"align":542},"/navigate_to_pose",[556,7364,7365],{"align":542},"nav2_msgs/action/NavigateToPose",[556,7367,7368],{"align":542},"请求导航到指定位姿的Action，包括目标位姿和容忍度等参数",[309,7370,7371],{"start":136},[49,7372,823],{},[46,7374,7375,7380,7386,7392,7398,7404,7410,7416,7422,7428],{},[49,7376,7377,7379],{},[74,7378,5752],{},": 指定是否使用模拟时间而非实际时间。",[49,7381,7382,7385],{},[74,7383,7384],{},"global_frame",": 定义全局坐标系的名称，通常为地图坐标系。",[49,7387,7388,7391],{},[74,7389,7390],{},"robot_base_frame",": 指定机器人基座的坐标系名称。",[49,7393,7394,7397],{},[74,7395,7396],{},"odom_topic",": 里程计数据的ROS话题名称。",[49,7399,7400,7403],{},[74,7401,7402],{},"bt_loop_duration",": 行为树执行循环的持续时间（单位可能根据实现而异）。",[49,7405,7406,7409],{},[74,7407,7408],{},"default_server_timeout",": 导航服务器操作的默认超时时间。",[49,7411,7412,7415],{},[74,7413,7414],{},"enable_groot_monitoring",": 启用或禁用Groot监控功能。",[49,7417,7418,7421],{},[74,7419,7420],{},"groot_zmq_publisher_port",": Groot监控中ZeroMQ发布者的端口号。",[49,7423,7424,7427],{},[74,7425,7426],{},"groot_zmq_server_port",": Groot监控中ZeroMQ服务器的端口号。",[49,7429,7430,7433],{},[74,7431,7432],{},"plugin_lib_names",": Nav2 Jazzy 官方示例说明该参数用于添加自定义 BT 插件；Nav2 内置 BT 插件会自动加载，所以没有自定义 BT 插件时不要配置空列表。",[14,7435,7436],{"id":7436},"规划器节点说明",[18,7438,7439,7440,7166,7443,7446,7447,7450],{},"在Nav2 导航框架中",[74,7441,7442],{},"nav2_planner",[74,7444,7445],{},"planner_server","节点，负责处理路径规划请求，生成从当前位置到目标位置的路径。该节点在执行时需要依赖于",[74,7448,7449],{},"/global_costmap/global_costmap","节点提供的地图消息。",[309,7452,7453],{},[49,7454,7455],{},"planner_server发布的话题",[531,7457,7458,7468],{},[534,7459,7460],{},[537,7461,7462,7464,7466],{},[540,7463,543],{"align":542},[540,7465,4124],{"align":542},[540,7467,549],{"align":542},[551,7469,7470],{},[537,7471,7472,7475,7478],{},[556,7473,7474],{"align":542},"/plan",[556,7476,7477],{"align":542},"nav_msgs/msg/Path",[556,7479,7480],{"align":542},"当前位置到目标点的全局路径",[309,7482,7483],{"start":114},[49,7484,7485],{},"planner_server 参数",[46,7487,7488,7496,7534,7540,7549],{},[49,7489,7490,7492,7493,7495],{},[74,7491,7186],{},": 这个参数控制是否禁用心跳超时检测，在ROS 2中，节点之间的通信绑定（bonding）机制用于增强通信的可靠性。心跳超时是检测节点是否仍然活跃的一种机制。如果该参数设置为",[74,7494,2018],{},"，则表示禁用了心跳超时检测，这可能在某些特定的网络环境下或当确信节点间通信非常稳定时使用。",[49,7497,7498,7501,7502],{},[74,7499,7500],{},"GridBased",": 这是一个配置块，专门用于设置基于网格的规划器的参数。基于网格的规划器通常使用地图的网格化表示来规划路径。",[46,7503,7504,7510,7516,7522,7528],{},[49,7505,7506,7509],{},[74,7507,7508],{},"allow_unknown",": 控制规划器是否允许在地图的未知（即未探索）区域中规划路径。",[49,7511,7512,7515],{},[74,7513,7514],{},"plugin",": 指定使用的规划器插件。",[49,7517,7518,7521],{},[74,7519,7520],{},"tolerance",": 设置规划路径时的容忍度，通常用于考虑机器人尺寸和定位的不确定性。",[49,7523,7524,7527],{},[74,7525,7526],{},"use_astar",": 控制是否使用A* 算法进行路径规划*。A** 算法是一种启发式搜索算法，能够找到从起点到终点的最短路径。",[49,7529,7530,7533],{},[74,7531,7532],{},"use_final_approach_orientation",": 控制规划器是否在路径的终点附近考虑机器人的最终朝向。",[49,7535,7536,7539],{},[74,7537,7538],{},"expected_planner_frequency",": 这个参数表示对规划器生成新路径的频率的预期值。它帮助系统监控规划器的性能，并可能用于调试或性能优化。",[49,7541,7542,7545,7546,7548],{},[74,7543,7544],{},"planner_plugins",": 这是一个列表，指定了可用的规划器插件。在这个例子中，它只包含了一个",[74,7547,7500],{},"规划器，但理论上可以包含多个不同类型的规划器，以适应不同的导航需求。",[49,7550,7551,7553,7554,7556],{},[74,7552,5752],{},": 这个参数控制是否使用模拟时间。在仿真环境中，时间是由仿真软件控制的，而不是由实际的物理时钟控制的。将此参数设置为",[74,7555,2018],{},"允许节点在仿真环境中正常运行，而无需依赖实际的系统时间。这对于开发和测试导航算法非常有用。",[309,7558,7559],{"start":136},[49,7560,7561],{},"/global_costmap/global_costmap订阅的话题",[531,7563,7564,7574],{},[534,7565,7566],{},[537,7567,7568,7570,7572],{},[540,7569,543],{"align":542},[540,7571,4124],{"align":542},[540,7573,549],{"align":542},[551,7575,7576,7587,7596],{},[537,7577,7578,7581,7584],{},[556,7579,7580],{"align":542},"/global_costmap/footprint",[556,7582,7583],{"align":542},"geometry_msgs/msg/Polygon",[556,7585,7586],{"align":542},"机器人（或任何移动平台）的足迹（footprint）信息。足迹是机器人在地图上占据的空间形状，通常用多边形表示。",[537,7588,7589,7591,7593],{},[556,7590,683],{"align":542},[556,7592,686],{"align":542},[556,7594,7595],{"align":542},"发布环境地图，特别是用于导航的占用网格图（Occupancy Grid Map）。",[537,7597,7598,7600,7602],{},[556,7599,558],{"align":542},[556,7601,561],{"align":542},[556,7603,7604],{"align":542},"激光扫描数据。",[309,7606,7607],{"start":143},[49,7608,7609],{},"/global_costmap/global_costmap发布的话题",[531,7611,7612,7622],{},[534,7613,7614],{},[537,7615,7616,7618,7620],{},[540,7617,543],{"align":542},[540,7619,4124],{"align":542},[540,7621,549],{"align":542},[551,7623,7624,7634,7645,7656],{},[537,7625,7626,7629,7631],{},[556,7627,7628],{"align":542},"/global_costmap/costmap",[556,7630,686],{"align":542},[556,7632,7633],{"align":542},"发布全局代价地图的当前状态。",[537,7635,7636,7639,7642],{},[556,7637,7638],{"align":542},"/global_costmap/costmap_raw",[556,7640,7641],{"align":542},"nav2_msgs/msg/Costmap",[556,7643,7644],{"align":542},"未经进一步处理的原始代价地图数据。",[537,7646,7647,7650,7653],{},[556,7648,7649],{"align":542},"/global_costmap/costmap_updates",[556,7651,7652],{"align":542},"map_msgs/msg/OccupancyGridUpdate",[556,7654,7655],{"align":542},"全局代价地图的更新，该消息可以高效更新地图。",[537,7657,7658,7661,7664],{},[556,7659,7660],{"align":542},"/global_costmap/published_footprint",[556,7662,7663],{"align":542},"geometry_msgs/msg/PolygonStamped",[556,7665,7666],{"align":542},"发布机器人的足迹（footprint），即机器人在地图上占据的空间形状。",[309,7668,7669],{"start":150},[49,7670,7671],{},"/global_costmap/global_costmap参数",[46,7673,7674,7679,7685,7691,7697,7703,7709,7714,7723,7766,7772,7777,7783,7833,7842,7848,7854,7859,7864,7870,7876,7915,7921,7926,7932,7938,7944,7950,7955],{},[49,7675,7676,7678],{},[74,7677,7186],{},": 控制是否禁用心跳超时检测，这在节点间通信绑定时用于监控对方节点的活跃度。",[49,7680,7681,7684],{},[74,7682,7683],{},"always_send_full_costmap",": 控制是否总是发送完整的代价地图信息，而不是仅发送变化的部分。",[49,7686,7687,7690],{},[74,7688,7689],{},"clearable_layers",": 列出可以被清除的代价图层，这些图层中的障碍物信息可以通过某种方式（如传感器数据）被更新或清除。",[49,7692,7693,7696],{},[74,7694,7695],{},"filters",": 定义应用于代价地图的过滤器列表，用于预处理或修改地图数据。",[49,7698,7699,7702],{},[74,7700,7701],{},"footprint",": 指定机器人在地图上的足迹形状，即机器人占据的空间范围。",[49,7704,7705,7708],{},[74,7706,7707],{},"footprint_padding",": 为机器人的足迹添加额外的填充空间，以考虑机器人运动时的额外空间需求。",[49,7710,7711,7713],{},[74,7712,7384],{},": 定义全局代价地图所使用的参考坐标系。",[49,7715,7716,2671,7719,7722],{},[74,7717,7718],{},"height",[74,7720,7721],{},"width",": 定义全局代价地图的高度和宽度（以单元格数计）。",[49,7724,7725,7728,7729],{},[74,7726,7727],{},"inflation_layer",": 配置膨胀层的参数，膨胀层用于在障碍物周围增加一定宽度的“缓冲区”，以避免机器人与障碍物过近。",[46,7730,7731,7737,7743,7749,7755,7761],{},[49,7732,7733,7736],{},[74,7734,7735],{},"cost_scaling_factor",": 膨胀成本的缩放因子。",[49,7738,7739,7742],{},[74,7740,7741],{},"enabled",": 控制膨胀层是否启用。",[49,7744,7745,7748],{},[74,7746,7747],{},"inflate_around_unknown",": 控制是否在未知空间周围进行膨胀。",[49,7750,7751,7754],{},[74,7752,7753],{},"inflate_unknown",": 控制是否将未知空间视为障碍物并进行膨胀。",[49,7756,7757,7760],{},[74,7758,7759],{},"inflation_radius",": 膨胀的半径。",[49,7762,7763,7765],{},[74,7764,7514],{},": 指定使用的膨胀层插件。",[49,7767,7768,7771],{},[74,7769,7770],{},"lethal_cost_threshold",": 定义代价地图中视为“致命”障碍物的成本阈值。",[49,7773,7774,7776],{},[74,7775,5909],{},": 指定订阅以获取地图信息的ROS话题。",[49,7778,7779,7782],{},[74,7780,7781],{},"observation_sources",": 定义代价地图的观测源，即哪些传感器或数据源用于更新地图。",[49,7784,7785,7788,7789],{},[74,7786,7787],{},"obstacle_layer",": 配置障碍物层的参数，障碍物层负责处理传感器观测到的障碍物信息。",[46,7790,7791,7797,7802,7808,7817,7822,7827],{},[49,7792,7793,7796],{},[74,7794,7795],{},"combination_method",": 定义如何组合多个观测源的信息。",[49,7798,7799,7801],{},[74,7800,7741],{},": 控制障碍物层是否启用。",[49,7803,7804,7807],{},[74,7805,7806],{},"footprint_clearing_enabled",": 控制是否清除机器人足迹内的障碍物信息。",[49,7809,7810,2671,7813,7816],{},[74,7811,7812],{},"max_obstacle_height",[74,7814,7815],{},"min_obstacle_height",": 定义障碍物的高度范围。",[49,7818,7819,7821],{},[74,7820,7781],{},": 指定障碍物信息的来源。",[49,7823,7824,7826],{},[74,7825,7514],{},": 指定使用的障碍物层插件。",[49,7828,7829,7832],{},[74,7830,7831],{},"scan",": 包含与激光扫描相关的配置，如扫描数据的处理方式。",[49,7834,7835,2671,7838,7841],{},[74,7836,7837],{},"origin_x",[74,7839,7840],{},"origin_y",": 定义全局代价地图原点的坐标。",[49,7843,7844,7847],{},[74,7845,7846],{},"plugins",": 列出启用的代价地图插件，这些插件定义了如何构建和更新代价地图。",[49,7849,7850,7853],{},[74,7851,7852],{},"publish_frequency",": 定义发布代价地图的频率。",[49,7855,7856,7858],{},[74,7857,978],{},": 定义代价地图的分辨率，即每个单元格代表的实际物理尺寸。",[49,7860,7861,7863],{},[74,7862,7390],{},": 定义机器人基座的参考坐标系。",[49,7865,7866,7869],{},[74,7867,7868],{},"robot_radius",": 定义机器人的半径，用于计算机器人在地图上的占用空间。",[49,7871,7872,7875],{},[74,7873,7874],{},"rolling_window",": 控制是否使用滚动窗口（即动态变化的地图区域）而非固定大小的地图。",[49,7877,7878,7881,7882],{},[74,7879,7880],{},"static_layer",": 配置静态层的参数，静态层负责处理地图中的静态障碍物信息。",[46,7883,7884,7889,7894,7899,7904,7910],{},[49,7885,7886,7888],{},[74,7887,7741],{},": 控制静态层是否启用。",[49,7890,7891,7893],{},[74,7892,4166],{},": 控制是否订阅瞬态本地地图更新。",[49,7895,7896,7898],{},[74,7897,5909],{},": 指定静态地图的ROS话题（如果不同于全局地图）。",[49,7900,7901,7903],{},[74,7902,7514],{},": 指定使用的静态层插件。",[49,7905,7906,7909],{},[74,7907,7908],{},"subscribe_to_updates",": 控制是否订阅地图更新。",[49,7911,7912,7914],{},[74,7913,5746],{},": 定义坐标变换的容忍度。",[49,7916,7917,7920],{},[74,7918,7919],{},"track_unknown_space",": 控制是否跟踪地图中的未知空间。",[49,7922,7923,7925],{},[74,7924,5746],{},": 定义在坐标变换过程中允许的误差范围。",[49,7927,7928,7931],{},[74,7929,7930],{},"trinary_costmap",": 控制是否使用三态代价地图（空闲、占用、未知），而不是仅使用二态（空闲、占用）。",[49,7933,7934,7937],{},[74,7935,7936],{},"unknown_cost_value",": 定义在代价地图中表示未知空间的值。",[49,7939,7940,7943],{},[74,7941,7942],{},"update_frequency",": 定义更新代价地图的频率。",[49,7945,7946,7949],{},[74,7947,7948],{},"use_maximum",": 控制是否使用多个观测源中的最大值来更新代价地图。",[49,7951,7952,7954],{},[74,7953,5752],{},": 控制是否使用仿真时间（在仿真环境中很有用）。",[49,7956,7957,7960,7961],{},[74,7958,7959],{},"voxel_layer",": 配置体素层的参数，体素层使用体素网格来表示三维空间中的障碍物信息。",[46,7962,7963,7968,7973,7982,7989,7994,8000,8005,8011,8015],{},[49,7964,7965,7967],{},[74,7966,7741],{},": 控制体素层是否启用。",[49,7969,7970,7972],{},[74,7971,7806],{},": 控制是否清除机器人足迹内的体素信息。",[49,7974,7975,2671,7978,7981],{},[74,7976,7977],{},"mark_threshold",[74,7979,7980],{},"unknown_threshold",": 定义将体素视为障碍物或未知的阈值。",[49,7983,7984,2671,7986,7988],{},[74,7985,7812],{},[74,7987,7815],{},": 定义体素表示的障碍物的高度范围。",[49,7990,7991,7993],{},[74,7992,7781],{},": 指定体素信息的来源。",[49,7995,7996,7999],{},[74,7997,7998],{},"origin_z",": 定义体素网格在Z轴上的原点。",[49,8001,8002,8004],{},[74,8003,7514],{},": 指定使用的体素层插件。",[49,8006,8007,8010],{},[74,8008,8009],{},"publish_voxel_map",": 控制是否发布体素地图。",[49,8012,8013,7832],{},[74,8014,7831],{},[49,8016,8017,2671,8020,8023],{},[74,8018,8019],{},"z_resolution",[74,8021,8022],{},"z_voxels",": 定义体素网格在Z轴上的分辨率和体素数。",[14,8025,8026],{"id":8026},"控制器节点说明",[18,8028,8029,8030,8033,8034,8037,8038,8040,8041,7450],{},"在Nav2导航系统中",[74,8031,8032],{},"nav2_controller","功能包的",[74,8035,8036],{},"controller_server","负责处理导航任务中的控制请求，确保机器人能够按照规划的路径进行移动。其主要功能是根据",[74,8039,7442],{},"模块计算出的全局或局部路径，生成速度、方向控制的命令，即控制机器人沿着规划好的路径行走。该节点在执行时还需要依赖于",[74,8042,8043],{},"/local_costmap/local_costmap",[18,8045,8046],{},[21,8047,8048],{},"1.controller_server订阅的话题",[531,8050,8051,8061],{},[534,8052,8053],{},[537,8054,8055,8057,8059],{},[540,8056,543],{"align":542},[540,8058,4124],{"align":542},[540,8060,549],{"align":542},[551,8062,8063,8072],{},[537,8064,8065,8067,8069],{},[556,8066,2735],{"align":542},[556,8068,2738],{"align":542},[556,8070,8071],{"align":542},"机器人的里程计信息，包含位置、速度和姿态",[537,8073,8074,8077,8080],{},[556,8075,8076],{"align":542},"/speed_limit",[556,8078,8079],{"align":542},"nav2_msgs/msg/SpeedLimit",[556,8081,8082],{"align":542},"导航过程中的速度限制信息，用于动态调整机器人的移动速度",[18,8084,8085],{},[21,8086,8087],{},"2.controller_server发布的话题",[531,8089,8090,8102],{},[534,8091,8092],{},[537,8093,8094,8097,8100],{},[540,8095,8096],{"align":542},"话题名称",[540,8098,8099],{"align":542},"消息类型",[540,8101,549],{"align":542},[551,8103,8104,8115,8126,8136,8147,8157],{},[537,8105,8106,8109,8112],{},[556,8107,8108],{"align":542},"/cmd_vel_nav",[556,8110,8111],{"align":542},"geometry_msgs/msg/Twist",[556,8113,8114],{"align":542},"发布控制命令，包括线性和角速度，用于控制机器人按照规划路径移动。",[537,8116,8117,8120,8123],{},[556,8118,8119],{"align":542},"/cost_cloud",[556,8121,8122],{"align":542},"sensor_msgs/msg/PointCloud2",[556,8124,8125],{"align":542},"发布成本地图中的点云数据，用于避障和路径规划。",[537,8127,8128,8131,8133],{},[556,8129,8130],{"align":542},"/local_plan",[556,8132,7477],{"align":542},[556,8134,8135],{"align":542},"发布局部路径规划结果，即机器人应如何到达当前目标点附近的一个点。",[537,8137,8138,8141,8144],{},[556,8139,8140],{"align":542},"/marker",[556,8142,8143],{"align":542},"visualization_msgs/msg/MarkerArray",[556,8145,8146],{"align":542},"发布可视化标记，用于在RViz等可视化工具中显示路径、障碍物等信息。",[537,8148,8149,8152,8154],{},[556,8150,8151],{"align":542},"/received_global_plan",[556,8153,7477],{"align":542},[556,8155,8156],{"align":542},"发布从全局规划器接收到的全局路径，即当前位置到目标点的路径。",[537,8158,8159,8162,8164],{},[556,8160,8161],{"align":542},"/transformed_global_plan",[556,8163,7477],{"align":542},[556,8165,8166],{"align":542},"发布经过坐标变换的全局路径，确保路径与机器人的当前坐标系一致。",[18,8168,8169],{},[21,8170,8171],{},"3.controller_server参数",[46,8173,8174,8208,8211,8214,8217,8220,8223,8226,8229,8232,8235,8238],{},[49,8175,8176,8177],{},"FollowPath: 这个部分定义了一个名为FollowPath的插件或配置集，它可能是一个路径跟随行为或算法的配置。它包含了多个子参数和子配置，用于定义如何跟随路径。",[46,8178,8179,8193,8196,8199,8202,8205],{},[49,8180,8181,8182],{},"BaseObstacle: 定义了基本的障碍物评估参数，用于在路径跟随过程中避免障碍物。",[46,8183,8184,8187,8190],{},[49,8185,8186],{},"class: 指定了类的名称，这里是BaseObstacle，表示这是一个基本障碍物评估组件。",[49,8188,8189],{},"scale: 定义了该障碍物评估在整体评估中的权重或影响程度。",[49,8191,8192],{},"sum_scores: 指示是否累加多个障碍物的分数，false可能表示使用最大值或其他逻辑。",[49,8194,8195],{},"GoalAlign, GoalDist, PathAlign, PathDist, RotateToGoal, Oscillation: 这些都是路径跟随过程中的不同评估或行为组件，每个都有其特定的参数和用途，如对齐目标、保持与目标或路径的距离、减少振荡等。",[49,8197,8198],{},"acc_lim_theta, acc_lim_x, acc_lim_y: 这些参数定义了机器人在不同方向上的加速度限制。",[49,8200,8201],{},"critics: 指定了哪些评估组件（或“批评家”）将被用于路径跟随决策。",[49,8203,8204],{},"debug_trajectory_details: 指示是否发布轨迹的详细调试信息。",[49,8206,8207],{},"其他与速度、加速度、时间粒度、轨迹生成等相关的参数，共同定义了路径跟随算法的行为和性能。",[49,8209,8210],{},"controller_frequency: 指定了控制器（可能是FollowPath或其他控制器）的运行频率，以赫兹为单位。",[49,8212,8213],{},"controller_plugins: 指定了将要使用的控制器插件列表，这里只包含了FollowPath。",[49,8215,8216],{},"failure_tolerance: 定义了容忍失败的时间或距离，用于在评估控制器是否失败时提供一定的缓冲。",[49,8218,8219],{},"general_goal_checker: 定义了一个通用的目标检查器，用于确定机器人是否已达到其目标位置和方向。",[49,8221,8222],{},"goal_checker_plugins: 指定了将要使用的目标检查器插件列表。",[49,8224,8225],{},"min_theta_velocity_threshold, min_x_velocity_threshold, min_y_velocity_threshold: 这些定义了机器人在不同方向上的最小速度阈值，低于这些阈值可能被视为停止或静止。",[49,8227,8228],{},"odom_topic: 指定了里程计信息的ROS主题。",[49,8230,8231],{},"progress_checker: 定义了一个进度检查器，用于评估机器人是否在向目标移动。",[49,8233,8234],{},"qos_overrides: 定义了ROS服务或主题的QoS（服务质量）覆盖设置，用于调整消息传递的可靠性和性能。",[49,8236,8237],{},"speed_limit_topic: 指定了速度限制信息的ROS主题。",[49,8239,8240],{},"use_sim_time: 指示是否使用模拟时间，这在ROS仿真环境中非常有用。",[18,8242,8243],{},[21,8244,8245],{},"4./local_costmap/local_costmap订阅的话题",[531,8247,8248,8258],{},[534,8249,8250],{},[537,8251,8252,8254,8256],{},[540,8253,543],{"align":542},[540,8255,4124],{"align":542},[540,8257,549],{"align":542},[551,8259,8260,8270],{},[537,8261,8262,8265,8267],{},[556,8263,8264],{"align":542},"/local_costmap/footprint",[556,8266,7583],{"align":542},[556,8268,8269],{"align":542},"机器人或移动平台的足迹多边形，用于本地代价地图的计算",[537,8271,8272,8274,8276],{},[556,8273,558],{"align":542},[556,8275,561],{"align":542},[556,8277,8278],{"align":542},"激光扫描仪的扫描数据，用于环境感知和避障",[18,8280,8281],{},[21,8282,8283],{},"5./local_costmap/local_costmap发布的话题",[531,8285,8286,8296],{},[534,8287,8288],{},[537,8289,8290,8292,8294],{},[540,8291,543],{"align":542},[540,8293,4124],{"align":542},[540,8295,549],{"align":542},[551,8297,8298,8308,8318,8328,8338,8348],{},[537,8299,8300,8303,8305],{},[556,8301,8302],{"align":542},"/local_costmap/clearing_endpoints",[556,8304,8122],{"align":542},[556,8306,8307],{"align":542},"清除成本图上的障碍物点云数据，通常用于动态障碍物处理",[537,8309,8310,8313,8315],{},[556,8311,8312],{"align":542},"/local_costmap/costmap",[556,8314,686],{"align":542},[556,8316,8317],{"align":542},"本地成本图，表示机器人周围环境的可通行性",[537,8319,8320,8323,8325],{},[556,8321,8322],{"align":542},"/local_costmap/costmap_raw",[556,8324,7641],{"align":542},[556,8326,8327],{"align":542},"未经处理的本地成本图，可能包含更详细的信息",[537,8329,8330,8333,8335],{},[556,8331,8332],{"align":542},"/local_costmap/costmap_updates",[556,8334,7652],{"align":542},[556,8336,8337],{"align":542},"本地成本图的更新信息，包括哪些区域发生了变化",[537,8339,8340,8343,8345],{},[556,8341,8342],{"align":542},"/local_costmap/published_footprint",[556,8344,7663],{"align":542},[556,8346,8347],{"align":542},"发布的机器人足迹多边形，时间戳表示发布时间",[537,8349,8350,8353,8356],{},[556,8351,8352],{"align":542},"/local_costmap/voxel_grid",[556,8354,8355],{"align":542},"nav2_msgs/msg/VoxelGrid",[556,8357,8358],{"align":542},"体素网格数据，用于成本图生成中的空间划分和优化",[18,8360,8361],{},[21,8362,8363],{},"6./local_costmap/local_costmap参数",[46,8365,8366,8374,8382,8395,8400,8405,8410,8415,8420,8425,8430,8435,8440,8445,8452,8457,8462,8467,8472,8477,8485,8490,8495,8500,8505,8510,8515,8520],{},[49,8367,8368,8370,8371,8373],{},[74,8369,7186],{},": 是否禁用节点间的心跳超时检查。当设置为",[74,8372,2018],{},"时，表示禁用该功能，可能用于减少网络通信量或适应特定网络环境。",[49,8375,8376,8378,8379,8381],{},[74,8377,7683],{},": 是否总是发送完整的成本图。当设置为",[74,8380,2018],{},"时，节点将不依赖于增量更新，而是始终发送完整的成本图数据。",[49,8383,8384,8386,8387,5797,8389,2671,8391,8394],{},[74,8385,7689],{},": 指定可以被清除的层列表。在这个例子中，包括",[74,8388,7787],{},[74,8390,7959],{},[74,8392,8393],{},"range_layer","，这意味着这些层中的障碍物数据可以被清除。",[49,8396,8397,8399],{},[74,8398,7695],{},": 用于指定应用于成本图的过滤器列表。此处为空，表示没有应用任何过滤器。",[49,8401,8402,8404],{},[74,8403,7701],{},": 机器人的足迹多边形，定义了机器人在二维空间中的物理占用区域。",[49,8406,8407,8409],{},[74,8408,7707],{},": 足迹的填充量，用于在计算成本图时给机器人足迹添加额外的空间。",[49,8411,8412,8414],{},[74,8413,7384],{},": 全局参考坐标系的名称，通常用于定位和导航任务。",[49,8416,8417,8419],{},[74,8418,7718],{},": 成本图的高度（以单元格数量计）。",[49,8421,8422,8424],{},[74,8423,7727],{},": 膨胀层的配置，用于在障碍物周围添加一定范围的膨胀区域，使机器人与障碍物保持安全距离。",[49,8426,8427,8429],{},[74,8428,7770],{},": 致命成本阈值，超过此阈值的成本值表示不可通行的区域。",[49,8431,8432,8434],{},[74,8433,5909],{},": 订阅的地图主题名称，用于获取全局地图信息。",[49,8436,8437,8439],{},[74,8438,7781],{},": 观察源的配置，用于指定哪些传感器数据将被用于更新成本图。此处为空字符串，可能是默认值或配置方式的不同。",[49,8441,8442,8444],{},[74,8443,7787],{},": 障碍物层的配置，用于处理来自传感器（如激光雷达）的障碍物数据。",[49,8446,8447,3724,8449,8451],{},[74,8448,7837],{},[74,8450,7840],{},": 成本图原点的X和Y坐标，定义了成本图在全局坐标系中的位置。",[49,8453,8454,8456],{},[74,8455,7846],{},": 启用的插件列表，定义了成本图使用的不同层（如障碍物层、膨胀层等）。",[49,8458,8459,8461],{},[74,8460,7852],{},": 成本图的发布频率（以Hz为单位）。",[49,8463,8464,8466],{},[74,8465,978],{},": 成本图的分辨率（以米/单元格计）。",[49,8468,8469,8471],{},[74,8470,7390],{},": 机器人基座的参考坐标系名称，用于定位机器人。",[49,8473,8474,8476],{},[74,8475,7868],{},": 机器人的半径，用于在成本图中表示机器人的物理尺寸。",[49,8478,8479,8481,8482,8484],{},[74,8480,7874],{},": 是否使用滚动窗口。当设置为",[74,8483,2018],{},"时，成本图将随着机器人的移动而更新其位置和范围。",[49,8486,8487,8489],{},[74,8488,7919],{},": 是否跟踪未知空间。在某些情况下，这可能用于处理未探索或未知的区域。",[49,8491,8492,8494],{},[74,8493,5746],{},": 变换容差，定义了接受变换的时间差和角度差的阈值。",[49,8496,8497,8499],{},[74,8498,7930],{},": 是否使用三态成本图（通常是自由、占用、未知）。",[49,8501,8502,8504],{},[74,8503,7936],{},": 未知区域在成本图中的成本值。",[49,8506,8507,8509],{},[74,8508,7942],{},": 成本图的更新频率（以Hz为单位），不同于发布频率。",[49,8511,8512,8514],{},[74,8513,7948],{},": 是否在多个源提供相同位置的成本信息时使用最大值。",[49,8516,8517,8519],{},[74,8518,5752],{},": 是否使用模拟时间而非系统时间。这在仿真环境中很有用。",[49,8521,8522,8524],{},[74,8523,7959],{},": 体素层的配置，用于将三维空间划分为体素（体积像素），以提高成本图的处理效率。",[14,8526,8527],{"id":8527},"恢复器节点说明",[18,8529,8530,8531,8033,8534,8537],{},"恢复行为是机器人导航过程中一个至关重要的部分，它允许机器人在遇到障碍、卡住或其他导航问题时采取一系列预定义的动作来尝试恢复。在Nav2中由",[74,8532,8533],{},"nav2_behaviors",[74,8535,8536],{},"behavior_server","实现这一功能。",[18,8539,8540],{},[21,8541,5541],{},[531,8543,8544,8554],{},[534,8545,8546],{},[537,8547,8548,8550,8552],{},[540,8549,543],{"align":542},[540,8551,4124],{"align":542},[540,8553,549],{"align":542},[551,8555,8556,8567,8577,8586,8595],{},[537,8557,8558,8561,8564],{},[556,8559,8560],{"align":542},"/clock",[556,8562,8563],{"align":542},"rosgraph_msgs/msg/Clock",[556,8565,8566],{"align":542},"ROS系统时间",[537,8568,8569,8572,8574],{},[556,8570,8571],{"align":542},"/cmd_vel_teleop",[556,8573,8111],{"align":542},[556,8575,8576],{"align":542},"遥操作命令，用于控制机器人的线性和角速度",[537,8578,8579,8581,8583],{},[556,8580,8322],{"align":542},[556,8582,7641],{"align":542},[556,8584,8585],{"align":542},"局部代价地图的原始数据",[537,8587,8588,8590,8592],{},[556,8589,8342],{"align":542},[556,8591,7663],{"align":542},[556,8593,8594],{"align":542},"机器人在局部代价地图中的已发布足迹",[537,8596,8597,8600,8603],{},[556,8598,8599],{"align":542},"/preempt_teleop",[556,8601,8602],{"align":542},"std_msgs/msg/Empty",[556,8604,8605],{"align":542},"遥操作抢占信号，用于中断当前遥操作",[18,8607,8608],{},[21,8609,5600],{},[531,8611,8612,8622],{},[534,8613,8614],{},[537,8615,8616,8618,8620],{},[540,8617,543],{"align":542},[540,8619,4124],{"align":542},[540,8621,549],{"align":542},[551,8623,8624],{},[537,8625,8626,8629,8631],{},[556,8627,8628],{"align":542},"/cmd_vel",[556,8630,8111],{"align":542},[556,8632,8633],{"align":542},"发送给底层控制器的速度命令",[18,8635,8636],{},[21,8637,8638],{},"3.提供的Action服务器",[531,8640,8641,8652],{},[534,8642,8643],{},[537,8644,8645,8647,8650],{},[540,8646,543],{"align":542},[540,8648,8649],{"align":542},"Action接口",[540,8651,549],{"align":542},[551,8653,8654,8665,8676,8687,8698],{},[537,8655,8656,8659,8662],{},[556,8657,8658],{"align":542},"/assisted_teleop",[556,8660,8661],{"align":542},"nav2_msgs/action/AssistedTeleop",[556,8663,8664],{"align":542},"遥控辅助操作服务，允许用户在导航时提供方向性输入",[537,8666,8667,8670,8673],{},[556,8668,8669],{"align":542},"/backup",[556,8671,8672],{"align":542},"nav2_msgs/action/BackUp",[556,8674,8675],{"align":542},"后退动作服务，用于在特定情况下使机器人后退",[537,8677,8678,8681,8684],{},[556,8679,8680],{"align":542},"/drive_on_heading",[556,8682,8683],{"align":542},"nav2_msgs/action/DriveOnHeading",[556,8685,8686],{"align":542},"按指定航向行驶的动作服务",[537,8688,8689,8692,8695],{},[556,8690,8691],{"align":542},"/spin",[556,8693,8694],{"align":542},"nav2_msgs/action/Spin",[556,8696,8697],{"align":542},"旋转动作服务，允许机器人在原地旋转",[537,8699,8700,8703,8706],{},[556,8701,8702],{"align":542},"/wait",[556,8704,8705],{"align":542},"nav2_msgs/action/Wait",[556,8707,8708],{"align":542},"等待动作服务，使机器人在当前位置等待一定时间",[18,8710,8711],{},[21,8712,5689],{},[46,8714,8715,8720,8728,8733,8738,8746,8764,8770,8776,8782,8788,8800,8806,8812,8821],{},[49,8716,8717,8719],{},[74,8718,5752],{},": 该参数指定是否使用模拟时间而非实际时间。这在仿真环境中非常有用，因为仿真环境可以加速或减速时间流逝，而不需要等待实际时间的流逝。",[49,8721,8722,8724,8725,8727],{},[74,8723,7384],{},": 定义全局坐标系的名称，该坐标系通常用于导航任务中的定位和路径规划。在这里，它被设置为",[74,8726,5733],{},"，意味着使用里程计数据来作为全局坐标系的参考。",[49,8729,8730,8732],{},[74,8731,7390],{},": 指定机器人基座的坐标系名称。这是机器人上用于定位和运动控制的参考点，通常与机器人的物理中心或驱动轮的中心相对应。",[49,8734,8735,8737],{},[74,8736,7396],{},": 这是一个ROS话题名称，用于发布里程计数据。里程计数据包含了机器人随时间推移的位置和姿态变化信息，是导航和定位系统的关键输入之一。",[49,8739,8740,8742,8743,8745],{},[74,8741,7186],{},"：这个参数可能用于配置ROS节点之间的心跳检测机制。将其设置为",[74,8744,2018],{},"可能意味着禁用或调整心跳超时的行为，以便在特定情况下（如仿真环境）避免不必要的超时错误。",[49,8747,8748,3724,8751,3724,8754,3724,8757,3724,8760,8763],{},[74,8749,8750],{},"assisted_teleop",[74,8752,8753],{},"backup",[74,8755,8756],{},"drive_on_heading",[74,8758,8759],{},"spin",[74,8761,8762],{},"wait",": 这些是行为树中可能使用的行为插件的配置项。每个插件都定义了机器人可以执行的一种特定行为，如辅助遥操作、后退、按指定方向行驶、原地旋转和等待。",[49,8765,8766,8769],{},[74,8767,8768],{},"behavior_plugins",": 列出了在行为树中可用的行为插件名称。",[49,8771,8772,8775],{},[74,8773,8774],{},"cmd_vel_teleop",": 指定了用于遥操作的速度控制命令的ROS话题名称。",[49,8777,8778,8781],{},[74,8779,8780],{},"costmap_topic",": 定义了局部代价地图的ROS话题名称，代价地图用于表示环境中的障碍物和可通行区域。",[49,8783,8784,8787],{},[74,8785,8786],{},"cycle_frequency",": 定义了导航系统更新其状态和规划新路径的频率（以赫兹为单位）。",[49,8789,8790,3724,8793,3724,8796,8799],{},[74,8791,8792],{},"max_rotational_vel",[74,8794,8795],{},"min_rotational_vel",[74,8797,8798],{},"rotational_acc_lim",": 这些参数定义了机器人旋转时的最大速度、最小速度和加速度限制。",[49,8801,8802,8805],{},[74,8803,8804],{},"projection_time",": 与代价地图的更新或预测未来障碍物位置有关的时间参数。",[49,8807,8808,8811],{},[74,8809,8810],{},"footprint_topic",": 定义了发布机器人足迹（即机器人占据的空间）的ROS话题名称。",[49,8813,8814,3724,8817,8820],{},[74,8815,8816],{},"simulate_ahead_time",[74,8818,8819],{},"simulation_time_step",": 这些参数与仿真环境相关，可能用于控制仿真过程中的时间流逝和步长。",[49,8822,8823,8825],{},[74,8824,5746],{},": 定义了坐标变换时的容差范围，用于处理不同坐标系之间的微小差异。",[14,8827,8828],{"id":8828},"航点跟随节点说明",[18,8830,8831,8832,8835,8836,8839,8840,2671,8843,8846],{},"在Nav2 导航堆栈中，",[74,8833,8834],{},"nav2_waypoint_follower","包下的",[74,8837,8838],{},"/waypoint_follower","节点负责跟踪由路径规划器生成的一系列航点（waypoints），以确保机器人能够沿着预定的路径安全、准确地移动。该节点的主要功能是根据当前机器人位置和速度信息，以及由路径规划器（如",[74,8841,8842],{},"nav2_global_planner",[74,8844,8845],{},"nav2_local_planner","）提供的航点列表，计算出控制指令来控制机器人的运动。这些控制指令可能包括线性和角速度命令，或者更具体的运动学或动力学命令，具体取决于机器人的类型和配置。",[18,8848,8849],{},[21,8850,8851],{},"1.提供的Action服务器",[531,8853,8854,8864],{},[534,8855,8856],{},[537,8857,8858,8860,8862],{},[540,8859,543],{"align":542},[540,8861,8649],{"align":542},[540,8863,549],{"align":542},[551,8865,8866],{},[537,8867,8868,8871,8874],{},[556,8869,8870],{"align":542},"/follow_waypoints",[556,8872,8873],{"align":542},"nav2_msgs/action/FollowWaypoints",[556,8875,8876],{"align":542},"允许客户端请求planner_server按照一系列路点进行导航",[18,8878,8879],{},[21,8880,8881],{},"2.请求的Action服务",[531,8883,8884,8894],{},[534,8885,8886],{},[537,8887,8888,8890,8892],{},[540,8889,543],{"align":542},[540,8891,8649],{"align":542},[540,8893,549],{"align":542},[551,8895,8896],{},[537,8897,8898,8900,8902],{},[556,8899,7362],{"align":542},[556,8901,7365],{"align":542},[556,8903,8904],{"align":542},"允许planner_server（或调用它的节点）请求导航到指定的位姿",[18,8906,8907],{},[21,8908,8909],{},"3.参数",[46,8911,8912,8917,8923,8929,8934,8940],{},[49,8913,8914,8916],{},[74,8915,5752],{},": 指定是否使用模拟时间而非实际时间进行节点的计时和同步。这在仿真环境中特别有用，因为仿真环境可能无法提供与真实时间完全同步的时钟。",[49,8918,8919,8922],{},[74,8920,8921],{},"loop_rate",": 定义了节点的主循环速率，即节点每秒执行其主要任务（如处理数据、发布信息等）的次数。这个参数对于控制节点的响应性和资源使用非常重要。",[49,8924,8925,8928],{},[74,8926,8927],{},"stop_on_failure",": 指明当导航任务遇到无法克服的障碍或达到其他失败条件时，节点是否应该停止执行。这对于确保在失败情况下系统能够安全地停止并等待进一步指令很重要。",[49,8930,8931,8933],{},[74,8932,5701],{},": 涉及节点间通信的可靠性机制。Bond是ROS 2中用于节点间稳定通信的一种机制，其中心跳信号用于检测节点是否仍然活跃。将此参数设置为true会禁用心跳超时检测，这可能在某些特定的网络配置或应用场景中是有用的。",[49,8935,8936,8939],{},[74,8937,8938],{},"waypoint_task_executor_plugin",": 指定了在执行路径点导航任务时要使用的插件。路径点导航通常涉及一系列预先定义的点，机器人需要按顺序访问这些点。这个参数允许用户指定用于执行这种类型任务的特定插件或算法。",[49,8941,8942,8945,8946],{},[74,8943,8944],{},"wait_at_waypoint",": 这是一个复合参数，用于配置在路径点等待的特定行为。",[46,8947,8948,8953,8958],{},[49,8949,8950,8952],{},[74,8951,7741],{},": 启用或禁用在到达每个路径点时等待的功能。",[49,8954,8955,8957],{},[74,8956,7514],{},": 指定实现等待功能的插件类型。这允许用户根据需要选择不同的等待策略或行为。",[49,8959,8960,8963],{},[74,8961,8962],{},"waypoint_pause_duration",": 定义了在每个路径点处等待的持续时间（以毫秒为单位）。这可以用于确保机器人在移动到下一个路径点之前已经稳定或已经完成了某些操作。",[14,8965,8966],{"id":8966},"路径平滑节点说明",[18,8968,8969,8970,7166,8973,8976],{},"在Nav2框架中",[74,8971,8972],{},"nav2_smoother",[74,8974,8975],{},"smoother_server","节点通过加载和运行各种平滑器插件，对规划出的路径进行平滑处理，使得机器人能够更流畅、连续且安全地移动。这一功能对于提高机器人的导航性能和减少硬件磨损具有重要意义。",[18,8978,8979],{},[21,8980,5541],{},[531,8982,8983,8993],{},[534,8984,8985],{},[537,8986,8987,8989,8991],{},[540,8988,543],{"align":542},[540,8990,4124],{"align":542},[540,8992,549],{"align":542},[551,8994,8995,9004],{},[537,8996,8997,8999,9001],{},[556,8998,7638],{"align":542},[556,9000,7641],{"align":542},[556,9002,9003],{"align":542},"全局代价地图的原始数据，用于路径规划",[537,9005,9006,9008,9010],{},[556,9007,7660],{"align":542},[556,9009,7663],{"align":542},[556,9011,9012],{"align":542},"机器人在全局代价地图中的足迹表示",[18,9014,9015],{},[21,9016,5600],{},[531,9018,9019,9029],{},[534,9020,9021],{},[537,9022,9023,9025,9027],{},[540,9024,543],{"align":542},[540,9026,4124],{"align":542},[540,9028,549],{"align":542},[551,9030,9031],{},[537,9032,9033,9036,9038],{},[556,9034,9035],{"align":542},"/plan_smoothed",[556,9037,7477],{"align":542},[556,9039,9040],{"align":542},"经过平滑处理后的全局路径",[18,9042,9043],{},[21,9044,8638],{},[531,9046,9047,9058],{},[534,9048,9049],{},[537,9050,9051,9053,9056],{},[540,9052,543],{"align":542},[540,9054,9055],{"align":542},"动作类型",[540,9057,549],{"align":542},[551,9059,9060],{},[537,9061,9062,9065,9068],{},[556,9063,9064],{"align":542},"/smooth_path",[556,9066,9067],{"align":542},"nav2_msgs/action/SmoothPath",[556,9069,9070],{"align":542},"提供平滑路径的服务，接受路径平滑的请求，并返回平滑后的路径。这允许客户端（如行为树）异步地请求路径平滑，并在平滑完成后接收结果。",[18,9072,9073],{},[21,9074,5689],{},[46,9076,9077,9082,9087,9092,9097,9142,9151,9156],{},[49,9078,9079,9081],{},[74,9080,7186],{},": 指示是否禁用Bond的心跳超时功能。在分布式系统中，Bond用于管理节点间的连接和心跳，此参数用于调整心跳相关的行为。",[49,9083,9084,9086],{},[74,9085,8780],{},": 代价地图数据的ROS话题名称，通常是全局代价地图的原始数据。",[49,9088,9089,9091],{},[74,9090,8810],{},": 机器人足迹（即机器人在地图上的占用区域）的ROS话题名称，用于在全局代价地图中表示机器人的物理尺寸。",[49,9093,9094,9096],{},[74,9095,7390],{},": 指定机器人基座的坐标系名称，这是机器人导航中用于定位和移动的参考点。",[49,9098,9099,7225,9102],{},[74,9100,9101],{},"simple_smoother",[46,9103,9104,9110,9116,9125,9130,9136],{},[49,9105,9106,9109],{},[74,9107,9108],{},"do_refinement",": 指示是否启用路径的细化（或进一步优化）过程。",[49,9111,9112,9115],{},[74,9113,9114],{},"max_its",": 平滑过程中允许的最大迭代次数，用于控制平滑算法的收敛时间。",[49,9117,9118,9120,9121,9124],{},[74,9119,7514],{},": 平滑插件的类型，这里是",[74,9122,9123],{},"nav2_smoother::SimpleSmoother","，表示使用简单的平滑算法。",[49,9126,9127,9129],{},[74,9128,7520],{},": 平滑算法的收敛容差，当路径变化小于此值时，认为平滑过程已完成。",[49,9131,9132,9135],{},[74,9133,9134],{},"w_data",": 平滑过程中数据项（如障碍物距离）的权重。",[49,9137,9138,9141],{},[74,9139,9140],{},"w_smooth",": 平滑过程中平滑项（如路径曲率）的权重。",[49,9143,9144,9147,9148,9150],{},[74,9145,9146],{},"smoother_plugins",": 定义的平滑插件列表，这里列出了",[74,9149,9101],{},"，表示将使用此插件进行路径平滑。",[49,9152,9153,9155],{},[74,9154,5746],{},": 坐标变换的容差，用于处理不同坐标系之间的转换时的不确定性。",[49,9157,9158,9160,9161,9163,9164,9166],{},[74,9159,5752],{},": 指定是否使用模拟时间而非实际时间。在仿真环境中，这通常设置为",[74,9162,2018],{},"，以匹配仿真器的虚拟时间；在真实环境中，应设置为",[74,9165,5810],{},"以使用ROS系统的实际时间。",[14,9168,9169],{"id":9169},"速度平滑节点说明",[18,9171,9172,9173,8835,9176,9179],{},"Nav2框架中的",[74,9174,9175],{},"nav2_velocity_smoother",[74,9177,9178],{},"velocity_smoother","节点主要负责平滑由Nav2框架发送给机器人控制器的速度指令。其核心功能是实现速度和加速度平滑。这一功能对于确保机器人在导航过程中的稳定性和安全性至关重要。",[18,9181,9182],{},[21,9183,5541],{},[531,9185,9186,9196],{},[534,9187,9188],{},[537,9189,9190,9192,9194],{},[540,9191,543],{"align":542},[540,9193,4124],{"align":542},[540,9195,549],{"align":542},[551,9197,9198],{},[537,9199,9200,9202,9204],{},[556,9201,8108],{"align":542},[556,9203,8111],{"align":542},[556,9205,9206],{"align":542},"接收来自其他节点的速度控制指令的话题",[18,9208,9209],{},[21,9210,5600],{},[531,9212,9213,9223],{},[534,9214,9215],{},[537,9216,9217,9219,9221],{},[540,9218,543],{"align":542},[540,9220,4124],{"align":542},[540,9222,549],{"align":542},[551,9224,9225],{},[537,9226,9227,9229,9231],{},[556,9228,8628],{"align":542},[556,9230,8111],{"align":542},[556,9232,9233],{"align":542},"发布经过处理或平滑后的速度控制指令的话题",[18,9235,9236],{},[21,9237,8909],{},[46,9239,9240,9248,9254,9264,9270,9276,9282,9288,9297,9305,9314,9320,9325],{},[49,9241,9242,9244,9245,9247],{},[74,9243,5701],{},": 指示是否禁用节点间的心跳超时机制。如果为",[74,9246,2018],{},"，则节点间的心跳检测不会因超时而断开连接。",[49,9249,9250,9253],{},[74,9251,9252],{},"deadband_velocity",": 定义在哪些速度分量上应用死区平滑（即忽略小于此阈值的微小速度变化）。这里分别为X轴、Y轴和偏航角速度（theta）设置了死区值。",[49,9255,9256,9259,9260,9263],{},[74,9257,9258],{},"feedback",": 指定速度平滑器的反馈类型。",[74,9261,9262],{},"OPEN_LOOP","表示开环控制，即不考虑机器人的实际速度反馈进行速度调整。",[49,9265,9266,9269],{},[74,9267,9268],{},"max_accel",": 定义机器人在各个方向上的最大加速度限制，包括X轴、Y轴和偏航角速度（theta）。",[49,9271,9272,9275],{},[74,9273,9274],{},"max_decel",": 定义机器人在各个方向上的最大减速度限制，包括X轴、Y轴和偏航角速度（theta）。注意，减速度值以负数表示。",[49,9277,9278,9281],{},[74,9279,9280],{},"max_velocity",": 定义机器人在各个方向上的最大速度限制，包括X轴、Y轴和偏航角速度（theta）。",[49,9283,9284,9287],{},[74,9285,9286],{},"min_velocity",": 定义机器人在各个方向上的最小速度限制，包括X轴、Y轴和偏航角速度（theta）。这通常用于避免发送过小的速度指令给底层控制器。",[49,9289,9290,9293,9294,9296],{},[74,9291,9292],{},"odom_duration",": 与里程计数据相关的参数，但在此上下文中可能不直接用于",[74,9295,9178],{},"节点，可能是遗留或与其他功能相关联。",[49,9298,9299,9301,9302,9304],{},[74,9300,7396],{},": 指定里程计数据的ROS话题名称，",[74,9303,9178],{},"节点将订阅此话题以获取机器人的运动信息。",[49,9306,9307,9310,9311,9313],{},[74,9308,9309],{},"scale_velocities",": 指示是否根据加速度限制同比例调整速度的其他分量。如果为",[74,9312,5810],{},"，则不会进行速度缩放。",[49,9315,9316,9319],{},[74,9317,9318],{},"smoothing_frequency",": 定义速度平滑操作的执行频率（Hz），即每秒进行多少次平滑计算。",[49,9321,9322,9324],{},[74,9323,5752],{},": 指定是否使用模拟时间而非实际系统时间。这对于仿真环境特别有用，可以确保时间的一致性和可预测性。",[49,9326,9327,9330,9331,9333],{},[74,9328,9329],{},"velocity_timeout",": 如果在指定时间内未接收到新的速度指令，则",[74,9332,9178],{},"节点将停止发布速度指令，并可能发送零速度指令以停止机器人运动。这是为了防止在失去速度控制时机器人继续移动。",[14,9335,9336],{"id":9336},"导航功能集成",[334,9338,9339],{},[18,9340,9341,9342,5797,9345,5797,9348,9351,9352,9355],{},"本节 Jazzy 版本的配置依据来自 Jazzy 官方安装路径里的示例文件和 Nav2 官方配置文档：",[74,9343,9344],{},"/opt/ros/jazzy/share/nav2_bringup/params/nav2_params.yaml",[74,9346,9347],{},"/opt/ros/jazzy/share/nav2_bt_navigator/behavior_trees/navigate_to_pose_w_replanning_and_recovery.xml",[74,9349,9350],{},"/opt/ros/jazzy/share/nav2_bt_navigator/behavior_trees/navigate_through_poses_w_replanning_and_recovery.xml","，以及 Nav2 的配置说明页面。下面的工程参数使用当前工作空间中已经跑通的 ",[74,9353,9354],{},"mycar_navigation2_jazzy"," 配置。",[18,9357,9358],{},[21,9359,5956],{},[18,9361,5013],{},[68,9363,9365],{"className":70,"code":9364,"language":72,"meta":32,"style":32},"ros2 pkg create mycar_navigation2_jazzy --dependencies navigation2 nav2_common\n",[74,9366,9367],{"__ignoreMap":32},[77,9368,9369,9371,9373,9375,9378,9380,9383],{"class":79,"line":80},[77,9370,1201],{"class":83},[77,9372,1204],{"class":87},[77,9374,1207],{"class":87},[77,9376,9377],{"class":87}," mycar_navigation2_jazzy",[77,9379,1214],{"class":1213},[77,9381,9382],{"class":87}," navigation2",[77,9384,9385],{"class":87}," nav2_common\n",[18,9387,9388],{},[21,9389,5987],{},[18,9391,9392],{},"在功能包下，新建launch目录、params目录和bts目录。",[18,9394,9395,9396,1229],{},"launch目录下新建",[74,9397,9398],{},"nav2.launch.py",[68,9400,9402],{"className":1232,"code":9401,"language":1234,"meta":32,"style":32},"import os\n\nfrom ament_index_python.packages import get_package_share_directory\n\nfrom launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument\nfrom launch.substitutions import LaunchConfiguration\n\nfrom launch_ros.actions import Node\nfrom launch_ros.descriptions import ParameterFile\n\nfrom nav2_common.launch import RewrittenYaml\n\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument(\n        'use_sim_time',\n        default_value='false'\n    )\n\n    use_sim_time = LaunchConfiguration('use_sim_time')\n    current_pkg = get_package_share_directory(\"mycar_navigation2_jazzy\")\n\n    bt_params_file = os.path.join(current_pkg, \"params\", \"bt.yaml\")\n    planner_params_file = os.path.join(current_pkg, \"params\", \"planner.yaml\")\n    controller_params_file = os.path.join(current_pkg, \"params\", \"controller.yaml\")\n    behavior_params_file = os.path.join(current_pkg, \"params\", \"behavior.yaml\")\n    waypoint_params_file = os.path.join(current_pkg, \"params\", \"waypoint.yaml\")\n    velocity_params_file = os.path.join(current_pkg, \"params\", \"velocity.yaml\")\n    smoother_params_file = os.path.join(current_pkg, \"params\", \"smoother.yaml\")\n\n    def rewrite_params(params_file):\n        return ParameterFile(\n            RewrittenYaml(\n                source_file=params_file,\n                root_key='',\n                param_rewrites={\n                    'use_sim_time': use_sim_time\n                },\n                convert_types=True\n            ),\n            allow_substs=True\n        )\n\n    bt_params = rewrite_params(bt_params_file)\n    planner_params = rewrite_params(planner_params_file)\n    controller_params = rewrite_params(controller_params_file)\n    behavior_params = rewrite_params(behavior_params_file)\n    waypoint_params = rewrite_params(waypoint_params_file)\n    velocity_params = rewrite_params(velocity_params_file)\n    smoother_params = rewrite_params(smoother_params_file)\n\n    planner_server_node = Node(\n        package='nav2_planner',\n        executable='planner_server',\n        name='planner_server',\n        output='screen',\n        parameters=[\n            planner_params,\n            {'use_sim_time': use_sim_time}\n        ],\n    )\n\n    controller_server_node = Node(\n        package='nav2_controller',\n        executable='controller_server',\n        name='controller_server',\n        output='screen',\n        parameters=[\n            controller_params,\n            {'use_sim_time': use_sim_time}\n        ],\n        remappings=[\n            ('cmd_vel', 'cmd_vel_nav')\n        ]\n    )\n\n    behavior_server_node = Node(\n        package='nav2_behaviors',\n        executable='behavior_server',\n        name='behavior_server',\n        output='screen',\n        parameters=[\n            behavior_params,\n            {'use_sim_time': use_sim_time}\n        ]\n    )\n\n    waypoint_node = Node(\n        package='nav2_waypoint_follower',\n        executable='waypoint_follower',\n        name='waypoint_follower',\n        output='screen',\n        parameters=[\n            waypoint_params,\n            {'use_sim_time': use_sim_time}\n        ]\n    )\n\n    velocity_smoother_node = Node(\n        package='nav2_velocity_smoother',\n        executable='velocity_smoother',\n        name='velocity_smoother',\n        output='screen',\n        respawn_delay=2.0,\n        parameters=[\n            velocity_params,\n            {'use_sim_time': use_sim_time}\n        ],\n        remappings=[\n            ('cmd_vel', 'cmd_vel_nav'),\n            ('cmd_vel_smoothed', 'cmd_vel')\n        ]\n    )\n\n    smoother_server_node = Node(\n        package='nav2_smoother',\n        executable='smoother_server',\n        name='smoother_server',\n        output='screen',\n        parameters=[\n            smoother_params,\n            {'use_sim_time': use_sim_time}\n        ],\n    )\n\n    bt_navigator_node = Node(\n        package='nav2_bt_navigator',\n        executable='bt_navigator',\n        name='bt_navigator',\n        output='screen',\n        parameters=[\n            bt_params,\n            {'use_sim_time': use_sim_time},\n            {\n                \"default_nav_to_pose_bt_xml\": os.path.join(\n                    current_pkg,\n                    \"bts\",\n                    \"bt_planner_controller_behavior.xml\"\n                )\n            },\n            {\n                \"default_nav_through_poses_bt_xml\": os.path.join(\n                    current_pkg,\n                    \"bts\",\n                    \"bt_planner_controller_behavior_poses.xml\"\n                )\n            }\n        ],\n    )\n\n    lifecycle_manager_node = Node(\n        package='nav2_lifecycle_manager',\n        executable='lifecycle_manager',\n        name='lifecycle_manager_navigation',\n        output='screen',\n        parameters=[\n            {'use_sim_time': use_sim_time},\n            {'autostart': True},\n            {\n                'node_names': [\n                    'bt_navigator',\n                    'planner_server',\n                    'controller_server',\n                    'behavior_server',\n                    'waypoint_follower',\n                    'velocity_smoother',\n                    'smoother_server'\n                ]\n            }\n        ]\n    )\n\n    return LaunchDescription([\n        use_sim_time_arg,\n\n        lifecycle_manager_node,\n        bt_navigator_node,\n        planner_server_node,\n        controller_server_node,\n        behavior_server_node,\n        waypoint_node,\n        velocity_smoother_node,\n        smoother_server_node\n    ])\n",[74,9403,9404,9410,9414,9424,9428,9438,9448,9458,9462,9472,9484,9488,9500,9504,9508,9516,9520,9528,9534,9542,9546,9550,9562,9577,9581,9600,9618,9636,9654,9672,9690,9708,9712,9723,9731,9736,9746,9758,9767,9775,9780,9790,9795,9804,9809,9813,9823,9833,9843,9853,9863,9873,9883,9887,9896,9907,9918,9928,9938,9946,9951,9959,9963,9967,9971,9980,9991,10003,10014,10025,10034,10040,10049,10054,10064,10080,10085,10090,10095,10105,10117,10129,10140,10151,10160,10166,10175,10180,10185,10190,10200,10212,10224,10235,10246,10255,10261,10270,10275,10280,10285,10295,10307,10319,10330,10341,10354,10363,10369,10378,10383,10392,10405,10419,10424,10429,10434,10444,10456,10468,10479,10490,10499,10505,10514,10519,10524,10529,10539,10551,10563,10574,10585,10594,10600,10610,10616,10625,10631,10639,10645,10651,10657,10662,10670,10675,10682,10688,10693,10699,10704,10709,10714,10724,10735,10746,10758,10769,10778,10787,10800,10805,10814,10822,10830,10838,10846,10854,10862,10868,10874,10879,10884,10889,10894,10901,10906,10911,10917,10923,10929,10935,10941,10947,10953,10959],{"__ignoreMap":32},[77,9405,9406,9408],{"class":79,"line":80},[77,9407,1241],{"class":97},[77,9409,1244],{"class":104},[77,9411,9412],{"class":79,"line":114},[77,9413,140],{"emptyLinePlaceholder":139},[77,9415,9416,9418,9420,9422],{"class":79,"line":136},[77,9417,1253],{"class":97},[77,9419,1304],{"class":104},[77,9421,1241],{"class":97},[77,9423,1309],{"class":104},[77,9425,9426],{"class":79,"line":143},[77,9427,140],{"emptyLinePlaceholder":139},[77,9429,9430,9432,9434,9436],{"class":79,"line":150},[77,9431,1253],{"class":97},[77,9433,1256],{"class":104},[77,9435,1241],{"class":97},[77,9437,1261],{"class":104},[77,9439,9440,9442,9444,9446],{"class":79,"line":162},[77,9441,1253],{"class":97},[77,9443,1268],{"class":104},[77,9445,1241],{"class":97},[77,9447,1273],{"class":104},[77,9449,9450,9452,9454,9456],{"class":79,"line":174},[77,9451,1253],{"class":97},[77,9453,1280],{"class":104},[77,9455,1241],{"class":97},[77,9457,1285],{"class":104},[77,9459,9460],{"class":79,"line":179},[77,9461,140],{"emptyLinePlaceholder":139},[77,9463,9464,9466,9468,9470],{"class":79,"line":184},[77,9465,1253],{"class":97},[77,9467,1292],{"class":104},[77,9469,1241],{"class":97},[77,9471,1297],{"class":104},[77,9473,9474,9476,9479,9481],{"class":79,"line":195},[77,9475,1253],{"class":97},[77,9477,9478],{"class":104}," launch_ros.descriptions ",[77,9480,1241],{"class":97},[77,9482,9483],{"class":104}," ParameterFile\n",[77,9485,9486],{"class":79,"line":1344},[77,9487,140],{"emptyLinePlaceholder":139},[77,9489,9490,9492,9495,9497],{"class":79,"line":1359},[77,9491,1253],{"class":97},[77,9493,9494],{"class":104}," nav2_common.launch ",[77,9496,1241],{"class":97},[77,9498,9499],{"class":104}," RewrittenYaml\n",[77,9501,9502],{"class":79,"line":1364},[77,9503,140],{"emptyLinePlaceholder":139},[77,9505,9506],{"class":79,"line":1375},[77,9507,140],{"emptyLinePlaceholder":139},[77,9509,9510,9512,9514],{"class":79,"line":1384},[77,9511,1318],{"class":97},[77,9513,1321],{"class":83},[77,9515,1324],{"class":104},[77,9517,9518],{"class":79,"line":1398},[77,9519,140],{"emptyLinePlaceholder":139},[77,9521,9522,9524,9526],{"class":79,"line":1411},[77,9523,3091],{"class":104},[77,9525,1332],{"class":97},[77,9527,1372],{"class":104},[77,9529,9530,9532],{"class":79,"line":1421},[77,9531,1378],{"class":87},[77,9533,1381],{"class":104},[77,9535,9536,9538,9540],{"class":79,"line":1429},[77,9537,1388],{"class":1387},[77,9539,1332],{"class":97},[77,9541,6118],{"class":87},[77,9543,9544],{"class":79,"line":1445},[77,9545,3244],{"class":104},[77,9547,9548],{"class":79,"line":1459},[77,9549,140],{"emptyLinePlaceholder":139},[77,9551,9552,9554,9556,9558,9560],{"class":79,"line":1471},[77,9553,1329],{"class":104},[77,9555,1332],{"class":97},[77,9557,1335],{"class":104},[77,9559,1338],{"class":87},[77,9561,1341],{"class":104},[77,9563,9564,9567,9569,9572,9575],{"class":79,"line":1476},[77,9565,9566],{"class":104},"    current_pkg ",[77,9568,1332],{"class":97},[77,9570,9571],{"class":104}," get_package_share_directory(",[77,9573,9574],{"class":87},"\"mycar_navigation2_jazzy\"",[77,9576,1341],{"class":104},[77,9578,9579],{"class":79,"line":1487},[77,9580,140],{"emptyLinePlaceholder":139},[77,9582,9583,9586,9588,9591,9593,9595,9598],{"class":79,"line":1498},[77,9584,9585],{"class":104},"    bt_params_file ",[77,9587,1332],{"class":97},[77,9589,9590],{"class":104}," os.path.join(current_pkg, ",[77,9592,3215],{"class":87},[77,9594,1451],{"class":104},[77,9596,9597],{"class":87},"\"bt.yaml\"",[77,9599,1341],{"class":104},[77,9601,9602,9605,9607,9609,9611,9613,9616],{"class":79,"line":1504},[77,9603,9604],{"class":104},"    planner_params_file ",[77,9606,1332],{"class":97},[77,9608,9590],{"class":104},[77,9610,3215],{"class":87},[77,9612,1451],{"class":104},[77,9614,9615],{"class":87},"\"planner.yaml\"",[77,9617,1341],{"class":104},[77,9619,9620,9623,9625,9627,9629,9631,9634],{"class":79,"line":1515},[77,9621,9622],{"class":104},"    controller_params_file ",[77,9624,1332],{"class":97},[77,9626,9590],{"class":104},[77,9628,3215],{"class":87},[77,9630,1451],{"class":104},[77,9632,9633],{"class":87},"\"controller.yaml\"",[77,9635,1341],{"class":104},[77,9637,9638,9641,9643,9645,9647,9649,9652],{"class":79,"line":1521},[77,9639,9640],{"class":104},"    behavior_params_file ",[77,9642,1332],{"class":97},[77,9644,9590],{"class":104},[77,9646,3215],{"class":87},[77,9648,1451],{"class":104},[77,9650,9651],{"class":87},"\"behavior.yaml\"",[77,9653,1341],{"class":104},[77,9655,9656,9659,9661,9663,9665,9667,9670],{"class":79,"line":1534},[77,9657,9658],{"class":104},"    waypoint_params_file ",[77,9660,1332],{"class":97},[77,9662,9590],{"class":104},[77,9664,3215],{"class":87},[77,9666,1451],{"class":104},[77,9668,9669],{"class":87},"\"waypoint.yaml\"",[77,9671,1341],{"class":104},[77,9673,9674,9677,9679,9681,9683,9685,9688],{"class":79,"line":1547},[77,9675,9676],{"class":104},"    velocity_params_file ",[77,9678,1332],{"class":97},[77,9680,9590],{"class":104},[77,9682,3215],{"class":87},[77,9684,1451],{"class":104},[77,9686,9687],{"class":87},"\"velocity.yaml\"",[77,9689,1341],{"class":104},[77,9691,9692,9695,9697,9699,9701,9703,9706],{"class":79,"line":1559},[77,9693,9694],{"class":104},"    smoother_params_file ",[77,9696,1332],{"class":97},[77,9698,9590],{"class":104},[77,9700,3215],{"class":87},[77,9702,1451],{"class":104},[77,9704,9705],{"class":87},"\"smoother.yaml\"",[77,9707,1341],{"class":104},[77,9709,9710],{"class":79,"line":1572},[77,9711,140],{"emptyLinePlaceholder":139},[77,9713,9714,9717,9720],{"class":79,"line":1577},[77,9715,9716],{"class":97},"    def",[77,9718,9719],{"class":83}," rewrite_params",[77,9721,9722],{"class":104},"(params_file):\n",[77,9724,9725,9728],{"class":79,"line":1588},[77,9726,9727],{"class":97},"        return",[77,9729,9730],{"class":104}," ParameterFile(\n",[77,9732,9733],{"class":79,"line":1593},[77,9734,9735],{"class":104},"            RewrittenYaml(\n",[77,9737,9738,9741,9743],{"class":79,"line":1599},[77,9739,9740],{"class":1387},"                source_file",[77,9742,1332],{"class":97},[77,9744,9745],{"class":104},"params_file,\n",[77,9747,9748,9751,9753,9756],{"class":79,"line":1605},[77,9749,9750],{"class":1387},"                root_key",[77,9752,1332],{"class":97},[77,9754,9755],{"class":87},"''",[77,9757,1381],{"class":104},[77,9759,9760,9763,9765],{"class":79,"line":1611},[77,9761,9762],{"class":1387},"                param_rewrites",[77,9764,1332],{"class":97},[77,9766,6428],{"class":104},[77,9768,9769,9772],{"class":79,"line":1616},[77,9770,9771],{"class":87},"                    'use_sim_time'",[77,9773,9774],{"class":104},": use_sim_time\n",[77,9776,9777],{"class":79,"line":1999},[77,9778,9779],{"class":104},"                },\n",[77,9781,9782,9785,9787],{"class":79,"line":2010},[77,9783,9784],{"class":1387},"                convert_types",[77,9786,1332],{"class":97},[77,9788,9789],{"class":1213},"True\n",[77,9791,9792],{"class":79,"line":2023},[77,9793,9794],{"class":104},"            ),\n",[77,9796,9797,9800,9802],{"class":79,"line":2037},[77,9798,9799],{"class":1387},"            allow_substs",[77,9801,1332],{"class":97},[77,9803,9789],{"class":1213},[77,9805,9806],{"class":79,"line":2050},[77,9807,9808],{"class":104},"        )\n",[77,9810,9811],{"class":79,"line":2064},[77,9812,140],{"emptyLinePlaceholder":139},[77,9814,9815,9818,9820],{"class":79,"line":2075},[77,9816,9817],{"class":104},"    bt_params ",[77,9819,1332],{"class":97},[77,9821,9822],{"class":104}," rewrite_params(bt_params_file)\n",[77,9824,9825,9828,9830],{"class":79,"line":2080},[77,9826,9827],{"class":104},"    planner_params ",[77,9829,1332],{"class":97},[77,9831,9832],{"class":104}," rewrite_params(planner_params_file)\n",[77,9834,9835,9838,9840],{"class":79,"line":2090},[77,9836,9837],{"class":104},"    controller_params ",[77,9839,1332],{"class":97},[77,9841,9842],{"class":104}," rewrite_params(controller_params_file)\n",[77,9844,9845,9848,9850],{"class":79,"line":2101},[77,9846,9847],{"class":104},"    behavior_params ",[77,9849,1332],{"class":97},[77,9851,9852],{"class":104}," rewrite_params(behavior_params_file)\n",[77,9854,9855,9858,9860],{"class":79,"line":2113},[77,9856,9857],{"class":104},"    waypoint_params ",[77,9859,1332],{"class":97},[77,9861,9862],{"class":104}," rewrite_params(waypoint_params_file)\n",[77,9864,9865,9868,9870],{"class":79,"line":2118},[77,9866,9867],{"class":104},"    velocity_params ",[77,9869,1332],{"class":97},[77,9871,9872],{"class":104}," rewrite_params(velocity_params_file)\n",[77,9874,9875,9878,9880],{"class":79,"line":2129},[77,9876,9877],{"class":104},"    smoother_params ",[77,9879,1332],{"class":97},[77,9881,9882],{"class":104}," rewrite_params(smoother_params_file)\n",[77,9884,9885],{"class":79,"line":2139},[77,9886,140],{"emptyLinePlaceholder":139},[77,9888,9889,9892,9894],{"class":79,"line":2150},[77,9890,9891],{"class":104},"    planner_server_node ",[77,9893,1332],{"class":97},[77,9895,1484],{"class":104},[77,9897,9898,9900,9902,9905],{"class":79,"line":2155},[77,9899,1524],{"class":1387},[77,9901,1332],{"class":97},[77,9903,9904],{"class":87},"'nav2_planner'",[77,9906,1381],{"class":104},[77,9908,9909,9911,9913,9916],{"class":79,"line":2169},[77,9910,1537],{"class":1387},[77,9912,1332],{"class":97},[77,9914,9915],{"class":87},"'planner_server'",[77,9917,1381],{"class":104},[77,9919,9920,9922,9924,9926],{"class":79,"line":2182},[77,9921,1550],{"class":1387},[77,9923,1332],{"class":97},[77,9925,9915],{"class":87},[77,9927,1381],{"class":104},[77,9929,9930,9932,9934,9936],{"class":79,"line":2187},[77,9931,1562],{"class":1387},[77,9933,1332],{"class":97},[77,9935,1567],{"class":87},[77,9937,1381],{"class":104},[77,9939,9940,9942,9944],{"class":79,"line":2201},[77,9941,1490],{"class":1387},[77,9943,1332],{"class":97},[77,9945,1495],{"class":104},[77,9947,9948],{"class":79,"line":2215},[77,9949,9950],{"class":104},"            planner_params,\n",[77,9952,9953,9955,9957],{"class":79,"line":2229},[77,9954,3291],{"class":104},[77,9956,1338],{"class":87},[77,9958,1512],{"class":104},[77,9960,9961],{"class":79,"line":2240},[77,9962,1518],{"class":104},[77,9964,9965],{"class":79,"line":2250},[77,9966,3244],{"class":104},[77,9968,9969],{"class":79,"line":6470},[77,9970,140],{"emptyLinePlaceholder":139},[77,9972,9973,9976,9978],{"class":79,"line":6476},[77,9974,9975],{"class":104},"    controller_server_node ",[77,9977,1332],{"class":97},[77,9979,1484],{"class":104},[77,9981,9982,9984,9986,9989],{"class":79,"line":6482},[77,9983,1524],{"class":1387},[77,9985,1332],{"class":97},[77,9987,9988],{"class":87},"'nav2_controller'",[77,9990,1381],{"class":104},[77,9992,9994,9996,9998,10001],{"class":79,"line":9993},67,[77,9995,1537],{"class":1387},[77,9997,1332],{"class":97},[77,9999,10000],{"class":87},"'controller_server'",[77,10002,1381],{"class":104},[77,10004,10006,10008,10010,10012],{"class":79,"line":10005},68,[77,10007,1550],{"class":1387},[77,10009,1332],{"class":97},[77,10011,10000],{"class":87},[77,10013,1381],{"class":104},[77,10015,10017,10019,10021,10023],{"class":79,"line":10016},69,[77,10018,1562],{"class":1387},[77,10020,1332],{"class":97},[77,10022,1567],{"class":87},[77,10024,1381],{"class":104},[77,10026,10028,10030,10032],{"class":79,"line":10027},70,[77,10029,1490],{"class":1387},[77,10031,1332],{"class":97},[77,10033,1495],{"class":104},[77,10035,10037],{"class":79,"line":10036},71,[77,10038,10039],{"class":104},"            controller_params,\n",[77,10041,10043,10045,10047],{"class":79,"line":10042},72,[77,10044,3291],{"class":104},[77,10046,1338],{"class":87},[77,10048,1512],{"class":104},[77,10050,10052],{"class":79,"line":10051},73,[77,10053,1518],{"class":104},[77,10055,10057,10060,10062],{"class":79,"line":10056},74,[77,10058,10059],{"class":1387},"        remappings",[77,10061,1332],{"class":97},[77,10063,1495],{"class":104},[77,10065,10067,10070,10073,10075,10078],{"class":79,"line":10066},75,[77,10068,10069],{"class":104},"            (",[77,10071,10072],{"class":87},"'cmd_vel'",[77,10074,1451],{"class":104},[77,10076,10077],{"class":87},"'cmd_vel_nav'",[77,10079,1341],{"class":104},[77,10081,10083],{"class":79,"line":10082},76,[77,10084,6251],{"class":104},[77,10086,10088],{"class":79,"line":10087},77,[77,10089,3244],{"class":104},[77,10091,10093],{"class":79,"line":10092},78,[77,10094,140],{"emptyLinePlaceholder":139},[77,10096,10098,10101,10103],{"class":79,"line":10097},79,[77,10099,10100],{"class":104},"    behavior_server_node ",[77,10102,1332],{"class":97},[77,10104,1484],{"class":104},[77,10106,10108,10110,10112,10115],{"class":79,"line":10107},80,[77,10109,1524],{"class":1387},[77,10111,1332],{"class":97},[77,10113,10114],{"class":87},"'nav2_behaviors'",[77,10116,1381],{"class":104},[77,10118,10120,10122,10124,10127],{"class":79,"line":10119},81,[77,10121,1537],{"class":1387},[77,10123,1332],{"class":97},[77,10125,10126],{"class":87},"'behavior_server'",[77,10128,1381],{"class":104},[77,10130,10132,10134,10136,10138],{"class":79,"line":10131},82,[77,10133,1550],{"class":1387},[77,10135,1332],{"class":97},[77,10137,10126],{"class":87},[77,10139,1381],{"class":104},[77,10141,10143,10145,10147,10149],{"class":79,"line":10142},83,[77,10144,1562],{"class":1387},[77,10146,1332],{"class":97},[77,10148,1567],{"class":87},[77,10150,1381],{"class":104},[77,10152,10154,10156,10158],{"class":79,"line":10153},84,[77,10155,1490],{"class":1387},[77,10157,1332],{"class":97},[77,10159,1495],{"class":104},[77,10161,10163],{"class":79,"line":10162},85,[77,10164,10165],{"class":104},"            behavior_params,\n",[77,10167,10169,10171,10173],{"class":79,"line":10168},86,[77,10170,3291],{"class":104},[77,10172,1338],{"class":87},[77,10174,1512],{"class":104},[77,10176,10178],{"class":79,"line":10177},87,[77,10179,6251],{"class":104},[77,10181,10183],{"class":79,"line":10182},88,[77,10184,3244],{"class":104},[77,10186,10188],{"class":79,"line":10187},89,[77,10189,140],{"emptyLinePlaceholder":139},[77,10191,10193,10196,10198],{"class":79,"line":10192},90,[77,10194,10195],{"class":104},"    waypoint_node ",[77,10197,1332],{"class":97},[77,10199,1484],{"class":104},[77,10201,10203,10205,10207,10210],{"class":79,"line":10202},91,[77,10204,1524],{"class":1387},[77,10206,1332],{"class":97},[77,10208,10209],{"class":87},"'nav2_waypoint_follower'",[77,10211,1381],{"class":104},[77,10213,10215,10217,10219,10222],{"class":79,"line":10214},92,[77,10216,1537],{"class":1387},[77,10218,1332],{"class":97},[77,10220,10221],{"class":87},"'waypoint_follower'",[77,10223,1381],{"class":104},[77,10225,10227,10229,10231,10233],{"class":79,"line":10226},93,[77,10228,1550],{"class":1387},[77,10230,1332],{"class":97},[77,10232,10221],{"class":87},[77,10234,1381],{"class":104},[77,10236,10238,10240,10242,10244],{"class":79,"line":10237},94,[77,10239,1562],{"class":1387},[77,10241,1332],{"class":97},[77,10243,1567],{"class":87},[77,10245,1381],{"class":104},[77,10247,10249,10251,10253],{"class":79,"line":10248},95,[77,10250,1490],{"class":1387},[77,10252,1332],{"class":97},[77,10254,1495],{"class":104},[77,10256,10258],{"class":79,"line":10257},96,[77,10259,10260],{"class":104},"            waypoint_params,\n",[77,10262,10264,10266,10268],{"class":79,"line":10263},97,[77,10265,3291],{"class":104},[77,10267,1338],{"class":87},[77,10269,1512],{"class":104},[77,10271,10273],{"class":79,"line":10272},98,[77,10274,6251],{"class":104},[77,10276,10278],{"class":79,"line":10277},99,[77,10279,3244],{"class":104},[77,10281,10283],{"class":79,"line":10282},100,[77,10284,140],{"emptyLinePlaceholder":139},[77,10286,10288,10291,10293],{"class":79,"line":10287},101,[77,10289,10290],{"class":104},"    velocity_smoother_node ",[77,10292,1332],{"class":97},[77,10294,1484],{"class":104},[77,10296,10298,10300,10302,10305],{"class":79,"line":10297},102,[77,10299,1524],{"class":1387},[77,10301,1332],{"class":97},[77,10303,10304],{"class":87},"'nav2_velocity_smoother'",[77,10306,1381],{"class":104},[77,10308,10310,10312,10314,10317],{"class":79,"line":10309},103,[77,10311,1537],{"class":1387},[77,10313,1332],{"class":97},[77,10315,10316],{"class":87},"'velocity_smoother'",[77,10318,1381],{"class":104},[77,10320,10322,10324,10326,10328],{"class":79,"line":10321},104,[77,10323,1550],{"class":1387},[77,10325,1332],{"class":97},[77,10327,10316],{"class":87},[77,10329,1381],{"class":104},[77,10331,10333,10335,10337,10339],{"class":79,"line":10332},105,[77,10334,1562],{"class":1387},[77,10336,1332],{"class":97},[77,10338,1567],{"class":87},[77,10340,1381],{"class":104},[77,10342,10344,10347,10349,10352],{"class":79,"line":10343},106,[77,10345,10346],{"class":1387},"        respawn_delay",[77,10348,1332],{"class":97},[77,10350,10351],{"class":1213},"2.0",[77,10353,1381],{"class":104},[77,10355,10357,10359,10361],{"class":79,"line":10356},107,[77,10358,1490],{"class":1387},[77,10360,1332],{"class":97},[77,10362,1495],{"class":104},[77,10364,10366],{"class":79,"line":10365},108,[77,10367,10368],{"class":104},"            velocity_params,\n",[77,10370,10372,10374,10376],{"class":79,"line":10371},109,[77,10373,3291],{"class":104},[77,10375,1338],{"class":87},[77,10377,1512],{"class":104},[77,10379,10381],{"class":79,"line":10380},110,[77,10382,1518],{"class":104},[77,10384,10386,10388,10390],{"class":79,"line":10385},111,[77,10387,10059],{"class":1387},[77,10389,1332],{"class":97},[77,10391,1495],{"class":104},[77,10393,10395,10397,10399,10401,10403],{"class":79,"line":10394},112,[77,10396,10069],{"class":104},[77,10398,10072],{"class":87},[77,10400,1451],{"class":104},[77,10402,10077],{"class":87},[77,10404,1442],{"class":104},[77,10406,10408,10410,10413,10415,10417],{"class":79,"line":10407},113,[77,10409,10069],{"class":104},[77,10411,10412],{"class":87},"'cmd_vel_smoothed'",[77,10414,1451],{"class":104},[77,10416,10072],{"class":87},[77,10418,1341],{"class":104},[77,10420,10422],{"class":79,"line":10421},114,[77,10423,6251],{"class":104},[77,10425,10427],{"class":79,"line":10426},115,[77,10428,3244],{"class":104},[77,10430,10432],{"class":79,"line":10431},116,[77,10433,140],{"emptyLinePlaceholder":139},[77,10435,10437,10440,10442],{"class":79,"line":10436},117,[77,10438,10439],{"class":104},"    smoother_server_node ",[77,10441,1332],{"class":97},[77,10443,1484],{"class":104},[77,10445,10447,10449,10451,10454],{"class":79,"line":10446},118,[77,10448,1524],{"class":1387},[77,10450,1332],{"class":97},[77,10452,10453],{"class":87},"'nav2_smoother'",[77,10455,1381],{"class":104},[77,10457,10459,10461,10463,10466],{"class":79,"line":10458},119,[77,10460,1537],{"class":1387},[77,10462,1332],{"class":97},[77,10464,10465],{"class":87},"'smoother_server'",[77,10467,1381],{"class":104},[77,10469,10471,10473,10475,10477],{"class":79,"line":10470},120,[77,10472,1550],{"class":1387},[77,10474,1332],{"class":97},[77,10476,10465],{"class":87},[77,10478,1381],{"class":104},[77,10480,10482,10484,10486,10488],{"class":79,"line":10481},121,[77,10483,1562],{"class":1387},[77,10485,1332],{"class":97},[77,10487,1567],{"class":87},[77,10489,1381],{"class":104},[77,10491,10493,10495,10497],{"class":79,"line":10492},122,[77,10494,1490],{"class":1387},[77,10496,1332],{"class":97},[77,10498,1495],{"class":104},[77,10500,10502],{"class":79,"line":10501},123,[77,10503,10504],{"class":104},"            smoother_params,\n",[77,10506,10508,10510,10512],{"class":79,"line":10507},124,[77,10509,3291],{"class":104},[77,10511,1338],{"class":87},[77,10513,1512],{"class":104},[77,10515,10517],{"class":79,"line":10516},125,[77,10518,1518],{"class":104},[77,10520,10522],{"class":79,"line":10521},126,[77,10523,3244],{"class":104},[77,10525,10527],{"class":79,"line":10526},127,[77,10528,140],{"emptyLinePlaceholder":139},[77,10530,10532,10535,10537],{"class":79,"line":10531},128,[77,10533,10534],{"class":104},"    bt_navigator_node ",[77,10536,1332],{"class":97},[77,10538,1484],{"class":104},[77,10540,10542,10544,10546,10549],{"class":79,"line":10541},129,[77,10543,1524],{"class":1387},[77,10545,1332],{"class":97},[77,10547,10548],{"class":87},"'nav2_bt_navigator'",[77,10550,1381],{"class":104},[77,10552,10554,10556,10558,10561],{"class":79,"line":10553},130,[77,10555,1537],{"class":1387},[77,10557,1332],{"class":97},[77,10559,10560],{"class":87},"'bt_navigator'",[77,10562,1381],{"class":104},[77,10564,10566,10568,10570,10572],{"class":79,"line":10565},131,[77,10567,1550],{"class":1387},[77,10569,1332],{"class":97},[77,10571,10560],{"class":87},[77,10573,1381],{"class":104},[77,10575,10577,10579,10581,10583],{"class":79,"line":10576},132,[77,10578,1562],{"class":1387},[77,10580,1332],{"class":97},[77,10582,1567],{"class":87},[77,10584,1381],{"class":104},[77,10586,10588,10590,10592],{"class":79,"line":10587},133,[77,10589,1490],{"class":1387},[77,10591,1332],{"class":97},[77,10593,1495],{"class":104},[77,10595,10597],{"class":79,"line":10596},134,[77,10598,10599],{"class":104},"            bt_params,\n",[77,10601,10603,10605,10607],{"class":79,"line":10602},135,[77,10604,3291],{"class":104},[77,10606,1338],{"class":87},[77,10608,10609],{"class":104},": use_sim_time},\n",[77,10611,10613],{"class":79,"line":10612},136,[77,10614,10615],{"class":104},"            {\n",[77,10617,10619,10622],{"class":79,"line":10618},137,[77,10620,10621],{"class":87},"                \"default_nav_to_pose_bt_xml\"",[77,10623,10624],{"class":104},": os.path.join(\n",[77,10626,10628],{"class":79,"line":10627},138,[77,10629,10630],{"class":104},"                    current_pkg,\n",[77,10632,10634,10637],{"class":79,"line":10633},139,[77,10635,10636],{"class":87},"                    \"bts\"",[77,10638,1381],{"class":104},[77,10640,10642],{"class":79,"line":10641},140,[77,10643,10644],{"class":87},"                    \"bt_planner_controller_behavior.xml\"\n",[77,10646,10648],{"class":79,"line":10647},141,[77,10649,10650],{"class":104},"                )\n",[77,10652,10654],{"class":79,"line":10653},142,[77,10655,10656],{"class":104},"            },\n",[77,10658,10660],{"class":79,"line":10659},143,[77,10661,10615],{"class":104},[77,10663,10665,10668],{"class":79,"line":10664},144,[77,10666,10667],{"class":87},"                \"default_nav_through_poses_bt_xml\"",[77,10669,10624],{"class":104},[77,10671,10673],{"class":79,"line":10672},145,[77,10674,10630],{"class":104},[77,10676,10678,10680],{"class":79,"line":10677},146,[77,10679,10636],{"class":87},[77,10681,1381],{"class":104},[77,10683,10685],{"class":79,"line":10684},147,[77,10686,10687],{"class":87},"                    \"bt_planner_controller_behavior_poses.xml\"\n",[77,10689,10691],{"class":79,"line":10690},148,[77,10692,10650],{"class":104},[77,10694,10696],{"class":79,"line":10695},149,[77,10697,10698],{"class":104},"            }\n",[77,10700,10702],{"class":79,"line":10701},150,[77,10703,1518],{"class":104},[77,10705,10707],{"class":79,"line":10706},151,[77,10708,3244],{"class":104},[77,10710,10712],{"class":79,"line":10711},152,[77,10713,140],{"emptyLinePlaceholder":139},[77,10715,10717,10720,10722],{"class":79,"line":10716},153,[77,10718,10719],{"class":104},"    lifecycle_manager_node ",[77,10721,1332],{"class":97},[77,10723,1484],{"class":104},[77,10725,10727,10729,10731,10733],{"class":79,"line":10726},154,[77,10728,1524],{"class":1387},[77,10730,1332],{"class":97},[77,10732,5357],{"class":87},[77,10734,1381],{"class":104},[77,10736,10738,10740,10742,10744],{"class":79,"line":10737},155,[77,10739,1537],{"class":1387},[77,10741,1332],{"class":97},[77,10743,5369],{"class":87},[77,10745,1381],{"class":104},[77,10747,10749,10751,10753,10756],{"class":79,"line":10748},156,[77,10750,1550],{"class":1387},[77,10752,1332],{"class":97},[77,10754,10755],{"class":87},"'lifecycle_manager_navigation'",[77,10757,1381],{"class":104},[77,10759,10761,10763,10765,10767],{"class":79,"line":10760},157,[77,10762,1562],{"class":1387},[77,10764,1332],{"class":97},[77,10766,1567],{"class":87},[77,10768,1381],{"class":104},[77,10770,10772,10774,10776],{"class":79,"line":10771},158,[77,10773,1490],{"class":1387},[77,10775,1332],{"class":97},[77,10777,1495],{"class":104},[77,10779,10781,10783,10785],{"class":79,"line":10780},159,[77,10782,3291],{"class":104},[77,10784,1338],{"class":87},[77,10786,10609],{"class":104},[77,10788,10790,10792,10794,10796,10798],{"class":79,"line":10789},160,[77,10791,3291],{"class":104},[77,10793,5419],{"class":87},[77,10795,1662],{"class":104},[77,10797,5319],{"class":1213},[77,10799,5322],{"class":104},[77,10801,10803],{"class":79,"line":10802},161,[77,10804,10615],{"class":104},[77,10806,10808,10811],{"class":79,"line":10807},162,[77,10809,10810],{"class":87},"                'node_names'",[77,10812,10813],{"class":104},": [\n",[77,10815,10817,10820],{"class":79,"line":10816},163,[77,10818,10819],{"class":87},"                    'bt_navigator'",[77,10821,1381],{"class":104},[77,10823,10825,10828],{"class":79,"line":10824},164,[77,10826,10827],{"class":87},"                    'planner_server'",[77,10829,1381],{"class":104},[77,10831,10833,10836],{"class":79,"line":10832},165,[77,10834,10835],{"class":87},"                    'controller_server'",[77,10837,1381],{"class":104},[77,10839,10841,10844],{"class":79,"line":10840},166,[77,10842,10843],{"class":87},"                    'behavior_server'",[77,10845,1381],{"class":104},[77,10847,10849,10852],{"class":79,"line":10848},167,[77,10850,10851],{"class":87},"                    'waypoint_follower'",[77,10853,1381],{"class":104},[77,10855,10857,10860],{"class":79,"line":10856},168,[77,10858,10859],{"class":87},"                    'velocity_smoother'",[77,10861,1381],{"class":104},[77,10863,10865],{"class":79,"line":10864},169,[77,10866,10867],{"class":87},"                    'smoother_server'\n",[77,10869,10871],{"class":79,"line":10870},170,[77,10872,10873],{"class":104},"                ]\n",[77,10875,10877],{"class":79,"line":10876},171,[77,10878,10698],{"class":104},[77,10880,10882],{"class":79,"line":10881},172,[77,10883,6251],{"class":104},[77,10885,10887],{"class":79,"line":10886},173,[77,10888,3244],{"class":104},[77,10890,10892],{"class":79,"line":10891},174,[77,10893,140],{"emptyLinePlaceholder":139},[77,10895,10897,10899],{"class":79,"line":10896},175,[77,10898,1619],{"class":97},[77,10900,3327],{"class":104},[77,10902,10904],{"class":79,"line":10903},176,[77,10905,3332],{"class":104},[77,10907,10909],{"class":79,"line":10908},177,[77,10910,140],{"emptyLinePlaceholder":139},[77,10912,10914],{"class":79,"line":10913},178,[77,10915,10916],{"class":104},"        lifecycle_manager_node,\n",[77,10918,10920],{"class":79,"line":10919},179,[77,10921,10922],{"class":104},"        bt_navigator_node,\n",[77,10924,10926],{"class":79,"line":10925},180,[77,10927,10928],{"class":104},"        planner_server_node,\n",[77,10930,10932],{"class":79,"line":10931},181,[77,10933,10934],{"class":104},"        controller_server_node,\n",[77,10936,10938],{"class":79,"line":10937},182,[77,10939,10940],{"class":104},"        behavior_server_node,\n",[77,10942,10944],{"class":79,"line":10943},183,[77,10945,10946],{"class":104},"        waypoint_node,\n",[77,10948,10950],{"class":79,"line":10949},184,[77,10951,10952],{"class":104},"        velocity_smoother_node,\n",[77,10954,10956],{"class":79,"line":10955},185,[77,10957,10958],{"class":104},"        smoother_server_node\n",[77,10960,10962],{"class":79,"line":10961},186,[77,10963,3352],{"class":104},[18,10965,10966],{},"该launch文件主要是加载了生命周期管理器、行为树、规划器、控制器、恢复器、航点跟踪、路径平滑以及速度平滑等节点。并且除了生命周期管理器节点外，每个节点都还会加载一个配置文件，接下来需要编辑这些配置文。",[18,10968,10969],{},[21,10970,10971],{},"（1）bt_navigator相关配置文件",[18,10973,10974],{},"bt_navigator相关配置文件有两个，分别是描述行为树的xml文件，以及yaml格式的参数文件，前者存储在bts目录下，后者存储在params目录下。",[18,10976,10977,10978,10981],{},"请在bts目录下，新建一个名为",[74,10979,10980],{},"bt_planner_controller_behavior.xml","的文件并输入如下内容：",[68,10983,10987],{"className":10984,"code":10985,"language":10986,"meta":32,"style":32},"language-xml shiki shiki-themes github-light github-dark","\u003C!--\n  This Behavior Tree replans the global path periodically at 1 Hz and it also has\n  recovery actions specific to planning / control as well as general system issues.\n  This will be continuous if a kinematically valid planner is selected.\n-->\n\u003Croot BTCPP_format=\"4\" main_tree_to_execute=\"MainTree\">\n  \u003CBehaviorTree ID=\"MainTree\">\n    \u003CRecoveryNode number_of_retries=\"6\" name=\"NavigateRecovery\">\n      \u003CPipelineSequence name=\"NavigateWithReplanning\">\n        \u003CControllerSelector selected_controller=\"{selected_controller}\" default_controller=\"FollowPath\" topic_name=\"controller_selector\"/>\n        \u003CPlannerSelector selected_planner=\"{selected_planner}\" default_planner=\"GridBased\" topic_name=\"planner_selector\"/>\n        \u003CRateController hz=\"1.0\">\n          \u003CRecoveryNode number_of_retries=\"1\" name=\"ComputePathToPose\">\n            \u003CComputePathToPose goal=\"{goal}\" path=\"{path}\" planner_id=\"{selected_planner}\" error_code_id=\"{compute_path_error_code}\"/>\n            \u003CSequence>\n              \u003CWouldAPlannerRecoveryHelp error_code=\"{compute_path_error_code}\"/>\n              \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Context\" service_name=\"global_costmap/clear_entirely_global_costmap\"/>\n            \u003C/Sequence>\n          \u003C/RecoveryNode>\n        \u003C/RateController>\n        \u003CRecoveryNode number_of_retries=\"1\" name=\"FollowPath\">\n          \u003CFollowPath path=\"{path}\" controller_id=\"{selected_controller}\" error_code_id=\"{follow_path_error_code}\"/>\n          \u003CSequence>\n            \u003CWouldAControllerRecoveryHelp error_code=\"{follow_path_error_code}\"/>\n            \u003CClearEntireCostmap name=\"ClearLocalCostmap-Context\" service_name=\"local_costmap/clear_entirely_local_costmap\"/>\n          \u003C/Sequence>\n        \u003C/RecoveryNode>\n      \u003C/PipelineSequence>\n      \u003CSequence>\n        \u003CFallback>\n          \u003CWouldAControllerRecoveryHelp error_code=\"{follow_path_error_code}\"/>\n          \u003CWouldAPlannerRecoveryHelp error_code=\"{compute_path_error_code}\"/>\n        \u003C/Fallback>\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\" error_code_id=\"{spin_error_code}\"/>\n            \u003CWait wait_duration=\"5.0\"/>\n            \u003CBackUp backup_dist=\"0.30\" backup_speed=\"0.15\" error_code_id=\"{backup_code_id}\"/>\n          \u003C/RoundRobin>\n        \u003C/ReactiveFallback>\n      \u003C/Sequence>\n    \u003C/RecoveryNode>\n  \u003C/BehaviorTree>\n\u003C/root>\n","xml",[74,10988,10989,10994,10999,11004,11009,11014,11040,11057,11083,11100,11135,11167,11184,11207,11248,11257,11274,11298,11307,11316,11325,11345,11374,11382,11397,11419,11427,11435,11444,11452,11461,11475,11489,11497,11513,11522,11538,11553,11574,11595,11603,11627,11644,11676,11684,11692,11700,11709,11718],{"__ignoreMap":32},[77,10990,10991],{"class":79,"line":80},[77,10992,10993],{"class":146},"\u003C!--\n",[77,10995,10996],{"class":79,"line":114},[77,10997,10998],{"class":146},"  This Behavior Tree replans the global path periodically at 1 Hz and it also has\n",[77,11000,11001],{"class":79,"line":136},[77,11002,11003],{"class":146},"  recovery actions specific to planning / control as well as general system issues.\n",[77,11005,11006],{"class":79,"line":143},[77,11007,11008],{"class":146},"  This will be continuous if a kinematically valid planner is selected.\n",[77,11010,11011],{"class":79,"line":150},[77,11012,11013],{"class":146},"-->\n",[77,11015,11016,11018,11021,11024,11026,11029,11032,11034,11037],{"class":79,"line":162},[77,11017,98],{"class":104},[77,11019,11020],{"class":1644},"root",[77,11022,11023],{"class":83}," BTCPP_format",[77,11025,1332],{"class":104},[77,11027,11028],{"class":87},"\"4\"",[77,11030,11031],{"class":83}," main_tree_to_execute",[77,11033,1332],{"class":104},[77,11035,11036],{"class":87},"\"MainTree\"",[77,11038,11039],{"class":104},">\n",[77,11041,11042,11045,11048,11051,11053,11055],{"class":79,"line":174},[77,11043,11044],{"class":104},"  \u003C",[77,11046,11047],{"class":1644},"BehaviorTree",[77,11049,11050],{"class":83}," ID",[77,11052,1332],{"class":104},[77,11054,11036],{"class":87},[77,11056,11039],{"class":104},[77,11058,11059,11062,11065,11068,11070,11073,11076,11078,11081],{"class":79,"line":179},[77,11060,11061],{"class":104},"    \u003C",[77,11063,11064],{"class":1644},"RecoveryNode",[77,11066,11067],{"class":83}," number_of_retries",[77,11069,1332],{"class":104},[77,11071,11072],{"class":87},"\"6\"",[77,11074,11075],{"class":83}," name",[77,11077,1332],{"class":104},[77,11079,11080],{"class":87},"\"NavigateRecovery\"",[77,11082,11039],{"class":104},[77,11084,11085,11088,11091,11093,11095,11098],{"class":79,"line":184},[77,11086,11087],{"class":104},"      \u003C",[77,11089,11090],{"class":1644},"PipelineSequence",[77,11092,11075],{"class":83},[77,11094,1332],{"class":104},[77,11096,11097],{"class":87},"\"NavigateWithReplanning\"",[77,11099,11039],{"class":104},[77,11101,11102,11105,11108,11111,11113,11116,11119,11121,11124,11127,11129,11132],{"class":79,"line":195},[77,11103,11104],{"class":104},"        \u003C",[77,11106,11107],{"class":1644},"ControllerSelector",[77,11109,11110],{"class":83}," selected_controller",[77,11112,1332],{"class":104},[77,11114,11115],{"class":87},"\"{selected_controller}\"",[77,11117,11118],{"class":83}," default_controller",[77,11120,1332],{"class":104},[77,11122,11123],{"class":87},"\"FollowPath\"",[77,11125,11126],{"class":83}," topic_name",[77,11128,1332],{"class":104},[77,11130,11131],{"class":87},"\"controller_selector\"",[77,11133,11134],{"class":104},"/>\n",[77,11136,11137,11139,11142,11145,11147,11150,11153,11155,11158,11160,11162,11165],{"class":79,"line":1344},[77,11138,11104],{"class":104},[77,11140,11141],{"class":1644},"PlannerSelector",[77,11143,11144],{"class":83}," selected_planner",[77,11146,1332],{"class":104},[77,11148,11149],{"class":87},"\"{selected_planner}\"",[77,11151,11152],{"class":83}," default_planner",[77,11154,1332],{"class":104},[77,11156,11157],{"class":87},"\"GridBased\"",[77,11159,11126],{"class":83},[77,11161,1332],{"class":104},[77,11163,11164],{"class":87},"\"planner_selector\"",[77,11166,11134],{"class":104},[77,11168,11169,11171,11174,11177,11179,11182],{"class":79,"line":1359},[77,11170,11104],{"class":104},[77,11172,11173],{"class":1644},"RateController",[77,11175,11176],{"class":83}," hz",[77,11178,1332],{"class":104},[77,11180,11181],{"class":87},"\"1.0\"",[77,11183,11039],{"class":104},[77,11185,11186,11189,11191,11193,11195,11198,11200,11202,11205],{"class":79,"line":1364},[77,11187,11188],{"class":104},"          \u003C",[77,11190,11064],{"class":1644},[77,11192,11067],{"class":83},[77,11194,1332],{"class":104},[77,11196,11197],{"class":87},"\"1\"",[77,11199,11075],{"class":83},[77,11201,1332],{"class":104},[77,11203,11204],{"class":87},"\"ComputePathToPose\"",[77,11206,11039],{"class":104},[77,11208,11209,11212,11215,11218,11220,11223,11226,11228,11231,11234,11236,11238,11241,11243,11246],{"class":79,"line":1375},[77,11210,11211],{"class":104},"            \u003C",[77,11213,11214],{"class":1644},"ComputePathToPose",[77,11216,11217],{"class":83}," goal",[77,11219,1332],{"class":104},[77,11221,11222],{"class":87},"\"{goal}\"",[77,11224,11225],{"class":83}," path",[77,11227,1332],{"class":104},[77,11229,11230],{"class":87},"\"{path}\"",[77,11232,11233],{"class":83}," planner_id",[77,11235,1332],{"class":104},[77,11237,11149],{"class":87},[77,11239,11240],{"class":83}," error_code_id",[77,11242,1332],{"class":104},[77,11244,11245],{"class":87},"\"{compute_path_error_code}\"",[77,11247,11134],{"class":104},[77,11249,11250,11252,11255],{"class":79,"line":1384},[77,11251,11211],{"class":104},[77,11253,11254],{"class":1644},"Sequence",[77,11256,11039],{"class":104},[77,11258,11259,11262,11265,11268,11270,11272],{"class":79,"line":1398},[77,11260,11261],{"class":104},"              \u003C",[77,11263,11264],{"class":1644},"WouldAPlannerRecoveryHelp",[77,11266,11267],{"class":83}," error_code",[77,11269,1332],{"class":104},[77,11271,11245],{"class":87},[77,11273,11134],{"class":104},[77,11275,11276,11278,11281,11283,11285,11288,11291,11293,11296],{"class":79,"line":1411},[77,11277,11261],{"class":104},[77,11279,11280],{"class":1644},"ClearEntireCostmap",[77,11282,11075],{"class":83},[77,11284,1332],{"class":104},[77,11286,11287],{"class":87},"\"ClearGlobalCostmap-Context\"",[77,11289,11290],{"class":83}," service_name",[77,11292,1332],{"class":104},[77,11294,11295],{"class":87},"\"global_costmap/clear_entirely_global_costmap\"",[77,11297,11134],{"class":104},[77,11299,11300,11303,11305],{"class":79,"line":1421},[77,11301,11302],{"class":104},"            \u003C/",[77,11304,11254],{"class":1644},[77,11306,11039],{"class":104},[77,11308,11309,11312,11314],{"class":79,"line":1429},[77,11310,11311],{"class":104},"          \u003C/",[77,11313,11064],{"class":1644},[77,11315,11039],{"class":104},[77,11317,11318,11321,11323],{"class":79,"line":1445},[77,11319,11320],{"class":104},"        \u003C/",[77,11322,11173],{"class":1644},[77,11324,11039],{"class":104},[77,11326,11327,11329,11331,11333,11335,11337,11339,11341,11343],{"class":79,"line":1459},[77,11328,11104],{"class":104},[77,11330,11064],{"class":1644},[77,11332,11067],{"class":83},[77,11334,1332],{"class":104},[77,11336,11197],{"class":87},[77,11338,11075],{"class":83},[77,11340,1332],{"class":104},[77,11342,11123],{"class":87},[77,11344,11039],{"class":104},[77,11346,11347,11349,11352,11354,11356,11358,11361,11363,11365,11367,11369,11372],{"class":79,"line":1471},[77,11348,11188],{"class":104},[77,11350,11351],{"class":1644},"FollowPath",[77,11353,11225],{"class":83},[77,11355,1332],{"class":104},[77,11357,11230],{"class":87},[77,11359,11360],{"class":83}," controller_id",[77,11362,1332],{"class":104},[77,11364,11115],{"class":87},[77,11366,11240],{"class":83},[77,11368,1332],{"class":104},[77,11370,11371],{"class":87},"\"{follow_path_error_code}\"",[77,11373,11134],{"class":104},[77,11375,11376,11378,11380],{"class":79,"line":1476},[77,11377,11188],{"class":104},[77,11379,11254],{"class":1644},[77,11381,11039],{"class":104},[77,11383,11384,11386,11389,11391,11393,11395],{"class":79,"line":1487},[77,11385,11211],{"class":104},[77,11387,11388],{"class":1644},"WouldAControllerRecoveryHelp",[77,11390,11267],{"class":83},[77,11392,1332],{"class":104},[77,11394,11371],{"class":87},[77,11396,11134],{"class":104},[77,11398,11399,11401,11403,11405,11407,11410,11412,11414,11417],{"class":79,"line":1498},[77,11400,11211],{"class":104},[77,11402,11280],{"class":1644},[77,11404,11075],{"class":83},[77,11406,1332],{"class":104},[77,11408,11409],{"class":87},"\"ClearLocalCostmap-Context\"",[77,11411,11290],{"class":83},[77,11413,1332],{"class":104},[77,11415,11416],{"class":87},"\"local_costmap/clear_entirely_local_costmap\"",[77,11418,11134],{"class":104},[77,11420,11421,11423,11425],{"class":79,"line":1504},[77,11422,11311],{"class":104},[77,11424,11254],{"class":1644},[77,11426,11039],{"class":104},[77,11428,11429,11431,11433],{"class":79,"line":1515},[77,11430,11320],{"class":104},[77,11432,11064],{"class":1644},[77,11434,11039],{"class":104},[77,11436,11437,11440,11442],{"class":79,"line":1521},[77,11438,11439],{"class":104},"      \u003C/",[77,11441,11090],{"class":1644},[77,11443,11039],{"class":104},[77,11445,11446,11448,11450],{"class":79,"line":1534},[77,11447,11087],{"class":104},[77,11449,11254],{"class":1644},[77,11451,11039],{"class":104},[77,11453,11454,11456,11459],{"class":79,"line":1547},[77,11455,11104],{"class":104},[77,11457,11458],{"class":1644},"Fallback",[77,11460,11039],{"class":104},[77,11462,11463,11465,11467,11469,11471,11473],{"class":79,"line":1559},[77,11464,11188],{"class":104},[77,11466,11388],{"class":1644},[77,11468,11267],{"class":83},[77,11470,1332],{"class":104},[77,11472,11371],{"class":87},[77,11474,11134],{"class":104},[77,11476,11477,11479,11481,11483,11485,11487],{"class":79,"line":1572},[77,11478,11188],{"class":104},[77,11480,11264],{"class":1644},[77,11482,11267],{"class":83},[77,11484,1332],{"class":104},[77,11486,11245],{"class":87},[77,11488,11134],{"class":104},[77,11490,11491,11493,11495],{"class":79,"line":1577},[77,11492,11320],{"class":104},[77,11494,11458],{"class":1644},[77,11496,11039],{"class":104},[77,11498,11499,11501,11504,11506,11508,11511],{"class":79,"line":1588},[77,11500,11104],{"class":104},[77,11502,11503],{"class":1644},"ReactiveFallback",[77,11505,11075],{"class":83},[77,11507,1332],{"class":104},[77,11509,11510],{"class":87},"\"RecoveryFallback\"",[77,11512,11039],{"class":104},[77,11514,11515,11517,11520],{"class":79,"line":1593},[77,11516,11188],{"class":104},[77,11518,11519],{"class":1644},"GoalUpdated",[77,11521,11134],{"class":104},[77,11523,11524,11526,11529,11531,11533,11536],{"class":79,"line":1599},[77,11525,11188],{"class":104},[77,11527,11528],{"class":1644},"RoundRobin",[77,11530,11075],{"class":83},[77,11532,1332],{"class":104},[77,11534,11535],{"class":87},"\"RecoveryActions\"",[77,11537,11039],{"class":104},[77,11539,11540,11542,11544,11546,11548,11551],{"class":79,"line":1605},[77,11541,11211],{"class":104},[77,11543,11254],{"class":1644},[77,11545,11075],{"class":83},[77,11547,1332],{"class":104},[77,11549,11550],{"class":87},"\"ClearingActions\"",[77,11552,11039],{"class":104},[77,11554,11555,11557,11559,11561,11563,11566,11568,11570,11572],{"class":79,"line":1611},[77,11556,11261],{"class":104},[77,11558,11280],{"class":1644},[77,11560,11075],{"class":83},[77,11562,1332],{"class":104},[77,11564,11565],{"class":87},"\"ClearLocalCostmap-Subtree\"",[77,11567,11290],{"class":83},[77,11569,1332],{"class":104},[77,11571,11416],{"class":87},[77,11573,11134],{"class":104},[77,11575,11576,11578,11580,11582,11584,11587,11589,11591,11593],{"class":79,"line":1616},[77,11577,11261],{"class":104},[77,11579,11280],{"class":1644},[77,11581,11075],{"class":83},[77,11583,1332],{"class":104},[77,11585,11586],{"class":87},"\"ClearGlobalCostmap-Subtree\"",[77,11588,11290],{"class":83},[77,11590,1332],{"class":104},[77,11592,11295],{"class":87},[77,11594,11134],{"class":104},[77,11596,11597,11599,11601],{"class":79,"line":1999},[77,11598,11302],{"class":104},[77,11600,11254],{"class":1644},[77,11602,11039],{"class":104},[77,11604,11605,11607,11610,11613,11615,11618,11620,11622,11625],{"class":79,"line":2010},[77,11606,11211],{"class":104},[77,11608,11609],{"class":1644},"Spin",[77,11611,11612],{"class":83}," spin_dist",[77,11614,1332],{"class":104},[77,11616,11617],{"class":87},"\"1.57\"",[77,11619,11240],{"class":83},[77,11621,1332],{"class":104},[77,11623,11624],{"class":87},"\"{spin_error_code}\"",[77,11626,11134],{"class":104},[77,11628,11629,11631,11634,11637,11639,11642],{"class":79,"line":2023},[77,11630,11211],{"class":104},[77,11632,11633],{"class":1644},"Wait",[77,11635,11636],{"class":83}," wait_duration",[77,11638,1332],{"class":104},[77,11640,11641],{"class":87},"\"5.0\"",[77,11643,11134],{"class":104},[77,11645,11646,11648,11651,11654,11656,11659,11662,11664,11667,11669,11671,11674],{"class":79,"line":2037},[77,11647,11211],{"class":104},[77,11649,11650],{"class":1644},"BackUp",[77,11652,11653],{"class":83}," backup_dist",[77,11655,1332],{"class":104},[77,11657,11658],{"class":87},"\"0.30\"",[77,11660,11661],{"class":83}," backup_speed",[77,11663,1332],{"class":104},[77,11665,11666],{"class":87},"\"0.15\"",[77,11668,11240],{"class":83},[77,11670,1332],{"class":104},[77,11672,11673],{"class":87},"\"{backup_code_id}\"",[77,11675,11134],{"class":104},[77,11677,11678,11680,11682],{"class":79,"line":2050},[77,11679,11311],{"class":104},[77,11681,11528],{"class":1644},[77,11683,11039],{"class":104},[77,11685,11686,11688,11690],{"class":79,"line":2064},[77,11687,11320],{"class":104},[77,11689,11503],{"class":1644},[77,11691,11039],{"class":104},[77,11693,11694,11696,11698],{"class":79,"line":2075},[77,11695,11439],{"class":104},[77,11697,11254],{"class":1644},[77,11699,11039],{"class":104},[77,11701,11702,11705,11707],{"class":79,"line":2080},[77,11703,11704],{"class":104},"    \u003C/",[77,11706,11064],{"class":1644},[77,11708,11039],{"class":104},[77,11710,11711,11714,11716],{"class":79,"line":2090},[77,11712,11713],{"class":104},"  \u003C/",[77,11715,11047],{"class":1644},[77,11717,11039],{"class":104},[77,11719,11720,11723,11725],{"class":79,"line":2101},[77,11721,11722],{"class":104},"\u003C/",[77,11724,11020],{"class":1644},[77,11726,11039],{"class":104},[18,11728,11729,11730,5188],{},"继续在bts目录下新建一个名为",[74,11731,11732],{},"bt_planner_controller_behavior_poses.xml",[68,11734,11736],{"className":10984,"code":11735,"language":10986,"meta":32,"style":32},"\u003C!--\n  This Behavior Tree replans the global path periodically at 1 Hz through an array of poses continuously\n   and it also has recovery actions specific to planning / control as well as general system issues.\n-->\n\u003Croot BTCPP_format=\"4\" main_tree_to_execute=\"MainTree\">\n  \u003CBehaviorTree ID=\"MainTree\">\n    \u003CRecoveryNode number_of_retries=\"6\" name=\"NavigateRecovery\">\n      \u003CPipelineSequence name=\"NavigateWithReplanning\">\n        \u003CControllerSelector selected_controller=\"{selected_controller}\" default_controller=\"FollowPath\" topic_name=\"controller_selector\"/>\n        \u003CPlannerSelector selected_planner=\"{selected_planner}\" default_planner=\"GridBased\" topic_name=\"planner_selector\"/>\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=\"{selected_planner}\" error_code_id=\"{compute_path_error_code}\"/>\n            \u003C/ReactiveSequence>\n            \u003CSequence>\n              \u003CWouldAPlannerRecoveryHelp error_code=\"{compute_path_error_code}\"/>\n              \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Context\" service_name=\"global_costmap/clear_entirely_global_costmap\"/>\n            \u003C/Sequence>\n          \u003C/RecoveryNode>\n        \u003C/RateController>\n        \u003CRecoveryNode number_of_retries=\"1\" name=\"FollowPath\">\n          \u003CFollowPath path=\"{path}\" controller_id=\"{selected_controller}\" error_code_id=\"{follow_path_error_code}\"/>\n          \u003CSequence>\n            \u003CWouldAControllerRecoveryHelp error_code=\"{follow_path_error_code}\"/>\n            \u003CClearEntireCostmap name=\"ClearLocalCostmap-Context\" service_name=\"local_costmap/clear_entirely_local_costmap\"/>\n          \u003C/Sequence>\n        \u003C/RecoveryNode>\n      \u003C/PipelineSequence>\n      \u003CSequence>\n        \u003CFallback>\n          \u003CWouldAControllerRecoveryHelp error_code=\"{follow_path_error_code}\"/>\n          \u003CWouldAPlannerRecoveryHelp error_code=\"{compute_path_error_code}\"/>\n        \u003C/Fallback>\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\" error_code_id=\"{spin_error_code}\"/>\n            \u003CWait wait_duration=\"5.0\"/>\n            \u003CBackUp backup_dist=\"0.30\" backup_speed=\"0.15\" error_code_id=\"{backup_error_code}\"/>\n          \u003C/RoundRobin>\n        \u003C/ReactiveFallback>\n      \u003C/Sequence>\n    \u003C/RecoveryNode>\n  \u003C/BehaviorTree>\n\u003C/root>\n",[74,11737,11738,11742,11747,11752,11756,11776,11790,11810,11824,11850,11876,11891,11912,11921,11953,11987,11995,12003,12017,12037,12045,12053,12061,12081,12107,12115,12129,12149,12157,12165,12173,12181,12189,12203,12217,12225,12239,12247,12261,12275,12295,12315,12323,12343,12357,12384,12392,12400,12408,12416,12424],{"__ignoreMap":32},[77,11739,11740],{"class":79,"line":80},[77,11741,10993],{"class":146},[77,11743,11744],{"class":79,"line":114},[77,11745,11746],{"class":146},"  This Behavior Tree replans the global path periodically at 1 Hz through an array of poses continuously\n",[77,11748,11749],{"class":79,"line":136},[77,11750,11751],{"class":146},"   and it also has recovery actions specific to planning / control as well as general system issues.\n",[77,11753,11754],{"class":79,"line":143},[77,11755,11013],{"class":146},[77,11757,11758,11760,11762,11764,11766,11768,11770,11772,11774],{"class":79,"line":150},[77,11759,98],{"class":104},[77,11761,11020],{"class":1644},[77,11763,11023],{"class":83},[77,11765,1332],{"class":104},[77,11767,11028],{"class":87},[77,11769,11031],{"class":83},[77,11771,1332],{"class":104},[77,11773,11036],{"class":87},[77,11775,11039],{"class":104},[77,11777,11778,11780,11782,11784,11786,11788],{"class":79,"line":162},[77,11779,11044],{"class":104},[77,11781,11047],{"class":1644},[77,11783,11050],{"class":83},[77,11785,1332],{"class":104},[77,11787,11036],{"class":87},[77,11789,11039],{"class":104},[77,11791,11792,11794,11796,11798,11800,11802,11804,11806,11808],{"class":79,"line":174},[77,11793,11061],{"class":104},[77,11795,11064],{"class":1644},[77,11797,11067],{"class":83},[77,11799,1332],{"class":104},[77,11801,11072],{"class":87},[77,11803,11075],{"class":83},[77,11805,1332],{"class":104},[77,11807,11080],{"class":87},[77,11809,11039],{"class":104},[77,11811,11812,11814,11816,11818,11820,11822],{"class":79,"line":179},[77,11813,11087],{"class":104},[77,11815,11090],{"class":1644},[77,11817,11075],{"class":83},[77,11819,1332],{"class":104},[77,11821,11097],{"class":87},[77,11823,11039],{"class":104},[77,11825,11826,11828,11830,11832,11834,11836,11838,11840,11842,11844,11846,11848],{"class":79,"line":184},[77,11827,11104],{"class":104},[77,11829,11107],{"class":1644},[77,11831,11110],{"class":83},[77,11833,1332],{"class":104},[77,11835,11115],{"class":87},[77,11837,11118],{"class":83},[77,11839,1332],{"class":104},[77,11841,11123],{"class":87},[77,11843,11126],{"class":83},[77,11845,1332],{"class":104},[77,11847,11131],{"class":87},[77,11849,11134],{"class":104},[77,11851,11852,11854,11856,11858,11860,11862,11864,11866,11868,11870,11872,11874],{"class":79,"line":195},[77,11853,11104],{"class":104},[77,11855,11141],{"class":1644},[77,11857,11144],{"class":83},[77,11859,1332],{"class":104},[77,11861,11149],{"class":87},[77,11863,11152],{"class":83},[77,11865,1332],{"class":104},[77,11867,11157],{"class":87},[77,11869,11126],{"class":83},[77,11871,1332],{"class":104},[77,11873,11164],{"class":87},[77,11875,11134],{"class":104},[77,11877,11878,11880,11882,11884,11886,11889],{"class":79,"line":1344},[77,11879,11104],{"class":104},[77,11881,11173],{"class":1644},[77,11883,11176],{"class":83},[77,11885,1332],{"class":104},[77,11887,11888],{"class":87},"\"0.333\"",[77,11890,11039],{"class":104},[77,11892,11893,11895,11897,11899,11901,11903,11905,11907,11910],{"class":79,"line":1359},[77,11894,11188],{"class":104},[77,11896,11064],{"class":1644},[77,11898,11067],{"class":83},[77,11900,1332],{"class":104},[77,11902,11197],{"class":87},[77,11904,11075],{"class":83},[77,11906,1332],{"class":104},[77,11908,11909],{"class":87},"\"ComputePathThroughPoses\"",[77,11911,11039],{"class":104},[77,11913,11914,11916,11919],{"class":79,"line":1364},[77,11915,11211],{"class":104},[77,11917,11918],{"class":1644},"ReactiveSequence",[77,11920,11039],{"class":104},[77,11922,11923,11925,11928,11931,11933,11936,11939,11941,11943,11946,11948,11951],{"class":79,"line":1375},[77,11924,11261],{"class":104},[77,11926,11927],{"class":1644},"RemovePassedGoals",[77,11929,11930],{"class":83}," input_goals",[77,11932,1332],{"class":104},[77,11934,11935],{"class":87},"\"{goals}\"",[77,11937,11938],{"class":83}," output_goals",[77,11940,1332],{"class":104},[77,11942,11935],{"class":87},[77,11944,11945],{"class":83}," radius",[77,11947,1332],{"class":104},[77,11949,11950],{"class":87},"\"0.7\"",[77,11952,11134],{"class":104},[77,11954,11955,11957,11960,11963,11965,11967,11969,11971,11973,11975,11977,11979,11981,11983,11985],{"class":79,"line":1384},[77,11956,11261],{"class":104},[77,11958,11959],{"class":1644},"ComputePathThroughPoses",[77,11961,11962],{"class":83}," goals",[77,11964,1332],{"class":104},[77,11966,11935],{"class":87},[77,11968,11225],{"class":83},[77,11970,1332],{"class":104},[77,11972,11230],{"class":87},[77,11974,11233],{"class":83},[77,11976,1332],{"class":104},[77,11978,11149],{"class":87},[77,11980,11240],{"class":83},[77,11982,1332],{"class":104},[77,11984,11245],{"class":87},[77,11986,11134],{"class":104},[77,11988,11989,11991,11993],{"class":79,"line":1398},[77,11990,11302],{"class":104},[77,11992,11918],{"class":1644},[77,11994,11039],{"class":104},[77,11996,11997,11999,12001],{"class":79,"line":1411},[77,11998,11211],{"class":104},[77,12000,11254],{"class":1644},[77,12002,11039],{"class":104},[77,12004,12005,12007,12009,12011,12013,12015],{"class":79,"line":1421},[77,12006,11261],{"class":104},[77,12008,11264],{"class":1644},[77,12010,11267],{"class":83},[77,12012,1332],{"class":104},[77,12014,11245],{"class":87},[77,12016,11134],{"class":104},[77,12018,12019,12021,12023,12025,12027,12029,12031,12033,12035],{"class":79,"line":1429},[77,12020,11261],{"class":104},[77,12022,11280],{"class":1644},[77,12024,11075],{"class":83},[77,12026,1332],{"class":104},[77,12028,11287],{"class":87},[77,12030,11290],{"class":83},[77,12032,1332],{"class":104},[77,12034,11295],{"class":87},[77,12036,11134],{"class":104},[77,12038,12039,12041,12043],{"class":79,"line":1445},[77,12040,11302],{"class":104},[77,12042,11254],{"class":1644},[77,12044,11039],{"class":104},[77,12046,12047,12049,12051],{"class":79,"line":1459},[77,12048,11311],{"class":104},[77,12050,11064],{"class":1644},[77,12052,11039],{"class":104},[77,12054,12055,12057,12059],{"class":79,"line":1471},[77,12056,11320],{"class":104},[77,12058,11173],{"class":1644},[77,12060,11039],{"class":104},[77,12062,12063,12065,12067,12069,12071,12073,12075,12077,12079],{"class":79,"line":1476},[77,12064,11104],{"class":104},[77,12066,11064],{"class":1644},[77,12068,11067],{"class":83},[77,12070,1332],{"class":104},[77,12072,11197],{"class":87},[77,12074,11075],{"class":83},[77,12076,1332],{"class":104},[77,12078,11123],{"class":87},[77,12080,11039],{"class":104},[77,12082,12083,12085,12087,12089,12091,12093,12095,12097,12099,12101,12103,12105],{"class":79,"line":1487},[77,12084,11188],{"class":104},[77,12086,11351],{"class":1644},[77,12088,11225],{"class":83},[77,12090,1332],{"class":104},[77,12092,11230],{"class":87},[77,12094,11360],{"class":83},[77,12096,1332],{"class":104},[77,12098,11115],{"class":87},[77,12100,11240],{"class":83},[77,12102,1332],{"class":104},[77,12104,11371],{"class":87},[77,12106,11134],{"class":104},[77,12108,12109,12111,12113],{"class":79,"line":1498},[77,12110,11188],{"class":104},[77,12112,11254],{"class":1644},[77,12114,11039],{"class":104},[77,12116,12117,12119,12121,12123,12125,12127],{"class":79,"line":1504},[77,12118,11211],{"class":104},[77,12120,11388],{"class":1644},[77,12122,11267],{"class":83},[77,12124,1332],{"class":104},[77,12126,11371],{"class":87},[77,12128,11134],{"class":104},[77,12130,12131,12133,12135,12137,12139,12141,12143,12145,12147],{"class":79,"line":1515},[77,12132,11211],{"class":104},[77,12134,11280],{"class":1644},[77,12136,11075],{"class":83},[77,12138,1332],{"class":104},[77,12140,11409],{"class":87},[77,12142,11290],{"class":83},[77,12144,1332],{"class":104},[77,12146,11416],{"class":87},[77,12148,11134],{"class":104},[77,12150,12151,12153,12155],{"class":79,"line":1521},[77,12152,11311],{"class":104},[77,12154,11254],{"class":1644},[77,12156,11039],{"class":104},[77,12158,12159,12161,12163],{"class":79,"line":1534},[77,12160,11320],{"class":104},[77,12162,11064],{"class":1644},[77,12164,11039],{"class":104},[77,12166,12167,12169,12171],{"class":79,"line":1547},[77,12168,11439],{"class":104},[77,12170,11090],{"class":1644},[77,12172,11039],{"class":104},[77,12174,12175,12177,12179],{"class":79,"line":1559},[77,12176,11087],{"class":104},[77,12178,11254],{"class":1644},[77,12180,11039],{"class":104},[77,12182,12183,12185,12187],{"class":79,"line":1572},[77,12184,11104],{"class":104},[77,12186,11458],{"class":1644},[77,12188,11039],{"class":104},[77,12190,12191,12193,12195,12197,12199,12201],{"class":79,"line":1577},[77,12192,11188],{"class":104},[77,12194,11388],{"class":1644},[77,12196,11267],{"class":83},[77,12198,1332],{"class":104},[77,12200,11371],{"class":87},[77,12202,11134],{"class":104},[77,12204,12205,12207,12209,12211,12213,12215],{"class":79,"line":1588},[77,12206,11188],{"class":104},[77,12208,11264],{"class":1644},[77,12210,11267],{"class":83},[77,12212,1332],{"class":104},[77,12214,11245],{"class":87},[77,12216,11134],{"class":104},[77,12218,12219,12221,12223],{"class":79,"line":1593},[77,12220,11320],{"class":104},[77,12222,11458],{"class":1644},[77,12224,11039],{"class":104},[77,12226,12227,12229,12231,12233,12235,12237],{"class":79,"line":1599},[77,12228,11104],{"class":104},[77,12230,11503],{"class":1644},[77,12232,11075],{"class":83},[77,12234,1332],{"class":104},[77,12236,11510],{"class":87},[77,12238,11039],{"class":104},[77,12240,12241,12243,12245],{"class":79,"line":1605},[77,12242,11188],{"class":104},[77,12244,11519],{"class":1644},[77,12246,11134],{"class":104},[77,12248,12249,12251,12253,12255,12257,12259],{"class":79,"line":1611},[77,12250,11188],{"class":104},[77,12252,11528],{"class":1644},[77,12254,11075],{"class":83},[77,12256,1332],{"class":104},[77,12258,11535],{"class":87},[77,12260,11039],{"class":104},[77,12262,12263,12265,12267,12269,12271,12273],{"class":79,"line":1616},[77,12264,11211],{"class":104},[77,12266,11254],{"class":1644},[77,12268,11075],{"class":83},[77,12270,1332],{"class":104},[77,12272,11550],{"class":87},[77,12274,11039],{"class":104},[77,12276,12277,12279,12281,12283,12285,12287,12289,12291,12293],{"class":79,"line":1999},[77,12278,11261],{"class":104},[77,12280,11280],{"class":1644},[77,12282,11075],{"class":83},[77,12284,1332],{"class":104},[77,12286,11565],{"class":87},[77,12288,11290],{"class":83},[77,12290,1332],{"class":104},[77,12292,11416],{"class":87},[77,12294,11134],{"class":104},[77,12296,12297,12299,12301,12303,12305,12307,12309,12311,12313],{"class":79,"line":2010},[77,12298,11261],{"class":104},[77,12300,11280],{"class":1644},[77,12302,11075],{"class":83},[77,12304,1332],{"class":104},[77,12306,11586],{"class":87},[77,12308,11290],{"class":83},[77,12310,1332],{"class":104},[77,12312,11295],{"class":87},[77,12314,11134],{"class":104},[77,12316,12317,12319,12321],{"class":79,"line":2023},[77,12318,11302],{"class":104},[77,12320,11254],{"class":1644},[77,12322,11039],{"class":104},[77,12324,12325,12327,12329,12331,12333,12335,12337,12339,12341],{"class":79,"line":2037},[77,12326,11211],{"class":104},[77,12328,11609],{"class":1644},[77,12330,11612],{"class":83},[77,12332,1332],{"class":104},[77,12334,11617],{"class":87},[77,12336,11240],{"class":83},[77,12338,1332],{"class":104},[77,12340,11624],{"class":87},[77,12342,11134],{"class":104},[77,12344,12345,12347,12349,12351,12353,12355],{"class":79,"line":2050},[77,12346,11211],{"class":104},[77,12348,11633],{"class":1644},[77,12350,11636],{"class":83},[77,12352,1332],{"class":104},[77,12354,11641],{"class":87},[77,12356,11134],{"class":104},[77,12358,12359,12361,12363,12365,12367,12369,12371,12373,12375,12377,12379,12382],{"class":79,"line":2064},[77,12360,11211],{"class":104},[77,12362,11650],{"class":1644},[77,12364,11653],{"class":83},[77,12366,1332],{"class":104},[77,12368,11658],{"class":87},[77,12370,11661],{"class":83},[77,12372,1332],{"class":104},[77,12374,11666],{"class":87},[77,12376,11240],{"class":83},[77,12378,1332],{"class":104},[77,12380,12381],{"class":87},"\"{backup_error_code}\"",[77,12383,11134],{"class":104},[77,12385,12386,12388,12390],{"class":79,"line":2075},[77,12387,11311],{"class":104},[77,12389,11528],{"class":1644},[77,12391,11039],{"class":104},[77,12393,12394,12396,12398],{"class":79,"line":2080},[77,12395,11320],{"class":104},[77,12397,11503],{"class":1644},[77,12399,11039],{"class":104},[77,12401,12402,12404,12406],{"class":79,"line":2090},[77,12403,11439],{"class":104},[77,12405,11254],{"class":1644},[77,12407,11039],{"class":104},[77,12409,12410,12412,12414],{"class":79,"line":2101},[77,12411,11704],{"class":104},[77,12413,11064],{"class":1644},[77,12415,11039],{"class":104},[77,12417,12418,12420,12422],{"class":79,"line":2113},[77,12419,11713],{"class":104},[77,12421,11047],{"class":1644},[77,12423,11039],{"class":104},[77,12425,12426,12428,12430],{"class":79,"line":2118},[77,12427,11722],{"class":104},[77,12429,11020],{"class":1644},[77,12431,11039],{"class":104},[18,12433,12434,12435,5188],{},"在params目录下新建一个名为",[74,12436,12437],{},"bt.yaml",[68,12439,12441],{"className":1635,"code":12440,"language":1637,"meta":32,"style":32},"\n/**:\n  ros__parameters:\n    use_sim_time: True\n    global_frame: map\n    robot_base_frame: base_link\n    odom_topic: /odom\n    bt_loop_duration: 10\n    default_server_timeout: 20\n    wait_for_service_timeout: 1000\n    action_server_result_timeout: 900.0\n    navigators: [\"navigate_to_pose\", \"navigate_through_poses\"]\n    navigate_to_pose:\n      plugin: \"nav2_bt_navigator::NavigateToPoseNavigator\"\n    navigate_through_poses:\n      plugin: \"nav2_bt_navigator::NavigateThroughPosesNavigator\"\n    error_code_names:\n      - compute_path_error_code\n      - follow_path_error_code\n",[74,12442,12443,12447,12453,12459,12467,12476,12485,12495,12505,12515,12525,12535,12552,12559,12569,12576,12585,12592,12600],{"__ignoreMap":32},[77,12444,12445],{"class":79,"line":80},[77,12446,140],{"emptyLinePlaceholder":139},[77,12448,12449,12451],{"class":79,"line":114},[77,12450,6520],{"class":1644},[77,12452,1647],{"class":104},[77,12454,12455,12457],{"class":79,"line":136},[77,12456,1652],{"class":1644},[77,12458,1647],{"class":104},[77,12460,12461,12463,12465],{"class":79,"line":143},[77,12462,6533],{"class":1644},[77,12464,1662],{"class":104},[77,12466,9789],{"class":1213},[77,12468,12469,12472,12474],{"class":79,"line":150},[77,12470,12471],{"class":1644},"    global_frame",[77,12473,1662],{"class":104},[77,12475,1739],{"class":87},[77,12477,12478,12481,12483],{"class":79,"line":162},[77,12479,12480],{"class":1644},"    robot_base_frame",[77,12482,1662],{"class":104},[77,12484,1749],{"class":87},[77,12486,12487,12490,12492],{"class":79,"line":174},[77,12488,12489],{"class":1644},"    odom_topic",[77,12491,1662],{"class":104},[77,12493,12494],{"class":87},"/odom\n",[77,12496,12497,12500,12502],{"class":79,"line":179},[77,12498,12499],{"class":1644},"    bt_loop_duration",[77,12501,1662],{"class":104},[77,12503,12504],{"class":1213},"10\n",[77,12506,12507,12510,12512],{"class":79,"line":184},[77,12508,12509],{"class":1644},"    default_server_timeout",[77,12511,1662],{"class":104},[77,12513,12514],{"class":1213},"20\n",[77,12516,12517,12520,12522],{"class":79,"line":195},[77,12518,12519],{"class":1644},"    wait_for_service_timeout",[77,12521,1662],{"class":104},[77,12523,12524],{"class":1213},"1000\n",[77,12526,12527,12530,12532],{"class":79,"line":1344},[77,12528,12529],{"class":1644},"    action_server_result_timeout",[77,12531,1662],{"class":104},[77,12533,12534],{"class":1213},"900.0\n",[77,12536,12537,12540,12542,12545,12547,12550],{"class":79,"line":1359},[77,12538,12539],{"class":1644},"    navigators",[77,12541,4850],{"class":104},[77,12543,12544],{"class":87},"\"navigate_to_pose\"",[77,12546,1451],{"class":104},[77,12548,12549],{"class":87},"\"navigate_through_poses\"",[77,12551,4866],{"class":104},[77,12553,12554,12557],{"class":79,"line":1364},[77,12555,12556],{"class":1644},"    navigate_to_pose",[77,12558,1647],{"class":104},[77,12560,12561,12564,12566],{"class":79,"line":1375},[77,12562,12563],{"class":1644},"      plugin",[77,12565,1662],{"class":104},[77,12567,12568],{"class":87},"\"nav2_bt_navigator::NavigateToPoseNavigator\"\n",[77,12570,12571,12574],{"class":79,"line":1384},[77,12572,12573],{"class":1644},"    navigate_through_poses",[77,12575,1647],{"class":104},[77,12577,12578,12580,12582],{"class":79,"line":1398},[77,12579,12563],{"class":1644},[77,12581,1662],{"class":104},[77,12583,12584],{"class":87},"\"nav2_bt_navigator::NavigateThroughPosesNavigator\"\n",[77,12586,12587,12590],{"class":79,"line":1411},[77,12588,12589],{"class":1644},"    error_code_names",[77,12591,1647],{"class":104},[77,12593,12594,12597],{"class":79,"line":1421},[77,12595,12596],{"class":104},"      - ",[77,12598,12599],{"class":87},"compute_path_error_code\n",[77,12601,12602,12604],{"class":79,"line":1429},[77,12603,12596],{"class":104},[77,12605,12606],{"class":87},"follow_path_error_code\n",[18,12608,12609],{},[21,12610,12611],{},"（2）planner_server相关配置文件",[18,12613,12434,12614,5188],{},[74,12615,12616],{},"planner.yaml",[68,12618,12620],{"className":1635,"code":12619,"language":1637,"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  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      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,12621,12622,12628,12634,12644,12652,12663,12670,12679,12688,12697,12706,12713,12720,12730,12739,12748,12757,12766,12776,12785,12794,12821,12828,12838,12847,12856,12863,12872,12881,12890,12899,12909,12918,12927,12937,12946,12953,12962,12970,12979,12988,12997,13007,13016,13025,13033,13039,13047,13055,13063,13071,13079,13087,13095,13103,13111,13118,13127,13136,13143,13152,13162,13172],{"__ignoreMap":32},[77,12623,12624,12626],{"class":79,"line":80},[77,12625,6520],{"class":1644},[77,12627,1647],{"class":104},[77,12629,12630,12632],{"class":79,"line":114},[77,12631,1652],{"class":1644},[77,12633,1647],{"class":104},[77,12635,12636,12639,12641],{"class":79,"line":136},[77,12637,12638],{"class":1644},"    expected_planner_frequency",[77,12640,1662],{"class":104},[77,12642,12643],{"class":1213},"20.0\n",[77,12645,12646,12648,12650],{"class":79,"line":143},[77,12647,6533],{"class":1644},[77,12649,1662],{"class":104},[77,12651,9789],{"class":1213},[77,12653,12654,12657,12659,12661],{"class":79,"line":150},[77,12655,12656],{"class":1644},"    planner_plugins",[77,12658,4850],{"class":104},[77,12660,11157],{"class":87},[77,12662,4866],{"class":104},[77,12664,12665,12668],{"class":79,"line":162},[77,12666,12667],{"class":1644},"    GridBased",[77,12669,1647],{"class":104},[77,12671,12672,12674,12676],{"class":79,"line":174},[77,12673,12563],{"class":1644},[77,12675,1662],{"class":104},[77,12677,12678],{"class":87},"\"nav2_navfn_planner::NavfnPlanner\"\n",[77,12680,12681,12684,12686],{"class":79,"line":179},[77,12682,12683],{"class":1644},"      tolerance",[77,12685,1662],{"class":104},[77,12687,1870],{"class":1213},[77,12689,12690,12693,12695],{"class":79,"line":184},[77,12691,12692],{"class":1644},"      use_astar",[77,12694,1662],{"class":104},[77,12696,1805],{"class":1213},[77,12698,12699,12702,12704],{"class":79,"line":195},[77,12700,12701],{"class":1644},"      allow_unknown",[77,12703,1662],{"class":104},[77,12705,1912],{"class":1213},[77,12707,12708,12711],{"class":79,"line":1344},[77,12709,12710],{"class":1644},"  global_costmap",[77,12712,1647],{"class":104},[77,12714,12715,12718],{"class":79,"line":1359},[77,12716,12717],{"class":1644},"    ros__parameters",[77,12719,1647],{"class":104},[77,12721,12722,12725,12727],{"class":79,"line":1364},[77,12723,12724],{"class":1644},"      update_frequency",[77,12726,1662],{"class":104},[77,12728,12729],{"class":1213},"1.0\n",[77,12731,12732,12735,12737],{"class":79,"line":1375},[77,12733,12734],{"class":1644},"      publish_frequency",[77,12736,1662],{"class":104},[77,12738,12729],{"class":1213},[77,12740,12741,12744,12746],{"class":79,"line":1384},[77,12742,12743],{"class":1644},"      global_frame",[77,12745,1662],{"class":104},[77,12747,1739],{"class":87},[77,12749,12750,12753,12755],{"class":79,"line":1398},[77,12751,12752],{"class":1644},"      robot_base_frame",[77,12754,1662],{"class":104},[77,12756,1749],{"class":87},[77,12758,12759,12762,12764],{"class":79,"line":1411},[77,12760,12761],{"class":1644},"      use_sim_time",[77,12763,1662],{"class":104},[77,12765,9789],{"class":1213},[77,12767,12768,12771,12773],{"class":79,"line":1421},[77,12769,12770],{"class":1644},"      footprint",[77,12772,1662],{"class":104},[77,12774,12775],{"class":87},"\"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n",[77,12777,12778,12781,12783],{"class":79,"line":1429},[77,12779,12780],{"class":1644},"      resolution",[77,12782,1662],{"class":104},[77,12784,1848],{"class":1213},[77,12786,12787,12790,12792],{"class":79,"line":1445},[77,12788,12789],{"class":1644},"      track_unknown_space",[77,12791,1662],{"class":104},[77,12793,1912],{"class":1213},[77,12795,12796,12799,12801,12804,12806,12809,12811,12814,12816,12819],{"class":79,"line":1459},[77,12797,12798],{"class":1644},"      plugins",[77,12800,4850],{"class":104},[77,12802,12803],{"class":87},"\"static_layer\"",[77,12805,1451],{"class":104},[77,12807,12808],{"class":87},"\"obstacle_layer\"",[77,12810,1451],{"class":104},[77,12812,12813],{"class":87},"\"voxel_layer\"",[77,12815,1451],{"class":104},[77,12817,12818],{"class":87},"\"inflation_layer\"",[77,12820,4866],{"class":104},[77,12822,12823,12826],{"class":79,"line":1471},[77,12824,12825],{"class":1644},"      obstacle_layer",[77,12827,1647],{"class":104},[77,12829,12830,12833,12835],{"class":79,"line":1476},[77,12831,12832],{"class":1644},"        plugin",[77,12834,1662],{"class":104},[77,12836,12837],{"class":87},"\"nav2_costmap_2d::ObstacleLayer\"\n",[77,12839,12840,12843,12845],{"class":79,"line":1487},[77,12841,12842],{"class":1644},"        enabled",[77,12844,1662],{"class":104},[77,12846,9789],{"class":1213},[77,12848,12849,12852,12854],{"class":79,"line":1498},[77,12850,12851],{"class":1644},"        observation_sources",[77,12853,1662],{"class":104},[77,12855,6886],{"class":87},[77,12857,12858,12861],{"class":79,"line":1504},[77,12859,12860],{"class":1644},"        scan",[77,12862,1647],{"class":104},[77,12864,12865,12868,12870],{"class":79,"line":1515},[77,12866,12867],{"class":1644},"          topic",[77,12869,1662],{"class":104},[77,12871,1759],{"class":87},[77,12873,12874,12877,12879],{"class":79,"line":1521},[77,12875,12876],{"class":1644},"          max_obstacle_height",[77,12878,1662],{"class":104},[77,12880,1838],{"class":1213},[77,12882,12883,12886,12888],{"class":79,"line":1534},[77,12884,12885],{"class":1644},"          clearing",[77,12887,1662],{"class":104},[77,12889,9789],{"class":1213},[77,12891,12892,12895,12897],{"class":79,"line":1547},[77,12893,12894],{"class":1644},"          marking",[77,12896,1662],{"class":104},[77,12898,9789],{"class":1213},[77,12900,12901,12904,12906],{"class":79,"line":1559},[77,12902,12903],{"class":1644},"          data_type",[77,12905,1662],{"class":104},[77,12907,12908],{"class":87},"\"LaserScan\"\n",[77,12910,12911,12914,12916],{"class":79,"line":1572},[77,12912,12913],{"class":1644},"          raytrace_max_range",[77,12915,1662],{"class":104},[77,12917,2007],{"class":1213},[77,12919,12920,12923,12925],{"class":79,"line":1577},[77,12921,12922],{"class":1644},"          raytrace_min_range",[77,12924,1662],{"class":104},[77,12926,6759],{"class":1213},[77,12928,12929,12932,12934],{"class":79,"line":1588},[77,12930,12931],{"class":1644},"          obstacle_max_range",[77,12933,1662],{"class":104},[77,12935,12936],{"class":1213},"2.5\n",[77,12938,12939,12942,12944],{"class":79,"line":1593},[77,12940,12941],{"class":1644},"          obstacle_min_range",[77,12943,1662],{"class":104},[77,12945,6759],{"class":1213},[77,12947,12948,12951],{"class":79,"line":1599},[77,12949,12950],{"class":1644},"      voxel_layer",[77,12952,1647],{"class":104},[77,12954,12955,12957,12959],{"class":79,"line":1605},[77,12956,12832],{"class":1644},[77,12958,1662],{"class":104},[77,12960,12961],{"class":87},"\"nav2_costmap_2d::VoxelLayer\"\n",[77,12963,12964,12966,12968],{"class":79,"line":1611},[77,12965,12842],{"class":1644},[77,12967,1662],{"class":104},[77,12969,9789],{"class":1213},[77,12971,12972,12975,12977],{"class":79,"line":1616},[77,12973,12974],{"class":1644},"        publish_voxel_map",[77,12976,1662],{"class":104},[77,12978,9789],{"class":1213},[77,12980,12981,12984,12986],{"class":79,"line":1999},[77,12982,12983],{"class":1644},"        origin_z",[77,12985,1662],{"class":104},[77,12987,6759],{"class":1213},[77,12989,12990,12993,12995],{"class":79,"line":2010},[77,12991,12992],{"class":1644},"        z_resolution",[77,12994,1662],{"class":104},[77,12996,1848],{"class":1213},[77,12998,12999,13002,13004],{"class":79,"line":2023},[77,13000,13001],{"class":1644},"        z_voxels",[77,13003,1662],{"class":104},[77,13005,13006],{"class":1213},"16\n",[77,13008,13009,13012,13014],{"class":79,"line":2037},[77,13010,13011],{"class":1644},"        max_obstacle_height",[77,13013,1662],{"class":104},[77,13015,1838],{"class":1213},[77,13017,13018,13021,13023],{"class":79,"line":2050},[77,13019,13020],{"class":1644},"        mark_threshold",[77,13022,1662],{"class":104},[77,13024,4876],{"class":1213},[77,13026,13027,13029,13031],{"class":79,"line":2064},[77,13028,12851],{"class":1644},[77,13030,1662],{"class":104},[77,13032,6886],{"class":87},[77,13034,13035,13037],{"class":79,"line":2075},[77,13036,12860],{"class":1644},[77,13038,1647],{"class":104},[77,13040,13041,13043,13045],{"class":79,"line":2080},[77,13042,12867],{"class":1644},[77,13044,1662],{"class":104},[77,13046,1759],{"class":87},[77,13048,13049,13051,13053],{"class":79,"line":2090},[77,13050,12876],{"class":1644},[77,13052,1662],{"class":104},[77,13054,1838],{"class":1213},[77,13056,13057,13059,13061],{"class":79,"line":2101},[77,13058,12885],{"class":1644},[77,13060,1662],{"class":104},[77,13062,9789],{"class":1213},[77,13064,13065,13067,13069],{"class":79,"line":2113},[77,13066,12894],{"class":1644},[77,13068,1662],{"class":104},[77,13070,9789],{"class":1213},[77,13072,13073,13075,13077],{"class":79,"line":2118},[77,13074,12903],{"class":1644},[77,13076,1662],{"class":104},[77,13078,12908],{"class":87},[77,13080,13081,13083,13085],{"class":79,"line":2129},[77,13082,12913],{"class":1644},[77,13084,1662],{"class":104},[77,13086,2007],{"class":1213},[77,13088,13089,13091,13093],{"class":79,"line":2139},[77,13090,12922],{"class":1644},[77,13092,1662],{"class":104},[77,13094,6759],{"class":1213},[77,13096,13097,13099,13101],{"class":79,"line":2150},[77,13098,12931],{"class":1644},[77,13100,1662],{"class":104},[77,13102,12936],{"class":1213},[77,13104,13105,13107,13109],{"class":79,"line":2155},[77,13106,12941],{"class":1644},[77,13108,1662],{"class":104},[77,13110,6759],{"class":1213},[77,13112,13113,13116],{"class":79,"line":2169},[77,13114,13115],{"class":1644},"      static_layer",[77,13117,1647],{"class":104},[77,13119,13120,13122,13124],{"class":79,"line":2182},[77,13121,12832],{"class":1644},[77,13123,1662],{"class":104},[77,13125,13126],{"class":87},"\"nav2_costmap_2d::StaticLayer\"\n",[77,13128,13129,13132,13134],{"class":79,"line":2187},[77,13130,13131],{"class":1644},"        map_subscribe_transient_local",[77,13133,1662],{"class":104},[77,13135,9789],{"class":1213},[77,13137,13138,13141],{"class":79,"line":2201},[77,13139,13140],{"class":1644},"      inflation_layer",[77,13142,1647],{"class":104},[77,13144,13145,13147,13149],{"class":79,"line":2215},[77,13146,12832],{"class":1644},[77,13148,1662],{"class":104},[77,13150,13151],{"class":87},"\"nav2_costmap_2d::InflationLayer\"\n",[77,13153,13154,13157,13159],{"class":79,"line":2229},[77,13155,13156],{"class":1644},"        cost_scaling_factor",[77,13158,1662],{"class":104},[77,13160,13161],{"class":1213},"4.0\n",[77,13163,13164,13167,13169],{"class":79,"line":2240},[77,13165,13166],{"class":1644},"        inflation_radius",[77,13168,1662],{"class":104},[77,13170,13171],{"class":1213},"0.55\n",[77,13173,13174,13177,13179],{"class":79,"line":2250},[77,13175,13176],{"class":1644},"      always_send_full_costmap",[77,13178,1662],{"class":104},[77,13180,13181],{"class":1213},"False\n",[18,13183,13184],{},[21,13185,13186],{},"（3）controller_server相关配置文件",[18,13188,12434,13189,5188],{},[74,13190,13191],{},"controller.yaml",[68,13193,13195],{"className":1635,"code":13194,"language":1637,"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    failure_tolerance: 1.0\n    progress_checker_plugins: [\"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      max_vel_x: 0.6\n      max_vel_y: 0.0\n      max_vel_theta: 1.0\n      min_speed_xy: 0.0\n      max_speed_xy: 0.6\n      min_speed_theta: 0.0\n      acc_lim_x: 1.6\n      acc_lim_y: 0.0\n      acc_lim_theta: 3.2\n      decel_lim_x: -1.6\n      decel_lim_y: 0.0\n      decel_lim_theta: -3.2\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      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  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      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,13196,13197,13203,13209,13217,13226,13236,13245,13254,13263,13275,13288,13299,13303,13308,13315,13324,13333,13342,13346,13353,13362,13371,13380,13389,13393,13398,13405,13414,13423,13432,13441,13451,13460,13469,13478,13487,13496,13506,13515,13525,13535,13544,13554,13563,13573,13582,13592,13601,13611,13620,13629,13638,13647,13655,13697,13707,13717,13726,13736,13745,13754,13763,13772,13782,13791,13798,13804,13812,13820,13828,13836,13844,13853,13863,13872,13880,13888,13906,13912,13920,13928,13936,13942,13950,13958,13966,13972,13980,13988,13996,14004,14012,14018,14026,14034,14042,14050,14058,14066,14074,14082,14090,14096,14104,14112,14120,14128,14136,14144,14152,14160,14168,14174,14182],{"__ignoreMap":32},[77,13198,13199,13201],{"class":79,"line":80},[77,13200,6520],{"class":1644},[77,13202,1647],{"class":104},[77,13204,13205,13207],{"class":79,"line":114},[77,13206,1652],{"class":1644},[77,13208,1647],{"class":104},[77,13210,13211,13213,13215],{"class":79,"line":136},[77,13212,6533],{"class":1644},[77,13214,1662],{"class":104},[77,13216,9789],{"class":1213},[77,13218,13219,13222,13224],{"class":79,"line":143},[77,13220,13221],{"class":1644},"    controller_frequency",[77,13223,1662],{"class":104},[77,13225,1973],{"class":1213},[77,13227,13228,13231,13233],{"class":79,"line":150},[77,13229,13230],{"class":1644},"    min_x_velocity_threshold",[77,13232,1662],{"class":104},[77,13234,13235],{"class":1213},"0.001\n",[77,13237,13238,13241,13243],{"class":79,"line":162},[77,13239,13240],{"class":1644},"    min_y_velocity_threshold",[77,13242,1662],{"class":104},[77,13244,1870],{"class":1213},[77,13246,13247,13250,13252],{"class":79,"line":174},[77,13248,13249],{"class":1644},"    min_theta_velocity_threshold",[77,13251,1662],{"class":104},[77,13253,13235],{"class":1213},[77,13255,13256,13259,13261],{"class":79,"line":179},[77,13257,13258],{"class":1644},"    failure_tolerance",[77,13260,1662],{"class":104},[77,13262,12729],{"class":1213},[77,13264,13265,13268,13270,13273],{"class":79,"line":184},[77,13266,13267],{"class":1644},"    progress_checker_plugins",[77,13269,4850],{"class":104},[77,13271,13272],{"class":87},"\"progress_checker\"",[77,13274,4866],{"class":104},[77,13276,13277,13280,13282,13285],{"class":79,"line":195},[77,13278,13279],{"class":1644},"    goal_checker_plugins",[77,13281,4850],{"class":104},[77,13283,13284],{"class":87},"\"general_goal_checker\"",[77,13286,13287],{"class":104},"] \n",[77,13289,13290,13293,13295,13297],{"class":79,"line":1344},[77,13291,13292],{"class":1644},"    controller_plugins",[77,13294,4850],{"class":104},[77,13296,11123],{"class":87},[77,13298,4866],{"class":104},[77,13300,13301],{"class":79,"line":1359},[77,13302,140],{"emptyLinePlaceholder":139},[77,13304,13305],{"class":79,"line":1364},[77,13306,13307],{"class":146},"    # Progress checker parameters\n",[77,13309,13310,13313],{"class":79,"line":1375},[77,13311,13312],{"class":1644},"    progress_checker",[77,13314,1647],{"class":104},[77,13316,13317,13319,13321],{"class":79,"line":1384},[77,13318,12563],{"class":1644},[77,13320,1662],{"class":104},[77,13322,13323],{"class":87},"\"nav2_controller::SimpleProgressChecker\"\n",[77,13325,13326,13329,13331],{"class":79,"line":1398},[77,13327,13328],{"class":1644},"      required_movement_radius",[77,13330,1662],{"class":104},[77,13332,1870],{"class":1213},[77,13334,13335,13338,13340],{"class":79,"line":1411},[77,13336,13337],{"class":1644},"      movement_time_allowance",[77,13339,1662],{"class":104},[77,13341,1973],{"class":1213},[77,13343,13344],{"class":79,"line":1421},[77,13345,140],{"emptyLinePlaceholder":139},[77,13347,13348,13351],{"class":79,"line":1429},[77,13349,13350],{"class":1644},"    general_goal_checker",[77,13352,1647],{"class":104},[77,13354,13355,13358,13360],{"class":79,"line":1445},[77,13356,13357],{"class":1644},"      stateful",[77,13359,1662],{"class":104},[77,13361,9789],{"class":1213},[77,13363,13364,13366,13368],{"class":79,"line":1459},[77,13365,12563],{"class":1644},[77,13367,1662],{"class":104},[77,13369,13370],{"class":87},"\"nav2_controller::SimpleGoalChecker\"\n",[77,13372,13373,13376,13378],{"class":79,"line":1471},[77,13374,13375],{"class":1644},"      xy_goal_tolerance",[77,13377,1662],{"class":104},[77,13379,4896],{"class":1213},[77,13381,13382,13385,13387],{"class":79,"line":1476},[77,13383,13384],{"class":1644},"      yaw_goal_tolerance",[77,13386,1662],{"class":104},[77,13388,4896],{"class":1213},[77,13390,13391],{"class":79,"line":1487},[77,13392,140],{"emptyLinePlaceholder":139},[77,13394,13395],{"class":79,"line":1498},[77,13396,13397],{"class":146},"    # DWB parameters\n",[77,13399,13400,13403],{"class":79,"line":1504},[77,13401,13402],{"class":1644},"    FollowPath",[77,13404,1647],{"class":104},[77,13406,13407,13409,13411],{"class":79,"line":1515},[77,13408,12563],{"class":1644},[77,13410,1662],{"class":104},[77,13412,13413],{"class":87},"\"dwb_core::DWBLocalPlanner\"\n",[77,13415,13416,13419,13421],{"class":79,"line":1521},[77,13417,13418],{"class":1644},"      debug_trajectory_details",[77,13420,1662],{"class":104},[77,13422,9789],{"class":1213},[77,13424,13425,13428,13430],{"class":79,"line":1534},[77,13426,13427],{"class":1644},"      min_vel_x",[77,13429,1662],{"class":104},[77,13431,6759],{"class":1213},[77,13433,13434,13437,13439],{"class":79,"line":1547},[77,13435,13436],{"class":1644},"      min_vel_y",[77,13438,1662],{"class":104},[77,13440,6759],{"class":1213},[77,13442,13443,13446,13448],{"class":79,"line":1559},[77,13444,13445],{"class":1644},"      max_vel_x",[77,13447,1662],{"class":104},[77,13449,13450],{"class":1213},"0.6\n",[77,13452,13453,13456,13458],{"class":79,"line":1572},[77,13454,13455],{"class":1644},"      max_vel_y",[77,13457,1662],{"class":104},[77,13459,6759],{"class":1213},[77,13461,13462,13465,13467],{"class":79,"line":1577},[77,13463,13464],{"class":1644},"      max_vel_theta",[77,13466,1662],{"class":104},[77,13468,12729],{"class":1213},[77,13470,13471,13474,13476],{"class":79,"line":1588},[77,13472,13473],{"class":1644},"      min_speed_xy",[77,13475,1662],{"class":104},[77,13477,6759],{"class":1213},[77,13479,13480,13483,13485],{"class":79,"line":1593},[77,13481,13482],{"class":1644},"      max_speed_xy",[77,13484,1662],{"class":104},[77,13486,13450],{"class":1213},[77,13488,13489,13492,13494],{"class":79,"line":1599},[77,13490,13491],{"class":1644},"      min_speed_theta",[77,13493,1662],{"class":104},[77,13495,6759],{"class":1213},[77,13497,13498,13501,13503],{"class":79,"line":1605},[77,13499,13500],{"class":1644},"      acc_lim_x",[77,13502,1662],{"class":104},[77,13504,13505],{"class":1213},"1.6\n",[77,13507,13508,13511,13513],{"class":79,"line":1611},[77,13509,13510],{"class":1644},"      acc_lim_y",[77,13512,1662],{"class":104},[77,13514,6759],{"class":1213},[77,13516,13517,13520,13522],{"class":79,"line":1616},[77,13518,13519],{"class":1644},"      acc_lim_theta",[77,13521,1662],{"class":104},[77,13523,13524],{"class":1213},"3.2\n",[77,13526,13527,13530,13532],{"class":79,"line":1999},[77,13528,13529],{"class":1644},"      decel_lim_x",[77,13531,1662],{"class":104},[77,13533,13534],{"class":1213},"-1.6\n",[77,13536,13537,13540,13542],{"class":79,"line":2010},[77,13538,13539],{"class":1644},"      decel_lim_y",[77,13541,1662],{"class":104},[77,13543,6759],{"class":1213},[77,13545,13546,13549,13551],{"class":79,"line":2023},[77,13547,13548],{"class":1644},"      decel_lim_theta",[77,13550,1662],{"class":104},[77,13552,13553],{"class":1213},"-3.2\n",[77,13555,13556,13559,13561],{"class":79,"line":2037},[77,13557,13558],{"class":1644},"      vx_samples",[77,13560,1662],{"class":104},[77,13562,12514],{"class":1213},[77,13564,13565,13568,13570],{"class":79,"line":2050},[77,13566,13567],{"class":1644},"      vy_samples",[77,13569,1662],{"class":104},[77,13571,13572],{"class":1213},"5\n",[77,13574,13575,13578,13580],{"class":79,"line":2064},[77,13576,13577],{"class":1644},"      vtheta_samples",[77,13579,1662],{"class":104},[77,13581,12514],{"class":1213},[77,13583,13584,13587,13589],{"class":79,"line":2075},[77,13585,13586],{"class":1644},"      sim_time",[77,13588,1662],{"class":104},[77,13590,13591],{"class":1213},"1.7\n",[77,13593,13594,13597,13599],{"class":79,"line":2080},[77,13595,13596],{"class":1644},"      linear_granularity",[77,13598,1662],{"class":104},[77,13600,1848],{"class":1213},[77,13602,13603,13606,13608],{"class":79,"line":2090},[77,13604,13605],{"class":1644},"      angular_granularity",[77,13607,1662],{"class":104},[77,13609,13610],{"class":1213},"0.025\n",[77,13612,13613,13616,13618],{"class":79,"line":2101},[77,13614,13615],{"class":1644},"      transform_tolerance",[77,13617,1662],{"class":104},[77,13619,12729],{"class":1213},[77,13621,13622,13624,13626],{"class":79,"line":2113},[77,13623,13375],{"class":1644},[77,13625,1662],{"class":104},[77,13627,13628],{"class":1213},"0.15\n",[77,13630,13631,13634,13636],{"class":79,"line":2118},[77,13632,13633],{"class":1644},"      trans_stopped_velocity",[77,13635,1662],{"class":104},[77,13637,4896],{"class":1213},[77,13639,13640,13643,13645],{"class":79,"line":2129},[77,13641,13642],{"class":1644},"      short_circuit_trajectory_evaluation",[77,13644,1662],{"class":104},[77,13646,9789],{"class":1213},[77,13648,13649,13651,13653],{"class":79,"line":2139},[77,13650,13357],{"class":1644},[77,13652,1662],{"class":104},[77,13654,9789],{"class":1213},[77,13656,13657,13660,13662,13665,13667,13670,13672,13675,13677,13680,13682,13685,13687,13690,13692,13695],{"class":79,"line":2150},[77,13658,13659],{"class":1644},"      critics",[77,13661,4850],{"class":104},[77,13663,13664],{"class":87},"\"RotateToGoal\"",[77,13666,1451],{"class":104},[77,13668,13669],{"class":87},"\"Oscillation\"",[77,13671,1451],{"class":104},[77,13673,13674],{"class":87},"\"BaseObstacle\"",[77,13676,1451],{"class":104},[77,13678,13679],{"class":87},"\"GoalAlign\"",[77,13681,1451],{"class":104},[77,13683,13684],{"class":87},"\"PathAlign\"",[77,13686,1451],{"class":104},[77,13688,13689],{"class":87},"\"PathDist\"",[77,13691,1451],{"class":104},[77,13693,13694],{"class":87},"\"GoalDist\"",[77,13696,4866],{"class":104},[77,13698,13699,13702,13704],{"class":79,"line":2155},[77,13700,13701],{"class":1644},"      BaseObstacle.scale",[77,13703,1662],{"class":104},[77,13705,13706],{"class":1213},"0.02\n",[77,13708,13709,13712,13714],{"class":79,"line":2169},[77,13710,13711],{"class":1644},"      PathAlign.scale",[77,13713,1662],{"class":104},[77,13715,13716],{"class":1213},"32.0\n",[77,13718,13719,13722,13724],{"class":79,"line":2182},[77,13720,13721],{"class":1644},"      PathAlign.forward_point_distance",[77,13723,1662],{"class":104},[77,13725,1944],{"class":1213},[77,13727,13728,13731,13733],{"class":79,"line":2187},[77,13729,13730],{"class":1644},"      GoalAlign.scale",[77,13732,1662],{"class":104},[77,13734,13735],{"class":1213},"24.0\n",[77,13737,13738,13741,13743],{"class":79,"line":2201},[77,13739,13740],{"class":1644},"      GoalAlign.forward_point_distance",[77,13742,1662],{"class":104},[77,13744,1944],{"class":1213},[77,13746,13747,13750,13752],{"class":79,"line":2215},[77,13748,13749],{"class":1644},"      PathDist.scale",[77,13751,1662],{"class":104},[77,13753,13716],{"class":1213},[77,13755,13756,13759,13761],{"class":79,"line":2229},[77,13757,13758],{"class":1644},"      GoalDist.scale",[77,13760,1662],{"class":104},[77,13762,13735],{"class":1213},[77,13764,13765,13768,13770],{"class":79,"line":2240},[77,13766,13767],{"class":1644},"      RotateToGoal.scale",[77,13769,1662],{"class":104},[77,13771,13716],{"class":1213},[77,13773,13774,13777,13779],{"class":79,"line":2250},[77,13775,13776],{"class":1644},"      RotateToGoal.slowing_factor",[77,13778,1662],{"class":104},[77,13780,13781],{"class":1213},"5.0\n",[77,13783,13784,13787,13789],{"class":79,"line":6470},[77,13785,13786],{"class":1644},"      RotateToGoal.lookahead_time",[77,13788,1662],{"class":104},[77,13790,6680],{"class":1213},[77,13792,13793,13796],{"class":79,"line":6476},[77,13794,13795],{"class":1644},"  local_costmap",[77,13797,1647],{"class":104},[77,13799,13800,13802],{"class":79,"line":6482},[77,13801,12717],{"class":1644},[77,13803,1647],{"class":104},[77,13805,13806,13808,13810],{"class":79,"line":9993},[77,13807,12724],{"class":1644},[77,13809,1662],{"class":104},[77,13811,13781],{"class":1213},[77,13813,13814,13816,13818],{"class":79,"line":10005},[77,13815,12734],{"class":1644},[77,13817,1662],{"class":104},[77,13819,1838],{"class":1213},[77,13821,13822,13824,13826],{"class":79,"line":10016},[77,13823,12743],{"class":1644},[77,13825,1662],{"class":104},[77,13827,1729],{"class":87},[77,13829,13830,13832,13834],{"class":79,"line":10027},[77,13831,12752],{"class":1644},[77,13833,1662],{"class":104},[77,13835,1749],{"class":87},[77,13837,13838,13840,13842],{"class":79,"line":10036},[77,13839,12761],{"class":1644},[77,13841,1662],{"class":104},[77,13843,9789],{"class":1213},[77,13845,13846,13849,13851],{"class":79,"line":10042},[77,13847,13848],{"class":1644},"      rolling_window",[77,13850,1662],{"class":104},[77,13852,9789],{"class":1213},[77,13854,13855,13858,13860],{"class":79,"line":10051},[77,13856,13857],{"class":1644},"      width",[77,13859,1662],{"class":104},[77,13861,13862],{"class":1213},"2\n",[77,13864,13865,13868,13870],{"class":79,"line":10056},[77,13866,13867],{"class":1644},"      height",[77,13869,1662],{"class":104},[77,13871,13862],{"class":1213},[77,13873,13874,13876,13878],{"class":79,"line":10066},[77,13875,12780],{"class":1644},[77,13877,1662],{"class":104},[77,13879,1848],{"class":1213},[77,13881,13882,13884,13886],{"class":79,"line":10082},[77,13883,12770],{"class":1644},[77,13885,1662],{"class":104},[77,13887,12775],{"class":87},[77,13889,13890,13892,13894,13896,13898,13900,13902,13904],{"class":79,"line":10087},[77,13891,12798],{"class":1644},[77,13893,4850],{"class":104},[77,13895,12808],{"class":87},[77,13897,1451],{"class":104},[77,13899,12813],{"class":87},[77,13901,1451],{"class":104},[77,13903,12818],{"class":87},[77,13905,4866],{"class":104},[77,13907,13908,13910],{"class":79,"line":10092},[77,13909,13140],{"class":1644},[77,13911,1647],{"class":104},[77,13913,13914,13916,13918],{"class":79,"line":10097},[77,13915,12832],{"class":1644},[77,13917,1662],{"class":104},[77,13919,13151],{"class":87},[77,13921,13922,13924,13926],{"class":79,"line":10107},[77,13923,13166],{"class":1644},[77,13925,1662],{"class":104},[77,13927,1870],{"class":1213},[77,13929,13930,13932,13934],{"class":79,"line":10119},[77,13931,13156],{"class":1644},[77,13933,1662],{"class":104},[77,13935,13161],{"class":1213},[77,13937,13938,13940],{"class":79,"line":10131},[77,13939,12825],{"class":1644},[77,13941,1647],{"class":104},[77,13943,13944,13946,13948],{"class":79,"line":10142},[77,13945,12832],{"class":1644},[77,13947,1662],{"class":104},[77,13949,12837],{"class":87},[77,13951,13952,13954,13956],{"class":79,"line":10153},[77,13953,12842],{"class":1644},[77,13955,1662],{"class":104},[77,13957,9789],{"class":1213},[77,13959,13960,13962,13964],{"class":79,"line":10162},[77,13961,12851],{"class":1644},[77,13963,1662],{"class":104},[77,13965,6886],{"class":87},[77,13967,13968,13970],{"class":79,"line":10168},[77,13969,12860],{"class":1644},[77,13971,1647],{"class":104},[77,13973,13974,13976,13978],{"class":79,"line":10177},[77,13975,12867],{"class":1644},[77,13977,1662],{"class":104},[77,13979,1759],{"class":87},[77,13981,13982,13984,13986],{"class":79,"line":10182},[77,13983,12876],{"class":1644},[77,13985,1662],{"class":104},[77,13987,1838],{"class":1213},[77,13989,13990,13992,13994],{"class":79,"line":10187},[77,13991,12885],{"class":1644},[77,13993,1662],{"class":104},[77,13995,9789],{"class":1213},[77,13997,13998,14000,14002],{"class":79,"line":10192},[77,13999,12894],{"class":1644},[77,14001,1662],{"class":104},[77,14003,9789],{"class":1213},[77,14005,14006,14008,14010],{"class":79,"line":10202},[77,14007,12903],{"class":1644},[77,14009,1662],{"class":104},[77,14011,12908],{"class":87},[77,14013,14014,14016],{"class":79,"line":10214},[77,14015,12950],{"class":1644},[77,14017,1647],{"class":104},[77,14019,14020,14022,14024],{"class":79,"line":10226},[77,14021,12832],{"class":1644},[77,14023,1662],{"class":104},[77,14025,12961],{"class":87},[77,14027,14028,14030,14032],{"class":79,"line":10237},[77,14029,12842],{"class":1644},[77,14031,1662],{"class":104},[77,14033,9789],{"class":1213},[77,14035,14036,14038,14040],{"class":79,"line":10248},[77,14037,12974],{"class":1644},[77,14039,1662],{"class":104},[77,14041,9789],{"class":1213},[77,14043,14044,14046,14048],{"class":79,"line":10257},[77,14045,12983],{"class":1644},[77,14047,1662],{"class":104},[77,14049,6759],{"class":1213},[77,14051,14052,14054,14056],{"class":79,"line":10263},[77,14053,12992],{"class":1644},[77,14055,1662],{"class":104},[77,14057,1848],{"class":1213},[77,14059,14060,14062,14064],{"class":79,"line":10272},[77,14061,13001],{"class":1644},[77,14063,1662],{"class":104},[77,14065,13006],{"class":1213},[77,14067,14068,14070,14072],{"class":79,"line":10277},[77,14069,13011],{"class":1644},[77,14071,1662],{"class":104},[77,14073,1838],{"class":1213},[77,14075,14076,14078,14080],{"class":79,"line":10282},[77,14077,13020],{"class":1644},[77,14079,1662],{"class":104},[77,14081,4876],{"class":1213},[77,14083,14084,14086,14088],{"class":79,"line":10287},[77,14085,12851],{"class":1644},[77,14087,1662],{"class":104},[77,14089,6886],{"class":87},[77,14091,14092,14094],{"class":79,"line":10297},[77,14093,12860],{"class":1644},[77,14095,1647],{"class":104},[77,14097,14098,14100,14102],{"class":79,"line":10309},[77,14099,12867],{"class":1644},[77,14101,1662],{"class":104},[77,14103,1759],{"class":87},[77,14105,14106,14108,14110],{"class":79,"line":10321},[77,14107,12876],{"class":1644},[77,14109,1662],{"class":104},[77,14111,1838],{"class":1213},[77,14113,14114,14116,14118],{"class":79,"line":10332},[77,14115,12885],{"class":1644},[77,14117,1662],{"class":104},[77,14119,9789],{"class":1213},[77,14121,14122,14124,14126],{"class":79,"line":10343},[77,14123,12894],{"class":1644},[77,14125,1662],{"class":104},[77,14127,9789],{"class":1213},[77,14129,14130,14132,14134],{"class":79,"line":10356},[77,14131,12903],{"class":1644},[77,14133,1662],{"class":104},[77,14135,12908],{"class":87},[77,14137,14138,14140,14142],{"class":79,"line":10365},[77,14139,12913],{"class":1644},[77,14141,1662],{"class":104},[77,14143,2007],{"class":1213},[77,14145,14146,14148,14150],{"class":79,"line":10371},[77,14147,12922],{"class":1644},[77,14149,1662],{"class":104},[77,14151,6759],{"class":1213},[77,14153,14154,14156,14158],{"class":79,"line":10380},[77,14155,12931],{"class":1644},[77,14157,1662],{"class":104},[77,14159,12936],{"class":1213},[77,14161,14162,14164,14166],{"class":79,"line":10385},[77,14163,12941],{"class":1644},[77,14165,1662],{"class":104},[77,14167,6759],{"class":1213},[77,14169,14170,14172],{"class":79,"line":10394},[77,14171,13115],{"class":1644},[77,14173,1647],{"class":104},[77,14175,14176,14178,14180],{"class":79,"line":10407},[77,14177,13131],{"class":1644},[77,14179,1662],{"class":104},[77,14181,9789],{"class":1213},[77,14183,14184,14186,14188],{"class":79,"line":10421},[77,14185,13176],{"class":1644},[77,14187,1662],{"class":104},[77,14189,9789],{"class":1213},[18,14191,14192],{},"Footprint",[46,14194,14195,14198],{},[49,14196,14197],{},"将毫米转换为米：长0.96m，宽0.45m",[49,14199,14200,14201,14203],{},"以机器人中心（",[74,14202,5714],{},"坐标系原点）为基准，计算矩形顶点坐标：",[18,14205,14206,14209],{},[4268,14207,14208],{},"说明","：顶点按顺时针或逆时针顺序排列，覆盖机器人长宽边界。（右手坐标系）",[18,14211,14212],{},"例如长960宽450长400",[68,14214,14218],{"className":14215,"code":14216,"language":14217,"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,14219,14220],{"__ignoreMap":32},[77,14221,14222,14225],{"class":79,"line":80},[77,14223,14224],{"class":104},"footprint: ",[77,14226,14227],{"class":1213},"[[0.48, 0.225], [0.48, -0.225], [-0.48, -0.225], [-0.48, 0.225]]\n",[18,14229,14230],{},[21,14231,14232],{},"（4）behavior_server相关配置文件",[18,14234,12434,14235,5188],{},[74,14236,14237],{},"behavior.yaml",[68,14239,14241],{"className":1635,"code":14240,"language":1637,"meta":32,"style":32},"/**:\n  ros__parameters:\n    local_costmap_topic: local_costmap/costmap_raw\n    global_costmap_topic: global_costmap/costmap_raw\n    local_footprint_topic: local_costmap/published_footprint\n    global_footprint_topic: global_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    local_frame: odom\n    global_frame: map\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,14242,14243,14249,14255,14265,14275,14285,14295,14304,14336,14343,14352,14359,14368,14375,14384,14391,14400,14407,14416,14425,14433,14441,14449,14457,14466,14475,14485],{"__ignoreMap":32},[77,14244,14245,14247],{"class":79,"line":80},[77,14246,6520],{"class":1644},[77,14248,1647],{"class":104},[77,14250,14251,14253],{"class":79,"line":114},[77,14252,1652],{"class":1644},[77,14254,1647],{"class":104},[77,14256,14257,14260,14262],{"class":79,"line":136},[77,14258,14259],{"class":1644},"    local_costmap_topic",[77,14261,1662],{"class":104},[77,14263,14264],{"class":87},"local_costmap/costmap_raw\n",[77,14266,14267,14270,14272],{"class":79,"line":143},[77,14268,14269],{"class":1644},"    global_costmap_topic",[77,14271,1662],{"class":104},[77,14273,14274],{"class":87},"global_costmap/costmap_raw\n",[77,14276,14277,14280,14282],{"class":79,"line":150},[77,14278,14279],{"class":1644},"    local_footprint_topic",[77,14281,1662],{"class":104},[77,14283,14284],{"class":87},"local_costmap/published_footprint\n",[77,14286,14287,14290,14292],{"class":79,"line":162},[77,14288,14289],{"class":1644},"    global_footprint_topic",[77,14291,1662],{"class":104},[77,14293,14294],{"class":87},"global_costmap/published_footprint\n",[77,14296,14297,14300,14302],{"class":79,"line":174},[77,14298,14299],{"class":1644},"    cycle_frequency",[77,14301,1662],{"class":104},[77,14303,13781],{"class":1213},[77,14305,14306,14309,14311,14314,14316,14319,14321,14324,14326,14329,14331,14334],{"class":79,"line":179},[77,14307,14308],{"class":1644},"    behavior_plugins",[77,14310,4850],{"class":104},[77,14312,14313],{"class":87},"\"spin\"",[77,14315,1451],{"class":104},[77,14317,14318],{"class":87},"\"backup\"",[77,14320,1451],{"class":104},[77,14322,14323],{"class":87},"\"drive_on_heading\"",[77,14325,1451],{"class":104},[77,14327,14328],{"class":87},"\"assisted_teleop\"",[77,14330,1451],{"class":104},[77,14332,14333],{"class":87},"\"wait\"",[77,14335,4866],{"class":104},[77,14337,14338,14341],{"class":79,"line":184},[77,14339,14340],{"class":1644},"    spin",[77,14342,1647],{"class":104},[77,14344,14345,14347,14349],{"class":79,"line":195},[77,14346,12563],{"class":1644},[77,14348,1662],{"class":104},[77,14350,14351],{"class":87},"\"nav2_behaviors::Spin\"\n",[77,14353,14354,14357],{"class":79,"line":1344},[77,14355,14356],{"class":1644},"    backup",[77,14358,1647],{"class":104},[77,14360,14361,14363,14365],{"class":79,"line":1359},[77,14362,12563],{"class":1644},[77,14364,1662],{"class":104},[77,14366,14367],{"class":87},"\"nav2_behaviors::BackUp\"\n",[77,14369,14370,14373],{"class":79,"line":1364},[77,14371,14372],{"class":1644},"    drive_on_heading",[77,14374,1647],{"class":104},[77,14376,14377,14379,14381],{"class":79,"line":1375},[77,14378,12563],{"class":1644},[77,14380,1662],{"class":104},[77,14382,14383],{"class":87},"\"nav2_behaviors::DriveOnHeading\"\n",[77,14385,14386,14389],{"class":79,"line":1384},[77,14387,14388],{"class":1644},"    wait",[77,14390,1647],{"class":104},[77,14392,14393,14395,14397],{"class":79,"line":1398},[77,14394,12563],{"class":1644},[77,14396,1662],{"class":104},[77,14398,14399],{"class":87},"\"nav2_behaviors::Wait\"\n",[77,14401,14402,14405],{"class":79,"line":1411},[77,14403,14404],{"class":1644},"    assisted_teleop",[77,14406,1647],{"class":104},[77,14408,14409,14411,14413],{"class":79,"line":1421},[77,14410,12563],{"class":1644},[77,14412,1662],{"class":104},[77,14414,14415],{"class":87},"\"nav2_behaviors::AssistedTeleop\"\n",[77,14417,14418,14421,14423],{"class":79,"line":1429},[77,14419,14420],{"class":1644},"    local_frame",[77,14422,1662],{"class":104},[77,14424,1729],{"class":87},[77,14426,14427,14429,14431],{"class":79,"line":1445},[77,14428,12471],{"class":1644},[77,14430,1662],{"class":104},[77,14432,1739],{"class":87},[77,14434,14435,14437,14439],{"class":79,"line":1459},[77,14436,12480],{"class":1644},[77,14438,1662],{"class":104},[77,14440,1749],{"class":87},[77,14442,14443,14445,14447],{"class":79,"line":1471},[77,14444,6819],{"class":1644},[77,14446,1662],{"class":104},[77,14448,1944],{"class":1213},[77,14450,14451,14453,14455],{"class":79,"line":1476},[77,14452,6533],{"class":1644},[77,14454,1662],{"class":104},[77,14456,9789],{"class":1213},[77,14458,14459,14462,14464],{"class":79,"line":1487},[77,14460,14461],{"class":1644},"    simulate_ahead_time",[77,14463,1662],{"class":104},[77,14465,1838],{"class":1213},[77,14467,14468,14471,14473],{"class":79,"line":1498},[77,14469,14470],{"class":1644},"    max_rotational_vel",[77,14472,1662],{"class":104},[77,14474,12729],{"class":1213},[77,14476,14477,14480,14482],{"class":79,"line":1504},[77,14478,14479],{"class":1644},"    min_rotational_vel",[77,14481,1662],{"class":104},[77,14483,14484],{"class":1213},"0.4\n",[77,14486,14487,14490,14492],{"class":79,"line":1515},[77,14488,14489],{"class":1644},"    rotational_acc_lim",[77,14491,1662],{"class":104},[77,14493,13524],{"class":1213},[18,14495,14496],{},[21,14497,14498],{},"（5）waypoint_follower相关配置文件",[18,14500,12434,14501,5188],{},[74,14502,14503],{},"waypoint.yaml",[68,14505,14507],{"className":1635,"code":14506,"language":1637,"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,14508,14509,14515,14521,14529,14538,14547,14557,14564,14573,14582],{"__ignoreMap":32},[77,14510,14511,14513],{"class":79,"line":80},[77,14512,6520],{"class":1644},[77,14514,1647],{"class":104},[77,14516,14517,14519],{"class":79,"line":114},[77,14518,1652],{"class":1644},[77,14520,1647],{"class":104},[77,14522,14523,14525,14527],{"class":79,"line":136},[77,14524,6533],{"class":1644},[77,14526,1662],{"class":104},[77,14528,9789],{"class":1213},[77,14530,14531,14534,14536],{"class":79,"line":143},[77,14532,14533],{"class":1644},"    loop_rate",[77,14535,1662],{"class":104},[77,14537,12514],{"class":1213},[77,14539,14540,14543,14545],{"class":79,"line":150},[77,14541,14542],{"class":1644},"    stop_on_failure",[77,14544,1662],{"class":104},[77,14546,1805],{"class":1213},[77,14548,14549,14552,14554],{"class":79,"line":162},[77,14550,14551],{"class":1644},"    waypoint_task_executor_plugin",[77,14553,1662],{"class":104},[77,14555,14556],{"class":87},"\"wait_at_waypoint\"\n",[77,14558,14559,14562],{"class":79,"line":174},[77,14560,14561],{"class":1644},"    wait_at_waypoint",[77,14563,1647],{"class":104},[77,14565,14566,14568,14570],{"class":79,"line":179},[77,14567,12563],{"class":1644},[77,14569,1662],{"class":104},[77,14571,14572],{"class":87},"\"nav2_waypoint_follower::WaitAtWaypoint\"\n",[77,14574,14575,14578,14580],{"class":79,"line":184},[77,14576,14577],{"class":1644},"      enabled",[77,14579,1662],{"class":104},[77,14581,9789],{"class":1213},[77,14583,14584,14587,14589],{"class":79,"line":195},[77,14585,14586],{"class":1644},"      waypoint_pause_duration",[77,14588,1662],{"class":104},[77,14590,14591],{"class":1213},"5000\n",[18,14593,14594],{},[21,14595,14596],{},"（6）velocity_smoother相关配置文件",[18,14598,12434,14599,5188],{},[74,14600,14601],{},"velocity.yaml",[68,14603,14605],{"className":1635,"code":14604,"language":1637,"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.6, 0.0, 1.0]\n    min_velocity: [-0.6, 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,14606,14607,14613,14619,14627,14636,14645,14655,14676,14697,14718,14739,14747,14756,14775],{"__ignoreMap":32},[77,14608,14609,14611],{"class":79,"line":80},[77,14610,6520],{"class":1644},[77,14612,1647],{"class":104},[77,14614,14615,14617],{"class":79,"line":114},[77,14616,1652],{"class":1644},[77,14618,1647],{"class":104},[77,14620,14621,14623,14625],{"class":79,"line":136},[77,14622,6533],{"class":1644},[77,14624,1662],{"class":104},[77,14626,9789],{"class":1213},[77,14628,14629,14632,14634],{"class":79,"line":143},[77,14630,14631],{"class":1644},"    smoothing_frequency",[77,14633,1662],{"class":104},[77,14635,12643],{"class":1213},[77,14637,14638,14641,14643],{"class":79,"line":150},[77,14639,14640],{"class":1644},"    scale_velocities",[77,14642,1662],{"class":104},[77,14644,13181],{"class":1213},[77,14646,14647,14650,14652],{"class":79,"line":162},[77,14648,14649],{"class":1644},"    feedback",[77,14651,1662],{"class":104},[77,14653,14654],{"class":87},"\"OPEN_LOOP\"\n",[77,14656,14657,14660,14662,14665,14667,14670,14672,14674],{"class":79,"line":174},[77,14658,14659],{"class":1644},"    max_velocity",[77,14661,4850],{"class":104},[77,14663,14664],{"class":1213},"0.6",[77,14666,1451],{"class":104},[77,14668,14669],{"class":1213},"0.0",[77,14671,1451],{"class":104},[77,14673,2177],{"class":1213},[77,14675,4866],{"class":104},[77,14677,14678,14681,14683,14686,14688,14690,14692,14695],{"class":79,"line":179},[77,14679,14680],{"class":1644},"    min_velocity",[77,14682,4850],{"class":104},[77,14684,14685],{"class":1213},"-0.6",[77,14687,1451],{"class":104},[77,14689,14669],{"class":1213},[77,14691,1451],{"class":104},[77,14693,14694],{"class":1213},"-1.0",[77,14696,4866],{"class":104},[77,14698,14699,14702,14704,14707,14709,14711,14713,14716],{"class":79,"line":184},[77,14700,14701],{"class":1644},"    max_accel",[77,14703,4850],{"class":104},[77,14705,14706],{"class":1213},"2.5",[77,14708,1451],{"class":104},[77,14710,14669],{"class":1213},[77,14712,1451],{"class":104},[77,14714,14715],{"class":1213},"3.2",[77,14717,4866],{"class":104},[77,14719,14720,14723,14725,14728,14730,14732,14734,14737],{"class":79,"line":195},[77,14721,14722],{"class":1644},"    max_decel",[77,14724,4850],{"class":104},[77,14726,14727],{"class":1213},"-2.5",[77,14729,1451],{"class":104},[77,14731,14669],{"class":1213},[77,14733,1451],{"class":104},[77,14735,14736],{"class":1213},"-3.2",[77,14738,4866],{"class":104},[77,14740,14741,14743,14745],{"class":79,"line":1344},[77,14742,12489],{"class":1644},[77,14744,1662],{"class":104},[77,14746,6730],{"class":87},[77,14748,14749,14752,14754],{"class":79,"line":1359},[77,14750,14751],{"class":1644},"    odom_duration",[77,14753,1662],{"class":104},[77,14755,1944],{"class":1213},[77,14757,14758,14761,14763,14765,14767,14769,14771,14773],{"class":79,"line":1364},[77,14759,14760],{"class":1644},"    deadband_velocity",[77,14762,4850],{"class":104},[77,14764,14669],{"class":1213},[77,14766,1451],{"class":104},[77,14768,14669],{"class":1213},[77,14770,1451],{"class":104},[77,14772,14669],{"class":1213},[77,14774,4866],{"class":104},[77,14776,14777,14780,14782],{"class":79,"line":1375},[77,14778,14779],{"class":1644},"    velocity_timeout",[77,14781,1662],{"class":104},[77,14783,12729],{"class":1213},[18,14785,14786],{},[21,14787,14788],{},"（7）smoother_server相关配置文件",[18,14790,12434,14791,5188],{},[74,14792,14793],{},"smootherr.yaml",[68,14795,14797],{"className":1635,"code":14796,"language":1637,"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,14798,14799,14805,14811,14820,14829,14837,14845,14857,14864,14873,14882],{"__ignoreMap":32},[77,14800,14801,14803],{"class":79,"line":80},[77,14802,6520],{"class":1644},[77,14804,1647],{"class":104},[77,14806,14807,14809],{"class":79,"line":114},[77,14808,1652],{"class":1644},[77,14810,1647],{"class":104},[77,14812,14813,14816,14818],{"class":79,"line":136},[77,14814,14815],{"class":1644},"    costmap_topic",[77,14817,1662],{"class":104},[77,14819,14274],{"class":87},[77,14821,14822,14825,14827],{"class":79,"line":143},[77,14823,14824],{"class":1644},"    footprint_topic",[77,14826,1662],{"class":104},[77,14828,14294],{"class":87},[77,14830,14831,14833,14835],{"class":79,"line":150},[77,14832,12480],{"class":1644},[77,14834,1662],{"class":104},[77,14836,1749],{"class":87},[77,14838,14839,14841,14843],{"class":79,"line":162},[77,14840,1875],{"class":1644},[77,14842,1662],{"class":104},[77,14844,1944],{"class":1213},[77,14846,14847,14850,14852,14855],{"class":79,"line":174},[77,14848,14849],{"class":1644},"    smoother_plugins",[77,14851,4850],{"class":104},[77,14853,14854],{"class":87},"\"simple_smoother\"",[77,14856,4866],{"class":104},[77,14858,14859,14862],{"class":79,"line":179},[77,14860,14861],{"class":1644},"    simple_smoother",[77,14863,1647],{"class":104},[77,14865,14866,14868,14870],{"class":79,"line":184},[77,14867,12563],{"class":1644},[77,14869,1662],{"class":104},[77,14871,14872],{"class":87},"\"nav2_smoother::SimpleSmoother\"\n",[77,14874,14875,14877,14879],{"class":79,"line":195},[77,14876,12683],{"class":1644},[77,14878,1662],{"class":104},[77,14880,14881],{"class":1213},"1.0e-10\n",[77,14883,14884,14887,14889],{"class":79,"line":1344},[77,14885,14886],{"class":1644},"      do_refinement",[77,14888,1662],{"class":104},[77,14890,9789],{"class":1213},[18,14892,14893],{},[21,14894,14895],{},"3.launch集成",[18,14897,14898,14899,14902],{},"导航实现时，需要依赖于地图与定位功能，我们可以在一个launch文件中集成之前的定位launch以及当前编写的导航核心模块的launch，以简化导航功能的启动，在launch目录下新建一个名为",[74,14900,14901],{},"bringup.launch.py","的launch文件，并输入如下内容：",[68,14904,14906],{"className":1232,"code":14905,"language":1234,"meta":32,"style":32},"import os\n\nfrom ament_index_python.packages import get_package_share_directory\n\nfrom launch import LaunchDescription\nfrom launch.actions import IncludeLaunchDescription, DeclareLaunchArgument\nfrom launch.substitutions import LaunchConfiguration\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\n\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument(\n        'use_sim_time',\n        default_value='false'\n    )\n\n    amcl_pkg = get_package_share_directory(\"mycar_localization\")\n    nav2_pkg = get_package_share_directory(\"mycar_navigation2_jazzy\")\n\n    amcl_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                amcl_pkg,\n                'launch',\n                'mycar_loca.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': LaunchConfiguration('use_sim_time')\n        }.items()\n    )\n\n    nav2_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                nav2_pkg,\n                'launch',\n                'nav2.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': LaunchConfiguration('use_sim_time')\n        }.items()\n    )\n\n    return LaunchDescription([\n        use_sim_time_arg,\n        amcl_launch,\n        nav2_launch\n    ])\n",[74,14907,14908,14914,14918,14928,14932,14942,14953,14963,14973,14977,14981,14989,14993,15001,15007,15015,15019,15023,15037,15050,15054,15063,15067,15071,15076,15082,15087,15091,15095,15103,15113,15117,15121,15125,15134,15138,15142,15147,15153,15158,15162,15166,15174,15184,15188,15192,15196,15202,15206,15211,15216],{"__ignoreMap":32},[77,14909,14910,14912],{"class":79,"line":80},[77,14911,1241],{"class":97},[77,14913,1244],{"class":104},[77,14915,14916],{"class":79,"line":114},[77,14917,140],{"emptyLinePlaceholder":139},[77,14919,14920,14922,14924,14926],{"class":79,"line":136},[77,14921,1253],{"class":97},[77,14923,1304],{"class":104},[77,14925,1241],{"class":97},[77,14927,1309],{"class":104},[77,14929,14930],{"class":79,"line":143},[77,14931,140],{"emptyLinePlaceholder":139},[77,14933,14934,14936,14938,14940],{"class":79,"line":150},[77,14935,1253],{"class":97},[77,14937,1256],{"class":104},[77,14939,1241],{"class":97},[77,14941,1261],{"class":104},[77,14943,14944,14946,14948,14950],{"class":79,"line":162},[77,14945,1253],{"class":97},[77,14947,1268],{"class":104},[77,14949,1241],{"class":97},[77,14951,14952],{"class":104}," IncludeLaunchDescription, DeclareLaunchArgument\n",[77,14954,14955,14957,14959,14961],{"class":79,"line":174},[77,14956,1253],{"class":97},[77,14958,1280],{"class":104},[77,14960,1241],{"class":97},[77,14962,1285],{"class":104},[77,14964,14965,14967,14969,14971],{"class":79,"line":179},[77,14966,1253],{"class":97},[77,14968,6056],{"class":104},[77,14970,1241],{"class":97},[77,14972,6061],{"class":104},[77,14974,14975],{"class":79,"line":184},[77,14976,140],{"emptyLinePlaceholder":139},[77,14978,14979],{"class":79,"line":195},[77,14980,140],{"emptyLinePlaceholder":139},[77,14982,14983,14985,14987],{"class":79,"line":1344},[77,14984,1318],{"class":97},[77,14986,1321],{"class":83},[77,14988,1324],{"class":104},[77,14990,14991],{"class":79,"line":1359},[77,14992,140],{"emptyLinePlaceholder":139},[77,14994,14995,14997,14999],{"class":79,"line":1364},[77,14996,3091],{"class":104},[77,14998,1332],{"class":97},[77,15000,1372],{"class":104},[77,15002,15003,15005],{"class":79,"line":1375},[77,15004,1378],{"class":87},[77,15006,1381],{"class":104},[77,15008,15009,15011,15013],{"class":79,"line":1384},[77,15010,1388],{"class":1387},[77,15012,1332],{"class":97},[77,15014,6118],{"class":87},[77,15016,15017],{"class":79,"line":1398},[77,15018,3244],{"class":104},[77,15020,15021],{"class":79,"line":1411},[77,15022,140],{"emptyLinePlaceholder":139},[77,15024,15025,15028,15030,15032,15035],{"class":79,"line":1421},[77,15026,15027],{"class":104},"    amcl_pkg ",[77,15029,1332],{"class":97},[77,15031,9571],{"class":104},[77,15033,15034],{"class":87},"\"mycar_localization\"",[77,15036,1341],{"class":104},[77,15038,15039,15042,15044,15046,15048],{"class":79,"line":1429},[77,15040,15041],{"class":104},"    nav2_pkg ",[77,15043,1332],{"class":97},[77,15045,9571],{"class":104},[77,15047,9574],{"class":87},[77,15049,1341],{"class":104},[77,15051,15052],{"class":79,"line":1445},[77,15053,140],{"emptyLinePlaceholder":139},[77,15055,15056,15059,15061],{"class":79,"line":1459},[77,15057,15058],{"class":104},"    amcl_launch ",[77,15060,1332],{"class":97},[77,15062,6376],{"class":104},[77,15064,15065],{"class":79,"line":1471},[77,15066,6381],{"class":104},[77,15068,15069],{"class":79,"line":1476},[77,15070,6386],{"class":104},[77,15072,15073],{"class":79,"line":1487},[77,15074,15075],{"class":104},"                amcl_pkg,\n",[77,15077,15078,15080],{"class":79,"line":1498},[77,15079,6401],{"class":87},[77,15081,1381],{"class":104},[77,15083,15084],{"class":79,"line":1504},[77,15085,15086],{"class":87},"                'mycar_loca.launch.py'\n",[77,15088,15089],{"class":79,"line":1515},[77,15090,6413],{"class":104},[77,15092,15093],{"class":79,"line":1521},[77,15094,6418],{"class":104},[77,15096,15097,15099,15101],{"class":79,"line":1534},[77,15098,6423],{"class":1387},[77,15100,1332],{"class":97},[77,15102,6428],{"class":104},[77,15104,15105,15107,15109,15111],{"class":79,"line":1547},[77,15106,6433],{"class":87},[77,15108,3183],{"class":104},[77,15110,1338],{"class":87},[77,15112,1341],{"class":104},[77,15114,15115],{"class":79,"line":1559},[77,15116,6444],{"class":104},[77,15118,15119],{"class":79,"line":1572},[77,15120,3244],{"class":104},[77,15122,15123],{"class":79,"line":1577},[77,15124,140],{"emptyLinePlaceholder":139},[77,15126,15127,15130,15132],{"class":79,"line":1588},[77,15128,15129],{"class":104},"    nav2_launch ",[77,15131,1332],{"class":97},[77,15133,6376],{"class":104},[77,15135,15136],{"class":79,"line":1593},[77,15137,6381],{"class":104},[77,15139,15140],{"class":79,"line":1599},[77,15141,6386],{"class":104},[77,15143,15144],{"class":79,"line":1605},[77,15145,15146],{"class":104},"                nav2_pkg,\n",[77,15148,15149,15151],{"class":79,"line":1611},[77,15150,6401],{"class":87},[77,15152,1381],{"class":104},[77,15154,15155],{"class":79,"line":1616},[77,15156,15157],{"class":87},"                'nav2.launch.py'\n",[77,15159,15160],{"class":79,"line":1999},[77,15161,6413],{"class":104},[77,15163,15164],{"class":79,"line":2010},[77,15165,6418],{"class":104},[77,15167,15168,15170,15172],{"class":79,"line":2023},[77,15169,6423],{"class":1387},[77,15171,1332],{"class":97},[77,15173,6428],{"class":104},[77,15175,15176,15178,15180,15182],{"class":79,"line":2037},[77,15177,6433],{"class":87},[77,15179,3183],{"class":104},[77,15181,1338],{"class":87},[77,15183,1341],{"class":104},[77,15185,15186],{"class":79,"line":2050},[77,15187,6444],{"class":104},[77,15189,15190],{"class":79,"line":2064},[77,15191,3244],{"class":104},[77,15193,15194],{"class":79,"line":2075},[77,15195,140],{"emptyLinePlaceholder":139},[77,15197,15198,15200],{"class":79,"line":2080},[77,15199,1619],{"class":97},[77,15201,3327],{"class":104},[77,15203,15204],{"class":79,"line":2090},[77,15205,3332],{"class":104},[77,15207,15208],{"class":79,"line":2101},[77,15209,15210],{"class":104},"        amcl_launch,\n",[77,15212,15213],{"class":79,"line":2113},[77,15214,15215],{"class":104},"        nav2_launch\n",[77,15217,15218],{"class":79,"line":2118},[77,15219,3352],{"class":104},[18,15221,15222],{},[21,15223,15224],{},"4.编辑配置文件",[18,15226,2268,15227,2272],{},[74,15228,2271],{},[68,15230,15232],{"className":2275,"code":15231,"language":2277,"meta":32,"style":32},"install(DIRECTORY launch params bts\n  DESTINATION share/${PROJECT_NAME}\n)\n",[74,15233,15234,15241,15247],{"__ignoreMap":32},[77,15235,15236,15238],{"class":79,"line":80},[77,15237,2284],{"class":97},[77,15239,15240],{"class":104},"(DIRECTORY launch params bts\n",[77,15242,15243,15245],{"class":79,"line":114},[77,15244,2292],{"class":104},[77,15246,2295],{"class":97},[77,15248,15249],{"class":79,"line":136},[77,15250,1341],{"class":104},[18,15252,15253],{},[21,15254,15255],{},"5.编译",[18,15257,2307],{},[68,15259,15261],{"className":70,"code":15260,"language":72,"meta":32,"style":32},"colcon build --packages-select mycar_navigation2_jazzy\n",[74,15262,15263],{"__ignoreMap":32},[77,15264,15265,15267,15269,15271],{"class":79,"line":80},[77,15266,2317],{"class":83},[77,15268,2320],{"class":87},[77,15270,2323],{"class":1213},[77,15272,15273],{"class":87}," mycar_navigation2_jazzy\n",[18,15275,15276],{},[21,15277,15278],{},"6.执行",[18,15280,3995],{},[68,15282,15283],{"className":70,"code":2339,"language":72,"meta":32,"style":32},[74,15284,15285,15291],{"__ignoreMap":32},[77,15286,15287,15289],{"class":79,"line":80},[77,15288,2346],{"class":1213},[77,15290,2349],{"class":87},[77,15292,15293,15295,15297,15299],{"class":79,"line":114},[77,15294,1201],{"class":83},[77,15296,2356],{"class":87},[77,15298,2359],{"class":87},[77,15300,2362],{"class":87},[18,15302,15303],{},"（2）然后在终端下进入当前工作空间，输入如下指令启动导航功能：",[68,15305,15307],{"className":70,"code":15306,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_navigation2_jazzy bringup.launch.py use_sim_time:=True\n",[74,15308,15309,15315],{"__ignoreMap":32},[77,15310,15311,15313],{"class":79,"line":80},[77,15312,2346],{"class":1213},[77,15314,2349],{"class":87},[77,15316,15317,15319,15321,15323,15326],{"class":79,"line":114},[77,15318,1201],{"class":83},[77,15320,2356],{"class":87},[77,15322,9377],{"class":87},[77,15324,15325],{"class":87}," bringup.launch.py",[77,15327,2392],{"class":87},[18,15329,15330,15331,15334,15335,15338,15339,15342],{},"（3）启动rviz2，加载",[74,15332,15333],{},"/opt/ros/jazzy/share/nav2_bringup/rviz","下的",[74,15336,15337],{},"nav2_default_view.rviz","文件，为机器人设置初始位姿后，再通过菜单栏的",[74,15340,15341],{},"Nav2 Goal","设置目标点，机器人就可以自动导航至目标点了。",[68,15344,15346],{"className":70,"code":15345,"language":72,"meta":32,"style":32},"rviz2 -d /opt/ros/jazzy/share/nav2_bringup/rviz/nav2_default_view.rviz\n",[74,15347,15348],{"__ignoreMap":32},[77,15349,15350,15353,15356],{"class":79,"line":80},[77,15351,15352],{"class":83},"rviz2",[77,15354,15355],{"class":1213}," -d",[77,15357,15358],{"class":87}," /opt/ros/jazzy/share/nav2_bringup/rviz/nav2_default_view.rviz\n",[46,15360,15361,15369,15379],{},[49,15362,15363,15365,15366,15368],{},[74,15364,15352],{},"：启动 ",[74,15367,15352],{}," 工具。",[49,15370,15371,15374,15375,15378],{},[74,15372,15373],{},"-d","：指定要加载的 ",[74,15376,15377],{},".rviz"," 配置文件。",[49,15380,15381,15384,15385,15387],{},[74,15382,15383],{},"/opt/ros/jazzy/share/nav2_bringup/rviz/nav2_default_view.rviz","：",[74,15386,15377],{}," 配置文件的路径。",[18,15389,15390,15391,15393,15394,15378],{},"运行该命令后，",[74,15392,15352],{}," 将启动并加载 ",[74,15395,15337],{},[18,15397,15398],{},"先使用",[18,15400,15401,15404],{},[30,15402],{"alt":32,"src":15403},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1766.webp",[30,15405],{"alt":32,"src":15406},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1767.webp",[18,15408,15409],{},"如上图，左图是选择初始位置，右图是选择目标位置。",[18,15411,15412],{},"上图中，每个障碍物和墙附近的光圈是危险程度，颜色越红表示机器人经过此地越危险。",[18,15414,15415],{},[30,15416],{"alt":32,"src":15417},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1768.webp",[18,15419,15420],{},[30,15421],{"alt":32,"src":15422},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1769.webp",[14,15424,15426],{"id":15425},"自主探索slam","自主探索SLAM",[18,15428,15429,15430,15432,15433,15436],{},"导航需要依赖于地图与定位，例如在上一节 ",[21,15431,9336],{}," 中，导航实现时就是以launch文件的方式集成了 ",[21,15434,15435],{},"定位AMCL"," 一节中的定位功能，而机器人SLAM时，也是发布地图数据与定位信息的，所以导航时也可以不借助于amcl而是直接与SLAM结合，达到自主探索的SLAM效果。",[18,15438,15439],{},[21,15440,15441],{},"1.编写launch文件",[18,15443,15444,15445,14902],{},"在功能包mycar_navigation2_jazzy的launch目录下新建名为",[74,15446,15447],{},"auto_slam.launch.py",[68,15449,15451],{"className":1232,"code":15450,"language":1234,"meta":32,"style":32},"import os\n\nfrom ament_index_python.packages import get_package_share_directory\n\nfrom launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument, IncludeLaunchDescription\nfrom launch.conditions import IfCondition\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\nfrom launch.substitutions import LaunchConfiguration, PythonExpression\n\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument(\n        'use_sim_time',\n        default_value='false'\n    )\n\n    slam_backend_arg = DeclareLaunchArgument(\n        'slam_backend',\n        default_value='cartographer',\n        description='SLAM backend: slam_toolbox or cartographer'\n    )\n\n    use_sim_time = LaunchConfiguration('use_sim_time')\n    slam_backend = LaunchConfiguration('slam_backend')\n\n    slam_toolbox_pkg = get_package_share_directory(\"mycar_slam_slam_toolbox\")\n    cartographer_pkg = get_package_share_directory(\"mycar_slam_cartographer\")\n    nav2_pkg = get_package_share_directory(\"mycar_navigation2_jazzy\")\n\n    slam_toolbox_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                slam_toolbox_pkg,\n                'launch',\n                'online_sync_launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': use_sim_time\n        }.items(),\n        condition=IfCondition(\n            PythonExpression([\"'\", slam_backend, \"' == 'slam_toolbox'\"])\n        )\n    )\n\n    cartographer_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                cartographer_pkg,\n                'launch',\n                'cartographer.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': use_sim_time\n        }.items(),\n        condition=IfCondition(\n            PythonExpression([\"'\", slam_backend, \"' == 'cartographer'\"])\n        )\n    )\n\n    nav2_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                nav2_pkg,\n                'launch',\n                'nav2.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': use_sim_time\n        }.items()\n    )\n\n    ld = LaunchDescription()\n    ld.add_action(use_sim_time_arg)\n    ld.add_action(slam_backend_arg)\n    ld.add_action(slam_toolbox_launch)\n    ld.add_action(cartographer_launch)\n    ld.add_action(nav2_launch)\n    return ld\n",[74,15452,15453,15459,15463,15473,15477,15487,15497,15509,15519,15530,15534,15538,15546,15550,15558,15564,15572,15576,15580,15589,15596,15607,15616,15620,15624,15636,15650,15654,15667,15680,15692,15696,15705,15709,15713,15718,15724,15729,15733,15737,15745,15751,15756,15766,15783,15787,15791,15795,15804,15808,15812,15817,15823,15828,15832,15836,15844,15850,15854,15862,15875,15879,15883,15887,15895,15899,15903,15907,15913,15917,15921,15925,15933,15939,15943,15947,15951,15959,15964,15969,15974,15979,15984],{"__ignoreMap":32},[77,15454,15455,15457],{"class":79,"line":80},[77,15456,1241],{"class":97},[77,15458,1244],{"class":104},[77,15460,15461],{"class":79,"line":114},[77,15462,140],{"emptyLinePlaceholder":139},[77,15464,15465,15467,15469,15471],{"class":79,"line":136},[77,15466,1253],{"class":97},[77,15468,1304],{"class":104},[77,15470,1241],{"class":97},[77,15472,1309],{"class":104},[77,15474,15475],{"class":79,"line":143},[77,15476,140],{"emptyLinePlaceholder":139},[77,15478,15479,15481,15483,15485],{"class":79,"line":150},[77,15480,1253],{"class":97},[77,15482,1256],{"class":104},[77,15484,1241],{"class":97},[77,15486,1261],{"class":104},[77,15488,15489,15491,15493,15495],{"class":79,"line":162},[77,15490,1253],{"class":97},[77,15492,1268],{"class":104},[77,15494,1241],{"class":97},[77,15496,6039],{"class":104},[77,15498,15499,15501,15504,15506],{"class":79,"line":174},[77,15500,1253],{"class":97},[77,15502,15503],{"class":104}," launch.conditions ",[77,15505,1241],{"class":97},[77,15507,15508],{"class":104}," IfCondition\n",[77,15510,15511,15513,15515,15517],{"class":79,"line":179},[77,15512,1253],{"class":97},[77,15514,6056],{"class":104},[77,15516,1241],{"class":97},[77,15518,6061],{"class":104},[77,15520,15521,15523,15525,15527],{"class":79,"line":184},[77,15522,1253],{"class":97},[77,15524,1280],{"class":104},[77,15526,1241],{"class":97},[77,15528,15529],{"class":104}," LaunchConfiguration, PythonExpression\n",[77,15531,15532],{"class":79,"line":195},[77,15533,140],{"emptyLinePlaceholder":139},[77,15535,15536],{"class":79,"line":1344},[77,15537,140],{"emptyLinePlaceholder":139},[77,15539,15540,15542,15544],{"class":79,"line":1359},[77,15541,1318],{"class":97},[77,15543,1321],{"class":83},[77,15545,1324],{"class":104},[77,15547,15548],{"class":79,"line":1364},[77,15549,140],{"emptyLinePlaceholder":139},[77,15551,15552,15554,15556],{"class":79,"line":1375},[77,15553,3091],{"class":104},[77,15555,1332],{"class":97},[77,15557,1372],{"class":104},[77,15559,15560,15562],{"class":79,"line":1384},[77,15561,1378],{"class":87},[77,15563,1381],{"class":104},[77,15565,15566,15568,15570],{"class":79,"line":1398},[77,15567,1388],{"class":1387},[77,15569,1332],{"class":97},[77,15571,6118],{"class":87},[77,15573,15574],{"class":79,"line":1411},[77,15575,3244],{"class":104},[77,15577,15578],{"class":79,"line":1421},[77,15579,140],{"emptyLinePlaceholder":139},[77,15581,15582,15585,15587],{"class":79,"line":1429},[77,15583,15584],{"class":104},"    slam_backend_arg ",[77,15586,1332],{"class":97},[77,15588,1372],{"class":104},[77,15590,15591,15594],{"class":79,"line":1445},[77,15592,15593],{"class":87},"        'slam_backend'",[77,15595,1381],{"class":104},[77,15597,15598,15600,15602,15605],{"class":79,"line":1459},[77,15599,1388],{"class":1387},[77,15601,1332],{"class":97},[77,15603,15604],{"class":87},"'cartographer'",[77,15606,1381],{"class":104},[77,15608,15609,15611,15613],{"class":79,"line":1471},[77,15610,1401],{"class":1387},[77,15612,1332],{"class":97},[77,15614,15615],{"class":87},"'SLAM backend: slam_toolbox or cartographer'\n",[77,15617,15618],{"class":79,"line":1476},[77,15619,3244],{"class":104},[77,15621,15622],{"class":79,"line":1487},[77,15623,140],{"emptyLinePlaceholder":139},[77,15625,15626,15628,15630,15632,15634],{"class":79,"line":1498},[77,15627,1329],{"class":104},[77,15629,1332],{"class":97},[77,15631,1335],{"class":104},[77,15633,1338],{"class":87},[77,15635,1341],{"class":104},[77,15637,15638,15641,15643,15645,15648],{"class":79,"line":1504},[77,15639,15640],{"class":104},"    slam_backend ",[77,15642,1332],{"class":97},[77,15644,1335],{"class":104},[77,15646,15647],{"class":87},"'slam_backend'",[77,15649,1341],{"class":104},[77,15651,15652],{"class":79,"line":1515},[77,15653,140],{"emptyLinePlaceholder":139},[77,15655,15656,15659,15661,15663,15665],{"class":79,"line":1521},[77,15657,15658],{"class":104},"    slam_toolbox_pkg ",[77,15660,1332],{"class":97},[77,15662,9571],{"class":104},[77,15664,1439],{"class":87},[77,15666,1341],{"class":104},[77,15668,15669,15672,15674,15676,15678],{"class":79,"line":1534},[77,15670,15671],{"class":104},"    cartographer_pkg ",[77,15673,1332],{"class":97},[77,15675,9571],{"class":104},[77,15677,3209],{"class":87},[77,15679,1341],{"class":104},[77,15681,15682,15684,15686,15688,15690],{"class":79,"line":1547},[77,15683,15041],{"class":104},[77,15685,1332],{"class":97},[77,15687,9571],{"class":104},[77,15689,9574],{"class":87},[77,15691,1341],{"class":104},[77,15693,15694],{"class":79,"line":1559},[77,15695,140],{"emptyLinePlaceholder":139},[77,15697,15698,15701,15703],{"class":79,"line":1572},[77,15699,15700],{"class":104},"    slam_toolbox_launch ",[77,15702,1332],{"class":97},[77,15704,6376],{"class":104},[77,15706,15707],{"class":79,"line":1577},[77,15708,6381],{"class":104},[77,15710,15711],{"class":79,"line":1588},[77,15712,6386],{"class":104},[77,15714,15715],{"class":79,"line":1593},[77,15716,15717],{"class":104},"                slam_toolbox_pkg,\n",[77,15719,15720,15722],{"class":79,"line":1599},[77,15721,6401],{"class":87},[77,15723,1381],{"class":104},[77,15725,15726],{"class":79,"line":1605},[77,15727,15728],{"class":87},"                'online_sync_launch.py'\n",[77,15730,15731],{"class":79,"line":1611},[77,15732,6413],{"class":104},[77,15734,15735],{"class":79,"line":1616},[77,15736,6418],{"class":104},[77,15738,15739,15741,15743],{"class":79,"line":1999},[77,15740,6423],{"class":1387},[77,15742,1332],{"class":97},[77,15744,6428],{"class":104},[77,15746,15747,15749],{"class":79,"line":2010},[77,15748,6433],{"class":87},[77,15750,9774],{"class":104},[77,15752,15753],{"class":79,"line":2023},[77,15754,15755],{"class":104},"        }.items(),\n",[77,15757,15758,15761,15763],{"class":79,"line":2037},[77,15759,15760],{"class":1387},"        condition",[77,15762,1332],{"class":97},[77,15764,15765],{"class":104},"IfCondition(\n",[77,15767,15768,15771,15774,15777,15780],{"class":79,"line":2050},[77,15769,15770],{"class":104},"            PythonExpression([",[77,15772,15773],{"class":87},"\"'\"",[77,15775,15776],{"class":104},", slam_backend, ",[77,15778,15779],{"class":87},"\"' == 'slam_toolbox'\"",[77,15781,15782],{"class":104},"])\n",[77,15784,15785],{"class":79,"line":2064},[77,15786,9808],{"class":104},[77,15788,15789],{"class":79,"line":2075},[77,15790,3244],{"class":104},[77,15792,15793],{"class":79,"line":2080},[77,15794,140],{"emptyLinePlaceholder":139},[77,15796,15797,15800,15802],{"class":79,"line":2090},[77,15798,15799],{"class":104},"    cartographer_launch ",[77,15801,1332],{"class":97},[77,15803,6376],{"class":104},[77,15805,15806],{"class":79,"line":2101},[77,15807,6381],{"class":104},[77,15809,15810],{"class":79,"line":2113},[77,15811,6386],{"class":104},[77,15813,15814],{"class":79,"line":2118},[77,15815,15816],{"class":104},"                cartographer_pkg,\n",[77,15818,15819,15821],{"class":79,"line":2129},[77,15820,6401],{"class":87},[77,15822,1381],{"class":104},[77,15824,15825],{"class":79,"line":2139},[77,15826,15827],{"class":87},"                'cartographer.launch.py'\n",[77,15829,15830],{"class":79,"line":2150},[77,15831,6413],{"class":104},[77,15833,15834],{"class":79,"line":2155},[77,15835,6418],{"class":104},[77,15837,15838,15840,15842],{"class":79,"line":2169},[77,15839,6423],{"class":1387},[77,15841,1332],{"class":97},[77,15843,6428],{"class":104},[77,15845,15846,15848],{"class":79,"line":2182},[77,15847,6433],{"class":87},[77,15849,9774],{"class":104},[77,15851,15852],{"class":79,"line":2187},[77,15853,15755],{"class":104},[77,15855,15856,15858,15860],{"class":79,"line":2201},[77,15857,15760],{"class":1387},[77,15859,1332],{"class":97},[77,15861,15765],{"class":104},[77,15863,15864,15866,15868,15870,15873],{"class":79,"line":2215},[77,15865,15770],{"class":104},[77,15867,15773],{"class":87},[77,15869,15776],{"class":104},[77,15871,15872],{"class":87},"\"' == 'cartographer'\"",[77,15874,15782],{"class":104},[77,15876,15877],{"class":79,"line":2229},[77,15878,9808],{"class":104},[77,15880,15881],{"class":79,"line":2240},[77,15882,3244],{"class":104},[77,15884,15885],{"class":79,"line":2250},[77,15886,140],{"emptyLinePlaceholder":139},[77,15888,15889,15891,15893],{"class":79,"line":6470},[77,15890,15129],{"class":104},[77,15892,1332],{"class":97},[77,15894,6376],{"class":104},[77,15896,15897],{"class":79,"line":6476},[77,15898,6381],{"class":104},[77,15900,15901],{"class":79,"line":6482},[77,15902,6386],{"class":104},[77,15904,15905],{"class":79,"line":9993},[77,15906,15146],{"class":104},[77,15908,15909,15911],{"class":79,"line":10005},[77,15910,6401],{"class":87},[77,15912,1381],{"class":104},[77,15914,15915],{"class":79,"line":10016},[77,15916,15157],{"class":87},[77,15918,15919],{"class":79,"line":10027},[77,15920,6413],{"class":104},[77,15922,15923],{"class":79,"line":10036},[77,15924,6418],{"class":104},[77,15926,15927,15929,15931],{"class":79,"line":10042},[77,15928,6423],{"class":1387},[77,15930,1332],{"class":97},[77,15932,6428],{"class":104},[77,15934,15935,15937],{"class":79,"line":10051},[77,15936,6433],{"class":87},[77,15938,9774],{"class":104},[77,15940,15941],{"class":79,"line":10056},[77,15942,6444],{"class":104},[77,15944,15945],{"class":79,"line":10066},[77,15946,3244],{"class":104},[77,15948,15949],{"class":79,"line":10082},[77,15950,140],{"emptyLinePlaceholder":139},[77,15952,15953,15955,15957],{"class":79,"line":10087},[77,15954,1580],{"class":104},[77,15956,1332],{"class":97},[77,15958,1585],{"class":104},[77,15960,15961],{"class":79,"line":10092},[77,15962,15963],{"class":104},"    ld.add_action(use_sim_time_arg)\n",[77,15965,15966],{"class":79,"line":10097},[77,15967,15968],{"class":104},"    ld.add_action(slam_backend_arg)\n",[77,15970,15971],{"class":79,"line":10107},[77,15972,15973],{"class":104},"    ld.add_action(slam_toolbox_launch)\n",[77,15975,15976],{"class":79,"line":10119},[77,15977,15978],{"class":104},"    ld.add_action(cartographer_launch)\n",[77,15980,15981],{"class":79,"line":10131},[77,15982,15983],{"class":104},"    ld.add_action(nav2_launch)\n",[77,15985,15986,15988],{"class":79,"line":10142},[77,15987,1619],{"class":97},[77,15989,1622],{"class":104},[18,15991,15992],{},[21,15993,15994],{},"2.编译",[18,15996,2307],{},[68,15998,15999],{"className":70,"code":15260,"language":72,"meta":32,"style":32},[74,16000,16001],{"__ignoreMap":32},[77,16002,16003,16005,16007,16009],{"class":79,"line":80},[77,16004,2317],{"class":83},[77,16006,2320],{"class":87},[77,16008,2323],{"class":1213},[77,16010,15273],{"class":87},[18,16012,16013],{},[21,16014,16015],{},"3.执行",[18,16017,3995],{},[68,16019,16020],{"className":70,"code":2339,"language":72,"meta":32,"style":32},[74,16021,16022,16028],{"__ignoreMap":32},[77,16023,16024,16026],{"class":79,"line":80},[77,16025,2346],{"class":1213},[77,16027,2349],{"class":87},[77,16029,16030,16032,16034,16036],{"class":79,"line":114},[77,16031,1201],{"class":83},[77,16033,2356],{"class":87},[77,16035,2359],{"class":87},[77,16037,2362],{"class":87},[18,16039,16040],{},"（2）然后在终端下进入当前工作空间，输入如下指令启动自主SLAM功能：",[68,16042,16044],{"className":70,"code":16043,"language":72,"meta":32,"style":32},". install/setup.bash\nros2 launch mycar_navigation2_jazzy auto_slam.launch.py use_sim_time:=True slam_backend:=cartographer\n",[74,16045,16046,16052],{"__ignoreMap":32},[77,16047,16048,16050],{"class":79,"line":80},[77,16049,2346],{"class":1213},[77,16051,2349],{"class":87},[77,16053,16054,16056,16058,16060,16063,16066],{"class":79,"line":114},[77,16055,1201],{"class":83},[77,16057,2356],{"class":87},[77,16059,9377],{"class":87},[77,16061,16062],{"class":87}," auto_slam.launch.py",[77,16064,16065],{"class":87}," use_sim_time:=True",[77,16067,16068],{"class":87}," slam_backend:=cartographer\n",[18,16070,15330,16071,15334,16073,16075,16076,16078],{},[74,16072,15333],{},[74,16074,15337],{},"文件，再通过菜单栏的",[74,16077,15341],{},"设置目标点，机器人就可以自动导航至目标点，并且导航中还会实现建图的功能。",[68,16080,16081],{"className":70,"code":15345,"language":72,"meta":32,"style":32},[74,16082,16083],{"__ignoreMap":32},[77,16084,16085,16087,16089],{"class":79,"line":80},[77,16086,15352],{"class":83},[77,16088,15355],{"class":1213},[77,16090,15358],{"class":87},[18,16092,16093],{},[30,16094],{"alt":32,"src":16095},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1770.webp",[18,16097,16098],{},[30,16099],{"alt":32,"src":16100},"https://cdn.tungchiahui.cn/tungwebsite/assets/images/2023/12/30/image1771.webp",[10,16102,16103],{"id":16103},"多车编队",[18,16105,16106],{},"多车编队技术通过先进的传感器、实时数据分析和高度智能化的控制系统，使得一组车辆能够在没有人工干预的情况下实现协同运行，作为一种先进的智能交通系统应用，已经在多个领域展现出其巨大的潜力和广泛的应用场景。比如：",[334,16108,16109,16112,16115],{},[18,16110,16111],{},"时间优化：多车编队技术消除了人为操作中的误差和延误，降低了人力资源成本和运营风险。",[18,16113,16114],{},"空间优化：多车编队技术可以减少车辆间的空隙，最大化道路利用率。",[18,16116,16117],{},"性能优化：密集编队行驶减少了空气动力学阻力，降低了能耗和燃料消耗。",[18,16119,16120],{},"总之，多车编队技术在机器人领域有着独特的作用和价值。本节将介绍如何在ROS2中实现多车编队。",[16122,16123,16124],"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":16126},[16127,16128,16129,16130,16131,16132],{"id":12,"depth":136,"text":12},{"id":293,"depth":136,"text":294},{"id":4063,"depth":136,"text":4063},{"id":5514,"depth":136,"text":5515},{"id":7108,"depth":136,"text":7108},{"id":16103,"depth":136,"text":16103},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben","12.2",12020000,"2023-12-30","wiki/2023-12-30-ros2-tutorial","zh-cn:2023-12-30-ros2-tutorial","/zh-cn/wiki/2023-12-30-ros2-tutorial","Ros2 Tutorial","md","wiki/2023-12-30-ros2-tutorial/ch12-2-Jazzy版本",false,null,"/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben","zh-CN","zh-cn",{},{"title":5,"description":32},"1JoRklhm7CVsbX3CvizKqOKEGDv-w0KKJNFXGEei7As",[16152,16158,16163,16169,16175,16181,16187,16193,16199,16200,16206,16212,16218,16224,16230,16236,16242,16248,16253,16259,16264,16270,16276,16282,16288,16294,16300,16306,16312,16318,16324,16330,16336,16342,16348,16354,16360,16366,16372,16378,16384,16390,16396,16402,16408,16414,16420,16426,16432,16438,16444,16450,16456,16462,16468,16474,16480,16486,16492,16498],{"path":16153,"stem":16154,"title":16155,"date":16136,"chapter":16156,"chapterSort":16157,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch1-ros2-jie-shao","wiki/2023-12-30-ros2-tutorial/ch1-ROS2介绍","ROS2介绍","1",1000000,{"path":16159,"stem":16160,"title":16161,"date":16136,"chapter":2031,"chapterSort":16162,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/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":16164,"stem":16165,"title":16166,"date":16136,"chapter":16167,"chapterSort":16168,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch11-1-gazeboclassic","wiki/2023-12-30-ros2-tutorial/ch11-1-GazeboClassic","Gezebo Classic","11.1",11010000,{"path":16170,"stem":16171,"title":16172,"date":16136,"chapter":16173,"chapterSort":16174,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/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":16176,"stem":16177,"title":16178,"date":16136,"chapter":16179,"chapterSort":16180,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/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":16182,"stem":16183,"title":16184,"date":16136,"chapter":16185,"chapterSort":16186,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/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":16188,"stem":16189,"title":16190,"date":16136,"chapter":16191,"chapterSort":16192,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch11-gezebo-fang-zhen-ping-tai","wiki/2023-12-30-ros2-tutorial/ch11-Gezebo仿真平台","Gezebo仿真平台","11",11000000,{"path":16194,"stem":16195,"title":16196,"date":16136,"chapter":16197,"chapterSort":16198,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch12-1-humble-ban-ben","wiki/2023-12-30-ros2-tutorial/ch12-1-Humble版本","Humble导航仿真","12.1",12010000,{"path":16133,"stem":16142,"title":5,"date":16136,"chapter":16134,"chapterSort":16135,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},{"path":16201,"stem":16202,"title":16203,"date":16136,"chapter":16204,"chapterSort":16205,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch12-3-humble2jazzy","wiki/2023-12-30-ros2-tutorial/ch12-3-Humble2Jazzy","Humble与Jazzy导航的差异","12.3",12030000,{"path":16207,"stem":16208,"title":16209,"date":16136,"chapter":16210,"chapterSort":16211,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch12-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian","wiki/2023-12-30-ros2-tutorial/ch12-机器人导航Navigation2(仿真篇)","机器人导航Navigation2(仿真篇)","12",12000000,{"path":16213,"stem":16214,"title":16215,"date":16136,"chapter":16216,"chapterSort":16217,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch13-1-1-boost-aiso","wiki/2023-12-30-ros2-tutorial/ch13-1-1-Boost.Aiso","Boost.Asio库","13.1.1",13010100,{"path":16219,"stem":16220,"title":16221,"date":16136,"chapter":16222,"chapterSort":16223,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch13-1-2-ros2-serial-driver","wiki/2023-12-30-ros2-tutorial/ch13-1-2-ros2_serial_driver","ROS2 Serial Driver库","13.1.2",13010200,{"path":16225,"stem":16226,"title":16227,"date":16136,"chapter":16228,"chapterSort":16229,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch13-1-chuan-kou-tong-xin","wiki/2023-12-30-ros2-tutorial/ch13-1-串口通信","UART串口通信","13.1",13010000,{"path":16231,"stem":16232,"title":16233,"date":16136,"chapter":16234,"chapterSort":16235,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch13-2-1-socketcan","wiki/2023-12-30-ros2-tutorial/ch13-2-1-socketcan","SocketCAN","13.2.1",13020100,{"path":16237,"stem":16238,"title":16239,"date":16136,"chapter":16240,"chapterSort":16241,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch13-2-2-ros2-socketcan","wiki/2023-12-30-ros2-tutorial/ch13-2-2-ros2_socketcan","ROS2_SocketCAN","13.2.2",13020200,{"path":16243,"stem":16244,"title":16245,"date":16136,"chapter":16246,"chapterSort":16247,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch13-2-can-tong-xin","wiki/2023-12-30-ros2-tutorial/ch13-2-CAN通信","CAN通信","13.2",13020000,{"path":16249,"stem":16250,"title":16215,"date":16136,"chapter":16251,"chapterSort":16252,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch13-3-1-boost-aiso","wiki/2023-12-30-ros2-tutorial/ch13-3-1-Boost.Aiso","13.3.1",13030100,{"path":16254,"stem":16255,"title":16256,"date":16136,"chapter":16257,"chapterSort":16258,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch13-3-tcp-tong-xin","wiki/2023-12-30-ros2-tutorial/ch13-3-TCP通信","TCP通信","13.3",13030000,{"path":16260,"stem":16261,"title":16215,"date":16136,"chapter":16262,"chapterSort":16263,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch13-4-1-boost-aiso","wiki/2023-12-30-ros2-tutorial/ch13-4-1-Boost.Aiso","13.4.1",13040100,{"path":16265,"stem":16266,"title":16267,"date":16136,"chapter":16268,"chapterSort":16269,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch13-4-udp-tong-xin","wiki/2023-12-30-ros2-tutorial/ch13-4-UDP通信","UDP通信","13.4",13040000,{"path":16271,"stem":16272,"title":16273,"date":16136,"chapter":16274,"chapterSort":16275,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch13-linux-ying-jian-tong-xin","wiki/2023-12-30-ros2-tutorial/ch13-Linux硬件通信","Linux硬件通信","13",13000000,{"path":16277,"stem":16278,"title":16279,"date":16136,"chapter":16280,"chapterSort":16281,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-1-ji-qi-ren-zu-cheng","wiki/2023-12-30-ros2-tutorial/ch14-1-机器人组成","机器人组成","14.1",14010000,{"path":16283,"stem":16284,"title":16285,"date":16136,"chapter":16286,"chapterSort":16287,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-2-1-yuan-cheng-kai-fa-ssh","wiki/2023-12-30-ros2-tutorial/ch14-2-1-远程开发SSH","远程开发SSH","14.2.1",14020100,{"path":16289,"stem":16290,"title":16291,"date":16136,"chapter":16292,"chapterSort":16293,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-2-2-yuan-cheng-fang-wen-zhuo-mian","wiki/2023-12-30-ros2-tutorial/ch14-2-2-远程访问桌面","远程访问桌面","14.2.2",14020200,{"path":16295,"stem":16296,"title":16297,"date":16136,"chapter":16298,"chapterSort":16299,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-2-gong-kong-ji-zhi-yuan-cheng-kai-fa-huan-jing","wiki/2023-12-30-ros2-tutorial/ch14-2-工控机之远程开发环境","工控机之远程开发环境","14.2",14020000,{"path":16301,"stem":16302,"title":16303,"date":16136,"chapter":16304,"chapterSort":16305,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-3-gong-kong-ji-zhi-wai-jie-usb-she-bei","wiki/2023-12-30-ros2-tutorial/ch14-3-工控机之外接USB设备","工控机之外接USB设备","14.3",14030000,{"path":16307,"stem":16308,"title":16309,"date":16136,"chapter":16310,"chapterSort":16311,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-4-fen-bu-shi-da-jian","wiki/2023-12-30-ros2-tutorial/ch14-4-分布式搭建","分布式搭建","14.4",14040000,{"path":16313,"stem":16314,"title":16315,"date":16136,"chapter":16316,"chapterSort":16317,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-5-you-hua-ri-zhi","wiki/2023-12-30-ros2-tutorial/ch14-5-优化日志","优化日志","14.5",14050000,{"path":16319,"stem":16320,"title":16321,"date":16136,"chapter":16322,"chapterSort":16323,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-6-1-li-cheng-ji-odom","wiki/2023-12-30-ros2-tutorial/ch14-6-1-里程计Odom","里程计Odom","14.6.1",14060100,{"path":16325,"stem":16326,"title":16327,"date":16136,"chapter":16328,"chapterSort":16329,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-6-2-guan-xing-ji-imu","wiki/2023-12-30-ros2-tutorial/ch14-6-2-惯性计IMU","惯性计IMU","14.6.2",14060200,{"path":16331,"stem":16332,"title":16333,"date":16136,"chapter":16334,"chapterSort":16335,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-6-3-ji-guang-lei-da-lidar","wiki/2023-12-30-ros2-tutorial/ch14-6-3-激光雷达LiDAR","激光雷达LiDAR","14.6.3",14060300,{"path":16337,"stem":16338,"title":16339,"date":16136,"chapter":16340,"chapterSort":16341,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-6-4-xiang-ji-camera","wiki/2023-12-30-ros2-tutorial/ch14-6-4-相机Camera","相机Camera","14.6.4",14060400,{"path":16343,"stem":16344,"title":16345,"date":16136,"chapter":16346,"chapterSort":16347,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-6-5-quan-qiu-ding-wei-gnss","wiki/2023-12-30-ros2-tutorial/ch14-6-5-全球定位GNSS","全球定位GNSS","14.6.5",14060500,{"path":16349,"stem":16350,"title":16351,"date":16136,"chapter":16352,"chapterSort":16353,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-6-6-shou-bing-joy","wiki/2023-12-30-ros2-tutorial/ch14-6-6-手柄joy","手柄JOY","14.6.6",14060600,{"path":16355,"stem":16356,"title":16357,"date":16136,"chapter":16358,"chapterSort":16359,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-6-7-jian-pan-kong-zhi-jie-dian","wiki/2023-12-30-ros2-tutorial/ch14-6-7-键盘控制节点","键盘控制节点","14.6.7",14060700,{"path":16361,"stem":16362,"title":16363,"date":16136,"chapter":16364,"chapterSort":16365,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-6-ying-jian-ping-tai","wiki/2023-12-30-ros2-tutorial/ch14-6-硬件平台","硬件平台","14.6",14060000,{"path":16367,"stem":16368,"title":16369,"date":16136,"chapter":16370,"chapterSort":16371,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-7-zuo-biao-xi-yu-hua-ti-guan-xi","wiki/2023-12-30-ros2-tutorial/ch14-7-坐标系与话题关系","坐标系与话题关系","14.7",14070000,{"path":16373,"stem":16374,"title":16375,"date":16136,"chapter":16376,"chapterSort":16377,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-8-1-1-lun-shi-li-cheng-ji-biao-ding","wiki/2023-12-30-ros2-tutorial/ch14-8-1-1-轮式里程计标定","轮式里程计标定","14.8.1.1",14080101,{"path":16379,"stem":16380,"title":16381,"date":16136,"chapter":16382,"chapterSort":16383,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-8-1-2-lun-shi-li-cheng-ji-yu-imu-rong-he","wiki/2023-12-30-ros2-tutorial/ch14-8-1-2-轮式里程计与IMU融合","轮式里程计与IMU融合","14.8.1.2",14080102,{"path":16385,"stem":16386,"title":16387,"date":16136,"chapter":16388,"chapterSort":16389,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-8-1-lun-shi-li-cheng-ji-biao-ding-yu-rong-he","wiki/2023-12-30-ros2-tutorial/ch14-8-1-轮式里程计标定与融合","轮式里程计标定与融合","14.8.1",14080100,{"path":16391,"stem":16392,"title":16393,"date":16136,"chapter":16394,"chapterSort":16395,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-8-2-ji-guang-lei-da-gong-ju","wiki/2023-12-30-ros2-tutorial/ch14-8-2-激光雷达工具","激光雷达工具","14.8.2",14080200,{"path":16397,"stem":16398,"title":16399,"date":16136,"chapter":16400,"chapterSort":16401,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-8-3-xiang-ji-shi-yong-jin-jie","wiki/2023-12-30-ros2-tutorial/ch14-8-3-相机使用进阶","相机使用进阶","14.8.3",14080300,{"path":16403,"stem":16404,"title":16405,"date":16136,"chapter":16406,"chapterSort":16407,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-8-ying-jian-ping-tai-jin-jie","wiki/2023-12-30-ros2-tutorial/ch14-8-硬件平台进阶","硬件平台进阶","14.8",14080000,{"path":16409,"stem":16410,"title":16411,"date":16136,"chapter":16412,"chapterSort":16413,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch14-ji-qi-ren-ying-jian","wiki/2023-12-30-ros2-tutorial/ch14-机器人硬件","机器人硬件","14",14000000,{"path":16415,"stem":16416,"title":16417,"date":16136,"chapter":16418,"chapterSort":16419,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch15-ros2-control","wiki/2023-12-30-ros2-tutorial/ch15-ROS2_Control","ROS2_Control","15",15000000,{"path":16421,"stem":16422,"title":16423,"date":16136,"chapter":16424,"chapterSort":16425,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/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":16427,"stem":16428,"title":16429,"date":16136,"chapter":16430,"chapterSort":16431,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/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":16433,"stem":16434,"title":16435,"date":16136,"chapter":16436,"chapterSort":16437,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch18-microros","wiki/2023-12-30-ros2-tutorial/ch18-MicroROS","MicroROS","18",18000000,{"path":16439,"stem":16440,"title":16441,"date":16136,"chapter":16442,"chapterSort":16443,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch19-webots-fang-zhen-ping-tai","wiki/2023-12-30-ros2-tutorial/ch19-Webots仿真平台","Webots仿真平台","19",19000000,{"path":16445,"stem":16446,"title":16447,"date":16136,"chapter":16448,"chapterSort":16449,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch2-ru-men-cao-zuo","wiki/2023-12-30-ros2-tutorial/ch2-入门操作","入门操作","2",2000000,{"path":16451,"stem":16452,"title":16453,"date":16136,"chapter":16454,"chapterSort":16455,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch20-opencv","wiki/2023-12-30-ros2-tutorial/ch20-OpenCV","OpenCV","20",20000000,{"path":16457,"stem":16458,"title":16459,"date":16136,"chapter":16460,"chapterSort":16461,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/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":16463,"stem":16464,"title":16465,"date":16136,"chapter":16466,"chapterSort":16467,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch4-si-da-tong-xin","wiki/2023-12-30-ros2-tutorial/ch4-四大通信","四大通信","4",4000000,{"path":16469,"stem":16470,"title":16471,"date":16136,"chapter":16472,"chapterSort":16473,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/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":16475,"stem":16476,"title":16477,"date":16136,"chapter":16478,"chapterSort":16479,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch6-launch","wiki/2023-12-30-ros2-tutorial/ch6-Launch","Launch","6",6000000,{"path":16481,"stem":16482,"title":16483,"date":16136,"chapter":16484,"chapterSort":16485,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch7-hui-su-rosbag2","wiki/2023-12-30-ros2-tutorial/ch7-回溯rosbag2","回溯rosbag2","7",7000000,{"path":16487,"stem":16488,"title":16489,"date":16136,"chapter":16490,"chapterSort":16491,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/wiki/2023-12-30-ros2-tutorial/ch8-zuo-biao-bian-huan-tf","wiki/2023-12-30-ros2-tutorial/ch8-坐标变换TF","坐标变换TF","8",8000000,{"path":16493,"stem":16494,"title":16495,"date":16136,"chapter":16496,"chapterSort":16497,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":16143},"/zh-cn/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":16139,"stem":16499,"title":16500,"date":16136,"chapter":16144,"chapterSort":16501,"docKey":16138,"docRoot":16139,"docTitle":16140,"isWikiDoc":139,"isWikiIndex":139},"wiki/2023-12-30-ros2-tutorial/index","ROS2机器人操作系统教程",0,{"variants":16503},[16504,16507,16510,16513,16516],{"path":16505,"localeSlug":16506,"i18nKey":16142},"/en-us/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben","en-us",{"path":16508,"localeSlug":16509,"i18nKey":16142},"/zh-hant/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben","zh-hant",{"path":16511,"localeSlug":16512,"i18nKey":16142},"/zh-hk/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben","zh-hk",{"path":16514,"localeSlug":16515,"i18nKey":16142},"/zh-tw/wiki/2023-12-30-ros2-tutorial/ch12-2-jazzy-ban-ben","zh-tw",{"path":16133,"localeSlug":16147,"i18nKey":16142},[16505,16145,16508,16145,16511,16145,16514,16145,16133,16145],1780663046149]