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会定期剔除一些误差项以跳出局部最优。
实验感想
我在改ORBSLAM2的时候尝试用这个办法找到Monocular跟LiDAR的比率
在特征点附近找LiDAR point拟合平面看起来很美好。用Kitti数据集,街边一些非墙面和地面的地区就很麻烦。
特征点附近的激光点云肉眼一看就是个非垂直非水平的倾斜平面,拟合出来的平面跟射线的相交点经常离群,距离特征点附近的激光点云很远。
很容易被30米或者平面法线射线夹角的阈值给干掉。
最后感觉没有一个平面-射线交点是可靠的。
(可能还不如像其他方法用最近LiDAR点的深度替代)