雷达数据的运动畸变

在移动机器人的运动过程中,当激光雷达扫描频率较低时,获得的原始扫描数据会发生畸变,并且随着速度的增加变得越来越严重。雷达旋转有顺时针与逆时针2种情况,但导致运动畸变的效果差异并不明显。

  1. 激光点数据不是瞬时获得的,雷达扫描时在旋转,有个扫描频率的问题
  2. 雷达扫描中,机器人也是运动的。 机器人旋转造成的运动畸变比直线运动大。

比如所用激光雷达的扫描频率为10Hz,当移动机器人以角速度为1 rad/s 进行纯旋转时,在激光雷达扫描一圈得到
一帧数据的时间内(0.1s)移动机器人已经旋转了0.1 rad,约为5.7度,这会影响机器人的定位和路径规划。

由于我以前的机器人是低速机器人,最大线速度才0.4m/s,而雷达的扫描频率至少25Hz,所以雷达不必考虑畸变,实际使用时,从rviz上看,也没发现运动畸变。雷达扫描频率最好达到30Hz以上。但是我现在使用的机器人速度最快1.4m/s,雷达频率才10Hz,这就需要考虑运动畸变了。

使用里程计辅助的方法去除运动畸变。里程计的频率一般比较高,move_base里面默认订阅里程计的频率是20Hz,所以里程计至少也得20Hz,我所用的里程计是50Hz。

平时之所以没有这么严重,是因为有定位程序,比如AMCL或者LOAM

去除激光帧畸变原理:把一帧激光的每个激光点坐标变换到不同时刻的机器人里程计上
里程计辅助方法:imu、轮式里程计
(1) IMU
  直接测量获得角速度和线速度,但对于机器人位移和角度需要积分
  更新速度高 1KHz-8KHz
  具有较高的角速度测量精度,但线加速度精度差
2)轮式里程计
  更新速度高 100-200Hz
  (一般机器人轮式里程计200hz,即可认为满足一定的要求,200hz一帧5ms,1.57rad/s下,误差仅为0.45度,可认为机器人没有运动。)

程序流程

1) main-构造函数
订阅scan话题
调用scancallback处理
2) scancallback
scan话题数据提取到vector数组(包括angles,ranges)
vector数组保存到pcl::PointCloud类型的点云中
调用Lidar_Calibration进行畸变矫正
3) Lidar_Calibration
程序对激光雷达数据进行分段线性插值*
调用Lidar_MotionCalibration激光雷达运动畸变去除分段函数*
调用getLaserPose得到激光雷达在odom中的位姿

参考:
基于里程计修复激光雷达数据
激光雷达移动状态下的数据矫正
激光雷达数据效果对比