【ROS2】 导航实战:从 SLAM 建图到 Nav2 自主巡航的完整指南(附路径避坑)

在 ROS2 机器人开发中,很多初学者都会经历一个“至暗时刻”:明明刚刚用 SLAM 完美地扫描了地图,为什么一切换到导航模式,RViz 里就是一片空白,或者疯狂报错 frame 'map' does not exist

其实,这往往不是代码写错了,而是对 “先建图,后导航” 的工作流理解不够透彻,加上一个小小的路径设置习惯导致的。今天我们就来彻底打通这两个环节,让你一次跑通全流程!

️ 核心逻辑:为什么必须分两步走?

很多新手会问:“建图和导航不能一起开吗?”
答案是:可以,但在实际工程中,我们通常将它们解耦。

  1. SLAM 阶段(探索者模式)

    • 任务:拿着激光雷达在未知环境里转一圈,把墙壁、障碍物扫描出来,生成一张静态的“底图”。
    • 产出.pgm(图片)和 .yaml(配置文件)。
    • 比喻:就像探险家第一次进入迷宫,边走边画地图。这时候机器人只知道“哪里有墙”,但不知道“我要去哪”。
  2. 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 是两套不同的算法逻辑。在切换模式前,必须进行“大扫除”:

  1. 关闭所有旧的终端窗口。
  2. 关闭 Gazebo 和 RViz。
  3. (推荐)在终端输入 killall gzserver gzclient rviz2 确保后台没有残留进程。

第二步:启动仿真世界
打开新终端,启动 Gazebo:

export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

第三步:加载地图并启动导航
打开第二个终端,使用完整的绝对路径启动 Nav2:

export TURTLEBOT3_MODEL=burger
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,甚至顶部有红色报错。
原因:机器人虽然有了地图,但它是个“瞎子”,它不知道自己在这张地图的哪个位置。

解决方法

  1. 点击 RViz 顶部工具栏的 “2D Pose Estimate”(绿色箭头图标)。
  2. 观察 Gazebo 中机器人的实际位置和朝向。
  3. 在 RViz 的地图上找到对应位置,按住鼠标左键拖动一下(方向要与机器人车头一致),然后松开。
  4. 此时你会看到一堆红色粒子(AMCL 定位云),如果粒子开始收敛聚集,说明定位成功,红色的 Error 也会随之消失。
总结

从 SLAM 到 Nav2,本质上是从 “创造地图”“使用地图” 的过程。

  • 流程上:务必先保存好 .yaml.pgm,重启环境后再加载导航。
  • 操作上:养成使用完整绝对路径的习惯,杜绝因目录切换或波浪号解析导致的文件丢失。
  • 调试上:遇到报错不要慌,先检查 2D Pose Estimate,给机器人一个初始位置,往往能解决 90% 的问题。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐