5.使用SLAM_TOOLBOX完成建图

写在前面

  1. 当前平台文章汇总地址:ROS2机器人从入门到实战
  2. 获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取
  3. 教程配套机器人开发平台:两驱版| 四驱版
  4. 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn

SLAM 是通过传感器获取环境信息然后进行定位和建图。在 ROS 2 中,提供了很多的 SLAM 功能包,比如 slam_toolbox,cartographer_ros 和 rtabmap_slam 等。针对二维场景,其中 slam_toolbox 开箱即用,上手较为简单,就用它类来构建我们的第一张地图。

一、安装slam-toolbox

slam_toolbox 是一套用于2D SLAM的开源工具,使用 apt 可以方便的进行安装,命令如下:

sudo apt install ros-$ROS_DISTRO-slam-toolbox

二、启动底盘和雷达

1.运行TF转换Launch-Bringup

source install/setup.bash
ros2 launch fishbot_bringup fishbot_bringup.launch.py

2.运行Agent

sudo docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO udp4 --port 8888 -v6

3.启动雷达

直接使用Docker:

xhost + && sudo docker run  -it --rm  -v /dev:/dev -v /dev/shm:/dev/shm --privileged  -v /tmp/.X11-unix:/tmp/.X11-unix --device /dev/snd -e DISPLAY=unix$DISPLAY -p 8889:8888 registry.cn-hangzhou.aliyuncs.com/fishros/fishbot_laser

如果不用Docker需要修改下代码,因为 ydlidar_launch.py 会发布 base_link 和 laser_frame 之间的坐标变换,这和使用URDF发布的相冲突,所以需要做一次修改再运行:

def generate_launch_description():
    ...

    return LaunchDescription([
        params_declare,
        driver_node,
        #tf2_node,  ----注释这一行就可以了-----
    ])

确定有雷达话题后,我们就可以运行建图了。

三、运行建图

接着打开一个新的终端, 入下面的命令,启动slam_toolbox 的在线建图:

ros2 launch slam_toolbox online_async_launch.py 
---
INFO] [launch]: All log files can be found below /home/fishros/.ros/log/2023-05-25-16-47-11-319871-fishros-VirtualBox-11288
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [async_slam_toolbox_node-1]: process started with pid [11290]
[async_slam_toolbox_node-1] [INFO] [1685004431.442212575] [slam_toolbox]: Node using stack size 40000000
[async_slam_toolbox_node-1] [INFO] [1685004431.503891373] [slam_toolbox]: Using solver plugin solver_plugins::CeresSolver
[async_slam_toolbox_node-1] [INFO] [1685004431.505007754] [slam_toolbox]: CeresSolver: Using SCHUR_JACOBI preconditioner.
[async_slam_toolbox_node-1] Info: clipped range threshold to be within minimum and maximum range!
[async_slam_toolbox_node-1] [WARN] [1685004431.658413039] [slam_toolbox]: maximum laser range setting (20.0 m) exceeds the capabilities of the used Lidar (8.0 m)
[async_slam_toolbox_node-1] Registering sensor: [Custom Described Lidar]

slam-toolbox 的输入有两个,第一个是订阅来自雷达的 /scan 话题,用于获取雷达数据,第二个是获取里程计坐标系 odom 到机器人坐标系 base_footprint 之间的变换。这些数据都是有时间戳的,所以在上面的命令中将 use_sim_time 参数的值设置为 True 表示使用仿真的时间,以防止因时间戳造成数据不合法。

用RVIZ2可视化图像

打开 RViz,修改 Fixed Frame 为 map,接着通过 Add/By Topic 添加 /map 话题,也可以添加 TF 和 RobotModel 等你感兴趣的话题进行显示,最终配置及效果如下图所示。

【ROS2机器人入门到实战】使用SLAM_TOOLBOX完成建图_fish

遥控机器人建图(记得减速哦)

ros2 run teleop_twist_keyboard teleop_twist_keyboard

房间已经探索了差不多后,接着我们来将地图保存下来。