SLAM建图

一、SLAM

1.1 介绍

SLAM是机器人自身位置不确定的情况下,在完全未知的环境中创建地图,同时利用地图进行自主定位。

  • 定位:机器人根据周围环境估计自身在地图上的位置坐标。
  • 地图构建:机器人根据传感器的结果来构建一张地图。

1.2 原理

图1. SLAM原理

二、数据结构

2.1 激光雷达

一般在SLAM中使用可以直接获得深度信息的传感器。以激光雷达为例,在终端上输入rosmsg show sensor_msgs/LaserScan可以获得其数据结构

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
float32 angle_min //可检测范围的起始角度
float32 angle_max //可检测范围的终止角度,与angle_min组成激光雷达的可检测范围
float32 angle_increment //相邻数据帧之间的角度步长
float32 time_increment //采集到相邻数据帧之间的时间步长,当传感器处于相对运动状态时进行补偿使用
float32 scan_time //采集一帧数据所需要的时间
float32 range_min //最近可检测深度的阈值
float32 range_max //最远可检测深度的阈值
float32[] ranges //一帧深度数据的存储数组
float32[] intensities

RGB-D摄像头,也可以通过红外摄像头获取周围环境的深度信息,可以通过depthimage_to_laserscan功能包转化为激光雷达的数据。

2.2 里程计

机器人在定位时要用到其里程计,在终端上输入rosmsg show nav_msgs/Odometry可以获得其数据结构

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
string child_frame_id
geometry_msgs/PoseWithCovariance pose //机器人当前位置坐标,包括机器人的XYZ三轴位置和方向参数,以及用于校正误差的协方差矩阵
  geometry_msgs/Pose pose 
    geometry_msgs/Point position
      float64 x
      float64 y
      float64 z
    geometry_msgs/Quaternion orientation
      float64 x
      float64 y
      float64 z
      float64 w
  float64[36] covariance
geometry_msgs/TwistWithCovariance twist //机器人当前的运动状态,包括XYZ三轴的线速度与角速度,以及用于校正误差的协方差矩阵
  geometry_msgs/Twist twist
    geometry_msgs/Vector3 linear
      float64 x
      float64 y
      float64 z
    geometry_msgs/Vector3 angular
      float64 x
      float64 y
      float64 z
  float64[36] covariance

三、SLAM功能包

3.1 介绍

借助SLAM功能包,我们只需要输入特定格式的传感器信息,就可以自动建图和定位。在ROS中这种功能的包有很多,比如用于平面地图的gmappinghectorcartographer等功能包,也有用于三维地图的rtabmap功能包。

3.2 gmapping

gmapping功能包为例,gmapping是基于二维激光雷达的 SLAM建图定位的功能包,采用的是Rao-Blackwellized粒子滤波算法,gmapping的总体框架如图2所示。深度信息,里程计信息,IMU信息是输入信息,二维栅格地图是输出地图。其中深度信息和里程计信息是必须输入的,IMU可不输入。

图2. gmapping功能包的总体框架

3.3 应用

我们借助gazebo,创建一个如图3所示的虚拟迷宫,用于小车的测试。图4是gmapping功能包的应用效果,可以看到小车的运动和地图构建都是同步的。

图3. 虚拟迷宫
图4. gmapping应用效果

参考代码


   转载规则


《SLAM建图》 kieranych 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录