0. 简介

之前作者在今年年初写了激光与摄像头混合的博客《从LVI-SAM来看激光与视觉的紧耦合系统》,当时一直想写R3LIVE的。但是一直苦于没有时间好好地去深入钻研探索。这段时间正好有比较充裕的时间做这个事情,所以这里我们对《R3LIVE: A Robust, Real-time, RGB-colored, LiDAR-Inertial-Visual tightly-coupled state Estimation and mapping package》这篇文章进行学习与解析。这篇文章中中有很多值得我们借鉴和学习的地方。与LVI-SAM一样,它也是一个激光-惯性-视觉融合的传感器融合框架,利用激光雷达、惯性和视觉传感器的测量来实现鲁棒性和准确性的状态估计。由于R3LIVE是由R2LIVE进一步拓展来的。这里我们放上其他博主翻译的R2LIVE的论文。

[video(video-XtQwlAqF-1661482603488)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=726748216)(image-https://img-blog.csdnimg.cn/img_convert/d686d9572767fe870c0e66d2fbf34c57.jpeg)(title-【搬】基于r3live的低成本手持式 3D 激光雷达扫描仪欣赏)]

1. R2LIVE回顾

如上面所说,我们要了解学习R3LIVE之前,我们需要先学习R2LIVE。

我们可以看到R2LIVE的激光雷达测量部分,主要继承了Fast-LIO的面元特征思想,u为面法向量,q/p为代表面的特征点,残差如下:
r_l(\check{X}_{k+1},^Lp_j)=u^T_j(^Gp_j-q_j)

IMU部分主要涉及到离散IMU状态向量使用。这部分其实也是Fast-LIO里面的相关知识。然后及可以根据ESKF完成与雷达数据的融合。

x_i=\left[^GR^T_{I_i} \\ ^GP^T_{I_i}\ ^IR^T_{C_i}\ ^IP^T_{C_{i}}\ ^Gv^T_{i} \ b^T_{g_i}\ b^T_{a_i}\right]^T

\delta\hat{X}_i=X_i\boxminus\hat{X}_i\ =\left[^G\hat{R}^T_{I_i}\ \ ^G\hat{P}^T_{I_i}\ \ ^I\hat{R}^T_{C_i}\ \ ^I\hat{P}^T_{C_{i}}\ \ ^G\hat{v}^T_{i}\ \ \hat{b}^T_{g_i}\ \ \hat{b}^T_{a_i}\right]^T\ =(X_i\boxplus(\Delta t_f(X_i,u_i,w_i)))\boxminus(\hat{x}_i\boxplus(\Delta t_f(\hat{x}_i,u_i,0)))

视觉测量信息理论上与LiDAR数据相同,如果第k+1帧是相机帧,那么误差就为重投影误差:
(^CP_s=(^G\check{R}_{I_{k+1}}\ ^I\check{R}_{C_{k+1}})^T\ ^GP_s-(^I\check{R}_{C_{k+1}})^T\ ^G\check{p}_{I_{k+1}}-^I\check{p}_{C_{k+1}}

因子图优化,总体来说和VINS-MONO一样,不过就是多了一个雷达位姿节点,用IMU预积分将雷达位姿节点和相机位姿节点进行关联。

在这里插入图片描述
下面是R2LIVE的代码结构
在这里插入图片描述

2. R3LIVE学习

与R2LIVE类似,R3LIVE系统也是以IMU作为核心,利用激光雷达和相机的观测修正系统状态。算法相当于不断以imu的预测为基础,每当得到了新的相机或激光的观测,就对系统状态进行更新,实现了多传感器信息融合。其中激光雷达的观测与LIO相同,相机的观测则分为两步:先是用跟踪点的重投影误差,再基于更新结果用跟踪点的光度误差再次进行状态更新。
在这里插入图片描述

这里我们找到了stella博主的一篇文章,非常清晰的阐述了R3LIVE的整个流程。
在这里插入图片描述
对于LIO与VIO我们分开来进行阐述。LIO线程是与FAST-LIO2一致的,即LIO会首先拿到当前帧扫描到的新激光电源,并利用上一时刻更新后推算出来的IMU状态数据来进行状态预测,然后结合激光数据完成ikd-Tree的查询与拼接,并更新点云地图。VIO部分也是一个线程,在拿到新图像后,会利用上次状态更新后的IMU数据进行状态预测。相较于VINS使用中值滤波完成状态更新而言,R3LIVE使用了ESIKF作为状态预测,并作为帧到帧的VIO部分的输入。帧到帧的VIO部分也是与VINS不同,通过将三维地图点投影到上一个图像帧获取二维座标然后通过LK光流法获取到在当前帧的二维坐标,然后可以通过ESIKF计算误差更新状态(计算PNP,更新ESIKF)。这部分更像FAST-LIO2的激光操作。
在这里插入图片描述

在这里插入图片描述
最后通过对帧与地图的光度误差,并结合ESIKF计算误差更新状态
在这里插入图片描述
在这里插入图片描述
下面等有时间,作者再结合代码来一步步分析R3LIVE是如何实现的。

3. 参考链接

https://blog.csdn.net/handily_1/article/details/122271243

https://zhuanlan.zhihu.com/p/378375542

https://xuwuzhou.top/%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB7/

https://zhuanlan.zhihu.com/p/480275319

https://blog.csdn.net/handily_1/article/details/121786715

https://xuwuzhou.top/%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB46/