机器人SLAM与自主导航(二)——必备条件

总述

ROS中SLAMda和自主导航的相关功能包可以通用于各种移动机器人平台,但为达到最佳效果,对机器人的硬件仍然有以下三个要求。
1)导航功能包对差分、轮式机器人的效果号好,并且假设机器人可直接使用速度指令进行控制。

  • linear:机器人在xyz三轴方向上的线速度,单位是m/s。
  • angular:机器人在xyz三轴方向上的角速度,单位是rad/s。
    2)导航功能包要求机器人必须安装激光雷达等测距设备,可以获取环境深度信息。
    3)导航功能包以正方形和圆形的机器人为模板进行开发,对于其他外形的机器人,虽然可以正常使用,但是效果可能不佳。

一、传感器信息

1、环境深度信息
无论是SLAM还是自主导航,获取周围环境的深度信息都是至关重要的。要获取深度信息,首先要弄明白ROS中的深度信息是如何表示的。
针对激光雷达,ROS在sensor_msgs包中定义了专用数据结构——LaserScan,用于存储激光信息。LaserScan消息的具体定义如下。
在这里插入图片描述

  • angle_min:可检测范围的起始角度
  • angle_max:可检测范围的终止角度
  • angle_increment:相邻数据帧之间的角度步长
  • time_increment:采集相邻数据帧之间的时间步长,当传感器处于相对运动状态时进行补偿使用
  • scan_time:采集一帧数据所需要的时间
  • range_min:最近可检测深度的阈值
  • range_max:最远可检测深度的阈值
  • ranges:一帧深度数据的存储数组
    如果使用的机器人没有激光雷达,但配备有Kinect等RGB-D摄像头,也可以通过红外摄像头获取周围环境的深度信息。但是RGB-D摄像头获取的原始深度信息是三维点云数据,而ROS的很多功能包所需要的输入是激光二维数据,是否可以将三维数据转换为二维数据呢?
    将三维数据降维到二维数据的方法,即把大量数据拦腰斩断,只抽取其中的一行数据,重新封装为LaserScan消息,就可以获取到需要的二维激光雷达信息。这样做虽然损失了大量有效数据,但是刚好可以满足2D SLAM的需求。
    ROS中也提供了相应的功能包——depthimage_to_laserscan,将三维点云数据转换为二维激光雷达数据。
<!--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 froam="scan" to="/scan"/>
    <param name="output_frame_id" value="/camera_link"/>
</node>

2、里程计信息
里程计根据传感器获取的数据来估计机器人随时间发生的位置变化,在机器人平台中,较为常见的里程计是编码器,例如,机器人驱动轮配备的旋转编码器。当机器人移动时,借助旋转编码器可以测量出轮子旋转的圈数,如果知道轮子的周长,便可以计算出机器人单位时间内的速度以及一段时间内的移动距离。里程计根据速度对时间的积分求得位置这种方法对误差十分敏感,所以采取如精确的数据采集、设备标定、数据滤波等措施是十分必要的。
导航功能包要求机器人能够发布里程计nav_msgs/Odometry消息。nav_msgs/Odometry消息包含机器人在自由空间中的位置和速度估算值。

  • pose:机器人当前位置坐标,包括机器人的x、y、z三轴位置与方向参数,以及用于校正误差的协方差矩阵
  • twist:机器人当前的运动状态,包括x、y、z三轴的线速度与角速度,以及用于校正误差的协方差矩阵。
    注意:ROS中所有的坐标系都是右手坐标系。
    在这里插入图片描述
    在其数据结构中,除速度与位置的关键信息外,还包含用于滤波算法的协方差矩阵。在精度要求不高的机器人系统中,可以使用默认的协方差矩阵;而在精度要求较高的系统中,需要先对机器人精确建模后,再通过仿真、实验等方法确定该矩阵的具体数值。

二、仿真平台

1、创建仿真环境
2、加载机器人
3、真实机器人