【ROS2】 导航实战:从 SLAM 建图到 Nav2 自主巡航的完整指南(附路径避坑)
【ROS2】 导航实战从 SLAM 建图到 Nav2 自主巡航的完整指南附路径避坑在 ROS2 机器人开发中很多初学者都会经历一个“至暗时刻”明明刚刚用 SLAM 完美地扫描了地图为什么一切换到导航模式RViz 里就是一片空白或者疯狂报错frame map does not exist其实这往往不是代码写错了而是对“先建图后导航”的工作流理解不够透彻加上一个小小的路径设置习惯导致的。今天我们就来彻底打通这两个环节让你一次跑通全流程️ 核心逻辑为什么必须分两步走很多新手会问“建图和导航不能一起开吗”答案是可以但在实际工程中我们通常将它们解耦。SLAM 阶段探索者模式任务拿着激光雷达在未知环境里转一圈把墙壁、障碍物扫描出来生成一张静态的“底图”。产出.pgm图片和.yaml配置文件。比喻就像探险家第一次进入迷宫边走边画地图。这时候机器人只知道“哪里有墙”但不知道“我要去哪”。Nav2 导航阶段快递员模式任务加载刚才那张静态地图利用 AMCL 算法在地图上确定自己当前的位置定位然后规划出一条从 A 点到 B 点的路径。前提地图必须是静止的且机器人必须知道自己在哪里。比喻就像拿着刚才画好的地图去送快递。你需要先确认自己在地图上的哪个点定位然后规划路线避开障碍物走到目的地。黄金法则绝对路径的正确姿势当你完成了第一步保存了地图准备开始第二步时最容易翻车。错误示范 1使用相对路径ros2 launch turtlebot3_navigation2 navigation2.launch.py map:my_map.yaml风险点这种写法依赖于你当前终端所在的工作目录。如果你在/home/liurui/下运行系统能找到但如果你不小心cd到了/home/liurui/ros2_ws/src系统就会去这里找找不到就会报错。错误示范 2使用~波浪号ros2 launch turtlebot3_navigation2 navigation2.launch.py map:~/my_map.yaml风险点虽然~在 Linux 终端里能自动识别为你的主目录但在 ROS2 的 launch 文件底层解析时它往往不认这个符号。系统会把它当成一个普通的文件夹名字去寻找结果自然是找不到文件直接报错。正确示范使用完整的绝对路径ros2 launch turtlebot3_navigation2 navigation2.launch.py map:/home/liurui/my_map.yaml优势从根目录/开始索引指向唯一确定的位置。无论你的终端当前在哪个文件夹Nav2 都能准确读取到你的地图文件。这是保证工程稳定性的第一步。️ 实操演练从保存地图到成功导航第一步清理旧环境非常重要SLAM 和 Nav2 是两套不同的算法逻辑。在切换模式前必须进行“大扫除”关闭所有旧的终端窗口。关闭 Gazebo 和 RViz。推荐在终端输入killall gzserver gzclient rviz2确保后台没有残留进程。第二步启动仿真世界打开新终端启动 GazeboexportTURTLEBOT3_MODELburger ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py第三步加载地图并启动导航打开第二个终端使用完整的绝对路径启动 Nav2exportTURTLEBOT3_MODELburger ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:true map:/home/liurui/my_map.yaml注意use_sim_time:true告诉导航系统使用 Gazebo 的仿真时间这一步绝对不能省否则时间戳对不上导航直接瘫痪。第四步解决 “Global Status: Error”最关键的一步当 RViz 弹出后你可能会发现地图出来了但左下角显示Navigation: unknown甚至顶部有红色报错。原因机器人虽然有了地图但它是个“瞎子”它不知道自己在这张地图的哪个位置。解决方法点击 RViz 顶部工具栏的“2D Pose Estimate”绿色箭头图标。观察 Gazebo 中机器人的实际位置和朝向。在 RViz 的地图上找到对应位置按住鼠标左键拖动一下方向要与机器人车头一致然后松开。此时你会看到一堆红色粒子AMCL 定位云如果粒子开始收敛聚集说明定位成功红色的 Error 也会随之消失。总结从 SLAM 到 Nav2本质上是从“创造地图”到“使用地图”的过程。流程上务必先保存好.yaml和.pgm重启环境后再加载导航。操作上养成使用完整绝对路径的习惯杜绝因目录切换或波浪号解析导致的文件丢失。调试上遇到报错不要慌先检查2D Pose Estimate给机器人一个初始位置往往能解决 90% 的问题。