本章着重讲如何在ROS里面使用SLAM功能包,而不会去讲解算法;之后会专门的专栏做SLAM。
代码包:链接: https://pan.baidu.com/s/1MkWs9ppcX2IeFPH16YLFRw 密码: l1ve
文章目录
1. SLAM原理简介
放几张GIF动图感受一下:
这边再放上一个视频链接Autonomous Aerial Navigation in Confined Indoor Environments是关于一个无人机室内建图的。
还有这个Visual SLAM Car Navigation是关于使用iPhone5做视觉SLAM的。
- SLAM(Simultaneout Localization and Mapping):即使定位与地图构建。即机器人自身位置不确定的情况下,在完全未知的环境中创建地图,同时利用地图进行自主定位和导航;
- 定位,在地图上估测机器人的位置坐标;
- 地图构建,这一过程是根据传感器的结果来构建一张地图或者是修正当前地图,同时将结果提供给定位算法做为先验地图。
其实我感觉第一本书皮好看呀,两本书的PDF都可以私信我,由于版权问题就不公布了!
机器人必须安装激光雷达等测距设备,可以获取环境深度信息。 单线雷达,反馈的是二维的平面信息。多线雷达,反馈的是三维信息。(左边是单线,也就是TurtleBot3配置的雷达;右边是多线雷达)
2. ROS机器人配置与数据结构
①单线雷达
- angle_min:可检测范围的起始角度;
- angle_max:可检测范围的终止角度,与angle_min组成激光雷达的可检测范围;
- angle_increment:相邻数据帧之间的角度步长;
- time_increment:采集到相邻数据帧之间的时间步长,当传感器处于相对运动状态时进行补偿使用;
- scan_time:采集一帧数据所需要的时间;
- range_min:最近可检测深度的阈值;
- range_max:最远可检测深度的阈值;
- ranges:一帧深度数据的存储数组。
像Kinect这种RGB-D相机,同样可以把收集到的三个维度的信息通过 depthimage_to_laserscan 这个功能包把点云深度数据转换成激光数据。
sudo apt-get install ros-melodic-depthimage-to-laserscan
使用功能包长着个样↓
<node pkg="depthimage_to_laserscan" type="depthimage_to_laserscan" name="depthimage_to_laserscan" output="screen">
<remap from="image" to="/kinect/depth/image_raw" />
<remap from="camera_info" to="/kinect/depth/camera_info" />
<remap from="scan" to="/scan" />
<param name="output_frame_id" value="/camera_link" />
</node>
②里程计
- pose:机器人当前位置坐标,包括机器人的 XYZ 三轴位置与方向参数,以及用于矫正误差的协方差矩阵;
- twist:机器人当前的运动状态,包括 XYZ 三轴的线速度与角速度,以及用于矫正误差的协方差矩阵。
使用 Building Editor 创建仿真环境,可见ROS理论与实践(以移动机器人为例)连载(五) ——构建机器人仿真平台。
代码包:链接: https://pan.baidu.com/s/1hMKzm2sozhmIFIn6ZIQQMQ 密码: 1bm8
可以运行↓前提是把提供的功能包放在工作空间下并进行编译
$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
3. 常用SLAM功能包应用
①gmapping
- 基于激光雷达
- Rao-Blackwellized 粒子滤波算法
- 二维栅格地图
- 需要机器人提供里程计信息
- OpenSlam开源算法
- 输出地图话题:nav_msgs/OccupancyGrid
论文可参考:http://openslam.org/gmapping.html 。
安装gmapping
$ sudo apt-get install ros-melodic-gmapping
gmapping功能包中的话题和服务:
gmapping功能包中的TF变换:
参考:http://wiki.ros.org/gmapping/。
该如何使用 gmapping 呢?我们来配置一下 gmapping 的节点↓
<launch>
<arg name="scan_topic" default="scan" />
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true">
<param name="odom_frame" value