ROS2 建图与导航:Slam_toolbox、Nav2实践

🕒 2025-09-19 📁 ROS系统 👤 laumy 🔥 24 热度

地图构建

在 ROS2 中,地图构建常用 SLAM(Simultaneous Localization and Mapping) 技术。其大概流程是:

  • 传感器采集数据:可使用激光雷达(2D/3D LiDAR)或相机(VSLAM)
  • 里程计信息:来自机器人轮式里程计/IMU
  • SLAM算法处理:融合传感器数据+里程计,估计机器人位姿同时构建环境栅格地图。
  • 地图表示:最终生成map.pgm(图像)+map.yaml(参数配置)

SLAM简单理解就是让机器人在一个陌生的环境能够自主定位和地图构建,常用的ROS2建图工具有:

  • slam_toolbox:ROS2官方推荐,支持在线建图(机器人移动时建图)、离线建图(先存bag后生成地图)、增量式建图(可保存后编辑地图)。
  • cartographer_ros:google出品,实时性能好,但配置较复杂。
  • RTAB-Map:可用于视觉/激光SLAM,支持3D。

slam_toolbox

先来简单看看slam_toolbox的流程,其输入为/scan(激光雷达点云)、/odom(里程计)、/tf(坐标变换)三个话题;经过处理后输出/map(占据栅格地图nav_msgs/OccupancyGrid格式)、/tf(发布map->odom的变换用于定位)。

(1)安装依赖包

sudo apt install ros-{ROS_DISTRO}-slam-toolbox
sudo apt install ros-{ROS_DISTRO}-turtlebot3*

上面的命令第一条命令安装slam_toolbox算法库,其支持在线建图/离线建图/增量式建图,包含的内容有online_async_launch.py(在线异步建图)、online_sync_launch.py(在线同步建图)、offline_launch.py(离线建图),提供的节点有async_slam_toolbox_node、sync_slam_toolbox_node。

第二条命令是安装TurtleBot3 全套支持包,主要是提供机器人模型+仿真环境+驱动+可视化,主要包含的子包有turtlebot3_description(URDF机器人模型)、turtlebot3_gazebo(Gazebo 仿真环境)、turtlebot3_bringup(真机启动配置)、turtlebot3_teleop(键盘遥控程序)、turtlebot3_cartographer(Cartographer 建图的配置)、turtlebot3_navigation2(Nav2 配置文件)

使用turtlebot3要添加环境变量。

echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
source ~/.bashrc

(2)启动Gazebo仿真环境

ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py

启动之后就看到上图的环境了。启动后创建了以下节点

laumy@ThinkBook-14-G7-IAH:~$ ros2 node list
/robot_state_publisher
/ros_gz_bridge
  • /robot_state_publisher:根据 URDF 模型发布机器人各个 link 的 TF 变换。输入为/joint_states,输出为/tf, /tf_static。
  • /ros_gz_bridge:桥接 Gazebo (Ignition/Harmonic) 与 ROS2。将 Gazebo 插件产生的数据转成 ROS2 话题,比如 /odom、/scan、/imu。也把 ROS2 的 /cmd_vel 控制命令转发到 Gazebo 控制插件。

以下话题

laumy@ThinkBook-14-G7-IAH:~$ ros2 topic list
/clock
/cmd_vel
/imu
/joint_states
/odom
/parameter_events
/robot_description
/rosout
/scan
/tf
/tf_static
  • /clock:仿真时间(来自 Gazebo)
  • /cmd_vel : 速度控制输入(你发指令控制机器人时用)
  • /imu : IMU 传感器数据(加速度、角速度)
  • /joint_states : 关节状态(机器人轮子转角/速度)
  • /odom : 里程计数据(机器人相对位姿估计)
  • /scan : 激光雷达数据(2D 激光点云)
  • /tf, /tf_static : 坐标变换(map/odom/base_link/laser 等)
  • /robot_description : 机器人模型(URDF 内容)
  • /rosout, /parameter_events : 系统日志和参数事件(ROS2 通用)

总体的数据流如下图

(3)运行slam_toolbox建图

ros2 launch slam_toolbox online_async_launch.py use_sim_time:=True

online_async_launch.py 表示使用异步建图(适合实时建图),use_sim_time:=True 使用 Gazebo 的仿真时间。

运行上面命令已经开始在建图了。

(4)RViz可视化

ros2 run rviz2 rviz2

在RViz中进行设置

  • Fixed Frame:设置为map
  • 添加插件:Map(话题/map)、LaserScan(话题/scan)

(5)控制机器人移动

ros2 run turtlebot3_teleop teleop_keyboard

用键盘方向键让机器人在环境里转一圈,地图会逐渐补全。

Control Your TurtleBot3!
---------------------------
Moving around:
        w
   a    s    d
        x

这个节点会根据键盘的输入发布消息到

/cmd_vel   [geometry_msgs/msg/Twist]

(6)地图保存

ros2 run nav2_map_server map_saver_cli

会把内存中的/map话题保存生成map.pgm和map.yaml两个文件,以便后续的导航Nav2使用。生成在当前执行命令的目录下。

laumy@ThinkBook-14-G7-IAH:~/map$ tree
.
├── map_1758272082.pgm
└── map_1758272082.yaml

1 directory, 2 files

Cartographer

待补充

RTAB

待补充

自主导航

目前导航使用比较多的是Nav2,框架如下。

其主要流程可以分为4大部分

  • 感知输入:输入激光雷达/scan、里程计/odom、TF(map->odom->base_link)、地图/map。
  • 定位:使用AMCL(Adaptive Monte Carlo Localization),在已有的地图中定位机器人位置,发布map->odom的TF。
  • 规划:全局规划器 (planner_server)从当前位置到目标点,规划一条全局路径(比如 A*、Dijkstra、NavFn)。局部规划器 (controller_server):根据实时传感器数据,计算机器人下一步的速度指令 /cmd_vel(如 DWB controller)。
  • 执行调度:行为树 (bt_navigator)管理整个任务流程定位 → 规划 → 控制 → 到达目标。恢复器 (recoveries_server)遇到障碍或失败时执行恢复动作(原地旋转、清理代价地图)。

安装

sudo apt update
sudo apt install ros-{ROS_DISTRO}-navigation2
sudo apt install ros-{ROS_DISTRO}-nav2-bringup

启动导航

先启动仿真环境,这里使用world地图不用house了。

ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

再启动导航,需要指定地图。

ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=/home/laumy/map/map_1758275883.yaml

设定导航

(1)设定机器人位置

在 RViz 工具栏选择 2D Pose Estimate 工具。在地图上点击机器人所在位置,拖动鼠标设定朝向。RViz 会往 /initialpose 话题发布一条消息,AMCL 接收到后,就会生成 map → odom 的 TF。

(2)设定目标位置

这样机器人就会自动移动到目标点。

发表你的看法

\t