边建图边导航(SLAM)
本文档介绍如何在 Nav2 中使用 SLAM。 教程将演示如何生成占用栅格地图(occupancy grid map),并利用 Nav2 控制机器人在环境中移动。 内容同时适用于仿真环境和物理机器人,演示以物理机器人为例。
开始本教程前,强烈建议先阅读快速入门,尤其是初次接触 ROS 和 Navigation2 的用户。
本教程使用 SLAM Toolbox,更多详情可参考 ROSCon 上关于 SLAM Toolbox 的演讲。
需安装 Navigation2、Turtlebot3 和 SLAM Toolbox。 如果尚未安装,请按照快速入门进行操作。
首先,加载 ROS 2 环境变量:
source /opt/ros/<ros2-distro>/setup.bash可通过以下命令安装 SLAM Toolbox:
sudo apt install ros-$ROS_DISTRO-slam-toolbox也可在工作空间中从源码构建:
git clone -b $ROS_DISTRO-devel git@github.com:stevemacenski/slam_toolbox.git0- 启动机器人接口
Section titled “0- 启动机器人接口”本教程使用 TurtleBot3。 可从 turtlebot3 仓库 获取,或通过以下命令安装:
首先,加载 ROS 2 环境变量:
source /opt/ros/<ros2-distro>/setup.bash然后安装 Turtlebot3 软件包:
sudo apt install ros-$ROS_DISTRO-turtlebot3 ros-$ROS_DISTRO-turtlebot3-msgs ros-$ROS_DISTRO-turtlebot3-bringup如果使用其他机器人,请替换为对应的机器人接口。 通常包括:URDF 机器人状态发布器(robot state publisher)、仿真或物理机器人接口、控制器、安全节点等。
本教程中,每次打开新终端时请先运行以下命令:
source /opt/ros/<ros2-distro>/setup.bashexport TURTLEBOT3_MODEL=waffle
启动机器人接口和机器人状态发布器,例如:
ros2 launch turtlebot3_bringup robot.launch.py
1- 启动 Navigation2
Section titled “1- 启动 Navigation2”启动导航,无需加载 nav2_amcl 和 nav2_map_server。
SLAM 节点会向 /map 话题发布地图,并提供 map->odom 变换。
ros2 launch nav2_bringup navigation_launch.py
2- 启动 SLAM
Section titled “2- 启动 SLAM”启动你选用的 SLAM 实现,确保其提供 map->odom 变换和 /map 话题。
打开 RViz 并添加需要可视化的话题,如 /map、/tf、/laserscan 等。
本教程使用 SLAM Toolbox。
ros2 launch slam_toolbox online_async_launch.py
3- 使用 SLAM 建图
Section titled “3- 使用 SLAM 建图”通过 RViz 或 ROS 2 CLI 发送目标位姿来驱动机器人移动,例如:
ros2 topic pub /goal_pose geometry_msgs/PoseStamped "{header: {stamp: {sec: 0}, frame_id: 'map'}, pose: {position: {x: 0.2, y: 0.0, z: 0.0}, orientation: {w: 1.0}}}"此时应能看到地图实时更新。要将地图保存到文件:
ros2 run nav2_map_server map_saver_cli -f ~/map

4- 简化入门流程
Section titled “4- 简化入门流程”如果只需在 TurtleBot3 快速入门的沙盒世界中运行 SLAM,也可以通过启动配置直接启用。
无需分别启动接口、导航和 SLAM,继续使用 tb3_simulation_launch.py 并将 slam 参数设为 true 即可。
前面的步骤适用于在自己的机器人上运行 SLAM 的场景——这类机器人通常有独立的仿真/机器人接口和导航启动文件,而 tb3_simulation_launch.py 出于测试便利将它们整合在一起。
ros2 launch nav2_bringup tb3_simulation_launch.py slam:=True