5.使用SLAM_TOOLBOX完成建图
写在前面
- 当前平台文章汇总地址:ROS2机器人从入门到实战
- 获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取
- 教程配套机器人开发平台:两驱版| 四驱版
- 为方便交流,搭建了机器人技术问答社区:地址 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 run teleop_twist_keyboard teleop_twist_keyboard
房间已经探索了差不多后,接着我们来将地图保存下来。