LIMO: Lidar-Monocular Visual Odometry
IROS2018的论文
本文提出了LIMO SLAM框架,主要工作是融合了LiDAR和Monocular。
https://github.com/johannes-graeter/limo
前端
特征
本文使用的是viso2特征,它能 non-maimum suppression, outlier rejection 和 subpixel refinement.
30-40ms能提取2000个特征。
深度
正常特征
单目没有深度信息,通过LiDAR获取。
首先把LiDAR点投影到图像平面:
- 在特征点f附近选取投影过来的LiDAR点集F,不要取一条线上的激光点(右图)。
- 在3D LiDAR空间把F分割前后景(深度不同),取前景点集F_f(因为特征点一般在边缘,打过去的激光点有些在特征点所在平面上,有些其实打在背景上了。)
- 把F_f拟合一个平面,这个平面不能太小
- 特征点的射线跟这个平面相交,获得特侦点的深度
- 平面的法线和特征点的射线的夹角大于某个阈值,或者深度超过30米会被拒绝
地面特征点
地面上的特征点会特殊处理,因为(垂直方向)地面上雷达点更稀疏。
- 首先RANSAC提取出地面平面
- 跟之前一样我们围绕f逆和一个local平面,这个平面面积阈值比之前大一些
帧间运动量
除了常用的PnP估计外,
引入了Fundamental matrix的pFp约束。
另外用了Cauchy function包裹这个新引入的约束。
后端
关键帧的选择
mean optical flow 小于某个阈值的时候认为机器人没有在运动,此时不记录关键帧。
时间间隔是0.3s
路标点的选择
前端的时候所有的特征都会被计算,路标的选择在后端进行。
所有的特征点被分为远中近三组。
近处的特征对位移估计好
中间的点都好
远处的点对旋转估计好。
用了voxel filter with median filtering 来减少trees bushes对BA的影响(把局部地区富集到一起的信息离散化了?)
BA的lost function
lost function包括三部分:
投影误差和深度估计误差
以及
这个误差我没看懂,说是
优化窗口内最古老的motion包含最多的信息所以最准确。
因此我们增加了cost functor v that punishes deviations from the length of its translation vector.
P0 P1是优化窗口中最近的两个pose。
而
s is a constant with the value of before optimization.
In that way changes in scale are regularized and the estimate is smoother and more robust outliers.
另外他们的BA会定期剔除一些误差项以跳出局部最优。