[{"data":1,"prerenderedAt":16568},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-jazzy-ban-ben":3,"wiki-doc-items-2023-12-30-ros2-tutorial":16147,"wiki:author-members":16556},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":82,"chapterOrder":16135,"date":16136,"description":34,"docKey":16137,"docRoot":16138,"docTitle":16139,"extension":16140,"isWikiDoc":141,"isWikiIndex":16141,"meta":16142,"navigation":141,"path":16143,"seo":16144,"stem":16145,"wikiDepth":82,"__hash__":16146},"wiki\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-Jazzy版本.md","Jazzy导航仿真",[7],"董佳辉",{"type":9,"value":10,"toc":16127},"minimark",[11,15,19,26,29,36,39,44,47,60,63,66,69,206,213,216,219,224,256,259,279,282,285,293,297,301,304,307,310,325,328,332,335,350,353,356,358,365,368,394,397,423,426,435,496,500,503,506,524,527,532,578,581,662,667,703,708,821,831,1183,1186,1191,1194,1220,1225,1232,1625,1635,2260,2263,2268,2275,2302,2307,2310,2329,2415,2420,2423,2428,2431,2434,2437,2440,2443,2446,2451,2454,2459,2472,2475,2479,2482,2486,2517,2519,2551,2554,2557,2659,2664,2667,2678,2703,2706,2711,2744,2749,2784,2789,2869,2874,2879,2884,2907,2912,2935,2940,2963,2968,2973,2976,2980,2982,3003,3007,3012,3355,3358,3939,3941,3945,3949,3969,3973,3975,3991,3995,3998,4018,4021,4045,4048,4053,4058,4063,4066,4073,4095,4099,4103,4112,4116,4140,4144,4170,4174,4186,4224,4227,4231,4234,4239,4242,4266,4280,4285,4290,4293,4296,4309,4313,4320,4510,4514,4519,4804,4807,4813,4899,4904,4941,4945,4948,4955,4959,4982,4986,5006,5009,5013,5016,5037,5040,5057,5062,5067,5073,5093,5098,5101,5126,5132,5166,5176,5181,5191,5454,5465,5481,5486,5492,5499,5504,5509,5514,5518,5521,5527,5530,5533,5539,5544,5598,5603,5647,5652,5687,5692,5697,5758,5763,5814,5819,5857,5862,5891,5896,5951,5954,5959,5961,5985,5990,5996,6487,6508,6513,6898,6904,6909,6913,6933,6938,6940,6956,6961,6963,6983,6985,7009,7012,7029,7035,7042,7045,7051,7056,7074,7079,7084,7089,7092,7097,7100,7105,7108,7111,7114,7121,7126,7129,7135,7141,7146,7151,7154,7160,7163,7178,7182,7247,7250,7263,7269,7275,7278,7284,7287,7293,7297,7340,7345,7371,7375,7436,7439,7453,7458,7483,7488,7559,7564,7607,7612,7669,7674,8026,8029,8046,8051,8085,8090,8169,8174,8243,8248,8281,8286,8361,8366,8527,8530,8540,8544,8608,8612,8636,8641,8711,8715,8828,8831,8849,8854,8879,8884,8907,8912,8966,8969,8979,8983,9015,9019,9043,9047,9073,9077,9169,9172,9182,9186,9209,9213,9236,9240,9336,9339,9358,9362,9364,9388,9392,9395,9401,10966,10969,10974,10977,10984,11729,11735,12434,12440,12609,12614,12619,13184,13189,13194,14192,14195,14206,14212,14215,14230,14235,14240,14496,14501,14506,14594,14599,14604,14786,14791,14796,14893,14898,14905,15222,15227,15231,15253,15258,15260,15276,15281,15283,15303,15306,15330,15345,15361,15390,15398,15401,15409,15412,15415,15420,15425,15429,15439,15444,15450,15992,15997,15999,16013,16018,16020,16040,16043,16071,16081,16093,16098,16103,16106,16109,16120,16123],[12,13,14],"h3",{"id":14},"导航概述",[16,17,18],"h4",{"id":18},"导航简述",[20,21,22],"p",{},[23,24,25],"strong",{},"概念",[20,27,28],{},"机器人导航是指在没有人为干预的情况下，机器人可以自主地从一个位置移动到另一个位置。在ROS2中，导航实现最为常用的框架是Nav2。",[20,30,31],{},[32,33],"img",{"alt":34,"src":35},"","https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1745.webp",[20,37,38],{},"Nav2也即Navigation2，它继承自ROS的导航堆栈。它采用了与自动驾驶车辆相同的前沿技术，并经过优化和改造，专门适用于移动机器人和地面机器人的导航需求。这个项目赋予移动机器人穿越复杂环境的能力，使其能够完成用户定义的各种应用任务，几乎适用于任何类型的机器人动力学。Nav2不仅支持机器人从A点到B点的移动，还能设置中间姿态，并执行多种任务，如物体跟踪、全面覆盖导航等。作为全球100多家公司信赖的生产级高质量导航框架，Nav2以其卓越的可靠性和稳定性赢得了广泛赞誉。",[20,40,41],{},[23,42,43],{},"作用",[20,45,46],{},"Nav2在机器人导航领域作用显著，主要表现在以下几个方面。",[48,49,50,54,57],"ul",{},[51,52,53],"li",{},"Nav2具备多样的导航功能，支持激光雷达、摄像头等多种传感器输入，实时获取环境信息，实现智能路径规划和精确运动控制。它支持多种导航模式，满足不同应用需求，并具备强大的扩展性，可与ROS 2组件无缝集成。",[51,55,56],{},"Nav2性能卓越，采用高效算法和数据处理技术，确保机器人在导航过程中响应迅速且稳定。",[51,58,59],{},"安全方面，Nav2采用多种避障算法和参数调节功能，设定安全区域，提供诊断监控，确保机器人安全导航。",[20,61,62],{},"总之，Nav2为机器人的导航和应用提供了强大的支持。无论是工业领域的自动化生产，还是服务领域的智能机器人，Nav2都能够发挥重要作用，提升机器人的自主性和智能化水平。",[16,64,65],{"id":65},"导航安装",[20,67,68],{},"借助于Ubuntu的包资源管理器，可以使用二进制的方式安装Nav2，安装指令如下：",[70,71,75],"pre",{"className":72,"code":73,"language":74,"meta":34,"style":34},"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",[76,77,78,114,136,143,150,162,174,179,184,195],"code",{"__ignoreMap":34},[79,80,83,87,91,94,97,101,104,108,111],"span",{"class":81,"line":82},"line",1,[79,84,86],{"class":85},"sScJk","sudo",[79,88,90],{"class":89},"sZZnC"," apt",[79,92,93],{"class":89}," install",[79,95,96],{"class":89}," ros-",[79,98,100],{"class":99},"szBVR","\u003C",[79,102,103],{"class":89},"ros2-distr",[79,105,107],{"class":106},"sVt8B","o",[79,109,110],{"class":99},">",[79,112,113],{"class":89},"-navigation2\n",[79,115,117,119,121,123,125,127,129,131,133],{"class":81,"line":116},2,[79,118,86],{"class":85},[79,120,90],{"class":89},[79,122,93],{"class":89},[79,124,96],{"class":89},[79,126,100],{"class":99},[79,128,103],{"class":89},[79,130,107],{"class":106},[79,132,110],{"class":99},[79,134,135],{"class":89},"-nav2-bringup\n",[79,137,139],{"class":81,"line":138},3,[79,140,142],{"emptyLinePlaceholder":141},true,"\n",[79,144,146],{"class":81,"line":145},4,[79,147,149],{"class":148},"sJ8bj","# Jazzy\n",[79,151,153,155,157,159],{"class":81,"line":152},5,[79,154,86],{"class":85},[79,156,90],{"class":89},[79,158,93],{"class":89},[79,160,161],{"class":89}," ros-jazzy-navigation2\n",[79,163,165,167,169,171],{"class":81,"line":164},6,[79,166,86],{"class":85},[79,168,90],{"class":89},[79,170,93],{"class":89},[79,172,173],{"class":89}," ros-jazzy-nav2-bringup\n",[79,175,177],{"class":81,"line":176},7,[79,178,142],{"emptyLinePlaceholder":141},[79,180,182],{"class":81,"line":181},8,[79,183,149],{"class":148},[79,185,187,189,191,193],{"class":81,"line":186},9,[79,188,86],{"class":85},[79,190,90],{"class":89},[79,192,93],{"class":89},[79,194,161],{"class":89},[79,196,198,200,202,204],{"class":81,"line":197},10,[79,199,86],{"class":85},[79,201,90],{"class":89},[79,203,93],{"class":89},[79,205,173],{"class":89},[20,207,208,209,212],{},"指令中的",[76,210,211],{},"\u003Cros2-distro>","请替换成当前所使用的ROS2版本。",[16,214,215],{"id":215},"导航条件",[20,217,218],{},"深入学习Nav2，需了解ROS2机器人基础知识，并配备仿真或实体机器人作为实践环境。",[20,220,221],{},[23,222,223],{},"ROS2基础",[48,225,226,232,238,244,250],{},[51,227,228,231],{},[23,229,230],{},"ROS2通信"," ：了解ROS2中的节点（Nodes）、话题（Topics）、服务（Services）、动作（Actions）等基本概念，以及如何通过这些机制实现节点间的通信。",[51,233,234,237],{},[23,235,236],{},"生命周期管理"," ：熟悉ROS2中的生命周期节点（Lifecycle Nodes），理解节点的启动、配置、激活、去激活、清理等状态转换过程，这对于管理复杂的ROS2系统至关重要。",[51,239,240,243],{},[23,241,242],{},"rviz2："," 熟练使用rviz2进行可视化调试，包括如何设置不同的显示类型（如点云、地图、路径等），以及如何通过rviz2与ROS2节点进行交互（如设置导航目标点、观察机器人状态等）。",[51,245,246,249],{},[23,247,248],{},"URDF："," 了解URDF（Unified Robot Description Format）文件，这是ROS中用于描述机器人模型的一种XML格式。熟悉如何编写和修改URDF文件，以便在仿真或实际环境中准确地表示机器人结构。",[51,251,252,255],{},[23,253,254],{},"TF坐标变换："," 掌握TF（Transform）库的使用，理解坐标变换在机器人导航中的重要性。学会如何设置和查询不同坐标系之间的变换关系，以确保机器人能够准确地定位自身和周围环境。",[20,257,258],{},"实践环境",[48,260,261,267,273],{},[51,262,263,266],{},[23,264,265],{},"仿真环境："," 搭建一个ROS2兼容的仿真环境，并配置好相应的机器人模型、传感器（如激光雷达、相机等）和仿真世界。确保仿真环境中的机器人能够接收速度指令、反馈里程计消息、发布传感器数据和TF坐标变换等。",[51,268,269,272],{},[23,270,271],{},"实体机器人："," 如果条件允许，准备一台实体机器人。这台机器人应该具备与仿真环境中相似的功能，即能够接收速度指令、反馈里程计消息、发布激光雷达等传感器数据以及发布TF坐标变换。同时，确保实体机器人已经安装了ROS2系统，并且已经配置好相应的驱动程序和算法库。",[51,274,275,278],{},[23,276,277],{},"Nav2软件包："," 安装并配置好Nav2软件包及其依赖项。Nav2是ROS2中用于机器人导航的综合性软件包，它包含了路径规划、避障、局部和全局地图维护等多个功能模块。确保Nav2软件包与您的ROS2版本兼容，并且已经根据需要进行了适当的配置。",[20,280,281],{},"通过掌握上述基础知识并准备好实践环境，您将能够更好地学习和应用Nav2进行机器人导航任务的开发与调试。",[16,283,284],{"id":284},"导航参数参考",[20,286,287],{},[288,289,290],"a",{"href":290,"rel":291},"https:\u002F\u002Fdocs.nav2.org\u002Fconfiguration\u002Findex.html",[292],"nofollow",[12,294,296],{"id":295},"slam-定位与建图","SLAM 定位与建图",[20,298,299],{},[23,300,25],{},[20,302,303],{},"SLAM（Simultaneous Localization and Mapping，即时定位与建图）是机器人学和自动导航领域的一种关键技术，允许机器人在未知环境中绘制环境地图。",[20,305,306],{},"在ROS 2下进行SLAM，通常涉及使用专门为ROS 2开发的SLAM相关软件包。这些软件包利用ROS 2的通讯框架（如话题、服务和action）来处理接收到的传感器数据，包括激光雷达、相机、惯性测量单元等。",[20,308,309],{},"以下列举了一些常见的在ROS2中使用的SLAM系统：",[311,312,313,319],"ol",{},[51,314,315,318],{},[23,316,317],{},"SLAM Toolbox"," ：SLAM Toolbox 是一种在 ROS 2 中普遍使用的 SLAM 解决方案，由 Steve Macenski 维护。它是为了替代原有的ROS中著名的gmapping包和Cartographer SLAM包而开发的，提供了2D激光SLAM领域中的多种功能。",[51,320,321,324],{},[23,322,323],{},"Cartographer for ROS 2"," ：Cartographer是由Google开发的一个2D和3D环境SLAM库。尽管它最初是为ROS开发的，但已经有为ROS 2创建的适配版本，可以在ROS 2生态系统内使用。",[20,326,327],{},"要在ROS 2中开始一个SLAM项目，还需要具体的传感器（例如激光雷达或摄像头），计算机要有足够的算力来运行SLAM算法，以及熟悉ROS 2节点、话题、服务、action、参数等知识，以实现有效的数据处理和通信。随着项目的发展，可能还需要考虑动态重配置、3D建图和路径规划等高级功能。",[20,329,330],{},[23,331,43],{},[20,333,334],{},"必须先说明的是：SLAM与Nav2并没有直接的依赖关系，它们是两种相对独立的技术框架。然而，在实际应用中，这两者却展现出紧密的联系与互补性。",[336,337,338,344],"blockquote",{},[20,339,340,343],{},[23,341,342],{},"独立性："," SLAM能够独立完成环境地图的构建，无需Nav2的介入。它依靠传感器数据来感知环境，并通过算法估计机器人的位置与姿态，从而构建出环境的地图。与此同时，Nav2也具备自主导航的能力。即使没有SLAM地图作为输入，它也能依赖其他来源的环境信息进行导航。",[20,345,346,349],{},[23,347,348],{},"互补性："," 尽管两者在技术上各自独立，但它们的结合却带来了显著的优势。Nav2能够利用SLAM创建的精确地图进行高效的路径规划，确保机器人能够顺利导航至目标位置。而SLAM则能借助Nav2的导航控制功能，在机器人移动过程中实时收集环境信息，从而进一步提高地图构建的效率和准确性。",[20,351,352],{},"因此，尽管SLAM与Nav2在技术上各自独立，但在构建完整的机器人导航系统中，它们的互补性使得机器人能够在复杂环境中实现更加自主、精准的建图或导航。",[16,354,355],{"id":355},"slam_toolbox概述",[20,357,25],{},[20,359,360,361,364],{},"SLAM Toolbox是一个基于开源软件的用来构建 ",[23,362,363],{},"2D地图"," 的工具集，旨在为研究人员和开发者提供一个快速构建和实现SLAM算法的平台。它集成了多种常用的SLAM算法，并提供了丰富的数据处理和滤波函数，以及地图构建和环境建模的工具。",[20,366,367],{},"功能",[48,369,370,376,382,388],{},[51,371,372,375],{},[23,373,374],{},"算法集成"," 包含基于卡尔曼滤波器和粒子滤波器的SLAM算法，以及基于图优化的SLAM算法等。",[51,377,378,381],{},[23,379,380],{},"数据处理"," 提供数据融合、数据预处理和异常检测等功能，支持激光雷达、摄像头、IMU等多种传感器数据的处理。",[51,383,384,387],{},[23,385,386],{},"地图构建"," 利用传感器数据和机器人运动信息构建准确的地图，并进行更新和优化。",[51,389,390,393],{},[23,391,392],{},"模块化设计"," 支持用户插入自己的算法或替换现有模块，实现高度定制化的SLAM解决方案。",[20,395,396],{},"优点",[48,398,399,405,411,417],{},[51,400,401,404],{},[23,402,403],{},"开源性和灵活性"," 作为开源软件，SLAM Toolbox提供了源代码和文档，用户可以自由修改和扩展算法。",[51,406,407,410],{},[23,408,409],{},"多种传感器支持"," 支持激光雷达、摄像头、IMU等多种传感器数据，适应不同应用场景的需求。",[51,412,413,416],{},[23,414,415],{},"高效性"," 利用现代C++的特性优化性能，确保在资源受限的硬件上也能高效运行。",[51,418,419,422],{},[23,420,421],{},"广泛的应用前景"," 适用于学术研究、无人机导航、自动驾驶汽车、室内机器人和工业自动化等多个领域。",[16,424,425],{"id":425},"slam_toolbox安装",[20,427,428,429,434],{},"借助于Advanced Packaging Tools(",[288,430,433],{"href":431,"rel":432},"https:\u002F\u002Fc6.y.qq.com\u002Fbase\u002Ffcgi-bin\u002Fu?__=bqEbdGxIB7mM",[292],"APT",")包资源管理器，可以使用二进制的方式安装slam_toolbox，安装指令如下：",[70,436,438],{"className":72,"code":437,"language":74,"meta":34,"style":34},"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",[76,439,440,461,465,470,481,486],{"__ignoreMap":34},[79,441,442,444,446,448,450,452,454,456,458],{"class":81,"line":82},[79,443,86],{"class":85},[79,445,90],{"class":89},[79,447,93],{"class":89},[79,449,96],{"class":89},[79,451,100],{"class":99},[79,453,103],{"class":89},[79,455,107],{"class":106},[79,457,110],{"class":99},[79,459,460],{"class":89},"-slam-toolbox\n",[79,462,463],{"class":81,"line":116},[79,464,142],{"emptyLinePlaceholder":141},[79,466,467],{"class":81,"line":138},[79,468,469],{"class":148},"#humble\n",[79,471,472,474,476,478],{"class":81,"line":145},[79,473,86],{"class":85},[79,475,90],{"class":89},[79,477,93],{"class":89},[79,479,480],{"class":89}," ros-jazzy-slam-toolbox\n",[79,482,483],{"class":81,"line":152},[79,484,485],{"class":148},"#jazzy\n",[79,487,488,490,492,494],{"class":81,"line":164},[79,489,86],{"class":85},[79,491,90],{"class":89},[79,493,93],{"class":89},[79,495,480],{"class":89},[20,497,208,498,212],{},[76,499,211],{},[16,501,502],{"id":502},"slam_toolbox节点说明",[20,504,505],{},"在slam_toolbox中常用的节点有两个：sync_slam_toolbox_node和async_slam_toolbox_node。",[336,507,508,513,516,521],{},[20,509,510],{},[23,511,512],{},"sync_slam_toolbox_node：",[20,514,515],{},"这是一个同步节点，会等待所有传感器数据到达后再处理，确保数据完整性和一致性，提高定位和建图准确性。但同步处理可能导致延迟，更适合对数据一致性和准确性要求高、实时性要求不高的场景。",[20,517,518],{},[23,519,520],{},"async_slam_toolbox_node：",[20,522,523],{},"与同步节点不同，这是一个异步节点，可以立即处理已接收的数据，减小延迟，提高响应速度。但异步处理可能导致数据不完全同步，定位和建图结果可能不如同步方式准确。因此，它更适合对实时性要求高、对数据一致性和准确性要求相对较低的场景。",[20,525,526],{},"在选择使用sync_slam_toolbox_node还是async_slam_toolbox_node时，需根据应用需求和环境权衡。若实时性关键且能接受一定定位或建图误差，选择async_slam_toolbox_node。若对数据一致性和准确性要求较高，且实时性非首要考虑，则选择sync_slam_toolbox_node。另外二者的主要区别在于数据处理的方式，而两个节点发布的话题、订阅的话题、发布的服务以及使用的参数等都是一样的。",[311,528,529],{},[51,530,531],{},"订阅的话题",[533,534,535,552],"table",{},[536,537,538],"thead",{},[539,540,541,546,549],"tr",{},[542,543,545],"th",{"align":544},"left","话题",[542,547,548],{"align":544},"类型",[542,550,551],{"align":544},"描述",[553,554,555,567],"tbody",{},[539,556,557,561,564],{},[558,559,560],"td",{"align":544},"\u002Fscan",[558,562,563],{"align":544},"sensor_msgs\u002Fmsg\u002FLaserScan",[558,565,566],{"align":544},"来自激光雷达输入的扫描数据",[539,568,569,572,575],{},[558,570,571],{"align":544},"\u002Ftf",[558,573,574],{"align":544},"tf2_msgs\u002Fmsg\u002FTFMessage",[558,576,577],{"align":544},"配置的odom_frame到base_frame的转换",[20,579,580],{},"虽然不订阅\u002Fodom,但是需要发布\u002Fodom,以改变坐标。",[533,582,583,596],{},[536,584,585],{},[539,586,587,590,593],{},[542,588,589],{"align":544},"特性",[542,591,592],{"align":544},"slam_toolbox",[542,594,595],{"align":544},"hector_slam",[553,597,598,609,620,631,642,651],{},[539,599,600,603,606],{},[558,601,602],{"align":544},"地图精度",[558,604,605],{"align":544},"高",[558,607,608],{"align":544},"中",[539,610,611,614,617],{},[558,612,613],{"align":544},"实时性",[558,615,616],{"align":544},"较好，但依赖优化（回环检测）",[558,618,619],{"align":544},"极高",[539,621,622,625,628],{},[558,623,624],{"align":544},"依赖数据",[558,626,627],{"align":544},"激光雷达、TF 树、里程计",[558,629,630],{"align":544},"激光雷达（可选 IMU）",[539,632,633,636,639],{},[558,634,635],{"align":544},"回环检测",[558,637,638],{"align":544},"支持",[558,640,641],{"align":544},"不支持",[539,643,644,647,649],{},[558,645,646],{"align":544},"长期运行",[558,648,638],{"align":544},[558,650,641],{"align":544},[539,652,653,656,659],{},[558,654,655],{"align":544},"适用场景",[558,657,658],{"align":544},"动态导航、复杂环境",[558,660,661],{"align":544},"简单环境，或无里程计时",[311,663,664],{"start":116},[51,665,666],{},"发布的话题",[533,668,669,679],{},[536,670,671],{},[539,672,673,675,677],{},[542,674,545],{"align":544},[542,676,548],{"align":544},[542,678,551],{"align":544},[553,680,681,692],{},[539,682,683,686,689],{},[558,684,685],{"align":544},"\u002Fmap",[558,687,688],{"align":544},"nav_msgs\u002Fmsg\u002FOccupancyGrid",[558,690,691],{"align":544},"pose-graph（姿态图）在特定的更新频率（map_update_interval）下的占用栅格表示。",[539,693,694,697,700],{},[558,695,696],{"align":544},"\u002Fpose",[558,698,699],{"align":544},"geometry_msgs\u002Fmsg\u002FPoseWithCovarianceStamped",[558,701,702],{"align":544},"配置的map_frame中base_frame的位姿以及根据扫描匹配计算的协方差",[311,704,705],{"start":138},[51,706,707],{},"发布的服务",[533,709,710,720],{},[536,711,712],{},[539,713,714,716,718],{},[542,715,545],{"align":544},[542,717,548],{"align":544},[542,719,551],{"align":544},[553,721,722,733,744,755,766,777,788,799,810],{},[539,723,724,727,730],{},[558,725,726],{"align":544},"\u002Fslam_toolbox\u002Fclear_changes",[558,728,729],{"align":544},"slam_toolbox\u002Fsrv\u002FClear",[558,731,732],{"align":544},"清除所有待处理的手动位姿图操作的更改",[539,734,735,738,741],{},[558,736,737],{"align":544},"\u002Fslam_toolbox\u002Fdeserialize_map",[558,739,740],{"align":544},"slam_toolbox\u002Fsrv\u002FDeserializePoseGraph",[558,742,743],{"align":544},"从磁盘加载保存的序列化位姿图文件",[539,745,746,749,752],{},[558,747,748],{"align":544},"\u002Fslam_toolbox\u002Fdynamic_map",[558,750,751],{"align":544},"nav_msgs\u002FOccupancyGrid",[558,753,754],{"align":544},"请求位姿图的当前状态作为占用网格",[539,756,757,760,763],{},[558,758,759],{"align":544},"\u002Fslam_toolbox\u002Fmanual_loop_closure",[558,761,762],{"align":544},"slam_toolbox\u002Fsrv\u002FLoopClosure",[558,764,765],{"align":544},"请求对位姿图进行手动更改",[539,767,768,771,774],{},[558,769,770],{"align":544},"\u002Fslam_toolbox\u002Fpause_new_measurements",[558,772,773],{"align":544},"slam_toolbox\u002Fsrv\u002FPause",[558,775,776],{"align":544},"暂停处理新传入的激光扫描",[539,778,779,782,785],{},[558,780,781],{"align":544},"\u002Fslam_toolbox\u002Fsave_map",[558,783,784],{"align":544},"slam_toolbox\u002Fsrv\u002FSaveMap",[558,786,787],{"align":544},"保存可用于显示 AMCL 定位的地图图像文件。",[539,789,790,793,796],{},[558,791,792],{"align":544},"\u002Fslam_toolbox\u002Fserialize_map",[558,794,795],{"align":544},"slam_toolbox\u002Fsrv\u002FSerializePoseGraph",[558,797,798],{"align":544},"保存地图位姿图和数据，可用于继续建图、slam_toolbox 定位、离线操作等",[539,800,801,804,807],{},[558,802,803],{"align":544},"\u002Fslam_toolbox\u002Ftoggle_interactive_mode",[558,805,806],{"align":544},"slam_toolbox\u002Fsrv\u002FToggleInteractive",[558,808,809],{"align":544},"在交互模式与非交互模式之间切换，发布节点的交互式标记及其位置，以便在应用程序中进行更新",[539,811,812,815,818],{},[558,813,814],{"align":544},"\u002Fslam_toolbox\u002Freset",[558,816,817],{"align":544},"slam_toolbox\u002Fsrv\u002FReset",[558,819,820],{"align":544},"将当前地图重置回初始状态",[311,822,823],{"start":145},[51,824,825,826],{},"参数",[311,827,828],{},[51,829,830],{},"求解器参数",[48,832,833,839,845,851,857,863,869,880,886,892,898,904,910,916,922,928,934,940,946,952,958,964,970,976,982,988,994,1000,1006,1012,1023,1029,1035,1041,1047,1053,1059,1065,1071,1077,1083,1089,1095,1101,1107,1113,1119,1125,1131,1136,1142,1147,1153,1159,1165,1171,1177],{},[51,834,835,838],{},[23,836,837],{},"solver_plugin","  用于 karto 扫描解算器的非线性解算器类型。选项：solver_plugins::CeresSolver, - solver_plugins::SpaSolver, solver_plugins::G2oSolver. Default: solver_plugins::CeresSolver.",[51,840,841,844],{},[23,842,843],{},"ceres_linear_solver","  Ceres 使用的线性求解器。选项：SPARSE_NORMAL_CHOLESKY、SPARSE_SCHUR、ITERATIVE_SCHUR、CGNR。默认为 SPARSE_NORMAL_CHOLESKY。",[51,846,847,850],{},[23,848,849],{},"ceres_preconditioner","  与该求解器一起使用的预处理器。选项：JACOBI、IDENTITY（none）、SCHUR_JACOBI。默认为JACOBI。",[51,852,853,856],{},[23,854,855],{},"ceres_trust_strategy","  信任区域策略。行搜索策略没有公开，因为它们对于这种用途表现不佳。选项：LEVENBERG_MARQUARDT、DOGLEG。默认值：LEVENBERG_MARQUARDT。",[51,858,859,862],{},[23,860,861],{},"ceres_dogleg_type","  如果信任策略是 DOGLEG，则使用dogleg策略。选项：TRADITIONAL_DOGLEG、SUBSPACE_DOGLEG。默认值：TRADITIONAL_DOGLEG",[51,864,865,868],{},[23,866,867],{},"ceres_loss_function","  拒绝异常值的损失函数类型。没有一个等于损失平方。选项：None、HuberLoss、CauchyLoss。默认值：None。",[51,870,871,874,875],{},[23,872,873],{},"mode","  “建图”或“定位”模式，用于 Ceres 问题创建中的性能优化",[48,876,877],{},[51,878,879],{},"Toolbox参数",[51,881,882,885],{},[23,883,884],{},"odom_frame","  里程计坐标系",[51,887,888,891],{},[23,889,890],{},"map_frame","  地图坐标系",[51,893,894,897],{},[23,895,896],{},"base_frame","  基坐标系",[51,899,900,903],{},[23,901,902],{},"scan_topic","  扫描主题名， 注意是\u002Fscan 不是scan",[51,905,906,909],{},[23,907,908],{},"scan_queue_size","  扫描消息对队列长度。在异步模式下应始终设置为 1",[51,911,912,915],{},[23,913,914],{},"use_map_saver","  实例化地图服务程序并自行订阅map主题",[51,917,918,921],{},[23,919,920],{},"map_file_name","  启动时加载的位姿图文件的名称（如果可用）",[51,923,924,927],{},[23,925,926],{},"map_start_pose","  启动建图\u002F定位时的位姿（如果可用）",[51,929,930,933],{},[23,931,932],{},"map_start_at_dock","  在dock（第一个节点）处启动姿势图加载（如果可用）。如果同时设置了pose和dock，优先使用pose",[51,935,936,939],{},[23,937,938],{},"debug_logging","  更改日志以进行调试",[51,941,942,945],{},[23,943,944],{},"throttle_scans","  在同步模式下限制的扫描次数",[51,947,948,951],{},[23,949,950],{},"transform_publish_period","  里程计odom变换发布周期。 0 不会发布变换。",[51,953,954,957],{},[23,955,956],{},"map_update_interval","  更新 2D 占用地图的时间间隔",[51,959,960,963],{},[23,961,962],{},"enable_interactive_mode","  是否允许启用交互模式。交互模式将保留映射到其 ID 的激光扫描缓存，以便在交互模式下进行可视化。结果，该进程的内存将会增加。在定位和长期建图模式下可以手动禁用此功能，因为它们会随着时间的推移增加内存利用率。对于建图或连续建图模式均有效。",[51,965,966,969],{},[23,967,968],{},"position_covariance_scale","  从扫描匹配发布姿势时缩放位置协方差的量。这可用于调整下游定位滤波器中位姿的影响。协方差表示测量的不确定性，因此扩大协方差将减小位姿对下游滤波器的影响。默认值：1.0",[51,971,972,975],{},[23,973,974],{},"yaw_covariance_scale","  从扫描匹配发布位姿时缩放偏航协方差的量。请参阅position_covariance_scale 的描述。默认值：1.0",[51,977,978,981],{},[23,979,980],{},"resolution","  生成的 2D 占用图的分辨率",[51,983,984,987],{},[23,985,986],{},"max_laser_range","  用于 2D 占用地图光栅化的最大激光范围",[51,989,990,993],{},[23,991,992],{},"minimum_time_interval","  在同步模式下处理的扫描之间的最短持续时间",[51,995,996,999],{},[23,997,998],{},"transform_timeout","  查找转换 TF 超时时间限制",[51,1001,1002,1005],{},[23,1003,1004],{},"tf_buffer_duration","  存储 TF 消息以供查询的时间。如果在同步模式下以倍速脱机运行，则设置高一些。",[51,1007,1008,1011],{},[23,1009,1010],{},"stack_size_to_use","  将堆栈大小重置为的字节数，以启用文件的序列化\u002F反序列化。自由默认值为 40000000，但越少越好。",[51,1013,1014,1017,1018],{},[23,1015,1016],{},"minimum_travel_distance","  处理新扫描之前的最小行进距离",[48,1019,1020],{},[51,1021,1022],{},"匹配器参数",[51,1024,1025,1028],{},[23,1026,1027],{},"use_scan_matching","  是否使用扫描匹配来优化里程位姿",[51,1030,1031,1034],{},[23,1032,1033],{},"use_scan_barycenter","  是否使用重心或扫描位姿",[51,1036,1037,1040],{},[23,1038,1039],{},"minimum_travel_heading","  合理更新的最小航向变化",[51,1042,1043,1046],{},[23,1044,1045],{},"scan_buffer_size","  缓冲到链中的扫描次数，也用作定位模式循环缓冲区中的扫描次数",[51,1048,1049,1052],{},[23,1050,1051],{},"scan_buffer_maximum_scan_distance","  从缓冲区中删除之前扫描，距离之前位姿的最大距离",[51,1054,1055,1058],{},[23,1056,1057],{},"link_match_minimum_response_fine","  精细分辨率通过的阈值链接匹配算法响应",[51,1060,1061,1064],{},[23,1062,1063],{},"link_scan_maximum_distance","  有效链接扫描之间的最大距离",[51,1066,1067,1070],{},[23,1068,1069],{},"Loop_search_maximum_distance","  循环闭合时考虑的扫描距离的最大阈值",[51,1072,1073,1076],{},[23,1074,1075],{},"do_loop_close","  是否进行循环闭合（如果不确定，答案是“true”）",[51,1078,1079,1082],{},[23,1080,1081],{},"Loop_match_minimum_chain_size","  寻找循环闭合的扫描的最小链长度",[51,1084,1085,1088],{},[23,1086,1087],{},"Loop_match_maximum_variance_coarse","  粗略搜索中传递给细化的阈值方差",[51,1090,1091,1094],{},[23,1092,1093],{},"Loop_match_minimum_response_coarse","  粗略搜索中环路闭合算法的阈值响应要传递给细化",[51,1096,1097,1100],{},[23,1098,1099],{},"Loop_match_minimum_response_fine","  精细搜索中循环闭合算法的阈值响应传递给细化",[51,1102,1103,1106],{},[23,1104,1105],{},"correlation_search_space_dimension"," 搜索网格大小以进行扫描相关性",[51,1108,1109,1112],{},[23,1110,1111],{},"correlation_search_space_resolution","  搜索网格分辨率以进行扫描相关性",[51,1114,1115,1118],{},[23,1116,1117],{},"correlation_search_space_smear_deviation","  用于平滑响应的多模态涂抹量",[51,1120,1121,1124],{},[23,1122,1123],{},"loop_search_space_dimension","  循环闭合算法的搜索网格的大小",[51,1126,1127,1130],{},[23,1128,1129],{},"loop_search_space_resolution","  搜索网格分辨率以进行循环闭合",[51,1132,1133,1118],{},[23,1134,1135],{},"loop_search_space_smear_deviation",[51,1137,1138,1141],{},[23,1139,1140],{},"distance_variance_penalty","  应用于匹配扫描的惩罚，因为它与里程姿势不同",[51,1143,1144,1141],{},[23,1145,1146],{},"angle_variance_penalty",[51,1148,1149,1152],{},[23,1150,1151],{},"fine_search_angle_offset","  用于测试精细扫描匹配的角度范围",[51,1154,1155,1158],{},[23,1156,1157],{},"rough_search_angle_offset","  用于测试粗略扫描匹配的角度范围",[51,1160,1161,1164],{},[23,1162,1163],{},"coarse_angle_resolution","  在扫描匹配中测试的偏移范围内的角度分辨率",[51,1166,1167,1170],{},[23,1168,1169],{},"minimum_angle_penalty","  确保尺寸不会膨胀的最小惩罚角度",[51,1172,1173,1176],{},[23,1174,1175],{},"minimum_distance_penalty","  扫描可以确保大小不会爆炸的最小惩罚",[51,1178,1179,1182],{},[23,1180,1181],{},"use_response_expansion","  如果没有找到可行的匹配，是否自动增加搜索网格大小",[16,1184,1185],{"id":1185},"slam_toolbox基本使用",[311,1187,1188],{},[51,1189,1190],{},"准备工作",[20,1192,1193],{},"在src目录下，请先调用如下指令在工作空间的src目录下创建一个功能包：",[70,1195,1197],{"className":72,"code":1196,"language":74,"meta":34,"style":34},"ros2 pkg create mycar_slam_slam_toolbox --dependencies slam_toolbox\n",[76,1198,1199],{"__ignoreMap":34},[79,1200,1201,1204,1207,1210,1213,1217],{"class":81,"line":82},[79,1202,1203],{"class":85},"ros2",[79,1205,1206],{"class":89}," pkg",[79,1208,1209],{"class":89}," create",[79,1211,1212],{"class":89}," mycar_slam_slam_toolbox",[79,1214,1216],{"class":1215},"sj4cs"," --dependencies",[79,1218,1219],{"class":89}," slam_toolbox\n",[311,1221,1222],{"start":116},[51,1223,1224],{},"编写launch文件与参数文件",[20,1226,1227,1228,1231],{},"在功能包下，新建launch目录和params目录，launch目录下新建",[76,1229,1230],{},"online_sync_launch.py","文件并输入如下内容：",[70,1233,1237],{"className":1234,"code":1235,"language":1236,"meta":34,"style":34},"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\u002FGazebo clock')\n    declare_slam_params_file_cmd = DeclareLaunchArgument(\n        'slam_params_file',\n        default_value=os.path.join(get_package_share_directory(\"mycar_slam_slam_toolbox\"),\n                                   'params', 'mapper_params_online_sync.yaml'),\n        description='Full path to the ROS2 parameters file to use for the slam_toolbox node')\n\n    start_sync_slam_toolbox_node = Node(\n        parameters=[\n          slam_params_file,\n          {'use_sim_time': use_sim_time}\n        ],\n        package='slam_toolbox',\n        executable='sync_slam_toolbox_node',\n        name='slam_toolbox',\n        output='screen')\n\n    ld = LaunchDescription()\n\n    ld.add_action(declare_use_sim_time_argument)\n    ld.add_action(declare_slam_params_file_cmd)\n    ld.add_action(start_sync_slam_toolbox_node)\n\n    return ld\n","python",[76,1238,1239,1247,1251,1264,1276,1288,1300,1312,1316,1327,1344,1359,1364,1375,1384,1398,1411,1421,1429,1445,1459,1471,1476,1487,1498,1504,1515,1521,1534,1547,1559,1572,1577,1588,1593,1599,1605,1611,1616],{"__ignoreMap":34},[79,1240,1241,1244],{"class":81,"line":82},[79,1242,1243],{"class":99},"import",[79,1245,1246],{"class":106}," os\n",[79,1248,1249],{"class":81,"line":116},[79,1250,142],{"emptyLinePlaceholder":141},[79,1252,1253,1256,1259,1261],{"class":81,"line":138},[79,1254,1255],{"class":99},"from",[79,1257,1258],{"class":106}," launch ",[79,1260,1243],{"class":99},[79,1262,1263],{"class":106}," LaunchDescription\n",[79,1265,1266,1268,1271,1273],{"class":81,"line":145},[79,1267,1255],{"class":99},[79,1269,1270],{"class":106}," launch.actions ",[79,1272,1243],{"class":99},[79,1274,1275],{"class":106}," DeclareLaunchArgument\n",[79,1277,1278,1280,1283,1285],{"class":81,"line":152},[79,1279,1255],{"class":99},[79,1281,1282],{"class":106}," launch.substitutions ",[79,1284,1243],{"class":99},[79,1286,1287],{"class":106}," LaunchConfiguration\n",[79,1289,1290,1292,1295,1297],{"class":81,"line":164},[79,1291,1255],{"class":99},[79,1293,1294],{"class":106}," launch_ros.actions ",[79,1296,1243],{"class":99},[79,1298,1299],{"class":106}," Node\n",[79,1301,1302,1304,1307,1309],{"class":81,"line":176},[79,1303,1255],{"class":99},[79,1305,1306],{"class":106}," ament_index_python.packages ",[79,1308,1243],{"class":99},[79,1310,1311],{"class":106}," get_package_share_directory\n",[79,1313,1314],{"class":81,"line":181},[79,1315,142],{"emptyLinePlaceholder":141},[79,1317,1318,1321,1324],{"class":81,"line":186},[79,1319,1320],{"class":99},"def",[79,1322,1323],{"class":85}," generate_launch_description",[79,1325,1326],{"class":106},"():\n",[79,1328,1329,1332,1335,1338,1341],{"class":81,"line":197},[79,1330,1331],{"class":106},"    use_sim_time ",[79,1333,1334],{"class":99},"=",[79,1336,1337],{"class":106}," LaunchConfiguration(",[79,1339,1340],{"class":89},"'use_sim_time'",[79,1342,1343],{"class":106},")\n",[79,1345,1347,1350,1352,1354,1357],{"class":81,"line":1346},11,[79,1348,1349],{"class":106},"    slam_params_file ",[79,1351,1334],{"class":99},[79,1353,1337],{"class":106},[79,1355,1356],{"class":89},"'slam_params_file'",[79,1358,1343],{"class":106},[79,1360,1362],{"class":81,"line":1361},12,[79,1363,142],{"emptyLinePlaceholder":141},[79,1365,1367,1370,1372],{"class":81,"line":1366},13,[79,1368,1369],{"class":106},"    declare_use_sim_time_argument ",[79,1371,1334],{"class":99},[79,1373,1374],{"class":106}," DeclareLaunchArgument(\n",[79,1376,1378,1381],{"class":81,"line":1377},14,[79,1379,1380],{"class":89},"        'use_sim_time'",[79,1382,1383],{"class":106},",\n",[79,1385,1387,1391,1393,1396],{"class":81,"line":1386},15,[79,1388,1390],{"class":1389},"s4XuR","        default_value",[79,1392,1334],{"class":99},[79,1394,1395],{"class":89},"'false'",[79,1397,1383],{"class":106},[79,1399,1401,1404,1406,1409],{"class":81,"line":1400},16,[79,1402,1403],{"class":1389},"        description",[79,1405,1334],{"class":99},[79,1407,1408],{"class":89},"'Use simulation\u002FGazebo clock'",[79,1410,1343],{"class":106},[79,1412,1414,1417,1419],{"class":81,"line":1413},17,[79,1415,1416],{"class":106},"    declare_slam_params_file_cmd ",[79,1418,1334],{"class":99},[79,1420,1374],{"class":106},[79,1422,1424,1427],{"class":81,"line":1423},18,[79,1425,1426],{"class":89},"        'slam_params_file'",[79,1428,1383],{"class":106},[79,1430,1432,1434,1436,1439,1442],{"class":81,"line":1431},19,[79,1433,1390],{"class":1389},[79,1435,1334],{"class":99},[79,1437,1438],{"class":106},"os.path.join(get_package_share_directory(",[79,1440,1441],{"class":89},"\"mycar_slam_slam_toolbox\"",[79,1443,1444],{"class":106},"),\n",[79,1446,1448,1451,1454,1457],{"class":81,"line":1447},20,[79,1449,1450],{"class":89},"                                   'params'",[79,1452,1453],{"class":106},", ",[79,1455,1456],{"class":89},"'mapper_params_online_sync.yaml'",[79,1458,1444],{"class":106},[79,1460,1462,1464,1466,1469],{"class":81,"line":1461},21,[79,1463,1403],{"class":1389},[79,1465,1334],{"class":99},[79,1467,1468],{"class":89},"'Full path to the ROS2 parameters file to use for the slam_toolbox node'",[79,1470,1343],{"class":106},[79,1472,1474],{"class":81,"line":1473},22,[79,1475,142],{"emptyLinePlaceholder":141},[79,1477,1479,1482,1484],{"class":81,"line":1478},23,[79,1480,1481],{"class":106},"    start_sync_slam_toolbox_node ",[79,1483,1334],{"class":99},[79,1485,1486],{"class":106}," Node(\n",[79,1488,1490,1493,1495],{"class":81,"line":1489},24,[79,1491,1492],{"class":1389},"        parameters",[79,1494,1334],{"class":99},[79,1496,1497],{"class":106},"[\n",[79,1499,1501],{"class":81,"line":1500},25,[79,1502,1503],{"class":106},"          slam_params_file,\n",[79,1505,1507,1510,1512],{"class":81,"line":1506},26,[79,1508,1509],{"class":106},"          {",[79,1511,1340],{"class":89},[79,1513,1514],{"class":106},": use_sim_time}\n",[79,1516,1518],{"class":81,"line":1517},27,[79,1519,1520],{"class":106},"        ],\n",[79,1522,1524,1527,1529,1532],{"class":81,"line":1523},28,[79,1525,1526],{"class":1389},"        package",[79,1528,1334],{"class":99},[79,1530,1531],{"class":89},"'slam_toolbox'",[79,1533,1383],{"class":106},[79,1535,1537,1540,1542,1545],{"class":81,"line":1536},29,[79,1538,1539],{"class":1389},"        executable",[79,1541,1334],{"class":99},[79,1543,1544],{"class":89},"'sync_slam_toolbox_node'",[79,1546,1383],{"class":106},[79,1548,1550,1553,1555,1557],{"class":81,"line":1549},30,[79,1551,1552],{"class":1389},"        name",[79,1554,1334],{"class":99},[79,1556,1531],{"class":89},[79,1558,1383],{"class":106},[79,1560,1562,1565,1567,1570],{"class":81,"line":1561},31,[79,1563,1564],{"class":1389},"        output",[79,1566,1334],{"class":99},[79,1568,1569],{"class":89},"'screen'",[79,1571,1343],{"class":106},[79,1573,1575],{"class":81,"line":1574},32,[79,1576,142],{"emptyLinePlaceholder":141},[79,1578,1580,1583,1585],{"class":81,"line":1579},33,[79,1581,1582],{"class":106},"    ld ",[79,1584,1334],{"class":99},[79,1586,1587],{"class":106}," LaunchDescription()\n",[79,1589,1591],{"class":81,"line":1590},34,[79,1592,142],{"emptyLinePlaceholder":141},[79,1594,1596],{"class":81,"line":1595},35,[79,1597,1598],{"class":106},"    ld.add_action(declare_use_sim_time_argument)\n",[79,1600,1602],{"class":81,"line":1601},36,[79,1603,1604],{"class":106},"    ld.add_action(declare_slam_params_file_cmd)\n",[79,1606,1608],{"class":81,"line":1607},37,[79,1609,1610],{"class":106},"    ld.add_action(start_sync_slam_toolbox_node)\n",[79,1612,1614],{"class":81,"line":1613},38,[79,1615,142],{"emptyLinePlaceholder":141},[79,1617,1619,1622],{"class":81,"line":1618},39,[79,1620,1621],{"class":99},"    return",[79,1623,1624],{"class":106}," ld\n",[20,1626,1627,1628,1631,1632,1634],{},"该launch文件主要是加载了slam_toolbox下的sync_slam_toolbox_node节点，并且会从当前功能包的params下读取一个名为",[76,1629,1630],{},"mapper_params_online_sync.yaml","的配置文件。这个配置文件还不存在，接下来需要在params目录下新建",[76,1633,1630],{},"文件，并输入如下内容：",[70,1636,1640],{"className":1637,"code":1638,"language":1639,"meta":34,"style":34},"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: \u002Fscan\n    mode: mapping #localization\n\n    #map_file_name: test_steve\n    #map_start_pose: [0.0, 0.0, 0.0]\n    #map_start_at_dock: true\n\n    debug_logging: false\n    throttle_scans: 1\n    transform_publish_period: 0.02 \n    map_update_interval: 2.0\n    resolution: 0.05\n    max_laser_range: 20.0 \n    minimum_time_interval: 0.5\n    transform_timeout: 0.2\n    tf_buffer_duration: 30.0\n    stack_size_to_use: 40000000 \n    enable_interactive_mode: true\n\n    use_scan_matching: true\n    use_scan_barycenter: true\n    minimum_travel_distance: 0.1\n    minimum_travel_heading: 0.1\n    scan_buffer_size: 100\n    scan_buffer_maximum_scan_distance: 10.0\n    link_match_minimum_response_fine: 0.1  \n    link_scan_maximum_distance: 1.5\n    loop_search_maximum_distance: 3.0\n    do_loop_closing: true \n    loop_match_minimum_chain_size: 10           \n    loop_match_maximum_variance_coarse: 3.0  \n    loop_match_minimum_response_coarse: 0.35    \n    loop_match_minimum_response_fine: 0.45\n\n    correlation_search_space_dimension: 0.5\n    correlation_search_space_resolution: 0.01\n    correlation_search_space_smear_deviation: 0.1 \n\n    loop_search_space_dimension: 8.0\n    loop_search_space_resolution: 0.05\n    loop_search_space_smear_deviation: 0.03\n\n    distance_variance_penalty: 0.5      \n    angle_variance_penalty: 1.0    \n\n    fine_search_angle_offset: 0.00349     \n    coarse_search_angle_offset: 0.349   \n    coarse_angle_resolution: 0.0349        \n    minimum_angle_penalty: 0.9\n    minimum_distance_penalty: 0.5\n    use_response_expansion: true\n","yaml",[76,1641,1642,1650,1657,1668,1678,1688,1698,1708,1718,1722,1732,1742,1752,1762,1775,1779,1784,1789,1794,1798,1808,1818,1831,1841,1851,1863,1873,1883,1893,1905,1915,1919,1928,1937,1947,1956,1966,1976,1989,1999,2010,2023,2037,2050,2064,2075,2080,2090,2101,2113,2118,2129,2139,2150,2155,2169,2182,2187,2201,2215,2229,2240,2250],{"__ignoreMap":34},[79,1643,1644,1647],{"class":81,"line":82},[79,1645,592],{"class":1646},"s9eBZ",[79,1648,1649],{"class":106},":\n",[79,1651,1652,1655],{"class":81,"line":116},[79,1653,1654],{"class":1646},"  ros__parameters",[79,1656,1649],{"class":106},[79,1658,1659,1662,1665],{"class":81,"line":138},[79,1660,1661],{"class":1646},"    solver_plugin",[79,1663,1664],{"class":106},": ",[79,1666,1667],{"class":89},"solver_plugins::CeresSolver\n",[79,1669,1670,1673,1675],{"class":81,"line":145},[79,1671,1672],{"class":1646},"    ceres_linear_solver",[79,1674,1664],{"class":106},[79,1676,1677],{"class":89},"SPARSE_NORMAL_CHOLESKY\n",[79,1679,1680,1683,1685],{"class":81,"line":152},[79,1681,1682],{"class":1646},"    ceres_preconditioner",[79,1684,1664],{"class":106},[79,1686,1687],{"class":89},"SCHUR_JACOBI\n",[79,1689,1690,1693,1695],{"class":81,"line":164},[79,1691,1692],{"class":1646},"    ceres_trust_strategy",[79,1694,1664],{"class":106},[79,1696,1697],{"class":89},"LEVENBERG_MARQUARDT\n",[79,1699,1700,1703,1705],{"class":81,"line":176},[79,1701,1702],{"class":1646},"    ceres_dogleg_type",[79,1704,1664],{"class":106},[79,1706,1707],{"class":89},"TRADITIONAL_DOGLEG\n",[79,1709,1710,1713,1715],{"class":81,"line":181},[79,1711,1712],{"class":1646},"    ceres_loss_function",[79,1714,1664],{"class":106},[79,1716,1717],{"class":89},"None\n",[79,1719,1720],{"class":81,"line":186},[79,1721,142],{"emptyLinePlaceholder":141},[79,1723,1724,1727,1729],{"class":81,"line":197},[79,1725,1726],{"class":1646},"    odom_frame",[79,1728,1664],{"class":106},[79,1730,1731],{"class":89},"odom\n",[79,1733,1734,1737,1739],{"class":81,"line":1346},[79,1735,1736],{"class":1646},"    map_frame",[79,1738,1664],{"class":106},[79,1740,1741],{"class":89},"map\n",[79,1743,1744,1747,1749],{"class":81,"line":1361},[79,1745,1746],{"class":1646},"    base_frame",[79,1748,1664],{"class":106},[79,1750,1751],{"class":89},"base_link\n",[79,1753,1754,1757,1759],{"class":81,"line":1366},[79,1755,1756],{"class":1646},"    scan_topic",[79,1758,1664],{"class":106},[79,1760,1761],{"class":89},"\u002Fscan\n",[79,1763,1764,1767,1769,1772],{"class":81,"line":1377},[79,1765,1766],{"class":1646},"    mode",[79,1768,1664],{"class":106},[79,1770,1771],{"class":89},"mapping",[79,1773,1774],{"class":148}," #localization\n",[79,1776,1777],{"class":81,"line":1386},[79,1778,142],{"emptyLinePlaceholder":141},[79,1780,1781],{"class":81,"line":1400},[79,1782,1783],{"class":148},"    #map_file_name: test_steve\n",[79,1785,1786],{"class":81,"line":1413},[79,1787,1788],{"class":148},"    #map_start_pose: [0.0, 0.0, 0.0]\n",[79,1790,1791],{"class":81,"line":1423},[79,1792,1793],{"class":148},"    #map_start_at_dock: true\n",[79,1795,1796],{"class":81,"line":1431},[79,1797,142],{"emptyLinePlaceholder":141},[79,1799,1800,1803,1805],{"class":81,"line":1447},[79,1801,1802],{"class":1646},"    debug_logging",[79,1804,1664],{"class":106},[79,1806,1807],{"class":1215},"false\n",[79,1809,1810,1813,1815],{"class":81,"line":1461},[79,1811,1812],{"class":1646},"    throttle_scans",[79,1814,1664],{"class":106},[79,1816,1817],{"class":1215},"1\n",[79,1819,1820,1823,1825,1828],{"class":81,"line":1473},[79,1821,1822],{"class":1646},"    transform_publish_period",[79,1824,1664],{"class":106},[79,1826,1827],{"class":1215},"0.02",[79,1829,1830],{"class":106}," \n",[79,1832,1833,1836,1838],{"class":81,"line":1478},[79,1834,1835],{"class":1646},"    map_update_interval",[79,1837,1664],{"class":106},[79,1839,1840],{"class":1215},"2.0\n",[79,1842,1843,1846,1848],{"class":81,"line":1489},[79,1844,1845],{"class":1646},"    resolution",[79,1847,1664],{"class":106},[79,1849,1850],{"class":1215},"0.05\n",[79,1852,1853,1856,1858,1861],{"class":81,"line":1500},[79,1854,1855],{"class":1646},"    max_laser_range",[79,1857,1664],{"class":106},[79,1859,1860],{"class":1215},"20.0",[79,1862,1830],{"class":106},[79,1864,1865,1868,1870],{"class":81,"line":1506},[79,1866,1867],{"class":1646},"    minimum_time_interval",[79,1869,1664],{"class":106},[79,1871,1872],{"class":1215},"0.5\n",[79,1874,1875,1878,1880],{"class":81,"line":1517},[79,1876,1877],{"class":1646},"    transform_timeout",[79,1879,1664],{"class":106},[79,1881,1882],{"class":1215},"0.2\n",[79,1884,1885,1888,1890],{"class":81,"line":1523},[79,1886,1887],{"class":1646},"    tf_buffer_duration",[79,1889,1664],{"class":106},[79,1891,1892],{"class":1215},"30.0\n",[79,1894,1895,1898,1900,1903],{"class":81,"line":1536},[79,1896,1897],{"class":1646},"    stack_size_to_use",[79,1899,1664],{"class":106},[79,1901,1902],{"class":1215},"40000000",[79,1904,1830],{"class":106},[79,1906,1907,1910,1912],{"class":81,"line":1549},[79,1908,1909],{"class":1646},"    enable_interactive_mode",[79,1911,1664],{"class":106},[79,1913,1914],{"class":1215},"true\n",[79,1916,1917],{"class":81,"line":1561},[79,1918,142],{"emptyLinePlaceholder":141},[79,1920,1921,1924,1926],{"class":81,"line":1574},[79,1922,1923],{"class":1646},"    use_scan_matching",[79,1925,1664],{"class":106},[79,1927,1914],{"class":1215},[79,1929,1930,1933,1935],{"class":81,"line":1579},[79,1931,1932],{"class":1646},"    use_scan_barycenter",[79,1934,1664],{"class":106},[79,1936,1914],{"class":1215},[79,1938,1939,1942,1944],{"class":81,"line":1590},[79,1940,1941],{"class":1646},"    minimum_travel_distance",[79,1943,1664],{"class":106},[79,1945,1946],{"class":1215},"0.1\n",[79,1948,1949,1952,1954],{"class":81,"line":1595},[79,1950,1951],{"class":1646},"    minimum_travel_heading",[79,1953,1664],{"class":106},[79,1955,1946],{"class":1215},[79,1957,1958,1961,1963],{"class":81,"line":1601},[79,1959,1960],{"class":1646},"    scan_buffer_size",[79,1962,1664],{"class":106},[79,1964,1965],{"class":1215},"100\n",[79,1967,1968,1971,1973],{"class":81,"line":1607},[79,1969,1970],{"class":1646},"    scan_buffer_maximum_scan_distance",[79,1972,1664],{"class":106},[79,1974,1975],{"class":1215},"10.0\n",[79,1977,1978,1981,1983,1986],{"class":81,"line":1613},[79,1979,1980],{"class":1646},"    link_match_minimum_response_fine",[79,1982,1664],{"class":106},[79,1984,1985],{"class":1215},"0.1",[79,1987,1988],{"class":106},"  \n",[79,1990,1991,1994,1996],{"class":81,"line":1618},[79,1992,1993],{"class":1646},"    link_scan_maximum_distance",[79,1995,1664],{"class":106},[79,1997,1998],{"class":1215},"1.5\n",[79,2000,2002,2005,2007],{"class":81,"line":2001},40,[79,2003,2004],{"class":1646},"    loop_search_maximum_distance",[79,2006,1664],{"class":106},[79,2008,2009],{"class":1215},"3.0\n",[79,2011,2013,2016,2018,2021],{"class":81,"line":2012},41,[79,2014,2015],{"class":1646},"    do_loop_closing",[79,2017,1664],{"class":106},[79,2019,2020],{"class":1215},"true",[79,2022,1830],{"class":106},[79,2024,2026,2029,2031,2034],{"class":81,"line":2025},42,[79,2027,2028],{"class":1646},"    loop_match_minimum_chain_size",[79,2030,1664],{"class":106},[79,2032,2033],{"class":1215},"10",[79,2035,2036],{"class":106},"           \n",[79,2038,2040,2043,2045,2048],{"class":81,"line":2039},43,[79,2041,2042],{"class":1646},"    loop_match_maximum_variance_coarse",[79,2044,1664],{"class":106},[79,2046,2047],{"class":1215},"3.0",[79,2049,1988],{"class":106},[79,2051,2053,2056,2058,2061],{"class":81,"line":2052},44,[79,2054,2055],{"class":1646},"    loop_match_minimum_response_coarse",[79,2057,1664],{"class":106},[79,2059,2060],{"class":1215},"0.35",[79,2062,2063],{"class":106},"    \n",[79,2065,2067,2070,2072],{"class":81,"line":2066},45,[79,2068,2069],{"class":1646},"    loop_match_minimum_response_fine",[79,2071,1664],{"class":106},[79,2073,2074],{"class":1215},"0.45\n",[79,2076,2078],{"class":81,"line":2077},46,[79,2079,142],{"emptyLinePlaceholder":141},[79,2081,2083,2086,2088],{"class":81,"line":2082},47,[79,2084,2085],{"class":1646},"    correlation_search_space_dimension",[79,2087,1664],{"class":106},[79,2089,1872],{"class":1215},[79,2091,2093,2096,2098],{"class":81,"line":2092},48,[79,2094,2095],{"class":1646},"    correlation_search_space_resolution",[79,2097,1664],{"class":106},[79,2099,2100],{"class":1215},"0.01\n",[79,2102,2104,2107,2109,2111],{"class":81,"line":2103},49,[79,2105,2106],{"class":1646},"    correlation_search_space_smear_deviation",[79,2108,1664],{"class":106},[79,2110,1985],{"class":1215},[79,2112,1830],{"class":106},[79,2114,2116],{"class":81,"line":2115},50,[79,2117,142],{"emptyLinePlaceholder":141},[79,2119,2121,2124,2126],{"class":81,"line":2120},51,[79,2122,2123],{"class":1646},"    loop_search_space_dimension",[79,2125,1664],{"class":106},[79,2127,2128],{"class":1215},"8.0\n",[79,2130,2132,2135,2137],{"class":81,"line":2131},52,[79,2133,2134],{"class":1646},"    loop_search_space_resolution",[79,2136,1664],{"class":106},[79,2138,1850],{"class":1215},[79,2140,2142,2145,2147],{"class":81,"line":2141},53,[79,2143,2144],{"class":1646},"    loop_search_space_smear_deviation",[79,2146,1664],{"class":106},[79,2148,2149],{"class":1215},"0.03\n",[79,2151,2153],{"class":81,"line":2152},54,[79,2154,142],{"emptyLinePlaceholder":141},[79,2156,2158,2161,2163,2166],{"class":81,"line":2157},55,[79,2159,2160],{"class":1646},"    distance_variance_penalty",[79,2162,1664],{"class":106},[79,2164,2165],{"class":1215},"0.5",[79,2167,2168],{"class":106},"      \n",[79,2170,2172,2175,2177,2180],{"class":81,"line":2171},56,[79,2173,2174],{"class":1646},"    angle_variance_penalty",[79,2176,1664],{"class":106},[79,2178,2179],{"class":1215},"1.0",[79,2181,2063],{"class":106},[79,2183,2185],{"class":81,"line":2184},57,[79,2186,142],{"emptyLinePlaceholder":141},[79,2188,2190,2193,2195,2198],{"class":81,"line":2189},58,[79,2191,2192],{"class":1646},"    fine_search_angle_offset",[79,2194,1664],{"class":106},[79,2196,2197],{"class":1215},"0.00349",[79,2199,2200],{"class":106},"     \n",[79,2202,2204,2207,2209,2212],{"class":81,"line":2203},59,[79,2205,2206],{"class":1646},"    coarse_search_angle_offset",[79,2208,1664],{"class":106},[79,2210,2211],{"class":1215},"0.349",[79,2213,2214],{"class":106},"   \n",[79,2216,2218,2221,2223,2226],{"class":81,"line":2217},60,[79,2219,2220],{"class":1646},"    coarse_angle_resolution",[79,2222,1664],{"class":106},[79,2224,2225],{"class":1215},"0.0349",[79,2227,2228],{"class":106},"        \n",[79,2230,2232,2235,2237],{"class":81,"line":2231},61,[79,2233,2234],{"class":1646},"    minimum_angle_penalty",[79,2236,1664],{"class":106},[79,2238,2239],{"class":1215},"0.9\n",[79,2241,2243,2246,2248],{"class":81,"line":2242},62,[79,2244,2245],{"class":1646},"    minimum_distance_penalty",[79,2247,1664],{"class":106},[79,2249,1872],{"class":1215},[79,2251,2253,2256,2258],{"class":81,"line":2252},63,[79,2254,2255],{"class":1646},"    use_response_expansion",[79,2257,1664],{"class":106},[79,2259,1914],{"class":1215},[20,2261,2262],{},"配置文件的内容需要根据实际情况进行动态调整。",[311,2264,2265],{"start":138},[51,2266,2267],{},"编辑配置文件",[20,2269,2270,2271,2274],{},"打开",[76,2272,2273],{},"CMakeLists.txt"," 并输入如下内容：",[70,2276,2280],{"className":2277,"code":2278,"language":2279,"meta":34,"style":34},"language-cmake shiki shiki-themes github-light github-dark","install(DIRECTORY launch params\n  DESTINATION share\u002F${PROJECT_NAME}\n)\n","cmake",[76,2281,2282,2290,2298],{"__ignoreMap":34},[79,2283,2284,2287],{"class":81,"line":82},[79,2285,2286],{"class":99},"install",[79,2288,2289],{"class":106},"(DIRECTORY launch params\n",[79,2291,2292,2295],{"class":81,"line":116},[79,2293,2294],{"class":106},"  DESTINATION share\u002F",[79,2296,2297],{"class":99},"${PROJECT_NAME}\n",[79,2299,2300],{"class":81,"line":138},[79,2301,1343],{"class":106},[311,2303,2304],{"start":145},[51,2305,2306],{},"编译",[20,2308,2309],{},"终端中进入当前工作空间，编译功能包：",[70,2311,2313],{"className":72,"code":2312,"language":74,"meta":34,"style":34},"colcon build --packages-select mycar_slam_slam_toolbox\n",[76,2314,2315],{"__ignoreMap":34},[79,2316,2317,2320,2323,2326],{"class":81,"line":82},[79,2318,2319],{"class":85},"colcon",[79,2321,2322],{"class":89}," build",[79,2324,2325],{"class":1215}," --packages-select",[79,2327,2328],{"class":89}," mycar_slam_slam_toolbox\n",[311,2330,2331],{"start":152},[51,2332,2333,2334,2339,2365,2370,2395,2403,2406,2407,2410,2411,2414],{},"执行",[311,2335,2336],{},[51,2337,2338],{},"请先调用如下指令启动仿真环境：",[70,2340,2342],{"className":72,"code":2341,"language":74,"meta":34,"style":34},". install\u002Fsetup.bash\nros2 launch demo_gazebo_sim gazebo_sim_robot_world.launch.py\n",[76,2343,2344,2352],{"__ignoreMap":34},[79,2345,2346,2349],{"class":81,"line":82},[79,2347,2348],{"class":1215},".",[79,2350,2351],{"class":89}," install\u002Fsetup.bash\n",[79,2353,2354,2356,2359,2362],{"class":81,"line":116},[79,2355,1203],{"class":85},[79,2357,2358],{"class":89}," launch",[79,2360,2361],{"class":89}," demo_gazebo_sim",[79,2363,2364],{"class":89}," gazebo_sim_robot_world.launch.py\n",[311,2366,2367],{"start":138},[51,2368,2369],{},"然后在终端下进入当前工作空间，输入如下指令：",[70,2371,2373],{"className":72,"code":2372,"language":74,"meta":34,"style":34},". install\u002Fsetup.bash\nros2 launch mycar_slam_slam_toolbox online_sync_launch.py use_sim_time:=True\n",[76,2374,2375,2381],{"__ignoreMap":34},[79,2376,2377,2379],{"class":81,"line":82},[79,2378,2348],{"class":1215},[79,2380,2351],{"class":89},[79,2382,2383,2385,2387,2389,2392],{"class":81,"line":116},[79,2384,1203],{"class":85},[79,2386,2358],{"class":89},[79,2388,1212],{"class":89},[79,2390,2391],{"class":89}," online_sync_launch.py",[79,2393,2394],{"class":89}," use_sim_time:=True\n",[311,2396,2397,2400],{"start":152},[51,2398,2399],{},"启动rviz2，将Fixed Frame设置为map，添加map插件并将话题设置为\u002Fmap，即可显示slam_toolbox创建的地图了，当机器人运动时，地图也会随之更新。",[51,2401,2402],{},"use_sim_time:=True参数表示使用仿真的时间。",[2404,2405],"br",{},"  最后需要说明的是，本节内容使用的是",[76,2408,2409],{},"sync_slam_toolbox_node"," 节点，即以同步方式建图，而异步建图节点",[76,2412,2413],{},"async_slam_toolbox_node"," 的使用与同步类似。",[20,2416,2417],{},[32,2418],{"alt":34,"src":2419},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1746.webp",[20,2421,2422],{},"我们用键盘控制节点去控制机器人跑满整张地图，",[20,2424,2425],{},[32,2426],{"alt":34,"src":2427},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1747.webp",[20,2429,2430],{},"黑色：障碍物",[20,2432,2433],{},"白色：无障碍物区",[20,2435,2436],{},"灰色：未知区",[20,2438,2439],{},"SLAM是建图与定位，以上就是建图，那么定位是啥呢？",[20,2441,2442],{},"定位就是Slam会发布一个\u002Ftf，这里面会包含机器人到map之间的坐标变换。",[20,2444,2445],{},"这个\u002Ftf发布的具体是map到odom的坐标变换，所以需要你自己去处理odom和base_link之间的坐标关系。",[20,2447,2448],{},[32,2449],{"alt":34,"src":2450},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1748.webp",[20,2452,2453],{},"这样的设计，可以让整条坐标树是一个链式结构，避免base_link或者base_foot_print出现两个父类，这样计算量会变大。",[20,2455,2456],{},[23,2457,2458],{},"注意事项：",[311,2460,2461],{},[51,2462,2463,2464],{},"突然烂图\n",[311,2465,2466,2469],{},[51,2467,2468],{},"如果你的环境很简单，那么跑图的时候可能会突然烂图，这个时候，大概率是do_loop_closing的问题，你把do_loop_closing设置成false再试试。\n这个东西是SLAM用激光检测形状来匹配之前走过的路，如果他匹配到的形状差不多他会把当前这段轨迹和以前的轨迹连起来，然后重新优化整张 pose graph，让地图整体更一致。\n主要是为了防止odom会漂，因为 odom 会漂，机器人最后回到起点时，SLAM 可能觉得位置差了几十厘米，但是可以通过激光雷达矫正。",[51,2470,2471],{},"在窄通道尽量直线过去，不要原地旋转等等，这种窄通道炸了大概率是scan matching相关参数的问题。",[16,2473,2474],{"id":2474},"cartographer概述",[20,2476,2477],{},[23,2478,25],{},[20,2480,2481],{},"Cartographer是Google推出的一套基于图优化的激光SLAM算法库，支持二维和三维地图的构建。它结合了激光雷达和惯性测量单元（IMU）的数据，通过高效的算法实现实时、准确的定位和建图。",[20,2483,2484],{},[23,2485,367],{},[48,2487,2488,2494,2500,2506,2511],{},[51,2489,2490,2493],{},[23,2491,2492],{},"并行扫描匹配"," 利用并行计算技术加快扫描匹配速度，提高建图效率。",[51,2495,2496,2499],{},[23,2497,2498],{},"位姿图优化"," 通过图优化技术估计机器人的姿态和地图的拓扑结构，减少累积误差。",[51,2501,2502,2505],{},[23,2503,2504],{},"实时地图更新"," 在机器人移动过程中实时更新地图，确保地图的准确性和时效性。",[51,2507,2508,2510],{},[23,2509,635],{}," 通过回环检测识别机器人曾经访问过的区域，进一步减少累积误差，提高地图的全局一致性。",[51,2512,2513,2516],{},[23,2514,2515],{},"多传感器融合"," 支持激光雷达、IMU、里程计等多种传感器数据的融合，提高定位和建图的精度。",[20,2518,396],{},[48,2520,2521,2527,2533,2539,2545],{},[51,2522,2523,2526],{},[23,2524,2525],{},"高效稳定"," Cartographer的算法经过精心设计和优化，能够在复杂环境中高效稳定地运行。",[51,2528,2529,2532],{},[23,2530,2531],{},"高精度"," 通过图优化和回环检测技术提供高精度的定位和建图结果。",[51,2534,2535,2538],{},[23,2536,2537],{},"灵活性"," 支持二维和三维地图构建，适应不同应用场景的需求。",[51,2540,2541,2544],{},[23,2542,2543],{},"开源免费"," Cartographer是开源项目，用户可以免费获取和使用其源代码和文档。",[51,2546,2547,2550],{},[23,2548,2549],{},"社区支持"," 拥有活跃的社区支持体系，用户可以获取来自全球开发者的帮助和支持。",[16,2552,2553],{"id":2553},"cartographer安装",[20,2555,2556],{},"借助于Ubuntu的包资源管理器，可以使用二进制的方式安装cartographer，安装指令如下：",[70,2558,2560],{"className":72,"code":2559,"language":74,"meta":34,"style":34},"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",[76,2561,2562,2583,2604,2608,2613,2624,2635,2639,2649],{"__ignoreMap":34},[79,2563,2564,2566,2568,2570,2572,2574,2576,2578,2580],{"class":81,"line":82},[79,2565,86],{"class":85},[79,2567,90],{"class":89},[79,2569,93],{"class":89},[79,2571,96],{"class":89},[79,2573,100],{"class":99},[79,2575,103],{"class":89},[79,2577,107],{"class":106},[79,2579,110],{"class":99},[79,2581,2582],{"class":89},"-cartographer\n",[79,2584,2585,2587,2589,2591,2593,2595,2597,2599,2601],{"class":81,"line":116},[79,2586,86],{"class":85},[79,2588,90],{"class":89},[79,2590,93],{"class":89},[79,2592,96],{"class":89},[79,2594,100],{"class":99},[79,2596,103],{"class":89},[79,2598,107],{"class":106},[79,2600,110],{"class":99},[79,2602,2603],{"class":89},"-cartographer-ros\n",[79,2605,2606],{"class":81,"line":138},[79,2607,142],{"emptyLinePlaceholder":141},[79,2609,2610],{"class":81,"line":145},[79,2611,2612],{"class":148},"# humble\n",[79,2614,2615,2617,2619,2621],{"class":81,"line":152},[79,2616,86],{"class":85},[79,2618,90],{"class":89},[79,2620,93],{"class":89},[79,2622,2623],{"class":89}," ros-jazzy-cartographer\n",[79,2625,2626,2628,2630,2632],{"class":81,"line":164},[79,2627,86],{"class":85},[79,2629,90],{"class":89},[79,2631,93],{"class":89},[79,2633,2634],{"class":89}," ros-jazzy-cartographer-ros\n",[79,2636,2637],{"class":81,"line":176},[79,2638,485],{"class":148},[79,2640,2641,2643,2645,2647],{"class":81,"line":181},[79,2642,86],{"class":85},[79,2644,90],{"class":89},[79,2646,93],{"class":89},[79,2648,2623],{"class":89},[79,2650,2651,2653,2655,2657],{"class":81,"line":186},[79,2652,86],{"class":85},[79,2654,90],{"class":89},[79,2656,93],{"class":89},[79,2658,2634],{"class":89},[20,2660,2661,2662,212],{},"上述两条安装指令中，前者用于安装cartographer的核心库，这个包不直接与ROS2集成，而是作为一个独立的算法库存在，为地图构建和定位提供底层的计算支持。后者则是cartographer在ROS2环境下的封装，它提供了与ROS2系统的接口，使得Cartographer算法能够在ROS2环境中运行。另外指令中的",[76,2663,211],{},[16,2665,2666],{"id":2666},"cartographer节点说明",[20,2668,2669,2670,2673,2674,2677],{},"在Cartographer框架中，",[76,2671,2672],{},"cartographer_node","和",[76,2675,2676],{},"cartographer_occupancy_grid_node","是两个关键的节点，它们各自承担着不同的角色和功能。详细介绍如下。",[336,2679,2680,2685,2688,2693],{},[20,2681,2682],{},[23,2683,2684],{},"cartographer_node：",[20,2686,2687],{},"主要负责订阅来自各种传感器的数据（如激光雷达、IMU、里程计等），并基于这些数据实时构建地图。它采用子图（submap）的方法来逐步构建和更新地图，确保定位的准确性和建图的实时性。",[20,2689,2690],{},[23,2691,2692],{},"cartographer_occupancy_grid_node：",[20,2694,2695,2696,2698,2699,2702],{},"该节点负责接收",[76,2697,2672],{},"发布的子图列表（",[76,2700,2701],{},"\u002Fsubmap_list","），并将其拼接成完整的栅格地图（occupancy grid map），然后发布这个地图。这个节点是地图生成的最终环节，它使得Cartographer能够输出人类可读且易于可视化的地图。",[20,2704,2705],{},"这两个节点的协同工作，前者负责实时构建和更新地图，后者则负责将子图拼接成完整的栅格地图并发布，使得Cartographer能够高效地实现SLAM功能。",[311,2707,2708],{},[51,2709,2710],{},"cartographer_node订阅的话题",[533,2712,2713,2723],{},[536,2714,2715],{},[539,2716,2717,2719,2721],{},[542,2718,545],{"align":544},[542,2720,548],{"align":544},[542,2722,551],{"align":544},[553,2724,2725,2733],{},[539,2726,2727,2729,2731],{},[558,2728,560],{"align":544},[558,2730,563],{"align":544},[558,2732,566],{"align":544},[539,2734,2735,2738,2741],{},[558,2736,2737],{"align":544},"\u002Fodom",[558,2739,2740],{"align":544},"nav_msgs\u002Fmsg\u002FOdometry",[558,2742,2743],{"align":544},"里程计消息",[311,2745,2746],{"start":116},[51,2747,2748],{},"cartographer_node发布的话题",[533,2750,2751,2761],{},[536,2752,2753],{},[539,2754,2755,2757,2759],{},[542,2756,545],{"align":544},[542,2758,548],{"align":544},[542,2760,551],{"align":544},[553,2762,2763,2774],{},[539,2764,2765,2768,2771],{},[558,2766,2767],{"align":544},"\u002Fscan_matched_points2",[558,2769,2770],{"align":544},"sensors_msgs\u002Fmsg\u002FPointCloud2",[558,2772,2773],{"align":544},"匹配好的点云数据，用于scan-to-submap matching",[539,2775,2776,2778,2781],{},[558,2777,2701],{"align":544},[558,2779,2780],{"align":544},"cartographer_ros_msgs\u002FSubmapList",[558,2782,2783],{"align":544},"发布构建好的子图列表",[311,2785,2786],{"start":138},[51,2787,2788],{},"cartographer_node发布的服务",[533,2790,2791,2801],{},[536,2792,2793],{},[539,2794,2795,2797,2799],{},[542,2796,545],{"align":544},[542,2798,548],{"align":544},[542,2800,551],{"align":544},[553,2802,2803,2814,2825,2836,2847,2858],{},[539,2804,2805,2808,2811],{},[558,2806,2807],{"align":544},"\u002Fsubmap_query",[558,2809,2810],{"align":544},"cartographer_ros_msgs\u002Fsrv\u002FSubmapQuery",[558,2812,2813],{"align":544},"提供查询子图的服务，获取到查询的子图",[539,2815,2816,2819,2822],{},[558,2817,2818],{"align":544},"\u002Fstart_trajectory",[558,2820,2821],{"align":544},"cartographer_ros_msgs\u002Fsrv\u002FStartTrajectory",[558,2823,2824],{"align":544},"开始一条轨迹",[539,2826,2827,2830,2833],{},[558,2828,2829],{"align":544},"\u002Ffinish_trajectory",[558,2831,2832],{"align":544},"cartographer_ros_msgs\u002Fsrv\u002FFinishTrajectory",[558,2834,2835],{"align":544},"结束一条给定ID的轨迹",[539,2837,2838,2841,2844],{},[558,2839,2840],{"align":544},"\u002Fwrite_state",[558,2842,2843],{"align":544},"cartographer_ros_msgs\u002Fsrv\u002FWriteState",[558,2845,2846],{"align":544},"将当前状态写入磁盘文件中",[539,2848,2849,2852,2855],{},[558,2850,2851],{"align":544},"\u002Fget_trajectory_states",[558,2853,2854],{"align":544},"cartographer_ros_msgs\u002Fsrv\u002FGetTrajectoryStates",[558,2856,2857],{"align":544},"获取指定轨迹的状态",[539,2859,2860,2863,2866],{},[558,2861,2862],{"align":544},"\u002Fread_metrics",[558,2864,2865],{"align":544},"cartographer_ros_msgs\u002Fsrv\u002FReadMetrics",[558,2867,2868],{"align":544},"读取性能指标",[311,2870,2871],{"start":145},[51,2872,2873],{},"cartographer_node参数",[20,2875,2876,2878],{},[76,2877,2672],{},"节点需要接收一个参数配置文件，该配置文件包含了地图构建、轨迹跟踪等所需的各项参数。",[311,2880,2881],{"start":152},[51,2882,2883],{},"cartographer_occupancy_grid_node订阅的话题",[533,2885,2886,2896],{},[536,2887,2888],{},[539,2889,2890,2892,2894],{},[542,2891,545],{"align":544},[542,2893,548],{"align":544},[542,2895,551],{"align":544},[553,2897,2898],{},[539,2899,2900,2902,2904],{},[558,2901,2701],{"align":544},[558,2903,2780],{"align":544},[558,2905,2906],{"align":544},"子图列表",[311,2908,2909],{"start":164},[51,2910,2911],{},"cartographer_occupancy_grid_node发布的话题",[533,2913,2914,2924],{},[536,2915,2916],{},[539,2917,2918,2920,2922],{},[542,2919,545],{"align":544},[542,2921,548],{"align":544},[542,2923,551],{"align":544},[553,2925,2926],{},[539,2927,2928,2930,2932],{},[558,2929,685],{"align":544},[558,2931,688],{"align":544},[558,2933,2934],{"align":544},"发布的栅格地图",[311,2936,2937],{"start":176},[51,2938,2939],{},"cartographer_occupancy_grid_node请求的服务",[533,2941,2942,2952],{},[536,2943,2944],{},[539,2945,2946,2948,2950],{},[542,2947,545],{"align":544},[542,2949,548],{"align":544},[542,2951,551],{"align":544},[553,2953,2954],{},[539,2955,2956,2958,2960],{},[558,2957,2807],{"align":544},[558,2959,2810],{"align":544},[558,2961,2962],{"align":544},"获取子图",[311,2964,2965],{"start":181},[51,2966,2967],{},"cartographer_occupancy_grid_node参数",[20,2969,2970,2972],{},[76,2971,2676],{},"节点需要配置地图的分辨率和更新周期等参数，以确保生成的栅格地图满足特定的精度和实时性要求。",[16,2974,2975],{"id":2975},"cartogarpher基本使用",[311,2977,2978],{},[51,2979,1190],{},[20,2981,1193],{},[70,2983,2985],{"className":72,"code":2984,"language":74,"meta":34,"style":34},"ros2 pkg create mycar_slam_cartographer --dependencies cartographer\n",[76,2986,2987],{"__ignoreMap":34},[79,2988,2989,2991,2993,2995,2998,3000],{"class":81,"line":82},[79,2990,1203],{"class":85},[79,2992,1206],{"class":89},[79,2994,1209],{"class":89},[79,2996,2997],{"class":89}," mycar_slam_cartographer",[79,2999,1216],{"class":1215},[79,3001,3002],{"class":89}," cartographer\n",[311,3004,3005],{"start":116},[51,3006,1224],{},[20,3008,1227,3009,1231],{},[76,3010,3011],{},"cartographer.launch.py",[70,3013,3015],{"className":1234,"code":3014,"language":1236,"meta":34,"style":34},"from launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument\nfrom launch.substitutions import LaunchConfiguration\nfrom launch_ros.actions import Node\nimport os\nfrom ament_index_python.packages import get_package_share_directory\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument('use_sim_time', default_value = 'false')\n    resolution_arg = DeclareLaunchArgument('resolution', default_value='0.05')\n\n    cartographer_node = Node(\n        package = 'cartographer_ros',\n        executable = 'cartographer_node',\n        parameters = [{'use_sim_time': LaunchConfiguration('use_sim_time')}],\n        arguments = [\n            '-configuration_directory', os.path.join(get_package_share_directory(\"mycar_slam_cartographer\"),\"params\"),\n            '-configuration_basename', 'mycar.lua'],\n        output = 'screen'\n    )\n\n    cartographer_occupancy_grid_node = Node(\n        package = 'cartographer_ros',\n        executable = 'cartographer_occupancy_grid_node',\n        parameters = [\n            {'use_sim_time': LaunchConfiguration('use_sim_time')},\n            {'resolution': LaunchConfiguration('resolution')}],\n    )\n\n    return LaunchDescription([\n        use_sim_time_arg,\n        resolution_arg,\n        cartographer_node,\n        cartographer_occupancy_grid_node,\n    ])\n",[76,3016,3017,3027,3037,3047,3057,3063,3073,3077,3085,3089,3114,3137,3141,3150,3161,3172,3191,3201,3220,3233,3242,3247,3251,3260,3270,3281,3289,3303,3315,3319,3323,3330,3335,3340,3345,3350],{"__ignoreMap":34},[79,3018,3019,3021,3023,3025],{"class":81,"line":82},[79,3020,1255],{"class":99},[79,3022,1258],{"class":106},[79,3024,1243],{"class":99},[79,3026,1263],{"class":106},[79,3028,3029,3031,3033,3035],{"class":81,"line":116},[79,3030,1255],{"class":99},[79,3032,1270],{"class":106},[79,3034,1243],{"class":99},[79,3036,1275],{"class":106},[79,3038,3039,3041,3043,3045],{"class":81,"line":138},[79,3040,1255],{"class":99},[79,3042,1282],{"class":106},[79,3044,1243],{"class":99},[79,3046,1287],{"class":106},[79,3048,3049,3051,3053,3055],{"class":81,"line":145},[79,3050,1255],{"class":99},[79,3052,1294],{"class":106},[79,3054,1243],{"class":99},[79,3056,1299],{"class":106},[79,3058,3059,3061],{"class":81,"line":152},[79,3060,1243],{"class":99},[79,3062,1246],{"class":106},[79,3064,3065,3067,3069,3071],{"class":81,"line":164},[79,3066,1255],{"class":99},[79,3068,1306],{"class":106},[79,3070,1243],{"class":99},[79,3072,1311],{"class":106},[79,3074,3075],{"class":81,"line":176},[79,3076,142],{"emptyLinePlaceholder":141},[79,3078,3079,3081,3083],{"class":81,"line":181},[79,3080,1320],{"class":99},[79,3082,1323],{"class":85},[79,3084,1326],{"class":106},[79,3086,3087],{"class":81,"line":186},[79,3088,142],{"emptyLinePlaceholder":141},[79,3090,3091,3094,3096,3099,3101,3103,3106,3109,3112],{"class":81,"line":197},[79,3092,3093],{"class":106},"    use_sim_time_arg ",[79,3095,1334],{"class":99},[79,3097,3098],{"class":106}," DeclareLaunchArgument(",[79,3100,1340],{"class":89},[79,3102,1453],{"class":106},[79,3104,3105],{"class":1389},"default_value",[79,3107,3108],{"class":99}," =",[79,3110,3111],{"class":89}," 'false'",[79,3113,1343],{"class":106},[79,3115,3116,3119,3121,3123,3126,3128,3130,3132,3135],{"class":81,"line":1346},[79,3117,3118],{"class":106},"    resolution_arg ",[79,3120,1334],{"class":99},[79,3122,3098],{"class":106},[79,3124,3125],{"class":89},"'resolution'",[79,3127,1453],{"class":106},[79,3129,3105],{"class":1389},[79,3131,1334],{"class":99},[79,3133,3134],{"class":89},"'0.05'",[79,3136,1343],{"class":106},[79,3138,3139],{"class":81,"line":1361},[79,3140,142],{"emptyLinePlaceholder":141},[79,3142,3143,3146,3148],{"class":81,"line":1366},[79,3144,3145],{"class":106},"    cartographer_node ",[79,3147,1334],{"class":99},[79,3149,1486],{"class":106},[79,3151,3152,3154,3156,3159],{"class":81,"line":1377},[79,3153,1526],{"class":1389},[79,3155,3108],{"class":99},[79,3157,3158],{"class":89}," 'cartographer_ros'",[79,3160,1383],{"class":106},[79,3162,3163,3165,3167,3170],{"class":81,"line":1386},[79,3164,1539],{"class":1389},[79,3166,3108],{"class":99},[79,3168,3169],{"class":89}," 'cartographer_node'",[79,3171,1383],{"class":106},[79,3173,3174,3176,3178,3181,3183,3186,3188],{"class":81,"line":1400},[79,3175,1492],{"class":1389},[79,3177,3108],{"class":99},[79,3179,3180],{"class":106}," [{",[79,3182,1340],{"class":89},[79,3184,3185],{"class":106},": LaunchConfiguration(",[79,3187,1340],{"class":89},[79,3189,3190],{"class":106},")}],\n",[79,3192,3193,3196,3198],{"class":81,"line":1413},[79,3194,3195],{"class":1389},"        arguments",[79,3197,3108],{"class":99},[79,3199,3200],{"class":106}," [\n",[79,3202,3203,3206,3209,3212,3215,3218],{"class":81,"line":1423},[79,3204,3205],{"class":89},"            '-configuration_directory'",[79,3207,3208],{"class":106},", os.path.join(get_package_share_directory(",[79,3210,3211],{"class":89},"\"mycar_slam_cartographer\"",[79,3213,3214],{"class":106},"),",[79,3216,3217],{"class":89},"\"params\"",[79,3219,1444],{"class":106},[79,3221,3222,3225,3227,3230],{"class":81,"line":1431},[79,3223,3224],{"class":89},"            '-configuration_basename'",[79,3226,1453],{"class":106},[79,3228,3229],{"class":89},"'mycar.lua'",[79,3231,3232],{"class":106},"],\n",[79,3234,3235,3237,3239],{"class":81,"line":1447},[79,3236,1564],{"class":1389},[79,3238,3108],{"class":99},[79,3240,3241],{"class":89}," 'screen'\n",[79,3243,3244],{"class":81,"line":1461},[79,3245,3246],{"class":106},"    )\n",[79,3248,3249],{"class":81,"line":1473},[79,3250,142],{"emptyLinePlaceholder":141},[79,3252,3253,3256,3258],{"class":81,"line":1478},[79,3254,3255],{"class":106},"    cartographer_occupancy_grid_node ",[79,3257,1334],{"class":99},[79,3259,1486],{"class":106},[79,3261,3262,3264,3266,3268],{"class":81,"line":1489},[79,3263,1526],{"class":1389},[79,3265,3108],{"class":99},[79,3267,3158],{"class":89},[79,3269,1383],{"class":106},[79,3271,3272,3274,3276,3279],{"class":81,"line":1500},[79,3273,1539],{"class":1389},[79,3275,3108],{"class":99},[79,3277,3278],{"class":89}," 'cartographer_occupancy_grid_node'",[79,3280,1383],{"class":106},[79,3282,3283,3285,3287],{"class":81,"line":1506},[79,3284,1492],{"class":1389},[79,3286,3108],{"class":99},[79,3288,3200],{"class":106},[79,3290,3291,3294,3296,3298,3300],{"class":81,"line":1517},[79,3292,3293],{"class":106},"            {",[79,3295,1340],{"class":89},[79,3297,3185],{"class":106},[79,3299,1340],{"class":89},[79,3301,3302],{"class":106},")},\n",[79,3304,3305,3307,3309,3311,3313],{"class":81,"line":1523},[79,3306,3293],{"class":106},[79,3308,3125],{"class":89},[79,3310,3185],{"class":106},[79,3312,3125],{"class":89},[79,3314,3190],{"class":106},[79,3316,3317],{"class":81,"line":1536},[79,3318,3246],{"class":106},[79,3320,3321],{"class":81,"line":1549},[79,3322,142],{"emptyLinePlaceholder":141},[79,3324,3325,3327],{"class":81,"line":1561},[79,3326,1621],{"class":99},[79,3328,3329],{"class":106}," LaunchDescription([\n",[79,3331,3332],{"class":81,"line":1574},[79,3333,3334],{"class":106},"        use_sim_time_arg,\n",[79,3336,3337],{"class":81,"line":1579},[79,3338,3339],{"class":106},"        resolution_arg,\n",[79,3341,3342],{"class":81,"line":1590},[79,3343,3344],{"class":106},"        cartographer_node,\n",[79,3346,3347],{"class":81,"line":1595},[79,3348,3349],{"class":106},"        cartographer_occupancy_grid_node,\n",[79,3351,3352],{"class":81,"line":1601},[79,3353,3354],{"class":106},"    ])\n",[20,3356,3357],{},"该launch文件主要是加载了cartographer_ros下的cartographer_node与cartographer_occupancy_grid_node节点，并且会从当前功能包的params下读取一个名为mycar.lua的配置文件。这个配置文件还不存在，接下来需要在params目录下新建mycar.lua文件，并输入如下内容：",[70,3359,3363],{"className":3360,"code":3361,"language":3362,"meta":34,"style":34},"language-lua shiki shiki-themes github-light github-dark","include \"map_builder.lua\" -- 地图构建器\ninclude \"trajectory_builder.lua\" -- 轨迹构建器\n\noptions = {\n  map_builder = MAP_BUILDER,\n  trajectory_builder = TRAJECTORY_BUILDER,\n  map_frame = \"map\",  -- 地图坐标系\n  tracking_frame = \"base_link\", -- 跟踪的坐标系，可以是基坐标系、雷达或imu的坐标系\n  published_frame = \"odom\", -- cartographer发布的位姿（pose）的坐标系\n  odom_frame = \"carto_odom\",  -- cartographer 计算后优化的里程计，并非机器人本身里程计\n  provide_odom_frame = false, -- 是否发布cartographer的里程计\n  publish_frame_projected_to_2d = true, -- 是否转换成2d(无俯仰、滚动的情况下为 true)\n  use_odometry = true, -- 是否订阅里程计数据\n  use_nav_sat = false, -- 是否订阅GPS\n  use_landmarks = false, -- 是否订阅路标\n  num_laser_scans = 1, -- 订阅的雷达的数量\n  num_multi_echo_laser_scans = 0, -- 订阅的多层回波激光雷达数量\n  num_subdivisions_per_laser_scan = 1, -- 将激光雷达的数据拆分成多少部分发布\n  num_point_clouds = 0, -- 订阅多线激光雷达的数量\n  lookup_transform_timeout_sec = 1.5, -- 坐标变换超时时间\n  submap_publish_period_sec = 0.5, -- 发布子图的时间间隔\n  pose_publish_period_sec = 5e-3, -- 发布pose的时间间隔\n  trajectory_publish_period_sec = 30e-3, -- 发布轨迹的时间间隔\n  rangefinder_sampling_ratio = 1., -- 雷达采样比例\n  odometry_sampling_ratio = 0.8, -- 里程计采样比例(如果里程计精度低，可以减小该设置值)\n  fixed_frame_pose_sampling_ratio = 1., -- 参考坐标系采样比例\n  imu_sampling_ratio = 1.,-- imu采样比例\n  landmarks_sampling_ratio = 1., -- 路标采样比例\n}\n\nMAP_BUILDER.use_trajectory_builder_2d = true -- 启用2D轨迹构建器\n\nTRAJECTORY_BUILDER_2D.min_range = 0.15 -- 最小雷达有效距离\nTRAJECTORY_BUILDER_2D.max_range = 6.0 -- 最大雷达有效距离\nTRAJECTORY_BUILDER_2D.missing_data_ray_length = 3. -- 缺失数据的射线长度\nTRAJECTORY_BUILDER_2D.use_imu_data = false -- 是否使用 imu 数据\nTRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true -- 是否使用在线相关扫描匹配\nTRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) -- 运动滤波器的最大角度限制（以弧度为单位）\n\nPOSE_GRAPH.constraint_builder.min_score = 0.65 -- 建约束时的最小分数\nPOSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 -- 全局定位时的最小分数\n\n-- POSE_GRAPH.optimize_every_n_nodes = 0\n\nreturn options\n","lua",[76,3364,3365,3376,3386,3390,3400,3410,3420,3436,3451,3466,3481,3496,3511,3525,3539,3553,3568,3583,3597,3611,3626,3641,3656,3671,3686,3701,3715,3730,3744,3749,3753,3768,3772,3788,3803,3818,3832,3846,3874,3878,3899,3918,3922,3927,3931],{"__ignoreMap":34},[79,3366,3367,3370,3373],{"class":81,"line":82},[79,3368,3369],{"class":1215},"include",[79,3371,3372],{"class":89}," \"map_builder.lua\" ",[79,3374,3375],{"class":148},"-- 地图构建器\n",[79,3377,3378,3380,3383],{"class":81,"line":116},[79,3379,3369],{"class":1215},[79,3381,3382],{"class":89}," \"trajectory_builder.lua\" ",[79,3384,3385],{"class":148},"-- 轨迹构建器\n",[79,3387,3388],{"class":81,"line":138},[79,3389,142],{"emptyLinePlaceholder":141},[79,3391,3392,3395,3397],{"class":81,"line":145},[79,3393,3394],{"class":106},"options ",[79,3396,1334],{"class":99},[79,3398,3399],{"class":106}," {\n",[79,3401,3402,3405,3407],{"class":81,"line":152},[79,3403,3404],{"class":106},"  map_builder ",[79,3406,1334],{"class":99},[79,3408,3409],{"class":106}," MAP_BUILDER,\n",[79,3411,3412,3415,3417],{"class":81,"line":164},[79,3413,3414],{"class":106},"  trajectory_builder ",[79,3416,1334],{"class":99},[79,3418,3419],{"class":106}," TRAJECTORY_BUILDER,\n",[79,3421,3422,3425,3427,3430,3433],{"class":81,"line":176},[79,3423,3424],{"class":106},"  map_frame ",[79,3426,1334],{"class":99},[79,3428,3429],{"class":89}," \"map\"",[79,3431,3432],{"class":106},",  ",[79,3434,3435],{"class":148},"-- 地图坐标系\n",[79,3437,3438,3441,3443,3446,3448],{"class":81,"line":181},[79,3439,3440],{"class":106},"  tracking_frame ",[79,3442,1334],{"class":99},[79,3444,3445],{"class":89}," \"base_link\"",[79,3447,1453],{"class":106},[79,3449,3450],{"class":148},"-- 跟踪的坐标系，可以是基坐标系、雷达或imu的坐标系\n",[79,3452,3453,3456,3458,3461,3463],{"class":81,"line":186},[79,3454,3455],{"class":106},"  published_frame ",[79,3457,1334],{"class":99},[79,3459,3460],{"class":89}," \"odom\"",[79,3462,1453],{"class":106},[79,3464,3465],{"class":148},"-- cartographer发布的位姿（pose）的坐标系\n",[79,3467,3468,3471,3473,3476,3478],{"class":81,"line":197},[79,3469,3470],{"class":106},"  odom_frame ",[79,3472,1334],{"class":99},[79,3474,3475],{"class":89}," \"carto_odom\"",[79,3477,3432],{"class":106},[79,3479,3480],{"class":148},"-- cartographer 计算后优化的里程计，并非机器人本身里程计\n",[79,3482,3483,3486,3488,3491,3493],{"class":81,"line":1346},[79,3484,3485],{"class":106},"  provide_odom_frame ",[79,3487,1334],{"class":99},[79,3489,3490],{"class":1215}," false",[79,3492,1453],{"class":106},[79,3494,3495],{"class":148},"-- 是否发布cartographer的里程计\n",[79,3497,3498,3501,3503,3506,3508],{"class":81,"line":1361},[79,3499,3500],{"class":106},"  publish_frame_projected_to_2d ",[79,3502,1334],{"class":99},[79,3504,3505],{"class":1215}," true",[79,3507,1453],{"class":106},[79,3509,3510],{"class":148},"-- 是否转换成2d(无俯仰、滚动的情况下为 true)\n",[79,3512,3513,3516,3518,3520,3522],{"class":81,"line":1366},[79,3514,3515],{"class":106},"  use_odometry ",[79,3517,1334],{"class":99},[79,3519,3505],{"class":1215},[79,3521,1453],{"class":106},[79,3523,3524],{"class":148},"-- 是否订阅里程计数据\n",[79,3526,3527,3530,3532,3534,3536],{"class":81,"line":1377},[79,3528,3529],{"class":106},"  use_nav_sat ",[79,3531,1334],{"class":99},[79,3533,3490],{"class":1215},[79,3535,1453],{"class":106},[79,3537,3538],{"class":148},"-- 是否订阅GPS\n",[79,3540,3541,3544,3546,3548,3550],{"class":81,"line":1386},[79,3542,3543],{"class":106},"  use_landmarks ",[79,3545,1334],{"class":99},[79,3547,3490],{"class":1215},[79,3549,1453],{"class":106},[79,3551,3552],{"class":148},"-- 是否订阅路标\n",[79,3554,3555,3558,3560,3563,3565],{"class":81,"line":1400},[79,3556,3557],{"class":106},"  num_laser_scans ",[79,3559,1334],{"class":99},[79,3561,3562],{"class":1215}," 1",[79,3564,1453],{"class":106},[79,3566,3567],{"class":148},"-- 订阅的雷达的数量\n",[79,3569,3570,3573,3575,3578,3580],{"class":81,"line":1413},[79,3571,3572],{"class":106},"  num_multi_echo_laser_scans ",[79,3574,1334],{"class":99},[79,3576,3577],{"class":1215}," 0",[79,3579,1453],{"class":106},[79,3581,3582],{"class":148},"-- 订阅的多层回波激光雷达数量\n",[79,3584,3585,3588,3590,3592,3594],{"class":81,"line":1423},[79,3586,3587],{"class":106},"  num_subdivisions_per_laser_scan ",[79,3589,1334],{"class":99},[79,3591,3562],{"class":1215},[79,3593,1453],{"class":106},[79,3595,3596],{"class":148},"-- 将激光雷达的数据拆分成多少部分发布\n",[79,3598,3599,3602,3604,3606,3608],{"class":81,"line":1431},[79,3600,3601],{"class":106},"  num_point_clouds ",[79,3603,1334],{"class":99},[79,3605,3577],{"class":1215},[79,3607,1453],{"class":106},[79,3609,3610],{"class":148},"-- 订阅多线激光雷达的数量\n",[79,3612,3613,3616,3618,3621,3623],{"class":81,"line":1447},[79,3614,3615],{"class":106},"  lookup_transform_timeout_sec ",[79,3617,1334],{"class":99},[79,3619,3620],{"class":1215}," 1.5",[79,3622,1453],{"class":106},[79,3624,3625],{"class":148},"-- 坐标变换超时时间\n",[79,3627,3628,3631,3633,3636,3638],{"class":81,"line":1461},[79,3629,3630],{"class":106},"  submap_publish_period_sec ",[79,3632,1334],{"class":99},[79,3634,3635],{"class":1215}," 0.5",[79,3637,1453],{"class":106},[79,3639,3640],{"class":148},"-- 发布子图的时间间隔\n",[79,3642,3643,3646,3648,3651,3653],{"class":81,"line":1473},[79,3644,3645],{"class":106},"  pose_publish_period_sec ",[79,3647,1334],{"class":99},[79,3649,3650],{"class":1215}," 5e-3",[79,3652,1453],{"class":106},[79,3654,3655],{"class":148},"-- 发布pose的时间间隔\n",[79,3657,3658,3661,3663,3666,3668],{"class":81,"line":1478},[79,3659,3660],{"class":106},"  trajectory_publish_period_sec ",[79,3662,1334],{"class":99},[79,3664,3665],{"class":1215}," 30e-3",[79,3667,1453],{"class":106},[79,3669,3670],{"class":148},"-- 发布轨迹的时间间隔\n",[79,3672,3673,3676,3678,3681,3683],{"class":81,"line":1489},[79,3674,3675],{"class":106},"  rangefinder_sampling_ratio ",[79,3677,1334],{"class":99},[79,3679,3680],{"class":1215}," 1.",[79,3682,1453],{"class":106},[79,3684,3685],{"class":148},"-- 雷达采样比例\n",[79,3687,3688,3691,3693,3696,3698],{"class":81,"line":1500},[79,3689,3690],{"class":106},"  odometry_sampling_ratio ",[79,3692,1334],{"class":99},[79,3694,3695],{"class":1215}," 0.8",[79,3697,1453],{"class":106},[79,3699,3700],{"class":148},"-- 里程计采样比例(如果里程计精度低，可以减小该设置值)\n",[79,3702,3703,3706,3708,3710,3712],{"class":81,"line":1506},[79,3704,3705],{"class":106},"  fixed_frame_pose_sampling_ratio ",[79,3707,1334],{"class":99},[79,3709,3680],{"class":1215},[79,3711,1453],{"class":106},[79,3713,3714],{"class":148},"-- 参考坐标系采样比例\n",[79,3716,3717,3720,3722,3724,3727],{"class":81,"line":1517},[79,3718,3719],{"class":106},"  imu_sampling_ratio ",[79,3721,1334],{"class":99},[79,3723,3680],{"class":1215},[79,3725,3726],{"class":106},",",[79,3728,3729],{"class":148},"-- imu采样比例\n",[79,3731,3732,3735,3737,3739,3741],{"class":81,"line":1523},[79,3733,3734],{"class":106},"  landmarks_sampling_ratio ",[79,3736,1334],{"class":99},[79,3738,3680],{"class":1215},[79,3740,1453],{"class":106},[79,3742,3743],{"class":148},"-- 路标采样比例\n",[79,3745,3746],{"class":81,"line":1536},[79,3747,3748],{"class":106},"}\n",[79,3750,3751],{"class":81,"line":1549},[79,3752,142],{"emptyLinePlaceholder":141},[79,3754,3755,3758,3761,3763,3765],{"class":81,"line":1561},[79,3756,3757],{"class":106},"MAP_BUILDER.",[79,3759,3760],{"class":85},"use_trajectory_builder_2d",[79,3762,3108],{"class":99},[79,3764,3505],{"class":1215},[79,3766,3767],{"class":148}," -- 启用2D轨迹构建器\n",[79,3769,3770],{"class":81,"line":1574},[79,3771,142],{"emptyLinePlaceholder":141},[79,3773,3774,3777,3780,3782,3785],{"class":81,"line":1579},[79,3775,3776],{"class":106},"TRAJECTORY_BUILDER_2D.",[79,3778,3779],{"class":85},"min_range",[79,3781,3108],{"class":99},[79,3783,3784],{"class":1215}," 0.15",[79,3786,3787],{"class":148}," -- 最小雷达有效距离\n",[79,3789,3790,3792,3795,3797,3800],{"class":81,"line":1590},[79,3791,3776],{"class":106},[79,3793,3794],{"class":85},"max_range",[79,3796,3108],{"class":99},[79,3798,3799],{"class":1215}," 6.0",[79,3801,3802],{"class":148}," -- 最大雷达有效距离\n",[79,3804,3805,3807,3810,3812,3815],{"class":81,"line":1595},[79,3806,3776],{"class":106},[79,3808,3809],{"class":85},"missing_data_ray_length",[79,3811,3108],{"class":99},[79,3813,3814],{"class":1215}," 3.",[79,3816,3817],{"class":148}," -- 缺失数据的射线长度\n",[79,3819,3820,3822,3825,3827,3829],{"class":81,"line":1601},[79,3821,3776],{"class":106},[79,3823,3824],{"class":85},"use_imu_data",[79,3826,3108],{"class":99},[79,3828,3490],{"class":1215},[79,3830,3831],{"class":148}," -- 是否使用 imu 数据\n",[79,3833,3834,3836,3839,3841,3843],{"class":81,"line":1607},[79,3835,3776],{"class":106},[79,3837,3838],{"class":85},"use_online_correlative_scan_matching",[79,3840,3108],{"class":99},[79,3842,3505],{"class":1215},[79,3844,3845],{"class":148}," -- 是否使用在线相关扫描匹配\n",[79,3847,3848,3850,3853,3855,3858,3860,3863,3866,3868,3871],{"class":81,"line":1613},[79,3849,3776],{"class":106},[79,3851,3852],{"class":85},"motion_filter",[79,3854,2348],{"class":106},[79,3856,3857],{"class":85},"max_angle_radians",[79,3859,3108],{"class":99},[79,3861,3862],{"class":1215}," math.rad",[79,3864,3865],{"class":106},"(",[79,3867,1985],{"class":1215},[79,3869,3870],{"class":106},") ",[79,3872,3873],{"class":148},"-- 运动滤波器的最大角度限制（以弧度为单位）\n",[79,3875,3876],{"class":81,"line":1618},[79,3877,142],{"emptyLinePlaceholder":141},[79,3879,3880,3883,3886,3888,3891,3893,3896],{"class":81,"line":2001},[79,3881,3882],{"class":106},"POSE_GRAPH.",[79,3884,3885],{"class":85},"constraint_builder",[79,3887,2348],{"class":106},[79,3889,3890],{"class":85},"min_score",[79,3892,3108],{"class":99},[79,3894,3895],{"class":1215}," 0.65",[79,3897,3898],{"class":148}," -- 建约束时的最小分数\n",[79,3900,3901,3903,3905,3907,3910,3912,3915],{"class":81,"line":2012},[79,3902,3882],{"class":106},[79,3904,3885],{"class":85},[79,3906,2348],{"class":106},[79,3908,3909],{"class":85},"global_localization_min_score",[79,3911,3108],{"class":99},[79,3913,3914],{"class":1215}," 0.7",[79,3916,3917],{"class":148}," -- 全局定位时的最小分数\n",[79,3919,3920],{"class":81,"line":2025},[79,3921,142],{"emptyLinePlaceholder":141},[79,3923,3924],{"class":81,"line":2039},[79,3925,3926],{"class":148},"-- POSE_GRAPH.optimize_every_n_nodes = 0\n",[79,3928,3929],{"class":81,"line":2052},[79,3930,142],{"emptyLinePlaceholder":141},[79,3932,3933,3936],{"class":81,"line":2066},[79,3934,3935],{"class":99},"return",[79,3937,3938],{"class":106}," options\n",[20,3940,2262],{},[311,3942,3943],{"start":138},[51,3944,2267],{},[20,3946,2270,3947,2274],{},[76,3948,2273],{},[70,3950,3951],{"className":2277,"code":2278,"language":2279,"meta":34,"style":34},[76,3952,3953,3959,3965],{"__ignoreMap":34},[79,3954,3955,3957],{"class":81,"line":82},[79,3956,2286],{"class":99},[79,3958,2289],{"class":106},[79,3960,3961,3963],{"class":81,"line":116},[79,3962,2294],{"class":106},[79,3964,2297],{"class":99},[79,3966,3967],{"class":81,"line":138},[79,3968,1343],{"class":106},[311,3970,3971],{"start":145},[51,3972,2306],{},[20,3974,2309],{},[70,3976,3978],{"className":72,"code":3977,"language":74,"meta":34,"style":34},"colcon build --packages-select mycar_slam_cartographer\n",[76,3979,3980],{"__ignoreMap":34},[79,3981,3982,3984,3986,3988],{"class":81,"line":82},[79,3983,2319],{"class":85},[79,3985,2322],{"class":89},[79,3987,2325],{"class":1215},[79,3989,3990],{"class":89}," mycar_slam_cartographer\n",[311,3992,3993],{"start":152},[51,3994,2333],{},[20,3996,3997],{},"（1）请先调用如下指令启动仿真环境：",[70,3999,4000],{"className":72,"code":2341,"language":74,"meta":34,"style":34},[76,4001,4002,4008],{"__ignoreMap":34},[79,4003,4004,4006],{"class":81,"line":82},[79,4005,2348],{"class":1215},[79,4007,2351],{"class":89},[79,4009,4010,4012,4014,4016],{"class":81,"line":116},[79,4011,1203],{"class":85},[79,4013,2358],{"class":89},[79,4015,2361],{"class":89},[79,4017,2364],{"class":89},[20,4019,4020],{},"（2）然后在终端下进入当前工作空间，输入如下指令：",[70,4022,4024],{"className":72,"code":4023,"language":74,"meta":34,"style":34},". install\u002Fsetup.bash\nros2 launch mycar_slam_cartographer cartographer.launch.py use_sim_time:=True\n",[76,4025,4026,4032],{"__ignoreMap":34},[79,4027,4028,4030],{"class":81,"line":82},[79,4029,2348],{"class":1215},[79,4031,2351],{"class":89},[79,4033,4034,4036,4038,4040,4043],{"class":81,"line":116},[79,4035,1203],{"class":85},[79,4037,2358],{"class":89},[79,4039,2997],{"class":89},[79,4041,4042],{"class":89}," cartographer.launch.py",[79,4044,2394],{"class":89},[20,4046,4047],{},"（3）启动rviz2，将Fixed Frame设置为map，添加map插件并将话题设置为\u002Fmap，即可显示创建的地图了，当机器人运动时，地图也会随之更新。",[20,4049,4050],{},[32,4051],{"alt":34,"src":4052},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1749.webp",[20,4054,4055],{},[32,4056],{"alt":34,"src":4057},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1750.webp",[20,4059,4060],{},[32,4061],{"alt":34,"src":4062},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1751.webp",[12,4064,4065],{"id":4065},"地图服务",[20,4067,4068,4069,4072],{},"SLAM建图时，地图数据是保存在内存中的，这也意味着，一旦节点关闭，数据也会一并被释放，而更合理的实现应该是将构建的地图序列化到的磁盘以持久化存储，并且后期还要通过反序列化读取磁盘的地图数据以做其他操作。在Nav2中已经已经封装好了地图序列化和反序列化的相关功能包，该包是：",[76,4070,4071],{},"nav2_map_server","。",[20,4074,4075,4076,4078,4079,4081,4082,2673,4085,4088,4089,4091,4092,4094],{},"在",[76,4077,4071],{},"中，可以通过话题和服务接口与Nav2系统的其余部分进行交互。",[76,4080,4071],{},"包下有两个重要的节点，分别是",[76,4083,4084],{},"map_saver_cli",[76,4086,4087],{},"map_server","，通过",[76,4090,4084],{},"节点则可以保存地图，而",[76,4093,4087],{},"节点则可以在启动时显示地图。",[16,4096,4098],{"id":4097},"保存地图序列化","保存地图(序列化)",[4100,4101,4102],"h5",{"id":4102},"地图保存节点说明",[20,4104,4075,4105,4107,4108,4111],{},[76,4106,4071],{},"中的地图保存节点是",[76,4109,4110],{},"map_saver_server","，该节点相关信息如下。",[311,4113,4114],{},[51,4115,531],{},[533,4117,4118,4129],{},[536,4119,4120],{},[539,4121,4122,4124,4127],{},[542,4123,545],{"align":544},[542,4125,4126],{"align":544},"接口",[542,4128,551],{"align":544},[553,4130,4131],{},[539,4132,4133,4135,4137],{},[558,4134,685],{"align":544},[558,4136,688],{"align":544},[558,4138,4139],{"align":544},"SLAM节点发布的地图数据",[311,4141,4142],{"start":116},[51,4143,825],{},[48,4145,4146,4152,4158,4164],{},[51,4147,4148,4151],{},[23,4149,4150],{},"save_map_timeout","  保存地图操作的最大等待时间。",[51,4153,4154,4157],{},[23,4155,4156],{},"free_thresh_default","  栅格单元被认为未被占用的概率阈值。",[51,4159,4160,4163],{},[23,4161,4162],{},"occupied_thresh_default","  栅格单元被认为占用的概率阈值。",[51,4165,4166,4169],{},[23,4167,4168],{},"map_subscribe_transient_local","  节点重启后消息不保留，默认为 true。",[311,4171,4172],{"start":138},[51,4173,4084],{},[20,4175,4176,4177,4179,4180,4182,4183,4185],{},"另外，而为了便于使用，在",[76,4178,4110],{},"的基础之上还封装了一个名为",[76,4181,4084],{},"的可执行程序，它可以以实参的方式更方便的设置地图保存相关数据，并且后续执行时也是调用",[76,4184,4084],{},"，其实参列表如下：",[48,4187,4188,4194,4200,4206,4212,4218],{},[51,4189,4190,4193],{},[23,4191,4192],{},"-t"," 订阅的地图话题。",[51,4195,4196,4199],{},[23,4197,4198],{},"-f"," 地图存储路径。",[51,4201,4202,4205],{},[23,4203,4204],{},"--occ"," 栅格单元被认为占用的概率阈值。",[51,4207,4208,4211],{},[23,4209,4210],{},"--free"," 栅格单元被认为未被占用的概率阈值。",[51,4213,4214,4217],{},[23,4215,4216],{},"--fmt"," 图片格式。",[51,4219,4220,4223],{},[23,4221,4222],{},"--mode"," 地图模式，trinary(默认)或scale或raw。",[4100,4225,4226],{"id":4226},"地图保存基本操作",[20,4228,4229],{},[23,4230,1190],{},[20,4232,4233],{},"请先启动仿真或实体机器人，然后启动SLAM相关节点，实现基本的建图功能。",[20,4235,4236],{},[23,4237,4238],{},"保存地图",[20,4240,4241],{},"SLAM建图完毕，在终端下进入工作空间，调用如下指令保存地图：",[70,4243,4245],{"className":72,"code":4244,"language":74,"meta":34,"style":34},"ros2 run nav2_map_server map_saver_cli -f map\u002Fmy_map\n",[76,4246,4247],{"__ignoreMap":34},[79,4248,4249,4251,4254,4257,4260,4263],{"class":81,"line":82},[79,4250,1203],{"class":85},[79,4252,4253],{"class":89}," run",[79,4255,4256],{"class":89}," nav2_map_server",[79,4258,4259],{"class":89}," map_saver_cli",[79,4261,4262],{"class":1215}," -f",[79,4264,4265],{"class":89}," map\u002Fmy_map\n",[20,4267,4268,4269,4273,4274,2673,4277,4072],{},"上述指令将订阅\u002Fmap话题，并把\u002Fmap话题里的数据保存为文件，在工作空间下的map目录(",[4270,4271,4272],"em",{},"需要自行创建该目录，否则将会抛出异常",")中，生成两个文件，分别名为：",[76,4275,4276],{},"my_map.yaml",[76,4278,4279],{},"my_map.pgm",[20,4281,4282],{},[32,4283],{"alt":34,"src":4284},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1752.webp",[20,4286,4287],{},[32,4288],{"alt":34,"src":4289},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1753.webp",[4100,4291,4292],{"id":4292},"地图接口",[20,4294,4295],{},"在Nav2中地图相关的接口主要有两个：",[48,4297,4298,4304],{},[51,4299,4300,4303],{},[23,4301,4302],{},"nav_msgs\u002Fmsg\u002FMapMetaData"," 地图元数据，包括地图的宽度、高度、分辨率等。",[51,4305,4306,4308],{},[23,4307,688],{}," 地图栅格数据，一般会在rviz中以图形化的方式显示。",[20,4310,4311],{},[23,4312,4302],{},[20,4314,4315,4316,4319],{},"调用指令",[76,4317,4318],{},"ros2 interface show nav_msgs\u002Fmsg\u002FMapMetaData","查看接口格式，显示如下内容（注释已汉化）：",[70,4321,4323],{"className":72,"code":4322,"language":74,"meta":34,"style":34},"\n# 它包含了关于OccupancyGrid特性的基本信息\n\n# 地图加载时间\nbuiltin_interfaces\u002FTime map_load_time\n        int32 sec\n        uint32 nanosec\n\n# 地图分辨率 [米\u002F像素]\nfloat32 resolution\n\n# 地图宽度 [像素]\nuint32 width\n\n# 地图高度 [像素]\nuint32 height\n\n#地图的原点坐标[米，米，弧度]。这是地图中单元格(0,0)左下角在现实世界中的位置和方向。\ngeometry_msgs\u002FPose origin\n        Point position\n                float64 x\n                float64 y\n                float64 z\n        Quaternion orientation\n                float64 x 0\n                float64 y 0\n                float64 z 0\n                float64 w 1\n",[76,4324,4325,4329,4334,4338,4343,4351,4359,4367,4371,4376,4384,4388,4393,4401,4405,4410,4417,4421,4426,4434,4442,4450,4457,4464,4472,4482,4491,4500],{"__ignoreMap":34},[79,4326,4327],{"class":81,"line":82},[79,4328,142],{"emptyLinePlaceholder":141},[79,4330,4331],{"class":81,"line":116},[79,4332,4333],{"class":148},"# 它包含了关于OccupancyGrid特性的基本信息\n",[79,4335,4336],{"class":81,"line":138},[79,4337,142],{"emptyLinePlaceholder":141},[79,4339,4340],{"class":81,"line":145},[79,4341,4342],{"class":148},"# 地图加载时间\n",[79,4344,4345,4348],{"class":81,"line":152},[79,4346,4347],{"class":85},"builtin_interfaces\u002FTime",[79,4349,4350],{"class":89}," map_load_time\n",[79,4352,4353,4356],{"class":81,"line":164},[79,4354,4355],{"class":85},"        int32",[79,4357,4358],{"class":89}," sec\n",[79,4360,4361,4364],{"class":81,"line":176},[79,4362,4363],{"class":85},"        uint32",[79,4365,4366],{"class":89}," nanosec\n",[79,4368,4369],{"class":81,"line":181},[79,4370,142],{"emptyLinePlaceholder":141},[79,4372,4373],{"class":81,"line":186},[79,4374,4375],{"class":148},"# 地图分辨率 [米\u002F像素]\n",[79,4377,4378,4381],{"class":81,"line":197},[79,4379,4380],{"class":85},"float32",[79,4382,4383],{"class":89}," resolution\n",[79,4385,4386],{"class":81,"line":1346},[79,4387,142],{"emptyLinePlaceholder":141},[79,4389,4390],{"class":81,"line":1361},[79,4391,4392],{"class":148},"# 地图宽度 [像素]\n",[79,4394,4395,4398],{"class":81,"line":1366},[79,4396,4397],{"class":85},"uint32",[79,4399,4400],{"class":89}," width\n",[79,4402,4403],{"class":81,"line":1377},[79,4404,142],{"emptyLinePlaceholder":141},[79,4406,4407],{"class":81,"line":1386},[79,4408,4409],{"class":148},"# 地图高度 [像素]\n",[79,4411,4412,4414],{"class":81,"line":1400},[79,4413,4397],{"class":85},[79,4415,4416],{"class":89}," height\n",[79,4418,4419],{"class":81,"line":1413},[79,4420,142],{"emptyLinePlaceholder":141},[79,4422,4423],{"class":81,"line":1423},[79,4424,4425],{"class":148},"#地图的原点坐标[米，米，弧度]。这是地图中单元格(0,0)左下角在现实世界中的位置和方向。\n",[79,4427,4428,4431],{"class":81,"line":1431},[79,4429,4430],{"class":85},"geometry_msgs\u002FPose",[79,4432,4433],{"class":89}," origin\n",[79,4435,4436,4439],{"class":81,"line":1447},[79,4437,4438],{"class":85},"        Point",[79,4440,4441],{"class":89}," position\n",[79,4443,4444,4447],{"class":81,"line":1461},[79,4445,4446],{"class":85},"                float64",[79,4448,4449],{"class":89}," x\n",[79,4451,4452,4454],{"class":81,"line":1473},[79,4453,4446],{"class":85},[79,4455,4456],{"class":89}," y\n",[79,4458,4459,4461],{"class":81,"line":1478},[79,4460,4446],{"class":85},[79,4462,4463],{"class":89}," z\n",[79,4465,4466,4469],{"class":81,"line":1489},[79,4467,4468],{"class":85},"        Quaternion",[79,4470,4471],{"class":89}," orientation\n",[79,4473,4474,4476,4479],{"class":81,"line":1500},[79,4475,4446],{"class":85},[79,4477,4478],{"class":89}," x",[79,4480,4481],{"class":1215}," 0\n",[79,4483,4484,4486,4489],{"class":81,"line":1506},[79,4485,4446],{"class":85},[79,4487,4488],{"class":89}," y",[79,4490,4481],{"class":1215},[79,4492,4493,4495,4498],{"class":81,"line":1517},[79,4494,4446],{"class":85},[79,4496,4497],{"class":89}," z",[79,4499,4481],{"class":1215},[79,4501,4502,4504,4507],{"class":81,"line":1523},[79,4503,4446],{"class":85},[79,4505,4506],{"class":89}," w",[79,4508,4509],{"class":1215}," 1\n",[20,4511,4512],{},[23,4513,688],{},[20,4515,4315,4516,4319],{},[76,4517,4518],{},"ros2 interface show nav_msgs\u002Fmsg\u002FOccupancyGrid",[70,4520,4522],{"className":72,"code":4521,"language":74,"meta":34,"style":34},"\n# 它代表一个二维网格地图。\nstd_msgs\u002FHeader header\n        builtin_interfaces\u002FTime stamp\n                int32 sec\n                uint32 nanosec\n        string frame_id\n\n# 地图元数据\nMapMetaData info\n        builtin_interfaces\u002FTime map_load_time\n                int32 sec\n                uint32 nanosec\n        float32 resolution\n        uint32 width\n        uint32 height\n        geometry_msgs\u002FPose origin\n                Point position\n                        float64 x\n                        float64 y\n                        float64 z\n                Quaternion orientation\n                        float64 x 0\n                        float64 y 0\n                        float64 z 0\n                        float64 w 1\n\n# 地图数据按照行优先的顺序进行排列，\n\n# 这意味着首先填充第一行的所有单元格，\n\n# 然后填充第二行，依此类推。\n\n# 起始单元格是(0,0)，也就是地图的左上角。\n\n# 单元格(1, 0)紧接着(0,0)，是x方向上紧邻的下一个单元格。\n\n# 而单元格(0, 1)则位于第一行的第二个位置，其索引等于地图的宽度（info.width），\n\n# 然后才是(1, 1)单元格，即第二行的第二个单元格。\n\n# 关于地图数据的值，它们根据具体的应用需求来定义。但在很多情况下，\n\n# 会使用0表示该单元格是未占用的，即机器人可以安全通过；\n\n# 1表示该单元格是确定占用的，即存在障碍物；\n\n# 而-1表示该单元格的状态是未知的，即机器人尚未探测到该区域的状态。\nint8[] data\n",[76,4523,4524,4528,4533,4541,4549,4556,4563,4571,4575,4580,4588,4594,4600,4606,4613,4619,4625,4632,4639,4646,4652,4658,4665,4673,4681,4689,4697,4701,4706,4710,4715,4719,4724,4728,4733,4737,4742,4746,4751,4755,4760,4764,4769,4773,4778,4782,4787,4791,4796],{"__ignoreMap":34},[79,4525,4526],{"class":81,"line":82},[79,4527,142],{"emptyLinePlaceholder":141},[79,4529,4530],{"class":81,"line":116},[79,4531,4532],{"class":148},"# 它代表一个二维网格地图。\n",[79,4534,4535,4538],{"class":81,"line":138},[79,4536,4537],{"class":85},"std_msgs\u002FHeader",[79,4539,4540],{"class":89}," header\n",[79,4542,4543,4546],{"class":81,"line":145},[79,4544,4545],{"class":85},"        builtin_interfaces\u002FTime",[79,4547,4548],{"class":89}," stamp\n",[79,4550,4551,4554],{"class":81,"line":152},[79,4552,4553],{"class":85},"                int32",[79,4555,4358],{"class":89},[79,4557,4558,4561],{"class":81,"line":164},[79,4559,4560],{"class":85},"                uint32",[79,4562,4366],{"class":89},[79,4564,4565,4568],{"class":81,"line":176},[79,4566,4567],{"class":85},"        string",[79,4569,4570],{"class":89}," frame_id\n",[79,4572,4573],{"class":81,"line":181},[79,4574,142],{"emptyLinePlaceholder":141},[79,4576,4577],{"class":81,"line":186},[79,4578,4579],{"class":148},"# 地图元数据\n",[79,4581,4582,4585],{"class":81,"line":197},[79,4583,4584],{"class":85},"MapMetaData",[79,4586,4587],{"class":89}," info\n",[79,4589,4590,4592],{"class":81,"line":1346},[79,4591,4545],{"class":85},[79,4593,4350],{"class":89},[79,4595,4596,4598],{"class":81,"line":1361},[79,4597,4553],{"class":85},[79,4599,4358],{"class":89},[79,4601,4602,4604],{"class":81,"line":1366},[79,4603,4560],{"class":85},[79,4605,4366],{"class":89},[79,4607,4608,4611],{"class":81,"line":1377},[79,4609,4610],{"class":85},"        float32",[79,4612,4383],{"class":89},[79,4614,4615,4617],{"class":81,"line":1386},[79,4616,4363],{"class":85},[79,4618,4400],{"class":89},[79,4620,4621,4623],{"class":81,"line":1400},[79,4622,4363],{"class":85},[79,4624,4416],{"class":89},[79,4626,4627,4630],{"class":81,"line":1413},[79,4628,4629],{"class":85},"        geometry_msgs\u002FPose",[79,4631,4433],{"class":89},[79,4633,4634,4637],{"class":81,"line":1423},[79,4635,4636],{"class":85},"                Point",[79,4638,4441],{"class":89},[79,4640,4641,4644],{"class":81,"line":1431},[79,4642,4643],{"class":85},"                        float64",[79,4645,4449],{"class":89},[79,4647,4648,4650],{"class":81,"line":1447},[79,4649,4643],{"class":85},[79,4651,4456],{"class":89},[79,4653,4654,4656],{"class":81,"line":1461},[79,4655,4643],{"class":85},[79,4657,4463],{"class":89},[79,4659,4660,4663],{"class":81,"line":1473},[79,4661,4662],{"class":85},"                Quaternion",[79,4664,4471],{"class":89},[79,4666,4667,4669,4671],{"class":81,"line":1478},[79,4668,4643],{"class":85},[79,4670,4478],{"class":89},[79,4672,4481],{"class":1215},[79,4674,4675,4677,4679],{"class":81,"line":1489},[79,4676,4643],{"class":85},[79,4678,4488],{"class":89},[79,4680,4481],{"class":1215},[79,4682,4683,4685,4687],{"class":81,"line":1500},[79,4684,4643],{"class":85},[79,4686,4497],{"class":89},[79,4688,4481],{"class":1215},[79,4690,4691,4693,4695],{"class":81,"line":1506},[79,4692,4643],{"class":85},[79,4694,4506],{"class":89},[79,4696,4509],{"class":1215},[79,4698,4699],{"class":81,"line":1517},[79,4700,142],{"emptyLinePlaceholder":141},[79,4702,4703],{"class":81,"line":1523},[79,4704,4705],{"class":148},"# 地图数据按照行优先的顺序进行排列，\n",[79,4707,4708],{"class":81,"line":1536},[79,4709,142],{"emptyLinePlaceholder":141},[79,4711,4712],{"class":81,"line":1549},[79,4713,4714],{"class":148},"# 这意味着首先填充第一行的所有单元格，\n",[79,4716,4717],{"class":81,"line":1561},[79,4718,142],{"emptyLinePlaceholder":141},[79,4720,4721],{"class":81,"line":1574},[79,4722,4723],{"class":148},"# 然后填充第二行，依此类推。\n",[79,4725,4726],{"class":81,"line":1579},[79,4727,142],{"emptyLinePlaceholder":141},[79,4729,4730],{"class":81,"line":1590},[79,4731,4732],{"class":148},"# 起始单元格是(0,0)，也就是地图的左上角。\n",[79,4734,4735],{"class":81,"line":1595},[79,4736,142],{"emptyLinePlaceholder":141},[79,4738,4739],{"class":81,"line":1601},[79,4740,4741],{"class":148},"# 单元格(1, 0)紧接着(0,0)，是x方向上紧邻的下一个单元格。\n",[79,4743,4744],{"class":81,"line":1607},[79,4745,142],{"emptyLinePlaceholder":141},[79,4747,4748],{"class":81,"line":1613},[79,4749,4750],{"class":148},"# 而单元格(0, 1)则位于第一行的第二个位置，其索引等于地图的宽度（info.width），\n",[79,4752,4753],{"class":81,"line":1618},[79,4754,142],{"emptyLinePlaceholder":141},[79,4756,4757],{"class":81,"line":2001},[79,4758,4759],{"class":148},"# 然后才是(1, 1)单元格，即第二行的第二个单元格。\n",[79,4761,4762],{"class":81,"line":2012},[79,4763,142],{"emptyLinePlaceholder":141},[79,4765,4766],{"class":81,"line":2025},[79,4767,4768],{"class":148},"# 关于地图数据的值，它们根据具体的应用需求来定义。但在很多情况下，\n",[79,4770,4771],{"class":81,"line":2039},[79,4772,142],{"emptyLinePlaceholder":141},[79,4774,4775],{"class":81,"line":2052},[79,4776,4777],{"class":148},"# 会使用0表示该单元格是未占用的，即机器人可以安全通过；\n",[79,4779,4780],{"class":81,"line":2066},[79,4781,142],{"emptyLinePlaceholder":141},[79,4783,4784],{"class":81,"line":2077},[79,4785,4786],{"class":148},"# 1表示该单元格是确定占用的，即存在障碍物；\n",[79,4788,4789],{"class":81,"line":2082},[79,4790,142],{"emptyLinePlaceholder":141},[79,4792,4793],{"class":81,"line":2092},[79,4794,4795],{"class":148},"# 而-1表示该单元格的状态是未知的，即机器人尚未探测到该区域的状态。\n",[79,4797,4798,4801],{"class":81,"line":2103},[79,4799,4800],{"class":85},"int8[]",[79,4802,4803],{"class":89}," data\n",[4100,4805,4806],{"id":4806},"地图存储格式",[20,4808,4809,4810,4812],{},"在 ",[23,4811,4226],{},"  一节中，地图保存后后生成两个文件，这两个文件就是用来存储序列化后的地图数据的。其中，my_map.pgm是一张图片资源，使用图片查看程序打开即可，而my_map.yaml保存的是地图的元数据信息，用于描述图片，内容格式如下：",[70,4814,4816],{"className":1637,"code":4815,"language":1639,"meta":34,"style":34},"image: my_map.pgm\nmode: trinary\nresolution: 0.05\norigin: [-0.955, -10.9, 0]\nnegate: 0\noccupied_thresh: 0.65\nfree_thresh: 0.25\n",[76,4817,4818,4828,4837,4845,4869,4879,4889],{"__ignoreMap":34},[79,4819,4820,4823,4825],{"class":81,"line":82},[79,4821,4822],{"class":1646},"image",[79,4824,1664],{"class":106},[79,4826,4827],{"class":89},"my_map.pgm\n",[79,4829,4830,4832,4834],{"class":81,"line":116},[79,4831,873],{"class":1646},[79,4833,1664],{"class":106},[79,4835,4836],{"class":89},"trinary\n",[79,4838,4839,4841,4843],{"class":81,"line":138},[79,4840,980],{"class":1646},[79,4842,1664],{"class":106},[79,4844,1850],{"class":1215},[79,4846,4847,4850,4853,4856,4858,4861,4863,4866],{"class":81,"line":145},[79,4848,4849],{"class":1646},"origin",[79,4851,4852],{"class":106},": [",[79,4854,4855],{"class":1215},"-0.955",[79,4857,1453],{"class":106},[79,4859,4860],{"class":1215},"-10.9",[79,4862,1453],{"class":106},[79,4864,4865],{"class":1215},"0",[79,4867,4868],{"class":106},"]\n",[79,4870,4871,4874,4876],{"class":81,"line":152},[79,4872,4873],{"class":1646},"negate",[79,4875,1664],{"class":106},[79,4877,4878],{"class":1215},"0\n",[79,4880,4881,4884,4886],{"class":81,"line":164},[79,4882,4883],{"class":1646},"occupied_thresh",[79,4885,1664],{"class":106},[79,4887,4888],{"class":1215},"0.65\n",[79,4890,4891,4894,4896],{"class":81,"line":176},[79,4892,4893],{"class":1646},"free_thresh",[79,4895,1664],{"class":106},[79,4897,4898],{"class":1215},"0.25\n",[20,4900,4901],{},[23,4902,4903],{},"参数解释：",[48,4905,4906,4911,4916,4921,4926,4931,4936],{},[51,4907,4908,4910],{},[23,4909,4822],{},"  被描述的图片资源路径，可以是绝对路径也可以是相对路径。",[51,4912,4913,4915],{},[23,4914,980],{}," 图片分片率(单位: m\u002F像素)。",[51,4917,4918,4920],{},[23,4919,4849],{}," 地图中左下像素的二维姿态，为（x，y，z），偏航为逆时针旋转（偏航=0 表示无旋转）。",[51,4922,4923,4925],{},[23,4924,4883],{}," 占用概率大于此阈值的像素被视为完全占用。",[51,4927,4928,4930],{},[23,4929,4893],{}," 占用率小于此阈值的像素被视为完全空闲。",[51,4932,4933,4935],{},[23,4934,4873],{}," 是否应该颠倒白色\u002F黑色 自由\u002F占用的语义。",[51,4937,4938,4940],{},[23,4939,873],{},"  地图模式，trinary(默认)或scale或raw。",[16,4942,4944],{"id":4943},"读取地图反序列化","读取地图(反序列化)",[4100,4946,4947],{"id":4947},"地图读取节点说明",[20,4949,4075,4950,4952,4953,4111],{},[76,4951,4071],{},"中的地图读取节点是",[76,4954,4087],{},[20,4956,4957],{},[23,4958,666],{},[533,4960,4961,4971],{},[536,4962,4963],{},[539,4964,4965,4967,4969],{},[542,4966,545],{"align":544},[542,4968,4126],{"align":544},[542,4970,551],{"align":544},[553,4972,4973],{},[539,4974,4975,4977,4979],{},[558,4976,685],{"align":544},[558,4978,688],{"align":544},[558,4980,4981],{"align":544},"地图数据",[20,4983,4984],{},[23,4985,825],{},[48,4987,4988,4994,5000],{},[51,4989,4990,4993],{},[23,4991,4992],{},"frame_id","  地图坐标系名称。",[51,4995,4996,4999],{},[23,4997,4998],{},"topic_name","  话题名称。",[51,5001,5002,5005],{},[23,5003,5004],{},"yaml_filename","  地图数据源。",[4100,5007,5008],{"id":5008},"地图读取基本操作",[20,5010,5011],{},[23,5012,1190],{},[20,5014,5015],{},"请先调用如下指令在工作空间的src目录下创建一个功能包：",[70,5017,5019],{"className":72,"code":5018,"language":74,"meta":34,"style":34},"ros2 pkg create mycar_map_server --dependencies nav2_map_server\n",[76,5020,5021],{"__ignoreMap":34},[79,5022,5023,5025,5027,5029,5032,5034],{"class":81,"line":82},[79,5024,1203],{"class":85},[79,5026,1206],{"class":89},[79,5028,1209],{"class":89},[79,5030,5031],{"class":89}," mycar_map_server",[79,5033,1216],{"class":1215},[79,5035,5036],{"class":89}," nav2_map_server\n",[20,5038,5039],{},"在功能包下，新建launch文件夹，并在CMakeLists.txt中添加如下配置：",[70,5041,5043],{"className":2277,"code":5042,"language":2279,"meta":34,"style":34},"install(DIRECTORY launch DESTINATION share\u002F${PROJECT_NAME})\n",[76,5044,5045],{"__ignoreMap":34},[79,5046,5047,5049,5052,5055],{"class":81,"line":82},[79,5048,2286],{"class":99},[79,5050,5051],{"class":106},"(DIRECTORY launch DESTINATION share\u002F",[79,5053,5054],{"class":99},"${PROJECT_NAME}",[79,5056,1343],{"class":106},[20,5058,5059],{},[32,5060],{"alt":34,"src":5061},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1754.webp",[20,5063,5064],{},[23,5065,5066],{},"读取地图",[20,5068,5069,5070,5072],{},"使用",[76,5071,4087],{},"读取地图时，常用的方式有两种，分别是使用终端指令与launch文件集成。两种方式效果一致，都可以以话题的方式发布地图消息。",[70,5074,5076],{"className":72,"code":5075,"language":74,"meta":34,"style":34},"colcon build\nsource .\u002Finstall\u002Fsetup.bash\n",[76,5077,5078,5085],{"__ignoreMap":34},[79,5079,5080,5082],{"class":81,"line":82},[79,5081,2319],{"class":85},[79,5083,5084],{"class":89}," build\n",[79,5086,5087,5090],{"class":81,"line":116},[79,5088,5089],{"class":1215},"source",[79,5091,5092],{"class":89}," .\u002Finstall\u002Fsetup.bash\n",[20,5094,5095],{},[23,5096,5097],{},"方式1：终端指令",[20,5099,5100],{},"请在终端下进入工作空间，输入如下指令：",[70,5102,5104],{"className":72,"code":5103,"language":74,"meta":34,"style":34},"ros2 run nav2_map_server map_server --ros-args -p yaml_filename:=map\u002Fmy_map.yaml\n",[76,5105,5106],{"__ignoreMap":34},[79,5107,5108,5110,5112,5114,5117,5120,5123],{"class":81,"line":82},[79,5109,1203],{"class":85},[79,5111,4253],{"class":89},[79,5113,4256],{"class":89},[79,5115,5116],{"class":89}," map_server",[79,5118,5119],{"class":1215}," --ros-args",[79,5121,5122],{"class":1215}," -p",[79,5124,5125],{"class":89}," yaml_filename:=map\u002Fmy_map.yaml\n",[20,5127,5128,5129,5131],{},"由于",[76,5130,4087],{},"是具有生命周期的节点，所以接下来还需要对节点进行配置和激活，请新开终端执行如下指令：",[70,5133,5135],{"className":72,"code":5134,"language":74,"meta":34,"style":34},"ros2 lifecycle set \u002Fmap_server configure\nros2 lifecycle set \u002Fmap_server activate\n",[76,5136,5137,5153],{"__ignoreMap":34},[79,5138,5139,5141,5144,5147,5150],{"class":81,"line":82},[79,5140,1203],{"class":85},[79,5142,5143],{"class":89}," lifecycle",[79,5145,5146],{"class":89}," set",[79,5148,5149],{"class":89}," \u002Fmap_server",[79,5151,5152],{"class":89}," configure\n",[79,5154,5155,5157,5159,5161,5163],{"class":81,"line":116},[79,5156,1203],{"class":85},[79,5158,5143],{"class":89},[79,5160,5146],{"class":89},[79,5162,5149],{"class":89},[79,5164,5165],{"class":89}," activate\n",[20,5167,5168,5169,5172,5173,5175],{},"执行完毕若无异常，再调用",[76,5170,5171],{},"ros2 topic list","即可查看到",[76,5174,685],{},"话题了，说明地图消息已经被发布了。",[20,5177,5178],{},[23,5179,5180],{},"方式2：launch集成",[20,5182,5183,5184,5186,5187,5190],{},"方式1需要手动设置",[76,5185,4087],{},"生命周期，步骤稍显繁琐，因此，我们还可以将该节点集成进launch文件，以简化启动步骤。在launch目录下新建名为",[76,5188,5189],{},"map_server.launch.py","的文件，并输入如下内容：",[70,5192,5194],{"className":1234,"code":5193,"language":1236,"meta":34,"style":34},"import os\nfrom launch import LaunchDescription\nfrom launch_ros.actions import Node\ndef generate_launch_description():\n  map_file = os.path.join('map', 'my_map.yaml')\n  map_server_node = Node(\n      package='nav2_map_server',\n      executable='map_server',\n      name='map_server',\n      output='screen',\n      parameters=[{'use_sim_time': True},\n                  {'yaml_filename':map_file}]\n  )\n  manager_mapper_node = Node(\n    package='nav2_lifecycle_manager',\n    executable='lifecycle_manager',\n    name='lifecycle_manager_mapper',\n    output='screen',\n    parameters=[{'use_sim_time': True},\n      {'autostart': True},\n      {'node_names': ['map_server']}]\n  )\n  return LaunchDescription([map_server_node,manager_mapper_node])\n",[76,5195,5196,5202,5212,5222,5230,5250,5259,5271,5283,5294,5305,5325,5336,5341,5350,5362,5374,5386,5397,5414,5428,5442,5446],{"__ignoreMap":34},[79,5197,5198,5200],{"class":81,"line":82},[79,5199,1243],{"class":99},[79,5201,1246],{"class":106},[79,5203,5204,5206,5208,5210],{"class":81,"line":116},[79,5205,1255],{"class":99},[79,5207,1258],{"class":106},[79,5209,1243],{"class":99},[79,5211,1263],{"class":106},[79,5213,5214,5216,5218,5220],{"class":81,"line":138},[79,5215,1255],{"class":99},[79,5217,1294],{"class":106},[79,5219,1243],{"class":99},[79,5221,1299],{"class":106},[79,5223,5224,5226,5228],{"class":81,"line":145},[79,5225,1320],{"class":99},[79,5227,1323],{"class":85},[79,5229,1326],{"class":106},[79,5231,5232,5235,5237,5240,5243,5245,5248],{"class":81,"line":152},[79,5233,5234],{"class":106},"  map_file ",[79,5236,1334],{"class":99},[79,5238,5239],{"class":106}," os.path.join(",[79,5241,5242],{"class":89},"'map'",[79,5244,1453],{"class":106},[79,5246,5247],{"class":89},"'my_map.yaml'",[79,5249,1343],{"class":106},[79,5251,5252,5255,5257],{"class":81,"line":164},[79,5253,5254],{"class":106},"  map_server_node ",[79,5256,1334],{"class":99},[79,5258,1486],{"class":106},[79,5260,5261,5264,5266,5269],{"class":81,"line":176},[79,5262,5263],{"class":1389},"      package",[79,5265,1334],{"class":99},[79,5267,5268],{"class":89},"'nav2_map_server'",[79,5270,1383],{"class":106},[79,5272,5273,5276,5278,5281],{"class":81,"line":181},[79,5274,5275],{"class":1389},"      executable",[79,5277,1334],{"class":99},[79,5279,5280],{"class":89},"'map_server'",[79,5282,1383],{"class":106},[79,5284,5285,5288,5290,5292],{"class":81,"line":186},[79,5286,5287],{"class":1389},"      name",[79,5289,1334],{"class":99},[79,5291,5280],{"class":89},[79,5293,1383],{"class":106},[79,5295,5296,5299,5301,5303],{"class":81,"line":197},[79,5297,5298],{"class":1389},"      output",[79,5300,1334],{"class":99},[79,5302,1569],{"class":89},[79,5304,1383],{"class":106},[79,5306,5307,5310,5312,5315,5317,5319,5322],{"class":81,"line":1346},[79,5308,5309],{"class":1389},"      parameters",[79,5311,1334],{"class":99},[79,5313,5314],{"class":106},"[{",[79,5316,1340],{"class":89},[79,5318,1664],{"class":106},[79,5320,5321],{"class":1215},"True",[79,5323,5324],{"class":106},"},\n",[79,5326,5327,5330,5333],{"class":81,"line":1361},[79,5328,5329],{"class":106},"                  {",[79,5331,5332],{"class":89},"'yaml_filename'",[79,5334,5335],{"class":106},":map_file}]\n",[79,5337,5338],{"class":81,"line":1366},[79,5339,5340],{"class":106},"  )\n",[79,5342,5343,5346,5348],{"class":81,"line":1377},[79,5344,5345],{"class":106},"  manager_mapper_node ",[79,5347,1334],{"class":99},[79,5349,1486],{"class":106},[79,5351,5352,5355,5357,5360],{"class":81,"line":1386},[79,5353,5354],{"class":1389},"    package",[79,5356,1334],{"class":99},[79,5358,5359],{"class":89},"'nav2_lifecycle_manager'",[79,5361,1383],{"class":106},[79,5363,5364,5367,5369,5372],{"class":81,"line":1400},[79,5365,5366],{"class":1389},"    executable",[79,5368,1334],{"class":99},[79,5370,5371],{"class":89},"'lifecycle_manager'",[79,5373,1383],{"class":106},[79,5375,5376,5379,5381,5384],{"class":81,"line":1413},[79,5377,5378],{"class":1389},"    name",[79,5380,1334],{"class":99},[79,5382,5383],{"class":89},"'lifecycle_manager_mapper'",[79,5385,1383],{"class":106},[79,5387,5388,5391,5393,5395],{"class":81,"line":1423},[79,5389,5390],{"class":1389},"    output",[79,5392,1334],{"class":99},[79,5394,1569],{"class":89},[79,5396,1383],{"class":106},[79,5398,5399,5402,5404,5406,5408,5410,5412],{"class":81,"line":1431},[79,5400,5401],{"class":1389},"    parameters",[79,5403,1334],{"class":99},[79,5405,5314],{"class":106},[79,5407,1340],{"class":89},[79,5409,1664],{"class":106},[79,5411,5321],{"class":1215},[79,5413,5324],{"class":106},[79,5415,5416,5419,5422,5424,5426],{"class":81,"line":1447},[79,5417,5418],{"class":106},"      {",[79,5420,5421],{"class":89},"'autostart'",[79,5423,1664],{"class":106},[79,5425,5321],{"class":1215},[79,5427,5324],{"class":106},[79,5429,5430,5432,5435,5437,5439],{"class":81,"line":1461},[79,5431,5418],{"class":106},[79,5433,5434],{"class":89},"'node_names'",[79,5436,4852],{"class":106},[79,5438,5280],{"class":89},[79,5440,5441],{"class":106},"]}]\n",[79,5443,5444],{"class":81,"line":1473},[79,5445,5340],{"class":106},[79,5447,5448,5451],{"class":81,"line":1478},[79,5449,5450],{"class":99},"  return",[79,5452,5453],{"class":106}," LaunchDescription([map_server_node,manager_mapper_node])\n",[20,5455,5456,5457,5460,5461,5464],{},"在该文件中，使用了功能包中",[76,5458,5459],{},"nav2_lifecycle_manager","中的",[76,5462,5463],{},"lifecycle_manager","组件，该组件可以自动的配置、激活其所管理的具有生命周期的节点。构建功能包后并执行该launch文件，其最终效果与方式一类似。",[70,5466,5468],{"className":72,"code":5467,"language":74,"meta":34,"style":34},"ros2 launch mycar_map_server map_server.launch.py\n",[76,5469,5470],{"__ignoreMap":34},[79,5471,5472,5474,5476,5478],{"class":81,"line":82},[79,5473,1203],{"class":85},[79,5475,2358],{"class":89},[79,5477,5031],{"class":89},[79,5479,5480],{"class":89}," map_server.launch.py\n",[20,5482,5483],{},[23,5484,5485],{},"显示地图",[20,5487,5488,5489],{},"打开rviz2，然后添加Map插件，并将话题设置为\u002Fmap，并将该话题的",[76,5490,5491],{},"Durability Policy",[20,5493,5494,5495,5498],{},"选项设置为",[76,5496,5497],{},"Transient Local","，就可以正常显示地图数据了。",[20,5500,5501],{},[32,5502],{"alt":34,"src":5503},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1755.webp",[20,5505,5506],{},[32,5507],{"alt":34,"src":5508},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1756.webp",[20,5510,5511],{},[32,5512],{"alt":34,"src":5513},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1757.webp",[12,5515,5517],{"id":5516},"amcl自适应蒙特卡洛定位","AMCL自适应蒙特卡洛定位",[20,5519,5520],{},"定位是机器人在已知地图上确定自身位置的过程，为机器人的导航提供了基础信息。",[20,5522,5523,5524,4072],{},"Nav2中的定位技术技术称之为AMCL，全称Adaptive Monte Carlo Localization，即自适应蒙特卡洛定位，是一种基于粒子滤波器的定位算法。它通过蒙特卡洛方法进行自适应定位，利用对机器人周围环境的感知和观测数据的分析，来确定机器人在环境中的位置和姿态。在Nav2中对应的功能包为",[76,5525,5526],{},"nav2_amcl",[20,5528,5529],{},"在AMCL中，粒子滤波器的核心思想是使用一组粒子（样本）来代表机器人在地图上的可能位置。每个粒子都有一个权重，表示该粒子所代表的位置的置信度。算法会根据机器人的运动模型和传感器数据来更新这些粒子的位置和权重。随着时间的推移，粒子会逐渐收敛到机器人实际位置附近，从而实现对机器人位置的准确估计。",[16,5531,5532],{"id":5532},"定位节点说明",[20,5534,5535,5536,5538],{},"功能包",[76,5537,5526],{},"中的核心节点为amcl。该节点相关信息如下。",[20,5540,5541],{},[23,5542,5543],{},"1.订阅的话题",[533,5545,5546,5556],{},[536,5547,5548],{},[539,5549,5550,5552,5554],{},[542,5551,545],{"align":544},[542,5553,4126],{"align":544},[542,5555,551],{"align":544},[553,5557,5558,5567,5577,5588],{},[539,5559,5560,5562,5565],{},[558,5561,685],{"align":544},[558,5563,5564],{"align":544},"\u002Fnav_msgs\u002Fmsg\u002FOccupancyGrid",[558,5566,4981],{"align":544},[539,5568,5569,5571,5574],{},[558,5570,560],{"align":544},[558,5572,5573],{"align":544},"\u002Fsensor_msgs\u002Fmsg\u002FLaserScan",[558,5575,5576],{"align":544},"激光雷达数据",[539,5578,5579,5582,5585],{},[558,5580,5581],{"align":544},"\u002Finitialpose",[558,5583,5584],{"align":544},"\u002Fgeometry_msgs\u002Fmsg\u002FPoseWithCovarianceStamped",[558,5586,5587],{"align":544},"用来初始化粒子滤波器的均值和协方差",[539,5589,5590,5592,5595],{},[558,5591,571],{"align":544},[558,5593,5594],{"align":544},"\u002Ftf2_msgs\u002Fmsg\u002FTFMessage",[558,5596,5597],{"align":544},"坐标变换消息",[20,5599,5600],{},[23,5601,5602],{},"2.发布的话题",[533,5604,5605,5615],{},[536,5606,5607],{},[539,5608,5609,5611,5613],{},[542,5610,545],{"align":544},[542,5612,4126],{"align":544},[542,5614,551],{"align":544},[553,5616,5617,5627,5638],{},[539,5618,5619,5622,5624],{},[558,5620,5621],{"align":544},"\u002Famcl_pose",[558,5623,5584],{"align":544},[558,5625,5626],{"align":544},"机器人在地图中的位姿估计",[539,5628,5629,5632,5635],{},[558,5630,5631],{"align":544},"\u002Fparticle_cloud",[558,5633,5634],{"align":544},"\u002Fnav2_msgs\u002Fmsg\u002FParticleCloud",[558,5636,5637],{"align":544},"位姿估计集合，rviz中可以被 PoseArray 订阅然后图形化显示机器人的位姿估计集合",[539,5639,5640,5642,5644],{},[558,5641,571],{"align":544},[558,5643,5594],{"align":544},[558,5645,5646],{"align":544},"发布从 odom 与 map 的转换",[20,5648,5649],{},[23,5650,5651],{},"3.发布的服务",[533,5653,5654,5664],{},[536,5655,5656],{},[539,5657,5658,5660,5662],{},[542,5659,545],{"align":544},[542,5661,4126],{"align":544},[542,5663,551],{"align":544},[553,5665,5666,5677],{},[539,5667,5668,5671,5674],{},[558,5669,5670],{"align":544},"\u002Freinitialize_global_localization",[558,5672,5673],{"align":544},"std_srvs\u002Fsrv\u002FEmpty",[558,5675,5676],{"align":544},"在全局范围内初始化粒子位姿",[539,5678,5679,5682,5684],{},[558,5680,5681],{"align":544},"\u002Frequest_nomotion_update",[558,5683,5673],{"align":544},[558,5685,5686],{"align":544},"在没有运动模型更新的情况下手动触发粒子群的更新",[20,5688,5689],{},[23,5690,5691],{},"4.参数",[20,5693,5694],{},[23,5695,5696],{},"通用参数",[48,5698,5699,5708,5718,5727,5736,5744,5750],{},[51,5700,5701,5704,5705,5707],{},[76,5702,5703],{},"bond_disable_heartbeat_timeout",": 设置为",[76,5706,2020],{},"时，禁用amcl节点与其他节点之间基于心跳的超时检测。这通常用于当节点之间的连接非常稳定，不需要频繁的心跳检测来确认连接状态时。",[51,5709,5710,5713,5714,5717],{},[76,5711,5712],{},"base_frame_id",": 定义机器人基坐标系的ID，通常是",[76,5715,5716],{},"base_link","或类似的名称。",[51,5719,5720,5723,5724,4072],{},[76,5721,5722],{},"global_frame_id",": 定义全局地图坐标系的ID，通常是",[76,5725,5726],{},"map",[51,5728,5729,5732,5733,4072],{},[76,5730,5731],{},"odom_frame_id",": 定义里程计坐标系的ID，通常是",[76,5734,5735],{},"odom",[51,5737,5738,5704,5741,5743],{},[76,5739,5740],{},"tf_broadcast",[76,5742,2020],{},"时，amcl节点会发布从里程计坐标系到全局地图坐标系的变换。",[51,5745,5746,5749],{},[76,5747,5748],{},"transform_tolerance",": 设置TF变换的容忍度，用于处理TF树中的时间不一致性。",[51,5751,5752,5704,5755,5757],{},[76,5753,5754],{},"use_sim_time",[76,5756,2020],{},"时，amcl将使用ROS 2的模拟时间（如果可用）。这在仿真环境中很有用。",[20,5759,5760],{},[23,5761,5762],{},"激光模型参数",[48,5764,5765,5775,5784,5790],{},[51,5766,5767,5770,5771,5774],{},[76,5768,5769],{},"laser_model_type",": 设置激光模型类型，",[76,5772,5773],{},"likelihood_field","是一种常用的模型，它考虑了激光束击中障碍物的概率。",[51,5776,5777,2673,5780,5783],{},[76,5778,5779],{},"laser_max_range",[76,5781,5782],{},"laser_min_range",": 分别设置激光雷达的最大和最小探测范围。",[51,5785,5786,5789],{},[76,5787,5788],{},"laser_likelihood_max_dist",": 设置激光模型考虑的最大距离，超过这个距离的数据将被忽略。",[51,5791,5792,5795,5796,5799,5800,5799,5803,5806,5807,5809,5810,5813],{},[76,5793,5794],{},"do_beamskip","和相关参数（",[76,5797,5798],{},"beam_skip_distance","、",[76,5801,5802],{},"beam_skip_threshold",[76,5804,5805],{},"beam_skip_error_threshold","）: 这些参数用于控制是否跳过某些激光束的处理，以减少计算量。然而，",[76,5808,5794],{},"被设置为",[76,5811,5812],{},"false","，意味着不跳过任何激光束。",[20,5815,5816],{},[23,5817,5818],{},"粒子滤波器参数",[48,5820,5821,5833,5842,5848],{},[51,5822,5823,5826,5829,5832],{},[76,5824,5825],{},"alpha1",[23,5827,5828],{},"到",[76,5830,5831],{},"alpha5",": 这些参数用于控制粒子滤波器中的权重更新过程，但它们的具体作用可能因amcl的实现而异。在标准的amcl实现中，这些参数可能不是直接使用的。",[51,5834,5835,2673,5838,5841],{},[76,5836,5837],{},"max_particles",[76,5839,5840],{},"min_particles",": 分别设置粒子滤波器的最大和最小粒子数。",[51,5843,5844,5847],{},[76,5845,5846],{},"resample_interval",": 设置在重采样前需要的滤波更新次数。",[51,5849,5850,2673,5853,5856],{},[76,5851,5852],{},"pf_err",[76,5854,5855],{},"pf_z",": 这些参数用于控制粒子滤波器的性能，但它们的具体作用可能依赖于amcl的实现细节。",[20,5858,5859],{},[23,5860,5861],{},"初始位姿参数",[48,5863,5864,5876,5883],{},[51,5865,5866,5869,5870,5809,5873,5875],{},[76,5867,5868],{},"initial_pose",": 定义了机器人的初始位姿（x, y, yaw, z），但在实际使用中，如果",[76,5871,5872],{},"set_initial_pose",[76,5874,2020],{},"，则这个初始位姿可能会被通过服务请求设置的初始位姿所覆盖。",[51,5877,5878,5704,5880,5882],{},[76,5879,5872],{},[76,5881,2020],{},"时，允许通过服务请求来设置机器人的初始位姿。",[51,5884,5885,5704,5888,5890],{},[76,5886,5887],{},"always_reset_initial_pose",[76,5889,5812],{},"时，表示不会在每个定位会话开始时自动重置初始位姿。",[20,5892,5893],{},[23,5894,5895],{},"其他参数",[48,5897,5898,5907,5913,5918,5924,5933],{},[51,5899,5900,5903,5904,5906],{},[76,5901,5902],{},"first_map_only",": 当设置为",[76,5905,5812],{},"时，表示amcl将订阅并处理不断更新的地图话题。",[51,5908,5909,5912],{},[76,5910,5911],{},"map_topic",": 定义地图话题的名称，amcl将订阅这个话题以获取地图信息。",[51,5914,5915,5917],{},[76,5916,902],{},": 定义激光雷达扫描数据话题的名称，amcl将订阅这个话题以获取用于定位的数据。",[51,5919,5920,5923],{},[76,5921,5922],{},"save_pose_rate",": 设置保存机器人位姿的速率（以Hz为单位）。",[51,5925,5926,2673,5929,5932],{},[76,5927,5928],{},"recovery_alpha_fast",[76,5930,5931],{},"recovery_alpha_slow",": 这些参数在标准的amcl实现中可能不是直接使用的，它们可能属于某个特定版本的amcl或扩展。",[51,5934,5935,5799,5938,5799,5941,5799,5944,2673,5947,5950],{},[76,5936,5937],{},"z_hit",[76,5939,5940],{},"z_rand",[76,5942,5943],{},"z_short",[76,5945,5946],{},"z_max",[76,5948,5949],{},"sigma_hit",": 这些参数定义了激光模型中的概率分布，用于计算激光束击中障碍物或随机位置的概率。",[16,5952,5953],{"id":5953},"定位节点基本操作",[20,5955,5956],{},[23,5957,5958],{},"1.准备工作",[20,5960,5015],{},[70,5962,5964],{"className":72,"code":5963,"language":74,"meta":34,"style":34},"ros2 pkg create mycar_localization --dependencies nav2_amcl mycar_map_server\n",[76,5965,5966],{"__ignoreMap":34},[79,5967,5968,5970,5972,5974,5977,5979,5982],{"class":81,"line":82},[79,5969,1203],{"class":85},[79,5971,1206],{"class":89},[79,5973,1209],{"class":89},[79,5975,5976],{"class":89}," mycar_localization",[79,5978,1216],{"class":1215},[79,5980,5981],{"class":89}," nav2_amcl",[79,5983,5984],{"class":89}," mycar_map_server\n",[20,5986,5987],{},[23,5988,5989],{},"2.编写launch文件与参数文件",[20,5991,5992,5993,5190],{},"在功能包下，新建launch和params文件夹，在launch目录下新建名为",[76,5994,5995],{},"mycar_loca.launch.py",[70,5997,5999],{"className":1234,"code":5998,"language":1236,"meta":34,"style":34},"import os\nfrom ament_index_python.packages import get_package_share_directory\n\nfrom launch import LaunchDescription\nfrom launch.actions import DeclareLaunchArgument, IncludeLaunchDescription\nfrom launch.substitutions import LaunchConfiguration\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\n\nfrom launch_ros.actions import Node\n\n\ndef generate_launch_description():\n\n    use_sim_time_arg = DeclareLaunchArgument(\n        'use_sim_time',\n        default_value='false'\n    )\n\n    amcl_yaml = os.path.join(\n        get_package_share_directory('mycar_localization'),\n        'params',\n        'amcl.yaml'\n    )\n\n    amcl_node = Node(\n        package='nav2_amcl',\n        executable='amcl',\n        name='amcl',\n        output='screen',\n        parameters=[\n            amcl_yaml,\n            {'use_sim_time': LaunchConfiguration('use_sim_time')} # 覆盖掉yaml里的use_sim_time参数,以launch启动的设置为准.\n        ]\n    )\n\n    manager_localization_node = Node(\n        package='nav2_lifecycle_manager',\n        executable='lifecycle_manager',\n        name='lifecycle_manager_localization',\n        output='screen',\n        parameters=[\n            {'use_sim_time': LaunchConfiguration('use_sim_time')},\n            {'autostart': True},\n            {'node_names': ['amcl']}\n        ]\n    )\n\n    map_server_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                get_package_share_directory('mycar_map_server'),\n                'launch',\n                'map_server.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': LaunchConfiguration('use_sim_time')\n        }.items()\n    )\n\n    return LaunchDescription([\n        use_sim_time_arg,\n        map_server_launch,\n        amcl_node,\n        manager_localization_node,\n    ])\n",[76,6000,6001,6007,6017,6021,6031,6042,6052,6064,6068,6078,6082,6086,6094,6098,6106,6112,6121,6125,6129,6139,6149,6156,6161,6165,6169,6178,6189,6200,6210,6220,6228,6233,6249,6254,6258,6262,6271,6281,6291,6302,6312,6320,6332,6344,6357,6361,6365,6369,6379,6384,6389,6399,6406,6411,6416,6421,6431,6442,6447,6451,6455,6461,6465,6470,6476,6482],{"__ignoreMap":34},[79,6002,6003,6005],{"class":81,"line":82},[79,6004,1243],{"class":99},[79,6006,1246],{"class":106},[79,6008,6009,6011,6013,6015],{"class":81,"line":116},[79,6010,1255],{"class":99},[79,6012,1306],{"class":106},[79,6014,1243],{"class":99},[79,6016,1311],{"class":106},[79,6018,6019],{"class":81,"line":138},[79,6020,142],{"emptyLinePlaceholder":141},[79,6022,6023,6025,6027,6029],{"class":81,"line":145},[79,6024,1255],{"class":99},[79,6026,1258],{"class":106},[79,6028,1243],{"class":99},[79,6030,1263],{"class":106},[79,6032,6033,6035,6037,6039],{"class":81,"line":152},[79,6034,1255],{"class":99},[79,6036,1270],{"class":106},[79,6038,1243],{"class":99},[79,6040,6041],{"class":106}," DeclareLaunchArgument, IncludeLaunchDescription\n",[79,6043,6044,6046,6048,6050],{"class":81,"line":164},[79,6045,1255],{"class":99},[79,6047,1282],{"class":106},[79,6049,1243],{"class":99},[79,6051,1287],{"class":106},[79,6053,6054,6056,6059,6061],{"class":81,"line":176},[79,6055,1255],{"class":99},[79,6057,6058],{"class":106}," launch.launch_description_sources ",[79,6060,1243],{"class":99},[79,6062,6063],{"class":106}," PythonLaunchDescriptionSource\n",[79,6065,6066],{"class":81,"line":181},[79,6067,142],{"emptyLinePlaceholder":141},[79,6069,6070,6072,6074,6076],{"class":81,"line":186},[79,6071,1255],{"class":99},[79,6073,1294],{"class":106},[79,6075,1243],{"class":99},[79,6077,1299],{"class":106},[79,6079,6080],{"class":81,"line":197},[79,6081,142],{"emptyLinePlaceholder":141},[79,6083,6084],{"class":81,"line":1346},[79,6085,142],{"emptyLinePlaceholder":141},[79,6087,6088,6090,6092],{"class":81,"line":1361},[79,6089,1320],{"class":99},[79,6091,1323],{"class":85},[79,6093,1326],{"class":106},[79,6095,6096],{"class":81,"line":1366},[79,6097,142],{"emptyLinePlaceholder":141},[79,6099,6100,6102,6104],{"class":81,"line":1377},[79,6101,3093],{"class":106},[79,6103,1334],{"class":99},[79,6105,1374],{"class":106},[79,6107,6108,6110],{"class":81,"line":1386},[79,6109,1380],{"class":89},[79,6111,1383],{"class":106},[79,6113,6114,6116,6118],{"class":81,"line":1400},[79,6115,1390],{"class":1389},[79,6117,1334],{"class":99},[79,6119,6120],{"class":89},"'false'\n",[79,6122,6123],{"class":81,"line":1413},[79,6124,3246],{"class":106},[79,6126,6127],{"class":81,"line":1423},[79,6128,142],{"emptyLinePlaceholder":141},[79,6130,6131,6134,6136],{"class":81,"line":1431},[79,6132,6133],{"class":106},"    amcl_yaml ",[79,6135,1334],{"class":99},[79,6137,6138],{"class":106}," os.path.join(\n",[79,6140,6141,6144,6147],{"class":81,"line":1447},[79,6142,6143],{"class":106},"        get_package_share_directory(",[79,6145,6146],{"class":89},"'mycar_localization'",[79,6148,1444],{"class":106},[79,6150,6151,6154],{"class":81,"line":1461},[79,6152,6153],{"class":89},"        'params'",[79,6155,1383],{"class":106},[79,6157,6158],{"class":81,"line":1473},[79,6159,6160],{"class":89},"        'amcl.yaml'\n",[79,6162,6163],{"class":81,"line":1478},[79,6164,3246],{"class":106},[79,6166,6167],{"class":81,"line":1489},[79,6168,142],{"emptyLinePlaceholder":141},[79,6170,6171,6174,6176],{"class":81,"line":1500},[79,6172,6173],{"class":106},"    amcl_node ",[79,6175,1334],{"class":99},[79,6177,1486],{"class":106},[79,6179,6180,6182,6184,6187],{"class":81,"line":1506},[79,6181,1526],{"class":1389},[79,6183,1334],{"class":99},[79,6185,6186],{"class":89},"'nav2_amcl'",[79,6188,1383],{"class":106},[79,6190,6191,6193,6195,6198],{"class":81,"line":1517},[79,6192,1539],{"class":1389},[79,6194,1334],{"class":99},[79,6196,6197],{"class":89},"'amcl'",[79,6199,1383],{"class":106},[79,6201,6202,6204,6206,6208],{"class":81,"line":1523},[79,6203,1552],{"class":1389},[79,6205,1334],{"class":99},[79,6207,6197],{"class":89},[79,6209,1383],{"class":106},[79,6211,6212,6214,6216,6218],{"class":81,"line":1536},[79,6213,1564],{"class":1389},[79,6215,1334],{"class":99},[79,6217,1569],{"class":89},[79,6219,1383],{"class":106},[79,6221,6222,6224,6226],{"class":81,"line":1549},[79,6223,1492],{"class":1389},[79,6225,1334],{"class":99},[79,6227,1497],{"class":106},[79,6229,6230],{"class":81,"line":1561},[79,6231,6232],{"class":106},"            amcl_yaml,\n",[79,6234,6235,6237,6239,6241,6243,6246],{"class":81,"line":1574},[79,6236,3293],{"class":106},[79,6238,1340],{"class":89},[79,6240,3185],{"class":106},[79,6242,1340],{"class":89},[79,6244,6245],{"class":106},")} ",[79,6247,6248],{"class":148},"# 覆盖掉yaml里的use_sim_time参数,以launch启动的设置为准.\n",[79,6250,6251],{"class":81,"line":1579},[79,6252,6253],{"class":106},"        ]\n",[79,6255,6256],{"class":81,"line":1590},[79,6257,3246],{"class":106},[79,6259,6260],{"class":81,"line":1595},[79,6261,142],{"emptyLinePlaceholder":141},[79,6263,6264,6267,6269],{"class":81,"line":1601},[79,6265,6266],{"class":106},"    manager_localization_node ",[79,6268,1334],{"class":99},[79,6270,1486],{"class":106},[79,6272,6273,6275,6277,6279],{"class":81,"line":1607},[79,6274,1526],{"class":1389},[79,6276,1334],{"class":99},[79,6278,5359],{"class":89},[79,6280,1383],{"class":106},[79,6282,6283,6285,6287,6289],{"class":81,"line":1613},[79,6284,1539],{"class":1389},[79,6286,1334],{"class":99},[79,6288,5371],{"class":89},[79,6290,1383],{"class":106},[79,6292,6293,6295,6297,6300],{"class":81,"line":1618},[79,6294,1552],{"class":1389},[79,6296,1334],{"class":99},[79,6298,6299],{"class":89},"'lifecycle_manager_localization'",[79,6301,1383],{"class":106},[79,6303,6304,6306,6308,6310],{"class":81,"line":2001},[79,6305,1564],{"class":1389},[79,6307,1334],{"class":99},[79,6309,1569],{"class":89},[79,6311,1383],{"class":106},[79,6313,6314,6316,6318],{"class":81,"line":2012},[79,6315,1492],{"class":1389},[79,6317,1334],{"class":99},[79,6319,1497],{"class":106},[79,6321,6322,6324,6326,6328,6330],{"class":81,"line":2025},[79,6323,3293],{"class":106},[79,6325,1340],{"class":89},[79,6327,3185],{"class":106},[79,6329,1340],{"class":89},[79,6331,3302],{"class":106},[79,6333,6334,6336,6338,6340,6342],{"class":81,"line":2039},[79,6335,3293],{"class":106},[79,6337,5421],{"class":89},[79,6339,1664],{"class":106},[79,6341,5321],{"class":1215},[79,6343,5324],{"class":106},[79,6345,6346,6348,6350,6352,6354],{"class":81,"line":2052},[79,6347,3293],{"class":106},[79,6349,5434],{"class":89},[79,6351,4852],{"class":106},[79,6353,6197],{"class":89},[79,6355,6356],{"class":106},"]}\n",[79,6358,6359],{"class":81,"line":2066},[79,6360,6253],{"class":106},[79,6362,6363],{"class":81,"line":2077},[79,6364,3246],{"class":106},[79,6366,6367],{"class":81,"line":2082},[79,6368,142],{"emptyLinePlaceholder":141},[79,6370,6371,6374,6376],{"class":81,"line":2092},[79,6372,6373],{"class":106},"    map_server_launch ",[79,6375,1334],{"class":99},[79,6377,6378],{"class":106}," IncludeLaunchDescription(\n",[79,6380,6381],{"class":81,"line":2103},[79,6382,6383],{"class":106},"        PythonLaunchDescriptionSource(\n",[79,6385,6386],{"class":81,"line":2115},[79,6387,6388],{"class":106},"            os.path.join(\n",[79,6390,6391,6394,6397],{"class":81,"line":2120},[79,6392,6393],{"class":106},"                get_package_share_directory(",[79,6395,6396],{"class":89},"'mycar_map_server'",[79,6398,1444],{"class":106},[79,6400,6401,6404],{"class":81,"line":2131},[79,6402,6403],{"class":89},"                'launch'",[79,6405,1383],{"class":106},[79,6407,6408],{"class":81,"line":2141},[79,6409,6410],{"class":89},"                'map_server.launch.py'\n",[79,6412,6413],{"class":81,"line":2152},[79,6414,6415],{"class":106},"            )\n",[79,6417,6418],{"class":81,"line":2157},[79,6419,6420],{"class":106},"        ),\n",[79,6422,6423,6426,6428],{"class":81,"line":2171},[79,6424,6425],{"class":1389},"        launch_arguments",[79,6427,1334],{"class":99},[79,6429,6430],{"class":106},"{\n",[79,6432,6433,6436,6438,6440],{"class":81,"line":2184},[79,6434,6435],{"class":89},"            'use_sim_time'",[79,6437,3185],{"class":106},[79,6439,1340],{"class":89},[79,6441,1343],{"class":106},[79,6443,6444],{"class":81,"line":2189},[79,6445,6446],{"class":106},"        }.items()\n",[79,6448,6449],{"class":81,"line":2203},[79,6450,3246],{"class":106},[79,6452,6453],{"class":81,"line":2217},[79,6454,142],{"emptyLinePlaceholder":141},[79,6456,6457,6459],{"class":81,"line":2231},[79,6458,1621],{"class":99},[79,6460,3329],{"class":106},[79,6462,6463],{"class":81,"line":2242},[79,6464,3334],{"class":106},[79,6466,6467],{"class":81,"line":2252},[79,6468,6469],{"class":106},"        map_server_launch,\n",[79,6471,6473],{"class":81,"line":6472},64,[79,6474,6475],{"class":106},"        amcl_node,\n",[79,6477,6479],{"class":81,"line":6478},65,[79,6480,6481],{"class":106},"        manager_localization_node,\n",[79,6483,6485],{"class":81,"line":6484},66,[79,6486,3354],{"class":106},[20,6488,6489,6490,6493,6494,6497,6498,6501,6502,6504,6505,6507],{},"在上述代码中，创建了",[76,6491,6492],{},"amcl","节点，并从",[76,6495,6496],{},"params","目录加载了名为",[76,6499,6500],{},"amcl.yaml","的配置文件，且由于",[76,6503,6492],{},"也是拥有生命周期的节点，所以将其添加进了生命周期管理器。最后，定位必须依赖于地图信息，因此又包含了 ",[23,6506,5008],{},"  中的launch文件，以加载地图。",[20,6509,6510,6511,5190],{},"在params目录下新建名为",[76,6512,6500],{},[70,6514,6516],{"className":1637,"code":6515,"language":1639,"meta":34,"style":34},"\u002F**:\n  ros__parameters:\n    use_sim_time: True  # 由launch的设置覆盖\n    alpha1: 0.2\n    alpha2: 0.2\n    alpha3: 0.2\n    alpha4: 0.2\n    alpha5: 0.2\n    base_frame_id: \"base_link\"\n    beam_skip_distance: 0.5\n    beam_skip_error_threshold: 0.9\n    beam_skip_threshold: 0.3\n    do_beamskip: false\n    global_frame_id: \"map\"\n    lambda_short: 0.1\n    laser_likelihood_max_dist: 2.0\n    laser_max_range: 100.0\n    laser_min_range: -1.0\n    laser_model_type: \"likelihood_field\"\n    max_beams: 60\n    max_particles: 2000\n    min_particles: 500\n    odom_frame_id: \"odom\"\n    pf_err: 0.05\n    pf_z: 0.99\n    recovery_alpha_fast: 0.0\n    recovery_alpha_slow: 0.0\n    resample_interval: 1\n    robot_model_type: \"nav2_amcl::DifferentialMotionModel\"\n    save_pose_rate: 0.5\n    sigma_hit: 0.2\n    tf_broadcast: true\n    transform_tolerance: 2.0\n    update_min_a: 0.2\n    update_min_d: 0.25\n    z_hit: 0.5\n    z_max: 0.05\n    z_rand: 0.5\n    z_short: 0.05\n    scan_topic: scan\n    set_initial_pose: false\n",[76,6517,6518,6525,6531,6543,6552,6561,6570,6579,6588,6598,6607,6616,6626,6635,6645,6654,6663,6673,6683,6693,6703,6713,6723,6733,6742,6752,6762,6771,6780,6790,6799,6808,6817,6826,6835,6844,6853,6862,6871,6880,6889],{"__ignoreMap":34},[79,6519,6520,6523],{"class":81,"line":82},[79,6521,6522],{"class":1646},"\u002F**",[79,6524,1649],{"class":106},[79,6526,6527,6529],{"class":81,"line":116},[79,6528,1654],{"class":1646},[79,6530,1649],{"class":106},[79,6532,6533,6536,6538,6540],{"class":81,"line":138},[79,6534,6535],{"class":1646},"    use_sim_time",[79,6537,1664],{"class":106},[79,6539,5321],{"class":1215},[79,6541,6542],{"class":148},"  # 由launch的设置覆盖\n",[79,6544,6545,6548,6550],{"class":81,"line":145},[79,6546,6547],{"class":1646},"    alpha1",[79,6549,1664],{"class":106},[79,6551,1882],{"class":1215},[79,6553,6554,6557,6559],{"class":81,"line":152},[79,6555,6556],{"class":1646},"    alpha2",[79,6558,1664],{"class":106},[79,6560,1882],{"class":1215},[79,6562,6563,6566,6568],{"class":81,"line":164},[79,6564,6565],{"class":1646},"    alpha3",[79,6567,1664],{"class":106},[79,6569,1882],{"class":1215},[79,6571,6572,6575,6577],{"class":81,"line":176},[79,6573,6574],{"class":1646},"    alpha4",[79,6576,1664],{"class":106},[79,6578,1882],{"class":1215},[79,6580,6581,6584,6586],{"class":81,"line":181},[79,6582,6583],{"class":1646},"    alpha5",[79,6585,1664],{"class":106},[79,6587,1882],{"class":1215},[79,6589,6590,6593,6595],{"class":81,"line":186},[79,6591,6592],{"class":1646},"    base_frame_id",[79,6594,1664],{"class":106},[79,6596,6597],{"class":89},"\"base_link\"\n",[79,6599,6600,6603,6605],{"class":81,"line":197},[79,6601,6602],{"class":1646},"    beam_skip_distance",[79,6604,1664],{"class":106},[79,6606,1872],{"class":1215},[79,6608,6609,6612,6614],{"class":81,"line":1346},[79,6610,6611],{"class":1646},"    beam_skip_error_threshold",[79,6613,1664],{"class":106},[79,6615,2239],{"class":1215},[79,6617,6618,6621,6623],{"class":81,"line":1361},[79,6619,6620],{"class":1646},"    beam_skip_threshold",[79,6622,1664],{"class":106},[79,6624,6625],{"class":1215},"0.3\n",[79,6627,6628,6631,6633],{"class":81,"line":1366},[79,6629,6630],{"class":1646},"    do_beamskip",[79,6632,1664],{"class":106},[79,6634,1807],{"class":1215},[79,6636,6637,6640,6642],{"class":81,"line":1377},[79,6638,6639],{"class":1646},"    global_frame_id",[79,6641,1664],{"class":106},[79,6643,6644],{"class":89},"\"map\"\n",[79,6646,6647,6650,6652],{"class":81,"line":1386},[79,6648,6649],{"class":1646},"    lambda_short",[79,6651,1664],{"class":106},[79,6653,1946],{"class":1215},[79,6655,6656,6659,6661],{"class":81,"line":1400},[79,6657,6658],{"class":1646},"    laser_likelihood_max_dist",[79,6660,1664],{"class":106},[79,6662,1840],{"class":1215},[79,6664,6665,6668,6670],{"class":81,"line":1413},[79,6666,6667],{"class":1646},"    laser_max_range",[79,6669,1664],{"class":106},[79,6671,6672],{"class":1215},"100.0\n",[79,6674,6675,6678,6680],{"class":81,"line":1423},[79,6676,6677],{"class":1646},"    laser_min_range",[79,6679,1664],{"class":106},[79,6681,6682],{"class":1215},"-1.0\n",[79,6684,6685,6688,6690],{"class":81,"line":1431},[79,6686,6687],{"class":1646},"    laser_model_type",[79,6689,1664],{"class":106},[79,6691,6692],{"class":89},"\"likelihood_field\"\n",[79,6694,6695,6698,6700],{"class":81,"line":1447},[79,6696,6697],{"class":1646},"    max_beams",[79,6699,1664],{"class":106},[79,6701,6702],{"class":1215},"60\n",[79,6704,6705,6708,6710],{"class":81,"line":1461},[79,6706,6707],{"class":1646},"    max_particles",[79,6709,1664],{"class":106},[79,6711,6712],{"class":1215},"2000\n",[79,6714,6715,6718,6720],{"class":81,"line":1473},[79,6716,6717],{"class":1646},"    min_particles",[79,6719,1664],{"class":106},[79,6721,6722],{"class":1215},"500\n",[79,6724,6725,6728,6730],{"class":81,"line":1478},[79,6726,6727],{"class":1646},"    odom_frame_id",[79,6729,1664],{"class":106},[79,6731,6732],{"class":89},"\"odom\"\n",[79,6734,6735,6738,6740],{"class":81,"line":1489},[79,6736,6737],{"class":1646},"    pf_err",[79,6739,1664],{"class":106},[79,6741,1850],{"class":1215},[79,6743,6744,6747,6749],{"class":81,"line":1500},[79,6745,6746],{"class":1646},"    pf_z",[79,6748,1664],{"class":106},[79,6750,6751],{"class":1215},"0.99\n",[79,6753,6754,6757,6759],{"class":81,"line":1506},[79,6755,6756],{"class":1646},"    recovery_alpha_fast",[79,6758,1664],{"class":106},[79,6760,6761],{"class":1215},"0.0\n",[79,6763,6764,6767,6769],{"class":81,"line":1517},[79,6765,6766],{"class":1646},"    recovery_alpha_slow",[79,6768,1664],{"class":106},[79,6770,6761],{"class":1215},[79,6772,6773,6776,6778],{"class":81,"line":1523},[79,6774,6775],{"class":1646},"    resample_interval",[79,6777,1664],{"class":106},[79,6779,1817],{"class":1215},[79,6781,6782,6785,6787],{"class":81,"line":1536},[79,6783,6784],{"class":1646},"    robot_model_type",[79,6786,1664],{"class":106},[79,6788,6789],{"class":89},"\"nav2_amcl::DifferentialMotionModel\"\n",[79,6791,6792,6795,6797],{"class":81,"line":1549},[79,6793,6794],{"class":1646},"    save_pose_rate",[79,6796,1664],{"class":106},[79,6798,1872],{"class":1215},[79,6800,6801,6804,6806],{"class":81,"line":1561},[79,6802,6803],{"class":1646},"    sigma_hit",[79,6805,1664],{"class":106},[79,6807,1882],{"class":1215},[79,6809,6810,6813,6815],{"class":81,"line":1574},[79,6811,6812],{"class":1646},"    tf_broadcast",[79,6814,1664],{"class":106},[79,6816,1914],{"class":1215},[79,6818,6819,6822,6824],{"class":81,"line":1579},[79,6820,6821],{"class":1646},"    transform_tolerance",[79,6823,1664],{"class":106},[79,6825,1840],{"class":1215},[79,6827,6828,6831,6833],{"class":81,"line":1590},[79,6829,6830],{"class":1646},"    update_min_a",[79,6832,1664],{"class":106},[79,6834,1882],{"class":1215},[79,6836,6837,6840,6842],{"class":81,"line":1595},[79,6838,6839],{"class":1646},"    update_min_d",[79,6841,1664],{"class":106},[79,6843,4898],{"class":1215},[79,6845,6846,6849,6851],{"class":81,"line":1601},[79,6847,6848],{"class":1646},"    z_hit",[79,6850,1664],{"class":106},[79,6852,1872],{"class":1215},[79,6854,6855,6858,6860],{"class":81,"line":1607},[79,6856,6857],{"class":1646},"    z_max",[79,6859,1664],{"class":106},[79,6861,1850],{"class":1215},[79,6863,6864,6867,6869],{"class":81,"line":1613},[79,6865,6866],{"class":1646},"    z_rand",[79,6868,1664],{"class":106},[79,6870,1872],{"class":1215},[79,6872,6873,6876,6878],{"class":81,"line":1618},[79,6874,6875],{"class":1646},"    z_short",[79,6877,1664],{"class":106},[79,6879,1850],{"class":1215},[79,6881,6882,6884,6886],{"class":81,"line":2001},[79,6883,1756],{"class":1646},[79,6885,1664],{"class":106},[79,6887,6888],{"class":89},"scan\n",[79,6890,6891,6894,6896],{"class":81,"line":2012},[79,6892,6893],{"class":1646},"    set_initial_pose",[79,6895,1664],{"class":106},[79,6897,1807],{"class":1215},[20,6899,6900,6901,6903],{},"关于参数的具体含义，可以参考 ",[23,6902,5532],{}," 中参数相关内容。",[20,6905,6906],{},[23,6907,6908],{},"3.编辑配置文件",[20,6910,2270,6911,2274],{},[76,6912,2273],{},[70,6914,6915],{"className":2277,"code":2278,"language":2279,"meta":34,"style":34},[76,6916,6917,6923,6929],{"__ignoreMap":34},[79,6918,6919,6921],{"class":81,"line":82},[79,6920,2286],{"class":99},[79,6922,2289],{"class":106},[79,6924,6925,6927],{"class":81,"line":116},[79,6926,2294],{"class":106},[79,6928,2297],{"class":99},[79,6930,6931],{"class":81,"line":138},[79,6932,1343],{"class":106},[20,6934,6935],{},[23,6936,6937],{},"4.编译",[20,6939,2309],{},[70,6941,6943],{"className":72,"code":6942,"language":74,"meta":34,"style":34},"colcon build --packages-select mycar_localization\n",[76,6944,6945],{"__ignoreMap":34},[79,6946,6947,6949,6951,6953],{"class":81,"line":82},[79,6948,2319],{"class":85},[79,6950,2322],{"class":89},[79,6952,2325],{"class":1215},[79,6954,6955],{"class":89}," mycar_localization\n",[20,6957,6958],{},[23,6959,6960],{},"5.执行",[20,6962,3997],{},[70,6964,6965],{"className":72,"code":2341,"language":74,"meta":34,"style":34},[76,6966,6967,6973],{"__ignoreMap":34},[79,6968,6969,6971],{"class":81,"line":82},[79,6970,2348],{"class":1215},[79,6972,2351],{"class":89},[79,6974,6975,6977,6979,6981],{"class":81,"line":116},[79,6976,1203],{"class":85},[79,6978,2358],{"class":89},[79,6980,2361],{"class":89},[79,6982,2364],{"class":89},[20,6984,4020],{},[70,6986,6988],{"className":72,"code":6987,"language":74,"meta":34,"style":34},". install\u002Fsetup.bash\nros2 launch mycar_localization mycar_loca.launch.py use_sim_time:=True\n",[76,6989,6990,6996],{"__ignoreMap":34},[79,6991,6992,6994],{"class":81,"line":82},[79,6993,2348],{"class":1215},[79,6995,2351],{"class":89},[79,6997,6998,7000,7002,7004,7007],{"class":81,"line":116},[79,6999,1203],{"class":85},[79,7001,2358],{"class":89},[79,7003,5976],{"class":89},[79,7005,7006],{"class":89}," mycar_loca.launch.py",[79,7008,2394],{"class":89},[20,7010,7011],{},"（3）启动键盘控制节点以作备用：",[70,7013,7015],{"className":72,"code":7014,"language":74,"meta":34,"style":34},"ros2 run teleop_twist_keyboard teleop_twist_keyboard\n",[76,7016,7017],{"__ignoreMap":34},[79,7018,7019,7021,7023,7026],{"class":81,"line":82},[79,7020,1203],{"class":85},[79,7022,4253],{"class":89},[79,7024,7025],{"class":89}," teleop_twist_keyboard",[79,7027,7028],{"class":89}," teleop_twist_keyboard\n",[20,7030,7031,7032,7034],{},"（4）在rviz2中，将Fixed Frme设置为map，添加TF插件，按照 ",[23,7033,5008],{},"  添加并显示地图。",[20,7036,7037,7038,7041],{},"接下来，点击rviz2菜单栏的",[76,7039,7040],{},"2D Pose Estimate","在地图中为机器人设置一个初始位姿。",[20,7043,7044],{},"这里需要给一个大概的机器人位置和机器人的朝向，不是很准确也可以，机器人会在运动中逐渐通过AMCL校准。",[20,7046,7047,7048,7050],{},"先点击",[76,7049,7040],{},"，左键在地图上点击机器人所在位置，长摁别松手，鼠标往机器人朝向的位置划，出现下方这种绿色箭头，再松手即可。",[20,7052,7053],{},[32,7054],{"alt":34,"src":7055},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1758.webp",[20,7057,7058,7059,7062,7063,7065,7066,7069,7070,7073],{},"再添加",[76,7060,7061],{},"ParticleCloud","插件，将话题设置为",[76,7064,5631],{},"，并将话题下",[76,7067,7068],{},"Reliability Policy","设置为",[76,7071,7072],{},"Best Effort","，最后使用键盘控制机器人运动时，会发现，机器人周边会出现点云，并且随着机器人的运动，点云会出现不同程度的收敛或发散。",[20,7075,7076],{},[32,7077],{"alt":34,"src":7078},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1759.webp",[20,7080,7081],{},[32,7082],{"alt":34,"src":7083},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1760.webp",[20,7085,7086],{},[32,7087],{"alt":34,"src":7088},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1761.webp",[20,7090,7091],{},"即便你的机器人撞墙了，rviz2和Gazebo的机器人位置完全偏移了，只要再让机器人运动一会儿，机器人位置会被重新预估出来，AMCL非常强。",[20,7093,7094],{},[32,7095],{"alt":34,"src":7096},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1762.webp",[20,7098,7099],{},"如上图位置已经完全偏移了。",[20,7101,7102],{},[32,7103],{"alt":34,"src":7104},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1763.webp",[20,7106,7107],{},"经过一段时间行驶，姿态位置再次被预估成功。",[12,7109,7110],{"id":7110},"导航服务器",[20,7112,7113],{},"本节将介绍导航服务器中核心节点，实现基本导航功能，并将导航与SLAM集成，以实现自主探索建图。",[20,7115,7116,7117,7120],{},"下方网站是官方NAV2的各个节点的参数说明(",[23,7118,7119],{},"调参的时候非常常用的网站","):",[20,7122,7123],{},[288,7124,290],{"href":290,"rel":7125},[292],[20,7127,7128],{},"看不懂的英文可以用沉浸式翻译这个chrome插件来翻译,可以进行中英文对照翻译,非常好用.",[20,7130,7131],{},[288,7132,7133],{"href":7133,"rel":7134},"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Fimmersive-translate-trans\u002Fbpoadfkcbjbfhfodiogcnhhhpibjhbnh?utm%5C_source=official&pli=1",[292],[20,7136,7137],{},[288,7138,7139],{"href":7139,"rel":7140},"https:\u002F\u002Fmicrosoftedge.microsoft.com\u002Faddons\u002Fdetail\u002Fimmersive-translate-tra\u002Famkbmndfnliijdhojkpoglbnaaahippg",[292],[20,7142,7143],{},[32,7144],{"alt":34,"src":7145},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1764.webp",[20,7147,7148],{},[32,7149],{"alt":34,"src":7150},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1765.webp",[20,7152,7153],{},"不会用这个插件的话,也可以看鱼香ROS翻译好的版本(但是网站不稳定):",[20,7155,7156],{},[288,7157,7158],{"href":7158,"rel":7159},"http:\u002F\u002Ffishros.org\u002Fdoc\u002Fnav2\u002Fconfiguration\u002Findex.html",[292],[16,7161,7162],{"id":7162},"生命周期管理节点说明",[20,7164,7165,7166,7168,7169,7171,7172,7174,7175,7177],{},"Nav2中通过的",[76,7167,5459],{},"功能包下的",[76,7170,5463],{},"节点管理其他节点的生命周期状态转换。",[76,7173,5463],{},"节点通过ROS 2的生命周期节点（Lifecycle Node）机制，提供了一种标准化的方法来控制Nav2中各个节点的状态转换。这些状态包括未配置（Unconfigured）、非活动（Inactive）、活动（Active）和结束（Finalized）等。通过精细控制这些状态转换，",[76,7176,5463],{},"节点能够确保Nav2系统的各个部分在正确的时机启动、运行和停止，从而提高系统的可靠性和稳定性。",[20,7179,7180],{},[23,7181,825],{},[48,7183,7184,7193,7202,7210,7216,7222,7236,7242],{},[51,7185,7186,7189,7190,7192],{},[76,7187,7188],{},"\u002Fbond_disable_heartbeat_timeout",": 该参数与节点之间的通信绑定（bonding）有关。节点之间的通信可以通过绑定来增强可靠性，而心跳超时是检测节点是否仍然活跃的一种方式。设置为",[76,7191,5812],{},"意味着启用心跳超时检测。",[51,7194,7195,7198,7199,7201],{},[76,7196,7197],{},"attempt_respawn_reconnection",": 取值为bool值，设置为",[76,7200,2020],{},"时，表示如果管理的节点意外终止，生命周期管理器将尝试重新启动它。",[51,7203,7204,7198,7207,7209],{},[76,7205,7206],{},"autostart",[76,7208,2020],{},"时，表示在生命周期管理器启动时，它将自动尝试启动其管理的节点。",[51,7211,7212,7215],{},[76,7213,7214],{},"bond_respawn_max_duration",": 重新连接或重新启动节点时的最大持续时间。",[51,7217,7218,7221],{},[76,7219,7220],{},"bond_timeout",": 与节点之间的通信绑定超时有关。如果在这个时间内没有收到来自另一个节点的消息，则认为该节点已经断开连接。",[51,7223,7224,7227,7228],{},[76,7225,7226],{},"diagnostic_updater",":",[48,7229,7230],{},[51,7231,7232,7235],{},[76,7233,7234],{},"period",": 诊断更新器的更新周期。诊断更新器用于收集和发布有关节点状态的诊断信息，定义了这些信息更新的频率。",[51,7237,7238,7241],{},[76,7239,7240],{},"node_names",": 由该生命周期管理器管理的节点名称列表。",[51,7243,7244,7246],{},[76,7245,5754],{},":是否使用仿真实践。",[16,7248,7249],{"id":7249},"行为树节点说明",[20,7251,7252,7255,7256,7168,7259,7262],{},[23,7253,7254],{},"行为树（BT）"," 是一种在智能体（如机器人或电脑游戏中的虚拟实体）中构建不同任务之间切换结构的方式。它是一种形式化的图形建模语言，以层次化的节点组织为特征，用于描述和规划复杂系统中各种实体的交互和决策。",[76,7257,7258],{},"nav2_bt_navigator",[76,7260,7261],{},"\u002Fbt_navigator","是Nav2中的行为树导航器节点，它实现了基于行为树的导航策略。行为树是一种用于描述复杂行为的树状结构，通过组合不同的行为节点，可以灵活地定义机器人的导航行为，包括路径规划、避障、恢复等。以下是官网。",[20,7264,7265],{},[288,7266,7267],{"href":7267,"rel":7268},"https:\u002F\u002Fwww.behaviortree.dev\u002F",[292],[20,7270,7271],{},[288,7272,7273],{"href":7273,"rel":7274},"https:\u002F\u002Farxiv.org\u002Fabs\u002F1709.00084",[292],[20,7276,7277],{},"github链接如下：",[20,7279,7280],{},[288,7281,7282],{"href":7282,"rel":7283},"https:\u002F\u002Fgithub.com\u002FBehaviorTree\u002FBehaviorTree.CPP",[292],[20,7285,7286],{},"BT可视化工具Groot2下载：",[20,7288,7289],{},[288,7290,7291],{"href":7291,"rel":7292},"https:\u002F\u002Fwww.behaviortree.dev\u002Fgroot\u002F",[292],[311,7294,7295],{},[51,7296,531],{},[533,7298,7299,7309],{},[536,7300,7301],{},[539,7302,7303,7305,7307],{},[542,7304,545],{"align":544},[542,7306,4126],{"align":544},[542,7308,551],{"align":544},[553,7310,7311,7322,7331],{},[539,7312,7313,7316,7319],{},[558,7314,7315],{"align":544},"\u002Fgoal_pose",[558,7317,7318],{"align":544},"geometry_msgs\u002Fmsg\u002FPoseStamped",[558,7320,7321],{"align":544},"导航目标点，用于触发导航任务",[539,7323,7324,7326,7328],{},[558,7325,571],{"align":544},[558,7327,574],{"align":544},[558,7329,7330],{"align":544},"坐标变换消息，用于不同坐标系之间的转换",[539,7332,7333,7335,7337],{},[558,7334,2737],{"align":544},[558,7336,2740],{"align":544},[558,7338,7339],{"align":544},"里程计数据，提供机器人位置和运动信息",[311,7341,7342],{"start":116},[51,7343,7344],{},"请求的Action",[533,7346,7347,7358],{},[536,7348,7349],{},[539,7350,7351,7354,7356],{},[542,7352,7353],{"align":544},"Action",[542,7355,4126],{"align":544},[542,7357,551],{"align":544},[553,7359,7360],{},[539,7361,7362,7365,7368],{},[558,7363,7364],{"align":544},"\u002Fnavigate_to_pose",[558,7366,7367],{"align":544},"nav2_msgs\u002Faction\u002FNavigateToPose",[558,7369,7370],{"align":544},"请求导航到指定位姿的Action，包括目标位姿和容忍度等参数",[311,7372,7373],{"start":138},[51,7374,825],{},[48,7376,7377,7382,7388,7394,7400,7406,7412,7418,7424,7430],{},[51,7378,7379,7381],{},[76,7380,5754],{},": 指定是否使用模拟时间而非实际时间。",[51,7383,7384,7387],{},[76,7385,7386],{},"global_frame",": 定义全局坐标系的名称，通常为地图坐标系。",[51,7389,7390,7393],{},[76,7391,7392],{},"robot_base_frame",": 指定机器人基座的坐标系名称。",[51,7395,7396,7399],{},[76,7397,7398],{},"odom_topic",": 里程计数据的ROS话题名称。",[51,7401,7402,7405],{},[76,7403,7404],{},"bt_loop_duration",": 行为树执行循环的持续时间（单位可能根据实现而异）。",[51,7407,7408,7411],{},[76,7409,7410],{},"default_server_timeout",": 导航服务器操作的默认超时时间。",[51,7413,7414,7417],{},[76,7415,7416],{},"enable_groot_monitoring",": 启用或禁用Groot监控功能。",[51,7419,7420,7423],{},[76,7421,7422],{},"groot_zmq_publisher_port",": Groot监控中ZeroMQ发布者的端口号。",[51,7425,7426,7429],{},[76,7427,7428],{},"groot_zmq_server_port",": Groot监控中ZeroMQ服务器的端口号。",[51,7431,7432,7435],{},[76,7433,7434],{},"plugin_lib_names",": Nav2 Jazzy 官方示例说明该参数用于添加自定义 BT 插件；Nav2 内置 BT 插件会自动加载，所以没有自定义 BT 插件时不要配置空列表。",[16,7437,7438],{"id":7438},"规划器节点说明",[20,7440,7441,7442,7168,7445,7448,7449,7452],{},"在Nav2 导航框架中",[76,7443,7444],{},"nav2_planner",[76,7446,7447],{},"planner_server","节点，负责处理路径规划请求，生成从当前位置到目标位置的路径。该节点在执行时需要依赖于",[76,7450,7451],{},"\u002Fglobal_costmap\u002Fglobal_costmap","节点提供的地图消息。",[311,7454,7455],{},[51,7456,7457],{},"planner_server发布的话题",[533,7459,7460,7470],{},[536,7461,7462],{},[539,7463,7464,7466,7468],{},[542,7465,545],{"align":544},[542,7467,4126],{"align":544},[542,7469,551],{"align":544},[553,7471,7472],{},[539,7473,7474,7477,7480],{},[558,7475,7476],{"align":544},"\u002Fplan",[558,7478,7479],{"align":544},"nav_msgs\u002Fmsg\u002FPath",[558,7481,7482],{"align":544},"当前位置到目标点的全局路径",[311,7484,7485],{"start":116},[51,7486,7487],{},"planner_server 参数",[48,7489,7490,7498,7536,7542,7551],{},[51,7491,7492,7494,7495,7497],{},[76,7493,7188],{},": 这个参数控制是否禁用心跳超时检测，在ROS 2中，节点之间的通信绑定（bonding）机制用于增强通信的可靠性。心跳超时是检测节点是否仍然活跃的一种机制。如果该参数设置为",[76,7496,2020],{},"，则表示禁用了心跳超时检测，这可能在某些特定的网络环境下或当确信节点间通信非常稳定时使用。",[51,7499,7500,7503,7504],{},[76,7501,7502],{},"GridBased",": 这是一个配置块，专门用于设置基于网格的规划器的参数。基于网格的规划器通常使用地图的网格化表示来规划路径。",[48,7505,7506,7512,7518,7524,7530],{},[51,7507,7508,7511],{},[76,7509,7510],{},"allow_unknown",": 控制规划器是否允许在地图的未知（即未探索）区域中规划路径。",[51,7513,7514,7517],{},[76,7515,7516],{},"plugin",": 指定使用的规划器插件。",[51,7519,7520,7523],{},[76,7521,7522],{},"tolerance",": 设置规划路径时的容忍度，通常用于考虑机器人尺寸和定位的不确定性。",[51,7525,7526,7529],{},[76,7527,7528],{},"use_astar",": 控制是否使用A* 算法进行路径规划*。A** 算法是一种启发式搜索算法，能够找到从起点到终点的最短路径。",[51,7531,7532,7535],{},[76,7533,7534],{},"use_final_approach_orientation",": 控制规划器是否在路径的终点附近考虑机器人的最终朝向。",[51,7537,7538,7541],{},[76,7539,7540],{},"expected_planner_frequency",": 这个参数表示对规划器生成新路径的频率的预期值。它帮助系统监控规划器的性能，并可能用于调试或性能优化。",[51,7543,7544,7547,7548,7550],{},[76,7545,7546],{},"planner_plugins",": 这是一个列表，指定了可用的规划器插件。在这个例子中，它只包含了一个",[76,7549,7502],{},"规划器，但理论上可以包含多个不同类型的规划器，以适应不同的导航需求。",[51,7552,7553,7555,7556,7558],{},[76,7554,5754],{},": 这个参数控制是否使用模拟时间。在仿真环境中，时间是由仿真软件控制的，而不是由实际的物理时钟控制的。将此参数设置为",[76,7557,2020],{},"允许节点在仿真环境中正常运行，而无需依赖实际的系统时间。这对于开发和测试导航算法非常有用。",[311,7560,7561],{"start":138},[51,7562,7563],{},"\u002Fglobal_costmap\u002Fglobal_costmap订阅的话题",[533,7565,7566,7576],{},[536,7567,7568],{},[539,7569,7570,7572,7574],{},[542,7571,545],{"align":544},[542,7573,4126],{"align":544},[542,7575,551],{"align":544},[553,7577,7578,7589,7598],{},[539,7579,7580,7583,7586],{},[558,7581,7582],{"align":544},"\u002Fglobal_costmap\u002Ffootprint",[558,7584,7585],{"align":544},"geometry_msgs\u002Fmsg\u002FPolygon",[558,7587,7588],{"align":544},"机器人（或任何移动平台）的足迹（footprint）信息。足迹是机器人在地图上占据的空间形状，通常用多边形表示。",[539,7590,7591,7593,7595],{},[558,7592,685],{"align":544},[558,7594,688],{"align":544},[558,7596,7597],{"align":544},"发布环境地图，特别是用于导航的占用网格图（Occupancy Grid Map）。",[539,7599,7600,7602,7604],{},[558,7601,560],{"align":544},[558,7603,563],{"align":544},[558,7605,7606],{"align":544},"激光扫描数据。",[311,7608,7609],{"start":145},[51,7610,7611],{},"\u002Fglobal_costmap\u002Fglobal_costmap发布的话题",[533,7613,7614,7624],{},[536,7615,7616],{},[539,7617,7618,7620,7622],{},[542,7619,545],{"align":544},[542,7621,4126],{"align":544},[542,7623,551],{"align":544},[553,7625,7626,7636,7647,7658],{},[539,7627,7628,7631,7633],{},[558,7629,7630],{"align":544},"\u002Fglobal_costmap\u002Fcostmap",[558,7632,688],{"align":544},[558,7634,7635],{"align":544},"发布全局代价地图的当前状态。",[539,7637,7638,7641,7644],{},[558,7639,7640],{"align":544},"\u002Fglobal_costmap\u002Fcostmap_raw",[558,7642,7643],{"align":544},"nav2_msgs\u002Fmsg\u002FCostmap",[558,7645,7646],{"align":544},"未经进一步处理的原始代价地图数据。",[539,7648,7649,7652,7655],{},[558,7650,7651],{"align":544},"\u002Fglobal_costmap\u002Fcostmap_updates",[558,7653,7654],{"align":544},"map_msgs\u002Fmsg\u002FOccupancyGridUpdate",[558,7656,7657],{"align":544},"全局代价地图的更新，该消息可以高效更新地图。",[539,7659,7660,7663,7666],{},[558,7661,7662],{"align":544},"\u002Fglobal_costmap\u002Fpublished_footprint",[558,7664,7665],{"align":544},"geometry_msgs\u002Fmsg\u002FPolygonStamped",[558,7667,7668],{"align":544},"发布机器人的足迹（footprint），即机器人在地图上占据的空间形状。",[311,7670,7671],{"start":152},[51,7672,7673],{},"\u002Fglobal_costmap\u002Fglobal_costmap参数",[48,7675,7676,7681,7687,7693,7699,7705,7711,7716,7725,7768,7774,7779,7785,7835,7844,7850,7856,7861,7866,7872,7878,7917,7923,7928,7934,7940,7946,7952,7957],{},[51,7677,7678,7680],{},[76,7679,7188],{},": 控制是否禁用心跳超时检测，这在节点间通信绑定时用于监控对方节点的活跃度。",[51,7682,7683,7686],{},[76,7684,7685],{},"always_send_full_costmap",": 控制是否总是发送完整的代价地图信息，而不是仅发送变化的部分。",[51,7688,7689,7692],{},[76,7690,7691],{},"clearable_layers",": 列出可以被清除的代价图层，这些图层中的障碍物信息可以通过某种方式（如传感器数据）被更新或清除。",[51,7694,7695,7698],{},[76,7696,7697],{},"filters",": 定义应用于代价地图的过滤器列表，用于预处理或修改地图数据。",[51,7700,7701,7704],{},[76,7702,7703],{},"footprint",": 指定机器人在地图上的足迹形状，即机器人占据的空间范围。",[51,7706,7707,7710],{},[76,7708,7709],{},"footprint_padding",": 为机器人的足迹添加额外的填充空间，以考虑机器人运动时的额外空间需求。",[51,7712,7713,7715],{},[76,7714,7386],{},": 定义全局代价地图所使用的参考坐标系。",[51,7717,7718,2673,7721,7724],{},[76,7719,7720],{},"height",[76,7722,7723],{},"width",": 定义全局代价地图的高度和宽度（以单元格数计）。",[51,7726,7727,7730,7731],{},[76,7728,7729],{},"inflation_layer",": 配置膨胀层的参数，膨胀层用于在障碍物周围增加一定宽度的“缓冲区”，以避免机器人与障碍物过近。",[48,7732,7733,7739,7745,7751,7757,7763],{},[51,7734,7735,7738],{},[76,7736,7737],{},"cost_scaling_factor",": 膨胀成本的缩放因子。",[51,7740,7741,7744],{},[76,7742,7743],{},"enabled",": 控制膨胀层是否启用。",[51,7746,7747,7750],{},[76,7748,7749],{},"inflate_around_unknown",": 控制是否在未知空间周围进行膨胀。",[51,7752,7753,7756],{},[76,7754,7755],{},"inflate_unknown",": 控制是否将未知空间视为障碍物并进行膨胀。",[51,7758,7759,7762],{},[76,7760,7761],{},"inflation_radius",": 膨胀的半径。",[51,7764,7765,7767],{},[76,7766,7516],{},": 指定使用的膨胀层插件。",[51,7769,7770,7773],{},[76,7771,7772],{},"lethal_cost_threshold",": 定义代价地图中视为“致命”障碍物的成本阈值。",[51,7775,7776,7778],{},[76,7777,5911],{},": 指定订阅以获取地图信息的ROS话题。",[51,7780,7781,7784],{},[76,7782,7783],{},"observation_sources",": 定义代价地图的观测源，即哪些传感器或数据源用于更新地图。",[51,7786,7787,7790,7791],{},[76,7788,7789],{},"obstacle_layer",": 配置障碍物层的参数，障碍物层负责处理传感器观测到的障碍物信息。",[48,7792,7793,7799,7804,7810,7819,7824,7829],{},[51,7794,7795,7798],{},[76,7796,7797],{},"combination_method",": 定义如何组合多个观测源的信息。",[51,7800,7801,7803],{},[76,7802,7743],{},": 控制障碍物层是否启用。",[51,7805,7806,7809],{},[76,7807,7808],{},"footprint_clearing_enabled",": 控制是否清除机器人足迹内的障碍物信息。",[51,7811,7812,2673,7815,7818],{},[76,7813,7814],{},"max_obstacle_height",[76,7816,7817],{},"min_obstacle_height",": 定义障碍物的高度范围。",[51,7820,7821,7823],{},[76,7822,7783],{},": 指定障碍物信息的来源。",[51,7825,7826,7828],{},[76,7827,7516],{},": 指定使用的障碍物层插件。",[51,7830,7831,7834],{},[76,7832,7833],{},"scan",": 包含与激光扫描相关的配置，如扫描数据的处理方式。",[51,7836,7837,2673,7840,7843],{},[76,7838,7839],{},"origin_x",[76,7841,7842],{},"origin_y",": 定义全局代价地图原点的坐标。",[51,7845,7846,7849],{},[76,7847,7848],{},"plugins",": 列出启用的代价地图插件，这些插件定义了如何构建和更新代价地图。",[51,7851,7852,7855],{},[76,7853,7854],{},"publish_frequency",": 定义发布代价地图的频率。",[51,7857,7858,7860],{},[76,7859,980],{},": 定义代价地图的分辨率，即每个单元格代表的实际物理尺寸。",[51,7862,7863,7865],{},[76,7864,7392],{},": 定义机器人基座的参考坐标系。",[51,7867,7868,7871],{},[76,7869,7870],{},"robot_radius",": 定义机器人的半径，用于计算机器人在地图上的占用空间。",[51,7873,7874,7877],{},[76,7875,7876],{},"rolling_window",": 控制是否使用滚动窗口（即动态变化的地图区域）而非固定大小的地图。",[51,7879,7880,7883,7884],{},[76,7881,7882],{},"static_layer",": 配置静态层的参数，静态层负责处理地图中的静态障碍物信息。",[48,7885,7886,7891,7896,7901,7906,7912],{},[51,7887,7888,7890],{},[76,7889,7743],{},": 控制静态层是否启用。",[51,7892,7893,7895],{},[76,7894,4168],{},": 控制是否订阅瞬态本地地图更新。",[51,7897,7898,7900],{},[76,7899,5911],{},": 指定静态地图的ROS话题（如果不同于全局地图）。",[51,7902,7903,7905],{},[76,7904,7516],{},": 指定使用的静态层插件。",[51,7907,7908,7911],{},[76,7909,7910],{},"subscribe_to_updates",": 控制是否订阅地图更新。",[51,7913,7914,7916],{},[76,7915,5748],{},": 定义坐标变换的容忍度。",[51,7918,7919,7922],{},[76,7920,7921],{},"track_unknown_space",": 控制是否跟踪地图中的未知空间。",[51,7924,7925,7927],{},[76,7926,5748],{},": 定义在坐标变换过程中允许的误差范围。",[51,7929,7930,7933],{},[76,7931,7932],{},"trinary_costmap",": 控制是否使用三态代价地图（空闲、占用、未知），而不是仅使用二态（空闲、占用）。",[51,7935,7936,7939],{},[76,7937,7938],{},"unknown_cost_value",": 定义在代价地图中表示未知空间的值。",[51,7941,7942,7945],{},[76,7943,7944],{},"update_frequency",": 定义更新代价地图的频率。",[51,7947,7948,7951],{},[76,7949,7950],{},"use_maximum",": 控制是否使用多个观测源中的最大值来更新代价地图。",[51,7953,7954,7956],{},[76,7955,5754],{},": 控制是否使用仿真时间（在仿真环境中很有用）。",[51,7958,7959,7962,7963],{},[76,7960,7961],{},"voxel_layer",": 配置体素层的参数，体素层使用体素网格来表示三维空间中的障碍物信息。",[48,7964,7965,7970,7975,7984,7991,7996,8002,8007,8013,8017],{},[51,7966,7967,7969],{},[76,7968,7743],{},": 控制体素层是否启用。",[51,7971,7972,7974],{},[76,7973,7808],{},": 控制是否清除机器人足迹内的体素信息。",[51,7976,7977,2673,7980,7983],{},[76,7978,7979],{},"mark_threshold",[76,7981,7982],{},"unknown_threshold",": 定义将体素视为障碍物或未知的阈值。",[51,7985,7986,2673,7988,7990],{},[76,7987,7814],{},[76,7989,7817],{},": 定义体素表示的障碍物的高度范围。",[51,7992,7993,7995],{},[76,7994,7783],{},": 指定体素信息的来源。",[51,7997,7998,8001],{},[76,7999,8000],{},"origin_z",": 定义体素网格在Z轴上的原点。",[51,8003,8004,8006],{},[76,8005,7516],{},": 指定使用的体素层插件。",[51,8008,8009,8012],{},[76,8010,8011],{},"publish_voxel_map",": 控制是否发布体素地图。",[51,8014,8015,7834],{},[76,8016,7833],{},[51,8018,8019,2673,8022,8025],{},[76,8020,8021],{},"z_resolution",[76,8023,8024],{},"z_voxels",": 定义体素网格在Z轴上的分辨率和体素数。",[16,8027,8028],{"id":8028},"控制器节点说明",[20,8030,8031,8032,8035,8036,8039,8040,8042,8043,7452],{},"在Nav2导航系统中",[76,8033,8034],{},"nav2_controller","功能包的",[76,8037,8038],{},"controller_server","负责处理导航任务中的控制请求，确保机器人能够按照规划的路径进行移动。其主要功能是根据",[76,8041,7444],{},"模块计算出的全局或局部路径，生成速度、方向控制的命令，即控制机器人沿着规划好的路径行走。该节点在执行时还需要依赖于",[76,8044,8045],{},"\u002Flocal_costmap\u002Flocal_costmap",[20,8047,8048],{},[23,8049,8050],{},"1.controller_server订阅的话题",[533,8052,8053,8063],{},[536,8054,8055],{},[539,8056,8057,8059,8061],{},[542,8058,545],{"align":544},[542,8060,4126],{"align":544},[542,8062,551],{"align":544},[553,8064,8065,8074],{},[539,8066,8067,8069,8071],{},[558,8068,2737],{"align":544},[558,8070,2740],{"align":544},[558,8072,8073],{"align":544},"机器人的里程计信息，包含位置、速度和姿态",[539,8075,8076,8079,8082],{},[558,8077,8078],{"align":544},"\u002Fspeed_limit",[558,8080,8081],{"align":544},"nav2_msgs\u002Fmsg\u002FSpeedLimit",[558,8083,8084],{"align":544},"导航过程中的速度限制信息，用于动态调整机器人的移动速度",[20,8086,8087],{},[23,8088,8089],{},"2.controller_server发布的话题",[533,8091,8092,8104],{},[536,8093,8094],{},[539,8095,8096,8099,8102],{},[542,8097,8098],{"align":544},"话题名称",[542,8100,8101],{"align":544},"消息类型",[542,8103,551],{"align":544},[553,8105,8106,8117,8128,8138,8149,8159],{},[539,8107,8108,8111,8114],{},[558,8109,8110],{"align":544},"\u002Fcmd_vel_nav",[558,8112,8113],{"align":544},"geometry_msgs\u002Fmsg\u002FTwist",[558,8115,8116],{"align":544},"发布控制命令，包括线性和角速度，用于控制机器人按照规划路径移动。",[539,8118,8119,8122,8125],{},[558,8120,8121],{"align":544},"\u002Fcost_cloud",[558,8123,8124],{"align":544},"sensor_msgs\u002Fmsg\u002FPointCloud2",[558,8126,8127],{"align":544},"发布成本地图中的点云数据，用于避障和路径规划。",[539,8129,8130,8133,8135],{},[558,8131,8132],{"align":544},"\u002Flocal_plan",[558,8134,7479],{"align":544},[558,8136,8137],{"align":544},"发布局部路径规划结果，即机器人应如何到达当前目标点附近的一个点。",[539,8139,8140,8143,8146],{},[558,8141,8142],{"align":544},"\u002Fmarker",[558,8144,8145],{"align":544},"visualization_msgs\u002Fmsg\u002FMarkerArray",[558,8147,8148],{"align":544},"发布可视化标记，用于在RViz等可视化工具中显示路径、障碍物等信息。",[539,8150,8151,8154,8156],{},[558,8152,8153],{"align":544},"\u002Freceived_global_plan",[558,8155,7479],{"align":544},[558,8157,8158],{"align":544},"发布从全局规划器接收到的全局路径，即当前位置到目标点的路径。",[539,8160,8161,8164,8166],{},[558,8162,8163],{"align":544},"\u002Ftransformed_global_plan",[558,8165,7479],{"align":544},[558,8167,8168],{"align":544},"发布经过坐标变换的全局路径，确保路径与机器人的当前坐标系一致。",[20,8170,8171],{},[23,8172,8173],{},"3.controller_server参数",[48,8175,8176,8210,8213,8216,8219,8222,8225,8228,8231,8234,8237,8240],{},[51,8177,8178,8179],{},"FollowPath: 这个部分定义了一个名为FollowPath的插件或配置集，它可能是一个路径跟随行为或算法的配置。它包含了多个子参数和子配置，用于定义如何跟随路径。",[48,8180,8181,8195,8198,8201,8204,8207],{},[51,8182,8183,8184],{},"BaseObstacle: 定义了基本的障碍物评估参数，用于在路径跟随过程中避免障碍物。",[48,8185,8186,8189,8192],{},[51,8187,8188],{},"class: 指定了类的名称，这里是BaseObstacle，表示这是一个基本障碍物评估组件。",[51,8190,8191],{},"scale: 定义了该障碍物评估在整体评估中的权重或影响程度。",[51,8193,8194],{},"sum_scores: 指示是否累加多个障碍物的分数，false可能表示使用最大值或其他逻辑。",[51,8196,8197],{},"GoalAlign, GoalDist, PathAlign, PathDist, RotateToGoal, Oscillation: 这些都是路径跟随过程中的不同评估或行为组件，每个都有其特定的参数和用途，如对齐目标、保持与目标或路径的距离、减少振荡等。",[51,8199,8200],{},"acc_lim_theta, acc_lim_x, acc_lim_y: 这些参数定义了机器人在不同方向上的加速度限制。",[51,8202,8203],{},"critics: 指定了哪些评估组件（或“批评家”）将被用于路径跟随决策。",[51,8205,8206],{},"debug_trajectory_details: 指示是否发布轨迹的详细调试信息。",[51,8208,8209],{},"其他与速度、加速度、时间粒度、轨迹生成等相关的参数，共同定义了路径跟随算法的行为和性能。",[51,8211,8212],{},"controller_frequency: 指定了控制器（可能是FollowPath或其他控制器）的运行频率，以赫兹为单位。",[51,8214,8215],{},"controller_plugins: 指定了将要使用的控制器插件列表，这里只包含了FollowPath。",[51,8217,8218],{},"failure_tolerance: 定义了容忍失败的时间或距离，用于在评估控制器是否失败时提供一定的缓冲。",[51,8220,8221],{},"general_goal_checker: 定义了一个通用的目标检查器，用于确定机器人是否已达到其目标位置和方向。",[51,8223,8224],{},"goal_checker_plugins: 指定了将要使用的目标检查器插件列表。",[51,8226,8227],{},"min_theta_velocity_threshold, min_x_velocity_threshold, min_y_velocity_threshold: 这些定义了机器人在不同方向上的最小速度阈值，低于这些阈值可能被视为停止或静止。",[51,8229,8230],{},"odom_topic: 指定了里程计信息的ROS主题。",[51,8232,8233],{},"progress_checker: 定义了一个进度检查器，用于评估机器人是否在向目标移动。",[51,8235,8236],{},"qos_overrides: 定义了ROS服务或主题的QoS（服务质量）覆盖设置，用于调整消息传递的可靠性和性能。",[51,8238,8239],{},"speed_limit_topic: 指定了速度限制信息的ROS主题。",[51,8241,8242],{},"use_sim_time: 指示是否使用模拟时间，这在ROS仿真环境中非常有用。",[20,8244,8245],{},[23,8246,8247],{},"4.\u002Flocal_costmap\u002Flocal_costmap订阅的话题",[533,8249,8250,8260],{},[536,8251,8252],{},[539,8253,8254,8256,8258],{},[542,8255,545],{"align":544},[542,8257,4126],{"align":544},[542,8259,551],{"align":544},[553,8261,8262,8272],{},[539,8263,8264,8267,8269],{},[558,8265,8266],{"align":544},"\u002Flocal_costmap\u002Ffootprint",[558,8268,7585],{"align":544},[558,8270,8271],{"align":544},"机器人或移动平台的足迹多边形，用于本地代价地图的计算",[539,8273,8274,8276,8278],{},[558,8275,560],{"align":544},[558,8277,563],{"align":544},[558,8279,8280],{"align":544},"激光扫描仪的扫描数据，用于环境感知和避障",[20,8282,8283],{},[23,8284,8285],{},"5.\u002Flocal_costmap\u002Flocal_costmap发布的话题",[533,8287,8288,8298],{},[536,8289,8290],{},[539,8291,8292,8294,8296],{},[542,8293,545],{"align":544},[542,8295,4126],{"align":544},[542,8297,551],{"align":544},[553,8299,8300,8310,8320,8330,8340,8350],{},[539,8301,8302,8305,8307],{},[558,8303,8304],{"align":544},"\u002Flocal_costmap\u002Fclearing_endpoints",[558,8306,8124],{"align":544},[558,8308,8309],{"align":544},"清除成本图上的障碍物点云数据，通常用于动态障碍物处理",[539,8311,8312,8315,8317],{},[558,8313,8314],{"align":544},"\u002Flocal_costmap\u002Fcostmap",[558,8316,688],{"align":544},[558,8318,8319],{"align":544},"本地成本图，表示机器人周围环境的可通行性",[539,8321,8322,8325,8327],{},[558,8323,8324],{"align":544},"\u002Flocal_costmap\u002Fcostmap_raw",[558,8326,7643],{"align":544},[558,8328,8329],{"align":544},"未经处理的本地成本图，可能包含更详细的信息",[539,8331,8332,8335,8337],{},[558,8333,8334],{"align":544},"\u002Flocal_costmap\u002Fcostmap_updates",[558,8336,7654],{"align":544},[558,8338,8339],{"align":544},"本地成本图的更新信息，包括哪些区域发生了变化",[539,8341,8342,8345,8347],{},[558,8343,8344],{"align":544},"\u002Flocal_costmap\u002Fpublished_footprint",[558,8346,7665],{"align":544},[558,8348,8349],{"align":544},"发布的机器人足迹多边形，时间戳表示发布时间",[539,8351,8352,8355,8358],{},[558,8353,8354],{"align":544},"\u002Flocal_costmap\u002Fvoxel_grid",[558,8356,8357],{"align":544},"nav2_msgs\u002Fmsg\u002FVoxelGrid",[558,8359,8360],{"align":544},"体素网格数据，用于成本图生成中的空间划分和优化",[20,8362,8363],{},[23,8364,8365],{},"6.\u002Flocal_costmap\u002Flocal_costmap参数",[48,8367,8368,8376,8384,8397,8402,8407,8412,8417,8422,8427,8432,8437,8442,8447,8454,8459,8464,8469,8474,8479,8487,8492,8497,8502,8507,8512,8517,8522],{},[51,8369,8370,8372,8373,8375],{},[76,8371,7188],{},": 是否禁用节点间的心跳超时检查。当设置为",[76,8374,2020],{},"时，表示禁用该功能，可能用于减少网络通信量或适应特定网络环境。",[51,8377,8378,8380,8381,8383],{},[76,8379,7685],{},": 是否总是发送完整的成本图。当设置为",[76,8382,2020],{},"时，节点将不依赖于增量更新，而是始终发送完整的成本图数据。",[51,8385,8386,8388,8389,5799,8391,2673,8393,8396],{},[76,8387,7691],{},": 指定可以被清除的层列表。在这个例子中，包括",[76,8390,7789],{},[76,8392,7961],{},[76,8394,8395],{},"range_layer","，这意味着这些层中的障碍物数据可以被清除。",[51,8398,8399,8401],{},[76,8400,7697],{},": 用于指定应用于成本图的过滤器列表。此处为空，表示没有应用任何过滤器。",[51,8403,8404,8406],{},[76,8405,7703],{},": 机器人的足迹多边形，定义了机器人在二维空间中的物理占用区域。",[51,8408,8409,8411],{},[76,8410,7709],{},": 足迹的填充量，用于在计算成本图时给机器人足迹添加额外的空间。",[51,8413,8414,8416],{},[76,8415,7386],{},": 全局参考坐标系的名称，通常用于定位和导航任务。",[51,8418,8419,8421],{},[76,8420,7720],{},": 成本图的高度（以单元格数量计）。",[51,8423,8424,8426],{},[76,8425,7729],{},": 膨胀层的配置，用于在障碍物周围添加一定范围的膨胀区域，使机器人与障碍物保持安全距离。",[51,8428,8429,8431],{},[76,8430,7772],{},": 致命成本阈值，超过此阈值的成本值表示不可通行的区域。",[51,8433,8434,8436],{},[76,8435,5911],{},": 订阅的地图主题名称，用于获取全局地图信息。",[51,8438,8439,8441],{},[76,8440,7783],{},": 观察源的配置，用于指定哪些传感器数据将被用于更新成本图。此处为空字符串，可能是默认值或配置方式的不同。",[51,8443,8444,8446],{},[76,8445,7789],{},": 障碍物层的配置，用于处理来自传感器（如激光雷达）的障碍物数据。",[51,8448,8449,3726,8451,8453],{},[76,8450,7839],{},[76,8452,7842],{},": 成本图原点的X和Y坐标，定义了成本图在全局坐标系中的位置。",[51,8455,8456,8458],{},[76,8457,7848],{},": 启用的插件列表，定义了成本图使用的不同层（如障碍物层、膨胀层等）。",[51,8460,8461,8463],{},[76,8462,7854],{},": 成本图的发布频率（以Hz为单位）。",[51,8465,8466,8468],{},[76,8467,980],{},": 成本图的分辨率（以米\u002F单元格计）。",[51,8470,8471,8473],{},[76,8472,7392],{},": 机器人基座的参考坐标系名称，用于定位机器人。",[51,8475,8476,8478],{},[76,8477,7870],{},": 机器人的半径，用于在成本图中表示机器人的物理尺寸。",[51,8480,8481,8483,8484,8486],{},[76,8482,7876],{},": 是否使用滚动窗口。当设置为",[76,8485,2020],{},"时，成本图将随着机器人的移动而更新其位置和范围。",[51,8488,8489,8491],{},[76,8490,7921],{},": 是否跟踪未知空间。在某些情况下，这可能用于处理未探索或未知的区域。",[51,8493,8494,8496],{},[76,8495,5748],{},": 变换容差，定义了接受变换的时间差和角度差的阈值。",[51,8498,8499,8501],{},[76,8500,7932],{},": 是否使用三态成本图（通常是自由、占用、未知）。",[51,8503,8504,8506],{},[76,8505,7938],{},": 未知区域在成本图中的成本值。",[51,8508,8509,8511],{},[76,8510,7944],{},": 成本图的更新频率（以Hz为单位），不同于发布频率。",[51,8513,8514,8516],{},[76,8515,7950],{},": 是否在多个源提供相同位置的成本信息时使用最大值。",[51,8518,8519,8521],{},[76,8520,5754],{},": 是否使用模拟时间而非系统时间。这在仿真环境中很有用。",[51,8523,8524,8526],{},[76,8525,7961],{},": 体素层的配置，用于将三维空间划分为体素（体积像素），以提高成本图的处理效率。",[16,8528,8529],{"id":8529},"恢复器节点说明",[20,8531,8532,8533,8035,8536,8539],{},"恢复行为是机器人导航过程中一个至关重要的部分，它允许机器人在遇到障碍、卡住或其他导航问题时采取一系列预定义的动作来尝试恢复。在Nav2中由",[76,8534,8535],{},"nav2_behaviors",[76,8537,8538],{},"behavior_server","实现这一功能。",[20,8541,8542],{},[23,8543,5543],{},[533,8545,8546,8556],{},[536,8547,8548],{},[539,8549,8550,8552,8554],{},[542,8551,545],{"align":544},[542,8553,4126],{"align":544},[542,8555,551],{"align":544},[553,8557,8558,8569,8579,8588,8597],{},[539,8559,8560,8563,8566],{},[558,8561,8562],{"align":544},"\u002Fclock",[558,8564,8565],{"align":544},"rosgraph_msgs\u002Fmsg\u002FClock",[558,8567,8568],{"align":544},"ROS系统时间",[539,8570,8571,8574,8576],{},[558,8572,8573],{"align":544},"\u002Fcmd_vel_teleop",[558,8575,8113],{"align":544},[558,8577,8578],{"align":544},"遥操作命令，用于控制机器人的线性和角速度",[539,8580,8581,8583,8585],{},[558,8582,8324],{"align":544},[558,8584,7643],{"align":544},[558,8586,8587],{"align":544},"局部代价地图的原始数据",[539,8589,8590,8592,8594],{},[558,8591,8344],{"align":544},[558,8593,7665],{"align":544},[558,8595,8596],{"align":544},"机器人在局部代价地图中的已发布足迹",[539,8598,8599,8602,8605],{},[558,8600,8601],{"align":544},"\u002Fpreempt_teleop",[558,8603,8604],{"align":544},"std_msgs\u002Fmsg\u002FEmpty",[558,8606,8607],{"align":544},"遥操作抢占信号，用于中断当前遥操作",[20,8609,8610],{},[23,8611,5602],{},[533,8613,8614,8624],{},[536,8615,8616],{},[539,8617,8618,8620,8622],{},[542,8619,545],{"align":544},[542,8621,4126],{"align":544},[542,8623,551],{"align":544},[553,8625,8626],{},[539,8627,8628,8631,8633],{},[558,8629,8630],{"align":544},"\u002Fcmd_vel",[558,8632,8113],{"align":544},[558,8634,8635],{"align":544},"发送给底层控制器的速度命令",[20,8637,8638],{},[23,8639,8640],{},"3.提供的Action服务器",[533,8642,8643,8654],{},[536,8644,8645],{},[539,8646,8647,8649,8652],{},[542,8648,545],{"align":544},[542,8650,8651],{"align":544},"Action接口",[542,8653,551],{"align":544},[553,8655,8656,8667,8678,8689,8700],{},[539,8657,8658,8661,8664],{},[558,8659,8660],{"align":544},"\u002Fassisted_teleop",[558,8662,8663],{"align":544},"nav2_msgs\u002Faction\u002FAssistedTeleop",[558,8665,8666],{"align":544},"遥控辅助操作服务，允许用户在导航时提供方向性输入",[539,8668,8669,8672,8675],{},[558,8670,8671],{"align":544},"\u002Fbackup",[558,8673,8674],{"align":544},"nav2_msgs\u002Faction\u002FBackUp",[558,8676,8677],{"align":544},"后退动作服务，用于在特定情况下使机器人后退",[539,8679,8680,8683,8686],{},[558,8681,8682],{"align":544},"\u002Fdrive_on_heading",[558,8684,8685],{"align":544},"nav2_msgs\u002Faction\u002FDriveOnHeading",[558,8687,8688],{"align":544},"按指定航向行驶的动作服务",[539,8690,8691,8694,8697],{},[558,8692,8693],{"align":544},"\u002Fspin",[558,8695,8696],{"align":544},"nav2_msgs\u002Faction\u002FSpin",[558,8698,8699],{"align":544},"旋转动作服务，允许机器人在原地旋转",[539,8701,8702,8705,8708],{},[558,8703,8704],{"align":544},"\u002Fwait",[558,8706,8707],{"align":544},"nav2_msgs\u002Faction\u002FWait",[558,8709,8710],{"align":544},"等待动作服务，使机器人在当前位置等待一定时间",[20,8712,8713],{},[23,8714,5691],{},[48,8716,8717,8722,8730,8735,8740,8748,8766,8772,8778,8784,8790,8802,8808,8814,8823],{},[51,8718,8719,8721],{},[76,8720,5754],{},": 该参数指定是否使用模拟时间而非实际时间。这在仿真环境中非常有用，因为仿真环境可以加速或减速时间流逝，而不需要等待实际时间的流逝。",[51,8723,8724,8726,8727,8729],{},[76,8725,7386],{},": 定义全局坐标系的名称，该坐标系通常用于导航任务中的定位和路径规划。在这里，它被设置为",[76,8728,5735],{},"，意味着使用里程计数据来作为全局坐标系的参考。",[51,8731,8732,8734],{},[76,8733,7392],{},": 指定机器人基座的坐标系名称。这是机器人上用于定位和运动控制的参考点，通常与机器人的物理中心或驱动轮的中心相对应。",[51,8736,8737,8739],{},[76,8738,7398],{},": 这是一个ROS话题名称，用于发布里程计数据。里程计数据包含了机器人随时间推移的位置和姿态变化信息，是导航和定位系统的关键输入之一。",[51,8741,8742,8744,8745,8747],{},[76,8743,7188],{},"：这个参数可能用于配置ROS节点之间的心跳检测机制。将其设置为",[76,8746,2020],{},"可能意味着禁用或调整心跳超时的行为，以便在特定情况下（如仿真环境）避免不必要的超时错误。",[51,8749,8750,3726,8753,3726,8756,3726,8759,3726,8762,8765],{},[76,8751,8752],{},"assisted_teleop",[76,8754,8755],{},"backup",[76,8757,8758],{},"drive_on_heading",[76,8760,8761],{},"spin",[76,8763,8764],{},"wait",": 这些是行为树中可能使用的行为插件的配置项。每个插件都定义了机器人可以执行的一种特定行为，如辅助遥操作、后退、按指定方向行驶、原地旋转和等待。",[51,8767,8768,8771],{},[76,8769,8770],{},"behavior_plugins",": 列出了在行为树中可用的行为插件名称。",[51,8773,8774,8777],{},[76,8775,8776],{},"cmd_vel_teleop",": 指定了用于遥操作的速度控制命令的ROS话题名称。",[51,8779,8780,8783],{},[76,8781,8782],{},"costmap_topic",": 定义了局部代价地图的ROS话题名称，代价地图用于表示环境中的障碍物和可通行区域。",[51,8785,8786,8789],{},[76,8787,8788],{},"cycle_frequency",": 定义了导航系统更新其状态和规划新路径的频率（以赫兹为单位）。",[51,8791,8792,3726,8795,3726,8798,8801],{},[76,8793,8794],{},"max_rotational_vel",[76,8796,8797],{},"min_rotational_vel",[76,8799,8800],{},"rotational_acc_lim",": 这些参数定义了机器人旋转时的最大速度、最小速度和加速度限制。",[51,8803,8804,8807],{},[76,8805,8806],{},"projection_time",": 与代价地图的更新或预测未来障碍物位置有关的时间参数。",[51,8809,8810,8813],{},[76,8811,8812],{},"footprint_topic",": 定义了发布机器人足迹（即机器人占据的空间）的ROS话题名称。",[51,8815,8816,3726,8819,8822],{},[76,8817,8818],{},"simulate_ahead_time",[76,8820,8821],{},"simulation_time_step",": 这些参数与仿真环境相关，可能用于控制仿真过程中的时间流逝和步长。",[51,8824,8825,8827],{},[76,8826,5748],{},": 定义了坐标变换时的容差范围，用于处理不同坐标系之间的微小差异。",[16,8829,8830],{"id":8830},"航点跟随节点说明",[20,8832,8833,8834,8837,8838,8841,8842,2673,8845,8848],{},"在Nav2 导航堆栈中，",[76,8835,8836],{},"nav2_waypoint_follower","包下的",[76,8839,8840],{},"\u002Fwaypoint_follower","节点负责跟踪由路径规划器生成的一系列航点（waypoints），以确保机器人能够沿着预定的路径安全、准确地移动。该节点的主要功能是根据当前机器人位置和速度信息，以及由路径规划器（如",[76,8843,8844],{},"nav2_global_planner",[76,8846,8847],{},"nav2_local_planner","）提供的航点列表，计算出控制指令来控制机器人的运动。这些控制指令可能包括线性和角速度命令，或者更具体的运动学或动力学命令，具体取决于机器人的类型和配置。",[20,8850,8851],{},[23,8852,8853],{},"1.提供的Action服务器",[533,8855,8856,8866],{},[536,8857,8858],{},[539,8859,8860,8862,8864],{},[542,8861,545],{"align":544},[542,8863,8651],{"align":544},[542,8865,551],{"align":544},[553,8867,8868],{},[539,8869,8870,8873,8876],{},[558,8871,8872],{"align":544},"\u002Ffollow_waypoints",[558,8874,8875],{"align":544},"nav2_msgs\u002Faction\u002FFollowWaypoints",[558,8877,8878],{"align":544},"允许客户端请求planner_server按照一系列路点进行导航",[20,8880,8881],{},[23,8882,8883],{},"2.请求的Action服务",[533,8885,8886,8896],{},[536,8887,8888],{},[539,8889,8890,8892,8894],{},[542,8891,545],{"align":544},[542,8893,8651],{"align":544},[542,8895,551],{"align":544},[553,8897,8898],{},[539,8899,8900,8902,8904],{},[558,8901,7364],{"align":544},[558,8903,7367],{"align":544},[558,8905,8906],{"align":544},"允许planner_server（或调用它的节点）请求导航到指定的位姿",[20,8908,8909],{},[23,8910,8911],{},"3.参数",[48,8913,8914,8919,8925,8931,8936,8942],{},[51,8915,8916,8918],{},[76,8917,5754],{},": 指定是否使用模拟时间而非实际时间进行节点的计时和同步。这在仿真环境中特别有用，因为仿真环境可能无法提供与真实时间完全同步的时钟。",[51,8920,8921,8924],{},[76,8922,8923],{},"loop_rate",": 定义了节点的主循环速率，即节点每秒执行其主要任务（如处理数据、发布信息等）的次数。这个参数对于控制节点的响应性和资源使用非常重要。",[51,8926,8927,8930],{},[76,8928,8929],{},"stop_on_failure",": 指明当导航任务遇到无法克服的障碍或达到其他失败条件时，节点是否应该停止执行。这对于确保在失败情况下系统能够安全地停止并等待进一步指令很重要。",[51,8932,8933,8935],{},[76,8934,5703],{},": 涉及节点间通信的可靠性机制。Bond是ROS 2中用于节点间稳定通信的一种机制，其中心跳信号用于检测节点是否仍然活跃。将此参数设置为true会禁用心跳超时检测，这可能在某些特定的网络配置或应用场景中是有用的。",[51,8937,8938,8941],{},[76,8939,8940],{},"waypoint_task_executor_plugin",": 指定了在执行路径点导航任务时要使用的插件。路径点导航通常涉及一系列预先定义的点，机器人需要按顺序访问这些点。这个参数允许用户指定用于执行这种类型任务的特定插件或算法。",[51,8943,8944,8947,8948],{},[76,8945,8946],{},"wait_at_waypoint",": 这是一个复合参数，用于配置在路径点等待的特定行为。",[48,8949,8950,8955,8960],{},[51,8951,8952,8954],{},[76,8953,7743],{},": 启用或禁用在到达每个路径点时等待的功能。",[51,8956,8957,8959],{},[76,8958,7516],{},": 指定实现等待功能的插件类型。这允许用户根据需要选择不同的等待策略或行为。",[51,8961,8962,8965],{},[76,8963,8964],{},"waypoint_pause_duration",": 定义了在每个路径点处等待的持续时间（以毫秒为单位）。这可以用于确保机器人在移动到下一个路径点之前已经稳定或已经完成了某些操作。",[16,8967,8968],{"id":8968},"路径平滑节点说明",[20,8970,8971,8972,7168,8975,8978],{},"在Nav2框架中",[76,8973,8974],{},"nav2_smoother",[76,8976,8977],{},"smoother_server","节点通过加载和运行各种平滑器插件，对规划出的路径进行平滑处理，使得机器人能够更流畅、连续且安全地移动。这一功能对于提高机器人的导航性能和减少硬件磨损具有重要意义。",[20,8980,8981],{},[23,8982,5543],{},[533,8984,8985,8995],{},[536,8986,8987],{},[539,8988,8989,8991,8993],{},[542,8990,545],{"align":544},[542,8992,4126],{"align":544},[542,8994,551],{"align":544},[553,8996,8997,9006],{},[539,8998,8999,9001,9003],{},[558,9000,7640],{"align":544},[558,9002,7643],{"align":544},[558,9004,9005],{"align":544},"全局代价地图的原始数据，用于路径规划",[539,9007,9008,9010,9012],{},[558,9009,7662],{"align":544},[558,9011,7665],{"align":544},[558,9013,9014],{"align":544},"机器人在全局代价地图中的足迹表示",[20,9016,9017],{},[23,9018,5602],{},[533,9020,9021,9031],{},[536,9022,9023],{},[539,9024,9025,9027,9029],{},[542,9026,545],{"align":544},[542,9028,4126],{"align":544},[542,9030,551],{"align":544},[553,9032,9033],{},[539,9034,9035,9038,9040],{},[558,9036,9037],{"align":544},"\u002Fplan_smoothed",[558,9039,7479],{"align":544},[558,9041,9042],{"align":544},"经过平滑处理后的全局路径",[20,9044,9045],{},[23,9046,8640],{},[533,9048,9049,9060],{},[536,9050,9051],{},[539,9052,9053,9055,9058],{},[542,9054,545],{"align":544},[542,9056,9057],{"align":544},"动作类型",[542,9059,551],{"align":544},[553,9061,9062],{},[539,9063,9064,9067,9070],{},[558,9065,9066],{"align":544},"\u002Fsmooth_path",[558,9068,9069],{"align":544},"nav2_msgs\u002Faction\u002FSmoothPath",[558,9071,9072],{"align":544},"提供平滑路径的服务，接受路径平滑的请求，并返回平滑后的路径。这允许客户端（如行为树）异步地请求路径平滑，并在平滑完成后接收结果。",[20,9074,9075],{},[23,9076,5691],{},[48,9078,9079,9084,9089,9094,9099,9144,9153,9158],{},[51,9080,9081,9083],{},[76,9082,7188],{},": 指示是否禁用Bond的心跳超时功能。在分布式系统中，Bond用于管理节点间的连接和心跳，此参数用于调整心跳相关的行为。",[51,9085,9086,9088],{},[76,9087,8782],{},": 代价地图数据的ROS话题名称，通常是全局代价地图的原始数据。",[51,9090,9091,9093],{},[76,9092,8812],{},": 机器人足迹（即机器人在地图上的占用区域）的ROS话题名称，用于在全局代价地图中表示机器人的物理尺寸。",[51,9095,9096,9098],{},[76,9097,7392],{},": 指定机器人基座的坐标系名称，这是机器人导航中用于定位和移动的参考点。",[51,9100,9101,7227,9104],{},[76,9102,9103],{},"simple_smoother",[48,9105,9106,9112,9118,9127,9132,9138],{},[51,9107,9108,9111],{},[76,9109,9110],{},"do_refinement",": 指示是否启用路径的细化（或进一步优化）过程。",[51,9113,9114,9117],{},[76,9115,9116],{},"max_its",": 平滑过程中允许的最大迭代次数，用于控制平滑算法的收敛时间。",[51,9119,9120,9122,9123,9126],{},[76,9121,7516],{},": 平滑插件的类型，这里是",[76,9124,9125],{},"nav2_smoother::SimpleSmoother","，表示使用简单的平滑算法。",[51,9128,9129,9131],{},[76,9130,7522],{},": 平滑算法的收敛容差，当路径变化小于此值时，认为平滑过程已完成。",[51,9133,9134,9137],{},[76,9135,9136],{},"w_data",": 平滑过程中数据项（如障碍物距离）的权重。",[51,9139,9140,9143],{},[76,9141,9142],{},"w_smooth",": 平滑过程中平滑项（如路径曲率）的权重。",[51,9145,9146,9149,9150,9152],{},[76,9147,9148],{},"smoother_plugins",": 定义的平滑插件列表，这里列出了",[76,9151,9103],{},"，表示将使用此插件进行路径平滑。",[51,9154,9155,9157],{},[76,9156,5748],{},": 坐标变换的容差，用于处理不同坐标系之间的转换时的不确定性。",[51,9159,9160,9162,9163,9165,9166,9168],{},[76,9161,5754],{},": 指定是否使用模拟时间而非实际时间。在仿真环境中，这通常设置为",[76,9164,2020],{},"，以匹配仿真器的虚拟时间；在真实环境中，应设置为",[76,9167,5812],{},"以使用ROS系统的实际时间。",[16,9170,9171],{"id":9171},"速度平滑节点说明",[20,9173,9174,9175,8837,9178,9181],{},"Nav2框架中的",[76,9176,9177],{},"nav2_velocity_smoother",[76,9179,9180],{},"velocity_smoother","节点主要负责平滑由Nav2框架发送给机器人控制器的速度指令。其核心功能是实现速度和加速度平滑。这一功能对于确保机器人在导航过程中的稳定性和安全性至关重要。",[20,9183,9184],{},[23,9185,5543],{},[533,9187,9188,9198],{},[536,9189,9190],{},[539,9191,9192,9194,9196],{},[542,9193,545],{"align":544},[542,9195,4126],{"align":544},[542,9197,551],{"align":544},[553,9199,9200],{},[539,9201,9202,9204,9206],{},[558,9203,8110],{"align":544},[558,9205,8113],{"align":544},[558,9207,9208],{"align":544},"接收来自其他节点的速度控制指令的话题",[20,9210,9211],{},[23,9212,5602],{},[533,9214,9215,9225],{},[536,9216,9217],{},[539,9218,9219,9221,9223],{},[542,9220,545],{"align":544},[542,9222,4126],{"align":544},[542,9224,551],{"align":544},[553,9226,9227],{},[539,9228,9229,9231,9233],{},[558,9230,8630],{"align":544},[558,9232,8113],{"align":544},[558,9234,9235],{"align":544},"发布经过处理或平滑后的速度控制指令的话题",[20,9237,9238],{},[23,9239,8911],{},[48,9241,9242,9250,9256,9266,9272,9278,9284,9290,9299,9307,9316,9322,9327],{},[51,9243,9244,9246,9247,9249],{},[76,9245,5703],{},": 指示是否禁用节点间的心跳超时机制。如果为",[76,9248,2020],{},"，则节点间的心跳检测不会因超时而断开连接。",[51,9251,9252,9255],{},[76,9253,9254],{},"deadband_velocity",": 定义在哪些速度分量上应用死区平滑（即忽略小于此阈值的微小速度变化）。这里分别为X轴、Y轴和偏航角速度（theta）设置了死区值。",[51,9257,9258,9261,9262,9265],{},[76,9259,9260],{},"feedback",": 指定速度平滑器的反馈类型。",[76,9263,9264],{},"OPEN_LOOP","表示开环控制，即不考虑机器人的实际速度反馈进行速度调整。",[51,9267,9268,9271],{},[76,9269,9270],{},"max_accel",": 定义机器人在各个方向上的最大加速度限制，包括X轴、Y轴和偏航角速度（theta）。",[51,9273,9274,9277],{},[76,9275,9276],{},"max_decel",": 定义机器人在各个方向上的最大减速度限制，包括X轴、Y轴和偏航角速度（theta）。注意，减速度值以负数表示。",[51,9279,9280,9283],{},[76,9281,9282],{},"max_velocity",": 定义机器人在各个方向上的最大速度限制，包括X轴、Y轴和偏航角速度（theta）。",[51,9285,9286,9289],{},[76,9287,9288],{},"min_velocity",": 定义机器人在各个方向上的最小速度限制，包括X轴、Y轴和偏航角速度（theta）。这通常用于避免发送过小的速度指令给底层控制器。",[51,9291,9292,9295,9296,9298],{},[76,9293,9294],{},"odom_duration",": 与里程计数据相关的参数，但在此上下文中可能不直接用于",[76,9297,9180],{},"节点，可能是遗留或与其他功能相关联。",[51,9300,9301,9303,9304,9306],{},[76,9302,7398],{},": 指定里程计数据的ROS话题名称，",[76,9305,9180],{},"节点将订阅此话题以获取机器人的运动信息。",[51,9308,9309,9312,9313,9315],{},[76,9310,9311],{},"scale_velocities",": 指示是否根据加速度限制同比例调整速度的其他分量。如果为",[76,9314,5812],{},"，则不会进行速度缩放。",[51,9317,9318,9321],{},[76,9319,9320],{},"smoothing_frequency",": 定义速度平滑操作的执行频率（Hz），即每秒进行多少次平滑计算。",[51,9323,9324,9326],{},[76,9325,5754],{},": 指定是否使用模拟时间而非实际系统时间。这对于仿真环境特别有用，可以确保时间的一致性和可预测性。",[51,9328,9329,9332,9333,9335],{},[76,9330,9331],{},"velocity_timeout",": 如果在指定时间内未接收到新的速度指令，则",[76,9334,9180],{},"节点将停止发布速度指令，并可能发送零速度指令以停止机器人运动。这是为了防止在失去速度控制时机器人继续移动。",[16,9337,9338],{"id":9338},"导航功能集成",[336,9340,9341],{},[20,9342,9343,9344,5799,9347,5799,9350,9353,9354,9357],{},"本节 Jazzy 版本的配置依据来自 Jazzy 官方安装路径里的示例文件和 Nav2 官方配置文档：",[76,9345,9346],{},"\u002Fopt\u002Fros\u002Fjazzy\u002Fshare\u002Fnav2_bringup\u002Fparams\u002Fnav2_params.yaml",[76,9348,9349],{},"\u002Fopt\u002Fros\u002Fjazzy\u002Fshare\u002Fnav2_bt_navigator\u002Fbehavior_trees\u002Fnavigate_to_pose_w_replanning_and_recovery.xml",[76,9351,9352],{},"\u002Fopt\u002Fros\u002Fjazzy\u002Fshare\u002Fnav2_bt_navigator\u002Fbehavior_trees\u002Fnavigate_through_poses_w_replanning_and_recovery.xml","，以及 Nav2 的配置说明页面。下面的工程参数使用当前工作空间中已经跑通的 ",[76,9355,9356],{},"mycar_navigation2_jazzy"," 配置。",[20,9359,9360],{},[23,9361,5958],{},[20,9363,5015],{},[70,9365,9367],{"className":72,"code":9366,"language":74,"meta":34,"style":34},"ros2 pkg create mycar_navigation2_jazzy --dependencies navigation2 nav2_common\n",[76,9368,9369],{"__ignoreMap":34},[79,9370,9371,9373,9375,9377,9380,9382,9385],{"class":81,"line":82},[79,9372,1203],{"class":85},[79,9374,1206],{"class":89},[79,9376,1209],{"class":89},[79,9378,9379],{"class":89}," mycar_navigation2_jazzy",[79,9381,1216],{"class":1215},[79,9383,9384],{"class":89}," navigation2",[79,9386,9387],{"class":89}," nav2_common\n",[20,9389,9390],{},[23,9391,5989],{},[20,9393,9394],{},"在功能包下，新建launch目录、params目录和bts目录。",[20,9396,9397,9398,1231],{},"launch目录下新建",[76,9399,9400],{},"nav2.launch.py",[70,9402,9404],{"className":1234,"code":9403,"language":1236,"meta":34,"style":34},"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",[76,9405,9406,9412,9416,9426,9430,9440,9450,9460,9464,9474,9486,9490,9502,9506,9510,9518,9522,9530,9536,9544,9548,9552,9564,9579,9583,9602,9620,9638,9656,9674,9692,9710,9714,9725,9733,9738,9748,9760,9769,9777,9782,9792,9797,9806,9811,9815,9825,9835,9845,9855,9865,9875,9885,9889,9898,9909,9920,9930,9940,9948,9953,9961,9965,9969,9973,9982,9993,10005,10016,10027,10036,10042,10051,10056,10066,10082,10087,10092,10097,10107,10119,10131,10142,10153,10162,10168,10177,10182,10187,10192,10202,10214,10226,10237,10248,10257,10263,10272,10277,10282,10287,10297,10309,10321,10332,10343,10356,10365,10371,10380,10385,10394,10407,10421,10426,10431,10436,10446,10458,10470,10481,10492,10501,10507,10516,10521,10526,10531,10541,10553,10565,10576,10587,10596,10602,10612,10618,10627,10633,10641,10647,10653,10659,10664,10672,10677,10684,10690,10695,10701,10706,10711,10716,10726,10737,10748,10760,10771,10780,10789,10802,10807,10816,10824,10832,10840,10848,10856,10864,10870,10876,10881,10886,10891,10896,10903,10908,10913,10919,10925,10931,10937,10943,10949,10955,10961],{"__ignoreMap":34},[79,9407,9408,9410],{"class":81,"line":82},[79,9409,1243],{"class":99},[79,9411,1246],{"class":106},[79,9413,9414],{"class":81,"line":116},[79,9415,142],{"emptyLinePlaceholder":141},[79,9417,9418,9420,9422,9424],{"class":81,"line":138},[79,9419,1255],{"class":99},[79,9421,1306],{"class":106},[79,9423,1243],{"class":99},[79,9425,1311],{"class":106},[79,9427,9428],{"class":81,"line":145},[79,9429,142],{"emptyLinePlaceholder":141},[79,9431,9432,9434,9436,9438],{"class":81,"line":152},[79,9433,1255],{"class":99},[79,9435,1258],{"class":106},[79,9437,1243],{"class":99},[79,9439,1263],{"class":106},[79,9441,9442,9444,9446,9448],{"class":81,"line":164},[79,9443,1255],{"class":99},[79,9445,1270],{"class":106},[79,9447,1243],{"class":99},[79,9449,1275],{"class":106},[79,9451,9452,9454,9456,9458],{"class":81,"line":176},[79,9453,1255],{"class":99},[79,9455,1282],{"class":106},[79,9457,1243],{"class":99},[79,9459,1287],{"class":106},[79,9461,9462],{"class":81,"line":181},[79,9463,142],{"emptyLinePlaceholder":141},[79,9465,9466,9468,9470,9472],{"class":81,"line":186},[79,9467,1255],{"class":99},[79,9469,1294],{"class":106},[79,9471,1243],{"class":99},[79,9473,1299],{"class":106},[79,9475,9476,9478,9481,9483],{"class":81,"line":197},[79,9477,1255],{"class":99},[79,9479,9480],{"class":106}," launch_ros.descriptions ",[79,9482,1243],{"class":99},[79,9484,9485],{"class":106}," ParameterFile\n",[79,9487,9488],{"class":81,"line":1346},[79,9489,142],{"emptyLinePlaceholder":141},[79,9491,9492,9494,9497,9499],{"class":81,"line":1361},[79,9493,1255],{"class":99},[79,9495,9496],{"class":106}," nav2_common.launch ",[79,9498,1243],{"class":99},[79,9500,9501],{"class":106}," RewrittenYaml\n",[79,9503,9504],{"class":81,"line":1366},[79,9505,142],{"emptyLinePlaceholder":141},[79,9507,9508],{"class":81,"line":1377},[79,9509,142],{"emptyLinePlaceholder":141},[79,9511,9512,9514,9516],{"class":81,"line":1386},[79,9513,1320],{"class":99},[79,9515,1323],{"class":85},[79,9517,1326],{"class":106},[79,9519,9520],{"class":81,"line":1400},[79,9521,142],{"emptyLinePlaceholder":141},[79,9523,9524,9526,9528],{"class":81,"line":1413},[79,9525,3093],{"class":106},[79,9527,1334],{"class":99},[79,9529,1374],{"class":106},[79,9531,9532,9534],{"class":81,"line":1423},[79,9533,1380],{"class":89},[79,9535,1383],{"class":106},[79,9537,9538,9540,9542],{"class":81,"line":1431},[79,9539,1390],{"class":1389},[79,9541,1334],{"class":99},[79,9543,6120],{"class":89},[79,9545,9546],{"class":81,"line":1447},[79,9547,3246],{"class":106},[79,9549,9550],{"class":81,"line":1461},[79,9551,142],{"emptyLinePlaceholder":141},[79,9553,9554,9556,9558,9560,9562],{"class":81,"line":1473},[79,9555,1331],{"class":106},[79,9557,1334],{"class":99},[79,9559,1337],{"class":106},[79,9561,1340],{"class":89},[79,9563,1343],{"class":106},[79,9565,9566,9569,9571,9574,9577],{"class":81,"line":1478},[79,9567,9568],{"class":106},"    current_pkg ",[79,9570,1334],{"class":99},[79,9572,9573],{"class":106}," get_package_share_directory(",[79,9575,9576],{"class":89},"\"mycar_navigation2_jazzy\"",[79,9578,1343],{"class":106},[79,9580,9581],{"class":81,"line":1489},[79,9582,142],{"emptyLinePlaceholder":141},[79,9584,9585,9588,9590,9593,9595,9597,9600],{"class":81,"line":1500},[79,9586,9587],{"class":106},"    bt_params_file ",[79,9589,1334],{"class":99},[79,9591,9592],{"class":106}," os.path.join(current_pkg, ",[79,9594,3217],{"class":89},[79,9596,1453],{"class":106},[79,9598,9599],{"class":89},"\"bt.yaml\"",[79,9601,1343],{"class":106},[79,9603,9604,9607,9609,9611,9613,9615,9618],{"class":81,"line":1506},[79,9605,9606],{"class":106},"    planner_params_file ",[79,9608,1334],{"class":99},[79,9610,9592],{"class":106},[79,9612,3217],{"class":89},[79,9614,1453],{"class":106},[79,9616,9617],{"class":89},"\"planner.yaml\"",[79,9619,1343],{"class":106},[79,9621,9622,9625,9627,9629,9631,9633,9636],{"class":81,"line":1517},[79,9623,9624],{"class":106},"    controller_params_file ",[79,9626,1334],{"class":99},[79,9628,9592],{"class":106},[79,9630,3217],{"class":89},[79,9632,1453],{"class":106},[79,9634,9635],{"class":89},"\"controller.yaml\"",[79,9637,1343],{"class":106},[79,9639,9640,9643,9645,9647,9649,9651,9654],{"class":81,"line":1523},[79,9641,9642],{"class":106},"    behavior_params_file ",[79,9644,1334],{"class":99},[79,9646,9592],{"class":106},[79,9648,3217],{"class":89},[79,9650,1453],{"class":106},[79,9652,9653],{"class":89},"\"behavior.yaml\"",[79,9655,1343],{"class":106},[79,9657,9658,9661,9663,9665,9667,9669,9672],{"class":81,"line":1536},[79,9659,9660],{"class":106},"    waypoint_params_file ",[79,9662,1334],{"class":99},[79,9664,9592],{"class":106},[79,9666,3217],{"class":89},[79,9668,1453],{"class":106},[79,9670,9671],{"class":89},"\"waypoint.yaml\"",[79,9673,1343],{"class":106},[79,9675,9676,9679,9681,9683,9685,9687,9690],{"class":81,"line":1549},[79,9677,9678],{"class":106},"    velocity_params_file ",[79,9680,1334],{"class":99},[79,9682,9592],{"class":106},[79,9684,3217],{"class":89},[79,9686,1453],{"class":106},[79,9688,9689],{"class":89},"\"velocity.yaml\"",[79,9691,1343],{"class":106},[79,9693,9694,9697,9699,9701,9703,9705,9708],{"class":81,"line":1561},[79,9695,9696],{"class":106},"    smoother_params_file ",[79,9698,1334],{"class":99},[79,9700,9592],{"class":106},[79,9702,3217],{"class":89},[79,9704,1453],{"class":106},[79,9706,9707],{"class":89},"\"smoother.yaml\"",[79,9709,1343],{"class":106},[79,9711,9712],{"class":81,"line":1574},[79,9713,142],{"emptyLinePlaceholder":141},[79,9715,9716,9719,9722],{"class":81,"line":1579},[79,9717,9718],{"class":99},"    def",[79,9720,9721],{"class":85}," rewrite_params",[79,9723,9724],{"class":106},"(params_file):\n",[79,9726,9727,9730],{"class":81,"line":1590},[79,9728,9729],{"class":99},"        return",[79,9731,9732],{"class":106}," ParameterFile(\n",[79,9734,9735],{"class":81,"line":1595},[79,9736,9737],{"class":106},"            RewrittenYaml(\n",[79,9739,9740,9743,9745],{"class":81,"line":1601},[79,9741,9742],{"class":1389},"                source_file",[79,9744,1334],{"class":99},[79,9746,9747],{"class":106},"params_file,\n",[79,9749,9750,9753,9755,9758],{"class":81,"line":1607},[79,9751,9752],{"class":1389},"                root_key",[79,9754,1334],{"class":99},[79,9756,9757],{"class":89},"''",[79,9759,1383],{"class":106},[79,9761,9762,9765,9767],{"class":81,"line":1613},[79,9763,9764],{"class":1389},"                param_rewrites",[79,9766,1334],{"class":99},[79,9768,6430],{"class":106},[79,9770,9771,9774],{"class":81,"line":1618},[79,9772,9773],{"class":89},"                    'use_sim_time'",[79,9775,9776],{"class":106},": use_sim_time\n",[79,9778,9779],{"class":81,"line":2001},[79,9780,9781],{"class":106},"                },\n",[79,9783,9784,9787,9789],{"class":81,"line":2012},[79,9785,9786],{"class":1389},"                convert_types",[79,9788,1334],{"class":99},[79,9790,9791],{"class":1215},"True\n",[79,9793,9794],{"class":81,"line":2025},[79,9795,9796],{"class":106},"            ),\n",[79,9798,9799,9802,9804],{"class":81,"line":2039},[79,9800,9801],{"class":1389},"            allow_substs",[79,9803,1334],{"class":99},[79,9805,9791],{"class":1215},[79,9807,9808],{"class":81,"line":2052},[79,9809,9810],{"class":106},"        )\n",[79,9812,9813],{"class":81,"line":2066},[79,9814,142],{"emptyLinePlaceholder":141},[79,9816,9817,9820,9822],{"class":81,"line":2077},[79,9818,9819],{"class":106},"    bt_params ",[79,9821,1334],{"class":99},[79,9823,9824],{"class":106}," rewrite_params(bt_params_file)\n",[79,9826,9827,9830,9832],{"class":81,"line":2082},[79,9828,9829],{"class":106},"    planner_params ",[79,9831,1334],{"class":99},[79,9833,9834],{"class":106}," rewrite_params(planner_params_file)\n",[79,9836,9837,9840,9842],{"class":81,"line":2092},[79,9838,9839],{"class":106},"    controller_params ",[79,9841,1334],{"class":99},[79,9843,9844],{"class":106}," rewrite_params(controller_params_file)\n",[79,9846,9847,9850,9852],{"class":81,"line":2103},[79,9848,9849],{"class":106},"    behavior_params ",[79,9851,1334],{"class":99},[79,9853,9854],{"class":106}," rewrite_params(behavior_params_file)\n",[79,9856,9857,9860,9862],{"class":81,"line":2115},[79,9858,9859],{"class":106},"    waypoint_params ",[79,9861,1334],{"class":99},[79,9863,9864],{"class":106}," rewrite_params(waypoint_params_file)\n",[79,9866,9867,9870,9872],{"class":81,"line":2120},[79,9868,9869],{"class":106},"    velocity_params ",[79,9871,1334],{"class":99},[79,9873,9874],{"class":106}," rewrite_params(velocity_params_file)\n",[79,9876,9877,9880,9882],{"class":81,"line":2131},[79,9878,9879],{"class":106},"    smoother_params ",[79,9881,1334],{"class":99},[79,9883,9884],{"class":106}," rewrite_params(smoother_params_file)\n",[79,9886,9887],{"class":81,"line":2141},[79,9888,142],{"emptyLinePlaceholder":141},[79,9890,9891,9894,9896],{"class":81,"line":2152},[79,9892,9893],{"class":106},"    planner_server_node ",[79,9895,1334],{"class":99},[79,9897,1486],{"class":106},[79,9899,9900,9902,9904,9907],{"class":81,"line":2157},[79,9901,1526],{"class":1389},[79,9903,1334],{"class":99},[79,9905,9906],{"class":89},"'nav2_planner'",[79,9908,1383],{"class":106},[79,9910,9911,9913,9915,9918],{"class":81,"line":2171},[79,9912,1539],{"class":1389},[79,9914,1334],{"class":99},[79,9916,9917],{"class":89},"'planner_server'",[79,9919,1383],{"class":106},[79,9921,9922,9924,9926,9928],{"class":81,"line":2184},[79,9923,1552],{"class":1389},[79,9925,1334],{"class":99},[79,9927,9917],{"class":89},[79,9929,1383],{"class":106},[79,9931,9932,9934,9936,9938],{"class":81,"line":2189},[79,9933,1564],{"class":1389},[79,9935,1334],{"class":99},[79,9937,1569],{"class":89},[79,9939,1383],{"class":106},[79,9941,9942,9944,9946],{"class":81,"line":2203},[79,9943,1492],{"class":1389},[79,9945,1334],{"class":99},[79,9947,1497],{"class":106},[79,9949,9950],{"class":81,"line":2217},[79,9951,9952],{"class":106},"            planner_params,\n",[79,9954,9955,9957,9959],{"class":81,"line":2231},[79,9956,3293],{"class":106},[79,9958,1340],{"class":89},[79,9960,1514],{"class":106},[79,9962,9963],{"class":81,"line":2242},[79,9964,1520],{"class":106},[79,9966,9967],{"class":81,"line":2252},[79,9968,3246],{"class":106},[79,9970,9971],{"class":81,"line":6472},[79,9972,142],{"emptyLinePlaceholder":141},[79,9974,9975,9978,9980],{"class":81,"line":6478},[79,9976,9977],{"class":106},"    controller_server_node ",[79,9979,1334],{"class":99},[79,9981,1486],{"class":106},[79,9983,9984,9986,9988,9991],{"class":81,"line":6484},[79,9985,1526],{"class":1389},[79,9987,1334],{"class":99},[79,9989,9990],{"class":89},"'nav2_controller'",[79,9992,1383],{"class":106},[79,9994,9996,9998,10000,10003],{"class":81,"line":9995},67,[79,9997,1539],{"class":1389},[79,9999,1334],{"class":99},[79,10001,10002],{"class":89},"'controller_server'",[79,10004,1383],{"class":106},[79,10006,10008,10010,10012,10014],{"class":81,"line":10007},68,[79,10009,1552],{"class":1389},[79,10011,1334],{"class":99},[79,10013,10002],{"class":89},[79,10015,1383],{"class":106},[79,10017,10019,10021,10023,10025],{"class":81,"line":10018},69,[79,10020,1564],{"class":1389},[79,10022,1334],{"class":99},[79,10024,1569],{"class":89},[79,10026,1383],{"class":106},[79,10028,10030,10032,10034],{"class":81,"line":10029},70,[79,10031,1492],{"class":1389},[79,10033,1334],{"class":99},[79,10035,1497],{"class":106},[79,10037,10039],{"class":81,"line":10038},71,[79,10040,10041],{"class":106},"            controller_params,\n",[79,10043,10045,10047,10049],{"class":81,"line":10044},72,[79,10046,3293],{"class":106},[79,10048,1340],{"class":89},[79,10050,1514],{"class":106},[79,10052,10054],{"class":81,"line":10053},73,[79,10055,1520],{"class":106},[79,10057,10059,10062,10064],{"class":81,"line":10058},74,[79,10060,10061],{"class":1389},"        remappings",[79,10063,1334],{"class":99},[79,10065,1497],{"class":106},[79,10067,10069,10072,10075,10077,10080],{"class":81,"line":10068},75,[79,10070,10071],{"class":106},"            (",[79,10073,10074],{"class":89},"'cmd_vel'",[79,10076,1453],{"class":106},[79,10078,10079],{"class":89},"'cmd_vel_nav'",[79,10081,1343],{"class":106},[79,10083,10085],{"class":81,"line":10084},76,[79,10086,6253],{"class":106},[79,10088,10090],{"class":81,"line":10089},77,[79,10091,3246],{"class":106},[79,10093,10095],{"class":81,"line":10094},78,[79,10096,142],{"emptyLinePlaceholder":141},[79,10098,10100,10103,10105],{"class":81,"line":10099},79,[79,10101,10102],{"class":106},"    behavior_server_node ",[79,10104,1334],{"class":99},[79,10106,1486],{"class":106},[79,10108,10110,10112,10114,10117],{"class":81,"line":10109},80,[79,10111,1526],{"class":1389},[79,10113,1334],{"class":99},[79,10115,10116],{"class":89},"'nav2_behaviors'",[79,10118,1383],{"class":106},[79,10120,10122,10124,10126,10129],{"class":81,"line":10121},81,[79,10123,1539],{"class":1389},[79,10125,1334],{"class":99},[79,10127,10128],{"class":89},"'behavior_server'",[79,10130,1383],{"class":106},[79,10132,10134,10136,10138,10140],{"class":81,"line":10133},82,[79,10135,1552],{"class":1389},[79,10137,1334],{"class":99},[79,10139,10128],{"class":89},[79,10141,1383],{"class":106},[79,10143,10145,10147,10149,10151],{"class":81,"line":10144},83,[79,10146,1564],{"class":1389},[79,10148,1334],{"class":99},[79,10150,1569],{"class":89},[79,10152,1383],{"class":106},[79,10154,10156,10158,10160],{"class":81,"line":10155},84,[79,10157,1492],{"class":1389},[79,10159,1334],{"class":99},[79,10161,1497],{"class":106},[79,10163,10165],{"class":81,"line":10164},85,[79,10166,10167],{"class":106},"            behavior_params,\n",[79,10169,10171,10173,10175],{"class":81,"line":10170},86,[79,10172,3293],{"class":106},[79,10174,1340],{"class":89},[79,10176,1514],{"class":106},[79,10178,10180],{"class":81,"line":10179},87,[79,10181,6253],{"class":106},[79,10183,10185],{"class":81,"line":10184},88,[79,10186,3246],{"class":106},[79,10188,10190],{"class":81,"line":10189},89,[79,10191,142],{"emptyLinePlaceholder":141},[79,10193,10195,10198,10200],{"class":81,"line":10194},90,[79,10196,10197],{"class":106},"    waypoint_node ",[79,10199,1334],{"class":99},[79,10201,1486],{"class":106},[79,10203,10205,10207,10209,10212],{"class":81,"line":10204},91,[79,10206,1526],{"class":1389},[79,10208,1334],{"class":99},[79,10210,10211],{"class":89},"'nav2_waypoint_follower'",[79,10213,1383],{"class":106},[79,10215,10217,10219,10221,10224],{"class":81,"line":10216},92,[79,10218,1539],{"class":1389},[79,10220,1334],{"class":99},[79,10222,10223],{"class":89},"'waypoint_follower'",[79,10225,1383],{"class":106},[79,10227,10229,10231,10233,10235],{"class":81,"line":10228},93,[79,10230,1552],{"class":1389},[79,10232,1334],{"class":99},[79,10234,10223],{"class":89},[79,10236,1383],{"class":106},[79,10238,10240,10242,10244,10246],{"class":81,"line":10239},94,[79,10241,1564],{"class":1389},[79,10243,1334],{"class":99},[79,10245,1569],{"class":89},[79,10247,1383],{"class":106},[79,10249,10251,10253,10255],{"class":81,"line":10250},95,[79,10252,1492],{"class":1389},[79,10254,1334],{"class":99},[79,10256,1497],{"class":106},[79,10258,10260],{"class":81,"line":10259},96,[79,10261,10262],{"class":106},"            waypoint_params,\n",[79,10264,10266,10268,10270],{"class":81,"line":10265},97,[79,10267,3293],{"class":106},[79,10269,1340],{"class":89},[79,10271,1514],{"class":106},[79,10273,10275],{"class":81,"line":10274},98,[79,10276,6253],{"class":106},[79,10278,10280],{"class":81,"line":10279},99,[79,10281,3246],{"class":106},[79,10283,10285],{"class":81,"line":10284},100,[79,10286,142],{"emptyLinePlaceholder":141},[79,10288,10290,10293,10295],{"class":81,"line":10289},101,[79,10291,10292],{"class":106},"    velocity_smoother_node ",[79,10294,1334],{"class":99},[79,10296,1486],{"class":106},[79,10298,10300,10302,10304,10307],{"class":81,"line":10299},102,[79,10301,1526],{"class":1389},[79,10303,1334],{"class":99},[79,10305,10306],{"class":89},"'nav2_velocity_smoother'",[79,10308,1383],{"class":106},[79,10310,10312,10314,10316,10319],{"class":81,"line":10311},103,[79,10313,1539],{"class":1389},[79,10315,1334],{"class":99},[79,10317,10318],{"class":89},"'velocity_smoother'",[79,10320,1383],{"class":106},[79,10322,10324,10326,10328,10330],{"class":81,"line":10323},104,[79,10325,1552],{"class":1389},[79,10327,1334],{"class":99},[79,10329,10318],{"class":89},[79,10331,1383],{"class":106},[79,10333,10335,10337,10339,10341],{"class":81,"line":10334},105,[79,10336,1564],{"class":1389},[79,10338,1334],{"class":99},[79,10340,1569],{"class":89},[79,10342,1383],{"class":106},[79,10344,10346,10349,10351,10354],{"class":81,"line":10345},106,[79,10347,10348],{"class":1389},"        respawn_delay",[79,10350,1334],{"class":99},[79,10352,10353],{"class":1215},"2.0",[79,10355,1383],{"class":106},[79,10357,10359,10361,10363],{"class":81,"line":10358},107,[79,10360,1492],{"class":1389},[79,10362,1334],{"class":99},[79,10364,1497],{"class":106},[79,10366,10368],{"class":81,"line":10367},108,[79,10369,10370],{"class":106},"            velocity_params,\n",[79,10372,10374,10376,10378],{"class":81,"line":10373},109,[79,10375,3293],{"class":106},[79,10377,1340],{"class":89},[79,10379,1514],{"class":106},[79,10381,10383],{"class":81,"line":10382},110,[79,10384,1520],{"class":106},[79,10386,10388,10390,10392],{"class":81,"line":10387},111,[79,10389,10061],{"class":1389},[79,10391,1334],{"class":99},[79,10393,1497],{"class":106},[79,10395,10397,10399,10401,10403,10405],{"class":81,"line":10396},112,[79,10398,10071],{"class":106},[79,10400,10074],{"class":89},[79,10402,1453],{"class":106},[79,10404,10079],{"class":89},[79,10406,1444],{"class":106},[79,10408,10410,10412,10415,10417,10419],{"class":81,"line":10409},113,[79,10411,10071],{"class":106},[79,10413,10414],{"class":89},"'cmd_vel_smoothed'",[79,10416,1453],{"class":106},[79,10418,10074],{"class":89},[79,10420,1343],{"class":106},[79,10422,10424],{"class":81,"line":10423},114,[79,10425,6253],{"class":106},[79,10427,10429],{"class":81,"line":10428},115,[79,10430,3246],{"class":106},[79,10432,10434],{"class":81,"line":10433},116,[79,10435,142],{"emptyLinePlaceholder":141},[79,10437,10439,10442,10444],{"class":81,"line":10438},117,[79,10440,10441],{"class":106},"    smoother_server_node ",[79,10443,1334],{"class":99},[79,10445,1486],{"class":106},[79,10447,10449,10451,10453,10456],{"class":81,"line":10448},118,[79,10450,1526],{"class":1389},[79,10452,1334],{"class":99},[79,10454,10455],{"class":89},"'nav2_smoother'",[79,10457,1383],{"class":106},[79,10459,10461,10463,10465,10468],{"class":81,"line":10460},119,[79,10462,1539],{"class":1389},[79,10464,1334],{"class":99},[79,10466,10467],{"class":89},"'smoother_server'",[79,10469,1383],{"class":106},[79,10471,10473,10475,10477,10479],{"class":81,"line":10472},120,[79,10474,1552],{"class":1389},[79,10476,1334],{"class":99},[79,10478,10467],{"class":89},[79,10480,1383],{"class":106},[79,10482,10484,10486,10488,10490],{"class":81,"line":10483},121,[79,10485,1564],{"class":1389},[79,10487,1334],{"class":99},[79,10489,1569],{"class":89},[79,10491,1383],{"class":106},[79,10493,10495,10497,10499],{"class":81,"line":10494},122,[79,10496,1492],{"class":1389},[79,10498,1334],{"class":99},[79,10500,1497],{"class":106},[79,10502,10504],{"class":81,"line":10503},123,[79,10505,10506],{"class":106},"            smoother_params,\n",[79,10508,10510,10512,10514],{"class":81,"line":10509},124,[79,10511,3293],{"class":106},[79,10513,1340],{"class":89},[79,10515,1514],{"class":106},[79,10517,10519],{"class":81,"line":10518},125,[79,10520,1520],{"class":106},[79,10522,10524],{"class":81,"line":10523},126,[79,10525,3246],{"class":106},[79,10527,10529],{"class":81,"line":10528},127,[79,10530,142],{"emptyLinePlaceholder":141},[79,10532,10534,10537,10539],{"class":81,"line":10533},128,[79,10535,10536],{"class":106},"    bt_navigator_node ",[79,10538,1334],{"class":99},[79,10540,1486],{"class":106},[79,10542,10544,10546,10548,10551],{"class":81,"line":10543},129,[79,10545,1526],{"class":1389},[79,10547,1334],{"class":99},[79,10549,10550],{"class":89},"'nav2_bt_navigator'",[79,10552,1383],{"class":106},[79,10554,10556,10558,10560,10563],{"class":81,"line":10555},130,[79,10557,1539],{"class":1389},[79,10559,1334],{"class":99},[79,10561,10562],{"class":89},"'bt_navigator'",[79,10564,1383],{"class":106},[79,10566,10568,10570,10572,10574],{"class":81,"line":10567},131,[79,10569,1552],{"class":1389},[79,10571,1334],{"class":99},[79,10573,10562],{"class":89},[79,10575,1383],{"class":106},[79,10577,10579,10581,10583,10585],{"class":81,"line":10578},132,[79,10580,1564],{"class":1389},[79,10582,1334],{"class":99},[79,10584,1569],{"class":89},[79,10586,1383],{"class":106},[79,10588,10590,10592,10594],{"class":81,"line":10589},133,[79,10591,1492],{"class":1389},[79,10593,1334],{"class":99},[79,10595,1497],{"class":106},[79,10597,10599],{"class":81,"line":10598},134,[79,10600,10601],{"class":106},"            bt_params,\n",[79,10603,10605,10607,10609],{"class":81,"line":10604},135,[79,10606,3293],{"class":106},[79,10608,1340],{"class":89},[79,10610,10611],{"class":106},": use_sim_time},\n",[79,10613,10615],{"class":81,"line":10614},136,[79,10616,10617],{"class":106},"            {\n",[79,10619,10621,10624],{"class":81,"line":10620},137,[79,10622,10623],{"class":89},"                \"default_nav_to_pose_bt_xml\"",[79,10625,10626],{"class":106},": os.path.join(\n",[79,10628,10630],{"class":81,"line":10629},138,[79,10631,10632],{"class":106},"                    current_pkg,\n",[79,10634,10636,10639],{"class":81,"line":10635},139,[79,10637,10638],{"class":89},"                    \"bts\"",[79,10640,1383],{"class":106},[79,10642,10644],{"class":81,"line":10643},140,[79,10645,10646],{"class":89},"                    \"bt_planner_controller_behavior.xml\"\n",[79,10648,10650],{"class":81,"line":10649},141,[79,10651,10652],{"class":106},"                )\n",[79,10654,10656],{"class":81,"line":10655},142,[79,10657,10658],{"class":106},"            },\n",[79,10660,10662],{"class":81,"line":10661},143,[79,10663,10617],{"class":106},[79,10665,10667,10670],{"class":81,"line":10666},144,[79,10668,10669],{"class":89},"                \"default_nav_through_poses_bt_xml\"",[79,10671,10626],{"class":106},[79,10673,10675],{"class":81,"line":10674},145,[79,10676,10632],{"class":106},[79,10678,10680,10682],{"class":81,"line":10679},146,[79,10681,10638],{"class":89},[79,10683,1383],{"class":106},[79,10685,10687],{"class":81,"line":10686},147,[79,10688,10689],{"class":89},"                    \"bt_planner_controller_behavior_poses.xml\"\n",[79,10691,10693],{"class":81,"line":10692},148,[79,10694,10652],{"class":106},[79,10696,10698],{"class":81,"line":10697},149,[79,10699,10700],{"class":106},"            }\n",[79,10702,10704],{"class":81,"line":10703},150,[79,10705,1520],{"class":106},[79,10707,10709],{"class":81,"line":10708},151,[79,10710,3246],{"class":106},[79,10712,10714],{"class":81,"line":10713},152,[79,10715,142],{"emptyLinePlaceholder":141},[79,10717,10719,10722,10724],{"class":81,"line":10718},153,[79,10720,10721],{"class":106},"    lifecycle_manager_node ",[79,10723,1334],{"class":99},[79,10725,1486],{"class":106},[79,10727,10729,10731,10733,10735],{"class":81,"line":10728},154,[79,10730,1526],{"class":1389},[79,10732,1334],{"class":99},[79,10734,5359],{"class":89},[79,10736,1383],{"class":106},[79,10738,10740,10742,10744,10746],{"class":81,"line":10739},155,[79,10741,1539],{"class":1389},[79,10743,1334],{"class":99},[79,10745,5371],{"class":89},[79,10747,1383],{"class":106},[79,10749,10751,10753,10755,10758],{"class":81,"line":10750},156,[79,10752,1552],{"class":1389},[79,10754,1334],{"class":99},[79,10756,10757],{"class":89},"'lifecycle_manager_navigation'",[79,10759,1383],{"class":106},[79,10761,10763,10765,10767,10769],{"class":81,"line":10762},157,[79,10764,1564],{"class":1389},[79,10766,1334],{"class":99},[79,10768,1569],{"class":89},[79,10770,1383],{"class":106},[79,10772,10774,10776,10778],{"class":81,"line":10773},158,[79,10775,1492],{"class":1389},[79,10777,1334],{"class":99},[79,10779,1497],{"class":106},[79,10781,10783,10785,10787],{"class":81,"line":10782},159,[79,10784,3293],{"class":106},[79,10786,1340],{"class":89},[79,10788,10611],{"class":106},[79,10790,10792,10794,10796,10798,10800],{"class":81,"line":10791},160,[79,10793,3293],{"class":106},[79,10795,5421],{"class":89},[79,10797,1664],{"class":106},[79,10799,5321],{"class":1215},[79,10801,5324],{"class":106},[79,10803,10805],{"class":81,"line":10804},161,[79,10806,10617],{"class":106},[79,10808,10810,10813],{"class":81,"line":10809},162,[79,10811,10812],{"class":89},"                'node_names'",[79,10814,10815],{"class":106},": [\n",[79,10817,10819,10822],{"class":81,"line":10818},163,[79,10820,10821],{"class":89},"                    'bt_navigator'",[79,10823,1383],{"class":106},[79,10825,10827,10830],{"class":81,"line":10826},164,[79,10828,10829],{"class":89},"                    'planner_server'",[79,10831,1383],{"class":106},[79,10833,10835,10838],{"class":81,"line":10834},165,[79,10836,10837],{"class":89},"                    'controller_server'",[79,10839,1383],{"class":106},[79,10841,10843,10846],{"class":81,"line":10842},166,[79,10844,10845],{"class":89},"                    'behavior_server'",[79,10847,1383],{"class":106},[79,10849,10851,10854],{"class":81,"line":10850},167,[79,10852,10853],{"class":89},"                    'waypoint_follower'",[79,10855,1383],{"class":106},[79,10857,10859,10862],{"class":81,"line":10858},168,[79,10860,10861],{"class":89},"                    'velocity_smoother'",[79,10863,1383],{"class":106},[79,10865,10867],{"class":81,"line":10866},169,[79,10868,10869],{"class":89},"                    'smoother_server'\n",[79,10871,10873],{"class":81,"line":10872},170,[79,10874,10875],{"class":106},"                ]\n",[79,10877,10879],{"class":81,"line":10878},171,[79,10880,10700],{"class":106},[79,10882,10884],{"class":81,"line":10883},172,[79,10885,6253],{"class":106},[79,10887,10889],{"class":81,"line":10888},173,[79,10890,3246],{"class":106},[79,10892,10894],{"class":81,"line":10893},174,[79,10895,142],{"emptyLinePlaceholder":141},[79,10897,10899,10901],{"class":81,"line":10898},175,[79,10900,1621],{"class":99},[79,10902,3329],{"class":106},[79,10904,10906],{"class":81,"line":10905},176,[79,10907,3334],{"class":106},[79,10909,10911],{"class":81,"line":10910},177,[79,10912,142],{"emptyLinePlaceholder":141},[79,10914,10916],{"class":81,"line":10915},178,[79,10917,10918],{"class":106},"        lifecycle_manager_node,\n",[79,10920,10922],{"class":81,"line":10921},179,[79,10923,10924],{"class":106},"        bt_navigator_node,\n",[79,10926,10928],{"class":81,"line":10927},180,[79,10929,10930],{"class":106},"        planner_server_node,\n",[79,10932,10934],{"class":81,"line":10933},181,[79,10935,10936],{"class":106},"        controller_server_node,\n",[79,10938,10940],{"class":81,"line":10939},182,[79,10941,10942],{"class":106},"        behavior_server_node,\n",[79,10944,10946],{"class":81,"line":10945},183,[79,10947,10948],{"class":106},"        waypoint_node,\n",[79,10950,10952],{"class":81,"line":10951},184,[79,10953,10954],{"class":106},"        velocity_smoother_node,\n",[79,10956,10958],{"class":81,"line":10957},185,[79,10959,10960],{"class":106},"        smoother_server_node\n",[79,10962,10964],{"class":81,"line":10963},186,[79,10965,3354],{"class":106},[20,10967,10968],{},"该launch文件主要是加载了生命周期管理器、行为树、规划器、控制器、恢复器、航点跟踪、路径平滑以及速度平滑等节点。并且除了生命周期管理器节点外，每个节点都还会加载一个配置文件，接下来需要编辑这些配置文。",[20,10970,10971],{},[23,10972,10973],{},"（1）bt_navigator相关配置文件",[20,10975,10976],{},"bt_navigator相关配置文件有两个，分别是描述行为树的xml文件，以及yaml格式的参数文件，前者存储在bts目录下，后者存储在params目录下。",[20,10978,10979,10980,10983],{},"请在bts目录下，新建一个名为",[76,10981,10982],{},"bt_planner_controller_behavior.xml","的文件并输入如下内容：",[70,10985,10989],{"className":10986,"code":10987,"language":10988,"meta":34,"style":34},"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 \u002F 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\"\u002F>\n        \u003CPlannerSelector selected_planner=\"{selected_planner}\" default_planner=\"GridBased\" topic_name=\"planner_selector\"\u002F>\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}\"\u002F>\n            \u003CSequence>\n              \u003CWouldAPlannerRecoveryHelp error_code=\"{compute_path_error_code}\"\u002F>\n              \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Context\" service_name=\"global_costmap\u002Fclear_entirely_global_costmap\"\u002F>\n            \u003C\u002FSequence>\n          \u003C\u002FRecoveryNode>\n        \u003C\u002FRateController>\n        \u003CRecoveryNode number_of_retries=\"1\" name=\"FollowPath\">\n          \u003CFollowPath path=\"{path}\" controller_id=\"{selected_controller}\" error_code_id=\"{follow_path_error_code}\"\u002F>\n          \u003CSequence>\n            \u003CWouldAControllerRecoveryHelp error_code=\"{follow_path_error_code}\"\u002F>\n            \u003CClearEntireCostmap name=\"ClearLocalCostmap-Context\" service_name=\"local_costmap\u002Fclear_entirely_local_costmap\"\u002F>\n          \u003C\u002FSequence>\n        \u003C\u002FRecoveryNode>\n      \u003C\u002FPipelineSequence>\n      \u003CSequence>\n        \u003CFallback>\n          \u003CWouldAControllerRecoveryHelp error_code=\"{follow_path_error_code}\"\u002F>\n          \u003CWouldAPlannerRecoveryHelp error_code=\"{compute_path_error_code}\"\u002F>\n        \u003C\u002FFallback>\n        \u003CReactiveFallback name=\"RecoveryFallback\">\n          \u003CGoalUpdated\u002F>\n          \u003CRoundRobin name=\"RecoveryActions\">\n            \u003CSequence name=\"ClearingActions\">\n              \u003CClearEntireCostmap name=\"ClearLocalCostmap-Subtree\" service_name=\"local_costmap\u002Fclear_entirely_local_costmap\"\u002F>\n              \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Subtree\" service_name=\"global_costmap\u002Fclear_entirely_global_costmap\"\u002F>\n            \u003C\u002FSequence>\n            \u003CSpin spin_dist=\"1.57\" error_code_id=\"{spin_error_code}\"\u002F>\n            \u003CWait wait_duration=\"5.0\"\u002F>\n            \u003CBackUp backup_dist=\"0.30\" backup_speed=\"0.15\" error_code_id=\"{backup_code_id}\"\u002F>\n          \u003C\u002FRoundRobin>\n        \u003C\u002FReactiveFallback>\n      \u003C\u002FSequence>\n    \u003C\u002FRecoveryNode>\n  \u003C\u002FBehaviorTree>\n\u003C\u002Froot>\n","xml",[76,10990,10991,10996,11001,11006,11011,11016,11042,11059,11085,11102,11137,11169,11186,11209,11250,11259,11276,11300,11309,11318,11327,11347,11376,11384,11399,11421,11429,11437,11446,11454,11463,11477,11491,11499,11515,11524,11540,11555,11576,11597,11605,11629,11646,11678,11686,11694,11702,11711,11720],{"__ignoreMap":34},[79,10992,10993],{"class":81,"line":82},[79,10994,10995],{"class":148},"\u003C!--\n",[79,10997,10998],{"class":81,"line":116},[79,10999,11000],{"class":148},"  This Behavior Tree replans the global path periodically at 1 Hz and it also has\n",[79,11002,11003],{"class":81,"line":138},[79,11004,11005],{"class":148},"  recovery actions specific to planning \u002F control as well as general system issues.\n",[79,11007,11008],{"class":81,"line":145},[79,11009,11010],{"class":148},"  This will be continuous if a kinematically valid planner is selected.\n",[79,11012,11013],{"class":81,"line":152},[79,11014,11015],{"class":148},"-->\n",[79,11017,11018,11020,11023,11026,11028,11031,11034,11036,11039],{"class":81,"line":164},[79,11019,100],{"class":106},[79,11021,11022],{"class":1646},"root",[79,11024,11025],{"class":85}," BTCPP_format",[79,11027,1334],{"class":106},[79,11029,11030],{"class":89},"\"4\"",[79,11032,11033],{"class":85}," main_tree_to_execute",[79,11035,1334],{"class":106},[79,11037,11038],{"class":89},"\"MainTree\"",[79,11040,11041],{"class":106},">\n",[79,11043,11044,11047,11050,11053,11055,11057],{"class":81,"line":176},[79,11045,11046],{"class":106},"  \u003C",[79,11048,11049],{"class":1646},"BehaviorTree",[79,11051,11052],{"class":85}," ID",[79,11054,1334],{"class":106},[79,11056,11038],{"class":89},[79,11058,11041],{"class":106},[79,11060,11061,11064,11067,11070,11072,11075,11078,11080,11083],{"class":81,"line":181},[79,11062,11063],{"class":106},"    \u003C",[79,11065,11066],{"class":1646},"RecoveryNode",[79,11068,11069],{"class":85}," number_of_retries",[79,11071,1334],{"class":106},[79,11073,11074],{"class":89},"\"6\"",[79,11076,11077],{"class":85}," name",[79,11079,1334],{"class":106},[79,11081,11082],{"class":89},"\"NavigateRecovery\"",[79,11084,11041],{"class":106},[79,11086,11087,11090,11093,11095,11097,11100],{"class":81,"line":186},[79,11088,11089],{"class":106},"      \u003C",[79,11091,11092],{"class":1646},"PipelineSequence",[79,11094,11077],{"class":85},[79,11096,1334],{"class":106},[79,11098,11099],{"class":89},"\"NavigateWithReplanning\"",[79,11101,11041],{"class":106},[79,11103,11104,11107,11110,11113,11115,11118,11121,11123,11126,11129,11131,11134],{"class":81,"line":197},[79,11105,11106],{"class":106},"        \u003C",[79,11108,11109],{"class":1646},"ControllerSelector",[79,11111,11112],{"class":85}," selected_controller",[79,11114,1334],{"class":106},[79,11116,11117],{"class":89},"\"{selected_controller}\"",[79,11119,11120],{"class":85}," default_controller",[79,11122,1334],{"class":106},[79,11124,11125],{"class":89},"\"FollowPath\"",[79,11127,11128],{"class":85}," topic_name",[79,11130,1334],{"class":106},[79,11132,11133],{"class":89},"\"controller_selector\"",[79,11135,11136],{"class":106},"\u002F>\n",[79,11138,11139,11141,11144,11147,11149,11152,11155,11157,11160,11162,11164,11167],{"class":81,"line":1346},[79,11140,11106],{"class":106},[79,11142,11143],{"class":1646},"PlannerSelector",[79,11145,11146],{"class":85}," selected_planner",[79,11148,1334],{"class":106},[79,11150,11151],{"class":89},"\"{selected_planner}\"",[79,11153,11154],{"class":85}," default_planner",[79,11156,1334],{"class":106},[79,11158,11159],{"class":89},"\"GridBased\"",[79,11161,11128],{"class":85},[79,11163,1334],{"class":106},[79,11165,11166],{"class":89},"\"planner_selector\"",[79,11168,11136],{"class":106},[79,11170,11171,11173,11176,11179,11181,11184],{"class":81,"line":1361},[79,11172,11106],{"class":106},[79,11174,11175],{"class":1646},"RateController",[79,11177,11178],{"class":85}," hz",[79,11180,1334],{"class":106},[79,11182,11183],{"class":89},"\"1.0\"",[79,11185,11041],{"class":106},[79,11187,11188,11191,11193,11195,11197,11200,11202,11204,11207],{"class":81,"line":1366},[79,11189,11190],{"class":106},"          \u003C",[79,11192,11066],{"class":1646},[79,11194,11069],{"class":85},[79,11196,1334],{"class":106},[79,11198,11199],{"class":89},"\"1\"",[79,11201,11077],{"class":85},[79,11203,1334],{"class":106},[79,11205,11206],{"class":89},"\"ComputePathToPose\"",[79,11208,11041],{"class":106},[79,11210,11211,11214,11217,11220,11222,11225,11228,11230,11233,11236,11238,11240,11243,11245,11248],{"class":81,"line":1377},[79,11212,11213],{"class":106},"            \u003C",[79,11215,11216],{"class":1646},"ComputePathToPose",[79,11218,11219],{"class":85}," goal",[79,11221,1334],{"class":106},[79,11223,11224],{"class":89},"\"{goal}\"",[79,11226,11227],{"class":85}," path",[79,11229,1334],{"class":106},[79,11231,11232],{"class":89},"\"{path}\"",[79,11234,11235],{"class":85}," planner_id",[79,11237,1334],{"class":106},[79,11239,11151],{"class":89},[79,11241,11242],{"class":85}," error_code_id",[79,11244,1334],{"class":106},[79,11246,11247],{"class":89},"\"{compute_path_error_code}\"",[79,11249,11136],{"class":106},[79,11251,11252,11254,11257],{"class":81,"line":1386},[79,11253,11213],{"class":106},[79,11255,11256],{"class":1646},"Sequence",[79,11258,11041],{"class":106},[79,11260,11261,11264,11267,11270,11272,11274],{"class":81,"line":1400},[79,11262,11263],{"class":106},"              \u003C",[79,11265,11266],{"class":1646},"WouldAPlannerRecoveryHelp",[79,11268,11269],{"class":85}," error_code",[79,11271,1334],{"class":106},[79,11273,11247],{"class":89},[79,11275,11136],{"class":106},[79,11277,11278,11280,11283,11285,11287,11290,11293,11295,11298],{"class":81,"line":1413},[79,11279,11263],{"class":106},[79,11281,11282],{"class":1646},"ClearEntireCostmap",[79,11284,11077],{"class":85},[79,11286,1334],{"class":106},[79,11288,11289],{"class":89},"\"ClearGlobalCostmap-Context\"",[79,11291,11292],{"class":85}," service_name",[79,11294,1334],{"class":106},[79,11296,11297],{"class":89},"\"global_costmap\u002Fclear_entirely_global_costmap\"",[79,11299,11136],{"class":106},[79,11301,11302,11305,11307],{"class":81,"line":1423},[79,11303,11304],{"class":106},"            \u003C\u002F",[79,11306,11256],{"class":1646},[79,11308,11041],{"class":106},[79,11310,11311,11314,11316],{"class":81,"line":1431},[79,11312,11313],{"class":106},"          \u003C\u002F",[79,11315,11066],{"class":1646},[79,11317,11041],{"class":106},[79,11319,11320,11323,11325],{"class":81,"line":1447},[79,11321,11322],{"class":106},"        \u003C\u002F",[79,11324,11175],{"class":1646},[79,11326,11041],{"class":106},[79,11328,11329,11331,11333,11335,11337,11339,11341,11343,11345],{"class":81,"line":1461},[79,11330,11106],{"class":106},[79,11332,11066],{"class":1646},[79,11334,11069],{"class":85},[79,11336,1334],{"class":106},[79,11338,11199],{"class":89},[79,11340,11077],{"class":85},[79,11342,1334],{"class":106},[79,11344,11125],{"class":89},[79,11346,11041],{"class":106},[79,11348,11349,11351,11354,11356,11358,11360,11363,11365,11367,11369,11371,11374],{"class":81,"line":1473},[79,11350,11190],{"class":106},[79,11352,11353],{"class":1646},"FollowPath",[79,11355,11227],{"class":85},[79,11357,1334],{"class":106},[79,11359,11232],{"class":89},[79,11361,11362],{"class":85}," controller_id",[79,11364,1334],{"class":106},[79,11366,11117],{"class":89},[79,11368,11242],{"class":85},[79,11370,1334],{"class":106},[79,11372,11373],{"class":89},"\"{follow_path_error_code}\"",[79,11375,11136],{"class":106},[79,11377,11378,11380,11382],{"class":81,"line":1478},[79,11379,11190],{"class":106},[79,11381,11256],{"class":1646},[79,11383,11041],{"class":106},[79,11385,11386,11388,11391,11393,11395,11397],{"class":81,"line":1489},[79,11387,11213],{"class":106},[79,11389,11390],{"class":1646},"WouldAControllerRecoveryHelp",[79,11392,11269],{"class":85},[79,11394,1334],{"class":106},[79,11396,11373],{"class":89},[79,11398,11136],{"class":106},[79,11400,11401,11403,11405,11407,11409,11412,11414,11416,11419],{"class":81,"line":1500},[79,11402,11213],{"class":106},[79,11404,11282],{"class":1646},[79,11406,11077],{"class":85},[79,11408,1334],{"class":106},[79,11410,11411],{"class":89},"\"ClearLocalCostmap-Context\"",[79,11413,11292],{"class":85},[79,11415,1334],{"class":106},[79,11417,11418],{"class":89},"\"local_costmap\u002Fclear_entirely_local_costmap\"",[79,11420,11136],{"class":106},[79,11422,11423,11425,11427],{"class":81,"line":1506},[79,11424,11313],{"class":106},[79,11426,11256],{"class":1646},[79,11428,11041],{"class":106},[79,11430,11431,11433,11435],{"class":81,"line":1517},[79,11432,11322],{"class":106},[79,11434,11066],{"class":1646},[79,11436,11041],{"class":106},[79,11438,11439,11442,11444],{"class":81,"line":1523},[79,11440,11441],{"class":106},"      \u003C\u002F",[79,11443,11092],{"class":1646},[79,11445,11041],{"class":106},[79,11447,11448,11450,11452],{"class":81,"line":1536},[79,11449,11089],{"class":106},[79,11451,11256],{"class":1646},[79,11453,11041],{"class":106},[79,11455,11456,11458,11461],{"class":81,"line":1549},[79,11457,11106],{"class":106},[79,11459,11460],{"class":1646},"Fallback",[79,11462,11041],{"class":106},[79,11464,11465,11467,11469,11471,11473,11475],{"class":81,"line":1561},[79,11466,11190],{"class":106},[79,11468,11390],{"class":1646},[79,11470,11269],{"class":85},[79,11472,1334],{"class":106},[79,11474,11373],{"class":89},[79,11476,11136],{"class":106},[79,11478,11479,11481,11483,11485,11487,11489],{"class":81,"line":1574},[79,11480,11190],{"class":106},[79,11482,11266],{"class":1646},[79,11484,11269],{"class":85},[79,11486,1334],{"class":106},[79,11488,11247],{"class":89},[79,11490,11136],{"class":106},[79,11492,11493,11495,11497],{"class":81,"line":1579},[79,11494,11322],{"class":106},[79,11496,11460],{"class":1646},[79,11498,11041],{"class":106},[79,11500,11501,11503,11506,11508,11510,11513],{"class":81,"line":1590},[79,11502,11106],{"class":106},[79,11504,11505],{"class":1646},"ReactiveFallback",[79,11507,11077],{"class":85},[79,11509,1334],{"class":106},[79,11511,11512],{"class":89},"\"RecoveryFallback\"",[79,11514,11041],{"class":106},[79,11516,11517,11519,11522],{"class":81,"line":1595},[79,11518,11190],{"class":106},[79,11520,11521],{"class":1646},"GoalUpdated",[79,11523,11136],{"class":106},[79,11525,11526,11528,11531,11533,11535,11538],{"class":81,"line":1601},[79,11527,11190],{"class":106},[79,11529,11530],{"class":1646},"RoundRobin",[79,11532,11077],{"class":85},[79,11534,1334],{"class":106},[79,11536,11537],{"class":89},"\"RecoveryActions\"",[79,11539,11041],{"class":106},[79,11541,11542,11544,11546,11548,11550,11553],{"class":81,"line":1607},[79,11543,11213],{"class":106},[79,11545,11256],{"class":1646},[79,11547,11077],{"class":85},[79,11549,1334],{"class":106},[79,11551,11552],{"class":89},"\"ClearingActions\"",[79,11554,11041],{"class":106},[79,11556,11557,11559,11561,11563,11565,11568,11570,11572,11574],{"class":81,"line":1613},[79,11558,11263],{"class":106},[79,11560,11282],{"class":1646},[79,11562,11077],{"class":85},[79,11564,1334],{"class":106},[79,11566,11567],{"class":89},"\"ClearLocalCostmap-Subtree\"",[79,11569,11292],{"class":85},[79,11571,1334],{"class":106},[79,11573,11418],{"class":89},[79,11575,11136],{"class":106},[79,11577,11578,11580,11582,11584,11586,11589,11591,11593,11595],{"class":81,"line":1618},[79,11579,11263],{"class":106},[79,11581,11282],{"class":1646},[79,11583,11077],{"class":85},[79,11585,1334],{"class":106},[79,11587,11588],{"class":89},"\"ClearGlobalCostmap-Subtree\"",[79,11590,11292],{"class":85},[79,11592,1334],{"class":106},[79,11594,11297],{"class":89},[79,11596,11136],{"class":106},[79,11598,11599,11601,11603],{"class":81,"line":2001},[79,11600,11304],{"class":106},[79,11602,11256],{"class":1646},[79,11604,11041],{"class":106},[79,11606,11607,11609,11612,11615,11617,11620,11622,11624,11627],{"class":81,"line":2012},[79,11608,11213],{"class":106},[79,11610,11611],{"class":1646},"Spin",[79,11613,11614],{"class":85}," spin_dist",[79,11616,1334],{"class":106},[79,11618,11619],{"class":89},"\"1.57\"",[79,11621,11242],{"class":85},[79,11623,1334],{"class":106},[79,11625,11626],{"class":89},"\"{spin_error_code}\"",[79,11628,11136],{"class":106},[79,11630,11631,11633,11636,11639,11641,11644],{"class":81,"line":2025},[79,11632,11213],{"class":106},[79,11634,11635],{"class":1646},"Wait",[79,11637,11638],{"class":85}," wait_duration",[79,11640,1334],{"class":106},[79,11642,11643],{"class":89},"\"5.0\"",[79,11645,11136],{"class":106},[79,11647,11648,11650,11653,11656,11658,11661,11664,11666,11669,11671,11673,11676],{"class":81,"line":2039},[79,11649,11213],{"class":106},[79,11651,11652],{"class":1646},"BackUp",[79,11654,11655],{"class":85}," backup_dist",[79,11657,1334],{"class":106},[79,11659,11660],{"class":89},"\"0.30\"",[79,11662,11663],{"class":85}," backup_speed",[79,11665,1334],{"class":106},[79,11667,11668],{"class":89},"\"0.15\"",[79,11670,11242],{"class":85},[79,11672,1334],{"class":106},[79,11674,11675],{"class":89},"\"{backup_code_id}\"",[79,11677,11136],{"class":106},[79,11679,11680,11682,11684],{"class":81,"line":2052},[79,11681,11313],{"class":106},[79,11683,11530],{"class":1646},[79,11685,11041],{"class":106},[79,11687,11688,11690,11692],{"class":81,"line":2066},[79,11689,11322],{"class":106},[79,11691,11505],{"class":1646},[79,11693,11041],{"class":106},[79,11695,11696,11698,11700],{"class":81,"line":2077},[79,11697,11441],{"class":106},[79,11699,11256],{"class":1646},[79,11701,11041],{"class":106},[79,11703,11704,11707,11709],{"class":81,"line":2082},[79,11705,11706],{"class":106},"    \u003C\u002F",[79,11708,11066],{"class":1646},[79,11710,11041],{"class":106},[79,11712,11713,11716,11718],{"class":81,"line":2092},[79,11714,11715],{"class":106},"  \u003C\u002F",[79,11717,11049],{"class":1646},[79,11719,11041],{"class":106},[79,11721,11722,11725,11727],{"class":81,"line":2103},[79,11723,11724],{"class":106},"\u003C\u002F",[79,11726,11022],{"class":1646},[79,11728,11041],{"class":106},[20,11730,11731,11732,5190],{},"继续在bts目录下新建一个名为",[76,11733,11734],{},"bt_planner_controller_behavior_poses.xml",[70,11736,11738],{"className":10986,"code":11737,"language":10988,"meta":34,"style":34},"\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 \u002F 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\"\u002F>\n        \u003CPlannerSelector selected_planner=\"{selected_planner}\" default_planner=\"GridBased\" topic_name=\"planner_selector\"\u002F>\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\"\u002F>\n              \u003CComputePathThroughPoses goals=\"{goals}\" path=\"{path}\" planner_id=\"{selected_planner}\" error_code_id=\"{compute_path_error_code}\"\u002F>\n            \u003C\u002FReactiveSequence>\n            \u003CSequence>\n              \u003CWouldAPlannerRecoveryHelp error_code=\"{compute_path_error_code}\"\u002F>\n              \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Context\" service_name=\"global_costmap\u002Fclear_entirely_global_costmap\"\u002F>\n            \u003C\u002FSequence>\n          \u003C\u002FRecoveryNode>\n        \u003C\u002FRateController>\n        \u003CRecoveryNode number_of_retries=\"1\" name=\"FollowPath\">\n          \u003CFollowPath path=\"{path}\" controller_id=\"{selected_controller}\" error_code_id=\"{follow_path_error_code}\"\u002F>\n          \u003CSequence>\n            \u003CWouldAControllerRecoveryHelp error_code=\"{follow_path_error_code}\"\u002F>\n            \u003CClearEntireCostmap name=\"ClearLocalCostmap-Context\" service_name=\"local_costmap\u002Fclear_entirely_local_costmap\"\u002F>\n          \u003C\u002FSequence>\n        \u003C\u002FRecoveryNode>\n      \u003C\u002FPipelineSequence>\n      \u003CSequence>\n        \u003CFallback>\n          \u003CWouldAControllerRecoveryHelp error_code=\"{follow_path_error_code}\"\u002F>\n          \u003CWouldAPlannerRecoveryHelp error_code=\"{compute_path_error_code}\"\u002F>\n        \u003C\u002FFallback>\n        \u003CReactiveFallback name=\"RecoveryFallback\">\n          \u003CGoalUpdated\u002F>\n          \u003CRoundRobin name=\"RecoveryActions\">\n            \u003CSequence name=\"ClearingActions\">\n              \u003CClearEntireCostmap name=\"ClearLocalCostmap-Subtree\" service_name=\"local_costmap\u002Fclear_entirely_local_costmap\"\u002F>\n              \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Subtree\" service_name=\"global_costmap\u002Fclear_entirely_global_costmap\"\u002F>\n            \u003C\u002FSequence>\n            \u003CSpin spin_dist=\"1.57\" error_code_id=\"{spin_error_code}\"\u002F>\n            \u003CWait wait_duration=\"5.0\"\u002F>\n            \u003CBackUp backup_dist=\"0.30\" backup_speed=\"0.15\" error_code_id=\"{backup_error_code}\"\u002F>\n          \u003C\u002FRoundRobin>\n        \u003C\u002FReactiveFallback>\n      \u003C\u002FSequence>\n    \u003C\u002FRecoveryNode>\n  \u003C\u002FBehaviorTree>\n\u003C\u002Froot>\n",[76,11739,11740,11744,11749,11754,11758,11778,11792,11812,11826,11852,11878,11893,11914,11923,11955,11989,11997,12005,12019,12039,12047,12055,12063,12083,12109,12117,12131,12151,12159,12167,12175,12183,12191,12205,12219,12227,12241,12249,12263,12277,12297,12317,12325,12345,12359,12386,12394,12402,12410,12418,12426],{"__ignoreMap":34},[79,11741,11742],{"class":81,"line":82},[79,11743,10995],{"class":148},[79,11745,11746],{"class":81,"line":116},[79,11747,11748],{"class":148},"  This Behavior Tree replans the global path periodically at 1 Hz through an array of poses continuously\n",[79,11750,11751],{"class":81,"line":138},[79,11752,11753],{"class":148},"   and it also has recovery actions specific to planning \u002F control as well as general system issues.\n",[79,11755,11756],{"class":81,"line":145},[79,11757,11015],{"class":148},[79,11759,11760,11762,11764,11766,11768,11770,11772,11774,11776],{"class":81,"line":152},[79,11761,100],{"class":106},[79,11763,11022],{"class":1646},[79,11765,11025],{"class":85},[79,11767,1334],{"class":106},[79,11769,11030],{"class":89},[79,11771,11033],{"class":85},[79,11773,1334],{"class":106},[79,11775,11038],{"class":89},[79,11777,11041],{"class":106},[79,11779,11780,11782,11784,11786,11788,11790],{"class":81,"line":164},[79,11781,11046],{"class":106},[79,11783,11049],{"class":1646},[79,11785,11052],{"class":85},[79,11787,1334],{"class":106},[79,11789,11038],{"class":89},[79,11791,11041],{"class":106},[79,11793,11794,11796,11798,11800,11802,11804,11806,11808,11810],{"class":81,"line":176},[79,11795,11063],{"class":106},[79,11797,11066],{"class":1646},[79,11799,11069],{"class":85},[79,11801,1334],{"class":106},[79,11803,11074],{"class":89},[79,11805,11077],{"class":85},[79,11807,1334],{"class":106},[79,11809,11082],{"class":89},[79,11811,11041],{"class":106},[79,11813,11814,11816,11818,11820,11822,11824],{"class":81,"line":181},[79,11815,11089],{"class":106},[79,11817,11092],{"class":1646},[79,11819,11077],{"class":85},[79,11821,1334],{"class":106},[79,11823,11099],{"class":89},[79,11825,11041],{"class":106},[79,11827,11828,11830,11832,11834,11836,11838,11840,11842,11844,11846,11848,11850],{"class":81,"line":186},[79,11829,11106],{"class":106},[79,11831,11109],{"class":1646},[79,11833,11112],{"class":85},[79,11835,1334],{"class":106},[79,11837,11117],{"class":89},[79,11839,11120],{"class":85},[79,11841,1334],{"class":106},[79,11843,11125],{"class":89},[79,11845,11128],{"class":85},[79,11847,1334],{"class":106},[79,11849,11133],{"class":89},[79,11851,11136],{"class":106},[79,11853,11854,11856,11858,11860,11862,11864,11866,11868,11870,11872,11874,11876],{"class":81,"line":197},[79,11855,11106],{"class":106},[79,11857,11143],{"class":1646},[79,11859,11146],{"class":85},[79,11861,1334],{"class":106},[79,11863,11151],{"class":89},[79,11865,11154],{"class":85},[79,11867,1334],{"class":106},[79,11869,11159],{"class":89},[79,11871,11128],{"class":85},[79,11873,1334],{"class":106},[79,11875,11166],{"class":89},[79,11877,11136],{"class":106},[79,11879,11880,11882,11884,11886,11888,11891],{"class":81,"line":1346},[79,11881,11106],{"class":106},[79,11883,11175],{"class":1646},[79,11885,11178],{"class":85},[79,11887,1334],{"class":106},[79,11889,11890],{"class":89},"\"0.333\"",[79,11892,11041],{"class":106},[79,11894,11895,11897,11899,11901,11903,11905,11907,11909,11912],{"class":81,"line":1361},[79,11896,11190],{"class":106},[79,11898,11066],{"class":1646},[79,11900,11069],{"class":85},[79,11902,1334],{"class":106},[79,11904,11199],{"class":89},[79,11906,11077],{"class":85},[79,11908,1334],{"class":106},[79,11910,11911],{"class":89},"\"ComputePathThroughPoses\"",[79,11913,11041],{"class":106},[79,11915,11916,11918,11921],{"class":81,"line":1366},[79,11917,11213],{"class":106},[79,11919,11920],{"class":1646},"ReactiveSequence",[79,11922,11041],{"class":106},[79,11924,11925,11927,11930,11933,11935,11938,11941,11943,11945,11948,11950,11953],{"class":81,"line":1377},[79,11926,11263],{"class":106},[79,11928,11929],{"class":1646},"RemovePassedGoals",[79,11931,11932],{"class":85}," input_goals",[79,11934,1334],{"class":106},[79,11936,11937],{"class":89},"\"{goals}\"",[79,11939,11940],{"class":85}," output_goals",[79,11942,1334],{"class":106},[79,11944,11937],{"class":89},[79,11946,11947],{"class":85}," radius",[79,11949,1334],{"class":106},[79,11951,11952],{"class":89},"\"0.7\"",[79,11954,11136],{"class":106},[79,11956,11957,11959,11962,11965,11967,11969,11971,11973,11975,11977,11979,11981,11983,11985,11987],{"class":81,"line":1386},[79,11958,11263],{"class":106},[79,11960,11961],{"class":1646},"ComputePathThroughPoses",[79,11963,11964],{"class":85}," goals",[79,11966,1334],{"class":106},[79,11968,11937],{"class":89},[79,11970,11227],{"class":85},[79,11972,1334],{"class":106},[79,11974,11232],{"class":89},[79,11976,11235],{"class":85},[79,11978,1334],{"class":106},[79,11980,11151],{"class":89},[79,11982,11242],{"class":85},[79,11984,1334],{"class":106},[79,11986,11247],{"class":89},[79,11988,11136],{"class":106},[79,11990,11991,11993,11995],{"class":81,"line":1400},[79,11992,11304],{"class":106},[79,11994,11920],{"class":1646},[79,11996,11041],{"class":106},[79,11998,11999,12001,12003],{"class":81,"line":1413},[79,12000,11213],{"class":106},[79,12002,11256],{"class":1646},[79,12004,11041],{"class":106},[79,12006,12007,12009,12011,12013,12015,12017],{"class":81,"line":1423},[79,12008,11263],{"class":106},[79,12010,11266],{"class":1646},[79,12012,11269],{"class":85},[79,12014,1334],{"class":106},[79,12016,11247],{"class":89},[79,12018,11136],{"class":106},[79,12020,12021,12023,12025,12027,12029,12031,12033,12035,12037],{"class":81,"line":1431},[79,12022,11263],{"class":106},[79,12024,11282],{"class":1646},[79,12026,11077],{"class":85},[79,12028,1334],{"class":106},[79,12030,11289],{"class":89},[79,12032,11292],{"class":85},[79,12034,1334],{"class":106},[79,12036,11297],{"class":89},[79,12038,11136],{"class":106},[79,12040,12041,12043,12045],{"class":81,"line":1447},[79,12042,11304],{"class":106},[79,12044,11256],{"class":1646},[79,12046,11041],{"class":106},[79,12048,12049,12051,12053],{"class":81,"line":1461},[79,12050,11313],{"class":106},[79,12052,11066],{"class":1646},[79,12054,11041],{"class":106},[79,12056,12057,12059,12061],{"class":81,"line":1473},[79,12058,11322],{"class":106},[79,12060,11175],{"class":1646},[79,12062,11041],{"class":106},[79,12064,12065,12067,12069,12071,12073,12075,12077,12079,12081],{"class":81,"line":1478},[79,12066,11106],{"class":106},[79,12068,11066],{"class":1646},[79,12070,11069],{"class":85},[79,12072,1334],{"class":106},[79,12074,11199],{"class":89},[79,12076,11077],{"class":85},[79,12078,1334],{"class":106},[79,12080,11125],{"class":89},[79,12082,11041],{"class":106},[79,12084,12085,12087,12089,12091,12093,12095,12097,12099,12101,12103,12105,12107],{"class":81,"line":1489},[79,12086,11190],{"class":106},[79,12088,11353],{"class":1646},[79,12090,11227],{"class":85},[79,12092,1334],{"class":106},[79,12094,11232],{"class":89},[79,12096,11362],{"class":85},[79,12098,1334],{"class":106},[79,12100,11117],{"class":89},[79,12102,11242],{"class":85},[79,12104,1334],{"class":106},[79,12106,11373],{"class":89},[79,12108,11136],{"class":106},[79,12110,12111,12113,12115],{"class":81,"line":1500},[79,12112,11190],{"class":106},[79,12114,11256],{"class":1646},[79,12116,11041],{"class":106},[79,12118,12119,12121,12123,12125,12127,12129],{"class":81,"line":1506},[79,12120,11213],{"class":106},[79,12122,11390],{"class":1646},[79,12124,11269],{"class":85},[79,12126,1334],{"class":106},[79,12128,11373],{"class":89},[79,12130,11136],{"class":106},[79,12132,12133,12135,12137,12139,12141,12143,12145,12147,12149],{"class":81,"line":1517},[79,12134,11213],{"class":106},[79,12136,11282],{"class":1646},[79,12138,11077],{"class":85},[79,12140,1334],{"class":106},[79,12142,11411],{"class":89},[79,12144,11292],{"class":85},[79,12146,1334],{"class":106},[79,12148,11418],{"class":89},[79,12150,11136],{"class":106},[79,12152,12153,12155,12157],{"class":81,"line":1523},[79,12154,11313],{"class":106},[79,12156,11256],{"class":1646},[79,12158,11041],{"class":106},[79,12160,12161,12163,12165],{"class":81,"line":1536},[79,12162,11322],{"class":106},[79,12164,11066],{"class":1646},[79,12166,11041],{"class":106},[79,12168,12169,12171,12173],{"class":81,"line":1549},[79,12170,11441],{"class":106},[79,12172,11092],{"class":1646},[79,12174,11041],{"class":106},[79,12176,12177,12179,12181],{"class":81,"line":1561},[79,12178,11089],{"class":106},[79,12180,11256],{"class":1646},[79,12182,11041],{"class":106},[79,12184,12185,12187,12189],{"class":81,"line":1574},[79,12186,11106],{"class":106},[79,12188,11460],{"class":1646},[79,12190,11041],{"class":106},[79,12192,12193,12195,12197,12199,12201,12203],{"class":81,"line":1579},[79,12194,11190],{"class":106},[79,12196,11390],{"class":1646},[79,12198,11269],{"class":85},[79,12200,1334],{"class":106},[79,12202,11373],{"class":89},[79,12204,11136],{"class":106},[79,12206,12207,12209,12211,12213,12215,12217],{"class":81,"line":1590},[79,12208,11190],{"class":106},[79,12210,11266],{"class":1646},[79,12212,11269],{"class":85},[79,12214,1334],{"class":106},[79,12216,11247],{"class":89},[79,12218,11136],{"class":106},[79,12220,12221,12223,12225],{"class":81,"line":1595},[79,12222,11322],{"class":106},[79,12224,11460],{"class":1646},[79,12226,11041],{"class":106},[79,12228,12229,12231,12233,12235,12237,12239],{"class":81,"line":1601},[79,12230,11106],{"class":106},[79,12232,11505],{"class":1646},[79,12234,11077],{"class":85},[79,12236,1334],{"class":106},[79,12238,11512],{"class":89},[79,12240,11041],{"class":106},[79,12242,12243,12245,12247],{"class":81,"line":1607},[79,12244,11190],{"class":106},[79,12246,11521],{"class":1646},[79,12248,11136],{"class":106},[79,12250,12251,12253,12255,12257,12259,12261],{"class":81,"line":1613},[79,12252,11190],{"class":106},[79,12254,11530],{"class":1646},[79,12256,11077],{"class":85},[79,12258,1334],{"class":106},[79,12260,11537],{"class":89},[79,12262,11041],{"class":106},[79,12264,12265,12267,12269,12271,12273,12275],{"class":81,"line":1618},[79,12266,11213],{"class":106},[79,12268,11256],{"class":1646},[79,12270,11077],{"class":85},[79,12272,1334],{"class":106},[79,12274,11552],{"class":89},[79,12276,11041],{"class":106},[79,12278,12279,12281,12283,12285,12287,12289,12291,12293,12295],{"class":81,"line":2001},[79,12280,11263],{"class":106},[79,12282,11282],{"class":1646},[79,12284,11077],{"class":85},[79,12286,1334],{"class":106},[79,12288,11567],{"class":89},[79,12290,11292],{"class":85},[79,12292,1334],{"class":106},[79,12294,11418],{"class":89},[79,12296,11136],{"class":106},[79,12298,12299,12301,12303,12305,12307,12309,12311,12313,12315],{"class":81,"line":2012},[79,12300,11263],{"class":106},[79,12302,11282],{"class":1646},[79,12304,11077],{"class":85},[79,12306,1334],{"class":106},[79,12308,11588],{"class":89},[79,12310,11292],{"class":85},[79,12312,1334],{"class":106},[79,12314,11297],{"class":89},[79,12316,11136],{"class":106},[79,12318,12319,12321,12323],{"class":81,"line":2025},[79,12320,11304],{"class":106},[79,12322,11256],{"class":1646},[79,12324,11041],{"class":106},[79,12326,12327,12329,12331,12333,12335,12337,12339,12341,12343],{"class":81,"line":2039},[79,12328,11213],{"class":106},[79,12330,11611],{"class":1646},[79,12332,11614],{"class":85},[79,12334,1334],{"class":106},[79,12336,11619],{"class":89},[79,12338,11242],{"class":85},[79,12340,1334],{"class":106},[79,12342,11626],{"class":89},[79,12344,11136],{"class":106},[79,12346,12347,12349,12351,12353,12355,12357],{"class":81,"line":2052},[79,12348,11213],{"class":106},[79,12350,11635],{"class":1646},[79,12352,11638],{"class":85},[79,12354,1334],{"class":106},[79,12356,11643],{"class":89},[79,12358,11136],{"class":106},[79,12360,12361,12363,12365,12367,12369,12371,12373,12375,12377,12379,12381,12384],{"class":81,"line":2066},[79,12362,11213],{"class":106},[79,12364,11652],{"class":1646},[79,12366,11655],{"class":85},[79,12368,1334],{"class":106},[79,12370,11660],{"class":89},[79,12372,11663],{"class":85},[79,12374,1334],{"class":106},[79,12376,11668],{"class":89},[79,12378,11242],{"class":85},[79,12380,1334],{"class":106},[79,12382,12383],{"class":89},"\"{backup_error_code}\"",[79,12385,11136],{"class":106},[79,12387,12388,12390,12392],{"class":81,"line":2077},[79,12389,11313],{"class":106},[79,12391,11530],{"class":1646},[79,12393,11041],{"class":106},[79,12395,12396,12398,12400],{"class":81,"line":2082},[79,12397,11322],{"class":106},[79,12399,11505],{"class":1646},[79,12401,11041],{"class":106},[79,12403,12404,12406,12408],{"class":81,"line":2092},[79,12405,11441],{"class":106},[79,12407,11256],{"class":1646},[79,12409,11041],{"class":106},[79,12411,12412,12414,12416],{"class":81,"line":2103},[79,12413,11706],{"class":106},[79,12415,11066],{"class":1646},[79,12417,11041],{"class":106},[79,12419,12420,12422,12424],{"class":81,"line":2115},[79,12421,11715],{"class":106},[79,12423,11049],{"class":1646},[79,12425,11041],{"class":106},[79,12427,12428,12430,12432],{"class":81,"line":2120},[79,12429,11724],{"class":106},[79,12431,11022],{"class":1646},[79,12433,11041],{"class":106},[20,12435,12436,12437,5190],{},"在params目录下新建一个名为",[76,12438,12439],{},"bt.yaml",[70,12441,12443],{"className":1637,"code":12442,"language":1639,"meta":34,"style":34},"\n\u002F**:\n  ros__parameters:\n    use_sim_time: True\n    global_frame: map\n    robot_base_frame: base_link\n    odom_topic: \u002Fodom\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",[76,12444,12445,12449,12455,12461,12469,12478,12487,12497,12507,12517,12527,12537,12554,12561,12571,12578,12587,12594,12602],{"__ignoreMap":34},[79,12446,12447],{"class":81,"line":82},[79,12448,142],{"emptyLinePlaceholder":141},[79,12450,12451,12453],{"class":81,"line":116},[79,12452,6522],{"class":1646},[79,12454,1649],{"class":106},[79,12456,12457,12459],{"class":81,"line":138},[79,12458,1654],{"class":1646},[79,12460,1649],{"class":106},[79,12462,12463,12465,12467],{"class":81,"line":145},[79,12464,6535],{"class":1646},[79,12466,1664],{"class":106},[79,12468,9791],{"class":1215},[79,12470,12471,12474,12476],{"class":81,"line":152},[79,12472,12473],{"class":1646},"    global_frame",[79,12475,1664],{"class":106},[79,12477,1741],{"class":89},[79,12479,12480,12483,12485],{"class":81,"line":164},[79,12481,12482],{"class":1646},"    robot_base_frame",[79,12484,1664],{"class":106},[79,12486,1751],{"class":89},[79,12488,12489,12492,12494],{"class":81,"line":176},[79,12490,12491],{"class":1646},"    odom_topic",[79,12493,1664],{"class":106},[79,12495,12496],{"class":89},"\u002Fodom\n",[79,12498,12499,12502,12504],{"class":81,"line":181},[79,12500,12501],{"class":1646},"    bt_loop_duration",[79,12503,1664],{"class":106},[79,12505,12506],{"class":1215},"10\n",[79,12508,12509,12512,12514],{"class":81,"line":186},[79,12510,12511],{"class":1646},"    default_server_timeout",[79,12513,1664],{"class":106},[79,12515,12516],{"class":1215},"20\n",[79,12518,12519,12522,12524],{"class":81,"line":197},[79,12520,12521],{"class":1646},"    wait_for_service_timeout",[79,12523,1664],{"class":106},[79,12525,12526],{"class":1215},"1000\n",[79,12528,12529,12532,12534],{"class":81,"line":1346},[79,12530,12531],{"class":1646},"    action_server_result_timeout",[79,12533,1664],{"class":106},[79,12535,12536],{"class":1215},"900.0\n",[79,12538,12539,12542,12544,12547,12549,12552],{"class":81,"line":1361},[79,12540,12541],{"class":1646},"    navigators",[79,12543,4852],{"class":106},[79,12545,12546],{"class":89},"\"navigate_to_pose\"",[79,12548,1453],{"class":106},[79,12550,12551],{"class":89},"\"navigate_through_poses\"",[79,12553,4868],{"class":106},[79,12555,12556,12559],{"class":81,"line":1366},[79,12557,12558],{"class":1646},"    navigate_to_pose",[79,12560,1649],{"class":106},[79,12562,12563,12566,12568],{"class":81,"line":1377},[79,12564,12565],{"class":1646},"      plugin",[79,12567,1664],{"class":106},[79,12569,12570],{"class":89},"\"nav2_bt_navigator::NavigateToPoseNavigator\"\n",[79,12572,12573,12576],{"class":81,"line":1386},[79,12574,12575],{"class":1646},"    navigate_through_poses",[79,12577,1649],{"class":106},[79,12579,12580,12582,12584],{"class":81,"line":1400},[79,12581,12565],{"class":1646},[79,12583,1664],{"class":106},[79,12585,12586],{"class":89},"\"nav2_bt_navigator::NavigateThroughPosesNavigator\"\n",[79,12588,12589,12592],{"class":81,"line":1413},[79,12590,12591],{"class":1646},"    error_code_names",[79,12593,1649],{"class":106},[79,12595,12596,12599],{"class":81,"line":1423},[79,12597,12598],{"class":106},"      - ",[79,12600,12601],{"class":89},"compute_path_error_code\n",[79,12603,12604,12606],{"class":81,"line":1431},[79,12605,12598],{"class":106},[79,12607,12608],{"class":89},"follow_path_error_code\n",[20,12610,12611],{},[23,12612,12613],{},"（2）planner_server相关配置文件",[20,12615,12436,12616,5190],{},[76,12617,12618],{},"planner.yaml",[70,12620,12622],{"className":1637,"code":12621,"language":1639,"meta":34,"style":34},"\u002F**:\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: \u002Fscan\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: \u002Fscan\n          max_obstacle_height: 2.0\n          clearing: True\n          marking: True\n          data_type: \"LaserScan\"\n          raytrace_max_range: 3.0\n          raytrace_min_range: 0.0\n          obstacle_max_range: 2.5\n          obstacle_min_range: 0.0\n      static_layer:\n        plugin: \"nav2_costmap_2d::StaticLayer\"\n        map_subscribe_transient_local: True\n      inflation_layer:\n        plugin: \"nav2_costmap_2d::InflationLayer\"\n        cost_scaling_factor: 4.0\n        inflation_radius: 0.55\n      always_send_full_costmap: False\n",[76,12623,12624,12630,12636,12646,12654,12665,12672,12681,12690,12699,12708,12715,12722,12732,12741,12750,12759,12768,12778,12787,12796,12823,12830,12840,12849,12858,12865,12874,12883,12892,12901,12911,12920,12929,12939,12948,12955,12964,12972,12981,12990,12999,13009,13018,13027,13035,13041,13049,13057,13065,13073,13081,13089,13097,13105,13113,13120,13129,13138,13145,13154,13164,13174],{"__ignoreMap":34},[79,12625,12626,12628],{"class":81,"line":82},[79,12627,6522],{"class":1646},[79,12629,1649],{"class":106},[79,12631,12632,12634],{"class":81,"line":116},[79,12633,1654],{"class":1646},[79,12635,1649],{"class":106},[79,12637,12638,12641,12643],{"class":81,"line":138},[79,12639,12640],{"class":1646},"    expected_planner_frequency",[79,12642,1664],{"class":106},[79,12644,12645],{"class":1215},"20.0\n",[79,12647,12648,12650,12652],{"class":81,"line":145},[79,12649,6535],{"class":1646},[79,12651,1664],{"class":106},[79,12653,9791],{"class":1215},[79,12655,12656,12659,12661,12663],{"class":81,"line":152},[79,12657,12658],{"class":1646},"    planner_plugins",[79,12660,4852],{"class":106},[79,12662,11159],{"class":89},[79,12664,4868],{"class":106},[79,12666,12667,12670],{"class":81,"line":164},[79,12668,12669],{"class":1646},"    GridBased",[79,12671,1649],{"class":106},[79,12673,12674,12676,12678],{"class":81,"line":176},[79,12675,12565],{"class":1646},[79,12677,1664],{"class":106},[79,12679,12680],{"class":89},"\"nav2_navfn_planner::NavfnPlanner\"\n",[79,12682,12683,12686,12688],{"class":81,"line":181},[79,12684,12685],{"class":1646},"      tolerance",[79,12687,1664],{"class":106},[79,12689,1872],{"class":1215},[79,12691,12692,12695,12697],{"class":81,"line":186},[79,12693,12694],{"class":1646},"      use_astar",[79,12696,1664],{"class":106},[79,12698,1807],{"class":1215},[79,12700,12701,12704,12706],{"class":81,"line":197},[79,12702,12703],{"class":1646},"      allow_unknown",[79,12705,1664],{"class":106},[79,12707,1914],{"class":1215},[79,12709,12710,12713],{"class":81,"line":1346},[79,12711,12712],{"class":1646},"  global_costmap",[79,12714,1649],{"class":106},[79,12716,12717,12720],{"class":81,"line":1361},[79,12718,12719],{"class":1646},"    ros__parameters",[79,12721,1649],{"class":106},[79,12723,12724,12727,12729],{"class":81,"line":1366},[79,12725,12726],{"class":1646},"      update_frequency",[79,12728,1664],{"class":106},[79,12730,12731],{"class":1215},"1.0\n",[79,12733,12734,12737,12739],{"class":81,"line":1377},[79,12735,12736],{"class":1646},"      publish_frequency",[79,12738,1664],{"class":106},[79,12740,12731],{"class":1215},[79,12742,12743,12746,12748],{"class":81,"line":1386},[79,12744,12745],{"class":1646},"      global_frame",[79,12747,1664],{"class":106},[79,12749,1741],{"class":89},[79,12751,12752,12755,12757],{"class":81,"line":1400},[79,12753,12754],{"class":1646},"      robot_base_frame",[79,12756,1664],{"class":106},[79,12758,1751],{"class":89},[79,12760,12761,12764,12766],{"class":81,"line":1413},[79,12762,12763],{"class":1646},"      use_sim_time",[79,12765,1664],{"class":106},[79,12767,9791],{"class":1215},[79,12769,12770,12773,12775],{"class":81,"line":1423},[79,12771,12772],{"class":1646},"      footprint",[79,12774,1664],{"class":106},[79,12776,12777],{"class":89},"\"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n",[79,12779,12780,12783,12785],{"class":81,"line":1431},[79,12781,12782],{"class":1646},"      resolution",[79,12784,1664],{"class":106},[79,12786,1850],{"class":1215},[79,12788,12789,12792,12794],{"class":81,"line":1447},[79,12790,12791],{"class":1646},"      track_unknown_space",[79,12793,1664],{"class":106},[79,12795,1914],{"class":1215},[79,12797,12798,12801,12803,12806,12808,12811,12813,12816,12818,12821],{"class":81,"line":1461},[79,12799,12800],{"class":1646},"      plugins",[79,12802,4852],{"class":106},[79,12804,12805],{"class":89},"\"static_layer\"",[79,12807,1453],{"class":106},[79,12809,12810],{"class":89},"\"obstacle_layer\"",[79,12812,1453],{"class":106},[79,12814,12815],{"class":89},"\"voxel_layer\"",[79,12817,1453],{"class":106},[79,12819,12820],{"class":89},"\"inflation_layer\"",[79,12822,4868],{"class":106},[79,12824,12825,12828],{"class":81,"line":1473},[79,12826,12827],{"class":1646},"      obstacle_layer",[79,12829,1649],{"class":106},[79,12831,12832,12835,12837],{"class":81,"line":1478},[79,12833,12834],{"class":1646},"        plugin",[79,12836,1664],{"class":106},[79,12838,12839],{"class":89},"\"nav2_costmap_2d::ObstacleLayer\"\n",[79,12841,12842,12845,12847],{"class":81,"line":1489},[79,12843,12844],{"class":1646},"        enabled",[79,12846,1664],{"class":106},[79,12848,9791],{"class":1215},[79,12850,12851,12854,12856],{"class":81,"line":1500},[79,12852,12853],{"class":1646},"        observation_sources",[79,12855,1664],{"class":106},[79,12857,6888],{"class":89},[79,12859,12860,12863],{"class":81,"line":1506},[79,12861,12862],{"class":1646},"        scan",[79,12864,1649],{"class":106},[79,12866,12867,12870,12872],{"class":81,"line":1517},[79,12868,12869],{"class":1646},"          topic",[79,12871,1664],{"class":106},[79,12873,1761],{"class":89},[79,12875,12876,12879,12881],{"class":81,"line":1523},[79,12877,12878],{"class":1646},"          max_obstacle_height",[79,12880,1664],{"class":106},[79,12882,1840],{"class":1215},[79,12884,12885,12888,12890],{"class":81,"line":1536},[79,12886,12887],{"class":1646},"          clearing",[79,12889,1664],{"class":106},[79,12891,9791],{"class":1215},[79,12893,12894,12897,12899],{"class":81,"line":1549},[79,12895,12896],{"class":1646},"          marking",[79,12898,1664],{"class":106},[79,12900,9791],{"class":1215},[79,12902,12903,12906,12908],{"class":81,"line":1561},[79,12904,12905],{"class":1646},"          data_type",[79,12907,1664],{"class":106},[79,12909,12910],{"class":89},"\"LaserScan\"\n",[79,12912,12913,12916,12918],{"class":81,"line":1574},[79,12914,12915],{"class":1646},"          raytrace_max_range",[79,12917,1664],{"class":106},[79,12919,2009],{"class":1215},[79,12921,12922,12925,12927],{"class":81,"line":1579},[79,12923,12924],{"class":1646},"          raytrace_min_range",[79,12926,1664],{"class":106},[79,12928,6761],{"class":1215},[79,12930,12931,12934,12936],{"class":81,"line":1590},[79,12932,12933],{"class":1646},"          obstacle_max_range",[79,12935,1664],{"class":106},[79,12937,12938],{"class":1215},"2.5\n",[79,12940,12941,12944,12946],{"class":81,"line":1595},[79,12942,12943],{"class":1646},"          obstacle_min_range",[79,12945,1664],{"class":106},[79,12947,6761],{"class":1215},[79,12949,12950,12953],{"class":81,"line":1601},[79,12951,12952],{"class":1646},"      voxel_layer",[79,12954,1649],{"class":106},[79,12956,12957,12959,12961],{"class":81,"line":1607},[79,12958,12834],{"class":1646},[79,12960,1664],{"class":106},[79,12962,12963],{"class":89},"\"nav2_costmap_2d::VoxelLayer\"\n",[79,12965,12966,12968,12970],{"class":81,"line":1613},[79,12967,12844],{"class":1646},[79,12969,1664],{"class":106},[79,12971,9791],{"class":1215},[79,12973,12974,12977,12979],{"class":81,"line":1618},[79,12975,12976],{"class":1646},"        publish_voxel_map",[79,12978,1664],{"class":106},[79,12980,9791],{"class":1215},[79,12982,12983,12986,12988],{"class":81,"line":2001},[79,12984,12985],{"class":1646},"        origin_z",[79,12987,1664],{"class":106},[79,12989,6761],{"class":1215},[79,12991,12992,12995,12997],{"class":81,"line":2012},[79,12993,12994],{"class":1646},"        z_resolution",[79,12996,1664],{"class":106},[79,12998,1850],{"class":1215},[79,13000,13001,13004,13006],{"class":81,"line":2025},[79,13002,13003],{"class":1646},"        z_voxels",[79,13005,1664],{"class":106},[79,13007,13008],{"class":1215},"16\n",[79,13010,13011,13014,13016],{"class":81,"line":2039},[79,13012,13013],{"class":1646},"        max_obstacle_height",[79,13015,1664],{"class":106},[79,13017,1840],{"class":1215},[79,13019,13020,13023,13025],{"class":81,"line":2052},[79,13021,13022],{"class":1646},"        mark_threshold",[79,13024,1664],{"class":106},[79,13026,4878],{"class":1215},[79,13028,13029,13031,13033],{"class":81,"line":2066},[79,13030,12853],{"class":1646},[79,13032,1664],{"class":106},[79,13034,6888],{"class":89},[79,13036,13037,13039],{"class":81,"line":2077},[79,13038,12862],{"class":1646},[79,13040,1649],{"class":106},[79,13042,13043,13045,13047],{"class":81,"line":2082},[79,13044,12869],{"class":1646},[79,13046,1664],{"class":106},[79,13048,1761],{"class":89},[79,13050,13051,13053,13055],{"class":81,"line":2092},[79,13052,12878],{"class":1646},[79,13054,1664],{"class":106},[79,13056,1840],{"class":1215},[79,13058,13059,13061,13063],{"class":81,"line":2103},[79,13060,12887],{"class":1646},[79,13062,1664],{"class":106},[79,13064,9791],{"class":1215},[79,13066,13067,13069,13071],{"class":81,"line":2115},[79,13068,12896],{"class":1646},[79,13070,1664],{"class":106},[79,13072,9791],{"class":1215},[79,13074,13075,13077,13079],{"class":81,"line":2120},[79,13076,12905],{"class":1646},[79,13078,1664],{"class":106},[79,13080,12910],{"class":89},[79,13082,13083,13085,13087],{"class":81,"line":2131},[79,13084,12915],{"class":1646},[79,13086,1664],{"class":106},[79,13088,2009],{"class":1215},[79,13090,13091,13093,13095],{"class":81,"line":2141},[79,13092,12924],{"class":1646},[79,13094,1664],{"class":106},[79,13096,6761],{"class":1215},[79,13098,13099,13101,13103],{"class":81,"line":2152},[79,13100,12933],{"class":1646},[79,13102,1664],{"class":106},[79,13104,12938],{"class":1215},[79,13106,13107,13109,13111],{"class":81,"line":2157},[79,13108,12943],{"class":1646},[79,13110,1664],{"class":106},[79,13112,6761],{"class":1215},[79,13114,13115,13118],{"class":81,"line":2171},[79,13116,13117],{"class":1646},"      static_layer",[79,13119,1649],{"class":106},[79,13121,13122,13124,13126],{"class":81,"line":2184},[79,13123,12834],{"class":1646},[79,13125,1664],{"class":106},[79,13127,13128],{"class":89},"\"nav2_costmap_2d::StaticLayer\"\n",[79,13130,13131,13134,13136],{"class":81,"line":2189},[79,13132,13133],{"class":1646},"        map_subscribe_transient_local",[79,13135,1664],{"class":106},[79,13137,9791],{"class":1215},[79,13139,13140,13143],{"class":81,"line":2203},[79,13141,13142],{"class":1646},"      inflation_layer",[79,13144,1649],{"class":106},[79,13146,13147,13149,13151],{"class":81,"line":2217},[79,13148,12834],{"class":1646},[79,13150,1664],{"class":106},[79,13152,13153],{"class":89},"\"nav2_costmap_2d::InflationLayer\"\n",[79,13155,13156,13159,13161],{"class":81,"line":2231},[79,13157,13158],{"class":1646},"        cost_scaling_factor",[79,13160,1664],{"class":106},[79,13162,13163],{"class":1215},"4.0\n",[79,13165,13166,13169,13171],{"class":81,"line":2242},[79,13167,13168],{"class":1646},"        inflation_radius",[79,13170,1664],{"class":106},[79,13172,13173],{"class":1215},"0.55\n",[79,13175,13176,13179,13181],{"class":81,"line":2252},[79,13177,13178],{"class":1646},"      always_send_full_costmap",[79,13180,1664],{"class":106},[79,13182,13183],{"class":1215},"False\n",[20,13185,13186],{},[23,13187,13188],{},"（3）controller_server相关配置文件",[20,13190,12436,13191,5190],{},[76,13192,13193],{},"controller.yaml",[70,13195,13197],{"className":1637,"code":13196,"language":1639,"meta":34,"style":34},"\u002F**:\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: \u002Fscan\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: \u002Fscan\n          max_obstacle_height: 2.0\n          clearing: True\n          marking: True\n          data_type: \"LaserScan\"\n          raytrace_max_range: 3.0\n          raytrace_min_range: 0.0\n          obstacle_max_range: 2.5\n          obstacle_min_range: 0.0\n      static_layer:\n        map_subscribe_transient_local: True\n      always_send_full_costmap: True\n",[76,13198,13199,13205,13211,13219,13228,13238,13247,13256,13265,13277,13290,13301,13305,13310,13317,13326,13335,13344,13348,13355,13364,13373,13382,13391,13395,13400,13407,13416,13425,13434,13443,13453,13462,13471,13480,13489,13498,13508,13517,13527,13537,13546,13556,13565,13575,13584,13594,13603,13613,13622,13631,13640,13649,13657,13699,13709,13719,13728,13738,13747,13756,13765,13774,13784,13793,13800,13806,13814,13822,13830,13838,13846,13855,13865,13874,13882,13890,13908,13914,13922,13930,13938,13944,13952,13960,13968,13974,13982,13990,13998,14006,14014,14020,14028,14036,14044,14052,14060,14068,14076,14084,14092,14098,14106,14114,14122,14130,14138,14146,14154,14162,14170,14176,14184],{"__ignoreMap":34},[79,13200,13201,13203],{"class":81,"line":82},[79,13202,6522],{"class":1646},[79,13204,1649],{"class":106},[79,13206,13207,13209],{"class":81,"line":116},[79,13208,1654],{"class":1646},[79,13210,1649],{"class":106},[79,13212,13213,13215,13217],{"class":81,"line":138},[79,13214,6535],{"class":1646},[79,13216,1664],{"class":106},[79,13218,9791],{"class":1215},[79,13220,13221,13224,13226],{"class":81,"line":145},[79,13222,13223],{"class":1646},"    controller_frequency",[79,13225,1664],{"class":106},[79,13227,1975],{"class":1215},[79,13229,13230,13233,13235],{"class":81,"line":152},[79,13231,13232],{"class":1646},"    min_x_velocity_threshold",[79,13234,1664],{"class":106},[79,13236,13237],{"class":1215},"0.001\n",[79,13239,13240,13243,13245],{"class":81,"line":164},[79,13241,13242],{"class":1646},"    min_y_velocity_threshold",[79,13244,1664],{"class":106},[79,13246,1872],{"class":1215},[79,13248,13249,13252,13254],{"class":81,"line":176},[79,13250,13251],{"class":1646},"    min_theta_velocity_threshold",[79,13253,1664],{"class":106},[79,13255,13237],{"class":1215},[79,13257,13258,13261,13263],{"class":81,"line":181},[79,13259,13260],{"class":1646},"    failure_tolerance",[79,13262,1664],{"class":106},[79,13264,12731],{"class":1215},[79,13266,13267,13270,13272,13275],{"class":81,"line":186},[79,13268,13269],{"class":1646},"    progress_checker_plugins",[79,13271,4852],{"class":106},[79,13273,13274],{"class":89},"\"progress_checker\"",[79,13276,4868],{"class":106},[79,13278,13279,13282,13284,13287],{"class":81,"line":197},[79,13280,13281],{"class":1646},"    goal_checker_plugins",[79,13283,4852],{"class":106},[79,13285,13286],{"class":89},"\"general_goal_checker\"",[79,13288,13289],{"class":106},"] \n",[79,13291,13292,13295,13297,13299],{"class":81,"line":1346},[79,13293,13294],{"class":1646},"    controller_plugins",[79,13296,4852],{"class":106},[79,13298,11125],{"class":89},[79,13300,4868],{"class":106},[79,13302,13303],{"class":81,"line":1361},[79,13304,142],{"emptyLinePlaceholder":141},[79,13306,13307],{"class":81,"line":1366},[79,13308,13309],{"class":148},"    # Progress checker parameters\n",[79,13311,13312,13315],{"class":81,"line":1377},[79,13313,13314],{"class":1646},"    progress_checker",[79,13316,1649],{"class":106},[79,13318,13319,13321,13323],{"class":81,"line":1386},[79,13320,12565],{"class":1646},[79,13322,1664],{"class":106},[79,13324,13325],{"class":89},"\"nav2_controller::SimpleProgressChecker\"\n",[79,13327,13328,13331,13333],{"class":81,"line":1400},[79,13329,13330],{"class":1646},"      required_movement_radius",[79,13332,1664],{"class":106},[79,13334,1872],{"class":1215},[79,13336,13337,13340,13342],{"class":81,"line":1413},[79,13338,13339],{"class":1646},"      movement_time_allowance",[79,13341,1664],{"class":106},[79,13343,1975],{"class":1215},[79,13345,13346],{"class":81,"line":1423},[79,13347,142],{"emptyLinePlaceholder":141},[79,13349,13350,13353],{"class":81,"line":1431},[79,13351,13352],{"class":1646},"    general_goal_checker",[79,13354,1649],{"class":106},[79,13356,13357,13360,13362],{"class":81,"line":1447},[79,13358,13359],{"class":1646},"      stateful",[79,13361,1664],{"class":106},[79,13363,9791],{"class":1215},[79,13365,13366,13368,13370],{"class":81,"line":1461},[79,13367,12565],{"class":1646},[79,13369,1664],{"class":106},[79,13371,13372],{"class":89},"\"nav2_controller::SimpleGoalChecker\"\n",[79,13374,13375,13378,13380],{"class":81,"line":1473},[79,13376,13377],{"class":1646},"      xy_goal_tolerance",[79,13379,1664],{"class":106},[79,13381,4898],{"class":1215},[79,13383,13384,13387,13389],{"class":81,"line":1478},[79,13385,13386],{"class":1646},"      yaw_goal_tolerance",[79,13388,1664],{"class":106},[79,13390,4898],{"class":1215},[79,13392,13393],{"class":81,"line":1489},[79,13394,142],{"emptyLinePlaceholder":141},[79,13396,13397],{"class":81,"line":1500},[79,13398,13399],{"class":148},"    # DWB parameters\n",[79,13401,13402,13405],{"class":81,"line":1506},[79,13403,13404],{"class":1646},"    FollowPath",[79,13406,1649],{"class":106},[79,13408,13409,13411,13413],{"class":81,"line":1517},[79,13410,12565],{"class":1646},[79,13412,1664],{"class":106},[79,13414,13415],{"class":89},"\"dwb_core::DWBLocalPlanner\"\n",[79,13417,13418,13421,13423],{"class":81,"line":1523},[79,13419,13420],{"class":1646},"      debug_trajectory_details",[79,13422,1664],{"class":106},[79,13424,9791],{"class":1215},[79,13426,13427,13430,13432],{"class":81,"line":1536},[79,13428,13429],{"class":1646},"      min_vel_x",[79,13431,1664],{"class":106},[79,13433,6761],{"class":1215},[79,13435,13436,13439,13441],{"class":81,"line":1549},[79,13437,13438],{"class":1646},"      min_vel_y",[79,13440,1664],{"class":106},[79,13442,6761],{"class":1215},[79,13444,13445,13448,13450],{"class":81,"line":1561},[79,13446,13447],{"class":1646},"      max_vel_x",[79,13449,1664],{"class":106},[79,13451,13452],{"class":1215},"0.6\n",[79,13454,13455,13458,13460],{"class":81,"line":1574},[79,13456,13457],{"class":1646},"      max_vel_y",[79,13459,1664],{"class":106},[79,13461,6761],{"class":1215},[79,13463,13464,13467,13469],{"class":81,"line":1579},[79,13465,13466],{"class":1646},"      max_vel_theta",[79,13468,1664],{"class":106},[79,13470,12731],{"class":1215},[79,13472,13473,13476,13478],{"class":81,"line":1590},[79,13474,13475],{"class":1646},"      min_speed_xy",[79,13477,1664],{"class":106},[79,13479,6761],{"class":1215},[79,13481,13482,13485,13487],{"class":81,"line":1595},[79,13483,13484],{"class":1646},"      max_speed_xy",[79,13486,1664],{"class":106},[79,13488,13452],{"class":1215},[79,13490,13491,13494,13496],{"class":81,"line":1601},[79,13492,13493],{"class":1646},"      min_speed_theta",[79,13495,1664],{"class":106},[79,13497,6761],{"class":1215},[79,13499,13500,13503,13505],{"class":81,"line":1607},[79,13501,13502],{"class":1646},"      acc_lim_x",[79,13504,1664],{"class":106},[79,13506,13507],{"class":1215},"1.6\n",[79,13509,13510,13513,13515],{"class":81,"line":1613},[79,13511,13512],{"class":1646},"      acc_lim_y",[79,13514,1664],{"class":106},[79,13516,6761],{"class":1215},[79,13518,13519,13522,13524],{"class":81,"line":1618},[79,13520,13521],{"class":1646},"      acc_lim_theta",[79,13523,1664],{"class":106},[79,13525,13526],{"class":1215},"3.2\n",[79,13528,13529,13532,13534],{"class":81,"line":2001},[79,13530,13531],{"class":1646},"      decel_lim_x",[79,13533,1664],{"class":106},[79,13535,13536],{"class":1215},"-1.6\n",[79,13538,13539,13542,13544],{"class":81,"line":2012},[79,13540,13541],{"class":1646},"      decel_lim_y",[79,13543,1664],{"class":106},[79,13545,6761],{"class":1215},[79,13547,13548,13551,13553],{"class":81,"line":2025},[79,13549,13550],{"class":1646},"      decel_lim_theta",[79,13552,1664],{"class":106},[79,13554,13555],{"class":1215},"-3.2\n",[79,13557,13558,13561,13563],{"class":81,"line":2039},[79,13559,13560],{"class":1646},"      vx_samples",[79,13562,1664],{"class":106},[79,13564,12516],{"class":1215},[79,13566,13567,13570,13572],{"class":81,"line":2052},[79,13568,13569],{"class":1646},"      vy_samples",[79,13571,1664],{"class":106},[79,13573,13574],{"class":1215},"5\n",[79,13576,13577,13580,13582],{"class":81,"line":2066},[79,13578,13579],{"class":1646},"      vtheta_samples",[79,13581,1664],{"class":106},[79,13583,12516],{"class":1215},[79,13585,13586,13589,13591],{"class":81,"line":2077},[79,13587,13588],{"class":1646},"      sim_time",[79,13590,1664],{"class":106},[79,13592,13593],{"class":1215},"1.7\n",[79,13595,13596,13599,13601],{"class":81,"line":2082},[79,13597,13598],{"class":1646},"      linear_granularity",[79,13600,1664],{"class":106},[79,13602,1850],{"class":1215},[79,13604,13605,13608,13610],{"class":81,"line":2092},[79,13606,13607],{"class":1646},"      angular_granularity",[79,13609,1664],{"class":106},[79,13611,13612],{"class":1215},"0.025\n",[79,13614,13615,13618,13620],{"class":81,"line":2103},[79,13616,13617],{"class":1646},"      transform_tolerance",[79,13619,1664],{"class":106},[79,13621,12731],{"class":1215},[79,13623,13624,13626,13628],{"class":81,"line":2115},[79,13625,13377],{"class":1646},[79,13627,1664],{"class":106},[79,13629,13630],{"class":1215},"0.15\n",[79,13632,13633,13636,13638],{"class":81,"line":2120},[79,13634,13635],{"class":1646},"      trans_stopped_velocity",[79,13637,1664],{"class":106},[79,13639,4898],{"class":1215},[79,13641,13642,13645,13647],{"class":81,"line":2131},[79,13643,13644],{"class":1646},"      short_circuit_trajectory_evaluation",[79,13646,1664],{"class":106},[79,13648,9791],{"class":1215},[79,13650,13651,13653,13655],{"class":81,"line":2141},[79,13652,13359],{"class":1646},[79,13654,1664],{"class":106},[79,13656,9791],{"class":1215},[79,13658,13659,13662,13664,13667,13669,13672,13674,13677,13679,13682,13684,13687,13689,13692,13694,13697],{"class":81,"line":2152},[79,13660,13661],{"class":1646},"      critics",[79,13663,4852],{"class":106},[79,13665,13666],{"class":89},"\"RotateToGoal\"",[79,13668,1453],{"class":106},[79,13670,13671],{"class":89},"\"Oscillation\"",[79,13673,1453],{"class":106},[79,13675,13676],{"class":89},"\"BaseObstacle\"",[79,13678,1453],{"class":106},[79,13680,13681],{"class":89},"\"GoalAlign\"",[79,13683,1453],{"class":106},[79,13685,13686],{"class":89},"\"PathAlign\"",[79,13688,1453],{"class":106},[79,13690,13691],{"class":89},"\"PathDist\"",[79,13693,1453],{"class":106},[79,13695,13696],{"class":89},"\"GoalDist\"",[79,13698,4868],{"class":106},[79,13700,13701,13704,13706],{"class":81,"line":2157},[79,13702,13703],{"class":1646},"      BaseObstacle.scale",[79,13705,1664],{"class":106},[79,13707,13708],{"class":1215},"0.02\n",[79,13710,13711,13714,13716],{"class":81,"line":2171},[79,13712,13713],{"class":1646},"      PathAlign.scale",[79,13715,1664],{"class":106},[79,13717,13718],{"class":1215},"32.0\n",[79,13720,13721,13724,13726],{"class":81,"line":2184},[79,13722,13723],{"class":1646},"      PathAlign.forward_point_distance",[79,13725,1664],{"class":106},[79,13727,1946],{"class":1215},[79,13729,13730,13733,13735],{"class":81,"line":2189},[79,13731,13732],{"class":1646},"      GoalAlign.scale",[79,13734,1664],{"class":106},[79,13736,13737],{"class":1215},"24.0\n",[79,13739,13740,13743,13745],{"class":81,"line":2203},[79,13741,13742],{"class":1646},"      GoalAlign.forward_point_distance",[79,13744,1664],{"class":106},[79,13746,1946],{"class":1215},[79,13748,13749,13752,13754],{"class":81,"line":2217},[79,13750,13751],{"class":1646},"      PathDist.scale",[79,13753,1664],{"class":106},[79,13755,13718],{"class":1215},[79,13757,13758,13761,13763],{"class":81,"line":2231},[79,13759,13760],{"class":1646},"      GoalDist.scale",[79,13762,1664],{"class":106},[79,13764,13737],{"class":1215},[79,13766,13767,13770,13772],{"class":81,"line":2242},[79,13768,13769],{"class":1646},"      RotateToGoal.scale",[79,13771,1664],{"class":106},[79,13773,13718],{"class":1215},[79,13775,13776,13779,13781],{"class":81,"line":2252},[79,13777,13778],{"class":1646},"      RotateToGoal.slowing_factor",[79,13780,1664],{"class":106},[79,13782,13783],{"class":1215},"5.0\n",[79,13785,13786,13789,13791],{"class":81,"line":6472},[79,13787,13788],{"class":1646},"      RotateToGoal.lookahead_time",[79,13790,1664],{"class":106},[79,13792,6682],{"class":1215},[79,13794,13795,13798],{"class":81,"line":6478},[79,13796,13797],{"class":1646},"  local_costmap",[79,13799,1649],{"class":106},[79,13801,13802,13804],{"class":81,"line":6484},[79,13803,12719],{"class":1646},[79,13805,1649],{"class":106},[79,13807,13808,13810,13812],{"class":81,"line":9995},[79,13809,12726],{"class":1646},[79,13811,1664],{"class":106},[79,13813,13783],{"class":1215},[79,13815,13816,13818,13820],{"class":81,"line":10007},[79,13817,12736],{"class":1646},[79,13819,1664],{"class":106},[79,13821,1840],{"class":1215},[79,13823,13824,13826,13828],{"class":81,"line":10018},[79,13825,12745],{"class":1646},[79,13827,1664],{"class":106},[79,13829,1731],{"class":89},[79,13831,13832,13834,13836],{"class":81,"line":10029},[79,13833,12754],{"class":1646},[79,13835,1664],{"class":106},[79,13837,1751],{"class":89},[79,13839,13840,13842,13844],{"class":81,"line":10038},[79,13841,12763],{"class":1646},[79,13843,1664],{"class":106},[79,13845,9791],{"class":1215},[79,13847,13848,13851,13853],{"class":81,"line":10044},[79,13849,13850],{"class":1646},"      rolling_window",[79,13852,1664],{"class":106},[79,13854,9791],{"class":1215},[79,13856,13857,13860,13862],{"class":81,"line":10053},[79,13858,13859],{"class":1646},"      width",[79,13861,1664],{"class":106},[79,13863,13864],{"class":1215},"2\n",[79,13866,13867,13870,13872],{"class":81,"line":10058},[79,13868,13869],{"class":1646},"      height",[79,13871,1664],{"class":106},[79,13873,13864],{"class":1215},[79,13875,13876,13878,13880],{"class":81,"line":10068},[79,13877,12782],{"class":1646},[79,13879,1664],{"class":106},[79,13881,1850],{"class":1215},[79,13883,13884,13886,13888],{"class":81,"line":10084},[79,13885,12772],{"class":1646},[79,13887,1664],{"class":106},[79,13889,12777],{"class":89},[79,13891,13892,13894,13896,13898,13900,13902,13904,13906],{"class":81,"line":10089},[79,13893,12800],{"class":1646},[79,13895,4852],{"class":106},[79,13897,12810],{"class":89},[79,13899,1453],{"class":106},[79,13901,12815],{"class":89},[79,13903,1453],{"class":106},[79,13905,12820],{"class":89},[79,13907,4868],{"class":106},[79,13909,13910,13912],{"class":81,"line":10094},[79,13911,13142],{"class":1646},[79,13913,1649],{"class":106},[79,13915,13916,13918,13920],{"class":81,"line":10099},[79,13917,12834],{"class":1646},[79,13919,1664],{"class":106},[79,13921,13153],{"class":89},[79,13923,13924,13926,13928],{"class":81,"line":10109},[79,13925,13168],{"class":1646},[79,13927,1664],{"class":106},[79,13929,1872],{"class":1215},[79,13931,13932,13934,13936],{"class":81,"line":10121},[79,13933,13158],{"class":1646},[79,13935,1664],{"class":106},[79,13937,13163],{"class":1215},[79,13939,13940,13942],{"class":81,"line":10133},[79,13941,12827],{"class":1646},[79,13943,1649],{"class":106},[79,13945,13946,13948,13950],{"class":81,"line":10144},[79,13947,12834],{"class":1646},[79,13949,1664],{"class":106},[79,13951,12839],{"class":89},[79,13953,13954,13956,13958],{"class":81,"line":10155},[79,13955,12844],{"class":1646},[79,13957,1664],{"class":106},[79,13959,9791],{"class":1215},[79,13961,13962,13964,13966],{"class":81,"line":10164},[79,13963,12853],{"class":1646},[79,13965,1664],{"class":106},[79,13967,6888],{"class":89},[79,13969,13970,13972],{"class":81,"line":10170},[79,13971,12862],{"class":1646},[79,13973,1649],{"class":106},[79,13975,13976,13978,13980],{"class":81,"line":10179},[79,13977,12869],{"class":1646},[79,13979,1664],{"class":106},[79,13981,1761],{"class":89},[79,13983,13984,13986,13988],{"class":81,"line":10184},[79,13985,12878],{"class":1646},[79,13987,1664],{"class":106},[79,13989,1840],{"class":1215},[79,13991,13992,13994,13996],{"class":81,"line":10189},[79,13993,12887],{"class":1646},[79,13995,1664],{"class":106},[79,13997,9791],{"class":1215},[79,13999,14000,14002,14004],{"class":81,"line":10194},[79,14001,12896],{"class":1646},[79,14003,1664],{"class":106},[79,14005,9791],{"class":1215},[79,14007,14008,14010,14012],{"class":81,"line":10204},[79,14009,12905],{"class":1646},[79,14011,1664],{"class":106},[79,14013,12910],{"class":89},[79,14015,14016,14018],{"class":81,"line":10216},[79,14017,12952],{"class":1646},[79,14019,1649],{"class":106},[79,14021,14022,14024,14026],{"class":81,"line":10228},[79,14023,12834],{"class":1646},[79,14025,1664],{"class":106},[79,14027,12963],{"class":89},[79,14029,14030,14032,14034],{"class":81,"line":10239},[79,14031,12844],{"class":1646},[79,14033,1664],{"class":106},[79,14035,9791],{"class":1215},[79,14037,14038,14040,14042],{"class":81,"line":10250},[79,14039,12976],{"class":1646},[79,14041,1664],{"class":106},[79,14043,9791],{"class":1215},[79,14045,14046,14048,14050],{"class":81,"line":10259},[79,14047,12985],{"class":1646},[79,14049,1664],{"class":106},[79,14051,6761],{"class":1215},[79,14053,14054,14056,14058],{"class":81,"line":10265},[79,14055,12994],{"class":1646},[79,14057,1664],{"class":106},[79,14059,1850],{"class":1215},[79,14061,14062,14064,14066],{"class":81,"line":10274},[79,14063,13003],{"class":1646},[79,14065,1664],{"class":106},[79,14067,13008],{"class":1215},[79,14069,14070,14072,14074],{"class":81,"line":10279},[79,14071,13013],{"class":1646},[79,14073,1664],{"class":106},[79,14075,1840],{"class":1215},[79,14077,14078,14080,14082],{"class":81,"line":10284},[79,14079,13022],{"class":1646},[79,14081,1664],{"class":106},[79,14083,4878],{"class":1215},[79,14085,14086,14088,14090],{"class":81,"line":10289},[79,14087,12853],{"class":1646},[79,14089,1664],{"class":106},[79,14091,6888],{"class":89},[79,14093,14094,14096],{"class":81,"line":10299},[79,14095,12862],{"class":1646},[79,14097,1649],{"class":106},[79,14099,14100,14102,14104],{"class":81,"line":10311},[79,14101,12869],{"class":1646},[79,14103,1664],{"class":106},[79,14105,1761],{"class":89},[79,14107,14108,14110,14112],{"class":81,"line":10323},[79,14109,12878],{"class":1646},[79,14111,1664],{"class":106},[79,14113,1840],{"class":1215},[79,14115,14116,14118,14120],{"class":81,"line":10334},[79,14117,12887],{"class":1646},[79,14119,1664],{"class":106},[79,14121,9791],{"class":1215},[79,14123,14124,14126,14128],{"class":81,"line":10345},[79,14125,12896],{"class":1646},[79,14127,1664],{"class":106},[79,14129,9791],{"class":1215},[79,14131,14132,14134,14136],{"class":81,"line":10358},[79,14133,12905],{"class":1646},[79,14135,1664],{"class":106},[79,14137,12910],{"class":89},[79,14139,14140,14142,14144],{"class":81,"line":10367},[79,14141,12915],{"class":1646},[79,14143,1664],{"class":106},[79,14145,2009],{"class":1215},[79,14147,14148,14150,14152],{"class":81,"line":10373},[79,14149,12924],{"class":1646},[79,14151,1664],{"class":106},[79,14153,6761],{"class":1215},[79,14155,14156,14158,14160],{"class":81,"line":10382},[79,14157,12933],{"class":1646},[79,14159,1664],{"class":106},[79,14161,12938],{"class":1215},[79,14163,14164,14166,14168],{"class":81,"line":10387},[79,14165,12943],{"class":1646},[79,14167,1664],{"class":106},[79,14169,6761],{"class":1215},[79,14171,14172,14174],{"class":81,"line":10396},[79,14173,13117],{"class":1646},[79,14175,1649],{"class":106},[79,14177,14178,14180,14182],{"class":81,"line":10409},[79,14179,13133],{"class":1646},[79,14181,1664],{"class":106},[79,14183,9791],{"class":1215},[79,14185,14186,14188,14190],{"class":81,"line":10423},[79,14187,13178],{"class":1646},[79,14189,1664],{"class":106},[79,14191,9791],{"class":1215},[20,14193,14194],{},"Footprint",[48,14196,14197,14200],{},[51,14198,14199],{},"将毫米转换为米：长0.96m，宽0.45m",[51,14201,14202,14203,14205],{},"以机器人中心（",[76,14204,5716],{},"坐标系原点）为基准，计算矩形顶点坐标：",[20,14207,14208,14211],{},[4270,14209,14210],{},"说明","：顶点按顺时针或逆时针顺序排列，覆盖机器人长宽边界。（右手坐标系）",[20,14213,14214],{},"例如长960宽450长400",[70,14216,14220],{"className":14217,"code":14218,"language":14219,"meta":34,"style":34},"language-cpp shiki shiki-themes github-light github-dark","footprint: [[0.48, 0.225], [0.48, -0.225], [-0.48, -0.225], [-0.48, 0.225]]\n","cpp",[76,14221,14222],{"__ignoreMap":34},[79,14223,14224,14227],{"class":81,"line":82},[79,14225,14226],{"class":106},"footprint: ",[79,14228,14229],{"class":1215},"[[0.48, 0.225], [0.48, -0.225], [-0.48, -0.225], [-0.48, 0.225]]\n",[20,14231,14232],{},[23,14233,14234],{},"（4）behavior_server相关配置文件",[20,14236,12436,14237,5190],{},[76,14238,14239],{},"behavior.yaml",[70,14241,14243],{"className":1637,"code":14242,"language":1639,"meta":34,"style":34},"\u002F**:\n  ros__parameters:\n    local_costmap_topic: local_costmap\u002Fcostmap_raw\n    global_costmap_topic: global_costmap\u002Fcostmap_raw\n    local_footprint_topic: local_costmap\u002Fpublished_footprint\n    global_footprint_topic: global_costmap\u002Fpublished_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",[76,14244,14245,14251,14257,14267,14277,14287,14297,14306,14338,14345,14354,14361,14370,14377,14386,14393,14402,14409,14418,14427,14435,14443,14451,14459,14468,14477,14487],{"__ignoreMap":34},[79,14246,14247,14249],{"class":81,"line":82},[79,14248,6522],{"class":1646},[79,14250,1649],{"class":106},[79,14252,14253,14255],{"class":81,"line":116},[79,14254,1654],{"class":1646},[79,14256,1649],{"class":106},[79,14258,14259,14262,14264],{"class":81,"line":138},[79,14260,14261],{"class":1646},"    local_costmap_topic",[79,14263,1664],{"class":106},[79,14265,14266],{"class":89},"local_costmap\u002Fcostmap_raw\n",[79,14268,14269,14272,14274],{"class":81,"line":145},[79,14270,14271],{"class":1646},"    global_costmap_topic",[79,14273,1664],{"class":106},[79,14275,14276],{"class":89},"global_costmap\u002Fcostmap_raw\n",[79,14278,14279,14282,14284],{"class":81,"line":152},[79,14280,14281],{"class":1646},"    local_footprint_topic",[79,14283,1664],{"class":106},[79,14285,14286],{"class":89},"local_costmap\u002Fpublished_footprint\n",[79,14288,14289,14292,14294],{"class":81,"line":164},[79,14290,14291],{"class":1646},"    global_footprint_topic",[79,14293,1664],{"class":106},[79,14295,14296],{"class":89},"global_costmap\u002Fpublished_footprint\n",[79,14298,14299,14302,14304],{"class":81,"line":176},[79,14300,14301],{"class":1646},"    cycle_frequency",[79,14303,1664],{"class":106},[79,14305,13783],{"class":1215},[79,14307,14308,14311,14313,14316,14318,14321,14323,14326,14328,14331,14333,14336],{"class":81,"line":181},[79,14309,14310],{"class":1646},"    behavior_plugins",[79,14312,4852],{"class":106},[79,14314,14315],{"class":89},"\"spin\"",[79,14317,1453],{"class":106},[79,14319,14320],{"class":89},"\"backup\"",[79,14322,1453],{"class":106},[79,14324,14325],{"class":89},"\"drive_on_heading\"",[79,14327,1453],{"class":106},[79,14329,14330],{"class":89},"\"assisted_teleop\"",[79,14332,1453],{"class":106},[79,14334,14335],{"class":89},"\"wait\"",[79,14337,4868],{"class":106},[79,14339,14340,14343],{"class":81,"line":186},[79,14341,14342],{"class":1646},"    spin",[79,14344,1649],{"class":106},[79,14346,14347,14349,14351],{"class":81,"line":197},[79,14348,12565],{"class":1646},[79,14350,1664],{"class":106},[79,14352,14353],{"class":89},"\"nav2_behaviors::Spin\"\n",[79,14355,14356,14359],{"class":81,"line":1346},[79,14357,14358],{"class":1646},"    backup",[79,14360,1649],{"class":106},[79,14362,14363,14365,14367],{"class":81,"line":1361},[79,14364,12565],{"class":1646},[79,14366,1664],{"class":106},[79,14368,14369],{"class":89},"\"nav2_behaviors::BackUp\"\n",[79,14371,14372,14375],{"class":81,"line":1366},[79,14373,14374],{"class":1646},"    drive_on_heading",[79,14376,1649],{"class":106},[79,14378,14379,14381,14383],{"class":81,"line":1377},[79,14380,12565],{"class":1646},[79,14382,1664],{"class":106},[79,14384,14385],{"class":89},"\"nav2_behaviors::DriveOnHeading\"\n",[79,14387,14388,14391],{"class":81,"line":1386},[79,14389,14390],{"class":1646},"    wait",[79,14392,1649],{"class":106},[79,14394,14395,14397,14399],{"class":81,"line":1400},[79,14396,12565],{"class":1646},[79,14398,1664],{"class":106},[79,14400,14401],{"class":89},"\"nav2_behaviors::Wait\"\n",[79,14403,14404,14407],{"class":81,"line":1413},[79,14405,14406],{"class":1646},"    assisted_teleop",[79,14408,1649],{"class":106},[79,14410,14411,14413,14415],{"class":81,"line":1423},[79,14412,12565],{"class":1646},[79,14414,1664],{"class":106},[79,14416,14417],{"class":89},"\"nav2_behaviors::AssistedTeleop\"\n",[79,14419,14420,14423,14425],{"class":81,"line":1431},[79,14421,14422],{"class":1646},"    local_frame",[79,14424,1664],{"class":106},[79,14426,1731],{"class":89},[79,14428,14429,14431,14433],{"class":81,"line":1447},[79,14430,12473],{"class":1646},[79,14432,1664],{"class":106},[79,14434,1741],{"class":89},[79,14436,14437,14439,14441],{"class":81,"line":1461},[79,14438,12482],{"class":1646},[79,14440,1664],{"class":106},[79,14442,1751],{"class":89},[79,14444,14445,14447,14449],{"class":81,"line":1473},[79,14446,6821],{"class":1646},[79,14448,1664],{"class":106},[79,14450,1946],{"class":1215},[79,14452,14453,14455,14457],{"class":81,"line":1478},[79,14454,6535],{"class":1646},[79,14456,1664],{"class":106},[79,14458,9791],{"class":1215},[79,14460,14461,14464,14466],{"class":81,"line":1489},[79,14462,14463],{"class":1646},"    simulate_ahead_time",[79,14465,1664],{"class":106},[79,14467,1840],{"class":1215},[79,14469,14470,14473,14475],{"class":81,"line":1500},[79,14471,14472],{"class":1646},"    max_rotational_vel",[79,14474,1664],{"class":106},[79,14476,12731],{"class":1215},[79,14478,14479,14482,14484],{"class":81,"line":1506},[79,14480,14481],{"class":1646},"    min_rotational_vel",[79,14483,1664],{"class":106},[79,14485,14486],{"class":1215},"0.4\n",[79,14488,14489,14492,14494],{"class":81,"line":1517},[79,14490,14491],{"class":1646},"    rotational_acc_lim",[79,14493,1664],{"class":106},[79,14495,13526],{"class":1215},[20,14497,14498],{},[23,14499,14500],{},"（5）waypoint_follower相关配置文件",[20,14502,12436,14503,5190],{},[76,14504,14505],{},"waypoint.yaml",[70,14507,14509],{"className":1637,"code":14508,"language":1639,"meta":34,"style":34},"\u002F**:\n  ros__parameters:\n    use_sim_time: True\n    loop_rate: 20\n    stop_on_failure: false\n    waypoint_task_executor_plugin: \"wait_at_waypoint\"\n    wait_at_waypoint:\n      plugin: \"nav2_waypoint_follower::WaitAtWaypoint\"\n      enabled: True\n      waypoint_pause_duration: 5000\n",[76,14510,14511,14517,14523,14531,14540,14549,14559,14566,14575,14584],{"__ignoreMap":34},[79,14512,14513,14515],{"class":81,"line":82},[79,14514,6522],{"class":1646},[79,14516,1649],{"class":106},[79,14518,14519,14521],{"class":81,"line":116},[79,14520,1654],{"class":1646},[79,14522,1649],{"class":106},[79,14524,14525,14527,14529],{"class":81,"line":138},[79,14526,6535],{"class":1646},[79,14528,1664],{"class":106},[79,14530,9791],{"class":1215},[79,14532,14533,14536,14538],{"class":81,"line":145},[79,14534,14535],{"class":1646},"    loop_rate",[79,14537,1664],{"class":106},[79,14539,12516],{"class":1215},[79,14541,14542,14545,14547],{"class":81,"line":152},[79,14543,14544],{"class":1646},"    stop_on_failure",[79,14546,1664],{"class":106},[79,14548,1807],{"class":1215},[79,14550,14551,14554,14556],{"class":81,"line":164},[79,14552,14553],{"class":1646},"    waypoint_task_executor_plugin",[79,14555,1664],{"class":106},[79,14557,14558],{"class":89},"\"wait_at_waypoint\"\n",[79,14560,14561,14564],{"class":81,"line":176},[79,14562,14563],{"class":1646},"    wait_at_waypoint",[79,14565,1649],{"class":106},[79,14567,14568,14570,14572],{"class":81,"line":181},[79,14569,12565],{"class":1646},[79,14571,1664],{"class":106},[79,14573,14574],{"class":89},"\"nav2_waypoint_follower::WaitAtWaypoint\"\n",[79,14576,14577,14580,14582],{"class":81,"line":186},[79,14578,14579],{"class":1646},"      enabled",[79,14581,1664],{"class":106},[79,14583,9791],{"class":1215},[79,14585,14586,14589,14591],{"class":81,"line":197},[79,14587,14588],{"class":1646},"      waypoint_pause_duration",[79,14590,1664],{"class":106},[79,14592,14593],{"class":1215},"5000\n",[20,14595,14596],{},[23,14597,14598],{},"（6）velocity_smoother相关配置文件",[20,14600,12436,14601,5190],{},[76,14602,14603],{},"velocity.yaml",[70,14605,14607],{"className":1637,"code":14606,"language":1639,"meta":34,"style":34},"\u002F**:\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",[76,14608,14609,14615,14621,14629,14638,14647,14657,14678,14699,14720,14741,14749,14758,14777],{"__ignoreMap":34},[79,14610,14611,14613],{"class":81,"line":82},[79,14612,6522],{"class":1646},[79,14614,1649],{"class":106},[79,14616,14617,14619],{"class":81,"line":116},[79,14618,1654],{"class":1646},[79,14620,1649],{"class":106},[79,14622,14623,14625,14627],{"class":81,"line":138},[79,14624,6535],{"class":1646},[79,14626,1664],{"class":106},[79,14628,9791],{"class":1215},[79,14630,14631,14634,14636],{"class":81,"line":145},[79,14632,14633],{"class":1646},"    smoothing_frequency",[79,14635,1664],{"class":106},[79,14637,12645],{"class":1215},[79,14639,14640,14643,14645],{"class":81,"line":152},[79,14641,14642],{"class":1646},"    scale_velocities",[79,14644,1664],{"class":106},[79,14646,13183],{"class":1215},[79,14648,14649,14652,14654],{"class":81,"line":164},[79,14650,14651],{"class":1646},"    feedback",[79,14653,1664],{"class":106},[79,14655,14656],{"class":89},"\"OPEN_LOOP\"\n",[79,14658,14659,14662,14664,14667,14669,14672,14674,14676],{"class":81,"line":176},[79,14660,14661],{"class":1646},"    max_velocity",[79,14663,4852],{"class":106},[79,14665,14666],{"class":1215},"0.6",[79,14668,1453],{"class":106},[79,14670,14671],{"class":1215},"0.0",[79,14673,1453],{"class":106},[79,14675,2179],{"class":1215},[79,14677,4868],{"class":106},[79,14679,14680,14683,14685,14688,14690,14692,14694,14697],{"class":81,"line":181},[79,14681,14682],{"class":1646},"    min_velocity",[79,14684,4852],{"class":106},[79,14686,14687],{"class":1215},"-0.6",[79,14689,1453],{"class":106},[79,14691,14671],{"class":1215},[79,14693,1453],{"class":106},[79,14695,14696],{"class":1215},"-1.0",[79,14698,4868],{"class":106},[79,14700,14701,14704,14706,14709,14711,14713,14715,14718],{"class":81,"line":186},[79,14702,14703],{"class":1646},"    max_accel",[79,14705,4852],{"class":106},[79,14707,14708],{"class":1215},"2.5",[79,14710,1453],{"class":106},[79,14712,14671],{"class":1215},[79,14714,1453],{"class":106},[79,14716,14717],{"class":1215},"3.2",[79,14719,4868],{"class":106},[79,14721,14722,14725,14727,14730,14732,14734,14736,14739],{"class":81,"line":197},[79,14723,14724],{"class":1646},"    max_decel",[79,14726,4852],{"class":106},[79,14728,14729],{"class":1215},"-2.5",[79,14731,1453],{"class":106},[79,14733,14671],{"class":1215},[79,14735,1453],{"class":106},[79,14737,14738],{"class":1215},"-3.2",[79,14740,4868],{"class":106},[79,14742,14743,14745,14747],{"class":81,"line":1346},[79,14744,12491],{"class":1646},[79,14746,1664],{"class":106},[79,14748,6732],{"class":89},[79,14750,14751,14754,14756],{"class":81,"line":1361},[79,14752,14753],{"class":1646},"    odom_duration",[79,14755,1664],{"class":106},[79,14757,1946],{"class":1215},[79,14759,14760,14763,14765,14767,14769,14771,14773,14775],{"class":81,"line":1366},[79,14761,14762],{"class":1646},"    deadband_velocity",[79,14764,4852],{"class":106},[79,14766,14671],{"class":1215},[79,14768,1453],{"class":106},[79,14770,14671],{"class":1215},[79,14772,1453],{"class":106},[79,14774,14671],{"class":1215},[79,14776,4868],{"class":106},[79,14778,14779,14782,14784],{"class":81,"line":1377},[79,14780,14781],{"class":1646},"    velocity_timeout",[79,14783,1664],{"class":106},[79,14785,12731],{"class":1215},[20,14787,14788],{},[23,14789,14790],{},"（7）smoother_server相关配置文件",[20,14792,12436,14793,5190],{},[76,14794,14795],{},"smootherr.yaml",[70,14797,14799],{"className":1637,"code":14798,"language":1639,"meta":34,"style":34},"\u002F**:\n  ros__parameters:\n    costmap_topic: global_costmap\u002Fcostmap_raw\n    footprint_topic: global_costmap\u002Fpublished_footprint\n    robot_base_frame: base_link\n    transform_timeout: 0.1\n    smoother_plugins: [\"simple_smoother\"]\n    simple_smoother:\n      plugin: \"nav2_smoother::SimpleSmoother\"\n      tolerance: 1.0e-10\n      do_refinement: True\n",[76,14800,14801,14807,14813,14822,14831,14839,14847,14859,14866,14875,14884],{"__ignoreMap":34},[79,14802,14803,14805],{"class":81,"line":82},[79,14804,6522],{"class":1646},[79,14806,1649],{"class":106},[79,14808,14809,14811],{"class":81,"line":116},[79,14810,1654],{"class":1646},[79,14812,1649],{"class":106},[79,14814,14815,14818,14820],{"class":81,"line":138},[79,14816,14817],{"class":1646},"    costmap_topic",[79,14819,1664],{"class":106},[79,14821,14276],{"class":89},[79,14823,14824,14827,14829],{"class":81,"line":145},[79,14825,14826],{"class":1646},"    footprint_topic",[79,14828,1664],{"class":106},[79,14830,14296],{"class":89},[79,14832,14833,14835,14837],{"class":81,"line":152},[79,14834,12482],{"class":1646},[79,14836,1664],{"class":106},[79,14838,1751],{"class":89},[79,14840,14841,14843,14845],{"class":81,"line":164},[79,14842,1877],{"class":1646},[79,14844,1664],{"class":106},[79,14846,1946],{"class":1215},[79,14848,14849,14852,14854,14857],{"class":81,"line":176},[79,14850,14851],{"class":1646},"    smoother_plugins",[79,14853,4852],{"class":106},[79,14855,14856],{"class":89},"\"simple_smoother\"",[79,14858,4868],{"class":106},[79,14860,14861,14864],{"class":81,"line":181},[79,14862,14863],{"class":1646},"    simple_smoother",[79,14865,1649],{"class":106},[79,14867,14868,14870,14872],{"class":81,"line":186},[79,14869,12565],{"class":1646},[79,14871,1664],{"class":106},[79,14873,14874],{"class":89},"\"nav2_smoother::SimpleSmoother\"\n",[79,14876,14877,14879,14881],{"class":81,"line":197},[79,14878,12685],{"class":1646},[79,14880,1664],{"class":106},[79,14882,14883],{"class":1215},"1.0e-10\n",[79,14885,14886,14889,14891],{"class":81,"line":1346},[79,14887,14888],{"class":1646},"      do_refinement",[79,14890,1664],{"class":106},[79,14892,9791],{"class":1215},[20,14894,14895],{},[23,14896,14897],{},"3.launch集成",[20,14899,14900,14901,14904],{},"导航实现时，需要依赖于地图与定位功能，我们可以在一个launch文件中集成之前的定位launch以及当前编写的导航核心模块的launch，以简化导航功能的启动，在launch目录下新建一个名为",[76,14902,14903],{},"bringup.launch.py","的launch文件，并输入如下内容：",[70,14906,14908],{"className":1234,"code":14907,"language":1236,"meta":34,"style":34},"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",[76,14909,14910,14916,14920,14930,14934,14944,14955,14965,14975,14979,14983,14991,14995,15003,15009,15017,15021,15025,15039,15052,15056,15065,15069,15073,15078,15084,15089,15093,15097,15105,15115,15119,15123,15127,15136,15140,15144,15149,15155,15160,15164,15168,15176,15186,15190,15194,15198,15204,15208,15213,15218],{"__ignoreMap":34},[79,14911,14912,14914],{"class":81,"line":82},[79,14913,1243],{"class":99},[79,14915,1246],{"class":106},[79,14917,14918],{"class":81,"line":116},[79,14919,142],{"emptyLinePlaceholder":141},[79,14921,14922,14924,14926,14928],{"class":81,"line":138},[79,14923,1255],{"class":99},[79,14925,1306],{"class":106},[79,14927,1243],{"class":99},[79,14929,1311],{"class":106},[79,14931,14932],{"class":81,"line":145},[79,14933,142],{"emptyLinePlaceholder":141},[79,14935,14936,14938,14940,14942],{"class":81,"line":152},[79,14937,1255],{"class":99},[79,14939,1258],{"class":106},[79,14941,1243],{"class":99},[79,14943,1263],{"class":106},[79,14945,14946,14948,14950,14952],{"class":81,"line":164},[79,14947,1255],{"class":99},[79,14949,1270],{"class":106},[79,14951,1243],{"class":99},[79,14953,14954],{"class":106}," IncludeLaunchDescription, DeclareLaunchArgument\n",[79,14956,14957,14959,14961,14963],{"class":81,"line":176},[79,14958,1255],{"class":99},[79,14960,1282],{"class":106},[79,14962,1243],{"class":99},[79,14964,1287],{"class":106},[79,14966,14967,14969,14971,14973],{"class":81,"line":181},[79,14968,1255],{"class":99},[79,14970,6058],{"class":106},[79,14972,1243],{"class":99},[79,14974,6063],{"class":106},[79,14976,14977],{"class":81,"line":186},[79,14978,142],{"emptyLinePlaceholder":141},[79,14980,14981],{"class":81,"line":197},[79,14982,142],{"emptyLinePlaceholder":141},[79,14984,14985,14987,14989],{"class":81,"line":1346},[79,14986,1320],{"class":99},[79,14988,1323],{"class":85},[79,14990,1326],{"class":106},[79,14992,14993],{"class":81,"line":1361},[79,14994,142],{"emptyLinePlaceholder":141},[79,14996,14997,14999,15001],{"class":81,"line":1366},[79,14998,3093],{"class":106},[79,15000,1334],{"class":99},[79,15002,1374],{"class":106},[79,15004,15005,15007],{"class":81,"line":1377},[79,15006,1380],{"class":89},[79,15008,1383],{"class":106},[79,15010,15011,15013,15015],{"class":81,"line":1386},[79,15012,1390],{"class":1389},[79,15014,1334],{"class":99},[79,15016,6120],{"class":89},[79,15018,15019],{"class":81,"line":1400},[79,15020,3246],{"class":106},[79,15022,15023],{"class":81,"line":1413},[79,15024,142],{"emptyLinePlaceholder":141},[79,15026,15027,15030,15032,15034,15037],{"class":81,"line":1423},[79,15028,15029],{"class":106},"    amcl_pkg ",[79,15031,1334],{"class":99},[79,15033,9573],{"class":106},[79,15035,15036],{"class":89},"\"mycar_localization\"",[79,15038,1343],{"class":106},[79,15040,15041,15044,15046,15048,15050],{"class":81,"line":1431},[79,15042,15043],{"class":106},"    nav2_pkg ",[79,15045,1334],{"class":99},[79,15047,9573],{"class":106},[79,15049,9576],{"class":89},[79,15051,1343],{"class":106},[79,15053,15054],{"class":81,"line":1447},[79,15055,142],{"emptyLinePlaceholder":141},[79,15057,15058,15061,15063],{"class":81,"line":1461},[79,15059,15060],{"class":106},"    amcl_launch ",[79,15062,1334],{"class":99},[79,15064,6378],{"class":106},[79,15066,15067],{"class":81,"line":1473},[79,15068,6383],{"class":106},[79,15070,15071],{"class":81,"line":1478},[79,15072,6388],{"class":106},[79,15074,15075],{"class":81,"line":1489},[79,15076,15077],{"class":106},"                amcl_pkg,\n",[79,15079,15080,15082],{"class":81,"line":1500},[79,15081,6403],{"class":89},[79,15083,1383],{"class":106},[79,15085,15086],{"class":81,"line":1506},[79,15087,15088],{"class":89},"                'mycar_loca.launch.py'\n",[79,15090,15091],{"class":81,"line":1517},[79,15092,6415],{"class":106},[79,15094,15095],{"class":81,"line":1523},[79,15096,6420],{"class":106},[79,15098,15099,15101,15103],{"class":81,"line":1536},[79,15100,6425],{"class":1389},[79,15102,1334],{"class":99},[79,15104,6430],{"class":106},[79,15106,15107,15109,15111,15113],{"class":81,"line":1549},[79,15108,6435],{"class":89},[79,15110,3185],{"class":106},[79,15112,1340],{"class":89},[79,15114,1343],{"class":106},[79,15116,15117],{"class":81,"line":1561},[79,15118,6446],{"class":106},[79,15120,15121],{"class":81,"line":1574},[79,15122,3246],{"class":106},[79,15124,15125],{"class":81,"line":1579},[79,15126,142],{"emptyLinePlaceholder":141},[79,15128,15129,15132,15134],{"class":81,"line":1590},[79,15130,15131],{"class":106},"    nav2_launch ",[79,15133,1334],{"class":99},[79,15135,6378],{"class":106},[79,15137,15138],{"class":81,"line":1595},[79,15139,6383],{"class":106},[79,15141,15142],{"class":81,"line":1601},[79,15143,6388],{"class":106},[79,15145,15146],{"class":81,"line":1607},[79,15147,15148],{"class":106},"                nav2_pkg,\n",[79,15150,15151,15153],{"class":81,"line":1613},[79,15152,6403],{"class":89},[79,15154,1383],{"class":106},[79,15156,15157],{"class":81,"line":1618},[79,15158,15159],{"class":89},"                'nav2.launch.py'\n",[79,15161,15162],{"class":81,"line":2001},[79,15163,6415],{"class":106},[79,15165,15166],{"class":81,"line":2012},[79,15167,6420],{"class":106},[79,15169,15170,15172,15174],{"class":81,"line":2025},[79,15171,6425],{"class":1389},[79,15173,1334],{"class":99},[79,15175,6430],{"class":106},[79,15177,15178,15180,15182,15184],{"class":81,"line":2039},[79,15179,6435],{"class":89},[79,15181,3185],{"class":106},[79,15183,1340],{"class":89},[79,15185,1343],{"class":106},[79,15187,15188],{"class":81,"line":2052},[79,15189,6446],{"class":106},[79,15191,15192],{"class":81,"line":2066},[79,15193,3246],{"class":106},[79,15195,15196],{"class":81,"line":2077},[79,15197,142],{"emptyLinePlaceholder":141},[79,15199,15200,15202],{"class":81,"line":2082},[79,15201,1621],{"class":99},[79,15203,3329],{"class":106},[79,15205,15206],{"class":81,"line":2092},[79,15207,3334],{"class":106},[79,15209,15210],{"class":81,"line":2103},[79,15211,15212],{"class":106},"        amcl_launch,\n",[79,15214,15215],{"class":81,"line":2115},[79,15216,15217],{"class":106},"        nav2_launch\n",[79,15219,15220],{"class":81,"line":2120},[79,15221,3354],{"class":106},[20,15223,15224],{},[23,15225,15226],{},"4.编辑配置文件",[20,15228,2270,15229,2274],{},[76,15230,2273],{},[70,15232,15234],{"className":2277,"code":15233,"language":2279,"meta":34,"style":34},"install(DIRECTORY launch params bts\n  DESTINATION share\u002F${PROJECT_NAME}\n)\n",[76,15235,15236,15243,15249],{"__ignoreMap":34},[79,15237,15238,15240],{"class":81,"line":82},[79,15239,2286],{"class":99},[79,15241,15242],{"class":106},"(DIRECTORY launch params bts\n",[79,15244,15245,15247],{"class":81,"line":116},[79,15246,2294],{"class":106},[79,15248,2297],{"class":99},[79,15250,15251],{"class":81,"line":138},[79,15252,1343],{"class":106},[20,15254,15255],{},[23,15256,15257],{},"5.编译",[20,15259,2309],{},[70,15261,15263],{"className":72,"code":15262,"language":74,"meta":34,"style":34},"colcon build --packages-select mycar_navigation2_jazzy\n",[76,15264,15265],{"__ignoreMap":34},[79,15266,15267,15269,15271,15273],{"class":81,"line":82},[79,15268,2319],{"class":85},[79,15270,2322],{"class":89},[79,15272,2325],{"class":1215},[79,15274,15275],{"class":89}," mycar_navigation2_jazzy\n",[20,15277,15278],{},[23,15279,15280],{},"6.执行",[20,15282,3997],{},[70,15284,15285],{"className":72,"code":2341,"language":74,"meta":34,"style":34},[76,15286,15287,15293],{"__ignoreMap":34},[79,15288,15289,15291],{"class":81,"line":82},[79,15290,2348],{"class":1215},[79,15292,2351],{"class":89},[79,15294,15295,15297,15299,15301],{"class":81,"line":116},[79,15296,1203],{"class":85},[79,15298,2358],{"class":89},[79,15300,2361],{"class":89},[79,15302,2364],{"class":89},[20,15304,15305],{},"（2）然后在终端下进入当前工作空间，输入如下指令启动导航功能：",[70,15307,15309],{"className":72,"code":15308,"language":74,"meta":34,"style":34},". install\u002Fsetup.bash\nros2 launch mycar_navigation2_jazzy bringup.launch.py use_sim_time:=True\n",[76,15310,15311,15317],{"__ignoreMap":34},[79,15312,15313,15315],{"class":81,"line":82},[79,15314,2348],{"class":1215},[79,15316,2351],{"class":89},[79,15318,15319,15321,15323,15325,15328],{"class":81,"line":116},[79,15320,1203],{"class":85},[79,15322,2358],{"class":89},[79,15324,9379],{"class":89},[79,15326,15327],{"class":89}," bringup.launch.py",[79,15329,2394],{"class":89},[20,15331,15332,15333,15336,15337,15340,15341,15344],{},"（3）启动rviz2，加载",[76,15334,15335],{},"\u002Fopt\u002Fros\u002Fjazzy\u002Fshare\u002Fnav2_bringup\u002Frviz","下的",[76,15338,15339],{},"nav2_default_view.rviz","文件，为机器人设置初始位姿后，再通过菜单栏的",[76,15342,15343],{},"Nav2 Goal","设置目标点，机器人就可以自动导航至目标点了。",[70,15346,15348],{"className":72,"code":15347,"language":74,"meta":34,"style":34},"rviz2 -d \u002Fopt\u002Fros\u002Fjazzy\u002Fshare\u002Fnav2_bringup\u002Frviz\u002Fnav2_default_view.rviz\n",[76,15349,15350],{"__ignoreMap":34},[79,15351,15352,15355,15358],{"class":81,"line":82},[79,15353,15354],{"class":85},"rviz2",[79,15356,15357],{"class":1215}," -d",[79,15359,15360],{"class":89}," \u002Fopt\u002Fros\u002Fjazzy\u002Fshare\u002Fnav2_bringup\u002Frviz\u002Fnav2_default_view.rviz\n",[48,15362,15363,15371,15381],{},[51,15364,15365,15367,15368,15370],{},[76,15366,15354],{},"：启动 ",[76,15369,15354],{}," 工具。",[51,15372,15373,15376,15377,15380],{},[76,15374,15375],{},"-d","：指定要加载的 ",[76,15378,15379],{},".rviz"," 配置文件。",[51,15382,15383,15386,15387,15389],{},[76,15384,15385],{},"\u002Fopt\u002Fros\u002Fjazzy\u002Fshare\u002Fnav2_bringup\u002Frviz\u002Fnav2_default_view.rviz","：",[76,15388,15379],{}," 配置文件的路径。",[20,15391,15392,15393,15395,15396,15380],{},"运行该命令后，",[76,15394,15354],{}," 将启动并加载 ",[76,15397,15339],{},[20,15399,15400],{},"先使用",[20,15402,15403,15406],{},[32,15404],{"alt":34,"src":15405},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1766.webp",[32,15407],{"alt":34,"src":15408},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1767.webp",[20,15410,15411],{},"如上图，左图是选择初始位置，右图是选择目标位置。",[20,15413,15414],{},"上图中，每个障碍物和墙附近的光圈是危险程度，颜色越红表示机器人经过此地越危险。",[20,15416,15417],{},[32,15418],{"alt":34,"src":15419},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1768.webp",[20,15421,15422],{},[32,15423],{"alt":34,"src":15424},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1769.webp",[16,15426,15428],{"id":15427},"自主探索slam","自主探索SLAM",[20,15430,15431,15432,15434,15435,15438],{},"导航需要依赖于地图与定位，例如在上一节 ",[23,15433,9338],{}," 中，导航实现时就是以launch文件的方式集成了 ",[23,15436,15437],{},"定位AMCL"," 一节中的定位功能，而机器人SLAM时，也是发布地图数据与定位信息的，所以导航时也可以不借助于amcl而是直接与SLAM结合，达到自主探索的SLAM效果。",[20,15440,15441],{},[23,15442,15443],{},"1.编写launch文件",[20,15445,15446,15447,14904],{},"在功能包mycar_navigation2_jazzy的launch目录下新建名为",[76,15448,15449],{},"auto_slam.launch.py",[70,15451,15453],{"className":1234,"code":15452,"language":1236,"meta":34,"style":34},"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",[76,15454,15455,15461,15465,15475,15479,15489,15499,15511,15521,15532,15536,15540,15548,15552,15560,15566,15574,15578,15582,15591,15598,15609,15618,15622,15626,15638,15652,15656,15669,15682,15694,15698,15707,15711,15715,15720,15726,15731,15735,15739,15747,15753,15758,15768,15785,15789,15793,15797,15806,15810,15814,15819,15825,15830,15834,15838,15846,15852,15856,15864,15877,15881,15885,15889,15897,15901,15905,15909,15915,15919,15923,15927,15935,15941,15945,15949,15953,15961,15966,15971,15976,15981,15986],{"__ignoreMap":34},[79,15456,15457,15459],{"class":81,"line":82},[79,15458,1243],{"class":99},[79,15460,1246],{"class":106},[79,15462,15463],{"class":81,"line":116},[79,15464,142],{"emptyLinePlaceholder":141},[79,15466,15467,15469,15471,15473],{"class":81,"line":138},[79,15468,1255],{"class":99},[79,15470,1306],{"class":106},[79,15472,1243],{"class":99},[79,15474,1311],{"class":106},[79,15476,15477],{"class":81,"line":145},[79,15478,142],{"emptyLinePlaceholder":141},[79,15480,15481,15483,15485,15487],{"class":81,"line":152},[79,15482,1255],{"class":99},[79,15484,1258],{"class":106},[79,15486,1243],{"class":99},[79,15488,1263],{"class":106},[79,15490,15491,15493,15495,15497],{"class":81,"line":164},[79,15492,1255],{"class":99},[79,15494,1270],{"class":106},[79,15496,1243],{"class":99},[79,15498,6041],{"class":106},[79,15500,15501,15503,15506,15508],{"class":81,"line":176},[79,15502,1255],{"class":99},[79,15504,15505],{"class":106}," launch.conditions ",[79,15507,1243],{"class":99},[79,15509,15510],{"class":106}," IfCondition\n",[79,15512,15513,15515,15517,15519],{"class":81,"line":181},[79,15514,1255],{"class":99},[79,15516,6058],{"class":106},[79,15518,1243],{"class":99},[79,15520,6063],{"class":106},[79,15522,15523,15525,15527,15529],{"class":81,"line":186},[79,15524,1255],{"class":99},[79,15526,1282],{"class":106},[79,15528,1243],{"class":99},[79,15530,15531],{"class":106}," LaunchConfiguration, PythonExpression\n",[79,15533,15534],{"class":81,"line":197},[79,15535,142],{"emptyLinePlaceholder":141},[79,15537,15538],{"class":81,"line":1346},[79,15539,142],{"emptyLinePlaceholder":141},[79,15541,15542,15544,15546],{"class":81,"line":1361},[79,15543,1320],{"class":99},[79,15545,1323],{"class":85},[79,15547,1326],{"class":106},[79,15549,15550],{"class":81,"line":1366},[79,15551,142],{"emptyLinePlaceholder":141},[79,15553,15554,15556,15558],{"class":81,"line":1377},[79,15555,3093],{"class":106},[79,15557,1334],{"class":99},[79,15559,1374],{"class":106},[79,15561,15562,15564],{"class":81,"line":1386},[79,15563,1380],{"class":89},[79,15565,1383],{"class":106},[79,15567,15568,15570,15572],{"class":81,"line":1400},[79,15569,1390],{"class":1389},[79,15571,1334],{"class":99},[79,15573,6120],{"class":89},[79,15575,15576],{"class":81,"line":1413},[79,15577,3246],{"class":106},[79,15579,15580],{"class":81,"line":1423},[79,15581,142],{"emptyLinePlaceholder":141},[79,15583,15584,15587,15589],{"class":81,"line":1431},[79,15585,15586],{"class":106},"    slam_backend_arg ",[79,15588,1334],{"class":99},[79,15590,1374],{"class":106},[79,15592,15593,15596],{"class":81,"line":1447},[79,15594,15595],{"class":89},"        'slam_backend'",[79,15597,1383],{"class":106},[79,15599,15600,15602,15604,15607],{"class":81,"line":1461},[79,15601,1390],{"class":1389},[79,15603,1334],{"class":99},[79,15605,15606],{"class":89},"'cartographer'",[79,15608,1383],{"class":106},[79,15610,15611,15613,15615],{"class":81,"line":1473},[79,15612,1403],{"class":1389},[79,15614,1334],{"class":99},[79,15616,15617],{"class":89},"'SLAM backend: slam_toolbox or cartographer'\n",[79,15619,15620],{"class":81,"line":1478},[79,15621,3246],{"class":106},[79,15623,15624],{"class":81,"line":1489},[79,15625,142],{"emptyLinePlaceholder":141},[79,15627,15628,15630,15632,15634,15636],{"class":81,"line":1500},[79,15629,1331],{"class":106},[79,15631,1334],{"class":99},[79,15633,1337],{"class":106},[79,15635,1340],{"class":89},[79,15637,1343],{"class":106},[79,15639,15640,15643,15645,15647,15650],{"class":81,"line":1506},[79,15641,15642],{"class":106},"    slam_backend ",[79,15644,1334],{"class":99},[79,15646,1337],{"class":106},[79,15648,15649],{"class":89},"'slam_backend'",[79,15651,1343],{"class":106},[79,15653,15654],{"class":81,"line":1517},[79,15655,142],{"emptyLinePlaceholder":141},[79,15657,15658,15661,15663,15665,15667],{"class":81,"line":1523},[79,15659,15660],{"class":106},"    slam_toolbox_pkg ",[79,15662,1334],{"class":99},[79,15664,9573],{"class":106},[79,15666,1441],{"class":89},[79,15668,1343],{"class":106},[79,15670,15671,15674,15676,15678,15680],{"class":81,"line":1536},[79,15672,15673],{"class":106},"    cartographer_pkg ",[79,15675,1334],{"class":99},[79,15677,9573],{"class":106},[79,15679,3211],{"class":89},[79,15681,1343],{"class":106},[79,15683,15684,15686,15688,15690,15692],{"class":81,"line":1549},[79,15685,15043],{"class":106},[79,15687,1334],{"class":99},[79,15689,9573],{"class":106},[79,15691,9576],{"class":89},[79,15693,1343],{"class":106},[79,15695,15696],{"class":81,"line":1561},[79,15697,142],{"emptyLinePlaceholder":141},[79,15699,15700,15703,15705],{"class":81,"line":1574},[79,15701,15702],{"class":106},"    slam_toolbox_launch ",[79,15704,1334],{"class":99},[79,15706,6378],{"class":106},[79,15708,15709],{"class":81,"line":1579},[79,15710,6383],{"class":106},[79,15712,15713],{"class":81,"line":1590},[79,15714,6388],{"class":106},[79,15716,15717],{"class":81,"line":1595},[79,15718,15719],{"class":106},"                slam_toolbox_pkg,\n",[79,15721,15722,15724],{"class":81,"line":1601},[79,15723,6403],{"class":89},[79,15725,1383],{"class":106},[79,15727,15728],{"class":81,"line":1607},[79,15729,15730],{"class":89},"                'online_sync_launch.py'\n",[79,15732,15733],{"class":81,"line":1613},[79,15734,6415],{"class":106},[79,15736,15737],{"class":81,"line":1618},[79,15738,6420],{"class":106},[79,15740,15741,15743,15745],{"class":81,"line":2001},[79,15742,6425],{"class":1389},[79,15744,1334],{"class":99},[79,15746,6430],{"class":106},[79,15748,15749,15751],{"class":81,"line":2012},[79,15750,6435],{"class":89},[79,15752,9776],{"class":106},[79,15754,15755],{"class":81,"line":2025},[79,15756,15757],{"class":106},"        }.items(),\n",[79,15759,15760,15763,15765],{"class":81,"line":2039},[79,15761,15762],{"class":1389},"        condition",[79,15764,1334],{"class":99},[79,15766,15767],{"class":106},"IfCondition(\n",[79,15769,15770,15773,15776,15779,15782],{"class":81,"line":2052},[79,15771,15772],{"class":106},"            PythonExpression([",[79,15774,15775],{"class":89},"\"'\"",[79,15777,15778],{"class":106},", slam_backend, ",[79,15780,15781],{"class":89},"\"' == 'slam_toolbox'\"",[79,15783,15784],{"class":106},"])\n",[79,15786,15787],{"class":81,"line":2066},[79,15788,9810],{"class":106},[79,15790,15791],{"class":81,"line":2077},[79,15792,3246],{"class":106},[79,15794,15795],{"class":81,"line":2082},[79,15796,142],{"emptyLinePlaceholder":141},[79,15798,15799,15802,15804],{"class":81,"line":2092},[79,15800,15801],{"class":106},"    cartographer_launch ",[79,15803,1334],{"class":99},[79,15805,6378],{"class":106},[79,15807,15808],{"class":81,"line":2103},[79,15809,6383],{"class":106},[79,15811,15812],{"class":81,"line":2115},[79,15813,6388],{"class":106},[79,15815,15816],{"class":81,"line":2120},[79,15817,15818],{"class":106},"                cartographer_pkg,\n",[79,15820,15821,15823],{"class":81,"line":2131},[79,15822,6403],{"class":89},[79,15824,1383],{"class":106},[79,15826,15827],{"class":81,"line":2141},[79,15828,15829],{"class":89},"                'cartographer.launch.py'\n",[79,15831,15832],{"class":81,"line":2152},[79,15833,6415],{"class":106},[79,15835,15836],{"class":81,"line":2157},[79,15837,6420],{"class":106},[79,15839,15840,15842,15844],{"class":81,"line":2171},[79,15841,6425],{"class":1389},[79,15843,1334],{"class":99},[79,15845,6430],{"class":106},[79,15847,15848,15850],{"class":81,"line":2184},[79,15849,6435],{"class":89},[79,15851,9776],{"class":106},[79,15853,15854],{"class":81,"line":2189},[79,15855,15757],{"class":106},[79,15857,15858,15860,15862],{"class":81,"line":2203},[79,15859,15762],{"class":1389},[79,15861,1334],{"class":99},[79,15863,15767],{"class":106},[79,15865,15866,15868,15870,15872,15875],{"class":81,"line":2217},[79,15867,15772],{"class":106},[79,15869,15775],{"class":89},[79,15871,15778],{"class":106},[79,15873,15874],{"class":89},"\"' == 'cartographer'\"",[79,15876,15784],{"class":106},[79,15878,15879],{"class":81,"line":2231},[79,15880,9810],{"class":106},[79,15882,15883],{"class":81,"line":2242},[79,15884,3246],{"class":106},[79,15886,15887],{"class":81,"line":2252},[79,15888,142],{"emptyLinePlaceholder":141},[79,15890,15891,15893,15895],{"class":81,"line":6472},[79,15892,15131],{"class":106},[79,15894,1334],{"class":99},[79,15896,6378],{"class":106},[79,15898,15899],{"class":81,"line":6478},[79,15900,6383],{"class":106},[79,15902,15903],{"class":81,"line":6484},[79,15904,6388],{"class":106},[79,15906,15907],{"class":81,"line":9995},[79,15908,15148],{"class":106},[79,15910,15911,15913],{"class":81,"line":10007},[79,15912,6403],{"class":89},[79,15914,1383],{"class":106},[79,15916,15917],{"class":81,"line":10018},[79,15918,15159],{"class":89},[79,15920,15921],{"class":81,"line":10029},[79,15922,6415],{"class":106},[79,15924,15925],{"class":81,"line":10038},[79,15926,6420],{"class":106},[79,15928,15929,15931,15933],{"class":81,"line":10044},[79,15930,6425],{"class":1389},[79,15932,1334],{"class":99},[79,15934,6430],{"class":106},[79,15936,15937,15939],{"class":81,"line":10053},[79,15938,6435],{"class":89},[79,15940,9776],{"class":106},[79,15942,15943],{"class":81,"line":10058},[79,15944,6446],{"class":106},[79,15946,15947],{"class":81,"line":10068},[79,15948,3246],{"class":106},[79,15950,15951],{"class":81,"line":10084},[79,15952,142],{"emptyLinePlaceholder":141},[79,15954,15955,15957,15959],{"class":81,"line":10089},[79,15956,1582],{"class":106},[79,15958,1334],{"class":99},[79,15960,1587],{"class":106},[79,15962,15963],{"class":81,"line":10094},[79,15964,15965],{"class":106},"    ld.add_action(use_sim_time_arg)\n",[79,15967,15968],{"class":81,"line":10099},[79,15969,15970],{"class":106},"    ld.add_action(slam_backend_arg)\n",[79,15972,15973],{"class":81,"line":10109},[79,15974,15975],{"class":106},"    ld.add_action(slam_toolbox_launch)\n",[79,15977,15978],{"class":81,"line":10121},[79,15979,15980],{"class":106},"    ld.add_action(cartographer_launch)\n",[79,15982,15983],{"class":81,"line":10133},[79,15984,15985],{"class":106},"    ld.add_action(nav2_launch)\n",[79,15987,15988,15990],{"class":81,"line":10144},[79,15989,1621],{"class":99},[79,15991,1624],{"class":106},[20,15993,15994],{},[23,15995,15996],{},"2.编译",[20,15998,2309],{},[70,16000,16001],{"className":72,"code":15262,"language":74,"meta":34,"style":34},[76,16002,16003],{"__ignoreMap":34},[79,16004,16005,16007,16009,16011],{"class":81,"line":82},[79,16006,2319],{"class":85},[79,16008,2322],{"class":89},[79,16010,2325],{"class":1215},[79,16012,15275],{"class":89},[20,16014,16015],{},[23,16016,16017],{},"3.执行",[20,16019,3997],{},[70,16021,16022],{"className":72,"code":2341,"language":74,"meta":34,"style":34},[76,16023,16024,16030],{"__ignoreMap":34},[79,16025,16026,16028],{"class":81,"line":82},[79,16027,2348],{"class":1215},[79,16029,2351],{"class":89},[79,16031,16032,16034,16036,16038],{"class":81,"line":116},[79,16033,1203],{"class":85},[79,16035,2358],{"class":89},[79,16037,2361],{"class":89},[79,16039,2364],{"class":89},[20,16041,16042],{},"（2）然后在终端下进入当前工作空间，输入如下指令启动自主SLAM功能：",[70,16044,16046],{"className":72,"code":16045,"language":74,"meta":34,"style":34},". install\u002Fsetup.bash\nros2 launch mycar_navigation2_jazzy auto_slam.launch.py use_sim_time:=True slam_backend:=cartographer\n",[76,16047,16048,16054],{"__ignoreMap":34},[79,16049,16050,16052],{"class":81,"line":82},[79,16051,2348],{"class":1215},[79,16053,2351],{"class":89},[79,16055,16056,16058,16060,16062,16065,16068],{"class":81,"line":116},[79,16057,1203],{"class":85},[79,16059,2358],{"class":89},[79,16061,9379],{"class":89},[79,16063,16064],{"class":89}," auto_slam.launch.py",[79,16066,16067],{"class":89}," use_sim_time:=True",[79,16069,16070],{"class":89}," slam_backend:=cartographer\n",[20,16072,15332,16073,15336,16075,16077,16078,16080],{},[76,16074,15335],{},[76,16076,15339],{},"文件，再通过菜单栏的",[76,16079,15343],{},"设置目标点，机器人就可以自动导航至目标点，并且导航中还会实现建图的功能。",[70,16082,16083],{"className":72,"code":15347,"language":74,"meta":34,"style":34},[76,16084,16085],{"__ignoreMap":34},[79,16086,16087,16089,16091],{"class":81,"line":82},[79,16088,15354],{"class":85},[79,16090,15357],{"class":1215},[79,16092,15360],{"class":89},[20,16094,16095],{},[32,16096],{"alt":34,"src":16097},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1770.webp",[20,16099,16100],{},[32,16101],{"alt":34,"src":16102},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1771.webp",[12,16104,16105],{"id":16105},"多车编队",[20,16107,16108],{},"多车编队技术通过先进的传感器、实时数据分析和高度智能化的控制系统，使得一组车辆能够在没有人工干预的情况下实现协同运行，作为一种先进的智能交通系统应用，已经在多个领域展现出其巨大的潜力和广泛的应用场景。比如：",[336,16110,16111,16114,16117],{},[20,16112,16113],{},"时间优化：多车编队技术消除了人为操作中的误差和延误，降低了人力资源成本和运营风险。",[20,16115,16116],{},"空间优化：多车编队技术可以减少车辆间的空隙，最大化道路利用率。",[20,16118,16119],{},"性能优化：密集编队行驶减少了空气动力学阻力，降低了能耗和燃料消耗。",[20,16121,16122],{},"总之，多车编队技术在机器人领域有着独特的作用和价值。本节将介绍如何在ROS2中实现多车编队。",[16124,16125,16126],"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":34,"searchDepth":116,"depth":116,"links":16128},[16129,16130,16131,16132,16133,16134],{"id":14,"depth":138,"text":14},{"id":295,"depth":138,"text":296},{"id":4065,"depth":138,"text":4065},{"id":5516,"depth":138,"text":5517},{"id":7110,"depth":138,"text":7110},{"id":16105,"depth":138,"text":16105},"1200-0200","2023-12-30","2023-12-30-ros2-tutorial","\u002Fwiki\u002F2023-12-30-ros2-tutorial","Ros2 Tutorial","md",false,{},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-jazzy-ban-ben",{"title":5,"description":34},"wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-Jazzy版本","Jj8WOa8ULA08sLr0bQf8rD2wCPi2vRKlfL0NMt49ZLQ",[16148,16155,16161,16167,16173,16179,16185,16191,16197,16203,16209,16215,16221,16227,16233,16239,16245,16247,16253,16259,16265,16271,16277,16283,16289,16295,16301,16307,16313,16319,16325,16331,16337,16343,16349,16354,16360,16365,16371,16377,16383,16389,16395,16401,16407,16413,16419,16425,16431,16437,16443,16449,16455,16461,16467,16473,16479,16485,16491,16497,16503,16509,16515,16521,16527,16533,16539,16545,16551],{"path":16149,"stem":16150,"title":16151,"authors":16152,"date":16136,"chapterOrder":16153,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0100-ros2-jie-shao","wiki\u002F2023-12-30-ros2-tutorial\u002F0100-ROS2介绍","ROS2介绍",[7],"0100",0,{"path":16156,"stem":16157,"title":16158,"authors":16159,"date":16136,"chapterOrder":16160,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0200-ru-men-cao-zuo","wiki\u002F2023-12-30-ros2-tutorial\u002F0200-入门操作","入门操作",[7],"0200",{"path":16162,"stem":16163,"title":16164,"authors":16165,"date":16136,"chapterOrder":16166,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0300-gong-zuo-kong-jian-yu-gong-neng-bao","wiki\u002F2023-12-30-ros2-tutorial\u002F0300-工作空间与功能包","工作空间与功能包",[7],"0300",{"path":16168,"stem":16169,"title":16170,"authors":16171,"date":16136,"chapterOrder":16172,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0400-si-da-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F0400-四大通信","四大通信",[7],"0400",{"path":16174,"stem":16175,"title":16176,"authors":16177,"date":16136,"chapterOrder":16178,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0500-ros2-qi-ta-tong-xin-ji-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F0500-ROS2其他通信机制","ROS2其他通信机制",[7],"0500",{"path":16180,"stem":16181,"title":16182,"authors":16183,"date":16136,"chapterOrder":16184,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0600-launch","wiki\u002F2023-12-30-ros2-tutorial\u002F0600-Launch","Launch",[7],"0600",{"path":16186,"stem":16187,"title":16188,"authors":16189,"date":16136,"chapterOrder":16190,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0700-hui-su-rosbag2","wiki\u002F2023-12-30-ros2-tutorial\u002F0700-回溯rosbag2","回溯rosbag2",[7],"0700",{"path":16192,"stem":16193,"title":16194,"authors":16195,"date":16136,"chapterOrder":16196,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0800-zuo-biao-bian-huan-tf","wiki\u002F2023-12-30-ros2-tutorial\u002F0800-坐标变换TF","坐标变换TF",[7],"0800",{"path":16198,"stem":16199,"title":16200,"authors":16201,"date":16136,"chapterOrder":16202,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0900-ke-shi-hua-ping-tai-rviz2-yu-urdf-jian-mo-yu-yan","wiki\u002F2023-12-30-ros2-tutorial\u002F0900-可视化平台RVIZ2与URDF建模语言","可视化平台RVIZ2与URDF建模语言",[7],"0900",{"path":16204,"stem":16205,"title":16206,"authors":16207,"date":16136,"chapterOrder":16208,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1000-stage-ros2-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1000-Stage_Ros2仿真平台","Stage_Ros2仿真平台",[7],"1000",{"path":16210,"stem":16211,"title":16212,"authors":16213,"date":16136,"chapterOrder":16214,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-gazeboclassic","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-GazeboClassic","Gezebo Classic",[7],"1100-0100",{"path":16216,"stem":16217,"title":16218,"authors":16219,"date":16136,"chapterOrder":16220,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-ignitiongazebo","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-IgnitionGazebo","Ignition Gazebo（Gazebo Fortress）",[7],"1100-0200",{"path":16222,"stem":16223,"title":16224,"authors":16225,"date":16136,"chapterOrder":16226,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-gazebosim","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-GazeboSim","Gz Sim（Gazebo Harmonic）",[7],"1100-0300",{"path":16228,"stem":16229,"title":16230,"authors":16231,"date":16136,"chapterOrder":16232,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-igngz2gzsim","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-Igngz2gzsim","将Ign Gazebo迁移至Gz Sim",[7],"1100-0400",{"path":16234,"stem":16235,"title":16236,"authors":16237,"date":16136,"chapterOrder":16238,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-gezebo-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-Gezebo仿真平台","Gezebo仿真平台",[7],"1100",{"path":16240,"stem":16241,"title":16242,"authors":16243,"date":16136,"chapterOrder":16244,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-humble-ban-ben","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-Humble版本","Humble导航仿真",[7],"1200-0100",{"path":16143,"stem":16145,"title":5,"authors":16246,"date":16136,"chapterOrder":16135,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},[7],{"path":16248,"stem":16249,"title":16250,"authors":16251,"date":16136,"chapterOrder":16252,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-humble2jazzy","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-Humble2Jazzy","Humble与Jazzy导航的差异",[7],"1200-0300",{"path":16254,"stem":16255,"title":16256,"authors":16257,"date":16136,"chapterOrder":16258,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-you-xian-zhuang-tai-ji-fsm","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-有限状态机FSM","有限状态机（Finite State Machine）",[7],"1200-0400-0100",{"path":16260,"stem":16261,"title":16262,"authors":16263,"date":16136,"chapterOrder":16264,"chapterDepth":138,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-ji-ben-gai-nian","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-基本概念","基本概念",[7],"1200-0400-0200-0100",{"path":16266,"stem":16267,"title":16268,"authors":16269,"date":16136,"chapterOrder":16270,"chapterDepth":138,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-kong-zhi-yu-zhuang-shi-gui-ze","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-控制与装饰规则","控制与装饰规则",[7],"1200-0400-0200-0200",{"path":16272,"stem":16273,"title":16274,"authors":16275,"date":16136,"chapterOrder":16276,"chapterDepth":138,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0300-di-yi-ge-wan-zheng-cheng-xu","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0300-第一个完整程序","第一个完整程序",[7],"1200-0400-0200-0300",{"path":16278,"stem":16279,"title":16280,"authors":16281,"date":16136,"chapterOrder":16282,"chapterDepth":138,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0400-jie-dian-zhi-jian-chuan-shu-ju","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0400-节点之间传数据","节点之间传数据",[7],"1200-0400-0200-0400",{"path":16284,"stem":16285,"title":16286,"authors":16287,"date":16136,"chapterOrder":16288,"chapterDepth":138,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0500-chi-xu-ren-wu-yu-zhong-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0500-持续任务与中止","持续任务与中止",[7],"1200-0400-0200-0500",{"path":16290,"stem":16291,"title":16292,"authors":16293,"date":16136,"chapterOrder":16294,"chapterDepth":138,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0600-zu-he-shi-ji-ren-wu","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0600-组合实际任务","组合实际任务",[7],"1200-0400-0200-0600",{"path":16296,"stem":16297,"title":16298,"authors":16299,"date":16136,"chapterOrder":16300,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-xing-wei-shu-bt","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-行为树BT","行为树（BehaviorTree.CPP）",[7],"1200-0400-0200",{"path":16302,"stem":16303,"title":16304,"authors":16305,"date":16136,"chapterOrder":16306,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-fsm-yu-bt","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-FSM与BT","有限状态机FSM与行为树BT",[7],"1200-0400",{"path":16308,"stem":16309,"title":16310,"authors":16311,"date":16136,"chapterOrder":16312,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-机器人导航Navigation2(仿真篇)","机器人导航Navigation2(仿真篇)",[7],"1200",{"path":16314,"stem":16315,"title":16316,"authors":16317,"date":16136,"chapterOrder":16318,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-Boost.Aiso","Boost.Asio库",[7],"1300-0100-0100",{"path":16320,"stem":16321,"title":16322,"authors":16323,"date":16136,"chapterOrder":16324,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2_serial_driver","ROS2 Serial Driver库",[7],"1300-0100-0200",{"path":16326,"stem":16327,"title":16328,"authors":16329,"date":16136,"chapterOrder":16330,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-chuan-kou-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-串口通信","UART串口通信",[7],"1300-0100",{"path":16332,"stem":16333,"title":16334,"authors":16335,"date":16136,"chapterOrder":16336,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","SocketCAN",[7],"1300-0200-0100",{"path":16338,"stem":16339,"title":16340,"authors":16341,"date":16136,"chapterOrder":16342,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2-socketcan","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2_socketcan","ROS2_SocketCAN",[7],"1300-0200-0200",{"path":16344,"stem":16345,"title":16346,"authors":16347,"date":16136,"chapterOrder":16348,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-can-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-CAN通信","CAN通信",[7],"1300-0200",{"path":16350,"stem":16351,"title":16316,"authors":16352,"date":16136,"chapterOrder":16353,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-Boost.Aiso",[7],"1300-0300-0100",{"path":16355,"stem":16356,"title":16357,"authors":16358,"date":16136,"chapterOrder":16359,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-tcp-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-TCP通信","TCP通信",[7],"1300-0300",{"path":16361,"stem":16362,"title":16316,"authors":16363,"date":16136,"chapterOrder":16364,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-Boost.Aiso",[7],"1300-0400-0100",{"path":16366,"stem":16367,"title":16368,"authors":16369,"date":16136,"chapterOrder":16370,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-udp-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-UDP通信","UDP通信",[7],"1300-0400",{"path":16372,"stem":16373,"title":16374,"authors":16375,"date":16136,"chapterOrder":16376,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-linux-ying-jian-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-Linux硬件通信","Linux硬件通信",[7],"1300",{"path":16378,"stem":16379,"title":16380,"authors":16381,"date":16136,"chapterOrder":16382,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-ji-qi-ren-zu-cheng","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-机器人组成","机器人组成",[7],"1400-0100",{"path":16384,"stem":16385,"title":16386,"authors":16387,"date":16136,"chapterOrder":16388,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-yuan-cheng-kai-fa-ssh","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-远程开发SSH","远程开发SSH",[7],"1400-0200-0100",{"path":16390,"stem":16391,"title":16392,"authors":16393,"date":16136,"chapterOrder":16394,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-yuan-cheng-fang-wen-zhuo-mian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-远程访问桌面","远程访问桌面",[7],"1400-0200-0200",{"path":16396,"stem":16397,"title":16398,"authors":16399,"date":16136,"chapterOrder":16400,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-gong-kong-ji-zhi-yuan-cheng-kai-fa-huan-jing","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-工控机之远程开发环境","工控机之远程开发环境",[7],"1400-0200",{"path":16402,"stem":16403,"title":16404,"authors":16405,"date":16136,"chapterOrder":16406,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-gong-kong-ji-zhi-wai-jie-usb-she-bei","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-工控机之外接USB设备","工控机之外接USB设备",[7],"1400-0300",{"path":16408,"stem":16409,"title":16410,"authors":16411,"date":16136,"chapterOrder":16412,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-fen-bu-shi-da-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-分布式搭建","分布式搭建",[7],"1400-0400",{"path":16414,"stem":16415,"title":16416,"authors":16417,"date":16136,"chapterOrder":16418,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-you-hua-ri-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-优化日志","优化日志",[7],"1400-0500",{"path":16420,"stem":16421,"title":16422,"authors":16423,"date":16136,"chapterOrder":16424,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-li-cheng-ji-odom","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-里程计Odom","里程计Odom",[7],"1400-0600-0100",{"path":16426,"stem":16427,"title":16428,"authors":16429,"date":16136,"chapterOrder":16430,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-guan-xing-ji-imu","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-惯性计IMU","惯性计IMU",[7],"1400-0600-0200",{"path":16432,"stem":16433,"title":16434,"authors":16435,"date":16136,"chapterOrder":16436,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-ji-guang-lei-da-lidar","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-激光雷达LiDAR","激光雷达LiDAR",[7],"1400-0600-0300",{"path":16438,"stem":16439,"title":16440,"authors":16441,"date":16136,"chapterOrder":16442,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-xiang-ji-camera","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-相机Camera","相机Camera",[7],"1400-0600-0400",{"path":16444,"stem":16445,"title":16446,"authors":16447,"date":16136,"chapterOrder":16448,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-quan-qiu-ding-wei-gnss","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-全球定位GNSS","全球定位GNSS",[7],"1400-0600-0500",{"path":16450,"stem":16451,"title":16452,"authors":16453,"date":16136,"chapterOrder":16454,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-shou-bing-joy","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-手柄joy","手柄JOY",[7],"1400-0600-0600",{"path":16456,"stem":16457,"title":16458,"authors":16459,"date":16136,"chapterOrder":16460,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-jian-pan-kong-zhi-jie-dian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-键盘控制节点","键盘控制节点",[7],"1400-0600-0700",{"path":16462,"stem":16463,"title":16464,"authors":16465,"date":16136,"chapterOrder":16466,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-ying-jian-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-硬件平台","硬件平台",[7],"1400-0600",{"path":16468,"stem":16469,"title":16470,"authors":16471,"date":16136,"chapterOrder":16472,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-zuo-biao-xi-yu-hua-ti-guan-xi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-坐标系与话题关系","坐标系与话题关系",[7],"1400-0700",{"path":16474,"stem":16475,"title":16476,"authors":16477,"date":16136,"chapterOrder":16478,"chapterDepth":138,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-lun-shi-li-cheng-ji-biao-ding","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-轮式里程计标定","轮式里程计标定",[7],"1400-0800-0100-0100",{"path":16480,"stem":16481,"title":16482,"authors":16483,"date":16136,"chapterOrder":16484,"chapterDepth":138,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-lun-shi-li-cheng-ji-yu-imu-rong-he","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-轮式里程计与IMU融合","轮式里程计与IMU融合",[7],"1400-0800-0100-0200",{"path":16486,"stem":16487,"title":16488,"authors":16489,"date":16136,"chapterOrder":16490,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-lun-shi-li-cheng-ji-biao-ding-yu-rong-he","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-轮式里程计标定与融合","轮式里程计标定与融合",[7],"1400-0800-0100",{"path":16492,"stem":16493,"title":16494,"authors":16495,"date":16136,"chapterOrder":16496,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-ji-guang-lei-da-gong-ju","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-激光雷达工具","激光雷达工具",[7],"1400-0800-0200",{"path":16498,"stem":16499,"title":16500,"authors":16501,"date":16136,"chapterOrder":16502,"chapterDepth":116,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-xiang-ji-shi-yong-jin-jie","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-相机使用进阶","相机使用进阶",[7],"1400-0800-0300",{"path":16504,"stem":16505,"title":16506,"authors":16507,"date":16136,"chapterOrder":16508,"chapterDepth":82,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-ying-jian-ping-tai-jin-jie","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-硬件平台进阶","硬件平台进阶",[7],"1400-0800",{"path":16510,"stem":16511,"title":16512,"authors":16513,"date":16136,"chapterOrder":16514,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-ji-qi-ren-ying-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-机器人硬件","机器人硬件",[7],"1400",{"path":16516,"stem":16517,"title":16518,"authors":16519,"date":16136,"chapterOrder":16520,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1500-ros2-control","wiki\u002F2023-12-30-ros2-tutorial\u002F1500-ROS2_Control","ROS2_Control",[7],"1500",{"path":16522,"stem":16523,"title":16524,"authors":16525,"date":16136,"chapterOrder":16526,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1600-moveit2-gong-ye-ji-qi-ren-ji-xie-bi","wiki\u002F2023-12-30-ros2-tutorial\u002F1600-Moveit2工业机器人机械臂","Moveit2工业机器人机械臂",[7],"1600",{"path":16528,"stem":16529,"title":16530,"authors":16531,"date":16136,"chapterOrder":16532,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1700-ji-qi-ren-dao-hang-navigation2-shi-ti-pian","wiki\u002F2023-12-30-ros2-tutorial\u002F1700-机器人导航Navigation2(实体篇)","机器人导航Navigation2(实体篇)",[7],"1700",{"path":16534,"stem":16535,"title":16536,"authors":16537,"date":16136,"chapterOrder":16538,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1800-microros","wiki\u002F2023-12-30-ros2-tutorial\u002F1800-MicroROS","MicroROS",[7],"1800",{"path":16540,"stem":16541,"title":16542,"authors":16543,"date":16136,"chapterOrder":16544,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1900-webots-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1900-Webots仿真平台","Webots仿真平台",[7],"1900",{"path":16546,"stem":16547,"title":16548,"authors":16549,"date":16136,"chapterOrder":16550,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":16141},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F2000-opencv","wiki\u002F2023-12-30-ros2-tutorial\u002F2000-OpenCV","OpenCV",[7],"2000",{"path":16138,"stem":16552,"title":16553,"authors":16554,"date":16136,"chapterOrder":16555,"chapterDepth":16154,"docKey":16137,"docRoot":16138,"docTitle":16139,"isWikiDoc":141,"isWikiIndex":141},"wiki\u002F2023-12-30-ros2-tutorial\u002Findex","ROS2机器人操作系统教程",[7],null,[16557,16559,16562,16565],{"name":7,"image":16558},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":16560,"image":16561},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":16563,"image":16564},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":16566,"image":16567},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431902812]