[{"data":1,"prerenderedAt":16342},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-humble-ban-ben":3,"wiki-doc-items-2023-12-30-ros2-tutorial":15921,"wiki:author-members":16330},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":82,"chapterOrder":15909,"date":15910,"description":34,"docKey":15911,"docRoot":15912,"docTitle":15913,"extension":15914,"isWikiDoc":141,"isWikiIndex":15915,"meta":15916,"navigation":141,"path":15917,"seo":15918,"stem":15919,"wikiDepth":82,"__hash__":15920},"wiki\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-Humble版本.md","Humble导航仿真",[7],"董佳辉",{"type":9,"value":10,"toc":15901},"minimark",[11,15,19,26,29,36,39,44,47,60,63,66,69,209,216,219,222,227,259,262,282,285,288,296,300,304,307,310,313,328,331,335,338,353,356,359,361,368,371,397,400,426,429,438,500,504,507,510,528,531,536,582,585,666,671,707,712,825,835,1187,1190,1195,1198,1224,1229,1236,1629,1639,2264,2267,2272,2279,2306,2311,2314,2333,2419,2424,2427,2432,2435,2438,2441,2444,2447,2450,2455,2458,2463,2476,2479,2483,2486,2490,2521,2523,2555,2558,2561,2665,2670,2673,2684,2709,2712,2717,2750,2755,2790,2795,2875,2880,2885,2890,2913,2918,2941,2946,2969,2974,2979,2982,2986,2988,3009,3013,3018,3361,3364,3945,3947,3951,3955,3975,3979,3981,3997,4001,4004,4024,4027,4051,4054,4059,4064,4069,4072,4079,4101,4105,4109,4118,4122,4146,4150,4176,4180,4192,4230,4233,4237,4240,4245,4248,4272,4286,4291,4296,4299,4302,4315,4319,4326,4516,4520,4525,4810,4813,4819,4905,4910,4947,4951,4954,4961,4965,4988,4992,5012,5015,5019,5022,5043,5046,5063,5068,5073,5079,5099,5104,5107,5132,5138,5172,5182,5187,5197,5460,5471,5487,5492,5498,5505,5510,5515,5520,5524,5527,5533,5536,5539,5545,5550,5604,5609,5653,5658,5693,5698,5703,5764,5769,5820,5825,5863,5868,5897,5902,5957,5960,5965,5967,5991,5996,6002,6493,6514,6519,6904,6910,6915,6919,6939,6944,6946,6962,6967,6969,6989,6991,7015,7018,7035,7041,7048,7051,7057,7062,7080,7085,7090,7095,7098,7103,7106,7111,7114,7117,7120,7127,7132,7135,7141,7147,7152,7157,7160,7166,7169,7184,7188,7253,7256,7269,7275,7281,7284,7290,7293,7299,7303,7346,7351,7377,7381,7442,7445,7459,7464,7489,7494,7565,7570,7613,7618,7675,7680,8032,8035,8052,8057,8091,8096,8175,8180,8249,8254,8287,8292,8367,8372,8533,8536,8546,8550,8614,8618,8642,8647,8717,8721,8834,8837,8855,8860,8885,8890,8913,8918,8972,8975,8985,8989,9021,9025,9049,9053,9079,9083,9175,9178,9188,9192,9215,9219,9242,9246,9342,9346,9350,9352,9376,9380,9383,9389,10959,10962,10967,10970,10977,11475,11481,11965,11971,12308,12313,12318,12903,12908,12913,13984,13987,13998,14004,14007,14022,14027,14032,14259,14264,14269,14357,14362,14367,14548,14553,14558,14655,14660,14667,14984,14989,14993,15015,15020,15022,15038,15043,15045,15065,15068,15092,15107,15123,15152,15160,15163,15171,15174,15177,15182,15187,15191,15202,15207,15213,15766,15771,15773,15787,15792,15794,15814,15817,15845,15855,15867,15872,15877,15880,15883,15894,15897],[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# Humble\nsudo apt install ros-humble-navigation2\nsudo apt install ros-humble-nav2-bringup\n\n# Jazzy\nsudo apt install ros-jazzy-navigation2\nsudo apt install ros-jazzy-nav2-bringup\n","bash",[76,77,78,114,136,143,150,162,174,179,185,197],"code",{"__ignoreMap":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","# Humble\n",[79,151,153,155,157,159],{"class":81,"line":152},5,[79,154,86],{"class":85},[79,156,90],{"class":89},[79,158,93],{"class":89},[79,160,161],{"class":89}," ros-humble-navigation2\n",[79,163,165,167,169,171],{"class":81,"line":164},6,[79,166,86],{"class":85},[79,168,90],{"class":89},[79,170,93],{"class":89},[79,172,173],{"class":89}," ros-humble-nav2-bringup\n",[79,175,177],{"class":81,"line":176},7,[79,178,142],{"emptyLinePlaceholder":141},[79,180,182],{"class":81,"line":181},8,[79,183,184],{"class":148},"# Jazzy\n",[79,186,188,190,192,194],{"class":81,"line":187},9,[79,189,86],{"class":85},[79,191,90],{"class":89},[79,193,93],{"class":89},[79,195,196],{"class":89}," ros-jazzy-navigation2\n",[79,198,200,202,204,206],{"class":81,"line":199},10,[79,201,86],{"class":85},[79,203,90],{"class":89},[79,205,93],{"class":89},[79,207,208],{"class":89}," ros-jazzy-nav2-bringup\n",[20,210,211,212,215],{},"指令中的",[76,213,214],{},"\u003Cros2-distro>","请替换成当前所使用的ROS2版本。",[16,217,218],{"id":218},"导航条件",[20,220,221],{},"深入学习Nav2，需了解ROS2机器人基础知识，并配备仿真或实体机器人作为实践环境。",[20,223,224],{},[23,225,226],{},"ROS2基础",[48,228,229,235,241,247,253],{},[51,230,231,234],{},[23,232,233],{},"ROS2通信"," ：了解ROS2中的节点（Nodes）、话题（Topics）、服务（Services）、动作（Actions）等基本概念，以及如何通过这些机制实现节点间的通信。",[51,236,237,240],{},[23,238,239],{},"生命周期管理"," ：熟悉ROS2中的生命周期节点（Lifecycle Nodes），理解节点的启动、配置、激活、去激活、清理等状态转换过程，这对于管理复杂的ROS2系统至关重要。",[51,242,243,246],{},[23,244,245],{},"rviz2："," 熟练使用rviz2进行可视化调试，包括如何设置不同的显示类型（如点云、地图、路径等），以及如何通过rviz2与ROS2节点进行交互（如设置导航目标点、观察机器人状态等）。",[51,248,249,252],{},[23,250,251],{},"URDF："," 了解URDF（Unified Robot Description Format）文件，这是ROS中用于描述机器人模型的一种XML格式。熟悉如何编写和修改URDF文件，以便在仿真或实际环境中准确地表示机器人结构。",[51,254,255,258],{},[23,256,257],{},"TF坐标变换："," 掌握TF（Transform）库的使用，理解坐标变换在机器人导航中的重要性。学会如何设置和查询不同坐标系之间的变换关系，以确保机器人能够准确地定位自身和周围环境。",[20,260,261],{},"实践环境",[48,263,264,270,276],{},[51,265,266,269],{},[23,267,268],{},"仿真环境："," 搭建一个ROS2兼容的仿真环境，并配置好相应的机器人模型、传感器（如激光雷达、相机等）和仿真世界。确保仿真环境中的机器人能够接收速度指令、反馈里程计消息、发布传感器数据和TF坐标变换等。",[51,271,272,275],{},[23,273,274],{},"实体机器人："," 如果条件允许，准备一台实体机器人。这台机器人应该具备与仿真环境中相似的功能，即能够接收速度指令、反馈里程计消息、发布激光雷达等传感器数据以及发布TF坐标变换。同时，确保实体机器人已经安装了ROS2系统，并且已经配置好相应的驱动程序和算法库。",[51,277,278,281],{},[23,279,280],{},"Nav2软件包："," 安装并配置好Nav2软件包及其依赖项。Nav2是ROS2中用于机器人导航的综合性软件包，它包含了路径规划、避障、局部和全局地图维护等多个功能模块。确保Nav2软件包与您的ROS2版本兼容，并且已经根据需要进行了适当的配置。",[20,283,284],{},"通过掌握上述基础知识并准备好实践环境，您将能够更好地学习和应用Nav2进行机器人导航任务的开发与调试。",[16,286,287],{"id":287},"导航参数参考",[20,289,290],{},[291,292,293],"a",{"href":293,"rel":294},"https:\u002F\u002Fdocs.nav2.org\u002Fconfiguration\u002Findex.html",[295],"nofollow",[12,297,299],{"id":298},"slam-定位与建图","SLAM 定位与建图",[20,301,302],{},[23,303,25],{},[20,305,306],{},"SLAM（Simultaneous Localization and Mapping，即时定位与建图）是机器人学和自动导航领域的一种关键技术，允许机器人在未知环境中绘制环境地图。",[20,308,309],{},"在ROS 2下进行SLAM，通常涉及使用专门为ROS 2开发的SLAM相关软件包。这些软件包利用ROS 2的通讯框架（如话题、服务和action）来处理接收到的传感器数据，包括激光雷达、相机、惯性测量单元等。",[20,311,312],{},"以下列举了一些常见的在ROS2中使用的SLAM系统：",[314,315,316,322],"ol",{},[51,317,318,321],{},[23,319,320],{},"SLAM Toolbox"," ：SLAM Toolbox 是一种在 ROS 2 中普遍使用的 SLAM 解决方案，由 Steve Macenski 维护。它是为了替代原有的ROS中著名的gmapping包和Cartographer SLAM包而开发的，提供了2D激光SLAM领域中的多种功能。",[51,323,324,327],{},[23,325,326],{},"Cartographer for ROS 2"," ：Cartographer是由Google开发的一个2D和3D环境SLAM库。尽管它最初是为ROS开发的，但已经有为ROS 2创建的适配版本，可以在ROS 2生态系统内使用。",[20,329,330],{},"要在ROS 2中开始一个SLAM项目，还需要具体的传感器（例如激光雷达或摄像头），计算机要有足够的算力来运行SLAM算法，以及熟悉ROS 2节点、话题、服务、action、参数等知识，以实现有效的数据处理和通信。随着项目的发展，可能还需要考虑动态重配置、3D建图和路径规划等高级功能。",[20,332,333],{},[23,334,43],{},[20,336,337],{},"必须先说明的是：SLAM与Nav2并没有直接的依赖关系，它们是两种相对独立的技术框架。然而，在实际应用中，这两者却展现出紧密的联系与互补性。",[339,340,341,347],"blockquote",{},[20,342,343,346],{},[23,344,345],{},"独立性："," SLAM能够独立完成环境地图的构建，无需Nav2的介入。它依靠传感器数据来感知环境，并通过算法估计机器人的位置与姿态，从而构建出环境的地图。与此同时，Nav2也具备自主导航的能力。即使没有SLAM地图作为输入，它也能依赖其他来源的环境信息进行导航。",[20,348,349,352],{},[23,350,351],{},"互补性："," 尽管两者在技术上各自独立，但它们的结合却带来了显著的优势。Nav2能够利用SLAM创建的精确地图进行高效的路径规划，确保机器人能够顺利导航至目标位置。而SLAM则能借助Nav2的导航控制功能，在机器人移动过程中实时收集环境信息，从而进一步提高地图构建的效率和准确性。",[20,354,355],{},"因此，尽管SLAM与Nav2在技术上各自独立，但在构建完整的机器人导航系统中，它们的互补性使得机器人能够在复杂环境中实现更加自主、精准的建图或导航。",[16,357,358],{"id":358},"slam_toolbox概述",[20,360,25],{},[20,362,363,364,367],{},"SLAM Toolbox是一个基于开源软件的用来构建 ",[23,365,366],{},"2D地图"," 的工具集，旨在为研究人员和开发者提供一个快速构建和实现SLAM算法的平台。它集成了多种常用的SLAM算法，并提供了丰富的数据处理和滤波函数，以及地图构建和环境建模的工具。",[20,369,370],{},"功能",[48,372,373,379,385,391],{},[51,374,375,378],{},[23,376,377],{},"算法集成"," 包含基于卡尔曼滤波器和粒子滤波器的SLAM算法，以及基于图优化的SLAM算法等。",[51,380,381,384],{},[23,382,383],{},"数据处理"," 提供数据融合、数据预处理和异常检测等功能，支持激光雷达、摄像头、IMU等多种传感器数据的处理。",[51,386,387,390],{},[23,388,389],{},"地图构建"," 利用传感器数据和机器人运动信息构建准确的地图，并进行更新和优化。",[51,392,393,396],{},[23,394,395],{},"模块化设计"," 支持用户插入自己的算法或替换现有模块，实现高度定制化的SLAM解决方案。",[20,398,399],{},"优点",[48,401,402,408,414,420],{},[51,403,404,407],{},[23,405,406],{},"开源性和灵活性"," 作为开源软件，SLAM Toolbox提供了源代码和文档，用户可以自由修改和扩展算法。",[51,409,410,413],{},[23,411,412],{},"多种传感器支持"," 支持激光雷达、摄像头、IMU等多种传感器数据，适应不同应用场景的需求。",[51,415,416,419],{},[23,417,418],{},"高效性"," 利用现代C++的特性优化性能，确保在资源受限的硬件上也能高效运行。",[51,421,422,425],{},[23,423,424],{},"广泛的应用前景"," 适用于学术研究、无人机导航、自动驾驶汽车、室内机器人和工业自动化等多个领域。",[16,427,428],{"id":428},"slam_toolbox安装",[20,430,431,432,437],{},"借助于Advanced Packaging Tools(",[291,433,436],{"href":434,"rel":435},"https:\u002F\u002Fc6.y.qq.com\u002Fbase\u002Ffcgi-bin\u002Fu?__=bqEbdGxIB7mM",[295],"APT",")包资源管理器，可以使用二进制的方式安装slam_toolbox，安装指令如下：",[70,439,441],{"className":72,"code":440,"language":74,"meta":34,"style":34},"sudo apt install ros-\u003Cros2-distro>-slam-toolbox\n\n#humble\nsudo apt install ros-humble-slam-toolbox\n#jazzy\nsudo apt install ros-jazzy-slam-toolbox\n",[76,442,443,464,468,473,484,489],{"__ignoreMap":34},[79,444,445,447,449,451,453,455,457,459,461],{"class":81,"line":82},[79,446,86],{"class":85},[79,448,90],{"class":89},[79,450,93],{"class":89},[79,452,96],{"class":89},[79,454,100],{"class":99},[79,456,103],{"class":89},[79,458,107],{"class":106},[79,460,110],{"class":99},[79,462,463],{"class":89},"-slam-toolbox\n",[79,465,466],{"class":81,"line":116},[79,467,142],{"emptyLinePlaceholder":141},[79,469,470],{"class":81,"line":138},[79,471,472],{"class":148},"#humble\n",[79,474,475,477,479,481],{"class":81,"line":145},[79,476,86],{"class":85},[79,478,90],{"class":89},[79,480,93],{"class":89},[79,482,483],{"class":89}," ros-humble-slam-toolbox\n",[79,485,486],{"class":81,"line":152},[79,487,488],{"class":148},"#jazzy\n",[79,490,491,493,495,497],{"class":81,"line":164},[79,492,86],{"class":85},[79,494,90],{"class":89},[79,496,93],{"class":89},[79,498,499],{"class":89}," ros-jazzy-slam-toolbox\n",[20,501,211,502,215],{},[76,503,214],{},[16,505,506],{"id":506},"slam_toolbox节点说明",[20,508,509],{},"在slam_toolbox中常用的节点有两个：sync_slam_toolbox_node和async_slam_toolbox_node。",[339,511,512,517,520,525],{},[20,513,514],{},[23,515,516],{},"sync_slam_toolbox_node：",[20,518,519],{},"这是一个同步节点，会等待所有传感器数据到达后再处理，确保数据完整性和一致性，提高定位和建图准确性。但同步处理可能导致延迟，更适合对数据一致性和准确性要求高、实时性要求不高的场景。",[20,521,522],{},[23,523,524],{},"async_slam_toolbox_node：",[20,526,527],{},"与同步节点不同，这是一个异步节点，可以立即处理已接收的数据，减小延迟，提高响应速度。但异步处理可能导致数据不完全同步，定位和建图结果可能不如同步方式准确。因此，它更适合对实时性要求高、对数据一致性和准确性要求相对较低的场景。",[20,529,530],{},"在选择使用sync_slam_toolbox_node还是async_slam_toolbox_node时，需根据应用需求和环境权衡。若实时性关键且能接受一定定位或建图误差，选择async_slam_toolbox_node。若对数据一致性和准确性要求较高，且实时性非首要考虑，则选择sync_slam_toolbox_node。另外二者的主要区别在于数据处理的方式，而两个节点发布的话题、订阅的话题、发布的服务以及使用的参数等都是一样的。",[314,532,533],{},[51,534,535],{},"订阅的话题",[537,538,539,556],"table",{},[540,541,542],"thead",{},[543,544,545,550,553],"tr",{},[546,547,549],"th",{"align":548},"left","话题",[546,551,552],{"align":548},"类型",[546,554,555],{"align":548},"描述",[557,558,559,571],"tbody",{},[543,560,561,565,568],{},[562,563,564],"td",{"align":548},"\u002Fscan",[562,566,567],{"align":548},"sensor_msgs\u002Fmsg\u002FLaserScan",[562,569,570],{"align":548},"来自激光雷达输入的扫描数据",[543,572,573,576,579],{},[562,574,575],{"align":548},"\u002Ftf",[562,577,578],{"align":548},"tf2_msgs\u002Fmsg\u002FTFMessage",[562,580,581],{"align":548},"配置的odom_frame到base_frame的转换",[20,583,584],{},"虽然不订阅\u002Fodom,但是需要发布\u002Fodom,以改变坐标。",[537,586,587,600],{},[540,588,589],{},[543,590,591,594,597],{},[546,592,593],{"align":548},"特性",[546,595,596],{"align":548},"slam_toolbox",[546,598,599],{"align":548},"hector_slam",[557,601,602,613,624,635,646,655],{},[543,603,604,607,610],{},[562,605,606],{"align":548},"地图精度",[562,608,609],{"align":548},"高",[562,611,612],{"align":548},"中",[543,614,615,618,621],{},[562,616,617],{"align":548},"实时性",[562,619,620],{"align":548},"较好，但依赖优化（回环检测）",[562,622,623],{"align":548},"极高",[543,625,626,629,632],{},[562,627,628],{"align":548},"依赖数据",[562,630,631],{"align":548},"激光雷达、TF 树、里程计",[562,633,634],{"align":548},"激光雷达（可选 IMU）",[543,636,637,640,643],{},[562,638,639],{"align":548},"回环检测",[562,641,642],{"align":548},"支持",[562,644,645],{"align":548},"不支持",[543,647,648,651,653],{},[562,649,650],{"align":548},"长期运行",[562,652,642],{"align":548},[562,654,645],{"align":548},[543,656,657,660,663],{},[562,658,659],{"align":548},"适用场景",[562,661,662],{"align":548},"动态导航、复杂环境",[562,664,665],{"align":548},"简单环境，或无里程计时",[314,667,668],{"start":116},[51,669,670],{},"发布的话题",[537,672,673,683],{},[540,674,675],{},[543,676,677,679,681],{},[546,678,549],{"align":548},[546,680,552],{"align":548},[546,682,555],{"align":548},[557,684,685,696],{},[543,686,687,690,693],{},[562,688,689],{"align":548},"\u002Fmap",[562,691,692],{"align":548},"nav_msgs\u002Fmsg\u002FOccupancyGrid",[562,694,695],{"align":548},"pose-graph（姿态图）在特定的更新频率（map_update_interval）下的占用栅格表示。",[543,697,698,701,704],{},[562,699,700],{"align":548},"\u002Fpose",[562,702,703],{"align":548},"geometry_msgs\u002Fmsg\u002FPoseWithCovarianceStamped",[562,705,706],{"align":548},"配置的map_frame中base_frame的位姿以及根据扫描匹配计算的协方差",[314,708,709],{"start":138},[51,710,711],{},"发布的服务",[537,713,714,724],{},[540,715,716],{},[543,717,718,720,722],{},[546,719,549],{"align":548},[546,721,552],{"align":548},[546,723,555],{"align":548},[557,725,726,737,748,759,770,781,792,803,814],{},[543,727,728,731,734],{},[562,729,730],{"align":548},"\u002Fslam_toolbox\u002Fclear_changes",[562,732,733],{"align":548},"slam_toolbox\u002Fsrv\u002FClear",[562,735,736],{"align":548},"清除所有待处理的手动位姿图操作的更改",[543,738,739,742,745],{},[562,740,741],{"align":548},"\u002Fslam_toolbox\u002Fdeserialize_map",[562,743,744],{"align":548},"slam_toolbox\u002Fsrv\u002FDeserializePoseGraph",[562,746,747],{"align":548},"从磁盘加载保存的序列化位姿图文件",[543,749,750,753,756],{},[562,751,752],{"align":548},"\u002Fslam_toolbox\u002Fdynamic_map",[562,754,755],{"align":548},"nav_msgs\u002FOccupancyGrid",[562,757,758],{"align":548},"请求位姿图的当前状态作为占用网格",[543,760,761,764,767],{},[562,762,763],{"align":548},"\u002Fslam_toolbox\u002Fmanual_loop_closure",[562,765,766],{"align":548},"slam_toolbox\u002Fsrv\u002FLoopClosure",[562,768,769],{"align":548},"请求对位姿图进行手动更改",[543,771,772,775,778],{},[562,773,774],{"align":548},"\u002Fslam_toolbox\u002Fpause_new_measurements",[562,776,777],{"align":548},"slam_toolbox\u002Fsrv\u002FPause",[562,779,780],{"align":548},"暂停处理新传入的激光扫描",[543,782,783,786,789],{},[562,784,785],{"align":548},"\u002Fslam_toolbox\u002Fsave_map",[562,787,788],{"align":548},"slam_toolbox\u002Fsrv\u002FSaveMap",[562,790,791],{"align":548},"保存可用于显示 AMCL 定位的地图图像文件。",[543,793,794,797,800],{},[562,795,796],{"align":548},"\u002Fslam_toolbox\u002Fserialize_map",[562,798,799],{"align":548},"slam_toolbox\u002Fsrv\u002FSerializePoseGraph",[562,801,802],{"align":548},"保存地图位姿图和数据，可用于继续建图、slam_toolbox 定位、离线操作等",[543,804,805,808,811],{},[562,806,807],{"align":548},"\u002Fslam_toolbox\u002Ftoggle_interactive_mode",[562,809,810],{"align":548},"slam_toolbox\u002Fsrv\u002FToggleInteractive",[562,812,813],{"align":548},"在交互模式与非交互模式之间切换，发布节点的交互式标记及其位置，以便在应用程序中进行更新",[543,815,816,819,822],{},[562,817,818],{"align":548},"\u002Fslam_toolbox\u002Freset",[562,820,821],{"align":548},"slam_toolbox\u002Fsrv\u002FReset",[562,823,824],{"align":548},"将当前地图重置回初始状态",[314,826,827],{"start":145},[51,828,829,830],{},"参数",[314,831,832],{},[51,833,834],{},"求解器参数",[48,836,837,843,849,855,861,867,873,884,890,896,902,908,914,920,926,932,938,944,950,956,962,968,974,980,986,992,998,1004,1010,1016,1027,1033,1039,1045,1051,1057,1063,1069,1075,1081,1087,1093,1099,1105,1111,1117,1123,1129,1135,1140,1146,1151,1157,1163,1169,1175,1181],{},[51,838,839,842],{},[23,840,841],{},"solver_plugin","  用于 karto 扫描解算器的非线性解算器类型。选项：solver_plugins::CeresSolver, - solver_plugins::SpaSolver, solver_plugins::G2oSolver. Default: solver_plugins::CeresSolver.",[51,844,845,848],{},[23,846,847],{},"ceres_linear_solver","  Ceres 使用的线性求解器。选项：SPARSE_NORMAL_CHOLESKY、SPARSE_SCHUR、ITERATIVE_SCHUR、CGNR。默认为 SPARSE_NORMAL_CHOLESKY。",[51,850,851,854],{},[23,852,853],{},"ceres_preconditioner","  与该求解器一起使用的预处理器。选项：JACOBI、IDENTITY（none）、SCHUR_JACOBI。默认为JACOBI。",[51,856,857,860],{},[23,858,859],{},"ceres_trust_strategy","  信任区域策略。行搜索策略没有公开，因为它们对于这种用途表现不佳。选项：LEVENBERG_MARQUARDT、DOGLEG。默认值：LEVENBERG_MARQUARDT。",[51,862,863,866],{},[23,864,865],{},"ceres_dogleg_type","  如果信任策略是 DOGLEG，则使用dogleg策略。选项：TRADITIONAL_DOGLEG、SUBSPACE_DOGLEG。默认值：TRADITIONAL_DOGLEG",[51,868,869,872],{},[23,870,871],{},"ceres_loss_function","  拒绝异常值的损失函数类型。没有一个等于损失平方。选项：None、HuberLoss、CauchyLoss。默认值：None。",[51,874,875,878,879],{},[23,876,877],{},"mode","  “建图”或“定位”模式，用于 Ceres 问题创建中的性能优化",[48,880,881],{},[51,882,883],{},"Toolbox参数",[51,885,886,889],{},[23,887,888],{},"odom_frame","  里程计坐标系",[51,891,892,895],{},[23,893,894],{},"map_frame","  地图坐标系",[51,897,898,901],{},[23,899,900],{},"base_frame","  基坐标系",[51,903,904,907],{},[23,905,906],{},"scan_topic","  扫描主题名， 注意是\u002Fscan 不是scan",[51,909,910,913],{},[23,911,912],{},"scan_queue_size","  扫描消息对队列长度。在异步模式下应始终设置为 1",[51,915,916,919],{},[23,917,918],{},"use_map_saver","  实例化地图服务程序并自行订阅map主题",[51,921,922,925],{},[23,923,924],{},"map_file_name","  启动时加载的位姿图文件的名称（如果可用）",[51,927,928,931],{},[23,929,930],{},"map_start_pose","  启动建图\u002F定位时的位姿（如果可用）",[51,933,934,937],{},[23,935,936],{},"map_start_at_dock","  在dock（第一个节点）处启动姿势图加载（如果可用）。如果同时设置了pose和dock，优先使用pose",[51,939,940,943],{},[23,941,942],{},"debug_logging","  更改日志以进行调试",[51,945,946,949],{},[23,947,948],{},"throttle_scans","  在同步模式下限制的扫描次数",[51,951,952,955],{},[23,953,954],{},"transform_publish_period","  里程计odom变换发布周期。 0 不会发布变换。",[51,957,958,961],{},[23,959,960],{},"map_update_interval","  更新 2D 占用地图的时间间隔",[51,963,964,967],{},[23,965,966],{},"enable_interactive_mode","  是否允许启用交互模式。交互模式将保留映射到其 ID 的激光扫描缓存，以便在交互模式下进行可视化。结果，该进程的内存将会增加。在定位和长期建图模式下可以手动禁用此功能，因为它们会随着时间的推移增加内存利用率。对于建图或连续建图模式均有效。",[51,969,970,973],{},[23,971,972],{},"position_covariance_scale","  从扫描匹配发布姿势时缩放位置协方差的量。这可用于调整下游定位滤波器中位姿的影响。协方差表示测量的不确定性，因此扩大协方差将减小位姿对下游滤波器的影响。默认值：1.0",[51,975,976,979],{},[23,977,978],{},"yaw_covariance_scale","  从扫描匹配发布位姿时缩放偏航协方差的量。请参阅position_covariance_scale 的描述。默认值：1.0",[51,981,982,985],{},[23,983,984],{},"resolution","  生成的 2D 占用图的分辨率",[51,987,988,991],{},[23,989,990],{},"max_laser_range","  用于 2D 占用地图光栅化的最大激光范围",[51,993,994,997],{},[23,995,996],{},"minimum_time_interval","  在同步模式下处理的扫描之间的最短持续时间",[51,999,1000,1003],{},[23,1001,1002],{},"transform_timeout","  查找转换 TF 超时时间限制",[51,1005,1006,1009],{},[23,1007,1008],{},"tf_buffer_duration","  存储 TF 消息以供查询的时间。如果在同步模式下以倍速脱机运行，则设置高一些。",[51,1011,1012,1015],{},[23,1013,1014],{},"stack_size_to_use","  将堆栈大小重置为的字节数，以启用文件的序列化\u002F反序列化。自由默认值为 40000000，但越少越好。",[51,1017,1018,1021,1022],{},[23,1019,1020],{},"minimum_travel_distance","  处理新扫描之前的最小行进距离",[48,1023,1024],{},[51,1025,1026],{},"匹配器参数",[51,1028,1029,1032],{},[23,1030,1031],{},"use_scan_matching","  是否使用扫描匹配来优化里程位姿",[51,1034,1035,1038],{},[23,1036,1037],{},"use_scan_barycenter","  是否使用重心或扫描位姿",[51,1040,1041,1044],{},[23,1042,1043],{},"minimum_travel_heading","  合理更新的最小航向变化",[51,1046,1047,1050],{},[23,1048,1049],{},"scan_buffer_size","  缓冲到链中的扫描次数，也用作定位模式循环缓冲区中的扫描次数",[51,1052,1053,1056],{},[23,1054,1055],{},"scan_buffer_maximum_scan_distance","  从缓冲区中删除之前扫描，距离之前位姿的最大距离",[51,1058,1059,1062],{},[23,1060,1061],{},"link_match_minimum_response_fine","  精细分辨率通过的阈值链接匹配算法响应",[51,1064,1065,1068],{},[23,1066,1067],{},"link_scan_maximum_distance","  有效链接扫描之间的最大距离",[51,1070,1071,1074],{},[23,1072,1073],{},"Loop_search_maximum_distance","  循环闭合时考虑的扫描距离的最大阈值",[51,1076,1077,1080],{},[23,1078,1079],{},"do_loop_close","  是否进行循环闭合（如果不确定，答案是“true”）",[51,1082,1083,1086],{},[23,1084,1085],{},"Loop_match_minimum_chain_size","  寻找循环闭合的扫描的最小链长度",[51,1088,1089,1092],{},[23,1090,1091],{},"Loop_match_maximum_variance_coarse","  粗略搜索中传递给细化的阈值方差",[51,1094,1095,1098],{},[23,1096,1097],{},"Loop_match_minimum_response_coarse","  粗略搜索中环路闭合算法的阈值响应要传递给细化",[51,1100,1101,1104],{},[23,1102,1103],{},"Loop_match_minimum_response_fine","  精细搜索中循环闭合算法的阈值响应传递给细化",[51,1106,1107,1110],{},[23,1108,1109],{},"correlation_search_space_dimension"," 搜索网格大小以进行扫描相关性",[51,1112,1113,1116],{},[23,1114,1115],{},"correlation_search_space_resolution","  搜索网格分辨率以进行扫描相关性",[51,1118,1119,1122],{},[23,1120,1121],{},"correlation_search_space_smear_deviation","  用于平滑响应的多模态涂抹量",[51,1124,1125,1128],{},[23,1126,1127],{},"loop_search_space_dimension","  循环闭合算法的搜索网格的大小",[51,1130,1131,1134],{},[23,1132,1133],{},"loop_search_space_resolution","  搜索网格分辨率以进行循环闭合",[51,1136,1137,1122],{},[23,1138,1139],{},"loop_search_space_smear_deviation",[51,1141,1142,1145],{},[23,1143,1144],{},"distance_variance_penalty","  应用于匹配扫描的惩罚，因为它与里程姿势不同",[51,1147,1148,1145],{},[23,1149,1150],{},"angle_variance_penalty",[51,1152,1153,1156],{},[23,1154,1155],{},"fine_search_angle_offset","  用于测试精细扫描匹配的角度范围",[51,1158,1159,1162],{},[23,1160,1161],{},"rough_search_angle_offset","  用于测试粗略扫描匹配的角度范围",[51,1164,1165,1168],{},[23,1166,1167],{},"coarse_angle_resolution","  在扫描匹配中测试的偏移范围内的角度分辨率",[51,1170,1171,1174],{},[23,1172,1173],{},"minimum_angle_penalty","  确保尺寸不会膨胀的最小惩罚角度",[51,1176,1177,1180],{},[23,1178,1179],{},"minimum_distance_penalty","  扫描可以确保大小不会爆炸的最小惩罚",[51,1182,1183,1186],{},[23,1184,1185],{},"use_response_expansion","  如果没有找到可行的匹配，是否自动增加搜索网格大小",[16,1188,1189],{"id":1189},"slam_toolbox基本使用",[314,1191,1192],{},[51,1193,1194],{},"准备工作",[20,1196,1197],{},"在src目录下，请先调用如下指令在工作空间的src目录下创建一个功能包：",[70,1199,1201],{"className":72,"code":1200,"language":74,"meta":34,"style":34},"ros2 pkg create mycar_slam_slam_toolbox --dependencies slam_toolbox\n",[76,1202,1203],{"__ignoreMap":34},[79,1204,1205,1208,1211,1214,1217,1221],{"class":81,"line":82},[79,1206,1207],{"class":85},"ros2",[79,1209,1210],{"class":89}," pkg",[79,1212,1213],{"class":89}," create",[79,1215,1216],{"class":89}," mycar_slam_slam_toolbox",[79,1218,1220],{"class":1219},"sj4cs"," --dependencies",[79,1222,1223],{"class":89}," slam_toolbox\n",[314,1225,1226],{"start":116},[51,1227,1228],{},"编写launch文件与参数文件",[20,1230,1231,1232,1235],{},"在功能包下，新建launch目录和params目录，launch目录下新建",[76,1233,1234],{},"online_sync_launch.py","文件并输入如下内容：",[70,1237,1241],{"className":1238,"code":1239,"language":1240,"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,1242,1243,1251,1255,1268,1280,1292,1304,1316,1320,1331,1348,1363,1368,1379,1388,1402,1415,1425,1433,1449,1463,1475,1480,1491,1502,1508,1519,1525,1538,1551,1563,1576,1581,1592,1597,1603,1609,1615,1620],{"__ignoreMap":34},[79,1244,1245,1248],{"class":81,"line":82},[79,1246,1247],{"class":99},"import",[79,1249,1250],{"class":106}," os\n",[79,1252,1253],{"class":81,"line":116},[79,1254,142],{"emptyLinePlaceholder":141},[79,1256,1257,1260,1263,1265],{"class":81,"line":138},[79,1258,1259],{"class":99},"from",[79,1261,1262],{"class":106}," launch ",[79,1264,1247],{"class":99},[79,1266,1267],{"class":106}," LaunchDescription\n",[79,1269,1270,1272,1275,1277],{"class":81,"line":145},[79,1271,1259],{"class":99},[79,1273,1274],{"class":106}," launch.actions ",[79,1276,1247],{"class":99},[79,1278,1279],{"class":106}," DeclareLaunchArgument\n",[79,1281,1282,1284,1287,1289],{"class":81,"line":152},[79,1283,1259],{"class":99},[79,1285,1286],{"class":106}," launch.substitutions ",[79,1288,1247],{"class":99},[79,1290,1291],{"class":106}," LaunchConfiguration\n",[79,1293,1294,1296,1299,1301],{"class":81,"line":164},[79,1295,1259],{"class":99},[79,1297,1298],{"class":106}," launch_ros.actions ",[79,1300,1247],{"class":99},[79,1302,1303],{"class":106}," Node\n",[79,1305,1306,1308,1311,1313],{"class":81,"line":176},[79,1307,1259],{"class":99},[79,1309,1310],{"class":106}," ament_index_python.packages ",[79,1312,1247],{"class":99},[79,1314,1315],{"class":106}," get_package_share_directory\n",[79,1317,1318],{"class":81,"line":181},[79,1319,142],{"emptyLinePlaceholder":141},[79,1321,1322,1325,1328],{"class":81,"line":187},[79,1323,1324],{"class":99},"def",[79,1326,1327],{"class":85}," generate_launch_description",[79,1329,1330],{"class":106},"():\n",[79,1332,1333,1336,1339,1342,1345],{"class":81,"line":199},[79,1334,1335],{"class":106},"    use_sim_time ",[79,1337,1338],{"class":99},"=",[79,1340,1341],{"class":106}," LaunchConfiguration(",[79,1343,1344],{"class":89},"'use_sim_time'",[79,1346,1347],{"class":106},")\n",[79,1349,1351,1354,1356,1358,1361],{"class":81,"line":1350},11,[79,1352,1353],{"class":106},"    slam_params_file ",[79,1355,1338],{"class":99},[79,1357,1341],{"class":106},[79,1359,1360],{"class":89},"'slam_params_file'",[79,1362,1347],{"class":106},[79,1364,1366],{"class":81,"line":1365},12,[79,1367,142],{"emptyLinePlaceholder":141},[79,1369,1371,1374,1376],{"class":81,"line":1370},13,[79,1372,1373],{"class":106},"    declare_use_sim_time_argument ",[79,1375,1338],{"class":99},[79,1377,1378],{"class":106}," DeclareLaunchArgument(\n",[79,1380,1382,1385],{"class":81,"line":1381},14,[79,1383,1384],{"class":89},"        'use_sim_time'",[79,1386,1387],{"class":106},",\n",[79,1389,1391,1395,1397,1400],{"class":81,"line":1390},15,[79,1392,1394],{"class":1393},"s4XuR","        default_value",[79,1396,1338],{"class":99},[79,1398,1399],{"class":89},"'false'",[79,1401,1387],{"class":106},[79,1403,1405,1408,1410,1413],{"class":81,"line":1404},16,[79,1406,1407],{"class":1393},"        description",[79,1409,1338],{"class":99},[79,1411,1412],{"class":89},"'Use simulation\u002FGazebo clock'",[79,1414,1347],{"class":106},[79,1416,1418,1421,1423],{"class":81,"line":1417},17,[79,1419,1420],{"class":106},"    declare_slam_params_file_cmd ",[79,1422,1338],{"class":99},[79,1424,1378],{"class":106},[79,1426,1428,1431],{"class":81,"line":1427},18,[79,1429,1430],{"class":89},"        'slam_params_file'",[79,1432,1387],{"class":106},[79,1434,1436,1438,1440,1443,1446],{"class":81,"line":1435},19,[79,1437,1394],{"class":1393},[79,1439,1338],{"class":99},[79,1441,1442],{"class":106},"os.path.join(get_package_share_directory(",[79,1444,1445],{"class":89},"\"mycar_slam_slam_toolbox\"",[79,1447,1448],{"class":106},"),\n",[79,1450,1452,1455,1458,1461],{"class":81,"line":1451},20,[79,1453,1454],{"class":89},"                                   'params'",[79,1456,1457],{"class":106},", ",[79,1459,1460],{"class":89},"'mapper_params_online_sync.yaml'",[79,1462,1448],{"class":106},[79,1464,1466,1468,1470,1473],{"class":81,"line":1465},21,[79,1467,1407],{"class":1393},[79,1469,1338],{"class":99},[79,1471,1472],{"class":89},"'Full path to the ROS2 parameters file to use for the slam_toolbox node'",[79,1474,1347],{"class":106},[79,1476,1478],{"class":81,"line":1477},22,[79,1479,142],{"emptyLinePlaceholder":141},[79,1481,1483,1486,1488],{"class":81,"line":1482},23,[79,1484,1485],{"class":106},"    start_sync_slam_toolbox_node ",[79,1487,1338],{"class":99},[79,1489,1490],{"class":106}," Node(\n",[79,1492,1494,1497,1499],{"class":81,"line":1493},24,[79,1495,1496],{"class":1393},"        parameters",[79,1498,1338],{"class":99},[79,1500,1501],{"class":106},"[\n",[79,1503,1505],{"class":81,"line":1504},25,[79,1506,1507],{"class":106},"          slam_params_file,\n",[79,1509,1511,1514,1516],{"class":81,"line":1510},26,[79,1512,1513],{"class":106},"          {",[79,1515,1344],{"class":89},[79,1517,1518],{"class":106},": use_sim_time}\n",[79,1520,1522],{"class":81,"line":1521},27,[79,1523,1524],{"class":106},"        ],\n",[79,1526,1528,1531,1533,1536],{"class":81,"line":1527},28,[79,1529,1530],{"class":1393},"        package",[79,1532,1338],{"class":99},[79,1534,1535],{"class":89},"'slam_toolbox'",[79,1537,1387],{"class":106},[79,1539,1541,1544,1546,1549],{"class":81,"line":1540},29,[79,1542,1543],{"class":1393},"        executable",[79,1545,1338],{"class":99},[79,1547,1548],{"class":89},"'sync_slam_toolbox_node'",[79,1550,1387],{"class":106},[79,1552,1554,1557,1559,1561],{"class":81,"line":1553},30,[79,1555,1556],{"class":1393},"        name",[79,1558,1338],{"class":99},[79,1560,1535],{"class":89},[79,1562,1387],{"class":106},[79,1564,1566,1569,1571,1574],{"class":81,"line":1565},31,[79,1567,1568],{"class":1393},"        output",[79,1570,1338],{"class":99},[79,1572,1573],{"class":89},"'screen'",[79,1575,1347],{"class":106},[79,1577,1579],{"class":81,"line":1578},32,[79,1580,142],{"emptyLinePlaceholder":141},[79,1582,1584,1587,1589],{"class":81,"line":1583},33,[79,1585,1586],{"class":106},"    ld ",[79,1588,1338],{"class":99},[79,1590,1591],{"class":106}," LaunchDescription()\n",[79,1593,1595],{"class":81,"line":1594},34,[79,1596,142],{"emptyLinePlaceholder":141},[79,1598,1600],{"class":81,"line":1599},35,[79,1601,1602],{"class":106},"    ld.add_action(declare_use_sim_time_argument)\n",[79,1604,1606],{"class":81,"line":1605},36,[79,1607,1608],{"class":106},"    ld.add_action(declare_slam_params_file_cmd)\n",[79,1610,1612],{"class":81,"line":1611},37,[79,1613,1614],{"class":106},"    ld.add_action(start_sync_slam_toolbox_node)\n",[79,1616,1618],{"class":81,"line":1617},38,[79,1619,142],{"emptyLinePlaceholder":141},[79,1621,1623,1626],{"class":81,"line":1622},39,[79,1624,1625],{"class":99},"    return",[79,1627,1628],{"class":106}," ld\n",[20,1630,1631,1632,1635,1636,1638],{},"该launch文件主要是加载了slam_toolbox下的sync_slam_toolbox_node节点，并且会从当前功能包的params下读取一个名为",[76,1633,1634],{},"mapper_params_online_sync.yaml","的配置文件。这个配置文件还不存在，接下来需要在params目录下新建",[76,1637,1634],{},"文件，并输入如下内容：",[70,1640,1644],{"className":1641,"code":1642,"language":1643,"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,1645,1646,1654,1661,1672,1682,1692,1702,1712,1722,1726,1736,1746,1756,1766,1779,1783,1788,1793,1798,1802,1812,1822,1835,1845,1855,1867,1877,1887,1897,1909,1919,1923,1932,1941,1951,1960,1970,1980,1993,2003,2014,2027,2041,2054,2068,2079,2084,2094,2105,2117,2122,2133,2143,2154,2159,2173,2186,2191,2205,2219,2233,2244,2254],{"__ignoreMap":34},[79,1647,1648,1651],{"class":81,"line":82},[79,1649,596],{"class":1650},"s9eBZ",[79,1652,1653],{"class":106},":\n",[79,1655,1656,1659],{"class":81,"line":116},[79,1657,1658],{"class":1650},"  ros__parameters",[79,1660,1653],{"class":106},[79,1662,1663,1666,1669],{"class":81,"line":138},[79,1664,1665],{"class":1650},"    solver_plugin",[79,1667,1668],{"class":106},": ",[79,1670,1671],{"class":89},"solver_plugins::CeresSolver\n",[79,1673,1674,1677,1679],{"class":81,"line":145},[79,1675,1676],{"class":1650},"    ceres_linear_solver",[79,1678,1668],{"class":106},[79,1680,1681],{"class":89},"SPARSE_NORMAL_CHOLESKY\n",[79,1683,1684,1687,1689],{"class":81,"line":152},[79,1685,1686],{"class":1650},"    ceres_preconditioner",[79,1688,1668],{"class":106},[79,1690,1691],{"class":89},"SCHUR_JACOBI\n",[79,1693,1694,1697,1699],{"class":81,"line":164},[79,1695,1696],{"class":1650},"    ceres_trust_strategy",[79,1698,1668],{"class":106},[79,1700,1701],{"class":89},"LEVENBERG_MARQUARDT\n",[79,1703,1704,1707,1709],{"class":81,"line":176},[79,1705,1706],{"class":1650},"    ceres_dogleg_type",[79,1708,1668],{"class":106},[79,1710,1711],{"class":89},"TRADITIONAL_DOGLEG\n",[79,1713,1714,1717,1719],{"class":81,"line":181},[79,1715,1716],{"class":1650},"    ceres_loss_function",[79,1718,1668],{"class":106},[79,1720,1721],{"class":89},"None\n",[79,1723,1724],{"class":81,"line":187},[79,1725,142],{"emptyLinePlaceholder":141},[79,1727,1728,1731,1733],{"class":81,"line":199},[79,1729,1730],{"class":1650},"    odom_frame",[79,1732,1668],{"class":106},[79,1734,1735],{"class":89},"odom\n",[79,1737,1738,1741,1743],{"class":81,"line":1350},[79,1739,1740],{"class":1650},"    map_frame",[79,1742,1668],{"class":106},[79,1744,1745],{"class":89},"map\n",[79,1747,1748,1751,1753],{"class":81,"line":1365},[79,1749,1750],{"class":1650},"    base_frame",[79,1752,1668],{"class":106},[79,1754,1755],{"class":89},"base_link\n",[79,1757,1758,1761,1763],{"class":81,"line":1370},[79,1759,1760],{"class":1650},"    scan_topic",[79,1762,1668],{"class":106},[79,1764,1765],{"class":89},"\u002Fscan\n",[79,1767,1768,1771,1773,1776],{"class":81,"line":1381},[79,1769,1770],{"class":1650},"    mode",[79,1772,1668],{"class":106},[79,1774,1775],{"class":89},"mapping",[79,1777,1778],{"class":148}," #localization\n",[79,1780,1781],{"class":81,"line":1390},[79,1782,142],{"emptyLinePlaceholder":141},[79,1784,1785],{"class":81,"line":1404},[79,1786,1787],{"class":148},"    #map_file_name: test_steve\n",[79,1789,1790],{"class":81,"line":1417},[79,1791,1792],{"class":148},"    #map_start_pose: [0.0, 0.0, 0.0]\n",[79,1794,1795],{"class":81,"line":1427},[79,1796,1797],{"class":148},"    #map_start_at_dock: true\n",[79,1799,1800],{"class":81,"line":1435},[79,1801,142],{"emptyLinePlaceholder":141},[79,1803,1804,1807,1809],{"class":81,"line":1451},[79,1805,1806],{"class":1650},"    debug_logging",[79,1808,1668],{"class":106},[79,1810,1811],{"class":1219},"false\n",[79,1813,1814,1817,1819],{"class":81,"line":1465},[79,1815,1816],{"class":1650},"    throttle_scans",[79,1818,1668],{"class":106},[79,1820,1821],{"class":1219},"1\n",[79,1823,1824,1827,1829,1832],{"class":81,"line":1477},[79,1825,1826],{"class":1650},"    transform_publish_period",[79,1828,1668],{"class":106},[79,1830,1831],{"class":1219},"0.02",[79,1833,1834],{"class":106}," \n",[79,1836,1837,1840,1842],{"class":81,"line":1482},[79,1838,1839],{"class":1650},"    map_update_interval",[79,1841,1668],{"class":106},[79,1843,1844],{"class":1219},"2.0\n",[79,1846,1847,1850,1852],{"class":81,"line":1493},[79,1848,1849],{"class":1650},"    resolution",[79,1851,1668],{"class":106},[79,1853,1854],{"class":1219},"0.05\n",[79,1856,1857,1860,1862,1865],{"class":81,"line":1504},[79,1858,1859],{"class":1650},"    max_laser_range",[79,1861,1668],{"class":106},[79,1863,1864],{"class":1219},"20.0",[79,1866,1834],{"class":106},[79,1868,1869,1872,1874],{"class":81,"line":1510},[79,1870,1871],{"class":1650},"    minimum_time_interval",[79,1873,1668],{"class":106},[79,1875,1876],{"class":1219},"0.5\n",[79,1878,1879,1882,1884],{"class":81,"line":1521},[79,1880,1881],{"class":1650},"    transform_timeout",[79,1883,1668],{"class":106},[79,1885,1886],{"class":1219},"0.2\n",[79,1888,1889,1892,1894],{"class":81,"line":1527},[79,1890,1891],{"class":1650},"    tf_buffer_duration",[79,1893,1668],{"class":106},[79,1895,1896],{"class":1219},"30.0\n",[79,1898,1899,1902,1904,1907],{"class":81,"line":1540},[79,1900,1901],{"class":1650},"    stack_size_to_use",[79,1903,1668],{"class":106},[79,1905,1906],{"class":1219},"40000000",[79,1908,1834],{"class":106},[79,1910,1911,1914,1916],{"class":81,"line":1553},[79,1912,1913],{"class":1650},"    enable_interactive_mode",[79,1915,1668],{"class":106},[79,1917,1918],{"class":1219},"true\n",[79,1920,1921],{"class":81,"line":1565},[79,1922,142],{"emptyLinePlaceholder":141},[79,1924,1925,1928,1930],{"class":81,"line":1578},[79,1926,1927],{"class":1650},"    use_scan_matching",[79,1929,1668],{"class":106},[79,1931,1918],{"class":1219},[79,1933,1934,1937,1939],{"class":81,"line":1583},[79,1935,1936],{"class":1650},"    use_scan_barycenter",[79,1938,1668],{"class":106},[79,1940,1918],{"class":1219},[79,1942,1943,1946,1948],{"class":81,"line":1594},[79,1944,1945],{"class":1650},"    minimum_travel_distance",[79,1947,1668],{"class":106},[79,1949,1950],{"class":1219},"0.1\n",[79,1952,1953,1956,1958],{"class":81,"line":1599},[79,1954,1955],{"class":1650},"    minimum_travel_heading",[79,1957,1668],{"class":106},[79,1959,1950],{"class":1219},[79,1961,1962,1965,1967],{"class":81,"line":1605},[79,1963,1964],{"class":1650},"    scan_buffer_size",[79,1966,1668],{"class":106},[79,1968,1969],{"class":1219},"100\n",[79,1971,1972,1975,1977],{"class":81,"line":1611},[79,1973,1974],{"class":1650},"    scan_buffer_maximum_scan_distance",[79,1976,1668],{"class":106},[79,1978,1979],{"class":1219},"10.0\n",[79,1981,1982,1985,1987,1990],{"class":81,"line":1617},[79,1983,1984],{"class":1650},"    link_match_minimum_response_fine",[79,1986,1668],{"class":106},[79,1988,1989],{"class":1219},"0.1",[79,1991,1992],{"class":106},"  \n",[79,1994,1995,1998,2000],{"class":81,"line":1622},[79,1996,1997],{"class":1650},"    link_scan_maximum_distance",[79,1999,1668],{"class":106},[79,2001,2002],{"class":1219},"1.5\n",[79,2004,2006,2009,2011],{"class":81,"line":2005},40,[79,2007,2008],{"class":1650},"    loop_search_maximum_distance",[79,2010,1668],{"class":106},[79,2012,2013],{"class":1219},"3.0\n",[79,2015,2017,2020,2022,2025],{"class":81,"line":2016},41,[79,2018,2019],{"class":1650},"    do_loop_closing",[79,2021,1668],{"class":106},[79,2023,2024],{"class":1219},"true",[79,2026,1834],{"class":106},[79,2028,2030,2033,2035,2038],{"class":81,"line":2029},42,[79,2031,2032],{"class":1650},"    loop_match_minimum_chain_size",[79,2034,1668],{"class":106},[79,2036,2037],{"class":1219},"10",[79,2039,2040],{"class":106},"           \n",[79,2042,2044,2047,2049,2052],{"class":81,"line":2043},43,[79,2045,2046],{"class":1650},"    loop_match_maximum_variance_coarse",[79,2048,1668],{"class":106},[79,2050,2051],{"class":1219},"3.0",[79,2053,1992],{"class":106},[79,2055,2057,2060,2062,2065],{"class":81,"line":2056},44,[79,2058,2059],{"class":1650},"    loop_match_minimum_response_coarse",[79,2061,1668],{"class":106},[79,2063,2064],{"class":1219},"0.35",[79,2066,2067],{"class":106},"    \n",[79,2069,2071,2074,2076],{"class":81,"line":2070},45,[79,2072,2073],{"class":1650},"    loop_match_minimum_response_fine",[79,2075,1668],{"class":106},[79,2077,2078],{"class":1219},"0.45\n",[79,2080,2082],{"class":81,"line":2081},46,[79,2083,142],{"emptyLinePlaceholder":141},[79,2085,2087,2090,2092],{"class":81,"line":2086},47,[79,2088,2089],{"class":1650},"    correlation_search_space_dimension",[79,2091,1668],{"class":106},[79,2093,1876],{"class":1219},[79,2095,2097,2100,2102],{"class":81,"line":2096},48,[79,2098,2099],{"class":1650},"    correlation_search_space_resolution",[79,2101,1668],{"class":106},[79,2103,2104],{"class":1219},"0.01\n",[79,2106,2108,2111,2113,2115],{"class":81,"line":2107},49,[79,2109,2110],{"class":1650},"    correlation_search_space_smear_deviation",[79,2112,1668],{"class":106},[79,2114,1989],{"class":1219},[79,2116,1834],{"class":106},[79,2118,2120],{"class":81,"line":2119},50,[79,2121,142],{"emptyLinePlaceholder":141},[79,2123,2125,2128,2130],{"class":81,"line":2124},51,[79,2126,2127],{"class":1650},"    loop_search_space_dimension",[79,2129,1668],{"class":106},[79,2131,2132],{"class":1219},"8.0\n",[79,2134,2136,2139,2141],{"class":81,"line":2135},52,[79,2137,2138],{"class":1650},"    loop_search_space_resolution",[79,2140,1668],{"class":106},[79,2142,1854],{"class":1219},[79,2144,2146,2149,2151],{"class":81,"line":2145},53,[79,2147,2148],{"class":1650},"    loop_search_space_smear_deviation",[79,2150,1668],{"class":106},[79,2152,2153],{"class":1219},"0.03\n",[79,2155,2157],{"class":81,"line":2156},54,[79,2158,142],{"emptyLinePlaceholder":141},[79,2160,2162,2165,2167,2170],{"class":81,"line":2161},55,[79,2163,2164],{"class":1650},"    distance_variance_penalty",[79,2166,1668],{"class":106},[79,2168,2169],{"class":1219},"0.5",[79,2171,2172],{"class":106},"      \n",[79,2174,2176,2179,2181,2184],{"class":81,"line":2175},56,[79,2177,2178],{"class":1650},"    angle_variance_penalty",[79,2180,1668],{"class":106},[79,2182,2183],{"class":1219},"1.0",[79,2185,2067],{"class":106},[79,2187,2189],{"class":81,"line":2188},57,[79,2190,142],{"emptyLinePlaceholder":141},[79,2192,2194,2197,2199,2202],{"class":81,"line":2193},58,[79,2195,2196],{"class":1650},"    fine_search_angle_offset",[79,2198,1668],{"class":106},[79,2200,2201],{"class":1219},"0.00349",[79,2203,2204],{"class":106},"     \n",[79,2206,2208,2211,2213,2216],{"class":81,"line":2207},59,[79,2209,2210],{"class":1650},"    coarse_search_angle_offset",[79,2212,1668],{"class":106},[79,2214,2215],{"class":1219},"0.349",[79,2217,2218],{"class":106},"   \n",[79,2220,2222,2225,2227,2230],{"class":81,"line":2221},60,[79,2223,2224],{"class":1650},"    coarse_angle_resolution",[79,2226,1668],{"class":106},[79,2228,2229],{"class":1219},"0.0349",[79,2231,2232],{"class":106},"        \n",[79,2234,2236,2239,2241],{"class":81,"line":2235},61,[79,2237,2238],{"class":1650},"    minimum_angle_penalty",[79,2240,1668],{"class":106},[79,2242,2243],{"class":1219},"0.9\n",[79,2245,2247,2250,2252],{"class":81,"line":2246},62,[79,2248,2249],{"class":1650},"    minimum_distance_penalty",[79,2251,1668],{"class":106},[79,2253,1876],{"class":1219},[79,2255,2257,2260,2262],{"class":81,"line":2256},63,[79,2258,2259],{"class":1650},"    use_response_expansion",[79,2261,1668],{"class":106},[79,2263,1918],{"class":1219},[20,2265,2266],{},"配置文件的内容需要根据实际情况进行动态调整。",[314,2268,2269],{"start":138},[51,2270,2271],{},"编辑配置文件",[20,2273,2274,2275,2278],{},"打开",[76,2276,2277],{},"CMakeLists.txt"," 并输入如下内容：",[70,2280,2284],{"className":2281,"code":2282,"language":2283,"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,2285,2286,2294,2302],{"__ignoreMap":34},[79,2287,2288,2291],{"class":81,"line":82},[79,2289,2290],{"class":99},"install",[79,2292,2293],{"class":106},"(DIRECTORY launch params\n",[79,2295,2296,2299],{"class":81,"line":116},[79,2297,2298],{"class":106},"  DESTINATION share\u002F",[79,2300,2301],{"class":99},"${PROJECT_NAME}\n",[79,2303,2304],{"class":81,"line":138},[79,2305,1347],{"class":106},[314,2307,2308],{"start":145},[51,2309,2310],{},"编译",[20,2312,2313],{},"终端中进入当前工作空间，编译功能包：",[70,2315,2317],{"className":72,"code":2316,"language":74,"meta":34,"style":34},"colcon build --packages-select mycar_slam_slam_toolbox\n",[76,2318,2319],{"__ignoreMap":34},[79,2320,2321,2324,2327,2330],{"class":81,"line":82},[79,2322,2323],{"class":85},"colcon",[79,2325,2326],{"class":89}," build",[79,2328,2329],{"class":1219}," --packages-select",[79,2331,2332],{"class":89}," mycar_slam_slam_toolbox\n",[314,2334,2335],{"start":152},[51,2336,2337,2338,2343,2369,2374,2399,2407,2410,2411,2414,2415,2418],{},"执行",[314,2339,2340],{},[51,2341,2342],{},"请先调用如下指令启动仿真环境：",[70,2344,2346],{"className":72,"code":2345,"language":74,"meta":34,"style":34},". install\u002Fsetup.bash\nros2 launch demo_gazebo_sim gazebo_sim_robot_world.launch.py\n",[76,2347,2348,2356],{"__ignoreMap":34},[79,2349,2350,2353],{"class":81,"line":82},[79,2351,2352],{"class":1219},".",[79,2354,2355],{"class":89}," install\u002Fsetup.bash\n",[79,2357,2358,2360,2363,2366],{"class":81,"line":116},[79,2359,1207],{"class":85},[79,2361,2362],{"class":89}," launch",[79,2364,2365],{"class":89}," demo_gazebo_sim",[79,2367,2368],{"class":89}," gazebo_sim_robot_world.launch.py\n",[314,2370,2371],{"start":138},[51,2372,2373],{},"然后在终端下进入当前工作空间，输入如下指令：",[70,2375,2377],{"className":72,"code":2376,"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,2378,2379,2385],{"__ignoreMap":34},[79,2380,2381,2383],{"class":81,"line":82},[79,2382,2352],{"class":1219},[79,2384,2355],{"class":89},[79,2386,2387,2389,2391,2393,2396],{"class":81,"line":116},[79,2388,1207],{"class":85},[79,2390,2362],{"class":89},[79,2392,1216],{"class":89},[79,2394,2395],{"class":89}," online_sync_launch.py",[79,2397,2398],{"class":89}," use_sim_time:=True\n",[314,2400,2401,2404],{"start":152},[51,2402,2403],{},"启动rviz2，将Fixed Frame设置为map，添加map插件并将话题设置为\u002Fmap，即可显示slam_toolbox创建的地图了，当机器人运动时，地图也会随之更新。",[51,2405,2406],{},"use_sim_time:=True参数表示使用仿真的时间。",[2408,2409],"br",{},"  最后需要说明的是，本节内容使用的是",[76,2412,2413],{},"sync_slam_toolbox_node"," 节点，即以同步方式建图，而异步建图节点",[76,2416,2417],{},"async_slam_toolbox_node"," 的使用与同步类似。",[20,2420,2421],{},[32,2422],{"alt":34,"src":2423},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1746.webp",[20,2425,2426],{},"我们用键盘控制节点去控制机器人跑满整张地图，",[20,2428,2429],{},[32,2430],{"alt":34,"src":2431},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1747.webp",[20,2433,2434],{},"黑色：障碍物",[20,2436,2437],{},"白色：无障碍物区",[20,2439,2440],{},"灰色：未知区",[20,2442,2443],{},"SLAM是建图与定位，以上就是建图，那么定位是啥呢？",[20,2445,2446],{},"定位就是Slam会发布一个\u002Ftf，这里面会包含机器人到map之间的坐标变换。",[20,2448,2449],{},"这个\u002Ftf发布的具体是map到odom的坐标变换，所以需要你自己去处理odom和base_link之间的坐标关系。",[20,2451,2452],{},[32,2453],{"alt":34,"src":2454},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1748.webp",[20,2456,2457],{},"这样的设计，可以让整条坐标树是一个链式结构，避免base_link或者base_foot_print出现两个父类，这样计算量会变大。",[20,2459,2460],{},[23,2461,2462],{},"注意事项：",[314,2464,2465],{},[51,2466,2467,2468],{},"突然烂图\n",[314,2469,2470,2473],{},[51,2471,2472],{},"如果你的环境很简单，那么跑图的时候可能会突然烂图，这个时候，大概率是do_loop_closing的问题，你把do_loop_closing设置成false再试试。\n这个东西是SLAM用激光检测形状来匹配之前走过的路，如果他匹配到的形状差不多他会把当前这段轨迹和以前的轨迹连起来，然后重新优化整张 pose graph，让地图整体更一致。\n主要是为了防止odom会漂，因为 odom 会漂，机器人最后回到起点时，SLAM 可能觉得位置差了几十厘米，但是可以通过激光雷达矫正。",[51,2474,2475],{},"在窄通道尽量直线过去，不要原地旋转等等，这种窄通道炸了大概率是scan matching相关参数的问题。",[16,2477,2478],{"id":2478},"cartographer概述",[20,2480,2481],{},[23,2482,25],{},[20,2484,2485],{},"Cartographer是Google推出的一套基于图优化的激光SLAM算法库，支持二维和三维地图的构建。它结合了激光雷达和惯性测量单元（IMU）的数据，通过高效的算法实现实时、准确的定位和建图。",[20,2487,2488],{},[23,2489,370],{},[48,2491,2492,2498,2504,2510,2515],{},[51,2493,2494,2497],{},[23,2495,2496],{},"并行扫描匹配"," 利用并行计算技术加快扫描匹配速度，提高建图效率。",[51,2499,2500,2503],{},[23,2501,2502],{},"位姿图优化"," 通过图优化技术估计机器人的姿态和地图的拓扑结构，减少累积误差。",[51,2505,2506,2509],{},[23,2507,2508],{},"实时地图更新"," 在机器人移动过程中实时更新地图，确保地图的准确性和时效性。",[51,2511,2512,2514],{},[23,2513,639],{}," 通过回环检测识别机器人曾经访问过的区域，进一步减少累积误差，提高地图的全局一致性。",[51,2516,2517,2520],{},[23,2518,2519],{},"多传感器融合"," 支持激光雷达、IMU、里程计等多种传感器数据的融合，提高定位和建图的精度。",[20,2522,399],{},[48,2524,2525,2531,2537,2543,2549],{},[51,2526,2527,2530],{},[23,2528,2529],{},"高效稳定"," Cartographer的算法经过精心设计和优化，能够在复杂环境中高效稳定地运行。",[51,2532,2533,2536],{},[23,2534,2535],{},"高精度"," 通过图优化和回环检测技术提供高精度的定位和建图结果。",[51,2538,2539,2542],{},[23,2540,2541],{},"灵活性"," 支持二维和三维地图构建，适应不同应用场景的需求。",[51,2544,2545,2548],{},[23,2546,2547],{},"开源免费"," Cartographer是开源项目，用户可以免费获取和使用其源代码和文档。",[51,2550,2551,2554],{},[23,2552,2553],{},"社区支持"," 拥有活跃的社区支持体系，用户可以获取来自全球开发者的帮助和支持。",[16,2556,2557],{"id":2557},"cartographer安装",[20,2559,2560],{},"借助于Ubuntu的包资源管理器，可以使用二进制的方式安装cartographer，安装指令如下：",[70,2562,2564],{"className":72,"code":2563,"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-humble-cartographer\nsudo apt install ros-humble-cartographer-ros\n#jazzy\nsudo apt install ros-jazzy-cartographer\nsudo apt install ros-jazzy-cartographer-ros\n",[76,2565,2566,2587,2608,2612,2617,2628,2639,2643,2654],{"__ignoreMap":34},[79,2567,2568,2570,2572,2574,2576,2578,2580,2582,2584],{"class":81,"line":82},[79,2569,86],{"class":85},[79,2571,90],{"class":89},[79,2573,93],{"class":89},[79,2575,96],{"class":89},[79,2577,100],{"class":99},[79,2579,103],{"class":89},[79,2581,107],{"class":106},[79,2583,110],{"class":99},[79,2585,2586],{"class":89},"-cartographer\n",[79,2588,2589,2591,2593,2595,2597,2599,2601,2603,2605],{"class":81,"line":116},[79,2590,86],{"class":85},[79,2592,90],{"class":89},[79,2594,93],{"class":89},[79,2596,96],{"class":89},[79,2598,100],{"class":99},[79,2600,103],{"class":89},[79,2602,107],{"class":106},[79,2604,110],{"class":99},[79,2606,2607],{"class":89},"-cartographer-ros\n",[79,2609,2610],{"class":81,"line":138},[79,2611,142],{"emptyLinePlaceholder":141},[79,2613,2614],{"class":81,"line":145},[79,2615,2616],{"class":148},"# humble\n",[79,2618,2619,2621,2623,2625],{"class":81,"line":152},[79,2620,86],{"class":85},[79,2622,90],{"class":89},[79,2624,93],{"class":89},[79,2626,2627],{"class":89}," ros-humble-cartographer\n",[79,2629,2630,2632,2634,2636],{"class":81,"line":164},[79,2631,86],{"class":85},[79,2633,90],{"class":89},[79,2635,93],{"class":89},[79,2637,2638],{"class":89}," ros-humble-cartographer-ros\n",[79,2640,2641],{"class":81,"line":176},[79,2642,488],{"class":148},[79,2644,2645,2647,2649,2651],{"class":81,"line":181},[79,2646,86],{"class":85},[79,2648,90],{"class":89},[79,2650,93],{"class":89},[79,2652,2653],{"class":89}," ros-jazzy-cartographer\n",[79,2655,2656,2658,2660,2662],{"class":81,"line":187},[79,2657,86],{"class":85},[79,2659,90],{"class":89},[79,2661,93],{"class":89},[79,2663,2664],{"class":89}," ros-jazzy-cartographer-ros\n",[20,2666,2667,2668,215],{},"上述两条安装指令中，前者用于安装cartographer的核心库，这个包不直接与ROS2集成，而是作为一个独立的算法库存在，为地图构建和定位提供底层的计算支持。后者则是cartographer在ROS2环境下的封装，它提供了与ROS2系统的接口，使得Cartographer算法能够在ROS2环境中运行。另外指令中的",[76,2669,214],{},[16,2671,2672],{"id":2672},"cartographer节点说明",[20,2674,2675,2676,2679,2680,2683],{},"在Cartographer框架中，",[76,2677,2678],{},"cartographer_node","和",[76,2681,2682],{},"cartographer_occupancy_grid_node","是两个关键的节点，它们各自承担着不同的角色和功能。详细介绍如下。",[339,2685,2686,2691,2694,2699],{},[20,2687,2688],{},[23,2689,2690],{},"cartographer_node：",[20,2692,2693],{},"主要负责订阅来自各种传感器的数据（如激光雷达、IMU、里程计等），并基于这些数据实时构建地图。它采用子图（submap）的方法来逐步构建和更新地图，确保定位的准确性和建图的实时性。",[20,2695,2696],{},[23,2697,2698],{},"cartographer_occupancy_grid_node：",[20,2700,2701,2702,2704,2705,2708],{},"该节点负责接收",[76,2703,2678],{},"发布的子图列表（",[76,2706,2707],{},"\u002Fsubmap_list","），并将其拼接成完整的栅格地图（occupancy grid map），然后发布这个地图。这个节点是地图生成的最终环节，它使得Cartographer能够输出人类可读且易于可视化的地图。",[20,2710,2711],{},"这两个节点的协同工作，前者负责实时构建和更新地图，后者则负责将子图拼接成完整的栅格地图并发布，使得Cartographer能够高效地实现SLAM功能。",[314,2713,2714],{},[51,2715,2716],{},"cartographer_node订阅的话题",[537,2718,2719,2729],{},[540,2720,2721],{},[543,2722,2723,2725,2727],{},[546,2724,549],{"align":548},[546,2726,552],{"align":548},[546,2728,555],{"align":548},[557,2730,2731,2739],{},[543,2732,2733,2735,2737],{},[562,2734,564],{"align":548},[562,2736,567],{"align":548},[562,2738,570],{"align":548},[543,2740,2741,2744,2747],{},[562,2742,2743],{"align":548},"\u002Fodom",[562,2745,2746],{"align":548},"nav_msgs\u002Fmsg\u002FOdometry",[562,2748,2749],{"align":548},"里程计消息",[314,2751,2752],{"start":116},[51,2753,2754],{},"cartographer_node发布的话题",[537,2756,2757,2767],{},[540,2758,2759],{},[543,2760,2761,2763,2765],{},[546,2762,549],{"align":548},[546,2764,552],{"align":548},[546,2766,555],{"align":548},[557,2768,2769,2780],{},[543,2770,2771,2774,2777],{},[562,2772,2773],{"align":548},"\u002Fscan_matched_points2",[562,2775,2776],{"align":548},"sensors_msgs\u002Fmsg\u002FPointCloud2",[562,2778,2779],{"align":548},"匹配好的点云数据，用于scan-to-submap matching",[543,2781,2782,2784,2787],{},[562,2783,2707],{"align":548},[562,2785,2786],{"align":548},"cartographer_ros_msgs\u002FSubmapList",[562,2788,2789],{"align":548},"发布构建好的子图列表",[314,2791,2792],{"start":138},[51,2793,2794],{},"cartographer_node发布的服务",[537,2796,2797,2807],{},[540,2798,2799],{},[543,2800,2801,2803,2805],{},[546,2802,549],{"align":548},[546,2804,552],{"align":548},[546,2806,555],{"align":548},[557,2808,2809,2820,2831,2842,2853,2864],{},[543,2810,2811,2814,2817],{},[562,2812,2813],{"align":548},"\u002Fsubmap_query",[562,2815,2816],{"align":548},"cartographer_ros_msgs\u002Fsrv\u002FSubmapQuery",[562,2818,2819],{"align":548},"提供查询子图的服务，获取到查询的子图",[543,2821,2822,2825,2828],{},[562,2823,2824],{"align":548},"\u002Fstart_trajectory",[562,2826,2827],{"align":548},"cartographer_ros_msgs\u002Fsrv\u002FStartTrajectory",[562,2829,2830],{"align":548},"开始一条轨迹",[543,2832,2833,2836,2839],{},[562,2834,2835],{"align":548},"\u002Ffinish_trajectory",[562,2837,2838],{"align":548},"cartographer_ros_msgs\u002Fsrv\u002FFinishTrajectory",[562,2840,2841],{"align":548},"结束一条给定ID的轨迹",[543,2843,2844,2847,2850],{},[562,2845,2846],{"align":548},"\u002Fwrite_state",[562,2848,2849],{"align":548},"cartographer_ros_msgs\u002Fsrv\u002FWriteState",[562,2851,2852],{"align":548},"将当前状态写入磁盘文件中",[543,2854,2855,2858,2861],{},[562,2856,2857],{"align":548},"\u002Fget_trajectory_states",[562,2859,2860],{"align":548},"cartographer_ros_msgs\u002Fsrv\u002FGetTrajectoryStates",[562,2862,2863],{"align":548},"获取指定轨迹的状态",[543,2865,2866,2869,2872],{},[562,2867,2868],{"align":548},"\u002Fread_metrics",[562,2870,2871],{"align":548},"cartographer_ros_msgs\u002Fsrv\u002FReadMetrics",[562,2873,2874],{"align":548},"读取性能指标",[314,2876,2877],{"start":145},[51,2878,2879],{},"cartographer_node参数",[20,2881,2882,2884],{},[76,2883,2678],{},"节点需要接收一个参数配置文件，该配置文件包含了地图构建、轨迹跟踪等所需的各项参数。",[314,2886,2887],{"start":152},[51,2888,2889],{},"cartographer_occupancy_grid_node订阅的话题",[537,2891,2892,2902],{},[540,2893,2894],{},[543,2895,2896,2898,2900],{},[546,2897,549],{"align":548},[546,2899,552],{"align":548},[546,2901,555],{"align":548},[557,2903,2904],{},[543,2905,2906,2908,2910],{},[562,2907,2707],{"align":548},[562,2909,2786],{"align":548},[562,2911,2912],{"align":548},"子图列表",[314,2914,2915],{"start":164},[51,2916,2917],{},"cartographer_occupancy_grid_node发布的话题",[537,2919,2920,2930],{},[540,2921,2922],{},[543,2923,2924,2926,2928],{},[546,2925,549],{"align":548},[546,2927,552],{"align":548},[546,2929,555],{"align":548},[557,2931,2932],{},[543,2933,2934,2936,2938],{},[562,2935,689],{"align":548},[562,2937,692],{"align":548},[562,2939,2940],{"align":548},"发布的栅格地图",[314,2942,2943],{"start":176},[51,2944,2945],{},"cartographer_occupancy_grid_node请求的服务",[537,2947,2948,2958],{},[540,2949,2950],{},[543,2951,2952,2954,2956],{},[546,2953,549],{"align":548},[546,2955,552],{"align":548},[546,2957,555],{"align":548},[557,2959,2960],{},[543,2961,2962,2964,2966],{},[562,2963,2813],{"align":548},[562,2965,2816],{"align":548},[562,2967,2968],{"align":548},"获取子图",[314,2970,2971],{"start":181},[51,2972,2973],{},"cartographer_occupancy_grid_node参数",[20,2975,2976,2978],{},[76,2977,2682],{},"节点需要配置地图的分辨率和更新周期等参数，以确保生成的栅格地图满足特定的精度和实时性要求。",[16,2980,2981],{"id":2981},"cartogarpher基本使用",[314,2983,2984],{},[51,2985,1194],{},[20,2987,1197],{},[70,2989,2991],{"className":72,"code":2990,"language":74,"meta":34,"style":34},"ros2 pkg create mycar_slam_cartographer --dependencies cartographer\n",[76,2992,2993],{"__ignoreMap":34},[79,2994,2995,2997,2999,3001,3004,3006],{"class":81,"line":82},[79,2996,1207],{"class":85},[79,2998,1210],{"class":89},[79,3000,1213],{"class":89},[79,3002,3003],{"class":89}," mycar_slam_cartographer",[79,3005,1220],{"class":1219},[79,3007,3008],{"class":89}," cartographer\n",[314,3010,3011],{"start":116},[51,3012,1228],{},[20,3014,1231,3015,1235],{},[76,3016,3017],{},"cartographer.launch.py",[70,3019,3021],{"className":1238,"code":3020,"language":1240,"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,3022,3023,3033,3043,3053,3063,3069,3079,3083,3091,3095,3120,3143,3147,3156,3167,3178,3197,3207,3226,3239,3248,3253,3257,3266,3276,3287,3295,3309,3321,3325,3329,3336,3341,3346,3351,3356],{"__ignoreMap":34},[79,3024,3025,3027,3029,3031],{"class":81,"line":82},[79,3026,1259],{"class":99},[79,3028,1262],{"class":106},[79,3030,1247],{"class":99},[79,3032,1267],{"class":106},[79,3034,3035,3037,3039,3041],{"class":81,"line":116},[79,3036,1259],{"class":99},[79,3038,1274],{"class":106},[79,3040,1247],{"class":99},[79,3042,1279],{"class":106},[79,3044,3045,3047,3049,3051],{"class":81,"line":138},[79,3046,1259],{"class":99},[79,3048,1286],{"class":106},[79,3050,1247],{"class":99},[79,3052,1291],{"class":106},[79,3054,3055,3057,3059,3061],{"class":81,"line":145},[79,3056,1259],{"class":99},[79,3058,1298],{"class":106},[79,3060,1247],{"class":99},[79,3062,1303],{"class":106},[79,3064,3065,3067],{"class":81,"line":152},[79,3066,1247],{"class":99},[79,3068,1250],{"class":106},[79,3070,3071,3073,3075,3077],{"class":81,"line":164},[79,3072,1259],{"class":99},[79,3074,1310],{"class":106},[79,3076,1247],{"class":99},[79,3078,1315],{"class":106},[79,3080,3081],{"class":81,"line":176},[79,3082,142],{"emptyLinePlaceholder":141},[79,3084,3085,3087,3089],{"class":81,"line":181},[79,3086,1324],{"class":99},[79,3088,1327],{"class":85},[79,3090,1330],{"class":106},[79,3092,3093],{"class":81,"line":187},[79,3094,142],{"emptyLinePlaceholder":141},[79,3096,3097,3100,3102,3105,3107,3109,3112,3115,3118],{"class":81,"line":199},[79,3098,3099],{"class":106},"    use_sim_time_arg ",[79,3101,1338],{"class":99},[79,3103,3104],{"class":106}," DeclareLaunchArgument(",[79,3106,1344],{"class":89},[79,3108,1457],{"class":106},[79,3110,3111],{"class":1393},"default_value",[79,3113,3114],{"class":99}," =",[79,3116,3117],{"class":89}," 'false'",[79,3119,1347],{"class":106},[79,3121,3122,3125,3127,3129,3132,3134,3136,3138,3141],{"class":81,"line":1350},[79,3123,3124],{"class":106},"    resolution_arg ",[79,3126,1338],{"class":99},[79,3128,3104],{"class":106},[79,3130,3131],{"class":89},"'resolution'",[79,3133,1457],{"class":106},[79,3135,3111],{"class":1393},[79,3137,1338],{"class":99},[79,3139,3140],{"class":89},"'0.05'",[79,3142,1347],{"class":106},[79,3144,3145],{"class":81,"line":1365},[79,3146,142],{"emptyLinePlaceholder":141},[79,3148,3149,3152,3154],{"class":81,"line":1370},[79,3150,3151],{"class":106},"    cartographer_node ",[79,3153,1338],{"class":99},[79,3155,1490],{"class":106},[79,3157,3158,3160,3162,3165],{"class":81,"line":1381},[79,3159,1530],{"class":1393},[79,3161,3114],{"class":99},[79,3163,3164],{"class":89}," 'cartographer_ros'",[79,3166,1387],{"class":106},[79,3168,3169,3171,3173,3176],{"class":81,"line":1390},[79,3170,1543],{"class":1393},[79,3172,3114],{"class":99},[79,3174,3175],{"class":89}," 'cartographer_node'",[79,3177,1387],{"class":106},[79,3179,3180,3182,3184,3187,3189,3192,3194],{"class":81,"line":1404},[79,3181,1496],{"class":1393},[79,3183,3114],{"class":99},[79,3185,3186],{"class":106}," [{",[79,3188,1344],{"class":89},[79,3190,3191],{"class":106},": LaunchConfiguration(",[79,3193,1344],{"class":89},[79,3195,3196],{"class":106},")}],\n",[79,3198,3199,3202,3204],{"class":81,"line":1417},[79,3200,3201],{"class":1393},"        arguments",[79,3203,3114],{"class":99},[79,3205,3206],{"class":106}," [\n",[79,3208,3209,3212,3215,3218,3221,3224],{"class":81,"line":1427},[79,3210,3211],{"class":89},"            '-configuration_directory'",[79,3213,3214],{"class":106},", os.path.join(get_package_share_directory(",[79,3216,3217],{"class":89},"\"mycar_slam_cartographer\"",[79,3219,3220],{"class":106},"),",[79,3222,3223],{"class":89},"\"params\"",[79,3225,1448],{"class":106},[79,3227,3228,3231,3233,3236],{"class":81,"line":1435},[79,3229,3230],{"class":89},"            '-configuration_basename'",[79,3232,1457],{"class":106},[79,3234,3235],{"class":89},"'mycar.lua'",[79,3237,3238],{"class":106},"],\n",[79,3240,3241,3243,3245],{"class":81,"line":1451},[79,3242,1568],{"class":1393},[79,3244,3114],{"class":99},[79,3246,3247],{"class":89}," 'screen'\n",[79,3249,3250],{"class":81,"line":1465},[79,3251,3252],{"class":106},"    )\n",[79,3254,3255],{"class":81,"line":1477},[79,3256,142],{"emptyLinePlaceholder":141},[79,3258,3259,3262,3264],{"class":81,"line":1482},[79,3260,3261],{"class":106},"    cartographer_occupancy_grid_node ",[79,3263,1338],{"class":99},[79,3265,1490],{"class":106},[79,3267,3268,3270,3272,3274],{"class":81,"line":1493},[79,3269,1530],{"class":1393},[79,3271,3114],{"class":99},[79,3273,3164],{"class":89},[79,3275,1387],{"class":106},[79,3277,3278,3280,3282,3285],{"class":81,"line":1504},[79,3279,1543],{"class":1393},[79,3281,3114],{"class":99},[79,3283,3284],{"class":89}," 'cartographer_occupancy_grid_node'",[79,3286,1387],{"class":106},[79,3288,3289,3291,3293],{"class":81,"line":1510},[79,3290,1496],{"class":1393},[79,3292,3114],{"class":99},[79,3294,3206],{"class":106},[79,3296,3297,3300,3302,3304,3306],{"class":81,"line":1521},[79,3298,3299],{"class":106},"            {",[79,3301,1344],{"class":89},[79,3303,3191],{"class":106},[79,3305,1344],{"class":89},[79,3307,3308],{"class":106},")},\n",[79,3310,3311,3313,3315,3317,3319],{"class":81,"line":1527},[79,3312,3299],{"class":106},[79,3314,3131],{"class":89},[79,3316,3191],{"class":106},[79,3318,3131],{"class":89},[79,3320,3196],{"class":106},[79,3322,3323],{"class":81,"line":1540},[79,3324,3252],{"class":106},[79,3326,3327],{"class":81,"line":1553},[79,3328,142],{"emptyLinePlaceholder":141},[79,3330,3331,3333],{"class":81,"line":1565},[79,3332,1625],{"class":99},[79,3334,3335],{"class":106}," LaunchDescription([\n",[79,3337,3338],{"class":81,"line":1578},[79,3339,3340],{"class":106},"        use_sim_time_arg,\n",[79,3342,3343],{"class":81,"line":1583},[79,3344,3345],{"class":106},"        resolution_arg,\n",[79,3347,3348],{"class":81,"line":1594},[79,3349,3350],{"class":106},"        cartographer_node,\n",[79,3352,3353],{"class":81,"line":1599},[79,3354,3355],{"class":106},"        cartographer_occupancy_grid_node,\n",[79,3357,3358],{"class":81,"line":1605},[79,3359,3360],{"class":106},"    ])\n",[20,3362,3363],{},"该launch文件主要是加载了cartographer_ros下的cartographer_node与cartographer_occupancy_grid_node节点，并且会从当前功能包的params下读取一个名为mycar.lua的配置文件。这个配置文件还不存在，接下来需要在params目录下新建mycar.lua文件，并输入如下内容：",[70,3365,3369],{"className":3366,"code":3367,"language":3368,"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,3370,3371,3382,3392,3396,3406,3416,3426,3442,3457,3472,3487,3502,3517,3531,3545,3559,3574,3589,3603,3617,3632,3647,3662,3677,3692,3707,3721,3736,3750,3755,3759,3774,3778,3794,3809,3824,3838,3852,3880,3884,3905,3924,3928,3933,3937],{"__ignoreMap":34},[79,3372,3373,3376,3379],{"class":81,"line":82},[79,3374,3375],{"class":1219},"include",[79,3377,3378],{"class":89}," \"map_builder.lua\" ",[79,3380,3381],{"class":148},"-- 地图构建器\n",[79,3383,3384,3386,3389],{"class":81,"line":116},[79,3385,3375],{"class":1219},[79,3387,3388],{"class":89}," \"trajectory_builder.lua\" ",[79,3390,3391],{"class":148},"-- 轨迹构建器\n",[79,3393,3394],{"class":81,"line":138},[79,3395,142],{"emptyLinePlaceholder":141},[79,3397,3398,3401,3403],{"class":81,"line":145},[79,3399,3400],{"class":106},"options ",[79,3402,1338],{"class":99},[79,3404,3405],{"class":106}," {\n",[79,3407,3408,3411,3413],{"class":81,"line":152},[79,3409,3410],{"class":106},"  map_builder ",[79,3412,1338],{"class":99},[79,3414,3415],{"class":106}," MAP_BUILDER,\n",[79,3417,3418,3421,3423],{"class":81,"line":164},[79,3419,3420],{"class":106},"  trajectory_builder ",[79,3422,1338],{"class":99},[79,3424,3425],{"class":106}," TRAJECTORY_BUILDER,\n",[79,3427,3428,3431,3433,3436,3439],{"class":81,"line":176},[79,3429,3430],{"class":106},"  map_frame ",[79,3432,1338],{"class":99},[79,3434,3435],{"class":89}," \"map\"",[79,3437,3438],{"class":106},",  ",[79,3440,3441],{"class":148},"-- 地图坐标系\n",[79,3443,3444,3447,3449,3452,3454],{"class":81,"line":181},[79,3445,3446],{"class":106},"  tracking_frame ",[79,3448,1338],{"class":99},[79,3450,3451],{"class":89}," \"base_link\"",[79,3453,1457],{"class":106},[79,3455,3456],{"class":148},"-- 跟踪的坐标系，可以是基坐标系、雷达或imu的坐标系\n",[79,3458,3459,3462,3464,3467,3469],{"class":81,"line":187},[79,3460,3461],{"class":106},"  published_frame ",[79,3463,1338],{"class":99},[79,3465,3466],{"class":89}," \"odom\"",[79,3468,1457],{"class":106},[79,3470,3471],{"class":148},"-- cartographer发布的位姿（pose）的坐标系\n",[79,3473,3474,3477,3479,3482,3484],{"class":81,"line":199},[79,3475,3476],{"class":106},"  odom_frame ",[79,3478,1338],{"class":99},[79,3480,3481],{"class":89}," \"carto_odom\"",[79,3483,3438],{"class":106},[79,3485,3486],{"class":148},"-- cartographer 计算后优化的里程计，并非机器人本身里程计\n",[79,3488,3489,3492,3494,3497,3499],{"class":81,"line":1350},[79,3490,3491],{"class":106},"  provide_odom_frame ",[79,3493,1338],{"class":99},[79,3495,3496],{"class":1219}," false",[79,3498,1457],{"class":106},[79,3500,3501],{"class":148},"-- 是否发布cartographer的里程计\n",[79,3503,3504,3507,3509,3512,3514],{"class":81,"line":1365},[79,3505,3506],{"class":106},"  publish_frame_projected_to_2d ",[79,3508,1338],{"class":99},[79,3510,3511],{"class":1219}," true",[79,3513,1457],{"class":106},[79,3515,3516],{"class":148},"-- 是否转换成2d(无俯仰、滚动的情况下为 true)\n",[79,3518,3519,3522,3524,3526,3528],{"class":81,"line":1370},[79,3520,3521],{"class":106},"  use_odometry ",[79,3523,1338],{"class":99},[79,3525,3511],{"class":1219},[79,3527,1457],{"class":106},[79,3529,3530],{"class":148},"-- 是否订阅里程计数据\n",[79,3532,3533,3536,3538,3540,3542],{"class":81,"line":1381},[79,3534,3535],{"class":106},"  use_nav_sat ",[79,3537,1338],{"class":99},[79,3539,3496],{"class":1219},[79,3541,1457],{"class":106},[79,3543,3544],{"class":148},"-- 是否订阅GPS\n",[79,3546,3547,3550,3552,3554,3556],{"class":81,"line":1390},[79,3548,3549],{"class":106},"  use_landmarks ",[79,3551,1338],{"class":99},[79,3553,3496],{"class":1219},[79,3555,1457],{"class":106},[79,3557,3558],{"class":148},"-- 是否订阅路标\n",[79,3560,3561,3564,3566,3569,3571],{"class":81,"line":1404},[79,3562,3563],{"class":106},"  num_laser_scans ",[79,3565,1338],{"class":99},[79,3567,3568],{"class":1219}," 1",[79,3570,1457],{"class":106},[79,3572,3573],{"class":148},"-- 订阅的雷达的数量\n",[79,3575,3576,3579,3581,3584,3586],{"class":81,"line":1417},[79,3577,3578],{"class":106},"  num_multi_echo_laser_scans ",[79,3580,1338],{"class":99},[79,3582,3583],{"class":1219}," 0",[79,3585,1457],{"class":106},[79,3587,3588],{"class":148},"-- 订阅的多层回波激光雷达数量\n",[79,3590,3591,3594,3596,3598,3600],{"class":81,"line":1427},[79,3592,3593],{"class":106},"  num_subdivisions_per_laser_scan ",[79,3595,1338],{"class":99},[79,3597,3568],{"class":1219},[79,3599,1457],{"class":106},[79,3601,3602],{"class":148},"-- 将激光雷达的数据拆分成多少部分发布\n",[79,3604,3605,3608,3610,3612,3614],{"class":81,"line":1435},[79,3606,3607],{"class":106},"  num_point_clouds ",[79,3609,1338],{"class":99},[79,3611,3583],{"class":1219},[79,3613,1457],{"class":106},[79,3615,3616],{"class":148},"-- 订阅多线激光雷达的数量\n",[79,3618,3619,3622,3624,3627,3629],{"class":81,"line":1451},[79,3620,3621],{"class":106},"  lookup_transform_timeout_sec ",[79,3623,1338],{"class":99},[79,3625,3626],{"class":1219}," 1.5",[79,3628,1457],{"class":106},[79,3630,3631],{"class":148},"-- 坐标变换超时时间\n",[79,3633,3634,3637,3639,3642,3644],{"class":81,"line":1465},[79,3635,3636],{"class":106},"  submap_publish_period_sec ",[79,3638,1338],{"class":99},[79,3640,3641],{"class":1219}," 0.5",[79,3643,1457],{"class":106},[79,3645,3646],{"class":148},"-- 发布子图的时间间隔\n",[79,3648,3649,3652,3654,3657,3659],{"class":81,"line":1477},[79,3650,3651],{"class":106},"  pose_publish_period_sec ",[79,3653,1338],{"class":99},[79,3655,3656],{"class":1219}," 5e-3",[79,3658,1457],{"class":106},[79,3660,3661],{"class":148},"-- 发布pose的时间间隔\n",[79,3663,3664,3667,3669,3672,3674],{"class":81,"line":1482},[79,3665,3666],{"class":106},"  trajectory_publish_period_sec ",[79,3668,1338],{"class":99},[79,3670,3671],{"class":1219}," 30e-3",[79,3673,1457],{"class":106},[79,3675,3676],{"class":148},"-- 发布轨迹的时间间隔\n",[79,3678,3679,3682,3684,3687,3689],{"class":81,"line":1493},[79,3680,3681],{"class":106},"  rangefinder_sampling_ratio ",[79,3683,1338],{"class":99},[79,3685,3686],{"class":1219}," 1.",[79,3688,1457],{"class":106},[79,3690,3691],{"class":148},"-- 雷达采样比例\n",[79,3693,3694,3697,3699,3702,3704],{"class":81,"line":1504},[79,3695,3696],{"class":106},"  odometry_sampling_ratio ",[79,3698,1338],{"class":99},[79,3700,3701],{"class":1219}," 0.8",[79,3703,1457],{"class":106},[79,3705,3706],{"class":148},"-- 里程计采样比例(如果里程计精度低，可以减小该设置值)\n",[79,3708,3709,3712,3714,3716,3718],{"class":81,"line":1510},[79,3710,3711],{"class":106},"  fixed_frame_pose_sampling_ratio ",[79,3713,1338],{"class":99},[79,3715,3686],{"class":1219},[79,3717,1457],{"class":106},[79,3719,3720],{"class":148},"-- 参考坐标系采样比例\n",[79,3722,3723,3726,3728,3730,3733],{"class":81,"line":1521},[79,3724,3725],{"class":106},"  imu_sampling_ratio ",[79,3727,1338],{"class":99},[79,3729,3686],{"class":1219},[79,3731,3732],{"class":106},",",[79,3734,3735],{"class":148},"-- imu采样比例\n",[79,3737,3738,3741,3743,3745,3747],{"class":81,"line":1527},[79,3739,3740],{"class":106},"  landmarks_sampling_ratio ",[79,3742,1338],{"class":99},[79,3744,3686],{"class":1219},[79,3746,1457],{"class":106},[79,3748,3749],{"class":148},"-- 路标采样比例\n",[79,3751,3752],{"class":81,"line":1540},[79,3753,3754],{"class":106},"}\n",[79,3756,3757],{"class":81,"line":1553},[79,3758,142],{"emptyLinePlaceholder":141},[79,3760,3761,3764,3767,3769,3771],{"class":81,"line":1565},[79,3762,3763],{"class":106},"MAP_BUILDER.",[79,3765,3766],{"class":85},"use_trajectory_builder_2d",[79,3768,3114],{"class":99},[79,3770,3511],{"class":1219},[79,3772,3773],{"class":148}," -- 启用2D轨迹构建器\n",[79,3775,3776],{"class":81,"line":1578},[79,3777,142],{"emptyLinePlaceholder":141},[79,3779,3780,3783,3786,3788,3791],{"class":81,"line":1583},[79,3781,3782],{"class":106},"TRAJECTORY_BUILDER_2D.",[79,3784,3785],{"class":85},"min_range",[79,3787,3114],{"class":99},[79,3789,3790],{"class":1219}," 0.15",[79,3792,3793],{"class":148}," -- 最小雷达有效距离\n",[79,3795,3796,3798,3801,3803,3806],{"class":81,"line":1594},[79,3797,3782],{"class":106},[79,3799,3800],{"class":85},"max_range",[79,3802,3114],{"class":99},[79,3804,3805],{"class":1219}," 6.0",[79,3807,3808],{"class":148}," -- 最大雷达有效距离\n",[79,3810,3811,3813,3816,3818,3821],{"class":81,"line":1599},[79,3812,3782],{"class":106},[79,3814,3815],{"class":85},"missing_data_ray_length",[79,3817,3114],{"class":99},[79,3819,3820],{"class":1219}," 3.",[79,3822,3823],{"class":148}," -- 缺失数据的射线长度\n",[79,3825,3826,3828,3831,3833,3835],{"class":81,"line":1605},[79,3827,3782],{"class":106},[79,3829,3830],{"class":85},"use_imu_data",[79,3832,3114],{"class":99},[79,3834,3496],{"class":1219},[79,3836,3837],{"class":148}," -- 是否使用 imu 数据\n",[79,3839,3840,3842,3845,3847,3849],{"class":81,"line":1611},[79,3841,3782],{"class":106},[79,3843,3844],{"class":85},"use_online_correlative_scan_matching",[79,3846,3114],{"class":99},[79,3848,3511],{"class":1219},[79,3850,3851],{"class":148}," -- 是否使用在线相关扫描匹配\n",[79,3853,3854,3856,3859,3861,3864,3866,3869,3872,3874,3877],{"class":81,"line":1617},[79,3855,3782],{"class":106},[79,3857,3858],{"class":85},"motion_filter",[79,3860,2352],{"class":106},[79,3862,3863],{"class":85},"max_angle_radians",[79,3865,3114],{"class":99},[79,3867,3868],{"class":1219}," math.rad",[79,3870,3871],{"class":106},"(",[79,3873,1989],{"class":1219},[79,3875,3876],{"class":106},") ",[79,3878,3879],{"class":148},"-- 运动滤波器的最大角度限制（以弧度为单位）\n",[79,3881,3882],{"class":81,"line":1622},[79,3883,142],{"emptyLinePlaceholder":141},[79,3885,3886,3889,3892,3894,3897,3899,3902],{"class":81,"line":2005},[79,3887,3888],{"class":106},"POSE_GRAPH.",[79,3890,3891],{"class":85},"constraint_builder",[79,3893,2352],{"class":106},[79,3895,3896],{"class":85},"min_score",[79,3898,3114],{"class":99},[79,3900,3901],{"class":1219}," 0.65",[79,3903,3904],{"class":148}," -- 建约束时的最小分数\n",[79,3906,3907,3909,3911,3913,3916,3918,3921],{"class":81,"line":2016},[79,3908,3888],{"class":106},[79,3910,3891],{"class":85},[79,3912,2352],{"class":106},[79,3914,3915],{"class":85},"global_localization_min_score",[79,3917,3114],{"class":99},[79,3919,3920],{"class":1219}," 0.7",[79,3922,3923],{"class":148}," -- 全局定位时的最小分数\n",[79,3925,3926],{"class":81,"line":2029},[79,3927,142],{"emptyLinePlaceholder":141},[79,3929,3930],{"class":81,"line":2043},[79,3931,3932],{"class":148},"-- POSE_GRAPH.optimize_every_n_nodes = 0\n",[79,3934,3935],{"class":81,"line":2056},[79,3936,142],{"emptyLinePlaceholder":141},[79,3938,3939,3942],{"class":81,"line":2070},[79,3940,3941],{"class":99},"return",[79,3943,3944],{"class":106}," options\n",[20,3946,2266],{},[314,3948,3949],{"start":138},[51,3950,2271],{},[20,3952,2274,3953,2278],{},[76,3954,2277],{},[70,3956,3957],{"className":2281,"code":2282,"language":2283,"meta":34,"style":34},[76,3958,3959,3965,3971],{"__ignoreMap":34},[79,3960,3961,3963],{"class":81,"line":82},[79,3962,2290],{"class":99},[79,3964,2293],{"class":106},[79,3966,3967,3969],{"class":81,"line":116},[79,3968,2298],{"class":106},[79,3970,2301],{"class":99},[79,3972,3973],{"class":81,"line":138},[79,3974,1347],{"class":106},[314,3976,3977],{"start":145},[51,3978,2310],{},[20,3980,2313],{},[70,3982,3984],{"className":72,"code":3983,"language":74,"meta":34,"style":34},"colcon build --packages-select mycar_slam_cartographer\n",[76,3985,3986],{"__ignoreMap":34},[79,3987,3988,3990,3992,3994],{"class":81,"line":82},[79,3989,2323],{"class":85},[79,3991,2326],{"class":89},[79,3993,2329],{"class":1219},[79,3995,3996],{"class":89}," mycar_slam_cartographer\n",[314,3998,3999],{"start":152},[51,4000,2337],{},[20,4002,4003],{},"（1）请先调用如下指令启动仿真环境：",[70,4005,4006],{"className":72,"code":2345,"language":74,"meta":34,"style":34},[76,4007,4008,4014],{"__ignoreMap":34},[79,4009,4010,4012],{"class":81,"line":82},[79,4011,2352],{"class":1219},[79,4013,2355],{"class":89},[79,4015,4016,4018,4020,4022],{"class":81,"line":116},[79,4017,1207],{"class":85},[79,4019,2362],{"class":89},[79,4021,2365],{"class":89},[79,4023,2368],{"class":89},[20,4025,4026],{},"（2）然后在终端下进入当前工作空间，输入如下指令：",[70,4028,4030],{"className":72,"code":4029,"language":74,"meta":34,"style":34},". install\u002Fsetup.bash\nros2 launch mycar_slam_cartographer cartographer.launch.py use_sim_time:=True\n",[76,4031,4032,4038],{"__ignoreMap":34},[79,4033,4034,4036],{"class":81,"line":82},[79,4035,2352],{"class":1219},[79,4037,2355],{"class":89},[79,4039,4040,4042,4044,4046,4049],{"class":81,"line":116},[79,4041,1207],{"class":85},[79,4043,2362],{"class":89},[79,4045,3003],{"class":89},[79,4047,4048],{"class":89}," cartographer.launch.py",[79,4050,2398],{"class":89},[20,4052,4053],{},"（3）启动rviz2，将Fixed Frame设置为map，添加map插件并将话题设置为\u002Fmap，即可显示创建的地图了，当机器人运动时，地图也会随之更新。",[20,4055,4056],{},[32,4057],{"alt":34,"src":4058},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1749.webp",[20,4060,4061],{},[32,4062],{"alt":34,"src":4063},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1750.webp",[20,4065,4066],{},[32,4067],{"alt":34,"src":4068},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1751.webp",[12,4070,4071],{"id":4071},"地图服务",[20,4073,4074,4075,4078],{},"SLAM建图时，地图数据是保存在内存中的，这也意味着，一旦节点关闭，数据也会一并被释放，而更合理的实现应该是将构建的地图序列化到的磁盘以持久化存储，并且后期还要通过反序列化读取磁盘的地图数据以做其他操作。在Nav2中已经已经封装好了地图序列化和反序列化的相关功能包，该包是：",[76,4076,4077],{},"nav2_map_server","。",[20,4080,4081,4082,4084,4085,4087,4088,2679,4091,4094,4095,4097,4098,4100],{},"在",[76,4083,4077],{},"中，可以通过话题和服务接口与Nav2系统的其余部分进行交互。",[76,4086,4077],{},"包下有两个重要的节点，分别是",[76,4089,4090],{},"map_saver_cli",[76,4092,4093],{},"map_server","，通过",[76,4096,4090],{},"节点则可以保存地图，而",[76,4099,4093],{},"节点则可以在启动时显示地图。",[16,4102,4104],{"id":4103},"保存地图序列化","保存地图(序列化)",[4106,4107,4108],"h5",{"id":4108},"地图保存节点说明",[20,4110,4081,4111,4113,4114,4117],{},[76,4112,4077],{},"中的地图保存节点是",[76,4115,4116],{},"map_saver_server","，该节点相关信息如下。",[314,4119,4120],{},[51,4121,535],{},[537,4123,4124,4135],{},[540,4125,4126],{},[543,4127,4128,4130,4133],{},[546,4129,549],{"align":548},[546,4131,4132],{"align":548},"接口",[546,4134,555],{"align":548},[557,4136,4137],{},[543,4138,4139,4141,4143],{},[562,4140,689],{"align":548},[562,4142,692],{"align":548},[562,4144,4145],{"align":548},"SLAM节点发布的地图数据",[314,4147,4148],{"start":116},[51,4149,829],{},[48,4151,4152,4158,4164,4170],{},[51,4153,4154,4157],{},[23,4155,4156],{},"save_map_timeout","  保存地图操作的最大等待时间。",[51,4159,4160,4163],{},[23,4161,4162],{},"free_thresh_default","  栅格单元被认为未被占用的概率阈值。",[51,4165,4166,4169],{},[23,4167,4168],{},"occupied_thresh_default","  栅格单元被认为占用的概率阈值。",[51,4171,4172,4175],{},[23,4173,4174],{},"map_subscribe_transient_local","  节点重启后消息不保留，默认为 true。",[314,4177,4178],{"start":138},[51,4179,4090],{},[20,4181,4182,4183,4185,4186,4188,4189,4191],{},"另外，而为了便于使用，在",[76,4184,4116],{},"的基础之上还封装了一个名为",[76,4187,4090],{},"的可执行程序，它可以以实参的方式更方便的设置地图保存相关数据，并且后续执行时也是调用",[76,4190,4090],{},"，其实参列表如下：",[48,4193,4194,4200,4206,4212,4218,4224],{},[51,4195,4196,4199],{},[23,4197,4198],{},"-t"," 订阅的地图话题。",[51,4201,4202,4205],{},[23,4203,4204],{},"-f"," 地图存储路径。",[51,4207,4208,4211],{},[23,4209,4210],{},"--occ"," 栅格单元被认为占用的概率阈值。",[51,4213,4214,4217],{},[23,4215,4216],{},"--free"," 栅格单元被认为未被占用的概率阈值。",[51,4219,4220,4223],{},[23,4221,4222],{},"--fmt"," 图片格式。",[51,4225,4226,4229],{},[23,4227,4228],{},"--mode"," 地图模式，trinary(默认)或scale或raw。",[4106,4231,4232],{"id":4232},"地图保存基本操作",[20,4234,4235],{},[23,4236,1194],{},[20,4238,4239],{},"请先启动仿真或实体机器人，然后启动SLAM相关节点，实现基本的建图功能。",[20,4241,4242],{},[23,4243,4244],{},"保存地图",[20,4246,4247],{},"SLAM建图完毕，在终端下进入工作空间，调用如下指令保存地图：",[70,4249,4251],{"className":72,"code":4250,"language":74,"meta":34,"style":34},"ros2 run nav2_map_server map_saver_cli -f map\u002Fmy_map\n",[76,4252,4253],{"__ignoreMap":34},[79,4254,4255,4257,4260,4263,4266,4269],{"class":81,"line":82},[79,4256,1207],{"class":85},[79,4258,4259],{"class":89}," run",[79,4261,4262],{"class":89}," nav2_map_server",[79,4264,4265],{"class":89}," map_saver_cli",[79,4267,4268],{"class":1219}," -f",[79,4270,4271],{"class":89}," map\u002Fmy_map\n",[20,4273,4274,4275,4279,4280,2679,4283,4078],{},"上述指令将订阅\u002Fmap话题，并把\u002Fmap话题里的数据保存为文件，在工作空间下的map目录(",[4276,4277,4278],"em",{},"需要自行创建该目录，否则将会抛出异常",")中，生成两个文件，分别名为：",[76,4281,4282],{},"my_map.yaml",[76,4284,4285],{},"my_map.pgm",[20,4287,4288],{},[32,4289],{"alt":34,"src":4290},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1752.webp",[20,4292,4293],{},[32,4294],{"alt":34,"src":4295},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1753.webp",[4106,4297,4298],{"id":4298},"地图接口",[20,4300,4301],{},"在Nav2中地图相关的接口主要有两个：",[48,4303,4304,4310],{},[51,4305,4306,4309],{},[23,4307,4308],{},"nav_msgs\u002Fmsg\u002FMapMetaData"," 地图元数据，包括地图的宽度、高度、分辨率等。",[51,4311,4312,4314],{},[23,4313,692],{}," 地图栅格数据，一般会在rviz中以图形化的方式显示。",[20,4316,4317],{},[23,4318,4308],{},[20,4320,4321,4322,4325],{},"调用指令",[76,4323,4324],{},"ros2 interface show nav_msgs\u002Fmsg\u002FMapMetaData","查看接口格式，显示如下内容（注释已汉化）：",[70,4327,4329],{"className":72,"code":4328,"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,4330,4331,4335,4340,4344,4349,4357,4365,4373,4377,4382,4390,4394,4399,4407,4411,4416,4423,4427,4432,4440,4448,4456,4463,4470,4478,4488,4497,4506],{"__ignoreMap":34},[79,4332,4333],{"class":81,"line":82},[79,4334,142],{"emptyLinePlaceholder":141},[79,4336,4337],{"class":81,"line":116},[79,4338,4339],{"class":148},"# 它包含了关于OccupancyGrid特性的基本信息\n",[79,4341,4342],{"class":81,"line":138},[79,4343,142],{"emptyLinePlaceholder":141},[79,4345,4346],{"class":81,"line":145},[79,4347,4348],{"class":148},"# 地图加载时间\n",[79,4350,4351,4354],{"class":81,"line":152},[79,4352,4353],{"class":85},"builtin_interfaces\u002FTime",[79,4355,4356],{"class":89}," map_load_time\n",[79,4358,4359,4362],{"class":81,"line":164},[79,4360,4361],{"class":85},"        int32",[79,4363,4364],{"class":89}," sec\n",[79,4366,4367,4370],{"class":81,"line":176},[79,4368,4369],{"class":85},"        uint32",[79,4371,4372],{"class":89}," nanosec\n",[79,4374,4375],{"class":81,"line":181},[79,4376,142],{"emptyLinePlaceholder":141},[79,4378,4379],{"class":81,"line":187},[79,4380,4381],{"class":148},"# 地图分辨率 [米\u002F像素]\n",[79,4383,4384,4387],{"class":81,"line":199},[79,4385,4386],{"class":85},"float32",[79,4388,4389],{"class":89}," resolution\n",[79,4391,4392],{"class":81,"line":1350},[79,4393,142],{"emptyLinePlaceholder":141},[79,4395,4396],{"class":81,"line":1365},[79,4397,4398],{"class":148},"# 地图宽度 [像素]\n",[79,4400,4401,4404],{"class":81,"line":1370},[79,4402,4403],{"class":85},"uint32",[79,4405,4406],{"class":89}," width\n",[79,4408,4409],{"class":81,"line":1381},[79,4410,142],{"emptyLinePlaceholder":141},[79,4412,4413],{"class":81,"line":1390},[79,4414,4415],{"class":148},"# 地图高度 [像素]\n",[79,4417,4418,4420],{"class":81,"line":1404},[79,4419,4403],{"class":85},[79,4421,4422],{"class":89}," height\n",[79,4424,4425],{"class":81,"line":1417},[79,4426,142],{"emptyLinePlaceholder":141},[79,4428,4429],{"class":81,"line":1427},[79,4430,4431],{"class":148},"#地图的原点坐标[米，米，弧度]。这是地图中单元格(0,0)左下角在现实世界中的位置和方向。\n",[79,4433,4434,4437],{"class":81,"line":1435},[79,4435,4436],{"class":85},"geometry_msgs\u002FPose",[79,4438,4439],{"class":89}," origin\n",[79,4441,4442,4445],{"class":81,"line":1451},[79,4443,4444],{"class":85},"        Point",[79,4446,4447],{"class":89}," position\n",[79,4449,4450,4453],{"class":81,"line":1465},[79,4451,4452],{"class":85},"                float64",[79,4454,4455],{"class":89}," x\n",[79,4457,4458,4460],{"class":81,"line":1477},[79,4459,4452],{"class":85},[79,4461,4462],{"class":89}," y\n",[79,4464,4465,4467],{"class":81,"line":1482},[79,4466,4452],{"class":85},[79,4468,4469],{"class":89}," z\n",[79,4471,4472,4475],{"class":81,"line":1493},[79,4473,4474],{"class":85},"        Quaternion",[79,4476,4477],{"class":89}," orientation\n",[79,4479,4480,4482,4485],{"class":81,"line":1504},[79,4481,4452],{"class":85},[79,4483,4484],{"class":89}," x",[79,4486,4487],{"class":1219}," 0\n",[79,4489,4490,4492,4495],{"class":81,"line":1510},[79,4491,4452],{"class":85},[79,4493,4494],{"class":89}," y",[79,4496,4487],{"class":1219},[79,4498,4499,4501,4504],{"class":81,"line":1521},[79,4500,4452],{"class":85},[79,4502,4503],{"class":89}," z",[79,4505,4487],{"class":1219},[79,4507,4508,4510,4513],{"class":81,"line":1527},[79,4509,4452],{"class":85},[79,4511,4512],{"class":89}," w",[79,4514,4515],{"class":1219}," 1\n",[20,4517,4518],{},[23,4519,692],{},[20,4521,4321,4522,4325],{},[76,4523,4524],{},"ros2 interface show nav_msgs\u002Fmsg\u002FOccupancyGrid",[70,4526,4528],{"className":72,"code":4527,"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,4529,4530,4534,4539,4547,4555,4562,4569,4577,4581,4586,4594,4600,4606,4612,4619,4625,4631,4638,4645,4652,4658,4664,4671,4679,4687,4695,4703,4707,4712,4716,4721,4725,4730,4734,4739,4743,4748,4752,4757,4761,4766,4770,4775,4779,4784,4788,4793,4797,4802],{"__ignoreMap":34},[79,4531,4532],{"class":81,"line":82},[79,4533,142],{"emptyLinePlaceholder":141},[79,4535,4536],{"class":81,"line":116},[79,4537,4538],{"class":148},"# 它代表一个二维网格地图。\n",[79,4540,4541,4544],{"class":81,"line":138},[79,4542,4543],{"class":85},"std_msgs\u002FHeader",[79,4545,4546],{"class":89}," header\n",[79,4548,4549,4552],{"class":81,"line":145},[79,4550,4551],{"class":85},"        builtin_interfaces\u002FTime",[79,4553,4554],{"class":89}," stamp\n",[79,4556,4557,4560],{"class":81,"line":152},[79,4558,4559],{"class":85},"                int32",[79,4561,4364],{"class":89},[79,4563,4564,4567],{"class":81,"line":164},[79,4565,4566],{"class":85},"                uint32",[79,4568,4372],{"class":89},[79,4570,4571,4574],{"class":81,"line":176},[79,4572,4573],{"class":85},"        string",[79,4575,4576],{"class":89}," frame_id\n",[79,4578,4579],{"class":81,"line":181},[79,4580,142],{"emptyLinePlaceholder":141},[79,4582,4583],{"class":81,"line":187},[79,4584,4585],{"class":148},"# 地图元数据\n",[79,4587,4588,4591],{"class":81,"line":199},[79,4589,4590],{"class":85},"MapMetaData",[79,4592,4593],{"class":89}," info\n",[79,4595,4596,4598],{"class":81,"line":1350},[79,4597,4551],{"class":85},[79,4599,4356],{"class":89},[79,4601,4602,4604],{"class":81,"line":1365},[79,4603,4559],{"class":85},[79,4605,4364],{"class":89},[79,4607,4608,4610],{"class":81,"line":1370},[79,4609,4566],{"class":85},[79,4611,4372],{"class":89},[79,4613,4614,4617],{"class":81,"line":1381},[79,4615,4616],{"class":85},"        float32",[79,4618,4389],{"class":89},[79,4620,4621,4623],{"class":81,"line":1390},[79,4622,4369],{"class":85},[79,4624,4406],{"class":89},[79,4626,4627,4629],{"class":81,"line":1404},[79,4628,4369],{"class":85},[79,4630,4422],{"class":89},[79,4632,4633,4636],{"class":81,"line":1417},[79,4634,4635],{"class":85},"        geometry_msgs\u002FPose",[79,4637,4439],{"class":89},[79,4639,4640,4643],{"class":81,"line":1427},[79,4641,4642],{"class":85},"                Point",[79,4644,4447],{"class":89},[79,4646,4647,4650],{"class":81,"line":1435},[79,4648,4649],{"class":85},"                        float64",[79,4651,4455],{"class":89},[79,4653,4654,4656],{"class":81,"line":1451},[79,4655,4649],{"class":85},[79,4657,4462],{"class":89},[79,4659,4660,4662],{"class":81,"line":1465},[79,4661,4649],{"class":85},[79,4663,4469],{"class":89},[79,4665,4666,4669],{"class":81,"line":1477},[79,4667,4668],{"class":85},"                Quaternion",[79,4670,4477],{"class":89},[79,4672,4673,4675,4677],{"class":81,"line":1482},[79,4674,4649],{"class":85},[79,4676,4484],{"class":89},[79,4678,4487],{"class":1219},[79,4680,4681,4683,4685],{"class":81,"line":1493},[79,4682,4649],{"class":85},[79,4684,4494],{"class":89},[79,4686,4487],{"class":1219},[79,4688,4689,4691,4693],{"class":81,"line":1504},[79,4690,4649],{"class":85},[79,4692,4503],{"class":89},[79,4694,4487],{"class":1219},[79,4696,4697,4699,4701],{"class":81,"line":1510},[79,4698,4649],{"class":85},[79,4700,4512],{"class":89},[79,4702,4515],{"class":1219},[79,4704,4705],{"class":81,"line":1521},[79,4706,142],{"emptyLinePlaceholder":141},[79,4708,4709],{"class":81,"line":1527},[79,4710,4711],{"class":148},"# 地图数据按照行优先的顺序进行排列，\n",[79,4713,4714],{"class":81,"line":1540},[79,4715,142],{"emptyLinePlaceholder":141},[79,4717,4718],{"class":81,"line":1553},[79,4719,4720],{"class":148},"# 这意味着首先填充第一行的所有单元格，\n",[79,4722,4723],{"class":81,"line":1565},[79,4724,142],{"emptyLinePlaceholder":141},[79,4726,4727],{"class":81,"line":1578},[79,4728,4729],{"class":148},"# 然后填充第二行，依此类推。\n",[79,4731,4732],{"class":81,"line":1583},[79,4733,142],{"emptyLinePlaceholder":141},[79,4735,4736],{"class":81,"line":1594},[79,4737,4738],{"class":148},"# 起始单元格是(0,0)，也就是地图的左上角。\n",[79,4740,4741],{"class":81,"line":1599},[79,4742,142],{"emptyLinePlaceholder":141},[79,4744,4745],{"class":81,"line":1605},[79,4746,4747],{"class":148},"# 单元格(1, 0)紧接着(0,0)，是x方向上紧邻的下一个单元格。\n",[79,4749,4750],{"class":81,"line":1611},[79,4751,142],{"emptyLinePlaceholder":141},[79,4753,4754],{"class":81,"line":1617},[79,4755,4756],{"class":148},"# 而单元格(0, 1)则位于第一行的第二个位置，其索引等于地图的宽度（info.width），\n",[79,4758,4759],{"class":81,"line":1622},[79,4760,142],{"emptyLinePlaceholder":141},[79,4762,4763],{"class":81,"line":2005},[79,4764,4765],{"class":148},"# 然后才是(1, 1)单元格，即第二行的第二个单元格。\n",[79,4767,4768],{"class":81,"line":2016},[79,4769,142],{"emptyLinePlaceholder":141},[79,4771,4772],{"class":81,"line":2029},[79,4773,4774],{"class":148},"# 关于地图数据的值，它们根据具体的应用需求来定义。但在很多情况下，\n",[79,4776,4777],{"class":81,"line":2043},[79,4778,142],{"emptyLinePlaceholder":141},[79,4780,4781],{"class":81,"line":2056},[79,4782,4783],{"class":148},"# 会使用0表示该单元格是未占用的，即机器人可以安全通过；\n",[79,4785,4786],{"class":81,"line":2070},[79,4787,142],{"emptyLinePlaceholder":141},[79,4789,4790],{"class":81,"line":2081},[79,4791,4792],{"class":148},"# 1表示该单元格是确定占用的，即存在障碍物；\n",[79,4794,4795],{"class":81,"line":2086},[79,4796,142],{"emptyLinePlaceholder":141},[79,4798,4799],{"class":81,"line":2096},[79,4800,4801],{"class":148},"# 而-1表示该单元格的状态是未知的，即机器人尚未探测到该区域的状态。\n",[79,4803,4804,4807],{"class":81,"line":2107},[79,4805,4806],{"class":85},"int8[]",[79,4808,4809],{"class":89}," data\n",[4106,4811,4812],{"id":4812},"地图存储格式",[20,4814,4815,4816,4818],{},"在 ",[23,4817,4232],{},"  一节中，地图保存后后生成两个文件，这两个文件就是用来存储序列化后的地图数据的。其中，my_map.pgm是一张图片资源，使用图片查看程序打开即可，而my_map.yaml保存的是地图的元数据信息，用于描述图片，内容格式如下：",[70,4820,4822],{"className":1641,"code":4821,"language":1643,"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,4823,4824,4834,4843,4851,4875,4885,4895],{"__ignoreMap":34},[79,4825,4826,4829,4831],{"class":81,"line":82},[79,4827,4828],{"class":1650},"image",[79,4830,1668],{"class":106},[79,4832,4833],{"class":89},"my_map.pgm\n",[79,4835,4836,4838,4840],{"class":81,"line":116},[79,4837,877],{"class":1650},[79,4839,1668],{"class":106},[79,4841,4842],{"class":89},"trinary\n",[79,4844,4845,4847,4849],{"class":81,"line":138},[79,4846,984],{"class":1650},[79,4848,1668],{"class":106},[79,4850,1854],{"class":1219},[79,4852,4853,4856,4859,4862,4864,4867,4869,4872],{"class":81,"line":145},[79,4854,4855],{"class":1650},"origin",[79,4857,4858],{"class":106},": [",[79,4860,4861],{"class":1219},"-0.955",[79,4863,1457],{"class":106},[79,4865,4866],{"class":1219},"-10.9",[79,4868,1457],{"class":106},[79,4870,4871],{"class":1219},"0",[79,4873,4874],{"class":106},"]\n",[79,4876,4877,4880,4882],{"class":81,"line":152},[79,4878,4879],{"class":1650},"negate",[79,4881,1668],{"class":106},[79,4883,4884],{"class":1219},"0\n",[79,4886,4887,4890,4892],{"class":81,"line":164},[79,4888,4889],{"class":1650},"occupied_thresh",[79,4891,1668],{"class":106},[79,4893,4894],{"class":1219},"0.65\n",[79,4896,4897,4900,4902],{"class":81,"line":176},[79,4898,4899],{"class":1650},"free_thresh",[79,4901,1668],{"class":106},[79,4903,4904],{"class":1219},"0.25\n",[20,4906,4907],{},[23,4908,4909],{},"参数解释：",[48,4911,4912,4917,4922,4927,4932,4937,4942],{},[51,4913,4914,4916],{},[23,4915,4828],{},"  被描述的图片资源路径，可以是绝对路径也可以是相对路径。",[51,4918,4919,4921],{},[23,4920,984],{}," 图片分片率(单位: m\u002F像素)。",[51,4923,4924,4926],{},[23,4925,4855],{}," 地图中左下像素的二维姿态，为（x，y，z），偏航为逆时针旋转（偏航=0 表示无旋转）。",[51,4928,4929,4931],{},[23,4930,4889],{}," 占用概率大于此阈值的像素被视为完全占用。",[51,4933,4934,4936],{},[23,4935,4899],{}," 占用率小于此阈值的像素被视为完全空闲。",[51,4938,4939,4941],{},[23,4940,4879],{}," 是否应该颠倒白色\u002F黑色 自由\u002F占用的语义。",[51,4943,4944,4946],{},[23,4945,877],{},"  地图模式，trinary(默认)或scale或raw。",[16,4948,4950],{"id":4949},"读取地图反序列化","读取地图(反序列化)",[4106,4952,4953],{"id":4953},"地图读取节点说明",[20,4955,4081,4956,4958,4959,4117],{},[76,4957,4077],{},"中的地图读取节点是",[76,4960,4093],{},[20,4962,4963],{},[23,4964,670],{},[537,4966,4967,4977],{},[540,4968,4969],{},[543,4970,4971,4973,4975],{},[546,4972,549],{"align":548},[546,4974,4132],{"align":548},[546,4976,555],{"align":548},[557,4978,4979],{},[543,4980,4981,4983,4985],{},[562,4982,689],{"align":548},[562,4984,692],{"align":548},[562,4986,4987],{"align":548},"地图数据",[20,4989,4990],{},[23,4991,829],{},[48,4993,4994,5000,5006],{},[51,4995,4996,4999],{},[23,4997,4998],{},"frame_id","  地图坐标系名称。",[51,5001,5002,5005],{},[23,5003,5004],{},"topic_name","  话题名称。",[51,5007,5008,5011],{},[23,5009,5010],{},"yaml_filename","  地图数据源。",[4106,5013,5014],{"id":5014},"地图读取基本操作",[20,5016,5017],{},[23,5018,1194],{},[20,5020,5021],{},"请先调用如下指令在工作空间的src目录下创建一个功能包：",[70,5023,5025],{"className":72,"code":5024,"language":74,"meta":34,"style":34},"ros2 pkg create mycar_map_server --dependencies nav2_map_server\n",[76,5026,5027],{"__ignoreMap":34},[79,5028,5029,5031,5033,5035,5038,5040],{"class":81,"line":82},[79,5030,1207],{"class":85},[79,5032,1210],{"class":89},[79,5034,1213],{"class":89},[79,5036,5037],{"class":89}," mycar_map_server",[79,5039,1220],{"class":1219},[79,5041,5042],{"class":89}," nav2_map_server\n",[20,5044,5045],{},"在功能包下，新建launch文件夹，并在CMakeLists.txt中添加如下配置：",[70,5047,5049],{"className":2281,"code":5048,"language":2283,"meta":34,"style":34},"install(DIRECTORY launch DESTINATION share\u002F${PROJECT_NAME})\n",[76,5050,5051],{"__ignoreMap":34},[79,5052,5053,5055,5058,5061],{"class":81,"line":82},[79,5054,2290],{"class":99},[79,5056,5057],{"class":106},"(DIRECTORY launch DESTINATION share\u002F",[79,5059,5060],{"class":99},"${PROJECT_NAME}",[79,5062,1347],{"class":106},[20,5064,5065],{},[32,5066],{"alt":34,"src":5067},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1754.webp",[20,5069,5070],{},[23,5071,5072],{},"读取地图",[20,5074,5075,5076,5078],{},"使用",[76,5077,4093],{},"读取地图时，常用的方式有两种，分别是使用终端指令与launch文件集成。两种方式效果一致，都可以以话题的方式发布地图消息。",[70,5080,5082],{"className":72,"code":5081,"language":74,"meta":34,"style":34},"colcon build\nsource .\u002Finstall\u002Fsetup.bash\n",[76,5083,5084,5091],{"__ignoreMap":34},[79,5085,5086,5088],{"class":81,"line":82},[79,5087,2323],{"class":85},[79,5089,5090],{"class":89}," build\n",[79,5092,5093,5096],{"class":81,"line":116},[79,5094,5095],{"class":1219},"source",[79,5097,5098],{"class":89}," .\u002Finstall\u002Fsetup.bash\n",[20,5100,5101],{},[23,5102,5103],{},"方式1：终端指令",[20,5105,5106],{},"请在终端下进入工作空间，输入如下指令：",[70,5108,5110],{"className":72,"code":5109,"language":74,"meta":34,"style":34},"ros2 run nav2_map_server map_server --ros-args -p yaml_filename:=map\u002Fmy_map.yaml\n",[76,5111,5112],{"__ignoreMap":34},[79,5113,5114,5116,5118,5120,5123,5126,5129],{"class":81,"line":82},[79,5115,1207],{"class":85},[79,5117,4259],{"class":89},[79,5119,4262],{"class":89},[79,5121,5122],{"class":89}," map_server",[79,5124,5125],{"class":1219}," --ros-args",[79,5127,5128],{"class":1219}," -p",[79,5130,5131],{"class":89}," yaml_filename:=map\u002Fmy_map.yaml\n",[20,5133,5134,5135,5137],{},"由于",[76,5136,4093],{},"是具有生命周期的节点，所以接下来还需要对节点进行配置和激活，请新开终端执行如下指令：",[70,5139,5141],{"className":72,"code":5140,"language":74,"meta":34,"style":34},"ros2 lifecycle set \u002Fmap_server configure\nros2 lifecycle set \u002Fmap_server activate\n",[76,5142,5143,5159],{"__ignoreMap":34},[79,5144,5145,5147,5150,5153,5156],{"class":81,"line":82},[79,5146,1207],{"class":85},[79,5148,5149],{"class":89}," lifecycle",[79,5151,5152],{"class":89}," set",[79,5154,5155],{"class":89}," \u002Fmap_server",[79,5157,5158],{"class":89}," configure\n",[79,5160,5161,5163,5165,5167,5169],{"class":81,"line":116},[79,5162,1207],{"class":85},[79,5164,5149],{"class":89},[79,5166,5152],{"class":89},[79,5168,5155],{"class":89},[79,5170,5171],{"class":89}," activate\n",[20,5173,5174,5175,5178,5179,5181],{},"执行完毕若无异常，再调用",[76,5176,5177],{},"ros2 topic list","即可查看到",[76,5180,689],{},"话题了，说明地图消息已经被发布了。",[20,5183,5184],{},[23,5185,5186],{},"方式2：launch集成",[20,5188,5189,5190,5192,5193,5196],{},"方式1需要手动设置",[76,5191,4093],{},"生命周期，步骤稍显繁琐，因此，我们还可以将该节点集成进launch文件，以简化启动步骤。在launch目录下新建名为",[76,5194,5195],{},"map_server.launch.py","的文件，并输入如下内容：",[70,5198,5200],{"className":1238,"code":5199,"language":1240,"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,5201,5202,5208,5218,5228,5236,5256,5265,5277,5289,5300,5311,5331,5342,5347,5356,5368,5380,5392,5403,5420,5434,5448,5452],{"__ignoreMap":34},[79,5203,5204,5206],{"class":81,"line":82},[79,5205,1247],{"class":99},[79,5207,1250],{"class":106},[79,5209,5210,5212,5214,5216],{"class":81,"line":116},[79,5211,1259],{"class":99},[79,5213,1262],{"class":106},[79,5215,1247],{"class":99},[79,5217,1267],{"class":106},[79,5219,5220,5222,5224,5226],{"class":81,"line":138},[79,5221,1259],{"class":99},[79,5223,1298],{"class":106},[79,5225,1247],{"class":99},[79,5227,1303],{"class":106},[79,5229,5230,5232,5234],{"class":81,"line":145},[79,5231,1324],{"class":99},[79,5233,1327],{"class":85},[79,5235,1330],{"class":106},[79,5237,5238,5241,5243,5246,5249,5251,5254],{"class":81,"line":152},[79,5239,5240],{"class":106},"  map_file ",[79,5242,1338],{"class":99},[79,5244,5245],{"class":106}," os.path.join(",[79,5247,5248],{"class":89},"'map'",[79,5250,1457],{"class":106},[79,5252,5253],{"class":89},"'my_map.yaml'",[79,5255,1347],{"class":106},[79,5257,5258,5261,5263],{"class":81,"line":164},[79,5259,5260],{"class":106},"  map_server_node ",[79,5262,1338],{"class":99},[79,5264,1490],{"class":106},[79,5266,5267,5270,5272,5275],{"class":81,"line":176},[79,5268,5269],{"class":1393},"      package",[79,5271,1338],{"class":99},[79,5273,5274],{"class":89},"'nav2_map_server'",[79,5276,1387],{"class":106},[79,5278,5279,5282,5284,5287],{"class":81,"line":181},[79,5280,5281],{"class":1393},"      executable",[79,5283,1338],{"class":99},[79,5285,5286],{"class":89},"'map_server'",[79,5288,1387],{"class":106},[79,5290,5291,5294,5296,5298],{"class":81,"line":187},[79,5292,5293],{"class":1393},"      name",[79,5295,1338],{"class":99},[79,5297,5286],{"class":89},[79,5299,1387],{"class":106},[79,5301,5302,5305,5307,5309],{"class":81,"line":199},[79,5303,5304],{"class":1393},"      output",[79,5306,1338],{"class":99},[79,5308,1573],{"class":89},[79,5310,1387],{"class":106},[79,5312,5313,5316,5318,5321,5323,5325,5328],{"class":81,"line":1350},[79,5314,5315],{"class":1393},"      parameters",[79,5317,1338],{"class":99},[79,5319,5320],{"class":106},"[{",[79,5322,1344],{"class":89},[79,5324,1668],{"class":106},[79,5326,5327],{"class":1219},"True",[79,5329,5330],{"class":106},"},\n",[79,5332,5333,5336,5339],{"class":81,"line":1365},[79,5334,5335],{"class":106},"                  {",[79,5337,5338],{"class":89},"'yaml_filename'",[79,5340,5341],{"class":106},":map_file}]\n",[79,5343,5344],{"class":81,"line":1370},[79,5345,5346],{"class":106},"  )\n",[79,5348,5349,5352,5354],{"class":81,"line":1381},[79,5350,5351],{"class":106},"  manager_mapper_node ",[79,5353,1338],{"class":99},[79,5355,1490],{"class":106},[79,5357,5358,5361,5363,5366],{"class":81,"line":1390},[79,5359,5360],{"class":1393},"    package",[79,5362,1338],{"class":99},[79,5364,5365],{"class":89},"'nav2_lifecycle_manager'",[79,5367,1387],{"class":106},[79,5369,5370,5373,5375,5378],{"class":81,"line":1404},[79,5371,5372],{"class":1393},"    executable",[79,5374,1338],{"class":99},[79,5376,5377],{"class":89},"'lifecycle_manager'",[79,5379,1387],{"class":106},[79,5381,5382,5385,5387,5390],{"class":81,"line":1417},[79,5383,5384],{"class":1393},"    name",[79,5386,1338],{"class":99},[79,5388,5389],{"class":89},"'lifecycle_manager_mapper'",[79,5391,1387],{"class":106},[79,5393,5394,5397,5399,5401],{"class":81,"line":1427},[79,5395,5396],{"class":1393},"    output",[79,5398,1338],{"class":99},[79,5400,1573],{"class":89},[79,5402,1387],{"class":106},[79,5404,5405,5408,5410,5412,5414,5416,5418],{"class":81,"line":1435},[79,5406,5407],{"class":1393},"    parameters",[79,5409,1338],{"class":99},[79,5411,5320],{"class":106},[79,5413,1344],{"class":89},[79,5415,1668],{"class":106},[79,5417,5327],{"class":1219},[79,5419,5330],{"class":106},[79,5421,5422,5425,5428,5430,5432],{"class":81,"line":1451},[79,5423,5424],{"class":106},"      {",[79,5426,5427],{"class":89},"'autostart'",[79,5429,1668],{"class":106},[79,5431,5327],{"class":1219},[79,5433,5330],{"class":106},[79,5435,5436,5438,5441,5443,5445],{"class":81,"line":1465},[79,5437,5424],{"class":106},[79,5439,5440],{"class":89},"'node_names'",[79,5442,4858],{"class":106},[79,5444,5286],{"class":89},[79,5446,5447],{"class":106},"]}]\n",[79,5449,5450],{"class":81,"line":1477},[79,5451,5346],{"class":106},[79,5453,5454,5457],{"class":81,"line":1482},[79,5455,5456],{"class":99},"  return",[79,5458,5459],{"class":106}," LaunchDescription([map_server_node,manager_mapper_node])\n",[20,5461,5462,5463,5466,5467,5470],{},"在该文件中，使用了功能包中",[76,5464,5465],{},"nav2_lifecycle_manager","中的",[76,5468,5469],{},"lifecycle_manager","组件，该组件可以自动的配置、激活其所管理的具有生命周期的节点。构建功能包后并执行该launch文件，其最终效果与方式一类似。",[70,5472,5474],{"className":72,"code":5473,"language":74,"meta":34,"style":34},"ros2 launch mycar_map_server map_server.launch.py\n",[76,5475,5476],{"__ignoreMap":34},[79,5477,5478,5480,5482,5484],{"class":81,"line":82},[79,5479,1207],{"class":85},[79,5481,2362],{"class":89},[79,5483,5037],{"class":89},[79,5485,5486],{"class":89}," map_server.launch.py\n",[20,5488,5489],{},[23,5490,5491],{},"显示地图",[20,5493,5494,5495],{},"打开rviz2，然后添加Map插件，并将话题设置为\u002Fmap，并将该话题的",[76,5496,5497],{},"Durability Policy",[20,5499,5500,5501,5504],{},"选项设置为",[76,5502,5503],{},"Transient Local","，就可以正常显示地图数据了。",[20,5506,5507],{},[32,5508],{"alt":34,"src":5509},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1755.webp",[20,5511,5512],{},[32,5513],{"alt":34,"src":5514},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1756.webp",[20,5516,5517],{},[32,5518],{"alt":34,"src":5519},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1757.webp",[12,5521,5523],{"id":5522},"amcl自适应蒙特卡洛定位","AMCL自适应蒙特卡洛定位",[20,5525,5526],{},"定位是机器人在已知地图上确定自身位置的过程，为机器人的导航提供了基础信息。",[20,5528,5529,5530,4078],{},"Nav2中的定位技术技术称之为AMCL，全称Adaptive Monte Carlo Localization，即自适应蒙特卡洛定位，是一种基于粒子滤波器的定位算法。它通过蒙特卡洛方法进行自适应定位，利用对机器人周围环境的感知和观测数据的分析，来确定机器人在环境中的位置和姿态。在Nav2中对应的功能包为",[76,5531,5532],{},"nav2_amcl",[20,5534,5535],{},"在AMCL中，粒子滤波器的核心思想是使用一组粒子（样本）来代表机器人在地图上的可能位置。每个粒子都有一个权重，表示该粒子所代表的位置的置信度。算法会根据机器人的运动模型和传感器数据来更新这些粒子的位置和权重。随着时间的推移，粒子会逐渐收敛到机器人实际位置附近，从而实现对机器人位置的准确估计。",[16,5537,5538],{"id":5538},"定位节点说明",[20,5540,5541,5542,5544],{},"功能包",[76,5543,5532],{},"中的核心节点为amcl。该节点相关信息如下。",[20,5546,5547],{},[23,5548,5549],{},"1.订阅的话题",[537,5551,5552,5562],{},[540,5553,5554],{},[543,5555,5556,5558,5560],{},[546,5557,549],{"align":548},[546,5559,4132],{"align":548},[546,5561,555],{"align":548},[557,5563,5564,5573,5583,5594],{},[543,5565,5566,5568,5571],{},[562,5567,689],{"align":548},[562,5569,5570],{"align":548},"\u002Fnav_msgs\u002Fmsg\u002FOccupancyGrid",[562,5572,4987],{"align":548},[543,5574,5575,5577,5580],{},[562,5576,564],{"align":548},[562,5578,5579],{"align":548},"\u002Fsensor_msgs\u002Fmsg\u002FLaserScan",[562,5581,5582],{"align":548},"激光雷达数据",[543,5584,5585,5588,5591],{},[562,5586,5587],{"align":548},"\u002Finitialpose",[562,5589,5590],{"align":548},"\u002Fgeometry_msgs\u002Fmsg\u002FPoseWithCovarianceStamped",[562,5592,5593],{"align":548},"用来初始化粒子滤波器的均值和协方差",[543,5595,5596,5598,5601],{},[562,5597,575],{"align":548},[562,5599,5600],{"align":548},"\u002Ftf2_msgs\u002Fmsg\u002FTFMessage",[562,5602,5603],{"align":548},"坐标变换消息",[20,5605,5606],{},[23,5607,5608],{},"2.发布的话题",[537,5610,5611,5621],{},[540,5612,5613],{},[543,5614,5615,5617,5619],{},[546,5616,549],{"align":548},[546,5618,4132],{"align":548},[546,5620,555],{"align":548},[557,5622,5623,5633,5644],{},[543,5624,5625,5628,5630],{},[562,5626,5627],{"align":548},"\u002Famcl_pose",[562,5629,5590],{"align":548},[562,5631,5632],{"align":548},"机器人在地图中的位姿估计",[543,5634,5635,5638,5641],{},[562,5636,5637],{"align":548},"\u002Fparticle_cloud",[562,5639,5640],{"align":548},"\u002Fnav2_msgs\u002Fmsg\u002FParticleCloud",[562,5642,5643],{"align":548},"位姿估计集合，rviz中可以被 PoseArray 订阅然后图形化显示机器人的位姿估计集合",[543,5645,5646,5648,5650],{},[562,5647,575],{"align":548},[562,5649,5600],{"align":548},[562,5651,5652],{"align":548},"发布从 odom 与 map 的转换",[20,5654,5655],{},[23,5656,5657],{},"3.发布的服务",[537,5659,5660,5670],{},[540,5661,5662],{},[543,5663,5664,5666,5668],{},[546,5665,549],{"align":548},[546,5667,4132],{"align":548},[546,5669,555],{"align":548},[557,5671,5672,5683],{},[543,5673,5674,5677,5680],{},[562,5675,5676],{"align":548},"\u002Freinitialize_global_localization",[562,5678,5679],{"align":548},"std_srvs\u002Fsrv\u002FEmpty",[562,5681,5682],{"align":548},"在全局范围内初始化粒子位姿",[543,5684,5685,5688,5690],{},[562,5686,5687],{"align":548},"\u002Frequest_nomotion_update",[562,5689,5679],{"align":548},[562,5691,5692],{"align":548},"在没有运动模型更新的情况下手动触发粒子群的更新",[20,5694,5695],{},[23,5696,5697],{},"4.参数",[20,5699,5700],{},[23,5701,5702],{},"通用参数",[48,5704,5705,5714,5724,5733,5742,5750,5756],{},[51,5706,5707,5710,5711,5713],{},[76,5708,5709],{},"bond_disable_heartbeat_timeout",": 设置为",[76,5712,2024],{},"时，禁用amcl节点与其他节点之间基于心跳的超时检测。这通常用于当节点之间的连接非常稳定，不需要频繁的心跳检测来确认连接状态时。",[51,5715,5716,5719,5720,5723],{},[76,5717,5718],{},"base_frame_id",": 定义机器人基坐标系的ID，通常是",[76,5721,5722],{},"base_link","或类似的名称。",[51,5725,5726,5729,5730,4078],{},[76,5727,5728],{},"global_frame_id",": 定义全局地图坐标系的ID，通常是",[76,5731,5732],{},"map",[51,5734,5735,5738,5739,4078],{},[76,5736,5737],{},"odom_frame_id",": 定义里程计坐标系的ID，通常是",[76,5740,5741],{},"odom",[51,5743,5744,5710,5747,5749],{},[76,5745,5746],{},"tf_broadcast",[76,5748,2024],{},"时，amcl节点会发布从里程计坐标系到全局地图坐标系的变换。",[51,5751,5752,5755],{},[76,5753,5754],{},"transform_tolerance",": 设置TF变换的容忍度，用于处理TF树中的时间不一致性。",[51,5757,5758,5710,5761,5763],{},[76,5759,5760],{},"use_sim_time",[76,5762,2024],{},"时，amcl将使用ROS 2的模拟时间（如果可用）。这在仿真环境中很有用。",[20,5765,5766],{},[23,5767,5768],{},"激光模型参数",[48,5770,5771,5781,5790,5796],{},[51,5772,5773,5776,5777,5780],{},[76,5774,5775],{},"laser_model_type",": 设置激光模型类型，",[76,5778,5779],{},"likelihood_field","是一种常用的模型，它考虑了激光束击中障碍物的概率。",[51,5782,5783,2679,5786,5789],{},[76,5784,5785],{},"laser_max_range",[76,5787,5788],{},"laser_min_range",": 分别设置激光雷达的最大和最小探测范围。",[51,5791,5792,5795],{},[76,5793,5794],{},"laser_likelihood_max_dist",": 设置激光模型考虑的最大距离，超过这个距离的数据将被忽略。",[51,5797,5798,5801,5802,5805,5806,5805,5809,5812,5813,5815,5816,5819],{},[76,5799,5800],{},"do_beamskip","和相关参数（",[76,5803,5804],{},"beam_skip_distance","、",[76,5807,5808],{},"beam_skip_threshold",[76,5810,5811],{},"beam_skip_error_threshold","）: 这些参数用于控制是否跳过某些激光束的处理，以减少计算量。然而，",[76,5814,5800],{},"被设置为",[76,5817,5818],{},"false","，意味着不跳过任何激光束。",[20,5821,5822],{},[23,5823,5824],{},"粒子滤波器参数",[48,5826,5827,5839,5848,5854],{},[51,5828,5829,5832,5835,5838],{},[76,5830,5831],{},"alpha1",[23,5833,5834],{},"到",[76,5836,5837],{},"alpha5",": 这些参数用于控制粒子滤波器中的权重更新过程，但它们的具体作用可能因amcl的实现而异。在标准的amcl实现中，这些参数可能不是直接使用的。",[51,5840,5841,2679,5844,5847],{},[76,5842,5843],{},"max_particles",[76,5845,5846],{},"min_particles",": 分别设置粒子滤波器的最大和最小粒子数。",[51,5849,5850,5853],{},[76,5851,5852],{},"resample_interval",": 设置在重采样前需要的滤波更新次数。",[51,5855,5856,2679,5859,5862],{},[76,5857,5858],{},"pf_err",[76,5860,5861],{},"pf_z",": 这些参数用于控制粒子滤波器的性能，但它们的具体作用可能依赖于amcl的实现细节。",[20,5864,5865],{},[23,5866,5867],{},"初始位姿参数",[48,5869,5870,5882,5889],{},[51,5871,5872,5875,5876,5815,5879,5881],{},[76,5873,5874],{},"initial_pose",": 定义了机器人的初始位姿（x, y, yaw, z），但在实际使用中，如果",[76,5877,5878],{},"set_initial_pose",[76,5880,2024],{},"，则这个初始位姿可能会被通过服务请求设置的初始位姿所覆盖。",[51,5883,5884,5710,5886,5888],{},[76,5885,5878],{},[76,5887,2024],{},"时，允许通过服务请求来设置机器人的初始位姿。",[51,5890,5891,5710,5894,5896],{},[76,5892,5893],{},"always_reset_initial_pose",[76,5895,5818],{},"时，表示不会在每个定位会话开始时自动重置初始位姿。",[20,5898,5899],{},[23,5900,5901],{},"其他参数",[48,5903,5904,5913,5919,5924,5930,5939],{},[51,5905,5906,5909,5910,5912],{},[76,5907,5908],{},"first_map_only",": 当设置为",[76,5911,5818],{},"时，表示amcl将订阅并处理不断更新的地图话题。",[51,5914,5915,5918],{},[76,5916,5917],{},"map_topic",": 定义地图话题的名称，amcl将订阅这个话题以获取地图信息。",[51,5920,5921,5923],{},[76,5922,906],{},": 定义激光雷达扫描数据话题的名称，amcl将订阅这个话题以获取用于定位的数据。",[51,5925,5926,5929],{},[76,5927,5928],{},"save_pose_rate",": 设置保存机器人位姿的速率（以Hz为单位）。",[51,5931,5932,2679,5935,5938],{},[76,5933,5934],{},"recovery_alpha_fast",[76,5936,5937],{},"recovery_alpha_slow",": 这些参数在标准的amcl实现中可能不是直接使用的，它们可能属于某个特定版本的amcl或扩展。",[51,5940,5941,5805,5944,5805,5947,5805,5950,2679,5953,5956],{},[76,5942,5943],{},"z_hit",[76,5945,5946],{},"z_rand",[76,5948,5949],{},"z_short",[76,5951,5952],{},"z_max",[76,5954,5955],{},"sigma_hit",": 这些参数定义了激光模型中的概率分布，用于计算激光束击中障碍物或随机位置的概率。",[16,5958,5959],{"id":5959},"定位节点基本操作",[20,5961,5962],{},[23,5963,5964],{},"1.准备工作",[20,5966,5021],{},[70,5968,5970],{"className":72,"code":5969,"language":74,"meta":34,"style":34},"ros2 pkg create mycar_localization --dependencies nav2_amcl mycar_map_server\n",[76,5971,5972],{"__ignoreMap":34},[79,5973,5974,5976,5978,5980,5983,5985,5988],{"class":81,"line":82},[79,5975,1207],{"class":85},[79,5977,1210],{"class":89},[79,5979,1213],{"class":89},[79,5981,5982],{"class":89}," mycar_localization",[79,5984,1220],{"class":1219},[79,5986,5987],{"class":89}," nav2_amcl",[79,5989,5990],{"class":89}," mycar_map_server\n",[20,5992,5993],{},[23,5994,5995],{},"2.编写launch文件与参数文件",[20,5997,5998,5999,5196],{},"在功能包下，新建launch和params文件夹，在launch目录下新建名为",[76,6000,6001],{},"mycar_loca.launch.py",[70,6003,6005],{"className":1238,"code":6004,"language":1240,"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,6006,6007,6013,6023,6027,6037,6048,6058,6070,6074,6084,6088,6092,6100,6104,6112,6118,6127,6131,6135,6145,6155,6162,6167,6171,6175,6184,6195,6206,6216,6226,6234,6239,6255,6260,6264,6268,6277,6287,6297,6308,6318,6326,6338,6350,6363,6367,6371,6375,6385,6390,6395,6405,6412,6417,6422,6427,6437,6448,6453,6457,6461,6467,6471,6476,6482,6488],{"__ignoreMap":34},[79,6008,6009,6011],{"class":81,"line":82},[79,6010,1247],{"class":99},[79,6012,1250],{"class":106},[79,6014,6015,6017,6019,6021],{"class":81,"line":116},[79,6016,1259],{"class":99},[79,6018,1310],{"class":106},[79,6020,1247],{"class":99},[79,6022,1315],{"class":106},[79,6024,6025],{"class":81,"line":138},[79,6026,142],{"emptyLinePlaceholder":141},[79,6028,6029,6031,6033,6035],{"class":81,"line":145},[79,6030,1259],{"class":99},[79,6032,1262],{"class":106},[79,6034,1247],{"class":99},[79,6036,1267],{"class":106},[79,6038,6039,6041,6043,6045],{"class":81,"line":152},[79,6040,1259],{"class":99},[79,6042,1274],{"class":106},[79,6044,1247],{"class":99},[79,6046,6047],{"class":106}," DeclareLaunchArgument, IncludeLaunchDescription\n",[79,6049,6050,6052,6054,6056],{"class":81,"line":164},[79,6051,1259],{"class":99},[79,6053,1286],{"class":106},[79,6055,1247],{"class":99},[79,6057,1291],{"class":106},[79,6059,6060,6062,6065,6067],{"class":81,"line":176},[79,6061,1259],{"class":99},[79,6063,6064],{"class":106}," launch.launch_description_sources ",[79,6066,1247],{"class":99},[79,6068,6069],{"class":106}," PythonLaunchDescriptionSource\n",[79,6071,6072],{"class":81,"line":181},[79,6073,142],{"emptyLinePlaceholder":141},[79,6075,6076,6078,6080,6082],{"class":81,"line":187},[79,6077,1259],{"class":99},[79,6079,1298],{"class":106},[79,6081,1247],{"class":99},[79,6083,1303],{"class":106},[79,6085,6086],{"class":81,"line":199},[79,6087,142],{"emptyLinePlaceholder":141},[79,6089,6090],{"class":81,"line":1350},[79,6091,142],{"emptyLinePlaceholder":141},[79,6093,6094,6096,6098],{"class":81,"line":1365},[79,6095,1324],{"class":99},[79,6097,1327],{"class":85},[79,6099,1330],{"class":106},[79,6101,6102],{"class":81,"line":1370},[79,6103,142],{"emptyLinePlaceholder":141},[79,6105,6106,6108,6110],{"class":81,"line":1381},[79,6107,3099],{"class":106},[79,6109,1338],{"class":99},[79,6111,1378],{"class":106},[79,6113,6114,6116],{"class":81,"line":1390},[79,6115,1384],{"class":89},[79,6117,1387],{"class":106},[79,6119,6120,6122,6124],{"class":81,"line":1404},[79,6121,1394],{"class":1393},[79,6123,1338],{"class":99},[79,6125,6126],{"class":89},"'false'\n",[79,6128,6129],{"class":81,"line":1417},[79,6130,3252],{"class":106},[79,6132,6133],{"class":81,"line":1427},[79,6134,142],{"emptyLinePlaceholder":141},[79,6136,6137,6140,6142],{"class":81,"line":1435},[79,6138,6139],{"class":106},"    amcl_yaml ",[79,6141,1338],{"class":99},[79,6143,6144],{"class":106}," os.path.join(\n",[79,6146,6147,6150,6153],{"class":81,"line":1451},[79,6148,6149],{"class":106},"        get_package_share_directory(",[79,6151,6152],{"class":89},"'mycar_localization'",[79,6154,1448],{"class":106},[79,6156,6157,6160],{"class":81,"line":1465},[79,6158,6159],{"class":89},"        'params'",[79,6161,1387],{"class":106},[79,6163,6164],{"class":81,"line":1477},[79,6165,6166],{"class":89},"        'amcl.yaml'\n",[79,6168,6169],{"class":81,"line":1482},[79,6170,3252],{"class":106},[79,6172,6173],{"class":81,"line":1493},[79,6174,142],{"emptyLinePlaceholder":141},[79,6176,6177,6180,6182],{"class":81,"line":1504},[79,6178,6179],{"class":106},"    amcl_node ",[79,6181,1338],{"class":99},[79,6183,1490],{"class":106},[79,6185,6186,6188,6190,6193],{"class":81,"line":1510},[79,6187,1530],{"class":1393},[79,6189,1338],{"class":99},[79,6191,6192],{"class":89},"'nav2_amcl'",[79,6194,1387],{"class":106},[79,6196,6197,6199,6201,6204],{"class":81,"line":1521},[79,6198,1543],{"class":1393},[79,6200,1338],{"class":99},[79,6202,6203],{"class":89},"'amcl'",[79,6205,1387],{"class":106},[79,6207,6208,6210,6212,6214],{"class":81,"line":1527},[79,6209,1556],{"class":1393},[79,6211,1338],{"class":99},[79,6213,6203],{"class":89},[79,6215,1387],{"class":106},[79,6217,6218,6220,6222,6224],{"class":81,"line":1540},[79,6219,1568],{"class":1393},[79,6221,1338],{"class":99},[79,6223,1573],{"class":89},[79,6225,1387],{"class":106},[79,6227,6228,6230,6232],{"class":81,"line":1553},[79,6229,1496],{"class":1393},[79,6231,1338],{"class":99},[79,6233,1501],{"class":106},[79,6235,6236],{"class":81,"line":1565},[79,6237,6238],{"class":106},"            amcl_yaml,\n",[79,6240,6241,6243,6245,6247,6249,6252],{"class":81,"line":1578},[79,6242,3299],{"class":106},[79,6244,1344],{"class":89},[79,6246,3191],{"class":106},[79,6248,1344],{"class":89},[79,6250,6251],{"class":106},")} ",[79,6253,6254],{"class":148},"# 覆盖掉yaml里的use_sim_time参数,以launch启动的设置为准.\n",[79,6256,6257],{"class":81,"line":1583},[79,6258,6259],{"class":106},"        ]\n",[79,6261,6262],{"class":81,"line":1594},[79,6263,3252],{"class":106},[79,6265,6266],{"class":81,"line":1599},[79,6267,142],{"emptyLinePlaceholder":141},[79,6269,6270,6273,6275],{"class":81,"line":1605},[79,6271,6272],{"class":106},"    manager_localization_node ",[79,6274,1338],{"class":99},[79,6276,1490],{"class":106},[79,6278,6279,6281,6283,6285],{"class":81,"line":1611},[79,6280,1530],{"class":1393},[79,6282,1338],{"class":99},[79,6284,5365],{"class":89},[79,6286,1387],{"class":106},[79,6288,6289,6291,6293,6295],{"class":81,"line":1617},[79,6290,1543],{"class":1393},[79,6292,1338],{"class":99},[79,6294,5377],{"class":89},[79,6296,1387],{"class":106},[79,6298,6299,6301,6303,6306],{"class":81,"line":1622},[79,6300,1556],{"class":1393},[79,6302,1338],{"class":99},[79,6304,6305],{"class":89},"'lifecycle_manager_localization'",[79,6307,1387],{"class":106},[79,6309,6310,6312,6314,6316],{"class":81,"line":2005},[79,6311,1568],{"class":1393},[79,6313,1338],{"class":99},[79,6315,1573],{"class":89},[79,6317,1387],{"class":106},[79,6319,6320,6322,6324],{"class":81,"line":2016},[79,6321,1496],{"class":1393},[79,6323,1338],{"class":99},[79,6325,1501],{"class":106},[79,6327,6328,6330,6332,6334,6336],{"class":81,"line":2029},[79,6329,3299],{"class":106},[79,6331,1344],{"class":89},[79,6333,3191],{"class":106},[79,6335,1344],{"class":89},[79,6337,3308],{"class":106},[79,6339,6340,6342,6344,6346,6348],{"class":81,"line":2043},[79,6341,3299],{"class":106},[79,6343,5427],{"class":89},[79,6345,1668],{"class":106},[79,6347,5327],{"class":1219},[79,6349,5330],{"class":106},[79,6351,6352,6354,6356,6358,6360],{"class":81,"line":2056},[79,6353,3299],{"class":106},[79,6355,5440],{"class":89},[79,6357,4858],{"class":106},[79,6359,6203],{"class":89},[79,6361,6362],{"class":106},"]}\n",[79,6364,6365],{"class":81,"line":2070},[79,6366,6259],{"class":106},[79,6368,6369],{"class":81,"line":2081},[79,6370,3252],{"class":106},[79,6372,6373],{"class":81,"line":2086},[79,6374,142],{"emptyLinePlaceholder":141},[79,6376,6377,6380,6382],{"class":81,"line":2096},[79,6378,6379],{"class":106},"    map_server_launch ",[79,6381,1338],{"class":99},[79,6383,6384],{"class":106}," IncludeLaunchDescription(\n",[79,6386,6387],{"class":81,"line":2107},[79,6388,6389],{"class":106},"        PythonLaunchDescriptionSource(\n",[79,6391,6392],{"class":81,"line":2119},[79,6393,6394],{"class":106},"            os.path.join(\n",[79,6396,6397,6400,6403],{"class":81,"line":2124},[79,6398,6399],{"class":106},"                get_package_share_directory(",[79,6401,6402],{"class":89},"'mycar_map_server'",[79,6404,1448],{"class":106},[79,6406,6407,6410],{"class":81,"line":2135},[79,6408,6409],{"class":89},"                'launch'",[79,6411,1387],{"class":106},[79,6413,6414],{"class":81,"line":2145},[79,6415,6416],{"class":89},"                'map_server.launch.py'\n",[79,6418,6419],{"class":81,"line":2156},[79,6420,6421],{"class":106},"            )\n",[79,6423,6424],{"class":81,"line":2161},[79,6425,6426],{"class":106},"        ),\n",[79,6428,6429,6432,6434],{"class":81,"line":2175},[79,6430,6431],{"class":1393},"        launch_arguments",[79,6433,1338],{"class":99},[79,6435,6436],{"class":106},"{\n",[79,6438,6439,6442,6444,6446],{"class":81,"line":2188},[79,6440,6441],{"class":89},"            'use_sim_time'",[79,6443,3191],{"class":106},[79,6445,1344],{"class":89},[79,6447,1347],{"class":106},[79,6449,6450],{"class":81,"line":2193},[79,6451,6452],{"class":106},"        }.items()\n",[79,6454,6455],{"class":81,"line":2207},[79,6456,3252],{"class":106},[79,6458,6459],{"class":81,"line":2221},[79,6460,142],{"emptyLinePlaceholder":141},[79,6462,6463,6465],{"class":81,"line":2235},[79,6464,1625],{"class":99},[79,6466,3335],{"class":106},[79,6468,6469],{"class":81,"line":2246},[79,6470,3340],{"class":106},[79,6472,6473],{"class":81,"line":2256},[79,6474,6475],{"class":106},"        map_server_launch,\n",[79,6477,6479],{"class":81,"line":6478},64,[79,6480,6481],{"class":106},"        amcl_node,\n",[79,6483,6485],{"class":81,"line":6484},65,[79,6486,6487],{"class":106},"        manager_localization_node,\n",[79,6489,6491],{"class":81,"line":6490},66,[79,6492,3360],{"class":106},[20,6494,6495,6496,6499,6500,6503,6504,6507,6508,6510,6511,6513],{},"在上述代码中，创建了",[76,6497,6498],{},"amcl","节点，并从",[76,6501,6502],{},"params","目录加载了名为",[76,6505,6506],{},"amcl.yaml","的配置文件，且由于",[76,6509,6498],{},"也是拥有生命周期的节点，所以将其添加进了生命周期管理器。最后，定位必须依赖于地图信息，因此又包含了 ",[23,6512,5014],{},"  中的launch文件，以加载地图。",[20,6515,6516,6517,5196],{},"在params目录下新建名为",[76,6518,6506],{},[70,6520,6522],{"className":1641,"code":6521,"language":1643,"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,6523,6524,6531,6537,6549,6558,6567,6576,6585,6594,6604,6613,6622,6632,6641,6651,6660,6669,6679,6689,6699,6709,6719,6729,6739,6748,6758,6768,6777,6786,6796,6805,6814,6823,6832,6841,6850,6859,6868,6877,6886,6895],{"__ignoreMap":34},[79,6525,6526,6529],{"class":81,"line":82},[79,6527,6528],{"class":1650},"\u002F**",[79,6530,1653],{"class":106},[79,6532,6533,6535],{"class":81,"line":116},[79,6534,1658],{"class":1650},[79,6536,1653],{"class":106},[79,6538,6539,6542,6544,6546],{"class":81,"line":138},[79,6540,6541],{"class":1650},"    use_sim_time",[79,6543,1668],{"class":106},[79,6545,5327],{"class":1219},[79,6547,6548],{"class":148},"  # 由launch的设置覆盖\n",[79,6550,6551,6554,6556],{"class":81,"line":145},[79,6552,6553],{"class":1650},"    alpha1",[79,6555,1668],{"class":106},[79,6557,1886],{"class":1219},[79,6559,6560,6563,6565],{"class":81,"line":152},[79,6561,6562],{"class":1650},"    alpha2",[79,6564,1668],{"class":106},[79,6566,1886],{"class":1219},[79,6568,6569,6572,6574],{"class":81,"line":164},[79,6570,6571],{"class":1650},"    alpha3",[79,6573,1668],{"class":106},[79,6575,1886],{"class":1219},[79,6577,6578,6581,6583],{"class":81,"line":176},[79,6579,6580],{"class":1650},"    alpha4",[79,6582,1668],{"class":106},[79,6584,1886],{"class":1219},[79,6586,6587,6590,6592],{"class":81,"line":181},[79,6588,6589],{"class":1650},"    alpha5",[79,6591,1668],{"class":106},[79,6593,1886],{"class":1219},[79,6595,6596,6599,6601],{"class":81,"line":187},[79,6597,6598],{"class":1650},"    base_frame_id",[79,6600,1668],{"class":106},[79,6602,6603],{"class":89},"\"base_link\"\n",[79,6605,6606,6609,6611],{"class":81,"line":199},[79,6607,6608],{"class":1650},"    beam_skip_distance",[79,6610,1668],{"class":106},[79,6612,1876],{"class":1219},[79,6614,6615,6618,6620],{"class":81,"line":1350},[79,6616,6617],{"class":1650},"    beam_skip_error_threshold",[79,6619,1668],{"class":106},[79,6621,2243],{"class":1219},[79,6623,6624,6627,6629],{"class":81,"line":1365},[79,6625,6626],{"class":1650},"    beam_skip_threshold",[79,6628,1668],{"class":106},[79,6630,6631],{"class":1219},"0.3\n",[79,6633,6634,6637,6639],{"class":81,"line":1370},[79,6635,6636],{"class":1650},"    do_beamskip",[79,6638,1668],{"class":106},[79,6640,1811],{"class":1219},[79,6642,6643,6646,6648],{"class":81,"line":1381},[79,6644,6645],{"class":1650},"    global_frame_id",[79,6647,1668],{"class":106},[79,6649,6650],{"class":89},"\"map\"\n",[79,6652,6653,6656,6658],{"class":81,"line":1390},[79,6654,6655],{"class":1650},"    lambda_short",[79,6657,1668],{"class":106},[79,6659,1950],{"class":1219},[79,6661,6662,6665,6667],{"class":81,"line":1404},[79,6663,6664],{"class":1650},"    laser_likelihood_max_dist",[79,6666,1668],{"class":106},[79,6668,1844],{"class":1219},[79,6670,6671,6674,6676],{"class":81,"line":1417},[79,6672,6673],{"class":1650},"    laser_max_range",[79,6675,1668],{"class":106},[79,6677,6678],{"class":1219},"100.0\n",[79,6680,6681,6684,6686],{"class":81,"line":1427},[79,6682,6683],{"class":1650},"    laser_min_range",[79,6685,1668],{"class":106},[79,6687,6688],{"class":1219},"-1.0\n",[79,6690,6691,6694,6696],{"class":81,"line":1435},[79,6692,6693],{"class":1650},"    laser_model_type",[79,6695,1668],{"class":106},[79,6697,6698],{"class":89},"\"likelihood_field\"\n",[79,6700,6701,6704,6706],{"class":81,"line":1451},[79,6702,6703],{"class":1650},"    max_beams",[79,6705,1668],{"class":106},[79,6707,6708],{"class":1219},"60\n",[79,6710,6711,6714,6716],{"class":81,"line":1465},[79,6712,6713],{"class":1650},"    max_particles",[79,6715,1668],{"class":106},[79,6717,6718],{"class":1219},"2000\n",[79,6720,6721,6724,6726],{"class":81,"line":1477},[79,6722,6723],{"class":1650},"    min_particles",[79,6725,1668],{"class":106},[79,6727,6728],{"class":1219},"500\n",[79,6730,6731,6734,6736],{"class":81,"line":1482},[79,6732,6733],{"class":1650},"    odom_frame_id",[79,6735,1668],{"class":106},[79,6737,6738],{"class":89},"\"odom\"\n",[79,6740,6741,6744,6746],{"class":81,"line":1493},[79,6742,6743],{"class":1650},"    pf_err",[79,6745,1668],{"class":106},[79,6747,1854],{"class":1219},[79,6749,6750,6753,6755],{"class":81,"line":1504},[79,6751,6752],{"class":1650},"    pf_z",[79,6754,1668],{"class":106},[79,6756,6757],{"class":1219},"0.99\n",[79,6759,6760,6763,6765],{"class":81,"line":1510},[79,6761,6762],{"class":1650},"    recovery_alpha_fast",[79,6764,1668],{"class":106},[79,6766,6767],{"class":1219},"0.0\n",[79,6769,6770,6773,6775],{"class":81,"line":1521},[79,6771,6772],{"class":1650},"    recovery_alpha_slow",[79,6774,1668],{"class":106},[79,6776,6767],{"class":1219},[79,6778,6779,6782,6784],{"class":81,"line":1527},[79,6780,6781],{"class":1650},"    resample_interval",[79,6783,1668],{"class":106},[79,6785,1821],{"class":1219},[79,6787,6788,6791,6793],{"class":81,"line":1540},[79,6789,6790],{"class":1650},"    robot_model_type",[79,6792,1668],{"class":106},[79,6794,6795],{"class":89},"\"nav2_amcl::DifferentialMotionModel\"\n",[79,6797,6798,6801,6803],{"class":81,"line":1553},[79,6799,6800],{"class":1650},"    save_pose_rate",[79,6802,1668],{"class":106},[79,6804,1876],{"class":1219},[79,6806,6807,6810,6812],{"class":81,"line":1565},[79,6808,6809],{"class":1650},"    sigma_hit",[79,6811,1668],{"class":106},[79,6813,1886],{"class":1219},[79,6815,6816,6819,6821],{"class":81,"line":1578},[79,6817,6818],{"class":1650},"    tf_broadcast",[79,6820,1668],{"class":106},[79,6822,1918],{"class":1219},[79,6824,6825,6828,6830],{"class":81,"line":1583},[79,6826,6827],{"class":1650},"    transform_tolerance",[79,6829,1668],{"class":106},[79,6831,1844],{"class":1219},[79,6833,6834,6837,6839],{"class":81,"line":1594},[79,6835,6836],{"class":1650},"    update_min_a",[79,6838,1668],{"class":106},[79,6840,1886],{"class":1219},[79,6842,6843,6846,6848],{"class":81,"line":1599},[79,6844,6845],{"class":1650},"    update_min_d",[79,6847,1668],{"class":106},[79,6849,4904],{"class":1219},[79,6851,6852,6855,6857],{"class":81,"line":1605},[79,6853,6854],{"class":1650},"    z_hit",[79,6856,1668],{"class":106},[79,6858,1876],{"class":1219},[79,6860,6861,6864,6866],{"class":81,"line":1611},[79,6862,6863],{"class":1650},"    z_max",[79,6865,1668],{"class":106},[79,6867,1854],{"class":1219},[79,6869,6870,6873,6875],{"class":81,"line":1617},[79,6871,6872],{"class":1650},"    z_rand",[79,6874,1668],{"class":106},[79,6876,1876],{"class":1219},[79,6878,6879,6882,6884],{"class":81,"line":1622},[79,6880,6881],{"class":1650},"    z_short",[79,6883,1668],{"class":106},[79,6885,1854],{"class":1219},[79,6887,6888,6890,6892],{"class":81,"line":2005},[79,6889,1760],{"class":1650},[79,6891,1668],{"class":106},[79,6893,6894],{"class":89},"scan\n",[79,6896,6897,6900,6902],{"class":81,"line":2016},[79,6898,6899],{"class":1650},"    set_initial_pose",[79,6901,1668],{"class":106},[79,6903,1811],{"class":1219},[20,6905,6906,6907,6909],{},"关于参数的具体含义，可以参考 ",[23,6908,5538],{}," 中参数相关内容。",[20,6911,6912],{},[23,6913,6914],{},"3.编辑配置文件",[20,6916,2274,6917,2278],{},[76,6918,2277],{},[70,6920,6921],{"className":2281,"code":2282,"language":2283,"meta":34,"style":34},[76,6922,6923,6929,6935],{"__ignoreMap":34},[79,6924,6925,6927],{"class":81,"line":82},[79,6926,2290],{"class":99},[79,6928,2293],{"class":106},[79,6930,6931,6933],{"class":81,"line":116},[79,6932,2298],{"class":106},[79,6934,2301],{"class":99},[79,6936,6937],{"class":81,"line":138},[79,6938,1347],{"class":106},[20,6940,6941],{},[23,6942,6943],{},"4.编译",[20,6945,2313],{},[70,6947,6949],{"className":72,"code":6948,"language":74,"meta":34,"style":34},"colcon build --packages-select mycar_localization\n",[76,6950,6951],{"__ignoreMap":34},[79,6952,6953,6955,6957,6959],{"class":81,"line":82},[79,6954,2323],{"class":85},[79,6956,2326],{"class":89},[79,6958,2329],{"class":1219},[79,6960,6961],{"class":89}," mycar_localization\n",[20,6963,6964],{},[23,6965,6966],{},"5.执行",[20,6968,4003],{},[70,6970,6971],{"className":72,"code":2345,"language":74,"meta":34,"style":34},[76,6972,6973,6979],{"__ignoreMap":34},[79,6974,6975,6977],{"class":81,"line":82},[79,6976,2352],{"class":1219},[79,6978,2355],{"class":89},[79,6980,6981,6983,6985,6987],{"class":81,"line":116},[79,6982,1207],{"class":85},[79,6984,2362],{"class":89},[79,6986,2365],{"class":89},[79,6988,2368],{"class":89},[20,6990,4026],{},[70,6992,6994],{"className":72,"code":6993,"language":74,"meta":34,"style":34},". install\u002Fsetup.bash\nros2 launch mycar_localization mycar_loca.launch.py use_sim_time:=True\n",[76,6995,6996,7002],{"__ignoreMap":34},[79,6997,6998,7000],{"class":81,"line":82},[79,6999,2352],{"class":1219},[79,7001,2355],{"class":89},[79,7003,7004,7006,7008,7010,7013],{"class":81,"line":116},[79,7005,1207],{"class":85},[79,7007,2362],{"class":89},[79,7009,5982],{"class":89},[79,7011,7012],{"class":89}," mycar_loca.launch.py",[79,7014,2398],{"class":89},[20,7016,7017],{},"（3）启动键盘控制节点以作备用：",[70,7019,7021],{"className":72,"code":7020,"language":74,"meta":34,"style":34},"ros2 run teleop_twist_keyboard teleop_twist_keyboard\n",[76,7022,7023],{"__ignoreMap":34},[79,7024,7025,7027,7029,7032],{"class":81,"line":82},[79,7026,1207],{"class":85},[79,7028,4259],{"class":89},[79,7030,7031],{"class":89}," teleop_twist_keyboard",[79,7033,7034],{"class":89}," teleop_twist_keyboard\n",[20,7036,7037,7038,7040],{},"（4）在rviz2中，将Fixed Frme设置为map，添加TF插件，按照 ",[23,7039,5014],{},"  添加并显示地图。",[20,7042,7043,7044,7047],{},"接下来，点击rviz2菜单栏的",[76,7045,7046],{},"2D Pose Estimate","在地图中为机器人设置一个初始位姿。",[20,7049,7050],{},"这里需要给一个大概的机器人位置和机器人的朝向，不是很准确也可以，机器人会在运动中逐渐通过AMCL校准。",[20,7052,7053,7054,7056],{},"先点击",[76,7055,7046],{},"，左键在地图上点击机器人所在位置，长摁别松手，鼠标往机器人朝向的位置划，出现下方这种绿色箭头，再松手即可。",[20,7058,7059],{},[32,7060],{"alt":34,"src":7061},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1758.webp",[20,7063,7064,7065,7068,7069,7071,7072,7075,7076,7079],{},"再添加",[76,7066,7067],{},"ParticleCloud","插件，将话题设置为",[76,7070,5637],{},"，并将话题下",[76,7073,7074],{},"Reliability Policy","设置为",[76,7077,7078],{},"Best Effort","，最后使用键盘控制机器人运动时，会发现，机器人周边会出现点云，并且随着机器人的运动，点云会出现不同程度的收敛或发散。",[20,7081,7082],{},[32,7083],{"alt":34,"src":7084},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1759.webp",[20,7086,7087],{},[32,7088],{"alt":34,"src":7089},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1760.webp",[20,7091,7092],{},[32,7093],{"alt":34,"src":7094},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1761.webp",[20,7096,7097],{},"即便你的机器人撞墙了，rviz2和Gazebo的机器人位置完全偏移了，只要再让机器人运动一会儿，机器人位置会被重新预估出来，AMCL非常强。",[20,7099,7100],{},[32,7101],{"alt":34,"src":7102},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1762.webp",[20,7104,7105],{},"如上图位置已经完全偏移了。",[20,7107,7108],{},[32,7109],{"alt":34,"src":7110},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1763.webp",[20,7112,7113],{},"经过一段时间行驶，姿态位置再次被预估成功。",[12,7115,7116],{"id":7116},"导航服务器",[20,7118,7119],{},"本节将介绍导航服务器中核心节点，实现基本导航功能，并将导航与SLAM集成，以实现自主探索建图。",[20,7121,7122,7123,7126],{},"下方网站是官方NAV2的各个节点的参数说明(",[23,7124,7125],{},"调参的时候非常常用的网站","):",[20,7128,7129],{},[291,7130,293],{"href":293,"rel":7131},[295],[20,7133,7134],{},"看不懂的英文可以用沉浸式翻译这个chrome插件来翻译,可以进行中英文对照翻译,非常好用.",[20,7136,7137],{},[291,7138,7139],{"href":7139,"rel":7140},"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Fimmersive-translate-trans\u002Fbpoadfkcbjbfhfodiogcnhhhpibjhbnh?utm%5C_source=official&pli=1",[295],[20,7142,7143],{},[291,7144,7145],{"href":7145,"rel":7146},"https:\u002F\u002Fmicrosoftedge.microsoft.com\u002Faddons\u002Fdetail\u002Fimmersive-translate-tra\u002Famkbmndfnliijdhojkpoglbnaaahippg",[295],[20,7148,7149],{},[32,7150],{"alt":34,"src":7151},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1764.webp",[20,7153,7154],{},[32,7155],{"alt":34,"src":7156},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1765.webp",[20,7158,7159],{},"不会用这个插件的话,也可以看鱼香ROS翻译好的版本(但是网站不稳定):",[20,7161,7162],{},[291,7163,7164],{"href":7164,"rel":7165},"http:\u002F\u002Ffishros.org\u002Fdoc\u002Fnav2\u002Fconfiguration\u002Findex.html",[295],[16,7167,7168],{"id":7168},"生命周期管理节点说明",[20,7170,7171,7172,7174,7175,7177,7178,7180,7181,7183],{},"Nav2中通过的",[76,7173,5465],{},"功能包下的",[76,7176,5469],{},"节点管理其他节点的生命周期状态转换。",[76,7179,5469],{},"节点通过ROS 2的生命周期节点（Lifecycle Node）机制，提供了一种标准化的方法来控制Nav2中各个节点的状态转换。这些状态包括未配置（Unconfigured）、非活动（Inactive）、活动（Active）和结束（Finalized）等。通过精细控制这些状态转换，",[76,7182,5469],{},"节点能够确保Nav2系统的各个部分在正确的时机启动、运行和停止，从而提高系统的可靠性和稳定性。",[20,7185,7186],{},[23,7187,829],{},[48,7189,7190,7199,7208,7216,7222,7228,7242,7248],{},[51,7191,7192,7195,7196,7198],{},[76,7193,7194],{},"\u002Fbond_disable_heartbeat_timeout",": 该参数与节点之间的通信绑定（bonding）有关。节点之间的通信可以通过绑定来增强可靠性，而心跳超时是检测节点是否仍然活跃的一种方式。设置为",[76,7197,5818],{},"意味着启用心跳超时检测。",[51,7200,7201,7204,7205,7207],{},[76,7202,7203],{},"attempt_respawn_reconnection",": 取值为bool值，设置为",[76,7206,2024],{},"时，表示如果管理的节点意外终止，生命周期管理器将尝试重新启动它。",[51,7209,7210,7204,7213,7215],{},[76,7211,7212],{},"autostart",[76,7214,2024],{},"时，表示在生命周期管理器启动时，它将自动尝试启动其管理的节点。",[51,7217,7218,7221],{},[76,7219,7220],{},"bond_respawn_max_duration",": 重新连接或重新启动节点时的最大持续时间。",[51,7223,7224,7227],{},[76,7225,7226],{},"bond_timeout",": 与节点之间的通信绑定超时有关。如果在这个时间内没有收到来自另一个节点的消息，则认为该节点已经断开连接。",[51,7229,7230,7233,7234],{},[76,7231,7232],{},"diagnostic_updater",":",[48,7235,7236],{},[51,7237,7238,7241],{},[76,7239,7240],{},"period",": 诊断更新器的更新周期。诊断更新器用于收集和发布有关节点状态的诊断信息，定义了这些信息更新的频率。",[51,7243,7244,7247],{},[76,7245,7246],{},"node_names",": 由该生命周期管理器管理的节点名称列表。",[51,7249,7250,7252],{},[76,7251,5760],{},":是否使用仿真实践。",[16,7254,7255],{"id":7255},"行为树节点说明",[20,7257,7258,7261,7262,7174,7265,7268],{},[23,7259,7260],{},"行为树（BT）"," 是一种在智能体（如机器人或电脑游戏中的虚拟实体）中构建不同任务之间切换结构的方式。它是一种形式化的图形建模语言，以层次化的节点组织为特征，用于描述和规划复杂系统中各种实体的交互和决策。",[76,7263,7264],{},"nav2_bt_navigator",[76,7266,7267],{},"\u002Fbt_navigator","是Nav2中的行为树导航器节点，它实现了基于行为树的导航策略。行为树是一种用于描述复杂行为的树状结构，通过组合不同的行为节点，可以灵活地定义机器人的导航行为，包括路径规划、避障、恢复等。以下是官网。",[20,7270,7271],{},[291,7272,7273],{"href":7273,"rel":7274},"https:\u002F\u002Fwww.behaviortree.dev\u002F",[295],[20,7276,7277],{},[291,7278,7279],{"href":7279,"rel":7280},"https:\u002F\u002Farxiv.org\u002Fabs\u002F1709.00084",[295],[20,7282,7283],{},"github链接如下：",[20,7285,7286],{},[291,7287,7288],{"href":7288,"rel":7289},"https:\u002F\u002Fgithub.com\u002FBehaviorTree\u002FBehaviorTree.CPP",[295],[20,7291,7292],{},"BT可视化工具Groot2下载：",[20,7294,7295],{},[291,7296,7297],{"href":7297,"rel":7298},"https:\u002F\u002Fwww.behaviortree.dev\u002Fgroot\u002F",[295],[314,7300,7301],{},[51,7302,535],{},[537,7304,7305,7315],{},[540,7306,7307],{},[543,7308,7309,7311,7313],{},[546,7310,549],{"align":548},[546,7312,4132],{"align":548},[546,7314,555],{"align":548},[557,7316,7317,7328,7337],{},[543,7318,7319,7322,7325],{},[562,7320,7321],{"align":548},"\u002Fgoal_pose",[562,7323,7324],{"align":548},"geometry_msgs\u002Fmsg\u002FPoseStamped",[562,7326,7327],{"align":548},"导航目标点，用于触发导航任务",[543,7329,7330,7332,7334],{},[562,7331,575],{"align":548},[562,7333,578],{"align":548},[562,7335,7336],{"align":548},"坐标变换消息，用于不同坐标系之间的转换",[543,7338,7339,7341,7343],{},[562,7340,2743],{"align":548},[562,7342,2746],{"align":548},[562,7344,7345],{"align":548},"里程计数据，提供机器人位置和运动信息",[314,7347,7348],{"start":116},[51,7349,7350],{},"请求的Action",[537,7352,7353,7364],{},[540,7354,7355],{},[543,7356,7357,7360,7362],{},[546,7358,7359],{"align":548},"Action",[546,7361,4132],{"align":548},[546,7363,555],{"align":548},[557,7365,7366],{},[543,7367,7368,7371,7374],{},[562,7369,7370],{"align":548},"\u002Fnavigate_to_pose",[562,7372,7373],{"align":548},"nav2_msgs\u002Faction\u002FNavigateToPose",[562,7375,7376],{"align":548},"请求导航到指定位姿的Action，包括目标位姿和容忍度等参数",[314,7378,7379],{"start":138},[51,7380,829],{},[48,7382,7383,7388,7394,7400,7406,7412,7418,7424,7430,7436],{},[51,7384,7385,7387],{},[76,7386,5760],{},": 指定是否使用模拟时间而非实际时间。",[51,7389,7390,7393],{},[76,7391,7392],{},"global_frame",": 定义全局坐标系的名称，通常为地图坐标系。",[51,7395,7396,7399],{},[76,7397,7398],{},"robot_base_frame",": 指定机器人基座的坐标系名称。",[51,7401,7402,7405],{},[76,7403,7404],{},"odom_topic",": 里程计数据的ROS话题名称。",[51,7407,7408,7411],{},[76,7409,7410],{},"bt_loop_duration",": 行为树执行循环的持续时间（单位可能根据实现而异）。",[51,7413,7414,7417],{},[76,7415,7416],{},"default_server_timeout",": 导航服务器操作的默认超时时间。",[51,7419,7420,7423],{},[76,7421,7422],{},"enable_groot_monitoring",": 启用或禁用Groot监控功能。",[51,7425,7426,7429],{},[76,7427,7428],{},"groot_zmq_publisher_port",": Groot监控中ZeroMQ发布者的端口号。",[51,7431,7432,7435],{},[76,7433,7434],{},"groot_zmq_server_port",": Groot监控中ZeroMQ服务器的端口号。",[51,7437,7438,7441],{},[76,7439,7440],{},"plugin_lib_names",": 包含导航所需插件的库名称列表。",[16,7443,7444],{"id":7444},"规划器节点说明",[20,7446,7447,7448,7174,7451,7454,7455,7458],{},"在Nav2 导航框架中",[76,7449,7450],{},"nav2_planner",[76,7452,7453],{},"planner_server","节点，负责处理路径规划请求，生成从当前位置到目标位置的路径。该节点在执行时需要依赖于",[76,7456,7457],{},"\u002Fglobal_costmap\u002Fglobal_costmap","节点提供的地图消息。",[314,7460,7461],{},[51,7462,7463],{},"planner_server发布的话题",[537,7465,7466,7476],{},[540,7467,7468],{},[543,7469,7470,7472,7474],{},[546,7471,549],{"align":548},[546,7473,4132],{"align":548},[546,7475,555],{"align":548},[557,7477,7478],{},[543,7479,7480,7483,7486],{},[562,7481,7482],{"align":548},"\u002Fplan",[562,7484,7485],{"align":548},"nav_msgs\u002Fmsg\u002FPath",[562,7487,7488],{"align":548},"当前位置到目标点的全局路径",[314,7490,7491],{"start":116},[51,7492,7493],{},"planner_server 参数",[48,7495,7496,7504,7542,7548,7557],{},[51,7497,7498,7500,7501,7503],{},[76,7499,7194],{},": 这个参数控制是否禁用心跳超时检测，在ROS 2中，节点之间的通信绑定（bonding）机制用于增强通信的可靠性。心跳超时是检测节点是否仍然活跃的一种机制。如果该参数设置为",[76,7502,2024],{},"，则表示禁用了心跳超时检测，这可能在某些特定的网络环境下或当确信节点间通信非常稳定时使用。",[51,7505,7506,7509,7510],{},[76,7507,7508],{},"GridBased",": 这是一个配置块，专门用于设置基于网格的规划器的参数。基于网格的规划器通常使用地图的网格化表示来规划路径。",[48,7511,7512,7518,7524,7530,7536],{},[51,7513,7514,7517],{},[76,7515,7516],{},"allow_unknown",": 控制规划器是否允许在地图的未知（即未探索）区域中规划路径。",[51,7519,7520,7523],{},[76,7521,7522],{},"plugin",": 指定使用的规划器插件。",[51,7525,7526,7529],{},[76,7527,7528],{},"tolerance",": 设置规划路径时的容忍度，通常用于考虑机器人尺寸和定位的不确定性。",[51,7531,7532,7535],{},[76,7533,7534],{},"use_astar",": 控制是否使用A* 算法进行路径规划*。A** 算法是一种启发式搜索算法，能够找到从起点到终点的最短路径。",[51,7537,7538,7541],{},[76,7539,7540],{},"use_final_approach_orientation",": 控制规划器是否在路径的终点附近考虑机器人的最终朝向。",[51,7543,7544,7547],{},[76,7545,7546],{},"expected_planner_frequency",": 这个参数表示对规划器生成新路径的频率的预期值。它帮助系统监控规划器的性能，并可能用于调试或性能优化。",[51,7549,7550,7553,7554,7556],{},[76,7551,7552],{},"planner_plugins",": 这是一个列表，指定了可用的规划器插件。在这个例子中，它只包含了一个",[76,7555,7508],{},"规划器，但理论上可以包含多个不同类型的规划器，以适应不同的导航需求。",[51,7558,7559,7561,7562,7564],{},[76,7560,5760],{},": 这个参数控制是否使用模拟时间。在仿真环境中，时间是由仿真软件控制的，而不是由实际的物理时钟控制的。将此参数设置为",[76,7563,2024],{},"允许节点在仿真环境中正常运行，而无需依赖实际的系统时间。这对于开发和测试导航算法非常有用。",[314,7566,7567],{"start":138},[51,7568,7569],{},"\u002Fglobal_costmap\u002Fglobal_costmap订阅的话题",[537,7571,7572,7582],{},[540,7573,7574],{},[543,7575,7576,7578,7580],{},[546,7577,549],{"align":548},[546,7579,4132],{"align":548},[546,7581,555],{"align":548},[557,7583,7584,7595,7604],{},[543,7585,7586,7589,7592],{},[562,7587,7588],{"align":548},"\u002Fglobal_costmap\u002Ffootprint",[562,7590,7591],{"align":548},"geometry_msgs\u002Fmsg\u002FPolygon",[562,7593,7594],{"align":548},"机器人（或任何移动平台）的足迹（footprint）信息。足迹是机器人在地图上占据的空间形状，通常用多边形表示。",[543,7596,7597,7599,7601],{},[562,7598,689],{"align":548},[562,7600,692],{"align":548},[562,7602,7603],{"align":548},"发布环境地图，特别是用于导航的占用网格图（Occupancy Grid Map）。",[543,7605,7606,7608,7610],{},[562,7607,564],{"align":548},[562,7609,567],{"align":548},[562,7611,7612],{"align":548},"激光扫描数据。",[314,7614,7615],{"start":145},[51,7616,7617],{},"\u002Fglobal_costmap\u002Fglobal_costmap发布的话题",[537,7619,7620,7630],{},[540,7621,7622],{},[543,7623,7624,7626,7628],{},[546,7625,549],{"align":548},[546,7627,4132],{"align":548},[546,7629,555],{"align":548},[557,7631,7632,7642,7653,7664],{},[543,7633,7634,7637,7639],{},[562,7635,7636],{"align":548},"\u002Fglobal_costmap\u002Fcostmap",[562,7638,692],{"align":548},[562,7640,7641],{"align":548},"发布全局代价地图的当前状态。",[543,7643,7644,7647,7650],{},[562,7645,7646],{"align":548},"\u002Fglobal_costmap\u002Fcostmap_raw",[562,7648,7649],{"align":548},"nav2_msgs\u002Fmsg\u002FCostmap",[562,7651,7652],{"align":548},"未经进一步处理的原始代价地图数据。",[543,7654,7655,7658,7661],{},[562,7656,7657],{"align":548},"\u002Fglobal_costmap\u002Fcostmap_updates",[562,7659,7660],{"align":548},"map_msgs\u002Fmsg\u002FOccupancyGridUpdate",[562,7662,7663],{"align":548},"全局代价地图的更新，该消息可以高效更新地图。",[543,7665,7666,7669,7672],{},[562,7667,7668],{"align":548},"\u002Fglobal_costmap\u002Fpublished_footprint",[562,7670,7671],{"align":548},"geometry_msgs\u002Fmsg\u002FPolygonStamped",[562,7673,7674],{"align":548},"发布机器人的足迹（footprint），即机器人在地图上占据的空间形状。",[314,7676,7677],{"start":152},[51,7678,7679],{},"\u002Fglobal_costmap\u002Fglobal_costmap参数",[48,7681,7682,7687,7693,7699,7705,7711,7717,7722,7731,7774,7780,7785,7791,7841,7850,7856,7862,7867,7872,7878,7884,7923,7929,7934,7940,7946,7952,7958,7963],{},[51,7683,7684,7686],{},[76,7685,7194],{},": 控制是否禁用心跳超时检测，这在节点间通信绑定时用于监控对方节点的活跃度。",[51,7688,7689,7692],{},[76,7690,7691],{},"always_send_full_costmap",": 控制是否总是发送完整的代价地图信息，而不是仅发送变化的部分。",[51,7694,7695,7698],{},[76,7696,7697],{},"clearable_layers",": 列出可以被清除的代价图层，这些图层中的障碍物信息可以通过某种方式（如传感器数据）被更新或清除。",[51,7700,7701,7704],{},[76,7702,7703],{},"filters",": 定义应用于代价地图的过滤器列表，用于预处理或修改地图数据。",[51,7706,7707,7710],{},[76,7708,7709],{},"footprint",": 指定机器人在地图上的足迹形状，即机器人占据的空间范围。",[51,7712,7713,7716],{},[76,7714,7715],{},"footprint_padding",": 为机器人的足迹添加额外的填充空间，以考虑机器人运动时的额外空间需求。",[51,7718,7719,7721],{},[76,7720,7392],{},": 定义全局代价地图所使用的参考坐标系。",[51,7723,7724,2679,7727,7730],{},[76,7725,7726],{},"height",[76,7728,7729],{},"width",": 定义全局代价地图的高度和宽度（以单元格数计）。",[51,7732,7733,7736,7737],{},[76,7734,7735],{},"inflation_layer",": 配置膨胀层的参数，膨胀层用于在障碍物周围增加一定宽度的“缓冲区”，以避免机器人与障碍物过近。",[48,7738,7739,7745,7751,7757,7763,7769],{},[51,7740,7741,7744],{},[76,7742,7743],{},"cost_scaling_factor",": 膨胀成本的缩放因子。",[51,7746,7747,7750],{},[76,7748,7749],{},"enabled",": 控制膨胀层是否启用。",[51,7752,7753,7756],{},[76,7754,7755],{},"inflate_around_unknown",": 控制是否在未知空间周围进行膨胀。",[51,7758,7759,7762],{},[76,7760,7761],{},"inflate_unknown",": 控制是否将未知空间视为障碍物并进行膨胀。",[51,7764,7765,7768],{},[76,7766,7767],{},"inflation_radius",": 膨胀的半径。",[51,7770,7771,7773],{},[76,7772,7522],{},": 指定使用的膨胀层插件。",[51,7775,7776,7779],{},[76,7777,7778],{},"lethal_cost_threshold",": 定义代价地图中视为“致命”障碍物的成本阈值。",[51,7781,7782,7784],{},[76,7783,5917],{},": 指定订阅以获取地图信息的ROS话题。",[51,7786,7787,7790],{},[76,7788,7789],{},"observation_sources",": 定义代价地图的观测源，即哪些传感器或数据源用于更新地图。",[51,7792,7793,7796,7797],{},[76,7794,7795],{},"obstacle_layer",": 配置障碍物层的参数，障碍物层负责处理传感器观测到的障碍物信息。",[48,7798,7799,7805,7810,7816,7825,7830,7835],{},[51,7800,7801,7804],{},[76,7802,7803],{},"combination_method",": 定义如何组合多个观测源的信息。",[51,7806,7807,7809],{},[76,7808,7749],{},": 控制障碍物层是否启用。",[51,7811,7812,7815],{},[76,7813,7814],{},"footprint_clearing_enabled",": 控制是否清除机器人足迹内的障碍物信息。",[51,7817,7818,2679,7821,7824],{},[76,7819,7820],{},"max_obstacle_height",[76,7822,7823],{},"min_obstacle_height",": 定义障碍物的高度范围。",[51,7826,7827,7829],{},[76,7828,7789],{},": 指定障碍物信息的来源。",[51,7831,7832,7834],{},[76,7833,7522],{},": 指定使用的障碍物层插件。",[51,7836,7837,7840],{},[76,7838,7839],{},"scan",": 包含与激光扫描相关的配置，如扫描数据的处理方式。",[51,7842,7843,2679,7846,7849],{},[76,7844,7845],{},"origin_x",[76,7847,7848],{},"origin_y",": 定义全局代价地图原点的坐标。",[51,7851,7852,7855],{},[76,7853,7854],{},"plugins",": 列出启用的代价地图插件，这些插件定义了如何构建和更新代价地图。",[51,7857,7858,7861],{},[76,7859,7860],{},"publish_frequency",": 定义发布代价地图的频率。",[51,7863,7864,7866],{},[76,7865,984],{},": 定义代价地图的分辨率，即每个单元格代表的实际物理尺寸。",[51,7868,7869,7871],{},[76,7870,7398],{},": 定义机器人基座的参考坐标系。",[51,7873,7874,7877],{},[76,7875,7876],{},"robot_radius",": 定义机器人的半径，用于计算机器人在地图上的占用空间。",[51,7879,7880,7883],{},[76,7881,7882],{},"rolling_window",": 控制是否使用滚动窗口（即动态变化的地图区域）而非固定大小的地图。",[51,7885,7886,7889,7890],{},[76,7887,7888],{},"static_layer",": 配置静态层的参数，静态层负责处理地图中的静态障碍物信息。",[48,7891,7892,7897,7902,7907,7912,7918],{},[51,7893,7894,7896],{},[76,7895,7749],{},": 控制静态层是否启用。",[51,7898,7899,7901],{},[76,7900,4174],{},": 控制是否订阅瞬态本地地图更新。",[51,7903,7904,7906],{},[76,7905,5917],{},": 指定静态地图的ROS话题（如果不同于全局地图）。",[51,7908,7909,7911],{},[76,7910,7522],{},": 指定使用的静态层插件。",[51,7913,7914,7917],{},[76,7915,7916],{},"subscribe_to_updates",": 控制是否订阅地图更新。",[51,7919,7920,7922],{},[76,7921,5754],{},": 定义坐标变换的容忍度。",[51,7924,7925,7928],{},[76,7926,7927],{},"track_unknown_space",": 控制是否跟踪地图中的未知空间。",[51,7930,7931,7933],{},[76,7932,5754],{},": 定义在坐标变换过程中允许的误差范围。",[51,7935,7936,7939],{},[76,7937,7938],{},"trinary_costmap",": 控制是否使用三态代价地图（空闲、占用、未知），而不是仅使用二态（空闲、占用）。",[51,7941,7942,7945],{},[76,7943,7944],{},"unknown_cost_value",": 定义在代价地图中表示未知空间的值。",[51,7947,7948,7951],{},[76,7949,7950],{},"update_frequency",": 定义更新代价地图的频率。",[51,7953,7954,7957],{},[76,7955,7956],{},"use_maximum",": 控制是否使用多个观测源中的最大值来更新代价地图。",[51,7959,7960,7962],{},[76,7961,5760],{},": 控制是否使用仿真时间（在仿真环境中很有用）。",[51,7964,7965,7968,7969],{},[76,7966,7967],{},"voxel_layer",": 配置体素层的参数，体素层使用体素网格来表示三维空间中的障碍物信息。",[48,7970,7971,7976,7981,7990,7997,8002,8008,8013,8019,8023],{},[51,7972,7973,7975],{},[76,7974,7749],{},": 控制体素层是否启用。",[51,7977,7978,7980],{},[76,7979,7814],{},": 控制是否清除机器人足迹内的体素信息。",[51,7982,7983,2679,7986,7989],{},[76,7984,7985],{},"mark_threshold",[76,7987,7988],{},"unknown_threshold",": 定义将体素视为障碍物或未知的阈值。",[51,7991,7992,2679,7994,7996],{},[76,7993,7820],{},[76,7995,7823],{},": 定义体素表示的障碍物的高度范围。",[51,7998,7999,8001],{},[76,8000,7789],{},": 指定体素信息的来源。",[51,8003,8004,8007],{},[76,8005,8006],{},"origin_z",": 定义体素网格在Z轴上的原点。",[51,8009,8010,8012],{},[76,8011,7522],{},": 指定使用的体素层插件。",[51,8014,8015,8018],{},[76,8016,8017],{},"publish_voxel_map",": 控制是否发布体素地图。",[51,8020,8021,7840],{},[76,8022,7839],{},[51,8024,8025,2679,8028,8031],{},[76,8026,8027],{},"z_resolution",[76,8029,8030],{},"z_voxels",": 定义体素网格在Z轴上的分辨率和体素数。",[16,8033,8034],{"id":8034},"控制器节点说明",[20,8036,8037,8038,8041,8042,8045,8046,8048,8049,7458],{},"在Nav2导航系统中",[76,8039,8040],{},"nav2_controller","功能包的",[76,8043,8044],{},"controller_server","负责处理导航任务中的控制请求，确保机器人能够按照规划的路径进行移动。其主要功能是根据",[76,8047,7450],{},"模块计算出的全局或局部路径，生成速度、方向控制的命令，即控制机器人沿着规划好的路径行走。该节点在执行时还需要依赖于",[76,8050,8051],{},"\u002Flocal_costmap\u002Flocal_costmap",[20,8053,8054],{},[23,8055,8056],{},"1.controller_server订阅的话题",[537,8058,8059,8069],{},[540,8060,8061],{},[543,8062,8063,8065,8067],{},[546,8064,549],{"align":548},[546,8066,4132],{"align":548},[546,8068,555],{"align":548},[557,8070,8071,8080],{},[543,8072,8073,8075,8077],{},[562,8074,2743],{"align":548},[562,8076,2746],{"align":548},[562,8078,8079],{"align":548},"机器人的里程计信息，包含位置、速度和姿态",[543,8081,8082,8085,8088],{},[562,8083,8084],{"align":548},"\u002Fspeed_limit",[562,8086,8087],{"align":548},"nav2_msgs\u002Fmsg\u002FSpeedLimit",[562,8089,8090],{"align":548},"导航过程中的速度限制信息，用于动态调整机器人的移动速度",[20,8092,8093],{},[23,8094,8095],{},"2.controller_server发布的话题",[537,8097,8098,8110],{},[540,8099,8100],{},[543,8101,8102,8105,8108],{},[546,8103,8104],{"align":548},"话题名称",[546,8106,8107],{"align":548},"消息类型",[546,8109,555],{"align":548},[557,8111,8112,8123,8134,8144,8155,8165],{},[543,8113,8114,8117,8120],{},[562,8115,8116],{"align":548},"\u002Fcmd_vel_nav",[562,8118,8119],{"align":548},"geometry_msgs\u002Fmsg\u002FTwist",[562,8121,8122],{"align":548},"发布控制命令，包括线性和角速度，用于控制机器人按照规划路径移动。",[543,8124,8125,8128,8131],{},[562,8126,8127],{"align":548},"\u002Fcost_cloud",[562,8129,8130],{"align":548},"sensor_msgs\u002Fmsg\u002FPointCloud2",[562,8132,8133],{"align":548},"发布成本地图中的点云数据，用于避障和路径规划。",[543,8135,8136,8139,8141],{},[562,8137,8138],{"align":548},"\u002Flocal_plan",[562,8140,7485],{"align":548},[562,8142,8143],{"align":548},"发布局部路径规划结果，即机器人应如何到达当前目标点附近的一个点。",[543,8145,8146,8149,8152],{},[562,8147,8148],{"align":548},"\u002Fmarker",[562,8150,8151],{"align":548},"visualization_msgs\u002Fmsg\u002FMarkerArray",[562,8153,8154],{"align":548},"发布可视化标记，用于在RViz等可视化工具中显示路径、障碍物等信息。",[543,8156,8157,8160,8162],{},[562,8158,8159],{"align":548},"\u002Freceived_global_plan",[562,8161,7485],{"align":548},[562,8163,8164],{"align":548},"发布从全局规划器接收到的全局路径，即当前位置到目标点的路径。",[543,8166,8167,8170,8172],{},[562,8168,8169],{"align":548},"\u002Ftransformed_global_plan",[562,8171,7485],{"align":548},[562,8173,8174],{"align":548},"发布经过坐标变换的全局路径，确保路径与机器人的当前坐标系一致。",[20,8176,8177],{},[23,8178,8179],{},"3.controller_server参数",[48,8181,8182,8216,8219,8222,8225,8228,8231,8234,8237,8240,8243,8246],{},[51,8183,8184,8185],{},"FollowPath: 这个部分定义了一个名为FollowPath的插件或配置集，它可能是一个路径跟随行为或算法的配置。它包含了多个子参数和子配置，用于定义如何跟随路径。",[48,8186,8187,8201,8204,8207,8210,8213],{},[51,8188,8189,8190],{},"BaseObstacle: 定义了基本的障碍物评估参数，用于在路径跟随过程中避免障碍物。",[48,8191,8192,8195,8198],{},[51,8193,8194],{},"class: 指定了类的名称，这里是BaseObstacle，表示这是一个基本障碍物评估组件。",[51,8196,8197],{},"scale: 定义了该障碍物评估在整体评估中的权重或影响程度。",[51,8199,8200],{},"sum_scores: 指示是否累加多个障碍物的分数，false可能表示使用最大值或其他逻辑。",[51,8202,8203],{},"GoalAlign, GoalDist, PathAlign, PathDist, RotateToGoal, Oscillation: 这些都是路径跟随过程中的不同评估或行为组件，每个都有其特定的参数和用途，如对齐目标、保持与目标或路径的距离、减少振荡等。",[51,8205,8206],{},"acc_lim_theta, acc_lim_x, acc_lim_y: 这些参数定义了机器人在不同方向上的加速度限制。",[51,8208,8209],{},"critics: 指定了哪些评估组件（或“批评家”）将被用于路径跟随决策。",[51,8211,8212],{},"debug_trajectory_details: 指示是否发布轨迹的详细调试信息。",[51,8214,8215],{},"其他与速度、加速度、时间粒度、轨迹生成等相关的参数，共同定义了路径跟随算法的行为和性能。",[51,8217,8218],{},"controller_frequency: 指定了控制器（可能是FollowPath或其他控制器）的运行频率，以赫兹为单位。",[51,8220,8221],{},"controller_plugins: 指定了将要使用的控制器插件列表，这里只包含了FollowPath。",[51,8223,8224],{},"failure_tolerance: 定义了容忍失败的时间或距离，用于在评估控制器是否失败时提供一定的缓冲。",[51,8226,8227],{},"general_goal_checker: 定义了一个通用的目标检查器，用于确定机器人是否已达到其目标位置和方向。",[51,8229,8230],{},"goal_checker_plugins: 指定了将要使用的目标检查器插件列表。",[51,8232,8233],{},"min_theta_velocity_threshold, min_x_velocity_threshold, min_y_velocity_threshold: 这些定义了机器人在不同方向上的最小速度阈值，低于这些阈值可能被视为停止或静止。",[51,8235,8236],{},"odom_topic: 指定了里程计信息的ROS主题。",[51,8238,8239],{},"progress_checker: 定义了一个进度检查器，用于评估机器人是否在向目标移动。",[51,8241,8242],{},"qos_overrides: 定义了ROS服务或主题的QoS（服务质量）覆盖设置，用于调整消息传递的可靠性和性能。",[51,8244,8245],{},"speed_limit_topic: 指定了速度限制信息的ROS主题。",[51,8247,8248],{},"use_sim_time: 指示是否使用模拟时间，这在ROS仿真环境中非常有用。",[20,8250,8251],{},[23,8252,8253],{},"4.\u002Flocal_costmap\u002Flocal_costmap订阅的话题",[537,8255,8256,8266],{},[540,8257,8258],{},[543,8259,8260,8262,8264],{},[546,8261,549],{"align":548},[546,8263,4132],{"align":548},[546,8265,555],{"align":548},[557,8267,8268,8278],{},[543,8269,8270,8273,8275],{},[562,8271,8272],{"align":548},"\u002Flocal_costmap\u002Ffootprint",[562,8274,7591],{"align":548},[562,8276,8277],{"align":548},"机器人或移动平台的足迹多边形，用于本地代价地图的计算",[543,8279,8280,8282,8284],{},[562,8281,564],{"align":548},[562,8283,567],{"align":548},[562,8285,8286],{"align":548},"激光扫描仪的扫描数据，用于环境感知和避障",[20,8288,8289],{},[23,8290,8291],{},"5.\u002Flocal_costmap\u002Flocal_costmap发布的话题",[537,8293,8294,8304],{},[540,8295,8296],{},[543,8297,8298,8300,8302],{},[546,8299,549],{"align":548},[546,8301,4132],{"align":548},[546,8303,555],{"align":548},[557,8305,8306,8316,8326,8336,8346,8356],{},[543,8307,8308,8311,8313],{},[562,8309,8310],{"align":548},"\u002Flocal_costmap\u002Fclearing_endpoints",[562,8312,8130],{"align":548},[562,8314,8315],{"align":548},"清除成本图上的障碍物点云数据，通常用于动态障碍物处理",[543,8317,8318,8321,8323],{},[562,8319,8320],{"align":548},"\u002Flocal_costmap\u002Fcostmap",[562,8322,692],{"align":548},[562,8324,8325],{"align":548},"本地成本图，表示机器人周围环境的可通行性",[543,8327,8328,8331,8333],{},[562,8329,8330],{"align":548},"\u002Flocal_costmap\u002Fcostmap_raw",[562,8332,7649],{"align":548},[562,8334,8335],{"align":548},"未经处理的本地成本图，可能包含更详细的信息",[543,8337,8338,8341,8343],{},[562,8339,8340],{"align":548},"\u002Flocal_costmap\u002Fcostmap_updates",[562,8342,7660],{"align":548},[562,8344,8345],{"align":548},"本地成本图的更新信息，包括哪些区域发生了变化",[543,8347,8348,8351,8353],{},[562,8349,8350],{"align":548},"\u002Flocal_costmap\u002Fpublished_footprint",[562,8352,7671],{"align":548},[562,8354,8355],{"align":548},"发布的机器人足迹多边形，时间戳表示发布时间",[543,8357,8358,8361,8364],{},[562,8359,8360],{"align":548},"\u002Flocal_costmap\u002Fvoxel_grid",[562,8362,8363],{"align":548},"nav2_msgs\u002Fmsg\u002FVoxelGrid",[562,8365,8366],{"align":548},"体素网格数据，用于成本图生成中的空间划分和优化",[20,8368,8369],{},[23,8370,8371],{},"6.\u002Flocal_costmap\u002Flocal_costmap参数",[48,8373,8374,8382,8390,8403,8408,8413,8418,8423,8428,8433,8438,8443,8448,8453,8460,8465,8470,8475,8480,8485,8493,8498,8503,8508,8513,8518,8523,8528],{},[51,8375,8376,8378,8379,8381],{},[76,8377,7194],{},": 是否禁用节点间的心跳超时检查。当设置为",[76,8380,2024],{},"时，表示禁用该功能，可能用于减少网络通信量或适应特定网络环境。",[51,8383,8384,8386,8387,8389],{},[76,8385,7691],{},": 是否总是发送完整的成本图。当设置为",[76,8388,2024],{},"时，节点将不依赖于增量更新，而是始终发送完整的成本图数据。",[51,8391,8392,8394,8395,5805,8397,2679,8399,8402],{},[76,8393,7697],{},": 指定可以被清除的层列表。在这个例子中，包括",[76,8396,7795],{},[76,8398,7967],{},[76,8400,8401],{},"range_layer","，这意味着这些层中的障碍物数据可以被清除。",[51,8404,8405,8407],{},[76,8406,7703],{},": 用于指定应用于成本图的过滤器列表。此处为空，表示没有应用任何过滤器。",[51,8409,8410,8412],{},[76,8411,7709],{},": 机器人的足迹多边形，定义了机器人在二维空间中的物理占用区域。",[51,8414,8415,8417],{},[76,8416,7715],{},": 足迹的填充量，用于在计算成本图时给机器人足迹添加额外的空间。",[51,8419,8420,8422],{},[76,8421,7392],{},": 全局参考坐标系的名称，通常用于定位和导航任务。",[51,8424,8425,8427],{},[76,8426,7726],{},": 成本图的高度（以单元格数量计）。",[51,8429,8430,8432],{},[76,8431,7735],{},": 膨胀层的配置，用于在障碍物周围添加一定范围的膨胀区域，使机器人与障碍物保持安全距离。",[51,8434,8435,8437],{},[76,8436,7778],{},": 致命成本阈值，超过此阈值的成本值表示不可通行的区域。",[51,8439,8440,8442],{},[76,8441,5917],{},": 订阅的地图主题名称，用于获取全局地图信息。",[51,8444,8445,8447],{},[76,8446,7789],{},": 观察源的配置，用于指定哪些传感器数据将被用于更新成本图。此处为空字符串，可能是默认值或配置方式的不同。",[51,8449,8450,8452],{},[76,8451,7795],{},": 障碍物层的配置，用于处理来自传感器（如激光雷达）的障碍物数据。",[51,8454,8455,3732,8457,8459],{},[76,8456,7845],{},[76,8458,7848],{},": 成本图原点的X和Y坐标，定义了成本图在全局坐标系中的位置。",[51,8461,8462,8464],{},[76,8463,7854],{},": 启用的插件列表，定义了成本图使用的不同层（如障碍物层、膨胀层等）。",[51,8466,8467,8469],{},[76,8468,7860],{},": 成本图的发布频率（以Hz为单位）。",[51,8471,8472,8474],{},[76,8473,984],{},": 成本图的分辨率（以米\u002F单元格计）。",[51,8476,8477,8479],{},[76,8478,7398],{},": 机器人基座的参考坐标系名称，用于定位机器人。",[51,8481,8482,8484],{},[76,8483,7876],{},": 机器人的半径，用于在成本图中表示机器人的物理尺寸。",[51,8486,8487,8489,8490,8492],{},[76,8488,7882],{},": 是否使用滚动窗口。当设置为",[76,8491,2024],{},"时，成本图将随着机器人的移动而更新其位置和范围。",[51,8494,8495,8497],{},[76,8496,7927],{},": 是否跟踪未知空间。在某些情况下，这可能用于处理未探索或未知的区域。",[51,8499,8500,8502],{},[76,8501,5754],{},": 变换容差，定义了接受变换的时间差和角度差的阈值。",[51,8504,8505,8507],{},[76,8506,7938],{},": 是否使用三态成本图（通常是自由、占用、未知）。",[51,8509,8510,8512],{},[76,8511,7944],{},": 未知区域在成本图中的成本值。",[51,8514,8515,8517],{},[76,8516,7950],{},": 成本图的更新频率（以Hz为单位），不同于发布频率。",[51,8519,8520,8522],{},[76,8521,7956],{},": 是否在多个源提供相同位置的成本信息时使用最大值。",[51,8524,8525,8527],{},[76,8526,5760],{},": 是否使用模拟时间而非系统时间。这在仿真环境中很有用。",[51,8529,8530,8532],{},[76,8531,7967],{},": 体素层的配置，用于将三维空间划分为体素（体积像素），以提高成本图的处理效率。",[16,8534,8535],{"id":8535},"恢复器节点说明",[20,8537,8538,8539,8041,8542,8545],{},"恢复行为是机器人导航过程中一个至关重要的部分，它允许机器人在遇到障碍、卡住或其他导航问题时采取一系列预定义的动作来尝试恢复。在Nav2中由",[76,8540,8541],{},"nav2_behaviors",[76,8543,8544],{},"behavior_server","实现这一功能。",[20,8547,8548],{},[23,8549,5549],{},[537,8551,8552,8562],{},[540,8553,8554],{},[543,8555,8556,8558,8560],{},[546,8557,549],{"align":548},[546,8559,4132],{"align":548},[546,8561,555],{"align":548},[557,8563,8564,8575,8585,8594,8603],{},[543,8565,8566,8569,8572],{},[562,8567,8568],{"align":548},"\u002Fclock",[562,8570,8571],{"align":548},"rosgraph_msgs\u002Fmsg\u002FClock",[562,8573,8574],{"align":548},"ROS系统时间",[543,8576,8577,8580,8582],{},[562,8578,8579],{"align":548},"\u002Fcmd_vel_teleop",[562,8581,8119],{"align":548},[562,8583,8584],{"align":548},"遥操作命令，用于控制机器人的线性和角速度",[543,8586,8587,8589,8591],{},[562,8588,8330],{"align":548},[562,8590,7649],{"align":548},[562,8592,8593],{"align":548},"局部代价地图的原始数据",[543,8595,8596,8598,8600],{},[562,8597,8350],{"align":548},[562,8599,7671],{"align":548},[562,8601,8602],{"align":548},"机器人在局部代价地图中的已发布足迹",[543,8604,8605,8608,8611],{},[562,8606,8607],{"align":548},"\u002Fpreempt_teleop",[562,8609,8610],{"align":548},"std_msgs\u002Fmsg\u002FEmpty",[562,8612,8613],{"align":548},"遥操作抢占信号，用于中断当前遥操作",[20,8615,8616],{},[23,8617,5608],{},[537,8619,8620,8630],{},[540,8621,8622],{},[543,8623,8624,8626,8628],{},[546,8625,549],{"align":548},[546,8627,4132],{"align":548},[546,8629,555],{"align":548},[557,8631,8632],{},[543,8633,8634,8637,8639],{},[562,8635,8636],{"align":548},"\u002Fcmd_vel",[562,8638,8119],{"align":548},[562,8640,8641],{"align":548},"发送给底层控制器的速度命令",[20,8643,8644],{},[23,8645,8646],{},"3.提供的Action服务器",[537,8648,8649,8660],{},[540,8650,8651],{},[543,8652,8653,8655,8658],{},[546,8654,549],{"align":548},[546,8656,8657],{"align":548},"Action接口",[546,8659,555],{"align":548},[557,8661,8662,8673,8684,8695,8706],{},[543,8663,8664,8667,8670],{},[562,8665,8666],{"align":548},"\u002Fassisted_teleop",[562,8668,8669],{"align":548},"nav2_msgs\u002Faction\u002FAssistedTeleop",[562,8671,8672],{"align":548},"遥控辅助操作服务，允许用户在导航时提供方向性输入",[543,8674,8675,8678,8681],{},[562,8676,8677],{"align":548},"\u002Fbackup",[562,8679,8680],{"align":548},"nav2_msgs\u002Faction\u002FBackUp",[562,8682,8683],{"align":548},"后退动作服务，用于在特定情况下使机器人后退",[543,8685,8686,8689,8692],{},[562,8687,8688],{"align":548},"\u002Fdrive_on_heading",[562,8690,8691],{"align":548},"nav2_msgs\u002Faction\u002FDriveOnHeading",[562,8693,8694],{"align":548},"按指定航向行驶的动作服务",[543,8696,8697,8700,8703],{},[562,8698,8699],{"align":548},"\u002Fspin",[562,8701,8702],{"align":548},"nav2_msgs\u002Faction\u002FSpin",[562,8704,8705],{"align":548},"旋转动作服务，允许机器人在原地旋转",[543,8707,8708,8711,8714],{},[562,8709,8710],{"align":548},"\u002Fwait",[562,8712,8713],{"align":548},"nav2_msgs\u002Faction\u002FWait",[562,8715,8716],{"align":548},"等待动作服务，使机器人在当前位置等待一定时间",[20,8718,8719],{},[23,8720,5697],{},[48,8722,8723,8728,8736,8741,8746,8754,8772,8778,8784,8790,8796,8808,8814,8820,8829],{},[51,8724,8725,8727],{},[76,8726,5760],{},": 该参数指定是否使用模拟时间而非实际时间。这在仿真环境中非常有用，因为仿真环境可以加速或减速时间流逝，而不需要等待实际时间的流逝。",[51,8729,8730,8732,8733,8735],{},[76,8731,7392],{},": 定义全局坐标系的名称，该坐标系通常用于导航任务中的定位和路径规划。在这里，它被设置为",[76,8734,5741],{},"，意味着使用里程计数据来作为全局坐标系的参考。",[51,8737,8738,8740],{},[76,8739,7398],{},": 指定机器人基座的坐标系名称。这是机器人上用于定位和运动控制的参考点，通常与机器人的物理中心或驱动轮的中心相对应。",[51,8742,8743,8745],{},[76,8744,7404],{},": 这是一个ROS话题名称，用于发布里程计数据。里程计数据包含了机器人随时间推移的位置和姿态变化信息，是导航和定位系统的关键输入之一。",[51,8747,8748,8750,8751,8753],{},[76,8749,7194],{},"：这个参数可能用于配置ROS节点之间的心跳检测机制。将其设置为",[76,8752,2024],{},"可能意味着禁用或调整心跳超时的行为，以便在特定情况下（如仿真环境）避免不必要的超时错误。",[51,8755,8756,3732,8759,3732,8762,3732,8765,3732,8768,8771],{},[76,8757,8758],{},"assisted_teleop",[76,8760,8761],{},"backup",[76,8763,8764],{},"drive_on_heading",[76,8766,8767],{},"spin",[76,8769,8770],{},"wait",": 这些是行为树中可能使用的行为插件的配置项。每个插件都定义了机器人可以执行的一种特定行为，如辅助遥操作、后退、按指定方向行驶、原地旋转和等待。",[51,8773,8774,8777],{},[76,8775,8776],{},"behavior_plugins",": 列出了在行为树中可用的行为插件名称。",[51,8779,8780,8783],{},[76,8781,8782],{},"cmd_vel_teleop",": 指定了用于遥操作的速度控制命令的ROS话题名称。",[51,8785,8786,8789],{},[76,8787,8788],{},"costmap_topic",": 定义了局部代价地图的ROS话题名称，代价地图用于表示环境中的障碍物和可通行区域。",[51,8791,8792,8795],{},[76,8793,8794],{},"cycle_frequency",": 定义了导航系统更新其状态和规划新路径的频率（以赫兹为单位）。",[51,8797,8798,3732,8801,3732,8804,8807],{},[76,8799,8800],{},"max_rotational_vel",[76,8802,8803],{},"min_rotational_vel",[76,8805,8806],{},"rotational_acc_lim",": 这些参数定义了机器人旋转时的最大速度、最小速度和加速度限制。",[51,8809,8810,8813],{},[76,8811,8812],{},"projection_time",": 与代价地图的更新或预测未来障碍物位置有关的时间参数。",[51,8815,8816,8819],{},[76,8817,8818],{},"footprint_topic",": 定义了发布机器人足迹（即机器人占据的空间）的ROS话题名称。",[51,8821,8822,3732,8825,8828],{},[76,8823,8824],{},"simulate_ahead_time",[76,8826,8827],{},"simulation_time_step",": 这些参数与仿真环境相关，可能用于控制仿真过程中的时间流逝和步长。",[51,8830,8831,8833],{},[76,8832,5754],{},": 定义了坐标变换时的容差范围，用于处理不同坐标系之间的微小差异。",[16,8835,8836],{"id":8836},"航点跟随节点说明",[20,8838,8839,8840,8843,8844,8847,8848,2679,8851,8854],{},"在Nav2 导航堆栈中，",[76,8841,8842],{},"nav2_waypoint_follower","包下的",[76,8845,8846],{},"\u002Fwaypoint_follower","节点负责跟踪由路径规划器生成的一系列航点（waypoints），以确保机器人能够沿着预定的路径安全、准确地移动。该节点的主要功能是根据当前机器人位置和速度信息，以及由路径规划器（如",[76,8849,8850],{},"nav2_global_planner",[76,8852,8853],{},"nav2_local_planner","）提供的航点列表，计算出控制指令来控制机器人的运动。这些控制指令可能包括线性和角速度命令，或者更具体的运动学或动力学命令，具体取决于机器人的类型和配置。",[20,8856,8857],{},[23,8858,8859],{},"1.提供的Action服务器",[537,8861,8862,8872],{},[540,8863,8864],{},[543,8865,8866,8868,8870],{},[546,8867,549],{"align":548},[546,8869,8657],{"align":548},[546,8871,555],{"align":548},[557,8873,8874],{},[543,8875,8876,8879,8882],{},[562,8877,8878],{"align":548},"\u002Ffollow_waypoints",[562,8880,8881],{"align":548},"nav2_msgs\u002Faction\u002FFollowWaypoints",[562,8883,8884],{"align":548},"允许客户端请求planner_server按照一系列路点进行导航",[20,8886,8887],{},[23,8888,8889],{},"2.请求的Action服务",[537,8891,8892,8902],{},[540,8893,8894],{},[543,8895,8896,8898,8900],{},[546,8897,549],{"align":548},[546,8899,8657],{"align":548},[546,8901,555],{"align":548},[557,8903,8904],{},[543,8905,8906,8908,8910],{},[562,8907,7370],{"align":548},[562,8909,7373],{"align":548},[562,8911,8912],{"align":548},"允许planner_server（或调用它的节点）请求导航到指定的位姿",[20,8914,8915],{},[23,8916,8917],{},"3.参数",[48,8919,8920,8925,8931,8937,8942,8948],{},[51,8921,8922,8924],{},[76,8923,5760],{},": 指定是否使用模拟时间而非实际时间进行节点的计时和同步。这在仿真环境中特别有用，因为仿真环境可能无法提供与真实时间完全同步的时钟。",[51,8926,8927,8930],{},[76,8928,8929],{},"loop_rate",": 定义了节点的主循环速率，即节点每秒执行其主要任务（如处理数据、发布信息等）的次数。这个参数对于控制节点的响应性和资源使用非常重要。",[51,8932,8933,8936],{},[76,8934,8935],{},"stop_on_failure",": 指明当导航任务遇到无法克服的障碍或达到其他失败条件时，节点是否应该停止执行。这对于确保在失败情况下系统能够安全地停止并等待进一步指令很重要。",[51,8938,8939,8941],{},[76,8940,5709],{},": 涉及节点间通信的可靠性机制。Bond是ROS 2中用于节点间稳定通信的一种机制，其中心跳信号用于检测节点是否仍然活跃。将此参数设置为true会禁用心跳超时检测，这可能在某些特定的网络配置或应用场景中是有用的。",[51,8943,8944,8947],{},[76,8945,8946],{},"waypoint_task_executor_plugin",": 指定了在执行路径点导航任务时要使用的插件。路径点导航通常涉及一系列预先定义的点，机器人需要按顺序访问这些点。这个参数允许用户指定用于执行这种类型任务的特定插件或算法。",[51,8949,8950,8953,8954],{},[76,8951,8952],{},"wait_at_waypoint",": 这是一个复合参数，用于配置在路径点等待的特定行为。",[48,8955,8956,8961,8966],{},[51,8957,8958,8960],{},[76,8959,7749],{},": 启用或禁用在到达每个路径点时等待的功能。",[51,8962,8963,8965],{},[76,8964,7522],{},": 指定实现等待功能的插件类型。这允许用户根据需要选择不同的等待策略或行为。",[51,8967,8968,8971],{},[76,8969,8970],{},"waypoint_pause_duration",": 定义了在每个路径点处等待的持续时间（以毫秒为单位）。这可以用于确保机器人在移动到下一个路径点之前已经稳定或已经完成了某些操作。",[16,8973,8974],{"id":8974},"路径平滑节点说明",[20,8976,8977,8978,7174,8981,8984],{},"在Nav2框架中",[76,8979,8980],{},"nav2_smoother",[76,8982,8983],{},"smoother_server","节点通过加载和运行各种平滑器插件，对规划出的路径进行平滑处理，使得机器人能够更流畅、连续且安全地移动。这一功能对于提高机器人的导航性能和减少硬件磨损具有重要意义。",[20,8986,8987],{},[23,8988,5549],{},[537,8990,8991,9001],{},[540,8992,8993],{},[543,8994,8995,8997,8999],{},[546,8996,549],{"align":548},[546,8998,4132],{"align":548},[546,9000,555],{"align":548},[557,9002,9003,9012],{},[543,9004,9005,9007,9009],{},[562,9006,7646],{"align":548},[562,9008,7649],{"align":548},[562,9010,9011],{"align":548},"全局代价地图的原始数据，用于路径规划",[543,9013,9014,9016,9018],{},[562,9015,7668],{"align":548},[562,9017,7671],{"align":548},[562,9019,9020],{"align":548},"机器人在全局代价地图中的足迹表示",[20,9022,9023],{},[23,9024,5608],{},[537,9026,9027,9037],{},[540,9028,9029],{},[543,9030,9031,9033,9035],{},[546,9032,549],{"align":548},[546,9034,4132],{"align":548},[546,9036,555],{"align":548},[557,9038,9039],{},[543,9040,9041,9044,9046],{},[562,9042,9043],{"align":548},"\u002Fplan_smoothed",[562,9045,7485],{"align":548},[562,9047,9048],{"align":548},"经过平滑处理后的全局路径",[20,9050,9051],{},[23,9052,8646],{},[537,9054,9055,9066],{},[540,9056,9057],{},[543,9058,9059,9061,9064],{},[546,9060,549],{"align":548},[546,9062,9063],{"align":548},"动作类型",[546,9065,555],{"align":548},[557,9067,9068],{},[543,9069,9070,9073,9076],{},[562,9071,9072],{"align":548},"\u002Fsmooth_path",[562,9074,9075],{"align":548},"nav2_msgs\u002Faction\u002FSmoothPath",[562,9077,9078],{"align":548},"提供平滑路径的服务，接受路径平滑的请求，并返回平滑后的路径。这允许客户端（如行为树）异步地请求路径平滑，并在平滑完成后接收结果。",[20,9080,9081],{},[23,9082,5697],{},[48,9084,9085,9090,9095,9100,9105,9150,9159,9164],{},[51,9086,9087,9089],{},[76,9088,7194],{},": 指示是否禁用Bond的心跳超时功能。在分布式系统中，Bond用于管理节点间的连接和心跳，此参数用于调整心跳相关的行为。",[51,9091,9092,9094],{},[76,9093,8788],{},": 代价地图数据的ROS话题名称，通常是全局代价地图的原始数据。",[51,9096,9097,9099],{},[76,9098,8818],{},": 机器人足迹（即机器人在地图上的占用区域）的ROS话题名称，用于在全局代价地图中表示机器人的物理尺寸。",[51,9101,9102,9104],{},[76,9103,7398],{},": 指定机器人基座的坐标系名称，这是机器人导航中用于定位和移动的参考点。",[51,9106,9107,7233,9110],{},[76,9108,9109],{},"simple_smoother",[48,9111,9112,9118,9124,9133,9138,9144],{},[51,9113,9114,9117],{},[76,9115,9116],{},"do_refinement",": 指示是否启用路径的细化（或进一步优化）过程。",[51,9119,9120,9123],{},[76,9121,9122],{},"max_its",": 平滑过程中允许的最大迭代次数，用于控制平滑算法的收敛时间。",[51,9125,9126,9128,9129,9132],{},[76,9127,7522],{},": 平滑插件的类型，这里是",[76,9130,9131],{},"nav2_smoother::SimpleSmoother","，表示使用简单的平滑算法。",[51,9134,9135,9137],{},[76,9136,7528],{},": 平滑算法的收敛容差，当路径变化小于此值时，认为平滑过程已完成。",[51,9139,9140,9143],{},[76,9141,9142],{},"w_data",": 平滑过程中数据项（如障碍物距离）的权重。",[51,9145,9146,9149],{},[76,9147,9148],{},"w_smooth",": 平滑过程中平滑项（如路径曲率）的权重。",[51,9151,9152,9155,9156,9158],{},[76,9153,9154],{},"smoother_plugins",": 定义的平滑插件列表，这里列出了",[76,9157,9109],{},"，表示将使用此插件进行路径平滑。",[51,9160,9161,9163],{},[76,9162,5754],{},": 坐标变换的容差，用于处理不同坐标系之间的转换时的不确定性。",[51,9165,9166,9168,9169,9171,9172,9174],{},[76,9167,5760],{},": 指定是否使用模拟时间而非实际时间。在仿真环境中，这通常设置为",[76,9170,2024],{},"，以匹配仿真器的虚拟时间；在真实环境中，应设置为",[76,9173,5818],{},"以使用ROS系统的实际时间。",[16,9176,9177],{"id":9177},"速度平滑节点说明",[20,9179,9180,9181,8843,9184,9187],{},"Nav2框架中的",[76,9182,9183],{},"nav2_velocity_smoother",[76,9185,9186],{},"velocity_smoother","节点主要负责平滑由Nav2框架发送给机器人控制器的速度指令。其核心功能是实现速度和加速度平滑。这一功能对于确保机器人在导航过程中的稳定性和安全性至关重要。",[20,9189,9190],{},[23,9191,5549],{},[537,9193,9194,9204],{},[540,9195,9196],{},[543,9197,9198,9200,9202],{},[546,9199,549],{"align":548},[546,9201,4132],{"align":548},[546,9203,555],{"align":548},[557,9205,9206],{},[543,9207,9208,9210,9212],{},[562,9209,8116],{"align":548},[562,9211,8119],{"align":548},[562,9213,9214],{"align":548},"接收来自其他节点的速度控制指令的话题",[20,9216,9217],{},[23,9218,5608],{},[537,9220,9221,9231],{},[540,9222,9223],{},[543,9224,9225,9227,9229],{},[546,9226,549],{"align":548},[546,9228,4132],{"align":548},[546,9230,555],{"align":548},[557,9232,9233],{},[543,9234,9235,9237,9239],{},[562,9236,8636],{"align":548},[562,9238,8119],{"align":548},[562,9240,9241],{"align":548},"发布经过处理或平滑后的速度控制指令的话题",[20,9243,9244],{},[23,9245,8917],{},[48,9247,9248,9256,9262,9272,9278,9284,9290,9296,9305,9313,9322,9328,9333],{},[51,9249,9250,9252,9253,9255],{},[76,9251,5709],{},": 指示是否禁用节点间的心跳超时机制。如果为",[76,9254,2024],{},"，则节点间的心跳检测不会因超时而断开连接。",[51,9257,9258,9261],{},[76,9259,9260],{},"deadband_velocity",": 定义在哪些速度分量上应用死区平滑（即忽略小于此阈值的微小速度变化）。这里分别为X轴、Y轴和偏航角速度（theta）设置了死区值。",[51,9263,9264,9267,9268,9271],{},[76,9265,9266],{},"feedback",": 指定速度平滑器的反馈类型。",[76,9269,9270],{},"OPEN_LOOP","表示开环控制，即不考虑机器人的实际速度反馈进行速度调整。",[51,9273,9274,9277],{},[76,9275,9276],{},"max_accel",": 定义机器人在各个方向上的最大加速度限制，包括X轴、Y轴和偏航角速度（theta）。",[51,9279,9280,9283],{},[76,9281,9282],{},"max_decel",": 定义机器人在各个方向上的最大减速度限制，包括X轴、Y轴和偏航角速度（theta）。注意，减速度值以负数表示。",[51,9285,9286,9289],{},[76,9287,9288],{},"max_velocity",": 定义机器人在各个方向上的最大速度限制，包括X轴、Y轴和偏航角速度（theta）。",[51,9291,9292,9295],{},[76,9293,9294],{},"min_velocity",": 定义机器人在各个方向上的最小速度限制，包括X轴、Y轴和偏航角速度（theta）。这通常用于避免发送过小的速度指令给底层控制器。",[51,9297,9298,9301,9302,9304],{},[76,9299,9300],{},"odom_duration",": 与里程计数据相关的参数，但在此上下文中可能不直接用于",[76,9303,9186],{},"节点，可能是遗留或与其他功能相关联。",[51,9306,9307,9309,9310,9312],{},[76,9308,7404],{},": 指定里程计数据的ROS话题名称，",[76,9311,9186],{},"节点将订阅此话题以获取机器人的运动信息。",[51,9314,9315,9318,9319,9321],{},[76,9316,9317],{},"scale_velocities",": 指示是否根据加速度限制同比例调整速度的其他分量。如果为",[76,9320,5818],{},"，则不会进行速度缩放。",[51,9323,9324,9327],{},[76,9325,9326],{},"smoothing_frequency",": 定义速度平滑操作的执行频率（Hz），即每秒进行多少次平滑计算。",[51,9329,9330,9332],{},[76,9331,5760],{},": 指定是否使用模拟时间而非实际系统时间。这对于仿真环境特别有用，可以确保时间的一致性和可预测性。",[51,9334,9335,9338,9339,9341],{},[76,9336,9337],{},"velocity_timeout",": 如果在指定时间内未接收到新的速度指令，则",[76,9340,9186],{},"节点将停止发布速度指令，并可能发送零速度指令以停止机器人运动。这是为了防止在失去速度控制时机器人继续移动。",[16,9343,9345],{"id":9344},"导航功能集成ros2-humble及之前","导航功能集成(ROS2 Humble及之前)",[20,9347,9348],{},[23,9349,5964],{},[20,9351,5021],{},[70,9353,9355],{"className":72,"code":9354,"language":74,"meta":34,"style":34},"ros2 pkg create mycar_navigation2 --dependencies navigation2 nav2_common\n",[76,9356,9357],{"__ignoreMap":34},[79,9358,9359,9361,9363,9365,9368,9370,9373],{"class":81,"line":82},[79,9360,1207],{"class":85},[79,9362,1210],{"class":89},[79,9364,1213],{"class":89},[79,9366,9367],{"class":89}," mycar_navigation2",[79,9369,1220],{"class":1219},[79,9371,9372],{"class":89}," navigation2",[79,9374,9375],{"class":89}," nav2_common\n",[20,9377,9378],{},[23,9379,5995],{},[20,9381,9382],{},"在功能包下，新建launch目录、params目录和bts目录。",[20,9384,9385,9386,1235],{},"launch目录下新建",[76,9387,9388],{},"nav2.launch.py",[70,9390,9392],{"className":1238,"code":9391,"language":1240,"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\n    current_pkg = get_package_share_directory(\"mycar_navigation2\")\n\n    bt_params_file = os.path.join(current_pkg, \"params\", \"bt.yaml\")\n    planner_params_file = os.path.join(current_pkg, \"params\", \"planner.yaml\")\n    controller_params_file = os.path.join(current_pkg, \"params\", \"controller.yaml\")\n    behavior_params_file = os.path.join(current_pkg, \"params\", \"behavior.yaml\")\n    waypoint_params_file = os.path.join(current_pkg, \"params\", \"waypoint.yaml\")\n    velocity_params_file = os.path.join(current_pkg, \"params\", \"velocity.yaml\")\n    smoother_params_file = os.path.join(current_pkg, \"params\", \"smoother.yaml\")\n\n    def rewrite_params(params_file):\n        return ParameterFile(\n            RewrittenYaml(\n                source_file=params_file,\n                root_key='',\n                param_rewrites={\n                    'use_sim_time': use_sim_time\n                },\n                convert_types=True\n            ),\n            allow_substs=True\n        )\n\n    bt_params = rewrite_params(bt_params_file)\n    planner_params = rewrite_params(planner_params_file)\n    controller_params = rewrite_params(controller_params_file)\n    behavior_params = rewrite_params(behavior_params_file)\n    waypoint_params = rewrite_params(waypoint_params_file)\n    velocity_params = rewrite_params(velocity_params_file)\n    smoother_params = rewrite_params(smoother_params_file)\n\n    planner_server_node = Node(\n        package='nav2_planner',\n        executable='planner_server',\n        name='planner_server',\n        output='screen',\n        parameters=[\n            planner_params,\n            {'use_sim_time': use_sim_time}\n        ],\n    )\n\n    controller_server_node = Node(\n        package='nav2_controller',\n        executable='controller_server',\n        name='controller_server',\n        output='screen',\n        parameters=[\n            controller_params,\n            {'use_sim_time': use_sim_time}\n        ],\n        remappings=[\n            ('cmd_vel', 'cmd_vel_nav')\n        ]\n    )\n\n    behavior_server_node = Node(\n        package='nav2_behaviors',\n        executable='behavior_server',\n        name='behavior_server',\n        output='screen',\n        parameters=[\n            behavior_params,\n            {'use_sim_time': use_sim_time}\n        ]\n    )\n\n    waypoint_node = Node(\n        package='nav2_waypoint_follower',\n        executable='waypoint_follower',\n        name='waypoint_follower',\n        output='screen',\n        parameters=[\n            waypoint_params,\n            {'use_sim_time': use_sim_time}\n        ]\n    )\n\n    velocity_smoother_node = Node(\n        package='nav2_velocity_smoother',\n        executable='velocity_smoother',\n        name='velocity_smoother',\n        output='screen',\n        respawn_delay=2.0,\n        parameters=[\n            velocity_params,\n            {'use_sim_time': use_sim_time}\n        ],\n        remappings=[\n            ('cmd_vel', 'cmd_vel_nav'),\n            ('cmd_vel_smoothed', 'cmd_vel')\n        ]\n    )\n\n    smoother_server_node = Node(\n        package='nav2_smoother',\n        executable='smoother_server',\n        name='smoother_server',\n        output='screen',\n        parameters=[\n            smoother_params,\n            {'use_sim_time': use_sim_time}\n        ],\n    )\n\n    bt_navigator_node = Node(\n        package='nav2_bt_navigator',\n        executable='bt_navigator',\n        name='bt_navigator',\n        output='screen',\n        parameters=[\n            bt_params,\n            {'use_sim_time': use_sim_time},\n            {\n                \"default_nav_to_pose_bt_xml\": os.path.join(\n                    current_pkg,\n                    \"bts\",\n                    \"bt_planner_controller_behavior.xml\"\n                )\n            },\n            {\n                \"default_nav_through_poses_bt_xml\": os.path.join(\n                    current_pkg,\n                    \"bts\",\n                    \"bt_planner_controller_behavior_poses.xml\"\n                )\n            }\n        ],\n    )\n\n    lifecycle_manager_node = Node(\n        package='nav2_lifecycle_manager',\n        executable='lifecycle_manager',\n        name='lifecycle_manager_navigation',\n        output='screen',\n        parameters=[\n            {'use_sim_time': use_sim_time},\n            {'autostart': True},\n            {\n                'node_names': [\n                    'bt_navigator',\n                    'planner_server',\n                    'controller_server',\n                    'behavior_server',\n                    'waypoint_follower',\n                    'velocity_smoother',\n                    'smoother_server'\n                ]\n            }\n        ]\n    )\n\n    return LaunchDescription([\n        use_sim_time_arg,\n\n        lifecycle_manager_node,\n        bt_navigator_node,\n        planner_server_node,\n        controller_server_node,\n        behavior_server_node,\n        waypoint_node,\n        velocity_smoother_node,\n        smoother_server_node\n    ])\n",[76,9393,9394,9400,9404,9414,9418,9428,9438,9448,9452,9462,9474,9478,9490,9494,9498,9506,9510,9518,9524,9532,9536,9540,9552,9556,9571,9575,9594,9612,9630,9648,9666,9684,9702,9706,9717,9725,9730,9740,9752,9761,9769,9774,9784,9789,9798,9803,9807,9817,9827,9837,9847,9857,9867,9877,9881,9890,9901,9912,9922,9932,9940,9945,9953,9957,9961,9965,9974,9986,9998,10009,10020,10029,10035,10044,10049,10059,10075,10080,10085,10090,10100,10112,10124,10135,10146,10155,10161,10170,10175,10180,10185,10195,10207,10219,10230,10241,10250,10256,10265,10270,10275,10280,10290,10302,10314,10325,10336,10349,10358,10364,10373,10378,10387,10400,10414,10419,10424,10429,10439,10451,10463,10474,10485,10494,10500,10509,10514,10519,10524,10534,10546,10558,10569,10580,10589,10595,10605,10611,10620,10626,10634,10640,10646,10652,10657,10665,10670,10677,10683,10688,10694,10699,10704,10709,10719,10730,10741,10753,10764,10773,10782,10795,10800,10809,10817,10825,10833,10841,10849,10857,10863,10869,10874,10879,10884,10889,10896,10901,10906,10912,10918,10924,10930,10936,10942,10948,10954],{"__ignoreMap":34},[79,9395,9396,9398],{"class":81,"line":82},[79,9397,1247],{"class":99},[79,9399,1250],{"class":106},[79,9401,9402],{"class":81,"line":116},[79,9403,142],{"emptyLinePlaceholder":141},[79,9405,9406,9408,9410,9412],{"class":81,"line":138},[79,9407,1259],{"class":99},[79,9409,1310],{"class":106},[79,9411,1247],{"class":99},[79,9413,1315],{"class":106},[79,9415,9416],{"class":81,"line":145},[79,9417,142],{"emptyLinePlaceholder":141},[79,9419,9420,9422,9424,9426],{"class":81,"line":152},[79,9421,1259],{"class":99},[79,9423,1262],{"class":106},[79,9425,1247],{"class":99},[79,9427,1267],{"class":106},[79,9429,9430,9432,9434,9436],{"class":81,"line":164},[79,9431,1259],{"class":99},[79,9433,1274],{"class":106},[79,9435,1247],{"class":99},[79,9437,1279],{"class":106},[79,9439,9440,9442,9444,9446],{"class":81,"line":176},[79,9441,1259],{"class":99},[79,9443,1286],{"class":106},[79,9445,1247],{"class":99},[79,9447,1291],{"class":106},[79,9449,9450],{"class":81,"line":181},[79,9451,142],{"emptyLinePlaceholder":141},[79,9453,9454,9456,9458,9460],{"class":81,"line":187},[79,9455,1259],{"class":99},[79,9457,1298],{"class":106},[79,9459,1247],{"class":99},[79,9461,1303],{"class":106},[79,9463,9464,9466,9469,9471],{"class":81,"line":199},[79,9465,1259],{"class":99},[79,9467,9468],{"class":106}," launch_ros.descriptions ",[79,9470,1247],{"class":99},[79,9472,9473],{"class":106}," ParameterFile\n",[79,9475,9476],{"class":81,"line":1350},[79,9477,142],{"emptyLinePlaceholder":141},[79,9479,9480,9482,9485,9487],{"class":81,"line":1365},[79,9481,1259],{"class":99},[79,9483,9484],{"class":106}," nav2_common.launch ",[79,9486,1247],{"class":99},[79,9488,9489],{"class":106}," RewrittenYaml\n",[79,9491,9492],{"class":81,"line":1370},[79,9493,142],{"emptyLinePlaceholder":141},[79,9495,9496],{"class":81,"line":1381},[79,9497,142],{"emptyLinePlaceholder":141},[79,9499,9500,9502,9504],{"class":81,"line":1390},[79,9501,1324],{"class":99},[79,9503,1327],{"class":85},[79,9505,1330],{"class":106},[79,9507,9508],{"class":81,"line":1404},[79,9509,142],{"emptyLinePlaceholder":141},[79,9511,9512,9514,9516],{"class":81,"line":1417},[79,9513,3099],{"class":106},[79,9515,1338],{"class":99},[79,9517,1378],{"class":106},[79,9519,9520,9522],{"class":81,"line":1427},[79,9521,1384],{"class":89},[79,9523,1387],{"class":106},[79,9525,9526,9528,9530],{"class":81,"line":1435},[79,9527,1394],{"class":1393},[79,9529,1338],{"class":99},[79,9531,6126],{"class":89},[79,9533,9534],{"class":81,"line":1451},[79,9535,3252],{"class":106},[79,9537,9538],{"class":81,"line":1465},[79,9539,142],{"emptyLinePlaceholder":141},[79,9541,9542,9544,9546,9548,9550],{"class":81,"line":1477},[79,9543,1335],{"class":106},[79,9545,1338],{"class":99},[79,9547,1341],{"class":106},[79,9549,1344],{"class":89},[79,9551,1347],{"class":106},[79,9553,9554],{"class":81,"line":1482},[79,9555,142],{"emptyLinePlaceholder":141},[79,9557,9558,9561,9563,9566,9569],{"class":81,"line":1493},[79,9559,9560],{"class":106},"    current_pkg ",[79,9562,1338],{"class":99},[79,9564,9565],{"class":106}," get_package_share_directory(",[79,9567,9568],{"class":89},"\"mycar_navigation2\"",[79,9570,1347],{"class":106},[79,9572,9573],{"class":81,"line":1504},[79,9574,142],{"emptyLinePlaceholder":141},[79,9576,9577,9580,9582,9585,9587,9589,9592],{"class":81,"line":1510},[79,9578,9579],{"class":106},"    bt_params_file ",[79,9581,1338],{"class":99},[79,9583,9584],{"class":106}," os.path.join(current_pkg, ",[79,9586,3223],{"class":89},[79,9588,1457],{"class":106},[79,9590,9591],{"class":89},"\"bt.yaml\"",[79,9593,1347],{"class":106},[79,9595,9596,9599,9601,9603,9605,9607,9610],{"class":81,"line":1521},[79,9597,9598],{"class":106},"    planner_params_file ",[79,9600,1338],{"class":99},[79,9602,9584],{"class":106},[79,9604,3223],{"class":89},[79,9606,1457],{"class":106},[79,9608,9609],{"class":89},"\"planner.yaml\"",[79,9611,1347],{"class":106},[79,9613,9614,9617,9619,9621,9623,9625,9628],{"class":81,"line":1527},[79,9615,9616],{"class":106},"    controller_params_file ",[79,9618,1338],{"class":99},[79,9620,9584],{"class":106},[79,9622,3223],{"class":89},[79,9624,1457],{"class":106},[79,9626,9627],{"class":89},"\"controller.yaml\"",[79,9629,1347],{"class":106},[79,9631,9632,9635,9637,9639,9641,9643,9646],{"class":81,"line":1540},[79,9633,9634],{"class":106},"    behavior_params_file ",[79,9636,1338],{"class":99},[79,9638,9584],{"class":106},[79,9640,3223],{"class":89},[79,9642,1457],{"class":106},[79,9644,9645],{"class":89},"\"behavior.yaml\"",[79,9647,1347],{"class":106},[79,9649,9650,9653,9655,9657,9659,9661,9664],{"class":81,"line":1553},[79,9651,9652],{"class":106},"    waypoint_params_file ",[79,9654,1338],{"class":99},[79,9656,9584],{"class":106},[79,9658,3223],{"class":89},[79,9660,1457],{"class":106},[79,9662,9663],{"class":89},"\"waypoint.yaml\"",[79,9665,1347],{"class":106},[79,9667,9668,9671,9673,9675,9677,9679,9682],{"class":81,"line":1565},[79,9669,9670],{"class":106},"    velocity_params_file ",[79,9672,1338],{"class":99},[79,9674,9584],{"class":106},[79,9676,3223],{"class":89},[79,9678,1457],{"class":106},[79,9680,9681],{"class":89},"\"velocity.yaml\"",[79,9683,1347],{"class":106},[79,9685,9686,9689,9691,9693,9695,9697,9700],{"class":81,"line":1578},[79,9687,9688],{"class":106},"    smoother_params_file ",[79,9690,1338],{"class":99},[79,9692,9584],{"class":106},[79,9694,3223],{"class":89},[79,9696,1457],{"class":106},[79,9698,9699],{"class":89},"\"smoother.yaml\"",[79,9701,1347],{"class":106},[79,9703,9704],{"class":81,"line":1583},[79,9705,142],{"emptyLinePlaceholder":141},[79,9707,9708,9711,9714],{"class":81,"line":1594},[79,9709,9710],{"class":99},"    def",[79,9712,9713],{"class":85}," rewrite_params",[79,9715,9716],{"class":106},"(params_file):\n",[79,9718,9719,9722],{"class":81,"line":1599},[79,9720,9721],{"class":99},"        return",[79,9723,9724],{"class":106}," ParameterFile(\n",[79,9726,9727],{"class":81,"line":1605},[79,9728,9729],{"class":106},"            RewrittenYaml(\n",[79,9731,9732,9735,9737],{"class":81,"line":1611},[79,9733,9734],{"class":1393},"                source_file",[79,9736,1338],{"class":99},[79,9738,9739],{"class":106},"params_file,\n",[79,9741,9742,9745,9747,9750],{"class":81,"line":1617},[79,9743,9744],{"class":1393},"                root_key",[79,9746,1338],{"class":99},[79,9748,9749],{"class":89},"''",[79,9751,1387],{"class":106},[79,9753,9754,9757,9759],{"class":81,"line":1622},[79,9755,9756],{"class":1393},"                param_rewrites",[79,9758,1338],{"class":99},[79,9760,6436],{"class":106},[79,9762,9763,9766],{"class":81,"line":2005},[79,9764,9765],{"class":89},"                    'use_sim_time'",[79,9767,9768],{"class":106},": use_sim_time\n",[79,9770,9771],{"class":81,"line":2016},[79,9772,9773],{"class":106},"                },\n",[79,9775,9776,9779,9781],{"class":81,"line":2029},[79,9777,9778],{"class":1393},"                convert_types",[79,9780,1338],{"class":99},[79,9782,9783],{"class":1219},"True\n",[79,9785,9786],{"class":81,"line":2043},[79,9787,9788],{"class":106},"            ),\n",[79,9790,9791,9794,9796],{"class":81,"line":2056},[79,9792,9793],{"class":1393},"            allow_substs",[79,9795,1338],{"class":99},[79,9797,9783],{"class":1219},[79,9799,9800],{"class":81,"line":2070},[79,9801,9802],{"class":106},"        )\n",[79,9804,9805],{"class":81,"line":2081},[79,9806,142],{"emptyLinePlaceholder":141},[79,9808,9809,9812,9814],{"class":81,"line":2086},[79,9810,9811],{"class":106},"    bt_params ",[79,9813,1338],{"class":99},[79,9815,9816],{"class":106}," rewrite_params(bt_params_file)\n",[79,9818,9819,9822,9824],{"class":81,"line":2096},[79,9820,9821],{"class":106},"    planner_params ",[79,9823,1338],{"class":99},[79,9825,9826],{"class":106}," rewrite_params(planner_params_file)\n",[79,9828,9829,9832,9834],{"class":81,"line":2107},[79,9830,9831],{"class":106},"    controller_params ",[79,9833,1338],{"class":99},[79,9835,9836],{"class":106}," rewrite_params(controller_params_file)\n",[79,9838,9839,9842,9844],{"class":81,"line":2119},[79,9840,9841],{"class":106},"    behavior_params ",[79,9843,1338],{"class":99},[79,9845,9846],{"class":106}," rewrite_params(behavior_params_file)\n",[79,9848,9849,9852,9854],{"class":81,"line":2124},[79,9850,9851],{"class":106},"    waypoint_params ",[79,9853,1338],{"class":99},[79,9855,9856],{"class":106}," rewrite_params(waypoint_params_file)\n",[79,9858,9859,9862,9864],{"class":81,"line":2135},[79,9860,9861],{"class":106},"    velocity_params ",[79,9863,1338],{"class":99},[79,9865,9866],{"class":106}," rewrite_params(velocity_params_file)\n",[79,9868,9869,9872,9874],{"class":81,"line":2145},[79,9870,9871],{"class":106},"    smoother_params ",[79,9873,1338],{"class":99},[79,9875,9876],{"class":106}," rewrite_params(smoother_params_file)\n",[79,9878,9879],{"class":81,"line":2156},[79,9880,142],{"emptyLinePlaceholder":141},[79,9882,9883,9886,9888],{"class":81,"line":2161},[79,9884,9885],{"class":106},"    planner_server_node ",[79,9887,1338],{"class":99},[79,9889,1490],{"class":106},[79,9891,9892,9894,9896,9899],{"class":81,"line":2175},[79,9893,1530],{"class":1393},[79,9895,1338],{"class":99},[79,9897,9898],{"class":89},"'nav2_planner'",[79,9900,1387],{"class":106},[79,9902,9903,9905,9907,9910],{"class":81,"line":2188},[79,9904,1543],{"class":1393},[79,9906,1338],{"class":99},[79,9908,9909],{"class":89},"'planner_server'",[79,9911,1387],{"class":106},[79,9913,9914,9916,9918,9920],{"class":81,"line":2193},[79,9915,1556],{"class":1393},[79,9917,1338],{"class":99},[79,9919,9909],{"class":89},[79,9921,1387],{"class":106},[79,9923,9924,9926,9928,9930],{"class":81,"line":2207},[79,9925,1568],{"class":1393},[79,9927,1338],{"class":99},[79,9929,1573],{"class":89},[79,9931,1387],{"class":106},[79,9933,9934,9936,9938],{"class":81,"line":2221},[79,9935,1496],{"class":1393},[79,9937,1338],{"class":99},[79,9939,1501],{"class":106},[79,9941,9942],{"class":81,"line":2235},[79,9943,9944],{"class":106},"            planner_params,\n",[79,9946,9947,9949,9951],{"class":81,"line":2246},[79,9948,3299],{"class":106},[79,9950,1344],{"class":89},[79,9952,1518],{"class":106},[79,9954,9955],{"class":81,"line":2256},[79,9956,1524],{"class":106},[79,9958,9959],{"class":81,"line":6478},[79,9960,3252],{"class":106},[79,9962,9963],{"class":81,"line":6484},[79,9964,142],{"emptyLinePlaceholder":141},[79,9966,9967,9970,9972],{"class":81,"line":6490},[79,9968,9969],{"class":106},"    controller_server_node ",[79,9971,1338],{"class":99},[79,9973,1490],{"class":106},[79,9975,9977,9979,9981,9984],{"class":81,"line":9976},67,[79,9978,1530],{"class":1393},[79,9980,1338],{"class":99},[79,9982,9983],{"class":89},"'nav2_controller'",[79,9985,1387],{"class":106},[79,9987,9989,9991,9993,9996],{"class":81,"line":9988},68,[79,9990,1543],{"class":1393},[79,9992,1338],{"class":99},[79,9994,9995],{"class":89},"'controller_server'",[79,9997,1387],{"class":106},[79,9999,10001,10003,10005,10007],{"class":81,"line":10000},69,[79,10002,1556],{"class":1393},[79,10004,1338],{"class":99},[79,10006,9995],{"class":89},[79,10008,1387],{"class":106},[79,10010,10012,10014,10016,10018],{"class":81,"line":10011},70,[79,10013,1568],{"class":1393},[79,10015,1338],{"class":99},[79,10017,1573],{"class":89},[79,10019,1387],{"class":106},[79,10021,10023,10025,10027],{"class":81,"line":10022},71,[79,10024,1496],{"class":1393},[79,10026,1338],{"class":99},[79,10028,1501],{"class":106},[79,10030,10032],{"class":81,"line":10031},72,[79,10033,10034],{"class":106},"            controller_params,\n",[79,10036,10038,10040,10042],{"class":81,"line":10037},73,[79,10039,3299],{"class":106},[79,10041,1344],{"class":89},[79,10043,1518],{"class":106},[79,10045,10047],{"class":81,"line":10046},74,[79,10048,1524],{"class":106},[79,10050,10052,10055,10057],{"class":81,"line":10051},75,[79,10053,10054],{"class":1393},"        remappings",[79,10056,1338],{"class":99},[79,10058,1501],{"class":106},[79,10060,10062,10065,10068,10070,10073],{"class":81,"line":10061},76,[79,10063,10064],{"class":106},"            (",[79,10066,10067],{"class":89},"'cmd_vel'",[79,10069,1457],{"class":106},[79,10071,10072],{"class":89},"'cmd_vel_nav'",[79,10074,1347],{"class":106},[79,10076,10078],{"class":81,"line":10077},77,[79,10079,6259],{"class":106},[79,10081,10083],{"class":81,"line":10082},78,[79,10084,3252],{"class":106},[79,10086,10088],{"class":81,"line":10087},79,[79,10089,142],{"emptyLinePlaceholder":141},[79,10091,10093,10096,10098],{"class":81,"line":10092},80,[79,10094,10095],{"class":106},"    behavior_server_node ",[79,10097,1338],{"class":99},[79,10099,1490],{"class":106},[79,10101,10103,10105,10107,10110],{"class":81,"line":10102},81,[79,10104,1530],{"class":1393},[79,10106,1338],{"class":99},[79,10108,10109],{"class":89},"'nav2_behaviors'",[79,10111,1387],{"class":106},[79,10113,10115,10117,10119,10122],{"class":81,"line":10114},82,[79,10116,1543],{"class":1393},[79,10118,1338],{"class":99},[79,10120,10121],{"class":89},"'behavior_server'",[79,10123,1387],{"class":106},[79,10125,10127,10129,10131,10133],{"class":81,"line":10126},83,[79,10128,1556],{"class":1393},[79,10130,1338],{"class":99},[79,10132,10121],{"class":89},[79,10134,1387],{"class":106},[79,10136,10138,10140,10142,10144],{"class":81,"line":10137},84,[79,10139,1568],{"class":1393},[79,10141,1338],{"class":99},[79,10143,1573],{"class":89},[79,10145,1387],{"class":106},[79,10147,10149,10151,10153],{"class":81,"line":10148},85,[79,10150,1496],{"class":1393},[79,10152,1338],{"class":99},[79,10154,1501],{"class":106},[79,10156,10158],{"class":81,"line":10157},86,[79,10159,10160],{"class":106},"            behavior_params,\n",[79,10162,10164,10166,10168],{"class":81,"line":10163},87,[79,10165,3299],{"class":106},[79,10167,1344],{"class":89},[79,10169,1518],{"class":106},[79,10171,10173],{"class":81,"line":10172},88,[79,10174,6259],{"class":106},[79,10176,10178],{"class":81,"line":10177},89,[79,10179,3252],{"class":106},[79,10181,10183],{"class":81,"line":10182},90,[79,10184,142],{"emptyLinePlaceholder":141},[79,10186,10188,10191,10193],{"class":81,"line":10187},91,[79,10189,10190],{"class":106},"    waypoint_node ",[79,10192,1338],{"class":99},[79,10194,1490],{"class":106},[79,10196,10198,10200,10202,10205],{"class":81,"line":10197},92,[79,10199,1530],{"class":1393},[79,10201,1338],{"class":99},[79,10203,10204],{"class":89},"'nav2_waypoint_follower'",[79,10206,1387],{"class":106},[79,10208,10210,10212,10214,10217],{"class":81,"line":10209},93,[79,10211,1543],{"class":1393},[79,10213,1338],{"class":99},[79,10215,10216],{"class":89},"'waypoint_follower'",[79,10218,1387],{"class":106},[79,10220,10222,10224,10226,10228],{"class":81,"line":10221},94,[79,10223,1556],{"class":1393},[79,10225,1338],{"class":99},[79,10227,10216],{"class":89},[79,10229,1387],{"class":106},[79,10231,10233,10235,10237,10239],{"class":81,"line":10232},95,[79,10234,1568],{"class":1393},[79,10236,1338],{"class":99},[79,10238,1573],{"class":89},[79,10240,1387],{"class":106},[79,10242,10244,10246,10248],{"class":81,"line":10243},96,[79,10245,1496],{"class":1393},[79,10247,1338],{"class":99},[79,10249,1501],{"class":106},[79,10251,10253],{"class":81,"line":10252},97,[79,10254,10255],{"class":106},"            waypoint_params,\n",[79,10257,10259,10261,10263],{"class":81,"line":10258},98,[79,10260,3299],{"class":106},[79,10262,1344],{"class":89},[79,10264,1518],{"class":106},[79,10266,10268],{"class":81,"line":10267},99,[79,10269,6259],{"class":106},[79,10271,10273],{"class":81,"line":10272},100,[79,10274,3252],{"class":106},[79,10276,10278],{"class":81,"line":10277},101,[79,10279,142],{"emptyLinePlaceholder":141},[79,10281,10283,10286,10288],{"class":81,"line":10282},102,[79,10284,10285],{"class":106},"    velocity_smoother_node ",[79,10287,1338],{"class":99},[79,10289,1490],{"class":106},[79,10291,10293,10295,10297,10300],{"class":81,"line":10292},103,[79,10294,1530],{"class":1393},[79,10296,1338],{"class":99},[79,10298,10299],{"class":89},"'nav2_velocity_smoother'",[79,10301,1387],{"class":106},[79,10303,10305,10307,10309,10312],{"class":81,"line":10304},104,[79,10306,1543],{"class":1393},[79,10308,1338],{"class":99},[79,10310,10311],{"class":89},"'velocity_smoother'",[79,10313,1387],{"class":106},[79,10315,10317,10319,10321,10323],{"class":81,"line":10316},105,[79,10318,1556],{"class":1393},[79,10320,1338],{"class":99},[79,10322,10311],{"class":89},[79,10324,1387],{"class":106},[79,10326,10328,10330,10332,10334],{"class":81,"line":10327},106,[79,10329,1568],{"class":1393},[79,10331,1338],{"class":99},[79,10333,1573],{"class":89},[79,10335,1387],{"class":106},[79,10337,10339,10342,10344,10347],{"class":81,"line":10338},107,[79,10340,10341],{"class":1393},"        respawn_delay",[79,10343,1338],{"class":99},[79,10345,10346],{"class":1219},"2.0",[79,10348,1387],{"class":106},[79,10350,10352,10354,10356],{"class":81,"line":10351},108,[79,10353,1496],{"class":1393},[79,10355,1338],{"class":99},[79,10357,1501],{"class":106},[79,10359,10361],{"class":81,"line":10360},109,[79,10362,10363],{"class":106},"            velocity_params,\n",[79,10365,10367,10369,10371],{"class":81,"line":10366},110,[79,10368,3299],{"class":106},[79,10370,1344],{"class":89},[79,10372,1518],{"class":106},[79,10374,10376],{"class":81,"line":10375},111,[79,10377,1524],{"class":106},[79,10379,10381,10383,10385],{"class":81,"line":10380},112,[79,10382,10054],{"class":1393},[79,10384,1338],{"class":99},[79,10386,1501],{"class":106},[79,10388,10390,10392,10394,10396,10398],{"class":81,"line":10389},113,[79,10391,10064],{"class":106},[79,10393,10067],{"class":89},[79,10395,1457],{"class":106},[79,10397,10072],{"class":89},[79,10399,1448],{"class":106},[79,10401,10403,10405,10408,10410,10412],{"class":81,"line":10402},114,[79,10404,10064],{"class":106},[79,10406,10407],{"class":89},"'cmd_vel_smoothed'",[79,10409,1457],{"class":106},[79,10411,10067],{"class":89},[79,10413,1347],{"class":106},[79,10415,10417],{"class":81,"line":10416},115,[79,10418,6259],{"class":106},[79,10420,10422],{"class":81,"line":10421},116,[79,10423,3252],{"class":106},[79,10425,10427],{"class":81,"line":10426},117,[79,10428,142],{"emptyLinePlaceholder":141},[79,10430,10432,10435,10437],{"class":81,"line":10431},118,[79,10433,10434],{"class":106},"    smoother_server_node ",[79,10436,1338],{"class":99},[79,10438,1490],{"class":106},[79,10440,10442,10444,10446,10449],{"class":81,"line":10441},119,[79,10443,1530],{"class":1393},[79,10445,1338],{"class":99},[79,10447,10448],{"class":89},"'nav2_smoother'",[79,10450,1387],{"class":106},[79,10452,10454,10456,10458,10461],{"class":81,"line":10453},120,[79,10455,1543],{"class":1393},[79,10457,1338],{"class":99},[79,10459,10460],{"class":89},"'smoother_server'",[79,10462,1387],{"class":106},[79,10464,10466,10468,10470,10472],{"class":81,"line":10465},121,[79,10467,1556],{"class":1393},[79,10469,1338],{"class":99},[79,10471,10460],{"class":89},[79,10473,1387],{"class":106},[79,10475,10477,10479,10481,10483],{"class":81,"line":10476},122,[79,10478,1568],{"class":1393},[79,10480,1338],{"class":99},[79,10482,1573],{"class":89},[79,10484,1387],{"class":106},[79,10486,10488,10490,10492],{"class":81,"line":10487},123,[79,10489,1496],{"class":1393},[79,10491,1338],{"class":99},[79,10493,1501],{"class":106},[79,10495,10497],{"class":81,"line":10496},124,[79,10498,10499],{"class":106},"            smoother_params,\n",[79,10501,10503,10505,10507],{"class":81,"line":10502},125,[79,10504,3299],{"class":106},[79,10506,1344],{"class":89},[79,10508,1518],{"class":106},[79,10510,10512],{"class":81,"line":10511},126,[79,10513,1524],{"class":106},[79,10515,10517],{"class":81,"line":10516},127,[79,10518,3252],{"class":106},[79,10520,10522],{"class":81,"line":10521},128,[79,10523,142],{"emptyLinePlaceholder":141},[79,10525,10527,10530,10532],{"class":81,"line":10526},129,[79,10528,10529],{"class":106},"    bt_navigator_node ",[79,10531,1338],{"class":99},[79,10533,1490],{"class":106},[79,10535,10537,10539,10541,10544],{"class":81,"line":10536},130,[79,10538,1530],{"class":1393},[79,10540,1338],{"class":99},[79,10542,10543],{"class":89},"'nav2_bt_navigator'",[79,10545,1387],{"class":106},[79,10547,10549,10551,10553,10556],{"class":81,"line":10548},131,[79,10550,1543],{"class":1393},[79,10552,1338],{"class":99},[79,10554,10555],{"class":89},"'bt_navigator'",[79,10557,1387],{"class":106},[79,10559,10561,10563,10565,10567],{"class":81,"line":10560},132,[79,10562,1556],{"class":1393},[79,10564,1338],{"class":99},[79,10566,10555],{"class":89},[79,10568,1387],{"class":106},[79,10570,10572,10574,10576,10578],{"class":81,"line":10571},133,[79,10573,1568],{"class":1393},[79,10575,1338],{"class":99},[79,10577,1573],{"class":89},[79,10579,1387],{"class":106},[79,10581,10583,10585,10587],{"class":81,"line":10582},134,[79,10584,1496],{"class":1393},[79,10586,1338],{"class":99},[79,10588,1501],{"class":106},[79,10590,10592],{"class":81,"line":10591},135,[79,10593,10594],{"class":106},"            bt_params,\n",[79,10596,10598,10600,10602],{"class":81,"line":10597},136,[79,10599,3299],{"class":106},[79,10601,1344],{"class":89},[79,10603,10604],{"class":106},": use_sim_time},\n",[79,10606,10608],{"class":81,"line":10607},137,[79,10609,10610],{"class":106},"            {\n",[79,10612,10614,10617],{"class":81,"line":10613},138,[79,10615,10616],{"class":89},"                \"default_nav_to_pose_bt_xml\"",[79,10618,10619],{"class":106},": os.path.join(\n",[79,10621,10623],{"class":81,"line":10622},139,[79,10624,10625],{"class":106},"                    current_pkg,\n",[79,10627,10629,10632],{"class":81,"line":10628},140,[79,10630,10631],{"class":89},"                    \"bts\"",[79,10633,1387],{"class":106},[79,10635,10637],{"class":81,"line":10636},141,[79,10638,10639],{"class":89},"                    \"bt_planner_controller_behavior.xml\"\n",[79,10641,10643],{"class":81,"line":10642},142,[79,10644,10645],{"class":106},"                )\n",[79,10647,10649],{"class":81,"line":10648},143,[79,10650,10651],{"class":106},"            },\n",[79,10653,10655],{"class":81,"line":10654},144,[79,10656,10610],{"class":106},[79,10658,10660,10663],{"class":81,"line":10659},145,[79,10661,10662],{"class":89},"                \"default_nav_through_poses_bt_xml\"",[79,10664,10619],{"class":106},[79,10666,10668],{"class":81,"line":10667},146,[79,10669,10625],{"class":106},[79,10671,10673,10675],{"class":81,"line":10672},147,[79,10674,10631],{"class":89},[79,10676,1387],{"class":106},[79,10678,10680],{"class":81,"line":10679},148,[79,10681,10682],{"class":89},"                    \"bt_planner_controller_behavior_poses.xml\"\n",[79,10684,10686],{"class":81,"line":10685},149,[79,10687,10645],{"class":106},[79,10689,10691],{"class":81,"line":10690},150,[79,10692,10693],{"class":106},"            }\n",[79,10695,10697],{"class":81,"line":10696},151,[79,10698,1524],{"class":106},[79,10700,10702],{"class":81,"line":10701},152,[79,10703,3252],{"class":106},[79,10705,10707],{"class":81,"line":10706},153,[79,10708,142],{"emptyLinePlaceholder":141},[79,10710,10712,10715,10717],{"class":81,"line":10711},154,[79,10713,10714],{"class":106},"    lifecycle_manager_node ",[79,10716,1338],{"class":99},[79,10718,1490],{"class":106},[79,10720,10722,10724,10726,10728],{"class":81,"line":10721},155,[79,10723,1530],{"class":1393},[79,10725,1338],{"class":99},[79,10727,5365],{"class":89},[79,10729,1387],{"class":106},[79,10731,10733,10735,10737,10739],{"class":81,"line":10732},156,[79,10734,1543],{"class":1393},[79,10736,1338],{"class":99},[79,10738,5377],{"class":89},[79,10740,1387],{"class":106},[79,10742,10744,10746,10748,10751],{"class":81,"line":10743},157,[79,10745,1556],{"class":1393},[79,10747,1338],{"class":99},[79,10749,10750],{"class":89},"'lifecycle_manager_navigation'",[79,10752,1387],{"class":106},[79,10754,10756,10758,10760,10762],{"class":81,"line":10755},158,[79,10757,1568],{"class":1393},[79,10759,1338],{"class":99},[79,10761,1573],{"class":89},[79,10763,1387],{"class":106},[79,10765,10767,10769,10771],{"class":81,"line":10766},159,[79,10768,1496],{"class":1393},[79,10770,1338],{"class":99},[79,10772,1501],{"class":106},[79,10774,10776,10778,10780],{"class":81,"line":10775},160,[79,10777,3299],{"class":106},[79,10779,1344],{"class":89},[79,10781,10604],{"class":106},[79,10783,10785,10787,10789,10791,10793],{"class":81,"line":10784},161,[79,10786,3299],{"class":106},[79,10788,5427],{"class":89},[79,10790,1668],{"class":106},[79,10792,5327],{"class":1219},[79,10794,5330],{"class":106},[79,10796,10798],{"class":81,"line":10797},162,[79,10799,10610],{"class":106},[79,10801,10803,10806],{"class":81,"line":10802},163,[79,10804,10805],{"class":89},"                'node_names'",[79,10807,10808],{"class":106},": [\n",[79,10810,10812,10815],{"class":81,"line":10811},164,[79,10813,10814],{"class":89},"                    'bt_navigator'",[79,10816,1387],{"class":106},[79,10818,10820,10823],{"class":81,"line":10819},165,[79,10821,10822],{"class":89},"                    'planner_server'",[79,10824,1387],{"class":106},[79,10826,10828,10831],{"class":81,"line":10827},166,[79,10829,10830],{"class":89},"                    'controller_server'",[79,10832,1387],{"class":106},[79,10834,10836,10839],{"class":81,"line":10835},167,[79,10837,10838],{"class":89},"                    'behavior_server'",[79,10840,1387],{"class":106},[79,10842,10844,10847],{"class":81,"line":10843},168,[79,10845,10846],{"class":89},"                    'waypoint_follower'",[79,10848,1387],{"class":106},[79,10850,10852,10855],{"class":81,"line":10851},169,[79,10853,10854],{"class":89},"                    'velocity_smoother'",[79,10856,1387],{"class":106},[79,10858,10860],{"class":81,"line":10859},170,[79,10861,10862],{"class":89},"                    'smoother_server'\n",[79,10864,10866],{"class":81,"line":10865},171,[79,10867,10868],{"class":106},"                ]\n",[79,10870,10872],{"class":81,"line":10871},172,[79,10873,10693],{"class":106},[79,10875,10877],{"class":81,"line":10876},173,[79,10878,6259],{"class":106},[79,10880,10882],{"class":81,"line":10881},174,[79,10883,3252],{"class":106},[79,10885,10887],{"class":81,"line":10886},175,[79,10888,142],{"emptyLinePlaceholder":141},[79,10890,10892,10894],{"class":81,"line":10891},176,[79,10893,1625],{"class":99},[79,10895,3335],{"class":106},[79,10897,10899],{"class":81,"line":10898},177,[79,10900,3340],{"class":106},[79,10902,10904],{"class":81,"line":10903},178,[79,10905,142],{"emptyLinePlaceholder":141},[79,10907,10909],{"class":81,"line":10908},179,[79,10910,10911],{"class":106},"        lifecycle_manager_node,\n",[79,10913,10915],{"class":81,"line":10914},180,[79,10916,10917],{"class":106},"        bt_navigator_node,\n",[79,10919,10921],{"class":81,"line":10920},181,[79,10922,10923],{"class":106},"        planner_server_node,\n",[79,10925,10927],{"class":81,"line":10926},182,[79,10928,10929],{"class":106},"        controller_server_node,\n",[79,10931,10933],{"class":81,"line":10932},183,[79,10934,10935],{"class":106},"        behavior_server_node,\n",[79,10937,10939],{"class":81,"line":10938},184,[79,10940,10941],{"class":106},"        waypoint_node,\n",[79,10943,10945],{"class":81,"line":10944},185,[79,10946,10947],{"class":106},"        velocity_smoother_node,\n",[79,10949,10951],{"class":81,"line":10950},186,[79,10952,10953],{"class":106},"        smoother_server_node\n",[79,10955,10957],{"class":81,"line":10956},187,[79,10958,3360],{"class":106},[20,10960,10961],{},"该launch文件主要是加载了生命周期管理器、行为树、规划器、控制器、恢复器、航点跟踪、路径平滑以及速度平滑等节点。并且除了生命周期管理器节点外，每个节点都还会加载一个配置文件，接下来需要编辑这些配置文。",[20,10963,10964],{},[23,10965,10966],{},"（1）bt_navigator相关配置文件",[20,10968,10969],{},"bt_navigator相关配置文件有两个，分别是描述行为树的xml文件，以及yaml格式的参数文件，前者存储在bts目录下，后者存储在params目录下。",[20,10971,10972,10973,10976],{},"请在bts目录下，新建一个名为",[76,10974,10975],{},"bt_planner_controller_behavior.xml","的文件并输入如下内容：",[70,10978,10982],{"className":10979,"code":10980,"language":10981,"meta":34,"style":34},"language-xml shiki shiki-themes github-light github-dark","\n\u003Croot main_tree_to_execute=\"MainTree\">\n  \u003CBehaviorTree ID=\"MainTree\">\n    \u003CRecoveryNode number_of_retries=\"6\" name=\"NavigateRecovery\">\n      \u003CPipelineSequence name=\"NavigateWithReplanning\">\n        \u003CRateController hz=\"1.0\">\n          \u003CRecoveryNode number_of_retries=\"1\" name=\"ComputePathToPose\">\n            \u003CComputePathToPose goal=\"{goal}\" path=\"{path}\" planner_id=\"GridBased\"\u002F>\n            \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Context\" service_name=\"global_costmap\u002Fclear_entirely_global_costmap\"\u002F>\n          \u003C\u002FRecoveryNode>\n        \u003C\u002FRateController>\n        \u003CRecoveryNode number_of_retries=\"1\" name=\"FollowPath\">\n          \u003CFollowPath path=\"{path}\" controller_id=\"FollowPath\"\u002F>\n          \u003CClearEntireCostmap name=\"ClearLocalCostmap-Context\" service_name=\"local_costmap\u002Fclear_entirely_local_costmap\"\u002F>\n        \u003C\u002FRecoveryNode>\n      \u003C\u002FPipelineSequence>\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\"\u002F>\n          \u003CWait wait_duration=\"5\"\u002F>\n          \u003CBackUp backup_dist=\"0.30\" backup_speed=\"0.05\"\u002F>\n        \u003C\u002FRoundRobin>\n      \u003C\u002FReactiveFallback>\n    \u003C\u002FRecoveryNode>\n  \u003C\u002FBehaviorTree>\n\u003C\u002Froot>\n","xml",[76,10983,10984,10988,11006,11023,11049,11066,11084,11107,11142,11166,11175,11184,11205,11227,11249,11257,11266,11282,11291,11307,11323,11344,11365,11373,11390,11407,11432,11440,11448,11457,11466],{"__ignoreMap":34},[79,10985,10986],{"class":81,"line":82},[79,10987,142],{"emptyLinePlaceholder":141},[79,10989,10990,10992,10995,10998,11000,11003],{"class":81,"line":116},[79,10991,100],{"class":106},[79,10993,10994],{"class":1650},"root",[79,10996,10997],{"class":85}," main_tree_to_execute",[79,10999,1338],{"class":106},[79,11001,11002],{"class":89},"\"MainTree\"",[79,11004,11005],{"class":106},">\n",[79,11007,11008,11011,11014,11017,11019,11021],{"class":81,"line":138},[79,11009,11010],{"class":106},"  \u003C",[79,11012,11013],{"class":1650},"BehaviorTree",[79,11015,11016],{"class":85}," ID",[79,11018,1338],{"class":106},[79,11020,11002],{"class":89},[79,11022,11005],{"class":106},[79,11024,11025,11028,11031,11034,11036,11039,11042,11044,11047],{"class":81,"line":145},[79,11026,11027],{"class":106},"    \u003C",[79,11029,11030],{"class":1650},"RecoveryNode",[79,11032,11033],{"class":85}," number_of_retries",[79,11035,1338],{"class":106},[79,11037,11038],{"class":89},"\"6\"",[79,11040,11041],{"class":85}," name",[79,11043,1338],{"class":106},[79,11045,11046],{"class":89},"\"NavigateRecovery\"",[79,11048,11005],{"class":106},[79,11050,11051,11054,11057,11059,11061,11064],{"class":81,"line":152},[79,11052,11053],{"class":106},"      \u003C",[79,11055,11056],{"class":1650},"PipelineSequence",[79,11058,11041],{"class":85},[79,11060,1338],{"class":106},[79,11062,11063],{"class":89},"\"NavigateWithReplanning\"",[79,11065,11005],{"class":106},[79,11067,11068,11071,11074,11077,11079,11082],{"class":81,"line":164},[79,11069,11070],{"class":106},"        \u003C",[79,11072,11073],{"class":1650},"RateController",[79,11075,11076],{"class":85}," hz",[79,11078,1338],{"class":106},[79,11080,11081],{"class":89},"\"1.0\"",[79,11083,11005],{"class":106},[79,11085,11086,11089,11091,11093,11095,11098,11100,11102,11105],{"class":81,"line":176},[79,11087,11088],{"class":106},"          \u003C",[79,11090,11030],{"class":1650},[79,11092,11033],{"class":85},[79,11094,1338],{"class":106},[79,11096,11097],{"class":89},"\"1\"",[79,11099,11041],{"class":85},[79,11101,1338],{"class":106},[79,11103,11104],{"class":89},"\"ComputePathToPose\"",[79,11106,11005],{"class":106},[79,11108,11109,11112,11115,11118,11120,11123,11126,11128,11131,11134,11136,11139],{"class":81,"line":181},[79,11110,11111],{"class":106},"            \u003C",[79,11113,11114],{"class":1650},"ComputePathToPose",[79,11116,11117],{"class":85}," goal",[79,11119,1338],{"class":106},[79,11121,11122],{"class":89},"\"{goal}\"",[79,11124,11125],{"class":85}," path",[79,11127,1338],{"class":106},[79,11129,11130],{"class":89},"\"{path}\"",[79,11132,11133],{"class":85}," planner_id",[79,11135,1338],{"class":106},[79,11137,11138],{"class":89},"\"GridBased\"",[79,11140,11141],{"class":106},"\u002F>\n",[79,11143,11144,11146,11149,11151,11153,11156,11159,11161,11164],{"class":81,"line":187},[79,11145,11111],{"class":106},[79,11147,11148],{"class":1650},"ClearEntireCostmap",[79,11150,11041],{"class":85},[79,11152,1338],{"class":106},[79,11154,11155],{"class":89},"\"ClearGlobalCostmap-Context\"",[79,11157,11158],{"class":85}," service_name",[79,11160,1338],{"class":106},[79,11162,11163],{"class":89},"\"global_costmap\u002Fclear_entirely_global_costmap\"",[79,11165,11141],{"class":106},[79,11167,11168,11171,11173],{"class":81,"line":199},[79,11169,11170],{"class":106},"          \u003C\u002F",[79,11172,11030],{"class":1650},[79,11174,11005],{"class":106},[79,11176,11177,11180,11182],{"class":81,"line":1350},[79,11178,11179],{"class":106},"        \u003C\u002F",[79,11181,11073],{"class":1650},[79,11183,11005],{"class":106},[79,11185,11186,11188,11190,11192,11194,11196,11198,11200,11203],{"class":81,"line":1365},[79,11187,11070],{"class":106},[79,11189,11030],{"class":1650},[79,11191,11033],{"class":85},[79,11193,1338],{"class":106},[79,11195,11097],{"class":89},[79,11197,11041],{"class":85},[79,11199,1338],{"class":106},[79,11201,11202],{"class":89},"\"FollowPath\"",[79,11204,11005],{"class":106},[79,11206,11207,11209,11212,11214,11216,11218,11221,11223,11225],{"class":81,"line":1370},[79,11208,11088],{"class":106},[79,11210,11211],{"class":1650},"FollowPath",[79,11213,11125],{"class":85},[79,11215,1338],{"class":106},[79,11217,11130],{"class":89},[79,11219,11220],{"class":85}," controller_id",[79,11222,1338],{"class":106},[79,11224,11202],{"class":89},[79,11226,11141],{"class":106},[79,11228,11229,11231,11233,11235,11237,11240,11242,11244,11247],{"class":81,"line":1381},[79,11230,11088],{"class":106},[79,11232,11148],{"class":1650},[79,11234,11041],{"class":85},[79,11236,1338],{"class":106},[79,11238,11239],{"class":89},"\"ClearLocalCostmap-Context\"",[79,11241,11158],{"class":85},[79,11243,1338],{"class":106},[79,11245,11246],{"class":89},"\"local_costmap\u002Fclear_entirely_local_costmap\"",[79,11248,11141],{"class":106},[79,11250,11251,11253,11255],{"class":81,"line":1390},[79,11252,11179],{"class":106},[79,11254,11030],{"class":1650},[79,11256,11005],{"class":106},[79,11258,11259,11262,11264],{"class":81,"line":1404},[79,11260,11261],{"class":106},"      \u003C\u002F",[79,11263,11056],{"class":1650},[79,11265,11005],{"class":106},[79,11267,11268,11270,11273,11275,11277,11280],{"class":81,"line":1417},[79,11269,11053],{"class":106},[79,11271,11272],{"class":1650},"ReactiveFallback",[79,11274,11041],{"class":85},[79,11276,1338],{"class":106},[79,11278,11279],{"class":89},"\"RecoveryFallback\"",[79,11281,11005],{"class":106},[79,11283,11284,11286,11289],{"class":81,"line":1427},[79,11285,11070],{"class":106},[79,11287,11288],{"class":1650},"GoalUpdated",[79,11290,11141],{"class":106},[79,11292,11293,11295,11298,11300,11302,11305],{"class":81,"line":1435},[79,11294,11070],{"class":106},[79,11296,11297],{"class":1650},"RoundRobin",[79,11299,11041],{"class":85},[79,11301,1338],{"class":106},[79,11303,11304],{"class":89},"\"RecoveryActions\"",[79,11306,11005],{"class":106},[79,11308,11309,11311,11314,11316,11318,11321],{"class":81,"line":1451},[79,11310,11088],{"class":106},[79,11312,11313],{"class":1650},"Sequence",[79,11315,11041],{"class":85},[79,11317,1338],{"class":106},[79,11319,11320],{"class":89},"\"ClearingActions\"",[79,11322,11005],{"class":106},[79,11324,11325,11327,11329,11331,11333,11336,11338,11340,11342],{"class":81,"line":1465},[79,11326,11111],{"class":106},[79,11328,11148],{"class":1650},[79,11330,11041],{"class":85},[79,11332,1338],{"class":106},[79,11334,11335],{"class":89},"\"ClearLocalCostmap-Subtree\"",[79,11337,11158],{"class":85},[79,11339,1338],{"class":106},[79,11341,11246],{"class":89},[79,11343,11141],{"class":106},[79,11345,11346,11348,11350,11352,11354,11357,11359,11361,11363],{"class":81,"line":1477},[79,11347,11111],{"class":106},[79,11349,11148],{"class":1650},[79,11351,11041],{"class":85},[79,11353,1338],{"class":106},[79,11355,11356],{"class":89},"\"ClearGlobalCostmap-Subtree\"",[79,11358,11158],{"class":85},[79,11360,1338],{"class":106},[79,11362,11163],{"class":89},[79,11364,11141],{"class":106},[79,11366,11367,11369,11371],{"class":81,"line":1482},[79,11368,11170],{"class":106},[79,11370,11313],{"class":1650},[79,11372,11005],{"class":106},[79,11374,11375,11377,11380,11383,11385,11388],{"class":81,"line":1493},[79,11376,11088],{"class":106},[79,11378,11379],{"class":1650},"Spin",[79,11381,11382],{"class":85}," spin_dist",[79,11384,1338],{"class":106},[79,11386,11387],{"class":89},"\"1.57\"",[79,11389,11141],{"class":106},[79,11391,11392,11394,11397,11400,11402,11405],{"class":81,"line":1504},[79,11393,11088],{"class":106},[79,11395,11396],{"class":1650},"Wait",[79,11398,11399],{"class":85}," wait_duration",[79,11401,1338],{"class":106},[79,11403,11404],{"class":89},"\"5\"",[79,11406,11141],{"class":106},[79,11408,11409,11411,11414,11417,11419,11422,11425,11427,11430],{"class":81,"line":1510},[79,11410,11088],{"class":106},[79,11412,11413],{"class":1650},"BackUp",[79,11415,11416],{"class":85}," backup_dist",[79,11418,1338],{"class":106},[79,11420,11421],{"class":89},"\"0.30\"",[79,11423,11424],{"class":85}," backup_speed",[79,11426,1338],{"class":106},[79,11428,11429],{"class":89},"\"0.05\"",[79,11431,11141],{"class":106},[79,11433,11434,11436,11438],{"class":81,"line":1521},[79,11435,11179],{"class":106},[79,11437,11297],{"class":1650},[79,11439,11005],{"class":106},[79,11441,11442,11444,11446],{"class":81,"line":1527},[79,11443,11261],{"class":106},[79,11445,11272],{"class":1650},[79,11447,11005],{"class":106},[79,11449,11450,11453,11455],{"class":81,"line":1540},[79,11451,11452],{"class":106},"    \u003C\u002F",[79,11454,11030],{"class":1650},[79,11456,11005],{"class":106},[79,11458,11459,11462,11464],{"class":81,"line":1553},[79,11460,11461],{"class":106},"  \u003C\u002F",[79,11463,11013],{"class":1650},[79,11465,11005],{"class":106},[79,11467,11468,11471,11473],{"class":81,"line":1565},[79,11469,11470],{"class":106},"\u003C\u002F",[79,11472,10994],{"class":1650},[79,11474,11005],{"class":106},[20,11476,11477,11478,5196],{},"继续在bts目录下新建一个名为",[76,11479,11480],{},"bt_planner_controller_behavior_poses.xml",[70,11482,11484],{"className":10979,"code":11483,"language":10981,"meta":34,"style":34},"\n\u003Croot main_tree_to_execute=\"MainTree\">\n  \u003CBehaviorTree ID=\"MainTree\">\n    \u003CRecoveryNode number_of_retries=\"6\" name=\"NavigateRecovery\">\n      \u003CPipelineSequence name=\"NavigateWithReplanning\">\n        \u003CRateController hz=\"0.333\">\n          \u003CRecoveryNode number_of_retries=\"1\" name=\"ComputePathThroughPoses\">\n            \u003CReactiveSequence>\n              \u003CRemovePassedGoals input_goals=\"{goals}\" output_goals=\"{goals}\" radius=\"0.7\"\u002F>\n              \u003CComputePathThroughPoses goals=\"{goals}\" path=\"{path}\" planner_id=\"GridBased\"\u002F>\n            \u003C\u002FReactiveSequence>\n            \u003CClearEntireCostmap name=\"ClearGlobalCostmap-Context\" service_name=\"global_costmap\u002Fclear_entirely_global_costmap\"\u002F>\n          \u003C\u002FRecoveryNode>\n        \u003C\u002FRateController>\n        \u003CRecoveryNode number_of_retries=\"1\" name=\"FollowPath\">\n          \u003CFollowPath path=\"{path}\" controller_id=\"FollowPath\"\u002F>\n          \u003CClearEntireCostmap name=\"ClearLocalCostmap-Context\" service_name=\"local_costmap\u002Fclear_entirely_local_costmap\"\u002F>\n        \u003C\u002FRecoveryNode>\n      \u003C\u002FPipelineSequence>\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\"\u002F>\n          \u003CWait wait_duration=\"5\"\u002F>\n          \u003CBackUp backup_dist=\"0.30\" backup_speed=\"0.05\"\u002F>\n        \u003C\u002FRoundRobin>\n      \u003C\u002FReactiveFallback>\n    \u003C\u002FRecoveryNode>\n  \u003C\u002FBehaviorTree>\n\u003C\u002Froot>\n",[76,11485,11486,11490,11504,11518,11538,11552,11567,11588,11597,11630,11658,11667,11687,11695,11703,11723,11743,11763,11771,11779,11793,11801,11815,11829,11849,11869,11877,11891,11905,11925,11933,11941,11949,11957],{"__ignoreMap":34},[79,11487,11488],{"class":81,"line":82},[79,11489,142],{"emptyLinePlaceholder":141},[79,11491,11492,11494,11496,11498,11500,11502],{"class":81,"line":116},[79,11493,100],{"class":106},[79,11495,10994],{"class":1650},[79,11497,10997],{"class":85},[79,11499,1338],{"class":106},[79,11501,11002],{"class":89},[79,11503,11005],{"class":106},[79,11505,11506,11508,11510,11512,11514,11516],{"class":81,"line":138},[79,11507,11010],{"class":106},[79,11509,11013],{"class":1650},[79,11511,11016],{"class":85},[79,11513,1338],{"class":106},[79,11515,11002],{"class":89},[79,11517,11005],{"class":106},[79,11519,11520,11522,11524,11526,11528,11530,11532,11534,11536],{"class":81,"line":145},[79,11521,11027],{"class":106},[79,11523,11030],{"class":1650},[79,11525,11033],{"class":85},[79,11527,1338],{"class":106},[79,11529,11038],{"class":89},[79,11531,11041],{"class":85},[79,11533,1338],{"class":106},[79,11535,11046],{"class":89},[79,11537,11005],{"class":106},[79,11539,11540,11542,11544,11546,11548,11550],{"class":81,"line":152},[79,11541,11053],{"class":106},[79,11543,11056],{"class":1650},[79,11545,11041],{"class":85},[79,11547,1338],{"class":106},[79,11549,11063],{"class":89},[79,11551,11005],{"class":106},[79,11553,11554,11556,11558,11560,11562,11565],{"class":81,"line":164},[79,11555,11070],{"class":106},[79,11557,11073],{"class":1650},[79,11559,11076],{"class":85},[79,11561,1338],{"class":106},[79,11563,11564],{"class":89},"\"0.333\"",[79,11566,11005],{"class":106},[79,11568,11569,11571,11573,11575,11577,11579,11581,11583,11586],{"class":81,"line":176},[79,11570,11088],{"class":106},[79,11572,11030],{"class":1650},[79,11574,11033],{"class":85},[79,11576,1338],{"class":106},[79,11578,11097],{"class":89},[79,11580,11041],{"class":85},[79,11582,1338],{"class":106},[79,11584,11585],{"class":89},"\"ComputePathThroughPoses\"",[79,11587,11005],{"class":106},[79,11589,11590,11592,11595],{"class":81,"line":181},[79,11591,11111],{"class":106},[79,11593,11594],{"class":1650},"ReactiveSequence",[79,11596,11005],{"class":106},[79,11598,11599,11602,11605,11608,11610,11613,11616,11618,11620,11623,11625,11628],{"class":81,"line":187},[79,11600,11601],{"class":106},"              \u003C",[79,11603,11604],{"class":1650},"RemovePassedGoals",[79,11606,11607],{"class":85}," input_goals",[79,11609,1338],{"class":106},[79,11611,11612],{"class":89},"\"{goals}\"",[79,11614,11615],{"class":85}," output_goals",[79,11617,1338],{"class":106},[79,11619,11612],{"class":89},[79,11621,11622],{"class":85}," radius",[79,11624,1338],{"class":106},[79,11626,11627],{"class":89},"\"0.7\"",[79,11629,11141],{"class":106},[79,11631,11632,11634,11637,11640,11642,11644,11646,11648,11650,11652,11654,11656],{"class":81,"line":199},[79,11633,11601],{"class":106},[79,11635,11636],{"class":1650},"ComputePathThroughPoses",[79,11638,11639],{"class":85}," goals",[79,11641,1338],{"class":106},[79,11643,11612],{"class":89},[79,11645,11125],{"class":85},[79,11647,1338],{"class":106},[79,11649,11130],{"class":89},[79,11651,11133],{"class":85},[79,11653,1338],{"class":106},[79,11655,11138],{"class":89},[79,11657,11141],{"class":106},[79,11659,11660,11663,11665],{"class":81,"line":1350},[79,11661,11662],{"class":106},"            \u003C\u002F",[79,11664,11594],{"class":1650},[79,11666,11005],{"class":106},[79,11668,11669,11671,11673,11675,11677,11679,11681,11683,11685],{"class":81,"line":1365},[79,11670,11111],{"class":106},[79,11672,11148],{"class":1650},[79,11674,11041],{"class":85},[79,11676,1338],{"class":106},[79,11678,11155],{"class":89},[79,11680,11158],{"class":85},[79,11682,1338],{"class":106},[79,11684,11163],{"class":89},[79,11686,11141],{"class":106},[79,11688,11689,11691,11693],{"class":81,"line":1370},[79,11690,11170],{"class":106},[79,11692,11030],{"class":1650},[79,11694,11005],{"class":106},[79,11696,11697,11699,11701],{"class":81,"line":1381},[79,11698,11179],{"class":106},[79,11700,11073],{"class":1650},[79,11702,11005],{"class":106},[79,11704,11705,11707,11709,11711,11713,11715,11717,11719,11721],{"class":81,"line":1390},[79,11706,11070],{"class":106},[79,11708,11030],{"class":1650},[79,11710,11033],{"class":85},[79,11712,1338],{"class":106},[79,11714,11097],{"class":89},[79,11716,11041],{"class":85},[79,11718,1338],{"class":106},[79,11720,11202],{"class":89},[79,11722,11005],{"class":106},[79,11724,11725,11727,11729,11731,11733,11735,11737,11739,11741],{"class":81,"line":1404},[79,11726,11088],{"class":106},[79,11728,11211],{"class":1650},[79,11730,11125],{"class":85},[79,11732,1338],{"class":106},[79,11734,11130],{"class":89},[79,11736,11220],{"class":85},[79,11738,1338],{"class":106},[79,11740,11202],{"class":89},[79,11742,11141],{"class":106},[79,11744,11745,11747,11749,11751,11753,11755,11757,11759,11761],{"class":81,"line":1417},[79,11746,11088],{"class":106},[79,11748,11148],{"class":1650},[79,11750,11041],{"class":85},[79,11752,1338],{"class":106},[79,11754,11239],{"class":89},[79,11756,11158],{"class":85},[79,11758,1338],{"class":106},[79,11760,11246],{"class":89},[79,11762,11141],{"class":106},[79,11764,11765,11767,11769],{"class":81,"line":1427},[79,11766,11179],{"class":106},[79,11768,11030],{"class":1650},[79,11770,11005],{"class":106},[79,11772,11773,11775,11777],{"class":81,"line":1435},[79,11774,11261],{"class":106},[79,11776,11056],{"class":1650},[79,11778,11005],{"class":106},[79,11780,11781,11783,11785,11787,11789,11791],{"class":81,"line":1451},[79,11782,11053],{"class":106},[79,11784,11272],{"class":1650},[79,11786,11041],{"class":85},[79,11788,1338],{"class":106},[79,11790,11279],{"class":89},[79,11792,11005],{"class":106},[79,11794,11795,11797,11799],{"class":81,"line":1465},[79,11796,11070],{"class":106},[79,11798,11288],{"class":1650},[79,11800,11141],{"class":106},[79,11802,11803,11805,11807,11809,11811,11813],{"class":81,"line":1477},[79,11804,11070],{"class":106},[79,11806,11297],{"class":1650},[79,11808,11041],{"class":85},[79,11810,1338],{"class":106},[79,11812,11304],{"class":89},[79,11814,11005],{"class":106},[79,11816,11817,11819,11821,11823,11825,11827],{"class":81,"line":1482},[79,11818,11088],{"class":106},[79,11820,11313],{"class":1650},[79,11822,11041],{"class":85},[79,11824,1338],{"class":106},[79,11826,11320],{"class":89},[79,11828,11005],{"class":106},[79,11830,11831,11833,11835,11837,11839,11841,11843,11845,11847],{"class":81,"line":1493},[79,11832,11111],{"class":106},[79,11834,11148],{"class":1650},[79,11836,11041],{"class":85},[79,11838,1338],{"class":106},[79,11840,11335],{"class":89},[79,11842,11158],{"class":85},[79,11844,1338],{"class":106},[79,11846,11246],{"class":89},[79,11848,11141],{"class":106},[79,11850,11851,11853,11855,11857,11859,11861,11863,11865,11867],{"class":81,"line":1504},[79,11852,11111],{"class":106},[79,11854,11148],{"class":1650},[79,11856,11041],{"class":85},[79,11858,1338],{"class":106},[79,11860,11356],{"class":89},[79,11862,11158],{"class":85},[79,11864,1338],{"class":106},[79,11866,11163],{"class":89},[79,11868,11141],{"class":106},[79,11870,11871,11873,11875],{"class":81,"line":1510},[79,11872,11170],{"class":106},[79,11874,11313],{"class":1650},[79,11876,11005],{"class":106},[79,11878,11879,11881,11883,11885,11887,11889],{"class":81,"line":1521},[79,11880,11088],{"class":106},[79,11882,11379],{"class":1650},[79,11884,11382],{"class":85},[79,11886,1338],{"class":106},[79,11888,11387],{"class":89},[79,11890,11141],{"class":106},[79,11892,11893,11895,11897,11899,11901,11903],{"class":81,"line":1527},[79,11894,11088],{"class":106},[79,11896,11396],{"class":1650},[79,11898,11399],{"class":85},[79,11900,1338],{"class":106},[79,11902,11404],{"class":89},[79,11904,11141],{"class":106},[79,11906,11907,11909,11911,11913,11915,11917,11919,11921,11923],{"class":81,"line":1540},[79,11908,11088],{"class":106},[79,11910,11413],{"class":1650},[79,11912,11416],{"class":85},[79,11914,1338],{"class":106},[79,11916,11421],{"class":89},[79,11918,11424],{"class":85},[79,11920,1338],{"class":106},[79,11922,11429],{"class":89},[79,11924,11141],{"class":106},[79,11926,11927,11929,11931],{"class":81,"line":1553},[79,11928,11179],{"class":106},[79,11930,11297],{"class":1650},[79,11932,11005],{"class":106},[79,11934,11935,11937,11939],{"class":81,"line":1565},[79,11936,11261],{"class":106},[79,11938,11272],{"class":1650},[79,11940,11005],{"class":106},[79,11942,11943,11945,11947],{"class":81,"line":1578},[79,11944,11452],{"class":106},[79,11946,11030],{"class":1650},[79,11948,11005],{"class":106},[79,11950,11951,11953,11955],{"class":81,"line":1583},[79,11952,11461],{"class":106},[79,11954,11013],{"class":1650},[79,11956,11005],{"class":106},[79,11958,11959,11961,11963],{"class":81,"line":1594},[79,11960,11470],{"class":106},[79,11962,10994],{"class":1650},[79,11964,11005],{"class":106},[20,11966,11967,11968,5196],{},"在params目录下新建一个名为",[76,11969,11970],{},"bt.yaml",[70,11972,11974],{"className":1641,"code":11973,"language":1643,"meta":34,"style":34},"\u002F**:\n  ros__parameters:\n    use_sim_time: True\n    global_frame: map\n    robot_base_frame: base_link\n    odom_topic: \u002Fodom\n    default_bt_xml_filename: \"navigate_w_replanning_and_recovery.xml\"\n    bt_loop_duration: 10\n    default_server_timeout: 20\n    enable_groot_monitoring: True\n    groot_zmq_publisher_port: 1666\n    groot_zmq_server_port: 1667\n    plugin_lib_names:\n    - nav2_compute_path_to_pose_action_bt_node\n    - nav2_compute_path_through_poses_action_bt_node\n    - nav2_follow_path_action_bt_node\n    - nav2_back_up_action_bt_node\n    - nav2_spin_action_bt_node\n    - nav2_wait_action_bt_node\n    - nav2_clear_costmap_service_bt_node\n    - nav2_is_stuck_condition_bt_node\n    - nav2_goal_reached_condition_bt_node\n    - nav2_goal_updated_condition_bt_node\n    - nav2_initial_pose_received_condition_bt_node\n    - nav2_reinitialize_global_localization_service_bt_node\n    - nav2_rate_controller_bt_node\n    - nav2_distance_controller_bt_node\n    - nav2_speed_controller_bt_node\n    - nav2_truncate_path_action_bt_node\n    - nav2_goal_updater_node_bt_node\n    - nav2_recovery_node_bt_node\n    - nav2_pipeline_sequence_bt_node\n    - nav2_round_robin_node_bt_node\n    - nav2_transform_available_condition_bt_node\n    - nav2_time_expired_condition_bt_node\n    - nav2_distance_traveled_condition_bt_node\n    - nav2_single_trigger_bt_node\n    - nav2_is_battery_low_condition_bt_node\n    - nav2_navigate_through_poses_action_bt_node\n    - nav2_navigate_to_pose_action_bt_node\n    - nav2_remove_passed_goals_action_bt_node\n    - nav2_planner_selector_bt_node\n    - nav2_controller_selector_bt_node\n    - nav2_goal_checker_selector_bt_node\n",[76,11975,11976,11982,11988,11996,12005,12014,12024,12034,12044,12054,12063,12073,12083,12090,12098,12105,12112,12119,12126,12133,12140,12147,12154,12161,12168,12175,12182,12189,12196,12203,12210,12217,12224,12231,12238,12245,12252,12259,12266,12273,12280,12287,12294,12301],{"__ignoreMap":34},[79,11977,11978,11980],{"class":81,"line":82},[79,11979,6528],{"class":1650},[79,11981,1653],{"class":106},[79,11983,11984,11986],{"class":81,"line":116},[79,11985,1658],{"class":1650},[79,11987,1653],{"class":106},[79,11989,11990,11992,11994],{"class":81,"line":138},[79,11991,6541],{"class":1650},[79,11993,1668],{"class":106},[79,11995,9783],{"class":1219},[79,11997,11998,12001,12003],{"class":81,"line":145},[79,11999,12000],{"class":1650},"    global_frame",[79,12002,1668],{"class":106},[79,12004,1745],{"class":89},[79,12006,12007,12010,12012],{"class":81,"line":152},[79,12008,12009],{"class":1650},"    robot_base_frame",[79,12011,1668],{"class":106},[79,12013,1755],{"class":89},[79,12015,12016,12019,12021],{"class":81,"line":164},[79,12017,12018],{"class":1650},"    odom_topic",[79,12020,1668],{"class":106},[79,12022,12023],{"class":89},"\u002Fodom\n",[79,12025,12026,12029,12031],{"class":81,"line":176},[79,12027,12028],{"class":1650},"    default_bt_xml_filename",[79,12030,1668],{"class":106},[79,12032,12033],{"class":89},"\"navigate_w_replanning_and_recovery.xml\"\n",[79,12035,12036,12039,12041],{"class":81,"line":181},[79,12037,12038],{"class":1650},"    bt_loop_duration",[79,12040,1668],{"class":106},[79,12042,12043],{"class":1219},"10\n",[79,12045,12046,12049,12051],{"class":81,"line":187},[79,12047,12048],{"class":1650},"    default_server_timeout",[79,12050,1668],{"class":106},[79,12052,12053],{"class":1219},"20\n",[79,12055,12056,12059,12061],{"class":81,"line":199},[79,12057,12058],{"class":1650},"    enable_groot_monitoring",[79,12060,1668],{"class":106},[79,12062,9783],{"class":1219},[79,12064,12065,12068,12070],{"class":81,"line":1350},[79,12066,12067],{"class":1650},"    groot_zmq_publisher_port",[79,12069,1668],{"class":106},[79,12071,12072],{"class":1219},"1666\n",[79,12074,12075,12078,12080],{"class":81,"line":1365},[79,12076,12077],{"class":1650},"    groot_zmq_server_port",[79,12079,1668],{"class":106},[79,12081,12082],{"class":1219},"1667\n",[79,12084,12085,12088],{"class":81,"line":1370},[79,12086,12087],{"class":1650},"    plugin_lib_names",[79,12089,1653],{"class":106},[79,12091,12092,12095],{"class":81,"line":1381},[79,12093,12094],{"class":106},"    - ",[79,12096,12097],{"class":89},"nav2_compute_path_to_pose_action_bt_node\n",[79,12099,12100,12102],{"class":81,"line":1390},[79,12101,12094],{"class":106},[79,12103,12104],{"class":89},"nav2_compute_path_through_poses_action_bt_node\n",[79,12106,12107,12109],{"class":81,"line":1404},[79,12108,12094],{"class":106},[79,12110,12111],{"class":89},"nav2_follow_path_action_bt_node\n",[79,12113,12114,12116],{"class":81,"line":1417},[79,12115,12094],{"class":106},[79,12117,12118],{"class":89},"nav2_back_up_action_bt_node\n",[79,12120,12121,12123],{"class":81,"line":1427},[79,12122,12094],{"class":106},[79,12124,12125],{"class":89},"nav2_spin_action_bt_node\n",[79,12127,12128,12130],{"class":81,"line":1435},[79,12129,12094],{"class":106},[79,12131,12132],{"class":89},"nav2_wait_action_bt_node\n",[79,12134,12135,12137],{"class":81,"line":1451},[79,12136,12094],{"class":106},[79,12138,12139],{"class":89},"nav2_clear_costmap_service_bt_node\n",[79,12141,12142,12144],{"class":81,"line":1465},[79,12143,12094],{"class":106},[79,12145,12146],{"class":89},"nav2_is_stuck_condition_bt_node\n",[79,12148,12149,12151],{"class":81,"line":1477},[79,12150,12094],{"class":106},[79,12152,12153],{"class":89},"nav2_goal_reached_condition_bt_node\n",[79,12155,12156,12158],{"class":81,"line":1482},[79,12157,12094],{"class":106},[79,12159,12160],{"class":89},"nav2_goal_updated_condition_bt_node\n",[79,12162,12163,12165],{"class":81,"line":1493},[79,12164,12094],{"class":106},[79,12166,12167],{"class":89},"nav2_initial_pose_received_condition_bt_node\n",[79,12169,12170,12172],{"class":81,"line":1504},[79,12171,12094],{"class":106},[79,12173,12174],{"class":89},"nav2_reinitialize_global_localization_service_bt_node\n",[79,12176,12177,12179],{"class":81,"line":1510},[79,12178,12094],{"class":106},[79,12180,12181],{"class":89},"nav2_rate_controller_bt_node\n",[79,12183,12184,12186],{"class":81,"line":1521},[79,12185,12094],{"class":106},[79,12187,12188],{"class":89},"nav2_distance_controller_bt_node\n",[79,12190,12191,12193],{"class":81,"line":1527},[79,12192,12094],{"class":106},[79,12194,12195],{"class":89},"nav2_speed_controller_bt_node\n",[79,12197,12198,12200],{"class":81,"line":1540},[79,12199,12094],{"class":106},[79,12201,12202],{"class":89},"nav2_truncate_path_action_bt_node\n",[79,12204,12205,12207],{"class":81,"line":1553},[79,12206,12094],{"class":106},[79,12208,12209],{"class":89},"nav2_goal_updater_node_bt_node\n",[79,12211,12212,12214],{"class":81,"line":1565},[79,12213,12094],{"class":106},[79,12215,12216],{"class":89},"nav2_recovery_node_bt_node\n",[79,12218,12219,12221],{"class":81,"line":1578},[79,12220,12094],{"class":106},[79,12222,12223],{"class":89},"nav2_pipeline_sequence_bt_node\n",[79,12225,12226,12228],{"class":81,"line":1583},[79,12227,12094],{"class":106},[79,12229,12230],{"class":89},"nav2_round_robin_node_bt_node\n",[79,12232,12233,12235],{"class":81,"line":1594},[79,12234,12094],{"class":106},[79,12236,12237],{"class":89},"nav2_transform_available_condition_bt_node\n",[79,12239,12240,12242],{"class":81,"line":1599},[79,12241,12094],{"class":106},[79,12243,12244],{"class":89},"nav2_time_expired_condition_bt_node\n",[79,12246,12247,12249],{"class":81,"line":1605},[79,12248,12094],{"class":106},[79,12250,12251],{"class":89},"nav2_distance_traveled_condition_bt_node\n",[79,12253,12254,12256],{"class":81,"line":1611},[79,12255,12094],{"class":106},[79,12257,12258],{"class":89},"nav2_single_trigger_bt_node\n",[79,12260,12261,12263],{"class":81,"line":1617},[79,12262,12094],{"class":106},[79,12264,12265],{"class":89},"nav2_is_battery_low_condition_bt_node\n",[79,12267,12268,12270],{"class":81,"line":1622},[79,12269,12094],{"class":106},[79,12271,12272],{"class":89},"nav2_navigate_through_poses_action_bt_node\n",[79,12274,12275,12277],{"class":81,"line":2005},[79,12276,12094],{"class":106},[79,12278,12279],{"class":89},"nav2_navigate_to_pose_action_bt_node\n",[79,12281,12282,12284],{"class":81,"line":2016},[79,12283,12094],{"class":106},[79,12285,12286],{"class":89},"nav2_remove_passed_goals_action_bt_node\n",[79,12288,12289,12291],{"class":81,"line":2029},[79,12290,12094],{"class":106},[79,12292,12293],{"class":89},"nav2_planner_selector_bt_node\n",[79,12295,12296,12298],{"class":81,"line":2043},[79,12297,12094],{"class":106},[79,12299,12300],{"class":89},"nav2_controller_selector_bt_node\n",[79,12302,12303,12305],{"class":81,"line":2056},[79,12304,12094],{"class":106},[79,12306,12307],{"class":89},"nav2_goal_checker_selector_bt_node\n",[20,12309,12310],{},[23,12311,12312],{},"（2）planner_server相关配置文件",[20,12314,11967,12315,5196],{},[76,12316,12317],{},"planner.yaml",[70,12319,12321],{"className":1641,"code":12320,"language":1643,"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\u002FNavfnPlanner\"\n      tolerance: 0.5\n      use_astar: false\n      allow_unknown: true\n\n\u002F**:\n  global_costmap:\n    ros__parameters:\n      update_frequency: 1.0\n      publish_frequency: 1.0\n      global_frame: map\n      robot_base_frame: base_link\n      use_sim_time: True\n\n      # robot_radius: 0.2\n      footprint: \"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n      resolution: 0.05\n      track_unknown_space: true\n      plugins: [\"static_layer\", \"obstacle_layer\", \"voxel_layer\", \"inflation_layer\"]\n      obstacle_layer:\n        plugin: \"nav2_costmap_2d::ObstacleLayer\"\n        enabled: True\n        observation_sources: scan\n        scan:\n          topic: \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,12322,12323,12329,12335,12345,12353,12364,12371,12381,12390,12399,12408,12412,12418,12425,12432,12442,12451,12460,12469,12478,12482,12487,12497,12506,12515,12542,12549,12559,12568,12577,12584,12593,12602,12611,12620,12630,12639,12648,12658,12667,12674,12683,12691,12700,12709,12718,12728,12737,12746,12754,12760,12768,12776,12784,12792,12800,12808,12816,12824,12832,12839,12848,12857,12864,12873,12883,12893],{"__ignoreMap":34},[79,12324,12325,12327],{"class":81,"line":82},[79,12326,6528],{"class":1650},[79,12328,1653],{"class":106},[79,12330,12331,12333],{"class":81,"line":116},[79,12332,1658],{"class":1650},[79,12334,1653],{"class":106},[79,12336,12337,12340,12342],{"class":81,"line":138},[79,12338,12339],{"class":1650},"    expected_planner_frequency",[79,12341,1668],{"class":106},[79,12343,12344],{"class":1219},"20.0\n",[79,12346,12347,12349,12351],{"class":81,"line":145},[79,12348,6541],{"class":1650},[79,12350,1668],{"class":106},[79,12352,9783],{"class":1219},[79,12354,12355,12358,12360,12362],{"class":81,"line":152},[79,12356,12357],{"class":1650},"    planner_plugins",[79,12359,4858],{"class":106},[79,12361,11138],{"class":89},[79,12363,4874],{"class":106},[79,12365,12366,12369],{"class":81,"line":164},[79,12367,12368],{"class":1650},"    GridBased",[79,12370,1653],{"class":106},[79,12372,12373,12376,12378],{"class":81,"line":176},[79,12374,12375],{"class":1650},"      plugin",[79,12377,1668],{"class":106},[79,12379,12380],{"class":89},"\"nav2_navfn_planner\u002FNavfnPlanner\"\n",[79,12382,12383,12386,12388],{"class":81,"line":181},[79,12384,12385],{"class":1650},"      tolerance",[79,12387,1668],{"class":106},[79,12389,1876],{"class":1219},[79,12391,12392,12395,12397],{"class":81,"line":187},[79,12393,12394],{"class":1650},"      use_astar",[79,12396,1668],{"class":106},[79,12398,1811],{"class":1219},[79,12400,12401,12404,12406],{"class":81,"line":199},[79,12402,12403],{"class":1650},"      allow_unknown",[79,12405,1668],{"class":106},[79,12407,1918],{"class":1219},[79,12409,12410],{"class":81,"line":1350},[79,12411,142],{"emptyLinePlaceholder":141},[79,12413,12414,12416],{"class":81,"line":1365},[79,12415,6528],{"class":1650},[79,12417,1653],{"class":106},[79,12419,12420,12423],{"class":81,"line":1370},[79,12421,12422],{"class":1650},"  global_costmap",[79,12424,1653],{"class":106},[79,12426,12427,12430],{"class":81,"line":1381},[79,12428,12429],{"class":1650},"    ros__parameters",[79,12431,1653],{"class":106},[79,12433,12434,12437,12439],{"class":81,"line":1390},[79,12435,12436],{"class":1650},"      update_frequency",[79,12438,1668],{"class":106},[79,12440,12441],{"class":1219},"1.0\n",[79,12443,12444,12447,12449],{"class":81,"line":1404},[79,12445,12446],{"class":1650},"      publish_frequency",[79,12448,1668],{"class":106},[79,12450,12441],{"class":1219},[79,12452,12453,12456,12458],{"class":81,"line":1417},[79,12454,12455],{"class":1650},"      global_frame",[79,12457,1668],{"class":106},[79,12459,1745],{"class":89},[79,12461,12462,12465,12467],{"class":81,"line":1427},[79,12463,12464],{"class":1650},"      robot_base_frame",[79,12466,1668],{"class":106},[79,12468,1755],{"class":89},[79,12470,12471,12474,12476],{"class":81,"line":1435},[79,12472,12473],{"class":1650},"      use_sim_time",[79,12475,1668],{"class":106},[79,12477,9783],{"class":1219},[79,12479,12480],{"class":81,"line":1451},[79,12481,142],{"emptyLinePlaceholder":141},[79,12483,12484],{"class":81,"line":1465},[79,12485,12486],{"class":148},"      # robot_radius: 0.2\n",[79,12488,12489,12492,12494],{"class":81,"line":1477},[79,12490,12491],{"class":1650},"      footprint",[79,12493,1668],{"class":106},[79,12495,12496],{"class":89},"\"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n",[79,12498,12499,12502,12504],{"class":81,"line":1482},[79,12500,12501],{"class":1650},"      resolution",[79,12503,1668],{"class":106},[79,12505,1854],{"class":1219},[79,12507,12508,12511,12513],{"class":81,"line":1493},[79,12509,12510],{"class":1650},"      track_unknown_space",[79,12512,1668],{"class":106},[79,12514,1918],{"class":1219},[79,12516,12517,12520,12522,12525,12527,12530,12532,12535,12537,12540],{"class":81,"line":1504},[79,12518,12519],{"class":1650},"      plugins",[79,12521,4858],{"class":106},[79,12523,12524],{"class":89},"\"static_layer\"",[79,12526,1457],{"class":106},[79,12528,12529],{"class":89},"\"obstacle_layer\"",[79,12531,1457],{"class":106},[79,12533,12534],{"class":89},"\"voxel_layer\"",[79,12536,1457],{"class":106},[79,12538,12539],{"class":89},"\"inflation_layer\"",[79,12541,4874],{"class":106},[79,12543,12544,12547],{"class":81,"line":1510},[79,12545,12546],{"class":1650},"      obstacle_layer",[79,12548,1653],{"class":106},[79,12550,12551,12554,12556],{"class":81,"line":1521},[79,12552,12553],{"class":1650},"        plugin",[79,12555,1668],{"class":106},[79,12557,12558],{"class":89},"\"nav2_costmap_2d::ObstacleLayer\"\n",[79,12560,12561,12564,12566],{"class":81,"line":1527},[79,12562,12563],{"class":1650},"        enabled",[79,12565,1668],{"class":106},[79,12567,9783],{"class":1219},[79,12569,12570,12573,12575],{"class":81,"line":1540},[79,12571,12572],{"class":1650},"        observation_sources",[79,12574,1668],{"class":106},[79,12576,6894],{"class":89},[79,12578,12579,12582],{"class":81,"line":1553},[79,12580,12581],{"class":1650},"        scan",[79,12583,1653],{"class":106},[79,12585,12586,12589,12591],{"class":81,"line":1565},[79,12587,12588],{"class":1650},"          topic",[79,12590,1668],{"class":106},[79,12592,1765],{"class":89},[79,12594,12595,12598,12600],{"class":81,"line":1578},[79,12596,12597],{"class":1650},"          max_obstacle_height",[79,12599,1668],{"class":106},[79,12601,1844],{"class":1219},[79,12603,12604,12607,12609],{"class":81,"line":1583},[79,12605,12606],{"class":1650},"          clearing",[79,12608,1668],{"class":106},[79,12610,9783],{"class":1219},[79,12612,12613,12616,12618],{"class":81,"line":1594},[79,12614,12615],{"class":1650},"          marking",[79,12617,1668],{"class":106},[79,12619,9783],{"class":1219},[79,12621,12622,12625,12627],{"class":81,"line":1599},[79,12623,12624],{"class":1650},"          data_type",[79,12626,1668],{"class":106},[79,12628,12629],{"class":89},"\"LaserScan\"\n",[79,12631,12632,12635,12637],{"class":81,"line":1605},[79,12633,12634],{"class":1650},"          raytrace_max_range",[79,12636,1668],{"class":106},[79,12638,2013],{"class":1219},[79,12640,12641,12644,12646],{"class":81,"line":1611},[79,12642,12643],{"class":1650},"          raytrace_min_range",[79,12645,1668],{"class":106},[79,12647,6767],{"class":1219},[79,12649,12650,12653,12655],{"class":81,"line":1617},[79,12651,12652],{"class":1650},"          obstacle_max_range",[79,12654,1668],{"class":106},[79,12656,12657],{"class":1219},"2.5\n",[79,12659,12660,12663,12665],{"class":81,"line":1622},[79,12661,12662],{"class":1650},"          obstacle_min_range",[79,12664,1668],{"class":106},[79,12666,6767],{"class":1219},[79,12668,12669,12672],{"class":81,"line":2005},[79,12670,12671],{"class":1650},"      voxel_layer",[79,12673,1653],{"class":106},[79,12675,12676,12678,12680],{"class":81,"line":2016},[79,12677,12553],{"class":1650},[79,12679,1668],{"class":106},[79,12681,12682],{"class":89},"\"nav2_costmap_2d::VoxelLayer\"\n",[79,12684,12685,12687,12689],{"class":81,"line":2029},[79,12686,12563],{"class":1650},[79,12688,1668],{"class":106},[79,12690,9783],{"class":1219},[79,12692,12693,12696,12698],{"class":81,"line":2043},[79,12694,12695],{"class":1650},"        publish_voxel_map",[79,12697,1668],{"class":106},[79,12699,9783],{"class":1219},[79,12701,12702,12705,12707],{"class":81,"line":2056},[79,12703,12704],{"class":1650},"        origin_z",[79,12706,1668],{"class":106},[79,12708,6767],{"class":1219},[79,12710,12711,12714,12716],{"class":81,"line":2070},[79,12712,12713],{"class":1650},"        z_resolution",[79,12715,1668],{"class":106},[79,12717,1854],{"class":1219},[79,12719,12720,12723,12725],{"class":81,"line":2081},[79,12721,12722],{"class":1650},"        z_voxels",[79,12724,1668],{"class":106},[79,12726,12727],{"class":1219},"16\n",[79,12729,12730,12733,12735],{"class":81,"line":2086},[79,12731,12732],{"class":1650},"        max_obstacle_height",[79,12734,1668],{"class":106},[79,12736,1844],{"class":1219},[79,12738,12739,12742,12744],{"class":81,"line":2096},[79,12740,12741],{"class":1650},"        mark_threshold",[79,12743,1668],{"class":106},[79,12745,4884],{"class":1219},[79,12747,12748,12750,12752],{"class":81,"line":2107},[79,12749,12572],{"class":1650},[79,12751,1668],{"class":106},[79,12753,6894],{"class":89},[79,12755,12756,12758],{"class":81,"line":2119},[79,12757,12581],{"class":1650},[79,12759,1653],{"class":106},[79,12761,12762,12764,12766],{"class":81,"line":2124},[79,12763,12588],{"class":1650},[79,12765,1668],{"class":106},[79,12767,1765],{"class":89},[79,12769,12770,12772,12774],{"class":81,"line":2135},[79,12771,12597],{"class":1650},[79,12773,1668],{"class":106},[79,12775,1844],{"class":1219},[79,12777,12778,12780,12782],{"class":81,"line":2145},[79,12779,12606],{"class":1650},[79,12781,1668],{"class":106},[79,12783,9783],{"class":1219},[79,12785,12786,12788,12790],{"class":81,"line":2156},[79,12787,12615],{"class":1650},[79,12789,1668],{"class":106},[79,12791,9783],{"class":1219},[79,12793,12794,12796,12798],{"class":81,"line":2161},[79,12795,12624],{"class":1650},[79,12797,1668],{"class":106},[79,12799,12629],{"class":89},[79,12801,12802,12804,12806],{"class":81,"line":2175},[79,12803,12634],{"class":1650},[79,12805,1668],{"class":106},[79,12807,2013],{"class":1219},[79,12809,12810,12812,12814],{"class":81,"line":2188},[79,12811,12643],{"class":1650},[79,12813,1668],{"class":106},[79,12815,6767],{"class":1219},[79,12817,12818,12820,12822],{"class":81,"line":2193},[79,12819,12652],{"class":1650},[79,12821,1668],{"class":106},[79,12823,12657],{"class":1219},[79,12825,12826,12828,12830],{"class":81,"line":2207},[79,12827,12662],{"class":1650},[79,12829,1668],{"class":106},[79,12831,6767],{"class":1219},[79,12833,12834,12837],{"class":81,"line":2221},[79,12835,12836],{"class":1650},"      static_layer",[79,12838,1653],{"class":106},[79,12840,12841,12843,12845],{"class":81,"line":2235},[79,12842,12553],{"class":1650},[79,12844,1668],{"class":106},[79,12846,12847],{"class":89},"\"nav2_costmap_2d::StaticLayer\"\n",[79,12849,12850,12853,12855],{"class":81,"line":2246},[79,12851,12852],{"class":1650},"        map_subscribe_transient_local",[79,12854,1668],{"class":106},[79,12856,9783],{"class":1219},[79,12858,12859,12862],{"class":81,"line":2256},[79,12860,12861],{"class":1650},"      inflation_layer",[79,12863,1653],{"class":106},[79,12865,12866,12868,12870],{"class":81,"line":6478},[79,12867,12553],{"class":1650},[79,12869,1668],{"class":106},[79,12871,12872],{"class":89},"\"nav2_costmap_2d::InflationLayer\"\n",[79,12874,12875,12878,12880],{"class":81,"line":6484},[79,12876,12877],{"class":1650},"        cost_scaling_factor",[79,12879,1668],{"class":106},[79,12881,12882],{"class":1219},"4.0\n",[79,12884,12885,12888,12890],{"class":81,"line":6490},[79,12886,12887],{"class":1650},"        inflation_radius",[79,12889,1668],{"class":106},[79,12891,12892],{"class":1219},"0.55\n",[79,12894,12895,12898,12900],{"class":81,"line":9976},[79,12896,12897],{"class":1650},"      always_send_full_costmap",[79,12899,1668],{"class":106},[79,12901,12902],{"class":1219},"False\n",[20,12904,12905],{},[23,12906,12907],{},"（3）controller_server相关配置文件",[20,12909,11967,12910,5196],{},[76,12911,12912],{},"controller.yaml",[70,12914,12916],{"className":1641,"code":12915,"language":1643,"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\n    # failure_tolerance: 0.3\n    failure_tolerance: 1.0\n    progress_checker_plugin: \"progress_checker\"\n    goal_checker_plugins: [\"general_goal_checker\"] \n    controller_plugins: [\"FollowPath\"]\n\n    # Progress checker parameters\n    progress_checker:\n      plugin: \"nav2_controller::SimpleProgressChecker\"\n      required_movement_radius: 0.5\n      movement_time_allowance: 10.0\n\n    general_goal_checker:\n      stateful: True\n      plugin: \"nav2_controller::SimpleGoalChecker\"\n      xy_goal_tolerance: 0.25\n      yaw_goal_tolerance: 0.25\n\n    # DWB parameters\n    FollowPath:\n      plugin: \"dwb_core::DWBLocalPlanner\"\n      debug_trajectory_details: True\n      min_vel_x: 0.0\n      min_vel_y: 0.0\n\n      # max_vel_x: 0.15\n      max_vel_x: 0.2\n      max_vel_y: 0.0\n\n      # max_vel_theta: 1.0\n      max_vel_theta: 1.0\n      min_speed_xy: 0.0\n      max_speed_xy: 0.2\n      min_speed_theta: 0.0\n\n      # Add high threshold velocity for turtlebot 3 issue.\n\n      # https:\u002F\u002Fgithub.com\u002FROBOTIS-GIT\u002Fturtlebot3_simulations\u002Fissues\u002F75\n      acc_lim_x: 1.0\n      acc_lim_y: 0.0\n      acc_lim_theta: 3.2\n      decel_lim_x: -1.0\n      decel_lim_y: 0.0\n      decel_lim_theta: -3.2\n\n      # vx_samples: 20\n      vx_samples: 20\n      vy_samples: 5\n      vtheta_samples: 20\n      sim_time: 1.7\n      linear_granularity: 0.05\n      angular_granularity: 0.025\n\n      # transform_tolerance: 0.2\n      transform_tolerance: 1.0\n      xy_goal_tolerance: 0.15\n      trans_stopped_velocity: 0.25\n      short_circuit_trajectory_evaluation: True\n      stateful: True\n      critics: [\"RotateToGoal\", \"Oscillation\", \"BaseObstacle\", \"GoalAlign\", \"PathAlign\", \"PathDist\", \"GoalDist\"]\n      BaseObstacle.scale: 0.02\n      PathAlign.scale: 32.0\n      PathAlign.forward_point_distance: 0.1\n      GoalAlign.scale: 24.0\n      GoalAlign.forward_point_distance: 0.1\n      PathDist.scale: 32.0\n      GoalDist.scale: 24.0\n      RotateToGoal.scale: 32.0\n      RotateToGoal.slowing_factor: 5.0\n      RotateToGoal.lookahead_time: -1.0\n\u002F**:\n  local_costmap:\n    ros__parameters:\n      update_frequency: 5.0\n      publish_frequency: 2.0\n      global_frame: odom\n      robot_base_frame: base_link\n      use_sim_time: True\n      rolling_window: True\n      width: 2\n      height: 2\n      resolution: 0.05\n\n      # robot_radius: 0.20\n      footprint: \"[[0.19, 0.13], [0.19, -0.13], [-0.19, -0.13], [-0.19, 0.13]]\"\n      plugins: [\"obstacle_layer\", \"voxel_layer\", \"inflation_layer\"]\n      inflation_layer:\n        plugin: \"nav2_costmap_2d::InflationLayer\"\n        inflation_radius: 0.5\n        cost_scaling_factor: 4.0\n      obstacle_layer:\n        plugin: \"nav2_costmap_2d::ObstacleLayer\"\n        enabled: True\n        observation_sources: scan\n        scan:\n          topic: \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,12917,12918,12924,12930,12938,12947,12957,12966,12975,12979,12984,12993,13003,13016,13027,13031,13036,13043,13052,13061,13070,13074,13081,13090,13099,13108,13117,13121,13126,13133,13142,13151,13160,13169,13173,13178,13187,13196,13200,13205,13214,13223,13232,13241,13245,13250,13254,13259,13268,13277,13287,13296,13305,13315,13319,13324,13333,13343,13352,13362,13371,13381,13385,13390,13399,13408,13417,13426,13434,13476,13486,13496,13505,13515,13524,13533,13542,13551,13561,13570,13576,13583,13589,13597,13605,13613,13621,13629,13638,13648,13657,13665,13669,13674,13682,13700,13706,13714,13722,13730,13736,13744,13752,13760,13766,13774,13782,13790,13798,13806,13812,13820,13828,13836,13844,13852,13860,13868,13876,13884,13890,13898,13906,13914,13922,13930,13938,13946,13954,13962,13968,13976],{"__ignoreMap":34},[79,12919,12920,12922],{"class":81,"line":82},[79,12921,6528],{"class":1650},[79,12923,1653],{"class":106},[79,12925,12926,12928],{"class":81,"line":116},[79,12927,1658],{"class":1650},[79,12929,1653],{"class":106},[79,12931,12932,12934,12936],{"class":81,"line":138},[79,12933,6541],{"class":1650},[79,12935,1668],{"class":106},[79,12937,9783],{"class":1219},[79,12939,12940,12943,12945],{"class":81,"line":145},[79,12941,12942],{"class":1650},"    controller_frequency",[79,12944,1668],{"class":106},[79,12946,1979],{"class":1219},[79,12948,12949,12952,12954],{"class":81,"line":152},[79,12950,12951],{"class":1650},"    min_x_velocity_threshold",[79,12953,1668],{"class":106},[79,12955,12956],{"class":1219},"0.001\n",[79,12958,12959,12962,12964],{"class":81,"line":164},[79,12960,12961],{"class":1650},"    min_y_velocity_threshold",[79,12963,1668],{"class":106},[79,12965,1876],{"class":1219},[79,12967,12968,12971,12973],{"class":81,"line":176},[79,12969,12970],{"class":1650},"    min_theta_velocity_threshold",[79,12972,1668],{"class":106},[79,12974,12956],{"class":1219},[79,12976,12977],{"class":81,"line":181},[79,12978,142],{"emptyLinePlaceholder":141},[79,12980,12981],{"class":81,"line":187},[79,12982,12983],{"class":148},"    # failure_tolerance: 0.3\n",[79,12985,12986,12989,12991],{"class":81,"line":199},[79,12987,12988],{"class":1650},"    failure_tolerance",[79,12990,1668],{"class":106},[79,12992,12441],{"class":1219},[79,12994,12995,12998,13000],{"class":81,"line":1350},[79,12996,12997],{"class":1650},"    progress_checker_plugin",[79,12999,1668],{"class":106},[79,13001,13002],{"class":89},"\"progress_checker\"\n",[79,13004,13005,13008,13010,13013],{"class":81,"line":1365},[79,13006,13007],{"class":1650},"    goal_checker_plugins",[79,13009,4858],{"class":106},[79,13011,13012],{"class":89},"\"general_goal_checker\"",[79,13014,13015],{"class":106},"] \n",[79,13017,13018,13021,13023,13025],{"class":81,"line":1370},[79,13019,13020],{"class":1650},"    controller_plugins",[79,13022,4858],{"class":106},[79,13024,11202],{"class":89},[79,13026,4874],{"class":106},[79,13028,13029],{"class":81,"line":1381},[79,13030,142],{"emptyLinePlaceholder":141},[79,13032,13033],{"class":81,"line":1390},[79,13034,13035],{"class":148},"    # Progress checker parameters\n",[79,13037,13038,13041],{"class":81,"line":1404},[79,13039,13040],{"class":1650},"    progress_checker",[79,13042,1653],{"class":106},[79,13044,13045,13047,13049],{"class":81,"line":1417},[79,13046,12375],{"class":1650},[79,13048,1668],{"class":106},[79,13050,13051],{"class":89},"\"nav2_controller::SimpleProgressChecker\"\n",[79,13053,13054,13057,13059],{"class":81,"line":1427},[79,13055,13056],{"class":1650},"      required_movement_radius",[79,13058,1668],{"class":106},[79,13060,1876],{"class":1219},[79,13062,13063,13066,13068],{"class":81,"line":1435},[79,13064,13065],{"class":1650},"      movement_time_allowance",[79,13067,1668],{"class":106},[79,13069,1979],{"class":1219},[79,13071,13072],{"class":81,"line":1451},[79,13073,142],{"emptyLinePlaceholder":141},[79,13075,13076,13079],{"class":81,"line":1465},[79,13077,13078],{"class":1650},"    general_goal_checker",[79,13080,1653],{"class":106},[79,13082,13083,13086,13088],{"class":81,"line":1477},[79,13084,13085],{"class":1650},"      stateful",[79,13087,1668],{"class":106},[79,13089,9783],{"class":1219},[79,13091,13092,13094,13096],{"class":81,"line":1482},[79,13093,12375],{"class":1650},[79,13095,1668],{"class":106},[79,13097,13098],{"class":89},"\"nav2_controller::SimpleGoalChecker\"\n",[79,13100,13101,13104,13106],{"class":81,"line":1493},[79,13102,13103],{"class":1650},"      xy_goal_tolerance",[79,13105,1668],{"class":106},[79,13107,4904],{"class":1219},[79,13109,13110,13113,13115],{"class":81,"line":1504},[79,13111,13112],{"class":1650},"      yaw_goal_tolerance",[79,13114,1668],{"class":106},[79,13116,4904],{"class":1219},[79,13118,13119],{"class":81,"line":1510},[79,13120,142],{"emptyLinePlaceholder":141},[79,13122,13123],{"class":81,"line":1521},[79,13124,13125],{"class":148},"    # DWB parameters\n",[79,13127,13128,13131],{"class":81,"line":1527},[79,13129,13130],{"class":1650},"    FollowPath",[79,13132,1653],{"class":106},[79,13134,13135,13137,13139],{"class":81,"line":1540},[79,13136,12375],{"class":1650},[79,13138,1668],{"class":106},[79,13140,13141],{"class":89},"\"dwb_core::DWBLocalPlanner\"\n",[79,13143,13144,13147,13149],{"class":81,"line":1553},[79,13145,13146],{"class":1650},"      debug_trajectory_details",[79,13148,1668],{"class":106},[79,13150,9783],{"class":1219},[79,13152,13153,13156,13158],{"class":81,"line":1565},[79,13154,13155],{"class":1650},"      min_vel_x",[79,13157,1668],{"class":106},[79,13159,6767],{"class":1219},[79,13161,13162,13165,13167],{"class":81,"line":1578},[79,13163,13164],{"class":1650},"      min_vel_y",[79,13166,1668],{"class":106},[79,13168,6767],{"class":1219},[79,13170,13171],{"class":81,"line":1583},[79,13172,142],{"emptyLinePlaceholder":141},[79,13174,13175],{"class":81,"line":1594},[79,13176,13177],{"class":148},"      # max_vel_x: 0.15\n",[79,13179,13180,13183,13185],{"class":81,"line":1599},[79,13181,13182],{"class":1650},"      max_vel_x",[79,13184,1668],{"class":106},[79,13186,1886],{"class":1219},[79,13188,13189,13192,13194],{"class":81,"line":1605},[79,13190,13191],{"class":1650},"      max_vel_y",[79,13193,1668],{"class":106},[79,13195,6767],{"class":1219},[79,13197,13198],{"class":81,"line":1611},[79,13199,142],{"emptyLinePlaceholder":141},[79,13201,13202],{"class":81,"line":1617},[79,13203,13204],{"class":148},"      # max_vel_theta: 1.0\n",[79,13206,13207,13210,13212],{"class":81,"line":1622},[79,13208,13209],{"class":1650},"      max_vel_theta",[79,13211,1668],{"class":106},[79,13213,12441],{"class":1219},[79,13215,13216,13219,13221],{"class":81,"line":2005},[79,13217,13218],{"class":1650},"      min_speed_xy",[79,13220,1668],{"class":106},[79,13222,6767],{"class":1219},[79,13224,13225,13228,13230],{"class":81,"line":2016},[79,13226,13227],{"class":1650},"      max_speed_xy",[79,13229,1668],{"class":106},[79,13231,1886],{"class":1219},[79,13233,13234,13237,13239],{"class":81,"line":2029},[79,13235,13236],{"class":1650},"      min_speed_theta",[79,13238,1668],{"class":106},[79,13240,6767],{"class":1219},[79,13242,13243],{"class":81,"line":2043},[79,13244,142],{"emptyLinePlaceholder":141},[79,13246,13247],{"class":81,"line":2056},[79,13248,13249],{"class":148},"      # Add high threshold velocity for turtlebot 3 issue.\n",[79,13251,13252],{"class":81,"line":2070},[79,13253,142],{"emptyLinePlaceholder":141},[79,13255,13256],{"class":81,"line":2081},[79,13257,13258],{"class":148},"      # https:\u002F\u002Fgithub.com\u002FROBOTIS-GIT\u002Fturtlebot3_simulations\u002Fissues\u002F75\n",[79,13260,13261,13264,13266],{"class":81,"line":2086},[79,13262,13263],{"class":1650},"      acc_lim_x",[79,13265,1668],{"class":106},[79,13267,12441],{"class":1219},[79,13269,13270,13273,13275],{"class":81,"line":2096},[79,13271,13272],{"class":1650},"      acc_lim_y",[79,13274,1668],{"class":106},[79,13276,6767],{"class":1219},[79,13278,13279,13282,13284],{"class":81,"line":2107},[79,13280,13281],{"class":1650},"      acc_lim_theta",[79,13283,1668],{"class":106},[79,13285,13286],{"class":1219},"3.2\n",[79,13288,13289,13292,13294],{"class":81,"line":2119},[79,13290,13291],{"class":1650},"      decel_lim_x",[79,13293,1668],{"class":106},[79,13295,6688],{"class":1219},[79,13297,13298,13301,13303],{"class":81,"line":2124},[79,13299,13300],{"class":1650},"      decel_lim_y",[79,13302,1668],{"class":106},[79,13304,6767],{"class":1219},[79,13306,13307,13310,13312],{"class":81,"line":2135},[79,13308,13309],{"class":1650},"      decel_lim_theta",[79,13311,1668],{"class":106},[79,13313,13314],{"class":1219},"-3.2\n",[79,13316,13317],{"class":81,"line":2145},[79,13318,142],{"emptyLinePlaceholder":141},[79,13320,13321],{"class":81,"line":2156},[79,13322,13323],{"class":148},"      # vx_samples: 20\n",[79,13325,13326,13329,13331],{"class":81,"line":2161},[79,13327,13328],{"class":1650},"      vx_samples",[79,13330,1668],{"class":106},[79,13332,12053],{"class":1219},[79,13334,13335,13338,13340],{"class":81,"line":2175},[79,13336,13337],{"class":1650},"      vy_samples",[79,13339,1668],{"class":106},[79,13341,13342],{"class":1219},"5\n",[79,13344,13345,13348,13350],{"class":81,"line":2188},[79,13346,13347],{"class":1650},"      vtheta_samples",[79,13349,1668],{"class":106},[79,13351,12053],{"class":1219},[79,13353,13354,13357,13359],{"class":81,"line":2193},[79,13355,13356],{"class":1650},"      sim_time",[79,13358,1668],{"class":106},[79,13360,13361],{"class":1219},"1.7\n",[79,13363,13364,13367,13369],{"class":81,"line":2207},[79,13365,13366],{"class":1650},"      linear_granularity",[79,13368,1668],{"class":106},[79,13370,1854],{"class":1219},[79,13372,13373,13376,13378],{"class":81,"line":2221},[79,13374,13375],{"class":1650},"      angular_granularity",[79,13377,1668],{"class":106},[79,13379,13380],{"class":1219},"0.025\n",[79,13382,13383],{"class":81,"line":2235},[79,13384,142],{"emptyLinePlaceholder":141},[79,13386,13387],{"class":81,"line":2246},[79,13388,13389],{"class":148},"      # transform_tolerance: 0.2\n",[79,13391,13392,13395,13397],{"class":81,"line":2256},[79,13393,13394],{"class":1650},"      transform_tolerance",[79,13396,1668],{"class":106},[79,13398,12441],{"class":1219},[79,13400,13401,13403,13405],{"class":81,"line":6478},[79,13402,13103],{"class":1650},[79,13404,1668],{"class":106},[79,13406,13407],{"class":1219},"0.15\n",[79,13409,13410,13413,13415],{"class":81,"line":6484},[79,13411,13412],{"class":1650},"      trans_stopped_velocity",[79,13414,1668],{"class":106},[79,13416,4904],{"class":1219},[79,13418,13419,13422,13424],{"class":81,"line":6490},[79,13420,13421],{"class":1650},"      short_circuit_trajectory_evaluation",[79,13423,1668],{"class":106},[79,13425,9783],{"class":1219},[79,13427,13428,13430,13432],{"class":81,"line":9976},[79,13429,13085],{"class":1650},[79,13431,1668],{"class":106},[79,13433,9783],{"class":1219},[79,13435,13436,13439,13441,13444,13446,13449,13451,13454,13456,13459,13461,13464,13466,13469,13471,13474],{"class":81,"line":9988},[79,13437,13438],{"class":1650},"      critics",[79,13440,4858],{"class":106},[79,13442,13443],{"class":89},"\"RotateToGoal\"",[79,13445,1457],{"class":106},[79,13447,13448],{"class":89},"\"Oscillation\"",[79,13450,1457],{"class":106},[79,13452,13453],{"class":89},"\"BaseObstacle\"",[79,13455,1457],{"class":106},[79,13457,13458],{"class":89},"\"GoalAlign\"",[79,13460,1457],{"class":106},[79,13462,13463],{"class":89},"\"PathAlign\"",[79,13465,1457],{"class":106},[79,13467,13468],{"class":89},"\"PathDist\"",[79,13470,1457],{"class":106},[79,13472,13473],{"class":89},"\"GoalDist\"",[79,13475,4874],{"class":106},[79,13477,13478,13481,13483],{"class":81,"line":10000},[79,13479,13480],{"class":1650},"      BaseObstacle.scale",[79,13482,1668],{"class":106},[79,13484,13485],{"class":1219},"0.02\n",[79,13487,13488,13491,13493],{"class":81,"line":10011},[79,13489,13490],{"class":1650},"      PathAlign.scale",[79,13492,1668],{"class":106},[79,13494,13495],{"class":1219},"32.0\n",[79,13497,13498,13501,13503],{"class":81,"line":10022},[79,13499,13500],{"class":1650},"      PathAlign.forward_point_distance",[79,13502,1668],{"class":106},[79,13504,1950],{"class":1219},[79,13506,13507,13510,13512],{"class":81,"line":10031},[79,13508,13509],{"class":1650},"      GoalAlign.scale",[79,13511,1668],{"class":106},[79,13513,13514],{"class":1219},"24.0\n",[79,13516,13517,13520,13522],{"class":81,"line":10037},[79,13518,13519],{"class":1650},"      GoalAlign.forward_point_distance",[79,13521,1668],{"class":106},[79,13523,1950],{"class":1219},[79,13525,13526,13529,13531],{"class":81,"line":10046},[79,13527,13528],{"class":1650},"      PathDist.scale",[79,13530,1668],{"class":106},[79,13532,13495],{"class":1219},[79,13534,13535,13538,13540],{"class":81,"line":10051},[79,13536,13537],{"class":1650},"      GoalDist.scale",[79,13539,1668],{"class":106},[79,13541,13514],{"class":1219},[79,13543,13544,13547,13549],{"class":81,"line":10061},[79,13545,13546],{"class":1650},"      RotateToGoal.scale",[79,13548,1668],{"class":106},[79,13550,13495],{"class":1219},[79,13552,13553,13556,13558],{"class":81,"line":10077},[79,13554,13555],{"class":1650},"      RotateToGoal.slowing_factor",[79,13557,1668],{"class":106},[79,13559,13560],{"class":1219},"5.0\n",[79,13562,13563,13566,13568],{"class":81,"line":10082},[79,13564,13565],{"class":1650},"      RotateToGoal.lookahead_time",[79,13567,1668],{"class":106},[79,13569,6688],{"class":1219},[79,13571,13572,13574],{"class":81,"line":10087},[79,13573,6528],{"class":1650},[79,13575,1653],{"class":106},[79,13577,13578,13581],{"class":81,"line":10092},[79,13579,13580],{"class":1650},"  local_costmap",[79,13582,1653],{"class":106},[79,13584,13585,13587],{"class":81,"line":10102},[79,13586,12429],{"class":1650},[79,13588,1653],{"class":106},[79,13590,13591,13593,13595],{"class":81,"line":10114},[79,13592,12436],{"class":1650},[79,13594,1668],{"class":106},[79,13596,13560],{"class":1219},[79,13598,13599,13601,13603],{"class":81,"line":10126},[79,13600,12446],{"class":1650},[79,13602,1668],{"class":106},[79,13604,1844],{"class":1219},[79,13606,13607,13609,13611],{"class":81,"line":10137},[79,13608,12455],{"class":1650},[79,13610,1668],{"class":106},[79,13612,1735],{"class":89},[79,13614,13615,13617,13619],{"class":81,"line":10148},[79,13616,12464],{"class":1650},[79,13618,1668],{"class":106},[79,13620,1755],{"class":89},[79,13622,13623,13625,13627],{"class":81,"line":10157},[79,13624,12473],{"class":1650},[79,13626,1668],{"class":106},[79,13628,9783],{"class":1219},[79,13630,13631,13634,13636],{"class":81,"line":10163},[79,13632,13633],{"class":1650},"      rolling_window",[79,13635,1668],{"class":106},[79,13637,9783],{"class":1219},[79,13639,13640,13643,13645],{"class":81,"line":10172},[79,13641,13642],{"class":1650},"      width",[79,13644,1668],{"class":106},[79,13646,13647],{"class":1219},"2\n",[79,13649,13650,13653,13655],{"class":81,"line":10177},[79,13651,13652],{"class":1650},"      height",[79,13654,1668],{"class":106},[79,13656,13647],{"class":1219},[79,13658,13659,13661,13663],{"class":81,"line":10182},[79,13660,12501],{"class":1650},[79,13662,1668],{"class":106},[79,13664,1854],{"class":1219},[79,13666,13667],{"class":81,"line":10187},[79,13668,142],{"emptyLinePlaceholder":141},[79,13670,13671],{"class":81,"line":10197},[79,13672,13673],{"class":148},"      # robot_radius: 0.20\n",[79,13675,13676,13678,13680],{"class":81,"line":10209},[79,13677,12491],{"class":1650},[79,13679,1668],{"class":106},[79,13681,12496],{"class":89},[79,13683,13684,13686,13688,13690,13692,13694,13696,13698],{"class":81,"line":10221},[79,13685,12519],{"class":1650},[79,13687,4858],{"class":106},[79,13689,12529],{"class":89},[79,13691,1457],{"class":106},[79,13693,12534],{"class":89},[79,13695,1457],{"class":106},[79,13697,12539],{"class":89},[79,13699,4874],{"class":106},[79,13701,13702,13704],{"class":81,"line":10232},[79,13703,12861],{"class":1650},[79,13705,1653],{"class":106},[79,13707,13708,13710,13712],{"class":81,"line":10243},[79,13709,12553],{"class":1650},[79,13711,1668],{"class":106},[79,13713,12872],{"class":89},[79,13715,13716,13718,13720],{"class":81,"line":10252},[79,13717,12887],{"class":1650},[79,13719,1668],{"class":106},[79,13721,1876],{"class":1219},[79,13723,13724,13726,13728],{"class":81,"line":10258},[79,13725,12877],{"class":1650},[79,13727,1668],{"class":106},[79,13729,12882],{"class":1219},[79,13731,13732,13734],{"class":81,"line":10267},[79,13733,12546],{"class":1650},[79,13735,1653],{"class":106},[79,13737,13738,13740,13742],{"class":81,"line":10272},[79,13739,12553],{"class":1650},[79,13741,1668],{"class":106},[79,13743,12558],{"class":89},[79,13745,13746,13748,13750],{"class":81,"line":10277},[79,13747,12563],{"class":1650},[79,13749,1668],{"class":106},[79,13751,9783],{"class":1219},[79,13753,13754,13756,13758],{"class":81,"line":10282},[79,13755,12572],{"class":1650},[79,13757,1668],{"class":106},[79,13759,6894],{"class":89},[79,13761,13762,13764],{"class":81,"line":10292},[79,13763,12581],{"class":1650},[79,13765,1653],{"class":106},[79,13767,13768,13770,13772],{"class":81,"line":10304},[79,13769,12588],{"class":1650},[79,13771,1668],{"class":106},[79,13773,1765],{"class":89},[79,13775,13776,13778,13780],{"class":81,"line":10316},[79,13777,12597],{"class":1650},[79,13779,1668],{"class":106},[79,13781,1844],{"class":1219},[79,13783,13784,13786,13788],{"class":81,"line":10327},[79,13785,12606],{"class":1650},[79,13787,1668],{"class":106},[79,13789,9783],{"class":1219},[79,13791,13792,13794,13796],{"class":81,"line":10338},[79,13793,12615],{"class":1650},[79,13795,1668],{"class":106},[79,13797,9783],{"class":1219},[79,13799,13800,13802,13804],{"class":81,"line":10351},[79,13801,12624],{"class":1650},[79,13803,1668],{"class":106},[79,13805,12629],{"class":89},[79,13807,13808,13810],{"class":81,"line":10360},[79,13809,12671],{"class":1650},[79,13811,1653],{"class":106},[79,13813,13814,13816,13818],{"class":81,"line":10366},[79,13815,12553],{"class":1650},[79,13817,1668],{"class":106},[79,13819,12682],{"class":89},[79,13821,13822,13824,13826],{"class":81,"line":10375},[79,13823,12563],{"class":1650},[79,13825,1668],{"class":106},[79,13827,9783],{"class":1219},[79,13829,13830,13832,13834],{"class":81,"line":10380},[79,13831,12695],{"class":1650},[79,13833,1668],{"class":106},[79,13835,9783],{"class":1219},[79,13837,13838,13840,13842],{"class":81,"line":10389},[79,13839,12704],{"class":1650},[79,13841,1668],{"class":106},[79,13843,6767],{"class":1219},[79,13845,13846,13848,13850],{"class":81,"line":10402},[79,13847,12713],{"class":1650},[79,13849,1668],{"class":106},[79,13851,1854],{"class":1219},[79,13853,13854,13856,13858],{"class":81,"line":10416},[79,13855,12722],{"class":1650},[79,13857,1668],{"class":106},[79,13859,12727],{"class":1219},[79,13861,13862,13864,13866],{"class":81,"line":10421},[79,13863,12732],{"class":1650},[79,13865,1668],{"class":106},[79,13867,1844],{"class":1219},[79,13869,13870,13872,13874],{"class":81,"line":10426},[79,13871,12741],{"class":1650},[79,13873,1668],{"class":106},[79,13875,4884],{"class":1219},[79,13877,13878,13880,13882],{"class":81,"line":10431},[79,13879,12572],{"class":1650},[79,13881,1668],{"class":106},[79,13883,6894],{"class":89},[79,13885,13886,13888],{"class":81,"line":10441},[79,13887,12581],{"class":1650},[79,13889,1653],{"class":106},[79,13891,13892,13894,13896],{"class":81,"line":10453},[79,13893,12588],{"class":1650},[79,13895,1668],{"class":106},[79,13897,1765],{"class":89},[79,13899,13900,13902,13904],{"class":81,"line":10465},[79,13901,12597],{"class":1650},[79,13903,1668],{"class":106},[79,13905,1844],{"class":1219},[79,13907,13908,13910,13912],{"class":81,"line":10476},[79,13909,12606],{"class":1650},[79,13911,1668],{"class":106},[79,13913,9783],{"class":1219},[79,13915,13916,13918,13920],{"class":81,"line":10487},[79,13917,12615],{"class":1650},[79,13919,1668],{"class":106},[79,13921,9783],{"class":1219},[79,13923,13924,13926,13928],{"class":81,"line":10496},[79,13925,12624],{"class":1650},[79,13927,1668],{"class":106},[79,13929,12629],{"class":89},[79,13931,13932,13934,13936],{"class":81,"line":10502},[79,13933,12634],{"class":1650},[79,13935,1668],{"class":106},[79,13937,2013],{"class":1219},[79,13939,13940,13942,13944],{"class":81,"line":10511},[79,13941,12643],{"class":1650},[79,13943,1668],{"class":106},[79,13945,6767],{"class":1219},[79,13947,13948,13950,13952],{"class":81,"line":10516},[79,13949,12652],{"class":1650},[79,13951,1668],{"class":106},[79,13953,12657],{"class":1219},[79,13955,13956,13958,13960],{"class":81,"line":10521},[79,13957,12662],{"class":1650},[79,13959,1668],{"class":106},[79,13961,6767],{"class":1219},[79,13963,13964,13966],{"class":81,"line":10526},[79,13965,12836],{"class":1650},[79,13967,1653],{"class":106},[79,13969,13970,13972,13974],{"class":81,"line":10536},[79,13971,12852],{"class":1650},[79,13973,1668],{"class":106},[79,13975,9783],{"class":1219},[79,13977,13978,13980,13982],{"class":81,"line":10548},[79,13979,12897],{"class":1650},[79,13981,1668],{"class":106},[79,13983,9783],{"class":1219},[20,13985,13986],{},"Footprint",[48,13988,13989,13992],{},[51,13990,13991],{},"将毫米转换为米：长0.96m，宽0.45m",[51,13993,13994,13995,13997],{},"以机器人中心（",[76,13996,5722],{},"坐标系原点）为基准，计算矩形顶点坐标：",[20,13999,14000,14003],{},[4276,14001,14002],{},"说明","：顶点按顺时针或逆时针顺序排列，覆盖机器人长宽边界。（右手坐标系）",[20,14005,14006],{},"例如长960宽450长400",[70,14008,14012],{"className":14009,"code":14010,"language":14011,"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,14013,14014],{"__ignoreMap":34},[79,14015,14016,14019],{"class":81,"line":82},[79,14017,14018],{"class":106},"footprint: ",[79,14020,14021],{"class":1219},"[[0.48, 0.225], [0.48, -0.225], [-0.48, -0.225], [-0.48, 0.225]]\n",[20,14023,14024],{},[23,14025,14026],{},"（4）behavior_server相关配置文件",[20,14028,11967,14029,5196],{},[76,14030,14031],{},"behavior.yaml",[70,14033,14035],{"className":1641,"code":14034,"language":1643,"meta":34,"style":34},"\u002F**:\n  ros__parameters:\n    costmap_topic: local_costmap\u002Fcostmap_raw\n    footprint_topic: local_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\u002FSpin\"\n    backup:\n      plugin: \"nav2_behaviors\u002FBackUp\"\n    drive_on_heading:\n      plugin: \"nav2_behaviors\u002FDriveOnHeading\"\n    wait:\n      plugin: \"nav2_behaviors\u002FWait\"\n    assisted_teleop:\n      plugin: \"nav2_behaviors\u002FAssistedTeleop\"\n    global_frame: odom\n    robot_base_frame: base_link\n    transform_tolerance: 0.1\n    use_sim_time: True\n    simulate_ahead_time: 2.0\n    max_rotational_vel: 1.0\n    min_rotational_vel: 0.4\n    rotational_acc_lim: 3.2\n",[76,14036,14037,14043,14049,14059,14069,14078,14110,14117,14126,14133,14142,14149,14158,14165,14174,14181,14190,14198,14206,14214,14222,14231,14240,14250],{"__ignoreMap":34},[79,14038,14039,14041],{"class":81,"line":82},[79,14040,6528],{"class":1650},[79,14042,1653],{"class":106},[79,14044,14045,14047],{"class":81,"line":116},[79,14046,1658],{"class":1650},[79,14048,1653],{"class":106},[79,14050,14051,14054,14056],{"class":81,"line":138},[79,14052,14053],{"class":1650},"    costmap_topic",[79,14055,1668],{"class":106},[79,14057,14058],{"class":89},"local_costmap\u002Fcostmap_raw\n",[79,14060,14061,14064,14066],{"class":81,"line":145},[79,14062,14063],{"class":1650},"    footprint_topic",[79,14065,1668],{"class":106},[79,14067,14068],{"class":89},"local_costmap\u002Fpublished_footprint\n",[79,14070,14071,14074,14076],{"class":81,"line":152},[79,14072,14073],{"class":1650},"    cycle_frequency",[79,14075,1668],{"class":106},[79,14077,13560],{"class":1219},[79,14079,14080,14083,14085,14088,14090,14093,14095,14098,14100,14103,14105,14108],{"class":81,"line":164},[79,14081,14082],{"class":1650},"    behavior_plugins",[79,14084,4858],{"class":106},[79,14086,14087],{"class":89},"\"spin\"",[79,14089,1457],{"class":106},[79,14091,14092],{"class":89},"\"backup\"",[79,14094,1457],{"class":106},[79,14096,14097],{"class":89},"\"drive_on_heading\"",[79,14099,1457],{"class":106},[79,14101,14102],{"class":89},"\"assisted_teleop\"",[79,14104,1457],{"class":106},[79,14106,14107],{"class":89},"\"wait\"",[79,14109,4874],{"class":106},[79,14111,14112,14115],{"class":81,"line":176},[79,14113,14114],{"class":1650},"    spin",[79,14116,1653],{"class":106},[79,14118,14119,14121,14123],{"class":81,"line":181},[79,14120,12375],{"class":1650},[79,14122,1668],{"class":106},[79,14124,14125],{"class":89},"\"nav2_behaviors\u002FSpin\"\n",[79,14127,14128,14131],{"class":81,"line":187},[79,14129,14130],{"class":1650},"    backup",[79,14132,1653],{"class":106},[79,14134,14135,14137,14139],{"class":81,"line":199},[79,14136,12375],{"class":1650},[79,14138,1668],{"class":106},[79,14140,14141],{"class":89},"\"nav2_behaviors\u002FBackUp\"\n",[79,14143,14144,14147],{"class":81,"line":1350},[79,14145,14146],{"class":1650},"    drive_on_heading",[79,14148,1653],{"class":106},[79,14150,14151,14153,14155],{"class":81,"line":1365},[79,14152,12375],{"class":1650},[79,14154,1668],{"class":106},[79,14156,14157],{"class":89},"\"nav2_behaviors\u002FDriveOnHeading\"\n",[79,14159,14160,14163],{"class":81,"line":1370},[79,14161,14162],{"class":1650},"    wait",[79,14164,1653],{"class":106},[79,14166,14167,14169,14171],{"class":81,"line":1381},[79,14168,12375],{"class":1650},[79,14170,1668],{"class":106},[79,14172,14173],{"class":89},"\"nav2_behaviors\u002FWait\"\n",[79,14175,14176,14179],{"class":81,"line":1390},[79,14177,14178],{"class":1650},"    assisted_teleop",[79,14180,1653],{"class":106},[79,14182,14183,14185,14187],{"class":81,"line":1404},[79,14184,12375],{"class":1650},[79,14186,1668],{"class":106},[79,14188,14189],{"class":89},"\"nav2_behaviors\u002FAssistedTeleop\"\n",[79,14191,14192,14194,14196],{"class":81,"line":1417},[79,14193,12000],{"class":1650},[79,14195,1668],{"class":106},[79,14197,1735],{"class":89},[79,14199,14200,14202,14204],{"class":81,"line":1427},[79,14201,12009],{"class":1650},[79,14203,1668],{"class":106},[79,14205,1755],{"class":89},[79,14207,14208,14210,14212],{"class":81,"line":1435},[79,14209,6827],{"class":1650},[79,14211,1668],{"class":106},[79,14213,1950],{"class":1219},[79,14215,14216,14218,14220],{"class":81,"line":1451},[79,14217,6541],{"class":1650},[79,14219,1668],{"class":106},[79,14221,9783],{"class":1219},[79,14223,14224,14227,14229],{"class":81,"line":1465},[79,14225,14226],{"class":1650},"    simulate_ahead_time",[79,14228,1668],{"class":106},[79,14230,1844],{"class":1219},[79,14232,14233,14236,14238],{"class":81,"line":1477},[79,14234,14235],{"class":1650},"    max_rotational_vel",[79,14237,1668],{"class":106},[79,14239,12441],{"class":1219},[79,14241,14242,14245,14247],{"class":81,"line":1482},[79,14243,14244],{"class":1650},"    min_rotational_vel",[79,14246,1668],{"class":106},[79,14248,14249],{"class":1219},"0.4\n",[79,14251,14252,14255,14257],{"class":81,"line":1493},[79,14253,14254],{"class":1650},"    rotational_acc_lim",[79,14256,1668],{"class":106},[79,14258,13286],{"class":1219},[20,14260,14261],{},[23,14262,14263],{},"（5）waypoint_follower相关配置文件",[20,14265,11967,14266,5196],{},[76,14267,14268],{},"waypoint.yaml",[70,14270,14272],{"className":1641,"code":14271,"language":1643,"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,14273,14274,14280,14286,14294,14303,14312,14322,14329,14338,14347],{"__ignoreMap":34},[79,14275,14276,14278],{"class":81,"line":82},[79,14277,6528],{"class":1650},[79,14279,1653],{"class":106},[79,14281,14282,14284],{"class":81,"line":116},[79,14283,1658],{"class":1650},[79,14285,1653],{"class":106},[79,14287,14288,14290,14292],{"class":81,"line":138},[79,14289,6541],{"class":1650},[79,14291,1668],{"class":106},[79,14293,9783],{"class":1219},[79,14295,14296,14299,14301],{"class":81,"line":145},[79,14297,14298],{"class":1650},"    loop_rate",[79,14300,1668],{"class":106},[79,14302,12053],{"class":1219},[79,14304,14305,14308,14310],{"class":81,"line":152},[79,14306,14307],{"class":1650},"    stop_on_failure",[79,14309,1668],{"class":106},[79,14311,1811],{"class":1219},[79,14313,14314,14317,14319],{"class":81,"line":164},[79,14315,14316],{"class":1650},"    waypoint_task_executor_plugin",[79,14318,1668],{"class":106},[79,14320,14321],{"class":89},"\"wait_at_waypoint\"\n",[79,14323,14324,14327],{"class":81,"line":176},[79,14325,14326],{"class":1650},"    wait_at_waypoint",[79,14328,1653],{"class":106},[79,14330,14331,14333,14335],{"class":81,"line":181},[79,14332,12375],{"class":1650},[79,14334,1668],{"class":106},[79,14336,14337],{"class":89},"\"nav2_waypoint_follower::WaitAtWaypoint\"\n",[79,14339,14340,14343,14345],{"class":81,"line":187},[79,14341,14342],{"class":1650},"      enabled",[79,14344,1668],{"class":106},[79,14346,9783],{"class":1219},[79,14348,14349,14352,14354],{"class":81,"line":199},[79,14350,14351],{"class":1650},"      waypoint_pause_duration",[79,14353,1668],{"class":106},[79,14355,14356],{"class":1219},"5000\n",[20,14358,14359],{},[23,14360,14361],{},"（6）velocity_smoother相关配置文件",[20,14363,11967,14364,5196],{},[76,14365,14366],{},"velocity.yaml",[70,14368,14370],{"className":1641,"code":14369,"language":1643,"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.1, 0.0, 1.0]\n    min_velocity: [-0.1, 0.0, -1.0]\n    max_accel: [2.5, 0.0, 3.2]\n    max_decel: [-2.5, 0.0, -3.2]\n    odom_topic: \"odom\"\n    odom_duration: 0.1\n    deadband_velocity: [0.0, 0.0, 0.0]\n    velocity_timeout: 1.0\n",[76,14371,14372,14378,14384,14392,14401,14410,14420,14440,14461,14482,14503,14511,14520,14539],{"__ignoreMap":34},[79,14373,14374,14376],{"class":81,"line":82},[79,14375,6528],{"class":1650},[79,14377,1653],{"class":106},[79,14379,14380,14382],{"class":81,"line":116},[79,14381,1658],{"class":1650},[79,14383,1653],{"class":106},[79,14385,14386,14388,14390],{"class":81,"line":138},[79,14387,6541],{"class":1650},[79,14389,1668],{"class":106},[79,14391,9783],{"class":1219},[79,14393,14394,14397,14399],{"class":81,"line":145},[79,14395,14396],{"class":1650},"    smoothing_frequency",[79,14398,1668],{"class":106},[79,14400,12344],{"class":1219},[79,14402,14403,14406,14408],{"class":81,"line":152},[79,14404,14405],{"class":1650},"    scale_velocities",[79,14407,1668],{"class":106},[79,14409,12902],{"class":1219},[79,14411,14412,14415,14417],{"class":81,"line":164},[79,14413,14414],{"class":1650},"    feedback",[79,14416,1668],{"class":106},[79,14418,14419],{"class":89},"\"OPEN_LOOP\"\n",[79,14421,14422,14425,14427,14429,14431,14434,14436,14438],{"class":81,"line":176},[79,14423,14424],{"class":1650},"    max_velocity",[79,14426,4858],{"class":106},[79,14428,1989],{"class":1219},[79,14430,1457],{"class":106},[79,14432,14433],{"class":1219},"0.0",[79,14435,1457],{"class":106},[79,14437,2183],{"class":1219},[79,14439,4874],{"class":106},[79,14441,14442,14445,14447,14450,14452,14454,14456,14459],{"class":81,"line":181},[79,14443,14444],{"class":1650},"    min_velocity",[79,14446,4858],{"class":106},[79,14448,14449],{"class":1219},"-0.1",[79,14451,1457],{"class":106},[79,14453,14433],{"class":1219},[79,14455,1457],{"class":106},[79,14457,14458],{"class":1219},"-1.0",[79,14460,4874],{"class":106},[79,14462,14463,14466,14468,14471,14473,14475,14477,14480],{"class":81,"line":187},[79,14464,14465],{"class":1650},"    max_accel",[79,14467,4858],{"class":106},[79,14469,14470],{"class":1219},"2.5",[79,14472,1457],{"class":106},[79,14474,14433],{"class":1219},[79,14476,1457],{"class":106},[79,14478,14479],{"class":1219},"3.2",[79,14481,4874],{"class":106},[79,14483,14484,14487,14489,14492,14494,14496,14498,14501],{"class":81,"line":199},[79,14485,14486],{"class":1650},"    max_decel",[79,14488,4858],{"class":106},[79,14490,14491],{"class":1219},"-2.5",[79,14493,1457],{"class":106},[79,14495,14433],{"class":1219},[79,14497,1457],{"class":106},[79,14499,14500],{"class":1219},"-3.2",[79,14502,4874],{"class":106},[79,14504,14505,14507,14509],{"class":81,"line":1350},[79,14506,12018],{"class":1650},[79,14508,1668],{"class":106},[79,14510,6738],{"class":89},[79,14512,14513,14516,14518],{"class":81,"line":1365},[79,14514,14515],{"class":1650},"    odom_duration",[79,14517,1668],{"class":106},[79,14519,1950],{"class":1219},[79,14521,14522,14525,14527,14529,14531,14533,14535,14537],{"class":81,"line":1370},[79,14523,14524],{"class":1650},"    deadband_velocity",[79,14526,4858],{"class":106},[79,14528,14433],{"class":1219},[79,14530,1457],{"class":106},[79,14532,14433],{"class":1219},[79,14534,1457],{"class":106},[79,14536,14433],{"class":1219},[79,14538,4874],{"class":106},[79,14540,14541,14544,14546],{"class":81,"line":1381},[79,14542,14543],{"class":1650},"    velocity_timeout",[79,14545,1668],{"class":106},[79,14547,12441],{"class":1219},[20,14549,14550],{},[23,14551,14552],{},"（7）smoother_server相关配置文件",[20,14554,11967,14555,5196],{},[76,14556,14557],{},"smootherr.yaml",[70,14559,14561],{"className":1641,"code":14560,"language":1643,"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,14562,14563,14569,14575,14584,14593,14601,14609,14621,14628,14637,14646],{"__ignoreMap":34},[79,14564,14565,14567],{"class":81,"line":82},[79,14566,6528],{"class":1650},[79,14568,1653],{"class":106},[79,14570,14571,14573],{"class":81,"line":116},[79,14572,1658],{"class":1650},[79,14574,1653],{"class":106},[79,14576,14577,14579,14581],{"class":81,"line":138},[79,14578,14053],{"class":1650},[79,14580,1668],{"class":106},[79,14582,14583],{"class":89},"global_costmap\u002Fcostmap_raw\n",[79,14585,14586,14588,14590],{"class":81,"line":145},[79,14587,14063],{"class":1650},[79,14589,1668],{"class":106},[79,14591,14592],{"class":89},"global_costmap\u002Fpublished_footprint\n",[79,14594,14595,14597,14599],{"class":81,"line":152},[79,14596,12009],{"class":1650},[79,14598,1668],{"class":106},[79,14600,1755],{"class":89},[79,14602,14603,14605,14607],{"class":81,"line":164},[79,14604,1881],{"class":1650},[79,14606,1668],{"class":106},[79,14608,1950],{"class":1219},[79,14610,14611,14614,14616,14619],{"class":81,"line":176},[79,14612,14613],{"class":1650},"    smoother_plugins",[79,14615,4858],{"class":106},[79,14617,14618],{"class":89},"\"simple_smoother\"",[79,14620,4874],{"class":106},[79,14622,14623,14626],{"class":81,"line":181},[79,14624,14625],{"class":1650},"    simple_smoother",[79,14627,1653],{"class":106},[79,14629,14630,14632,14634],{"class":81,"line":187},[79,14631,12375],{"class":1650},[79,14633,1668],{"class":106},[79,14635,14636],{"class":89},"\"nav2_smoother::SimpleSmoother\"\n",[79,14638,14639,14641,14643],{"class":81,"line":199},[79,14640,12385],{"class":1650},[79,14642,1668],{"class":106},[79,14644,14645],{"class":1219},"1.0e-10\n",[79,14647,14648,14651,14653],{"class":81,"line":1350},[79,14649,14650],{"class":1650},"      do_refinement",[79,14652,1668],{"class":106},[79,14654,9783],{"class":1219},[20,14656,14657],{},[23,14658,14659],{},"3.launch集成",[20,14661,14662,14663,14666],{},"导航实现时，需要依赖于地图与定位功能，我们可以在一个launch文件中集成之前的定位launch以及当前编写的导航核心模块的launch，以简化导航功能的启动，在launch目录下新建一个名为",[76,14664,14665],{},"bringup.launch.py","的launch文件，并输入如下内容：",[70,14668,14670],{"className":1238,"code":14669,"language":1240,"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\")\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,14671,14672,14678,14682,14692,14696,14706,14717,14727,14737,14741,14745,14753,14757,14765,14771,14779,14783,14787,14801,14814,14818,14827,14831,14835,14840,14846,14851,14855,14859,14867,14877,14881,14885,14889,14898,14902,14906,14911,14917,14922,14926,14930,14938,14948,14952,14956,14960,14966,14970,14975,14980],{"__ignoreMap":34},[79,14673,14674,14676],{"class":81,"line":82},[79,14675,1247],{"class":99},[79,14677,1250],{"class":106},[79,14679,14680],{"class":81,"line":116},[79,14681,142],{"emptyLinePlaceholder":141},[79,14683,14684,14686,14688,14690],{"class":81,"line":138},[79,14685,1259],{"class":99},[79,14687,1310],{"class":106},[79,14689,1247],{"class":99},[79,14691,1315],{"class":106},[79,14693,14694],{"class":81,"line":145},[79,14695,142],{"emptyLinePlaceholder":141},[79,14697,14698,14700,14702,14704],{"class":81,"line":152},[79,14699,1259],{"class":99},[79,14701,1262],{"class":106},[79,14703,1247],{"class":99},[79,14705,1267],{"class":106},[79,14707,14708,14710,14712,14714],{"class":81,"line":164},[79,14709,1259],{"class":99},[79,14711,1274],{"class":106},[79,14713,1247],{"class":99},[79,14715,14716],{"class":106}," IncludeLaunchDescription, DeclareLaunchArgument\n",[79,14718,14719,14721,14723,14725],{"class":81,"line":176},[79,14720,1259],{"class":99},[79,14722,1286],{"class":106},[79,14724,1247],{"class":99},[79,14726,1291],{"class":106},[79,14728,14729,14731,14733,14735],{"class":81,"line":181},[79,14730,1259],{"class":99},[79,14732,6064],{"class":106},[79,14734,1247],{"class":99},[79,14736,6069],{"class":106},[79,14738,14739],{"class":81,"line":187},[79,14740,142],{"emptyLinePlaceholder":141},[79,14742,14743],{"class":81,"line":199},[79,14744,142],{"emptyLinePlaceholder":141},[79,14746,14747,14749,14751],{"class":81,"line":1350},[79,14748,1324],{"class":99},[79,14750,1327],{"class":85},[79,14752,1330],{"class":106},[79,14754,14755],{"class":81,"line":1365},[79,14756,142],{"emptyLinePlaceholder":141},[79,14758,14759,14761,14763],{"class":81,"line":1370},[79,14760,3099],{"class":106},[79,14762,1338],{"class":99},[79,14764,1378],{"class":106},[79,14766,14767,14769],{"class":81,"line":1381},[79,14768,1384],{"class":89},[79,14770,1387],{"class":106},[79,14772,14773,14775,14777],{"class":81,"line":1390},[79,14774,1394],{"class":1393},[79,14776,1338],{"class":99},[79,14778,6126],{"class":89},[79,14780,14781],{"class":81,"line":1404},[79,14782,3252],{"class":106},[79,14784,14785],{"class":81,"line":1417},[79,14786,142],{"emptyLinePlaceholder":141},[79,14788,14789,14792,14794,14796,14799],{"class":81,"line":1427},[79,14790,14791],{"class":106},"    amcl_pkg ",[79,14793,1338],{"class":99},[79,14795,9565],{"class":106},[79,14797,14798],{"class":89},"\"mycar_localization\"",[79,14800,1347],{"class":106},[79,14802,14803,14806,14808,14810,14812],{"class":81,"line":1435},[79,14804,14805],{"class":106},"    nav2_pkg ",[79,14807,1338],{"class":99},[79,14809,9565],{"class":106},[79,14811,9568],{"class":89},[79,14813,1347],{"class":106},[79,14815,14816],{"class":81,"line":1451},[79,14817,142],{"emptyLinePlaceholder":141},[79,14819,14820,14823,14825],{"class":81,"line":1465},[79,14821,14822],{"class":106},"    amcl_launch ",[79,14824,1338],{"class":99},[79,14826,6384],{"class":106},[79,14828,14829],{"class":81,"line":1477},[79,14830,6389],{"class":106},[79,14832,14833],{"class":81,"line":1482},[79,14834,6394],{"class":106},[79,14836,14837],{"class":81,"line":1493},[79,14838,14839],{"class":106},"                amcl_pkg,\n",[79,14841,14842,14844],{"class":81,"line":1504},[79,14843,6409],{"class":89},[79,14845,1387],{"class":106},[79,14847,14848],{"class":81,"line":1510},[79,14849,14850],{"class":89},"                'mycar_loca.launch.py'\n",[79,14852,14853],{"class":81,"line":1521},[79,14854,6421],{"class":106},[79,14856,14857],{"class":81,"line":1527},[79,14858,6426],{"class":106},[79,14860,14861,14863,14865],{"class":81,"line":1540},[79,14862,6431],{"class":1393},[79,14864,1338],{"class":99},[79,14866,6436],{"class":106},[79,14868,14869,14871,14873,14875],{"class":81,"line":1553},[79,14870,6441],{"class":89},[79,14872,3191],{"class":106},[79,14874,1344],{"class":89},[79,14876,1347],{"class":106},[79,14878,14879],{"class":81,"line":1565},[79,14880,6452],{"class":106},[79,14882,14883],{"class":81,"line":1578},[79,14884,3252],{"class":106},[79,14886,14887],{"class":81,"line":1583},[79,14888,142],{"emptyLinePlaceholder":141},[79,14890,14891,14894,14896],{"class":81,"line":1594},[79,14892,14893],{"class":106},"    nav2_launch ",[79,14895,1338],{"class":99},[79,14897,6384],{"class":106},[79,14899,14900],{"class":81,"line":1599},[79,14901,6389],{"class":106},[79,14903,14904],{"class":81,"line":1605},[79,14905,6394],{"class":106},[79,14907,14908],{"class":81,"line":1611},[79,14909,14910],{"class":106},"                nav2_pkg,\n",[79,14912,14913,14915],{"class":81,"line":1617},[79,14914,6409],{"class":89},[79,14916,1387],{"class":106},[79,14918,14919],{"class":81,"line":1622},[79,14920,14921],{"class":89},"                'nav2.launch.py'\n",[79,14923,14924],{"class":81,"line":2005},[79,14925,6421],{"class":106},[79,14927,14928],{"class":81,"line":2016},[79,14929,6426],{"class":106},[79,14931,14932,14934,14936],{"class":81,"line":2029},[79,14933,6431],{"class":1393},[79,14935,1338],{"class":99},[79,14937,6436],{"class":106},[79,14939,14940,14942,14944,14946],{"class":81,"line":2043},[79,14941,6441],{"class":89},[79,14943,3191],{"class":106},[79,14945,1344],{"class":89},[79,14947,1347],{"class":106},[79,14949,14950],{"class":81,"line":2056},[79,14951,6452],{"class":106},[79,14953,14954],{"class":81,"line":2070},[79,14955,3252],{"class":106},[79,14957,14958],{"class":81,"line":2081},[79,14959,142],{"emptyLinePlaceholder":141},[79,14961,14962,14964],{"class":81,"line":2086},[79,14963,1625],{"class":99},[79,14965,3335],{"class":106},[79,14967,14968],{"class":81,"line":2096},[79,14969,3340],{"class":106},[79,14971,14972],{"class":81,"line":2107},[79,14973,14974],{"class":106},"        amcl_launch,\n",[79,14976,14977],{"class":81,"line":2119},[79,14978,14979],{"class":106},"        nav2_launch\n",[79,14981,14982],{"class":81,"line":2124},[79,14983,3360],{"class":106},[20,14985,14986],{},[23,14987,14988],{},"4.编辑配置文件",[20,14990,2274,14991,2278],{},[76,14992,2277],{},[70,14994,14996],{"className":2281,"code":14995,"language":2283,"meta":34,"style":34},"install(DIRECTORY launch params bts\n  DESTINATION share\u002F${PROJECT_NAME}\n)\n",[76,14997,14998,15005,15011],{"__ignoreMap":34},[79,14999,15000,15002],{"class":81,"line":82},[79,15001,2290],{"class":99},[79,15003,15004],{"class":106},"(DIRECTORY launch params bts\n",[79,15006,15007,15009],{"class":81,"line":116},[79,15008,2298],{"class":106},[79,15010,2301],{"class":99},[79,15012,15013],{"class":81,"line":138},[79,15014,1347],{"class":106},[20,15016,15017],{},[23,15018,15019],{},"5.编译",[20,15021,2313],{},[70,15023,15025],{"className":72,"code":15024,"language":74,"meta":34,"style":34},"colcon build --packages-select mycar_navigation2\n",[76,15026,15027],{"__ignoreMap":34},[79,15028,15029,15031,15033,15035],{"class":81,"line":82},[79,15030,2323],{"class":85},[79,15032,2326],{"class":89},[79,15034,2329],{"class":1219},[79,15036,15037],{"class":89}," mycar_navigation2\n",[20,15039,15040],{},[23,15041,15042],{},"6.执行",[20,15044,4003],{},[70,15046,15047],{"className":72,"code":2345,"language":74,"meta":34,"style":34},[76,15048,15049,15055],{"__ignoreMap":34},[79,15050,15051,15053],{"class":81,"line":82},[79,15052,2352],{"class":1219},[79,15054,2355],{"class":89},[79,15056,15057,15059,15061,15063],{"class":81,"line":116},[79,15058,1207],{"class":85},[79,15060,2362],{"class":89},[79,15062,2365],{"class":89},[79,15064,2368],{"class":89},[20,15066,15067],{},"（2）然后在终端下进入当前工作空间，输入如下指令启动导航功能：",[70,15069,15071],{"className":72,"code":15070,"language":74,"meta":34,"style":34},". install\u002Fsetup.bash\nros2 launch mycar_navigation2 bringup.launch.py use_sim_time:=True\n",[76,15072,15073,15079],{"__ignoreMap":34},[79,15074,15075,15077],{"class":81,"line":82},[79,15076,2352],{"class":1219},[79,15078,2355],{"class":89},[79,15080,15081,15083,15085,15087,15090],{"class":81,"line":116},[79,15082,1207],{"class":85},[79,15084,2362],{"class":89},[79,15086,9367],{"class":89},[79,15088,15089],{"class":89}," bringup.launch.py",[79,15091,2398],{"class":89},[20,15093,15094,15095,15098,15099,15102,15103,15106],{},"（3）启动rviz2，加载",[76,15096,15097],{},"\u002Fopt\u002Fros\u002Fhumble\u002Fshare\u002Fnav2_bringup\u002Frviz","下的",[76,15100,15101],{},"nav2_default_view.rviz","文件，为机器人设置初始位姿后，再通过菜单栏的",[76,15104,15105],{},"Nav2 Goal","设置目标点，机器人就可以自动导航至目标点了。",[70,15108,15110],{"className":72,"code":15109,"language":74,"meta":34,"style":34},"rviz2 -d \u002Fopt\u002Fros\u002Fhumble\u002Fshare\u002Fnav2_bringup\u002Frviz\u002Fnav2_default_view.rviz\n",[76,15111,15112],{"__ignoreMap":34},[79,15113,15114,15117,15120],{"class":81,"line":82},[79,15115,15116],{"class":85},"rviz2",[79,15118,15119],{"class":1219}," -d",[79,15121,15122],{"class":89}," \u002Fopt\u002Fros\u002Fhumble\u002Fshare\u002Fnav2_bringup\u002Frviz\u002Fnav2_default_view.rviz\n",[48,15124,15125,15133,15143],{},[51,15126,15127,15129,15130,15132],{},[76,15128,15116],{},"：启动 ",[76,15131,15116],{}," 工具。",[51,15134,15135,15138,15139,15142],{},[76,15136,15137],{},"-d","：指定要加载的 ",[76,15140,15141],{},".rviz"," 配置文件。",[51,15144,15145,15148,15149,15151],{},[76,15146,15147],{},"\u002Fopt\u002Fros\u002Fhumble\u002Fshare\u002Fnav2_bringup\u002Frviz\u002Fnav2_default_view.rviz","：",[76,15150,15141],{}," 配置文件的路径。",[20,15153,15154,15155,15157,15158,15142],{},"运行该命令后，",[76,15156,15116],{}," 将启动并加载 ",[76,15159,15101],{},[20,15161,15162],{},"先使用",[20,15164,15165,15168],{},[32,15166],{"alt":34,"src":15167},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1766.webp",[32,15169],{"alt":34,"src":15170},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1767.webp",[20,15172,15173],{},"如上图，左图是选择初始位置，右图是选择目标位置。",[20,15175,15176],{},"上图中，每个障碍物和墙附近的光圈是危险程度，颜色越红表示机器人经过此地越危险。",[20,15178,15179],{},[32,15180],{"alt":34,"src":15181},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1768.webp",[20,15183,15184],{},[32,15185],{"alt":34,"src":15186},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1769.webp",[16,15188,15190],{"id":15189},"自主探索slam","自主探索SLAM",[20,15192,15193,15194,15197,15198,15201],{},"导航需要依赖于地图与定位，例如在上一节 ",[23,15195,15196],{},"导航功能集成"," 中，导航实现时就是以launch文件的方式集成了 ",[23,15199,15200],{},"定位AMCL"," 一节中的定位功能，而机器人SLAM时，也是发布地图数据与定位信息的，所以导航时也可以不借助于amcl而是直接与SLAM结合，达到自主探索的SLAM效果。",[20,15203,15204],{},[23,15205,15206],{},"1.编写launch文件",[20,15208,15209,15210,14666],{},"在功能包mycar_navigation2的launch目录下新建名为",[76,15211,15212],{},"auto_slam.launch.py",[70,15214,15216],{"className":1238,"code":15215,"language":1240,"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    # 从这开始修改: Jazzy auto_slam 引用 mycar_navigation2_jazzy，而不是 Humble 版本包\n    nav2_pkg = get_package_share_directory(\"mycar_navigation2_jazzy\")\n    # 从这结束\n\n    slam_toolbox_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                slam_toolbox_pkg,\n                'launch',\n                'online_sync_launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': use_sim_time\n        }.items(),\n        condition=IfCondition(\n            PythonExpression([\"'\", slam_backend, \"' == 'slam_toolbox'\"])\n        )\n    )\n\n    cartographer_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                cartographer_pkg,\n                'launch',\n                'cartographer.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': use_sim_time\n        }.items(),\n        condition=IfCondition(\n            PythonExpression([\"'\", slam_backend, \"' == 'cartographer'\"])\n        )\n    )\n\n    nav2_launch = IncludeLaunchDescription(\n        PythonLaunchDescriptionSource(\n            os.path.join(\n                nav2_pkg,\n                'launch',\n                'nav2.launch.py'\n            )\n        ),\n        launch_arguments={\n            'use_sim_time': use_sim_time\n        }.items()\n    )\n\n    ld = LaunchDescription()\n    ld.add_action(use_sim_time_arg)\n    ld.add_action(slam_backend_arg)\n    ld.add_action(slam_toolbox_launch)\n    ld.add_action(cartographer_launch)\n    ld.add_action(nav2_launch)\n    return ld\n\n",[76,15217,15218,15224,15228,15238,15242,15252,15262,15274,15284,15295,15299,15303,15311,15315,15323,15329,15337,15341,15345,15354,15361,15372,15381,15385,15389,15401,15415,15419,15432,15445,15450,15463,15468,15472,15481,15485,15489,15494,15500,15505,15509,15513,15521,15527,15532,15542,15559,15563,15567,15571,15580,15584,15588,15593,15599,15604,15608,15612,15620,15626,15630,15638,15651,15655,15659,15663,15671,15675,15679,15683,15689,15693,15697,15701,15709,15715,15719,15723,15727,15735,15740,15745,15750,15755,15760],{"__ignoreMap":34},[79,15219,15220,15222],{"class":81,"line":82},[79,15221,1247],{"class":99},[79,15223,1250],{"class":106},[79,15225,15226],{"class":81,"line":116},[79,15227,142],{"emptyLinePlaceholder":141},[79,15229,15230,15232,15234,15236],{"class":81,"line":138},[79,15231,1259],{"class":99},[79,15233,1310],{"class":106},[79,15235,1247],{"class":99},[79,15237,1315],{"class":106},[79,15239,15240],{"class":81,"line":145},[79,15241,142],{"emptyLinePlaceholder":141},[79,15243,15244,15246,15248,15250],{"class":81,"line":152},[79,15245,1259],{"class":99},[79,15247,1262],{"class":106},[79,15249,1247],{"class":99},[79,15251,1267],{"class":106},[79,15253,15254,15256,15258,15260],{"class":81,"line":164},[79,15255,1259],{"class":99},[79,15257,1274],{"class":106},[79,15259,1247],{"class":99},[79,15261,6047],{"class":106},[79,15263,15264,15266,15269,15271],{"class":81,"line":176},[79,15265,1259],{"class":99},[79,15267,15268],{"class":106}," launch.conditions ",[79,15270,1247],{"class":99},[79,15272,15273],{"class":106}," IfCondition\n",[79,15275,15276,15278,15280,15282],{"class":81,"line":181},[79,15277,1259],{"class":99},[79,15279,6064],{"class":106},[79,15281,1247],{"class":99},[79,15283,6069],{"class":106},[79,15285,15286,15288,15290,15292],{"class":81,"line":187},[79,15287,1259],{"class":99},[79,15289,1286],{"class":106},[79,15291,1247],{"class":99},[79,15293,15294],{"class":106}," LaunchConfiguration, PythonExpression\n",[79,15296,15297],{"class":81,"line":199},[79,15298,142],{"emptyLinePlaceholder":141},[79,15300,15301],{"class":81,"line":1350},[79,15302,142],{"emptyLinePlaceholder":141},[79,15304,15305,15307,15309],{"class":81,"line":1365},[79,15306,1324],{"class":99},[79,15308,1327],{"class":85},[79,15310,1330],{"class":106},[79,15312,15313],{"class":81,"line":1370},[79,15314,142],{"emptyLinePlaceholder":141},[79,15316,15317,15319,15321],{"class":81,"line":1381},[79,15318,3099],{"class":106},[79,15320,1338],{"class":99},[79,15322,1378],{"class":106},[79,15324,15325,15327],{"class":81,"line":1390},[79,15326,1384],{"class":89},[79,15328,1387],{"class":106},[79,15330,15331,15333,15335],{"class":81,"line":1404},[79,15332,1394],{"class":1393},[79,15334,1338],{"class":99},[79,15336,6126],{"class":89},[79,15338,15339],{"class":81,"line":1417},[79,15340,3252],{"class":106},[79,15342,15343],{"class":81,"line":1427},[79,15344,142],{"emptyLinePlaceholder":141},[79,15346,15347,15350,15352],{"class":81,"line":1435},[79,15348,15349],{"class":106},"    slam_backend_arg ",[79,15351,1338],{"class":99},[79,15353,1378],{"class":106},[79,15355,15356,15359],{"class":81,"line":1451},[79,15357,15358],{"class":89},"        'slam_backend'",[79,15360,1387],{"class":106},[79,15362,15363,15365,15367,15370],{"class":81,"line":1465},[79,15364,1394],{"class":1393},[79,15366,1338],{"class":99},[79,15368,15369],{"class":89},"'cartographer'",[79,15371,1387],{"class":106},[79,15373,15374,15376,15378],{"class":81,"line":1477},[79,15375,1407],{"class":1393},[79,15377,1338],{"class":99},[79,15379,15380],{"class":89},"'SLAM backend: slam_toolbox or cartographer'\n",[79,15382,15383],{"class":81,"line":1482},[79,15384,3252],{"class":106},[79,15386,15387],{"class":81,"line":1493},[79,15388,142],{"emptyLinePlaceholder":141},[79,15390,15391,15393,15395,15397,15399],{"class":81,"line":1504},[79,15392,1335],{"class":106},[79,15394,1338],{"class":99},[79,15396,1341],{"class":106},[79,15398,1344],{"class":89},[79,15400,1347],{"class":106},[79,15402,15403,15406,15408,15410,15413],{"class":81,"line":1510},[79,15404,15405],{"class":106},"    slam_backend ",[79,15407,1338],{"class":99},[79,15409,1341],{"class":106},[79,15411,15412],{"class":89},"'slam_backend'",[79,15414,1347],{"class":106},[79,15416,15417],{"class":81,"line":1521},[79,15418,142],{"emptyLinePlaceholder":141},[79,15420,15421,15424,15426,15428,15430],{"class":81,"line":1527},[79,15422,15423],{"class":106},"    slam_toolbox_pkg ",[79,15425,1338],{"class":99},[79,15427,9565],{"class":106},[79,15429,1445],{"class":89},[79,15431,1347],{"class":106},[79,15433,15434,15437,15439,15441,15443],{"class":81,"line":1540},[79,15435,15436],{"class":106},"    cartographer_pkg ",[79,15438,1338],{"class":99},[79,15440,9565],{"class":106},[79,15442,3217],{"class":89},[79,15444,1347],{"class":106},[79,15446,15447],{"class":81,"line":1553},[79,15448,15449],{"class":148},"    # 从这开始修改: Jazzy auto_slam 引用 mycar_navigation2_jazzy，而不是 Humble 版本包\n",[79,15451,15452,15454,15456,15458,15461],{"class":81,"line":1565},[79,15453,14805],{"class":106},[79,15455,1338],{"class":99},[79,15457,9565],{"class":106},[79,15459,15460],{"class":89},"\"mycar_navigation2_jazzy\"",[79,15462,1347],{"class":106},[79,15464,15465],{"class":81,"line":1578},[79,15466,15467],{"class":148},"    # 从这结束\n",[79,15469,15470],{"class":81,"line":1583},[79,15471,142],{"emptyLinePlaceholder":141},[79,15473,15474,15477,15479],{"class":81,"line":1594},[79,15475,15476],{"class":106},"    slam_toolbox_launch ",[79,15478,1338],{"class":99},[79,15480,6384],{"class":106},[79,15482,15483],{"class":81,"line":1599},[79,15484,6389],{"class":106},[79,15486,15487],{"class":81,"line":1605},[79,15488,6394],{"class":106},[79,15490,15491],{"class":81,"line":1611},[79,15492,15493],{"class":106},"                slam_toolbox_pkg,\n",[79,15495,15496,15498],{"class":81,"line":1617},[79,15497,6409],{"class":89},[79,15499,1387],{"class":106},[79,15501,15502],{"class":81,"line":1622},[79,15503,15504],{"class":89},"                'online_sync_launch.py'\n",[79,15506,15507],{"class":81,"line":2005},[79,15508,6421],{"class":106},[79,15510,15511],{"class":81,"line":2016},[79,15512,6426],{"class":106},[79,15514,15515,15517,15519],{"class":81,"line":2029},[79,15516,6431],{"class":1393},[79,15518,1338],{"class":99},[79,15520,6436],{"class":106},[79,15522,15523,15525],{"class":81,"line":2043},[79,15524,6441],{"class":89},[79,15526,9768],{"class":106},[79,15528,15529],{"class":81,"line":2056},[79,15530,15531],{"class":106},"        }.items(),\n",[79,15533,15534,15537,15539],{"class":81,"line":2070},[79,15535,15536],{"class":1393},"        condition",[79,15538,1338],{"class":99},[79,15540,15541],{"class":106},"IfCondition(\n",[79,15543,15544,15547,15550,15553,15556],{"class":81,"line":2081},[79,15545,15546],{"class":106},"            PythonExpression([",[79,15548,15549],{"class":89},"\"'\"",[79,15551,15552],{"class":106},", slam_backend, ",[79,15554,15555],{"class":89},"\"' == 'slam_toolbox'\"",[79,15557,15558],{"class":106},"])\n",[79,15560,15561],{"class":81,"line":2086},[79,15562,9802],{"class":106},[79,15564,15565],{"class":81,"line":2096},[79,15566,3252],{"class":106},[79,15568,15569],{"class":81,"line":2107},[79,15570,142],{"emptyLinePlaceholder":141},[79,15572,15573,15576,15578],{"class":81,"line":2119},[79,15574,15575],{"class":106},"    cartographer_launch ",[79,15577,1338],{"class":99},[79,15579,6384],{"class":106},[79,15581,15582],{"class":81,"line":2124},[79,15583,6389],{"class":106},[79,15585,15586],{"class":81,"line":2135},[79,15587,6394],{"class":106},[79,15589,15590],{"class":81,"line":2145},[79,15591,15592],{"class":106},"                cartographer_pkg,\n",[79,15594,15595,15597],{"class":81,"line":2156},[79,15596,6409],{"class":89},[79,15598,1387],{"class":106},[79,15600,15601],{"class":81,"line":2161},[79,15602,15603],{"class":89},"                'cartographer.launch.py'\n",[79,15605,15606],{"class":81,"line":2175},[79,15607,6421],{"class":106},[79,15609,15610],{"class":81,"line":2188},[79,15611,6426],{"class":106},[79,15613,15614,15616,15618],{"class":81,"line":2193},[79,15615,6431],{"class":1393},[79,15617,1338],{"class":99},[79,15619,6436],{"class":106},[79,15621,15622,15624],{"class":81,"line":2207},[79,15623,6441],{"class":89},[79,15625,9768],{"class":106},[79,15627,15628],{"class":81,"line":2221},[79,15629,15531],{"class":106},[79,15631,15632,15634,15636],{"class":81,"line":2235},[79,15633,15536],{"class":1393},[79,15635,1338],{"class":99},[79,15637,15541],{"class":106},[79,15639,15640,15642,15644,15646,15649],{"class":81,"line":2246},[79,15641,15546],{"class":106},[79,15643,15549],{"class":89},[79,15645,15552],{"class":106},[79,15647,15648],{"class":89},"\"' == 'cartographer'\"",[79,15650,15558],{"class":106},[79,15652,15653],{"class":81,"line":2256},[79,15654,9802],{"class":106},[79,15656,15657],{"class":81,"line":6478},[79,15658,3252],{"class":106},[79,15660,15661],{"class":81,"line":6484},[79,15662,142],{"emptyLinePlaceholder":141},[79,15664,15665,15667,15669],{"class":81,"line":6490},[79,15666,14893],{"class":106},[79,15668,1338],{"class":99},[79,15670,6384],{"class":106},[79,15672,15673],{"class":81,"line":9976},[79,15674,6389],{"class":106},[79,15676,15677],{"class":81,"line":9988},[79,15678,6394],{"class":106},[79,15680,15681],{"class":81,"line":10000},[79,15682,14910],{"class":106},[79,15684,15685,15687],{"class":81,"line":10011},[79,15686,6409],{"class":89},[79,15688,1387],{"class":106},[79,15690,15691],{"class":81,"line":10022},[79,15692,14921],{"class":89},[79,15694,15695],{"class":81,"line":10031},[79,15696,6421],{"class":106},[79,15698,15699],{"class":81,"line":10037},[79,15700,6426],{"class":106},[79,15702,15703,15705,15707],{"class":81,"line":10046},[79,15704,6431],{"class":1393},[79,15706,1338],{"class":99},[79,15708,6436],{"class":106},[79,15710,15711,15713],{"class":81,"line":10051},[79,15712,6441],{"class":89},[79,15714,9768],{"class":106},[79,15716,15717],{"class":81,"line":10061},[79,15718,6452],{"class":106},[79,15720,15721],{"class":81,"line":10077},[79,15722,3252],{"class":106},[79,15724,15725],{"class":81,"line":10082},[79,15726,142],{"emptyLinePlaceholder":141},[79,15728,15729,15731,15733],{"class":81,"line":10087},[79,15730,1586],{"class":106},[79,15732,1338],{"class":99},[79,15734,1591],{"class":106},[79,15736,15737],{"class":81,"line":10092},[79,15738,15739],{"class":106},"    ld.add_action(use_sim_time_arg)\n",[79,15741,15742],{"class":81,"line":10102},[79,15743,15744],{"class":106},"    ld.add_action(slam_backend_arg)\n",[79,15746,15747],{"class":81,"line":10114},[79,15748,15749],{"class":106},"    ld.add_action(slam_toolbox_launch)\n",[79,15751,15752],{"class":81,"line":10126},[79,15753,15754],{"class":106},"    ld.add_action(cartographer_launch)\n",[79,15756,15757],{"class":81,"line":10137},[79,15758,15759],{"class":106},"    ld.add_action(nav2_launch)\n",[79,15761,15762,15764],{"class":81,"line":10148},[79,15763,1625],{"class":99},[79,15765,1628],{"class":106},[20,15767,15768],{},[23,15769,15770],{},"2.编译",[20,15772,2313],{},[70,15774,15775],{"className":72,"code":15024,"language":74,"meta":34,"style":34},[76,15776,15777],{"__ignoreMap":34},[79,15778,15779,15781,15783,15785],{"class":81,"line":82},[79,15780,2323],{"class":85},[79,15782,2326],{"class":89},[79,15784,2329],{"class":1219},[79,15786,15037],{"class":89},[20,15788,15789],{},[23,15790,15791],{},"3.执行",[20,15793,4003],{},[70,15795,15796],{"className":72,"code":2345,"language":74,"meta":34,"style":34},[76,15797,15798,15804],{"__ignoreMap":34},[79,15799,15800,15802],{"class":81,"line":82},[79,15801,2352],{"class":1219},[79,15803,2355],{"class":89},[79,15805,15806,15808,15810,15812],{"class":81,"line":116},[79,15807,1207],{"class":85},[79,15809,2362],{"class":89},[79,15811,2365],{"class":89},[79,15813,2368],{"class":89},[20,15815,15816],{},"（2）然后在终端下进入当前工作空间，输入如下指令启动自主SLAM功能：",[70,15818,15820],{"className":72,"code":15819,"language":74,"meta":34,"style":34},". install\u002Fsetup.bash\nros2 launch mycar_navigation2 auto_slam.launch.py use_sim_time:=True slam_backend:=cartographer\n",[76,15821,15822,15828],{"__ignoreMap":34},[79,15823,15824,15826],{"class":81,"line":82},[79,15825,2352],{"class":1219},[79,15827,2355],{"class":89},[79,15829,15830,15832,15834,15836,15839,15842],{"class":81,"line":116},[79,15831,1207],{"class":85},[79,15833,2362],{"class":89},[79,15835,9367],{"class":89},[79,15837,15838],{"class":89}," auto_slam.launch.py",[79,15840,15841],{"class":89}," use_sim_time:=True",[79,15843,15844],{"class":89}," slam_backend:=cartographer\n",[20,15846,15094,15847,15098,15849,15851,15852,15854],{},[76,15848,15097],{},[76,15850,15101],{},"文件，再通过菜单栏的",[76,15853,15105],{},"设置目标点，机器人就可以自动导航至目标点，并且导航中还会实现建图的功能。",[70,15856,15857],{"className":72,"code":15109,"language":74,"meta":34,"style":34},[76,15858,15859],{"__ignoreMap":34},[79,15860,15861,15863,15865],{"class":81,"line":82},[79,15862,15116],{"class":85},[79,15864,15119],{"class":1219},[79,15866,15122],{"class":89},[20,15868,15869],{},[32,15870],{"alt":34,"src":15871},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1770.webp",[20,15873,15874],{},[32,15875],{"alt":34,"src":15876},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1771.webp",[12,15878,15879],{"id":15879},"多车编队",[20,15881,15882],{},"多车编队技术通过先进的传感器、实时数据分析和高度智能化的控制系统，使得一组车辆能够在没有人工干预的情况下实现协同运行，作为一种先进的智能交通系统应用，已经在多个领域展现出其巨大的潜力和广泛的应用场景。比如：",[339,15884,15885,15888,15891],{},[20,15886,15887],{},"时间优化：多车编队技术消除了人为操作中的误差和延误，降低了人力资源成本和运营风险。",[20,15889,15890],{},"空间优化：多车编队技术可以减少车辆间的空隙，最大化道路利用率。",[20,15892,15893],{},"性能优化：密集编队行驶减少了空气动力学阻力，降低了能耗和燃料消耗。",[20,15895,15896],{},"总之，多车编队技术在机器人领域有着独特的作用和价值。本节将介绍如何在ROS2中实现多车编队。",[15898,15899,15900],"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":15902},[15903,15904,15905,15906,15907,15908],{"id":14,"depth":138,"text":14},{"id":298,"depth":138,"text":299},{"id":4071,"depth":138,"text":4071},{"id":5522,"depth":138,"text":5523},{"id":7116,"depth":138,"text":7116},{"id":15879,"depth":138,"text":15879},"1200-0100","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-0100-humble-ban-ben",{"title":5,"description":34},"wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-Humble版本","BHmCdKR46DLr7FEi_qhwX4dDuxlKy4_98cf4EXQYZ4g",[15922,15929,15935,15941,15947,15953,15959,15965,15971,15977,15983,15989,15995,16001,16007,16013,16015,16021,16027,16033,16039,16045,16051,16057,16063,16069,16075,16081,16087,16093,16099,16105,16111,16117,16123,16128,16134,16139,16145,16151,16157,16163,16169,16175,16181,16187,16193,16199,16205,16211,16217,16223,16229,16235,16241,16247,16253,16259,16265,16271,16277,16283,16289,16295,16301,16307,16313,16319,16325],{"path":15923,"stem":15924,"title":15925,"authors":15926,"date":15910,"chapterOrder":15927,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0100-ros2-jie-shao","wiki\u002F2023-12-30-ros2-tutorial\u002F0100-ROS2介绍","ROS2介绍",[7],"0100",0,{"path":15930,"stem":15931,"title":15932,"authors":15933,"date":15910,"chapterOrder":15934,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0200-ru-men-cao-zuo","wiki\u002F2023-12-30-ros2-tutorial\u002F0200-入门操作","入门操作",[7],"0200",{"path":15936,"stem":15937,"title":15938,"authors":15939,"date":15910,"chapterOrder":15940,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":15942,"stem":15943,"title":15944,"authors":15945,"date":15910,"chapterOrder":15946,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0400-si-da-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F0400-四大通信","四大通信",[7],"0400",{"path":15948,"stem":15949,"title":15950,"authors":15951,"date":15910,"chapterOrder":15952,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":15954,"stem":15955,"title":15956,"authors":15957,"date":15910,"chapterOrder":15958,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0600-launch","wiki\u002F2023-12-30-ros2-tutorial\u002F0600-Launch","Launch",[7],"0600",{"path":15960,"stem":15961,"title":15962,"authors":15963,"date":15910,"chapterOrder":15964,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0700-hui-su-rosbag2","wiki\u002F2023-12-30-ros2-tutorial\u002F0700-回溯rosbag2","回溯rosbag2",[7],"0700",{"path":15966,"stem":15967,"title":15968,"authors":15969,"date":15910,"chapterOrder":15970,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0800-zuo-biao-bian-huan-tf","wiki\u002F2023-12-30-ros2-tutorial\u002F0800-坐标变换TF","坐标变换TF",[7],"0800",{"path":15972,"stem":15973,"title":15974,"authors":15975,"date":15910,"chapterOrder":15976,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":15978,"stem":15979,"title":15980,"authors":15981,"date":15910,"chapterOrder":15982,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":15984,"stem":15985,"title":15986,"authors":15987,"date":15910,"chapterOrder":15988,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-gazeboclassic","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-GazeboClassic","Gezebo Classic",[7],"1100-0100",{"path":15990,"stem":15991,"title":15992,"authors":15993,"date":15910,"chapterOrder":15994,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":15996,"stem":15997,"title":15998,"authors":15999,"date":15910,"chapterOrder":16000,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16002,"stem":16003,"title":16004,"authors":16005,"date":15910,"chapterOrder":16006,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16008,"stem":16009,"title":16010,"authors":16011,"date":15910,"chapterOrder":16012,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-gezebo-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-Gezebo仿真平台","Gezebo仿真平台",[7],"1100",{"path":15917,"stem":15919,"title":5,"authors":16014,"date":15910,"chapterOrder":15909,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},[7],{"path":16016,"stem":16017,"title":16018,"authors":16019,"date":15910,"chapterOrder":16020,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-jazzy-ban-ben","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-Jazzy版本","Jazzy导航仿真",[7],"1200-0200",{"path":16022,"stem":16023,"title":16024,"authors":16025,"date":15910,"chapterOrder":16026,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-humble2jazzy","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-Humble2Jazzy","Humble与Jazzy导航的差异",[7],"1200-0300",{"path":16028,"stem":16029,"title":16030,"authors":16031,"date":15910,"chapterOrder":16032,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16034,"stem":16035,"title":16036,"authors":16037,"date":15910,"chapterOrder":16038,"chapterDepth":138,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16040,"stem":16041,"title":16042,"authors":16043,"date":15910,"chapterOrder":16044,"chapterDepth":138,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16046,"stem":16047,"title":16048,"authors":16049,"date":15910,"chapterOrder":16050,"chapterDepth":138,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16052,"stem":16053,"title":16054,"authors":16055,"date":15910,"chapterOrder":16056,"chapterDepth":138,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16058,"stem":16059,"title":16060,"authors":16061,"date":15910,"chapterOrder":16062,"chapterDepth":138,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16064,"stem":16065,"title":16066,"authors":16067,"date":15910,"chapterOrder":16068,"chapterDepth":138,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16070,"stem":16071,"title":16072,"authors":16073,"date":15910,"chapterOrder":16074,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16076,"stem":16077,"title":16078,"authors":16079,"date":15910,"chapterOrder":16080,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16082,"stem":16083,"title":16084,"authors":16085,"date":15910,"chapterOrder":16086,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16088,"stem":16089,"title":16090,"authors":16091,"date":15910,"chapterOrder":16092,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16094,"stem":16095,"title":16096,"authors":16097,"date":15910,"chapterOrder":16098,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16100,"stem":16101,"title":16102,"authors":16103,"date":15910,"chapterOrder":16104,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16106,"stem":16107,"title":16108,"authors":16109,"date":15910,"chapterOrder":16110,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16112,"stem":16113,"title":16114,"authors":16115,"date":15910,"chapterOrder":16116,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16118,"stem":16119,"title":16120,"authors":16121,"date":15910,"chapterOrder":16122,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16124,"stem":16125,"title":16090,"authors":16126,"date":15910,"chapterOrder":16127,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16129,"stem":16130,"title":16131,"authors":16132,"date":15910,"chapterOrder":16133,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16135,"stem":16136,"title":16090,"authors":16137,"date":15910,"chapterOrder":16138,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16140,"stem":16141,"title":16142,"authors":16143,"date":15910,"chapterOrder":16144,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16146,"stem":16147,"title":16148,"authors":16149,"date":15910,"chapterOrder":16150,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-linux-ying-jian-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-Linux硬件通信","Linux硬件通信",[7],"1300",{"path":16152,"stem":16153,"title":16154,"authors":16155,"date":15910,"chapterOrder":16156,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16158,"stem":16159,"title":16160,"authors":16161,"date":15910,"chapterOrder":16162,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16164,"stem":16165,"title":16166,"authors":16167,"date":15910,"chapterOrder":16168,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16170,"stem":16171,"title":16172,"authors":16173,"date":15910,"chapterOrder":16174,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16176,"stem":16177,"title":16178,"authors":16179,"date":15910,"chapterOrder":16180,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16182,"stem":16183,"title":16184,"authors":16185,"date":15910,"chapterOrder":16186,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16188,"stem":16189,"title":16190,"authors":16191,"date":15910,"chapterOrder":16192,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-you-hua-ri-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-优化日志","优化日志",[7],"1400-0500",{"path":16194,"stem":16195,"title":16196,"authors":16197,"date":15910,"chapterOrder":16198,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16200,"stem":16201,"title":16202,"authors":16203,"date":15910,"chapterOrder":16204,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16206,"stem":16207,"title":16208,"authors":16209,"date":15910,"chapterOrder":16210,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16212,"stem":16213,"title":16214,"authors":16215,"date":15910,"chapterOrder":16216,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16218,"stem":16219,"title":16220,"authors":16221,"date":15910,"chapterOrder":16222,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16224,"stem":16225,"title":16226,"authors":16227,"date":15910,"chapterOrder":16228,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16230,"stem":16231,"title":16232,"authors":16233,"date":15910,"chapterOrder":16234,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16236,"stem":16237,"title":16238,"authors":16239,"date":15910,"chapterOrder":16240,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-ying-jian-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-硬件平台","硬件平台",[7],"1400-0600",{"path":16242,"stem":16243,"title":16244,"authors":16245,"date":15910,"chapterOrder":16246,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16248,"stem":16249,"title":16250,"authors":16251,"date":15910,"chapterOrder":16252,"chapterDepth":138,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16254,"stem":16255,"title":16256,"authors":16257,"date":15910,"chapterOrder":16258,"chapterDepth":138,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16260,"stem":16261,"title":16262,"authors":16263,"date":15910,"chapterOrder":16264,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16266,"stem":16267,"title":16268,"authors":16269,"date":15910,"chapterOrder":16270,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16272,"stem":16273,"title":16274,"authors":16275,"date":15910,"chapterOrder":16276,"chapterDepth":116,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16278,"stem":16279,"title":16280,"authors":16281,"date":15910,"chapterOrder":16282,"chapterDepth":82,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16284,"stem":16285,"title":16286,"authors":16287,"date":15910,"chapterOrder":16288,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-ji-qi-ren-ying-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-机器人硬件","机器人硬件",[7],"1400",{"path":16290,"stem":16291,"title":16292,"authors":16293,"date":15910,"chapterOrder":16294,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1500-ros2-control","wiki\u002F2023-12-30-ros2-tutorial\u002F1500-ROS2_Control","ROS2_Control",[7],"1500",{"path":16296,"stem":16297,"title":16298,"authors":16299,"date":15910,"chapterOrder":16300,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16302,"stem":16303,"title":16304,"authors":16305,"date":15910,"chapterOrder":16306,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\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":16308,"stem":16309,"title":16310,"authors":16311,"date":15910,"chapterOrder":16312,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1800-microros","wiki\u002F2023-12-30-ros2-tutorial\u002F1800-MicroROS","MicroROS",[7],"1800",{"path":16314,"stem":16315,"title":16316,"authors":16317,"date":15910,"chapterOrder":16318,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1900-webots-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1900-Webots仿真平台","Webots仿真平台",[7],"1900",{"path":16320,"stem":16321,"title":16322,"authors":16323,"date":15910,"chapterOrder":16324,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":15915},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F2000-opencv","wiki\u002F2023-12-30-ros2-tutorial\u002F2000-OpenCV","OpenCV",[7],"2000",{"path":15912,"stem":16326,"title":16327,"authors":16328,"date":15910,"chapterOrder":16329,"chapterDepth":15928,"docKey":15911,"docRoot":15912,"docTitle":15913,"isWikiDoc":141,"isWikiIndex":141},"wiki\u002F2023-12-30-ros2-tutorial\u002Findex","ROS2机器人操作系统教程",[7],null,[16331,16333,16336,16339],{"name":7,"image":16332},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":16334,"image":16335},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":16337,"image":16338},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":16340,"image":16341},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431902530]