R3LIVE论文学习(二):VIO子系统

R3live笔记:(图像处理)视觉-惯性里程计VIO部分 1. IMAGE_topic 订阅: sub_img = m_ros_node_handle.subscribe(IMAGE_topic.c_str(), 1000000, &R3LIVE::image_callback, this, ros::TransportHints().tcpNoDelay()); 图像topic数据传入的时候,回调函数image_callback: void R3LIVE::image_callback( const sensor_msgs::Image 阅读详情

在这里插入图片描述
VIO子系统通过最小化帧到帧的PnP重投影误差和最小化帧到全局地图的光度误差来估计系统的状态,并渲染全局地图的纹理。 具体过程如下:

  1. 在帧与帧之间,通过Lucas-Kanade光流法跟踪一定数量的地图点,并通过最小化这些点的PnP重投影误差来估计系统状态。系统估计通过ESIKF框架进行迭代求解,与高斯牛顿法(GN)等价。
  2. 在帧与全局地图之间,将全局地图中被跟踪的点投影到当前图像帧中,然后最小化这些点的帧与地图之间的光度误差,从而更精确的估计系统状态。同样的,系统估计通过ESIKF框架进行迭代求解。
  3. 在帧到全局地图的VIO更新之后,可以得到当前图像帧的精确位姿,然后通过对地图点在当前图像帧上对应的像素和相邻像素的RGB颜色进行线性插值,从而渲染地图点的颜色。

1 帧到帧的VIO

假设我们在上一帧图像帧 Ik−1\mathbf{I}_{k-1}Ik−1​ 中追踪了 mmm 个地图点,这 mmm 个地图点记为 P={P1,…,Pm}\mathcal{P}=\left\{\mathbf{P}_{1}, \ldots, \mathbf{P}_{m}\right\}P={P1​,…,Pm​},它们在图像帧 Ik−1\mathbf{I}_{k-1}Ik−1​ 中的投影坐标记为 {ρ1k−1,…,ρmk−1}\left\{\boldsymbol{\rho}_{1_{k-1}}, \ldots, \boldsymbol{\rho}_{m_{k-1}}\right\}{ρ1k−1​​,…,ρmk−1​​},使用 Lucas-Kanade光流法 可以找出这些地图点在当前图像帧 Ik\mathbf{I}_{k}Ik​ 的投影坐标,记为 {ρ1k,…,ρmk}\left\{\boldsymbol{\rho}_{1_{k}}, \ldots, \boldsymbol{\rho}_{m_{k}}\right\}{ρ1k​​,…,ρmk​​}。然后我们通过 ESIKF 来计算和优化这些地图点的重投影误差,从而估计出系统的状态。

1.1 PnP重投影误差

在这里插入图片描述

如上图所示,以第 sss 个点 Ps=[GpsT,csT]T∈P\mathbf{P}_{s}=\left[{ }^{G} \mathbf{p}_{s}^{T}, \mathbf{c}_{s}^{T}\right]^{T} \in \mathcal{P}Ps​=[GpsT​,csT​]T∈P 为例,其中前面的3维向量 GpsT=[Gpsx,Gpsy,Gpsz]{ }^{G} \mathbf{p}_{s}^{T}= \left[{ }^{G} \mathbf{p_s}_{x},{ }^{G} \mathbf{p_s}_{y},{ }^{G} \mathbf{p_s}_{z}\right]GpsT​=[Gps​x​,Gps​y​,Gps​z​] 表示点 sss 在世界坐标系下的三维坐标,后面的 csT=[csr,csg,csb]T\mathbf{c}_{s}^{T}=\left[\mathbf{c_s}_{r}, \mathbf{c_s}_{g}, \mathbf{c_s}_{b}\right]^{T}csT​=[cs​r​,cs​g​,cs​b​]T表示点 sss 的RGB颜色。

为了计算点 sss 的在图像帧 Ik\mathbf{I}_{k}Ik​ 中的重投影误差,我们先要将点 sss 转换到相机坐标系当中,即:

Cps=[Cpxs,Cpys,Cpzs]T=(GRˇIk⋅IRˇCk)T⋅Gps−IRˇCkT⋅IpˇCk−(GRˇIk⋅IRˇCk)T⋅GpˇIk(1) \begin{array}{r}{ }^{C} \mathbf{p}_{s}=\left[{ }^{C} \mathbf{p}_{x_{s}},{ }^{C} \mathbf{p}_{y_{s}},{ }^{C} \mathbf{p}_{z_{s}}\right]^{T}=\left({ }^{G} \check{\mathbf{R}}_{I_{k}} \cdot{ }^{I} \check{\mathbf{R}}_{C_{k}}\right)^{T} \cdot{ }^{G} \mathbf{p}_{s} -{ }^{I} \check{\mathbf{R}}_{C_{k}}^{T} \cdot{ }^{I} \check{\mathbf{p}}_{C_{k}}-\left({ }^{G} \check{\mathbf{R}}_{I_{k}} \cdot{ }^{I} \check{\mathbf{R}}_{C_{k}}\right)^{T} \cdot{ }^{G} \check{\mathbf{p}}_{I_{k}}\end{array}\tag{1} Cps​=[Cpxs​​,Cpys​​,Cpzs​​]T=(GRˇIk​​⋅IRˇCk​​)T⋅Gps​−IRˇCk​T​⋅Ipˇ​Ck​​−(GRˇIk​​⋅IRˇCk​​)T⋅Gpˇ​Ik​​​(1)

这里要注意的是,CkpG≠−GpCk{}^{C_k}p_G \neq -{}^Gp_{C_k}Ck​pG​=−GpCk​​,而是 CkpG=−CkRGGpCk{}^{C_k}p_G = -{}^{C_k}R_{G}{}^Gp_{C_k}Ck​pG​=−Ck​RG​GpCk​​。

将点 sss 的重投影误差记为 r(xˇk,ρsk,Gps)\mathbf{r}\left(\check{\mathbf{x}}_{k}, \boldsymbol{\rho}_{s}^{k},{ }^{G} \mathbf{p}_{s}\right)r(xˇk​,ρsk​,Gps​) ,则有:

r(xˇk,ρsk,Gps)=ρsk−π(Cps,xˇk)(2) \mathbf{r}\left(\check{\mathbf{x}}_{k}, \boldsymbol{\rho}_{s_{k}},{ }^{G} \mathbf{p}_{s}\right)=\boldsymbol{\rho}_{s_{k}}-\boldsymbol{\pi}\left({ }^{C} \mathbf{p}_{s}, \check{\mathbf{x}}_{k}\right)\tag{2} r(xˇk​,ρsk​​,Gps​)=ρsk​​−π(Cps​,xˇk​)(2)

其中,xˇk\check{\mathbf{x}}_{k}xˇk​ 是每一次ESIKF迭代的当前状态,π(Cps,xˇk)∈R2\boldsymbol{\pi}\left({ }^{C} \mathbf{p}_{s}, \check{\mathbf{x}}_{k}\right) \in \mathbb{R}^{2}π(Cps​,xˇk​)∈R2 是相机投影模型,可以通过下式计算:

π(Cps,xˇk)=[fˇxkCpxsCpzs+cˇxk,fˇykCpysCpzs+cˇyk]T+tˇCkΔtk−1,k(ρsk−ρsk−1)(3) \begin{aligned}\boldsymbol{\pi}\left({ }^{C} \mathbf{p}_{s}, \check{\mathbf{x}}_{k}\right) &=\left[\check{f}_{x_{k}} \frac{{ }^{C} \mathbf{p}_{x_{s}}}{C_{\mathbf{p}_{z_{s}}}}+\check{c}_{x_{k}}, \check{f}_{y_{k}} \frac{{ }^{C} \mathbf{p}_{y_{s}}}{{ }^{C} \mathbf{p}_{z_{s}}}+\check{c}_{y_{k}}\right]^{T} +\frac{\check{t}_{C_{k}}}{\Delta t_{k-1, k}}\left(\boldsymbol{\rho}_{s_{k}}-\boldsymbol{\rho}_{s_{k-1}}\right)\end{aligned}\tag{3} π(Cps​,xˇk​)​=[fˇ​xk​​Cpzs​​​Cpxs​​​+cˇxk​​,fˇ​yk​​Cpzs​​Cpys​​​+cˇyk​​]T+Δtk−1,k​tˇCk​​​(ρsk​​−ρsk−1​​)​(3)

其中, Δtk−1,k\Delta t_{k-1, k}Δtk−1,k​ 是上一帧图像帧 Ik−1\mathbf{I}_{k-1}Ik−1​ 和当前帧图像帧 Ik\mathbf{I}_{k}Ik​ 之间的时间间隔。上式等式右边第一个式子是针孔相机投影模型,第二个式子是在线时间校正因子。

误差公式 (2) 中的测量噪声包含两个部分:一个是 Gps{ }^{G} \mathbf{p}_{s}Gps​ 中的地图点位置误差,另一个是 ρsk\boldsymbol{\rho}_{s_{k}}ρsk​​ 中的像素跟踪误差。

Gps=Gpsgt+nps,nps∼N(0,Σnps)(4) { }^{G} \mathbf{p}_{s}={ }^{G} \mathbf{p}_{s}^{\mathrm{gt}}+\mathbf{n}_{\mathbf{p}_{s}}, \mathbf{n}_{\mathbf{p}_{s}} \sim \mathcal{N}\left(\mathbf{0}, \mathbf{\Sigma}_{\mathbf{n}_{\mathbf{p}_{s}}}\right)\tag{4} Gps​=Gpsgt​+nps​​,nps​​∼N(0,Σnps​​​)(4)

ρsk=ρskgt+nρsk,nρsk∼N(0,Σnρsk)(5) \boldsymbol{\rho}_{s_{k}}=\boldsymbol{\rho}_{s_{k}}^{\mathrm{gt}}+\mathbf{n}_{\boldsymbol{\rho}_{s_{k}}}, \mathbf{n}_{\rho_{s_{k}}} \sim \mathcal{N}\left(\mathbf{0}, \boldsymbol{\Sigma}_{\mathbf{n}_{\rho_{s_{k}}}}\right)\tag{5} ρsk​​=ρsk​gt​+nρsk​​​,nρsk​​​∼N(0,Σnρsk​​​​)(5)

其中,Gpsgt{ }^{G} \mathbf{p}_{s}^{\mathrm{gt}}Gpsgt​ 和 ρskgt\rho_{s_{k}}^{g \mathrm{t}}ρsk​gt​ 分别为为 Gps{ }^{G} \mathbf{p}_{s}Gps​ 和 ρsk\boldsymbol{\rho}_{s_{k}}ρsk​​ 的真值。

然后,我们得到零残差真值 r(xk,ρskgt,Gpsgt)\mathbf{r}\left(\mathbf{x}_{k}, \boldsymbol{\rho}_{s_{k}}^{\mathrm{gt}}, {}^G \mathbf{p}_{s}^{\mathrm{gt}}\right)r(xk​,ρsk​gt​,Gpsgt​) 的一阶泰勒展开为:

0=r(xk,ρskgt,Gpsgt)≈r(xˇk,ρsk,Gps)+Hsrδxˇk+αs(6) \mathbf{0}=\mathbf{r}\left(\mathbf{x}_{k}, \boldsymbol{\rho}_{s_{k}}^{\mathrm{gt}},{ }^{G} \mathbf{p}_{s}^{\mathrm{gt}}\right) \approx \mathbf{r}\left(\check{\mathbf{x}}_{k}, \boldsymbol{\rho}_{s_{k}},{ }^{G} \mathbf{p}_{s}\right)+\mathbf{H}_{s}^{r} \delta \check{\mathbf{x}}_{k}+\boldsymbol{\alpha}_{s}\tag{6} 0=r(xk​,ρsk​gt​,Gpsgt​)≈r(xˇk​,ρsk​​,Gps​)+Hsr​δxˇk​+αs​(6)

其中:αs∼N(0,Σαs)\boldsymbol{\alpha}_{s} \sim \mathcal{N}\left(\mathbf{0}, \boldsymbol{\Sigma}_{\boldsymbol{\alpha}_{s}}\right)αs​∼N(0,Σαs​​),并且有:

Hsr=∂rc(xˇk⊞δxˇk,ρsk,Gps)∂δxˇk∣δxˇk=0(7) \mathbf{H}_{s}^{r}=\left.\frac{\partial \mathbf{r}_{c}\left(\check{\mathbf{x}}_{k} \boxplus \delta \check{\mathbf{x}}_{k}, \boldsymbol{\rho}_{s_{k}},{ }^{G} \mathbf{p}_{s}\right)}{\partial \delta \check{\mathbf{x}}_{k}}\right|_{\delta \check{\mathbf{x}}_{k}=\mathbf{0}}\tag{7} Hsr​=∂δxˇk​∂rc​(xˇk​⊞δxˇk​,ρsk​​,Gps​)​∣∣​δxˇk​=0​(7)

Σαs=Σnρsk+FpsrΣpsFpsrT(8) \boldsymbol{\Sigma}_{\boldsymbol{\alpha}_{s}}=\boldsymbol{\Sigma}_{\mathbf{n}_{\rho_{s_{k}}}}+\mathbf{F}_{\mathbf{p}_{s}}^{r} \boldsymbol{\Sigma}_{\mathbf{p}_{s}} \mathbf{F}_{\mathbf{p}_{s}}^{r T}\tag{8} Σαs​​=Σnρsk​​​​+Fps​r​Σps​​Fps​rT​(8)

Fpsr=∂r(xˇk,ρsk,Gps)∂ps(9) \mathbf{F}_{\mathbf{p}_{s}}^{r}=\frac{\partial \mathbf{r}\left(\check{\mathbf{x}}_{k}, \boldsymbol{\rho}_{s_{k}},{ }^{G} \mathbf{p}_{s}\right)}{\partial \mathbf{p}_{s}}\tag{9} Fps​r​=∂ps​∂r(xˇk​,ρsk​​,Gps​)​(9)

1.2 帧到帧的VIO ESIKF更新

公式(6)表示了 xk\mathbf{x}_{k}xk​ 的观测分布,它可以可以与IMU传播的先验分布相结合,从而得到误差状态 δxˇk\delta \check{\mathbf{x}}_{k}δxˇk​ 的最大后验估计(MAP):

min⁡δxˇk(∥xˇk⊟x^k+Hδxˇk∥Σδx^k2+∑s=1m∥r(xˇk,ρsk,Gps)+Hsrδxˇk∥Σαs2)(10) \begin{aligned}&\min _{\delta \check{\mathbf{x}}_{k}}\left(\left\|\check{\mathbf{x}}_{k} \boxminus \hat{\mathbf{x}}_{k}+\boldsymbol{\mathcal { H }} \delta \check{\mathbf{x}}_{k}\right\|_{\boldsymbol{\Sigma}_{\delta \hat{\mathbf{x}}_{k}}}^{2}+\sum_{s=1}^{m}\left\|\mathbf{r}\left(\check{\mathbf{x}}_{k}, \boldsymbol{\rho}_{s_{k}},{ }^{G} \mathbf{p}_{s}\right)+\mathbf{H}_{s}^{r} \delta \check{\mathbf{x}}_{k}\right\|_{\boldsymbol{\Sigma}_{\boldsymbol{\alpha}_{s}}}^{2}\right)\end{aligned}\tag{10} ​δxˇk​min​(∥xˇk​⊟x^k​+Hδxˇk​∥Σδx^k​​2​+s=1∑m​∥∥​r(xˇk​,ρsk​​,Gps​)+Hsr​δxˇk​∥∥​Σαs​​2​)​(10)

其中 ∥x∥Σ2=xTΣ−1x\|\mathbf{x}\|_{\boldsymbol{\Sigma}}^{2}=\mathbf{x}^{T} \boldsymbol{\Sigma}^{-1} \mathbf{x}∥x∥Σ2​=xTΣ−1x 表示马氏距离的平方,x^k\hat{\mathbf{x}}_{k}x^k​ 是IMU传播的状态估计,Σδx^k\Sigma_{\delta \hat{\mathbf{x}}_{k}}Σδx^k​​ 是IMU传播状态的协方差,H\mathcal{H}H 是从 x^k\hat{\mathbf{x}}_{k}x^k​ 的切平面投影到 xˇk\check{\mathbf{x}}_{k}xˇk​ 的切平面时的状态误差的雅可比矩阵。

其中:

H=[H1rT,…,HmrT]T(11) \mathbf{H}=\left[\mathbf{H}_{1}^{r T}, \ldots, \mathbf{H}_{m}^{r T}\right]^{T}\tag{11} H=[H1rT​,…,HmrT​]T(11)

R=diag⁡(Σα1,…,Σαm)(12) \mathbf{R}=\operatorname{diag}\left(\boldsymbol{\Sigma}_{\boldsymbol{\alpha}_{1}}, \ldots, \boldsymbol{\Sigma}_{\boldsymbol{\alpha}_{m}}\right)\tag{12} R=diag(Σα1​​,…,Σαm​​)(12)

zˇk=[r(xˇk,ρ1k,Gp1)…,r(xˇk,ρmk,Gpm)]T(13) \check{\mathbf{z}}_{k}=\left[\mathbf{r}\left(\check{\mathbf{x}}_{k}, \boldsymbol{\rho}_{1_{k}},{ }^{G} \mathbf{p}_{1}\right) \ldots, \mathbf{r}\left(\check{\mathbf{x}}_{k}, \boldsymbol{\rho}_{m_{k}},{ }^{G} \mathbf{p}_{m}\right)\right]^{T}\tag{13} zˇk​=[r(xˇk​,ρ1k​​,Gp1​)…,r(xˇk​,ρmk​​,Gpm​)]T(13)

P=(H)−1Σδx^k(H)−T(14) \mathbf{P}=(\boldsymbol{H})^{-1} \boldsymbol{\Sigma}_{\delta \hat{\mathbf{x}}_{k}}(\boldsymbol{H})^{-T}\tag{14} P=(H)−1Σδx^k​​(H)−T(14)

Kalman增益可以通过下式计算:

K=(HTR−1H+P−1)−1HTR−1(15) \mathbf{K}=\left(\mathbf{H}^{T} \mathbf{R}^{-1} \mathbf{H}+\mathbf{P}^{-1}\right)^{-1} \mathbf{H}^{T} \mathbf{R}^{-1}\tag{15} K=(HTR−1H+P−1)−1HTR−1(15)

从而,我们可以通过下式进行误差状态更新:

xˇk=xˇk⊞(−Kzˇk−(I−KH)(H)−1(xˇk⊟x^k))(16) \check{\mathbf{x}}_{k}=\check{\mathbf{x}}_{k} \boxplus\left(-\mathbf{K}\check{\mathbf{z}}_{k}-(\mathbf{I}-\mathbf{K H})(\mathcal{H})^{-1}\left(\check{\mathbf{x}}_{k} \boxminus \hat{\mathbf{x}}_{k}\right)\right)\tag{16} xˇk​=xˇk​⊞(−Kzˇk​−(I−KH)(H)−1(xˇk​⊟x^k​))(16)

迭代上式直到收敛(比如状态更新值小于给定的阈值)。注意,该迭代卡尔曼滤波方法与GN高斯牛顿优化方法等价。

2 帧到地图的VIO

2.1 帧到地图光度更新

在帧到帧的VIO更新之后,我们对系统状态 xˇk\check{\mathbf{x}}_{k}xˇk​ 有了良好的估计,然后我们通过最小化跟踪点的光度误差来进行帧到地图的VIO更新,从而降低漂移。

在这里插入图片描述

如上图所示,以第 sss 个点 Ps=[GpsT,csT]T∈P\mathbf{P}_{s}=\left[{ }^{G} \mathbf{p}_{s}^{T}, \mathbf{c}_{s}^{T}\right]^{T} \in \mathcal{P}Ps​=[GpsT​,csT​]T∈P 为例,其帧到地图的光度误差 o(xˇk,Gps,Cs)\mathbf{o}\left(\check{\mathbf{x}}_{k},{ }^{G} \mathbf{p}_{s}, \mathbf{C}_{s}\right)o(xˇk​,Gps​,Cs​) 可以通过下式计算:

o(xˇk,Gps,cs)=cs−γs(17) \mathbf{o}\left(\check{\mathbf{x}}_{k},{ }^{G} \mathbf{p}_{s}, \mathbf{c}_{s}\right)=\mathbf{c}_{s}-\gamma_{s}\tag{17} o(xˇk​,Gps​,cs​)=cs​−γs​(17)

其中,cs\mathbf{c}_{s}cs​ 是保存在全局地图中的颜色,γs\gamma_{s}γs​ 是当前图像帧 Ik\mathbf{I}_{k}Ik​ 中观察到的颜色。为了得到观测到的颜色 γs\gamma_{s}γs​ 及其协方差矩阵 Σnγs\Sigma_{\mathbf{n}_{\gamma_{s}}}Σnγs​​​,我们预测点 sss 在当前图像帧 Ik\mathbf{I}_{k}Ik​ 上的坐标为 ρ~sk=π(Cps,xˇk)\tilde{\rho}_{s_{k}}=\pi\left({ }^{C} \mathbf{p}_{s}, \check{\mathbf{x}}_{k}\right)ρ~​sk​​=π(Cps​,xˇk​),然后线性插值计算得到相邻像素的RGB颜色。

我们同样考虑 γs\gamma_{s}γs​ 和 cs\mathbf{c}_{s}cs​ 的测量误差:

γs=γsgt+nγs,nγs∼N(0,Σnγs)(18) \gamma_{s}=\boldsymbol{\gamma}_{s}^{g t}+\mathbf{n}_{\boldsymbol{\gamma}_{s}}, \mathbf{n}_{\boldsymbol{\gamma}_{s}} \sim \mathcal{N}\left(\mathbf{0}, \boldsymbol{\Sigma}_{\mathbf{n}_{\gamma_{s}}}\right)\tag{18} γs​=γsgt​+nγs​​,nγs​​∼N(0,Σnγs​​​)(18)

cs=csgt+ncs+ηcs,ncs∼N(0,Σncs)ηcs∼N(0,σs2⋅Δtcs)(19) \begin{gathered}\mathbf{c}_{s}=\mathbf{c}_{s}^{g t}+\mathbf{n}_{\mathbf{c}_{s}}+\boldsymbol{\eta}_{\mathbf{c}_{s}}, \\\mathbf{n}_{\mathbf{c}_{s}} \sim \mathcal{N}\left(\mathbf{0}, \mathbf{\Sigma}_{\mathbf{n}_{\mathbf{c}_{s}}}\right) \\\boldsymbol{\eta}_{\mathbf{c}_{s}} \sim \mathcal{N}\left(\mathbf{0}, \boldsymbol{\sigma}_{s}^{2} \cdot \Delta t_{\mathbf{c}_{s}}\right)\end{gathered}\tag{19} cs​=csgt​+ncs​​+ηcs​​,ncs​​∼N(0,Σncs​​​)ηcs​​∼N(0,σs2​⋅Δtcs​​)​(19)

其中,γsgt\gamma_{s}^{g t}γsgt​ 是 γs\gamma_{s}γs​ 的真值,csgt\mathbf{c}_{s}^{g t}csgt​ 是 cs\mathbf{c}_{s}cs​ 的真值,Δtcs\Delta t_{\mathbf{c}_{s}}Δtcs​​ 是当前帧和 Ps\mathbf{P}_{s}Ps​ 上次渲染时的时间间隔。

在公式(19)中, cs\mathbf{c}_{s}cs​ 的测量噪声由两部分组成:上次渲染的估计误差 ncs\mathbf{n}_{\mathbf{c}_{s}}ncs​​ 和脉冲随机游走过程噪声 ηcs\boldsymbol{\eta}_{\mathbf{c}_{s}}ηcs​​(它解释了环境光照的变化)。

结合公式(17)(18)(19),我们得到残差零真值 o(xk,Gpsgt,csgt)\mathbf{o}\left(\mathbf{x}_{k},{ }^{G} \mathbf{p}_{s}^{g t}, \mathbf{c}_{s}^{g t}\right)o(xk​,Gpsgt​,csgt​) 的一阶泰勒展开:

0=o(xk,Gpsgt,csgt)≈o(xˇk,Gps,cs)+Hsoδxˇk+βs(20) \mathbf{0}=\mathbf{o}\left(\mathbf{x}_{k},{ }^{G} \mathbf{p}_{s}^{g t}, \mathbf{c}_{s}^{g t}\right) \approx \mathbf{o}\left(\check{\mathbf{x}}_{k},{ }^{G} \mathbf{p}_{s}, \mathbf{c}_{s}\right)+\mathbf{H}_{s}^{o} \delta \check{\mathbf{x}}_{k}+\boldsymbol{\beta}_{s}\tag{20} 0=o(xk​,Gpsgt​,csgt​)≈o(xˇk​,Gps​,cs​)+Hso​δxˇk​+βs​(20)

其中:

Hso=∂o(xˇk⊞δxˇk,Gps,cs)∂δxˇk∣δxˇk=0(21) \mathbf{H}_{s}^{o}=\left.\frac{\partial \mathbf{o}\left(\check{\mathbf{x}}_{k} \boxplus \delta \check{\mathbf{x}}_{k},{ }^{G} \mathbf{p}_{s}, \mathbf{c}_{s}\right)}{\partial \delta \check{\mathbf{x}}_{k}}\right|_{\delta \check{\mathbf{x}}_{k}=\mathbf{0}}\tag{21} Hso​=∂δxˇk​∂o(xˇk​⊞δxˇk​,Gps​,cs​)​∣∣​δxˇk​=0​(21)

Σβs=Σncs+σs2⋅Δtcs+Σnγs+FpsoΣpsFpsoT(22) \boldsymbol{\Sigma}_{\boldsymbol{\beta}_{s}}=\boldsymbol{\Sigma}_{\mathbf{n}_{\mathbf{c}_{s}}}+\boldsymbol{\sigma}_{s}^{2} \cdot \Delta t_{\mathbf{c}_{s}}+\boldsymbol{\Sigma}_{\mathbf{n}_{\gamma_{s}}}+\mathbf{F}_{\mathbf{p}_{s}}^{o} \boldsymbol{\Sigma}_{\mathbf{p}_{s}} \mathbf{F}_{\mathbf{p}_{s}}^{o T}\tag{22} Σβs​​=Σncs​​​+σs2​⋅Δtcs​​+Σnγs​​​+Fps​o​Σps​​Fps​oT​(22)

Fpso=∂o(xˇk,Gps,cs)∂Gps(23) \mathbf{F}_{\mathbf{p}_{s}}^{o}=\frac{\partial \mathbf{o}\left(\check{\mathbf{x}}_{k},{ }^{G} \mathbf{p}_{s}, \mathbf{c}_{s}\right)}{\partial{ }^{G} \mathbf{p}_{s}}\tag{23} Fps​o​=∂Gps​∂o(xˇk​,Gps​,cs​)​(23)

2.2 帧到地图的VIO ESIKF更新

公式(20)构成了 δxˇk\delta \check{\mathbf{x}}_{k}δxˇk​ 的另一个观测分布,它与IMU传播的先验分布相结合,得到了 δxˇk\delta \check{\mathbf{x}}_{k}δxˇk​ 的最大后验(MAP)估计:

min⁡δxˇk(∥xˇk⊟x^k+Hδxˇk∥Σδx^k2+∑s=1m∥o(xˇk,Gps,cs)+Hsoδxˇk∥Σβs2)(24) \begin{aligned}\min _{\delta \check{\mathbf{x}}_{k}}\left(\left\|\check{\mathbf{x}}_{k} \boxminus \hat{\mathbf{x}}_{k}+\mathcal { H } \delta \check{\mathbf{x}}_{k}\right\|_{\boldsymbol{\Sigma}_{\delta \hat{\mathbf{x}}_{k}}^{2}}+\sum_{s=1}^{m}\left\|\mathbf{o}\left(\check{\mathbf{x}}_{k},{ }^{G} \mathbf{p}_{s}, \mathbf{c}_{s}\right)+\mathbf{H}_{s}^{o} \delta \check{\mathbf{x}}_{k}\right\|_{\boldsymbol{\Sigma}_{\boldsymbol{\beta}_{s}}}^{2}\right)\end{aligned}\tag{24} δxˇk​min​(∥xˇk​⊟x^k​+Hδxˇk​∥Σδx^k​2​​+s=1∑m​∥∥​o(xˇk​,Gps​,cs​)+Hso​δxˇk​∥∥​Σβs​​2​)​(24)

其中:

H=[H1oT,…,HmoT]T(25) \mathbf{H}=\left[\mathbf{H}_{1}^{o T}, \ldots, \mathbf{H}_{m}^{o} T\right]^{T}\tag{25} H=[H1oT​,…,Hmo​T]T(25)

R=diag⁡(Σβ1,…,Σβm)(26) \mathbf{R}=\operatorname{diag}\left(\boldsymbol{\Sigma}_{\boldsymbol{\beta}_{1}}, \ldots, \boldsymbol{\Sigma}_{\boldsymbol{\beta}_{m}}\right)\tag{26} R=diag(Σβ1​​,…,Σβm​​)(26)

zˇk=[o(xˇk,Gp1,c1)…,o(xˇk,Gpm,cm)]T(27) \check{\mathbf{z}}_{k}=\left[\mathbf{o}\left(\check{\mathbf{x}}_{k},{ }^{G} \mathbf{p}_{1}, \mathbf{c}_{1}\right) \ldots, \mathbf{o}\left(\check{\mathbf{x}}_{k},{ }^{G} \mathbf{p}_{m}, \mathbf{c}_{m}\right)\right]^{T}\tag{27} zˇk​=[o(xˇk​,Gp1​,c1​)…,o(xˇk​,Gpm​,cm​)]T(27)

P=(H)−1Σδx^k(H)−T(28) \mathbf{P}=(\mathcal{H})^{-1} \boldsymbol{\Sigma}_{\delta \hat{\mathbf{x}}_{k}}(\mathcal{H})^{-T}\tag{28} P=(H)−1Σδx^k​​(H)−T(28)

然后,我们执行类似于公式(15)和(16)的状态更新:

x^k=xˇk,Σδx^k=(I−KH)Σδxˇk(29) \hat{\mathbf{x}}_{k}=\check{\mathbf{x}}_{k}, \quad \boldsymbol{\Sigma}_{\delta \hat{\mathbf{x}}_{k}}=(\mathbf{I}-\mathbf{K} \mathbf{H}) \boldsymbol{\Sigma}_{\delta \check{\mathbf{x}}_{k}} \tag{29} x^k​=xˇk​,Σδx^k​​=(I−KH)Σδxˇk​​(29)

使用 ESIKF 对帧到地图的VIO 迭代更新直到收敛,然后使用收敛的状态估计值去:

  1. 渲染地图的纹理
  2. 更新当前跟踪点集合 P\mathcal{P}P ,给下一帧使用
  3. 在下一帧LIO或者VIO更新中,作为IMU传播的起点

2.3 渲染全局地图的纹理

在帧到地图的VIO更新之后,我们得到了当前图像帧的精确位姿,然后我们执行渲染功能来更新地图点的颜色。

在这里插入图片描述

首先,我们在所有激活的体素中的检索所有点。假设总共有 nnn 个点,记为 ζ={P1,…,Pn}\zeta=\left\{\mathbf{P}_{1}, \ldots, \mathbf{P}_{n}\right\}ζ={P1​,…,Pn​}。以第 sss 个点 Ps=[GpsT,csT]T∈ζ\mathbf{P}_{s}=\left[{ }^{G} \mathbf{p}_{s}^{T}, \mathbf{c}_{s}^{T}\right]^{T} \in \zetaPs​=[GpsT​,csT​]T∈ζ 的颜色更新过程为例。如果点 Ps\mathbf{P}_{s}Ps​ 落在当前图像帧 Ik\mathbf{I}_{k}Ik​ 中,我们通过对当前图像帧 Ik\mathbf{I}_{k}Ik​ 上相邻像素的RGB颜色值进行线性插值,得到其观测颜色 γs\gamma_{s}γs​ 和协方差 Σnγs\boldsymbol{\Sigma}_{\mathbf{n}_{\gamma_{s}}}Σnγs​​​。通过贝叶斯更新,图像上新观测到的点的颜色与记录在地图中的现有颜色值 cs\mathbf{c}_{s}cs​ 进行融合(如上图所示),得到更新后的颜色值和 cs\mathbf{c}_{s}cs​ 的协方差:

Σnc~s=((Σncs+σs2⋅Δtcs)−1+Σnγs−1)−1(30) \boldsymbol{\Sigma}_{\mathbf{n}_{\tilde{\mathbf{c}}_{s}}}=\left(\left(\boldsymbol{\Sigma}_{\mathbf{n}_{\mathbf{c}_{s}}}+\boldsymbol{\sigma}_{s}^{2} \cdot \Delta t_{\mathbf{c}_{s}}\right)^{-1}+\boldsymbol{\Sigma}_{\mathbf{n}_{\boldsymbol{\gamma}_{s}}}^{-1}\right)^{-1}\tag{30} Σnc~s​​​=((Σncs​​​+σs2​⋅Δtcs​​)−1+Σnγs​​−1​)−1(30)

c~s=((Σncs+σs2⋅Δtcs)−1cs+Σnγs−1γs)−1Σnc~s(31) \tilde{\mathbf{c}}_{s}=\left(\left(\boldsymbol{\Sigma}_{\mathbf{n}_{\mathbf{c}_{s}}}+\boldsymbol{\sigma}_{s}^{2} \cdot \Delta t_{\mathbf{c}_{s}}\right)^{-1} \mathbf{c}_{s}+\boldsymbol{\Sigma}_{\mathbf{n}_{\gamma_{s}}}^{-1} \gamma_{s}\right)^{-1} \boldsymbol{\Sigma}_{\mathbf{n}_{\tilde{\mathbf{c}}_{s}}}\tag{31} c~s​=((Σncs​​​+σs2​⋅Δtcs​​)−1cs​+Σnγs​​−1​γs​)−1Σnc~s​​​(31)

cs=c~s,Σncs=Σnc~s(32) \mathbf{c}_{s}=\tilde{\mathbf{c}}_{s}, \quad \mathbf{\Sigma}_{\mathbf{n}_{\mathbf{c}_{s}}}=\boldsymbol{\Sigma}_{\mathbf{n}_{\tilde{\mathbf{c}}_{s}}}\tag{32} cs​=c~s​,Σncs​​​=Σnc~s​​​(32)

2.4 VIO子系统的跟踪点更新

在纹理渲染完成后,我们对所跟踪的点集 P\mathcal{P}P 进行更新:

  • 删除点:如果点集 P\mathcal{P}P 的点通过公式(2)计算出来的PnP重投影误差或者通过公式(17)计算出来的光度误差太大,我们会从跟踪点的集合中删除这些点,我们还会删除重投影之后不属于当前图像帧 Ik\mathbf{I}_{k}Ik​ 的点。
  • 添加点:我们将 ζ\zetaζ 中的每个点投影到当前图像帧 Ik\mathbf{I}_{k}Ik​ 上,如果附近没有其它跟踪点(例如,半径50像素内),则将其添加到点集 P\mathcal{P}P 中。
R3LIVE(升级R2LIVE):编译与运行 之前港科大的hku-mars火星实验室在R2LIVE的基础上提出了“R3Live”,论文和视频很早就发出来了,但是代码一直没有开源(作者一直强调会开源), 在一众slamer的千呼万唤之下, 在2021年的年尾, 终于,能够在github下载了。...... 阅读详情

相关推荐

R3live:整体分析

r3live运行

handily_1的博客 4931

激光SLAM论文R3LIVE和LIO-SAM阅读

采用方法:为了确保实时的高性能,边缘旧的激光雷达扫描以进行姿态优化,不是将激光雷达扫描匹配到全局地图。VIO使用传感器渲染地图的纹理,即3D点云的颜色;创新点:VIO通过最小化观测地图点的RGB颜色与其在当前图像中测量的颜色之间的光度误差来估计当前状态。VIO子系统受两个主要设置的影响:图像的大小(“图像大小”)和点云图的分辨率(“Pcres”)使用的指标:与地面真实结束姿态相比,我们的算法旋转漂移1.62˝,平移4.57 cm.通过最小化帧到帧的pnp重投影误差和帧到地图的。VIO 每帧耗费的时间。

Turn life into a dream, and then turn dreams into reality 636

R3LIVE从零开始搭建环境和实物(livox avia + d435)

本人以前有过点ros基础刚好最近在学习slam以及vio和lio,在这一个月份以来最起码,初步接触了vio以及slam和lio,并且自己成功的搭建了自己的实物平台,写这篇文章就是希望初次搭建的同学不用再踩一次博主踩过的坑。

2301_79360298的博客 4813

R3LIVE++ 论文阅读

为了确保稳健和快速的收敛,我们设计了一个两步流水线,如图所示,其中在第一步 (即,帧到帧 VIO) 我们利用帧到帧光流来跟踪最后一帧中观察到的地图点,并通过最小化被跟踪点的透视 n 点 (PnP) 重投影误差来获得系统状态的粗略估计。然后,在第二步骤 (即帧到地图 VIO) 中,通过最小化地图点的辐射度与当前图像中它们的投影位置处的像素强度之间的差来进一步细化状态估计。此外,我们还记录该点的其他必要信息,包括点的估计误差的协方差,以及创建和更新该点时的时间戳。曝光时间 r 在我们的工作中是在线估计的。

人无远虑,必有近忧 1433

R3LIVE源码解析(10) — R3LIVE中r3live_vio.cpp文件

R3LIVE主要的公式推导在VIO上,所以我们来细细的分析这部分的功能。R3LIVE将VIO分成了两步,一是直接通过帧间的光流来追踪地图点,并且通过最小化追踪到的地图点的PNP投影误差来获取系统状态;二是通过这些地图点的出现的帧到地图的光度误差来优化状态。

几度春风里的博客 1495

R3LIVE:一个实时鲁棒、带有RGB颜色信息的激光雷达-惯性-视觉紧耦合系统(香港大学)

基本情况 出处:R3LIVE: A Robust, Real-time, RGB-colored, LiDAR-Inertial-Visual tightly-coupled state Estimation and mapping package 作者:Jiarong Lin and Fu Zhang(香港大学) 视频:https://www.bilibili.com/video/BV1d341117d6?p=1&share_medium=android&share_plat=a..

惊鸿一博 5432

R3LIVE论文解读及框架调参结果

R3live论文解读

wanyi999的博客 1680

R3LIVE源码解析(6) — R3LIVE流程详解

R3LIVE是香港大学Mars实验室提出的一种融合imu、相机、激光的SLAM方法,R3LIVE由两个子系统组成,一个激光惯性里程计(LIO)和一个视觉惯性里程计(VIO)。LIO子系统(FAST-LIO)利用来自激光雷达和惯性传感器的测量数据,并且构建地图的几何结构(即3D点位置)。VIO子系统使用视觉惯性传感器的数据,并且渲染地图的纹理(即3D点颜色)。更具体而言,VIO子系统通过最小化帧到地图的光度误差直接且有效地融合视觉数据。

几度春风里的博客 2976

R3LIVE调试记录

港大R3LIVE项目的学习与具体调试,通过修改livox_ros_driver可以运行自己的数据集

m0_49929125的博客 8945

COMSOL实战:薄膜声学超材料模态分析全流程解析(含预应力设置技巧)

本文详细解析了使用COMSOL进行薄膜声学超材料模态分析的全流程,包括预应力设置技巧和共振频率优化方法。通过实际案例和参数设置指南,帮助工程师掌握从几何建模到结果解读的关键步骤,特别适合声学超材料和共振薄膜结构的设计与优化。

ujm5678901的博客 292

用逻辑分析仪实测EM4095:125kHz RFID耳标解码的电压与脉宽玄学

本文通过逻辑分析仪实测EM4095芯片,深入解析125kHz RFID耳标解码中的电压与脉宽关联现象。揭示了供电电压对曼彻斯特编码脉宽的影响规律,并提供了一套可落地的调试方法论,包括信号链路解析、逻辑分析仪配置技巧及系统级稳定性提升方案,帮助开发者解决解码不稳定问题。

weixin_30629653的博客 329

R3Live系列学习(五)R3Live源码阅读

编译它的时候可能会报“'ScalarBinaryOpTraits' in namespace 'Eigen' does not names a template type”之类的信息,这可能是由于电脑中存在多个Eigen库,可以在电脑上搜索出可能存在的Eigen库,不出意外的话会有包括ScalarBinaryOpTraits的也有没有包括的,直接在CMakeLists里面强行指定include路径,或者屏蔽没包括的那些Eigen库即可。

weixin_42048023的博客 3048

MagicDraw-用例图

MagicDraw-用例图

木头征的博客 3129

R3live论文翻译

在本文中,我们提出了一个新颖的激光惯性视觉传感器融合框架,也就是R3live;它利用了激光雷达、惯性和视觉传感器的测量值,可以得到鲁棒和高精度的状态估计。R3live包含了两个子系统,激光惯性里程计系统(LIO)和视觉惯性里程计系统(VLO)。LIO子系统(FAST-LIO)利用激光雷达和惯性传感器的测量数据构建全局地图的几何特征。VIO子系统则利用视觉和惯性传感器的测量数据给地图添加纹理(也就是给3D点赋予颜色)...............

JunJun 2338

Sigrity System SI SerialLink模式进行SFP+协议仿真分析-PCB操作指导

Random(Rj):随机抖动,该抖动用高斯概率分布来描述,通常是由热噪声和其它随机噪声引起的,默认为1%UI RMS(平均值),即和标准值的偏差为1%UI。Random(Rj):随机抖动,该抖动用高斯概率分布来描述,通常是由热噪声和其它随机噪声引起的,默认为1%UI RMS(平均值),即和标准值的偏差为1%UI。Random(Rj):随机噪声,是由信号电压的随机波动引起的,默认为1mv RMS(平均值),即和标准值的偏差为1mv。

weixin_54787054的博客 508

PY32F406K1CU6 FLASH模拟EEPROM

摘要:本文介绍了基于STM32 FLASH模拟EEPROM的实现方法。头文件flash.h定义了FLASH页大小(256字节)、用户存储区域(4页)及地址范围,提供了等待周期配置和地址校验宏,声明了EEPROM初始化、读写操作等函数接口。源文件flash.c实现了具体功能:配置FLASH等待周期(144MHz需3WS)、页读写擦除操作,以及EEPROM初始化(解锁-擦除-验证-锁定)和缓冲区读写功能。其中写操作采用"读页→更新→擦除→编程"的流程,确保数据安全写入。该方案适用于需要非易失

sam的博客 194

学习R3live的链接

r3live学习

WY110000的博客 1058

GEE案例:Landsat 5、7、8影像构建1985-2023年rsei生态遥感指数详细代码

rsei(Regional Silviculture Ecological Index,地区林业生态指数)是一种生态遥感指标,用于评估森林生态系统的健康状况和生态服务。构建1985-2023年的rsei生态遥感指,主要需要使用Landsat 5、7和8的遥感影像数据。以下是一种可能的构建方法:1. 数据获取:从美国地质调查局(USGS)或其他可靠数据提供商处获取Landsat 5、7和8的遥感影像数据。确保选择的影像具有适当的空间和时间分辨率,以覆盖所需的时间段。

此星光明博客 3413

R3live笔记:r3live的几个线程分析

今天在r3live类的构造函数里看到这样一行代码: m_thread_pool_ptr = std::make_shared<Common_tools::ThreadPool>(6, true, false); // At least 5 threads are needs, here we allocate 6 threads. 大意是初始化一个包含6个线程的线程池子,然后作者注释 // At least 5 threads are needs, here we alloca

handily_1的博客 2059

飞牛fnNAS搭建Web网页版OFFICE(WPS)软件

本文介绍了如何在飞牛NAS上通过Docker容器部署WPS Office办公软件。主要内容包括:启用Docker服务、准备项目文件夹结构、使用Compose方式构建容器、解决端口冲突问题、配置中文输入法和字体库,以及通过ZeroTier实现远程访问。文章详细说明了每个步骤的操作方法,包括容器启动、输入法设置、字体添加和文件存储位置配置。最后还介绍了使用ZeroTier内网穿透技术实现远程访问NAS上WPS服务的方法,让用户可以在不同设备上随时编辑NAS中的文件。整个部署过程完整清晰,为NAS用户提供了便捷的

dgnankai的专栏 1701

自动识别象棋棋子的OpenCV应用

在计算机视觉领域,OpenCV是一个广泛应用的开源计算机视觉库,它提供了丰富的图像处理和分析工具。本文将介绍如何使用OpenCV实现自动识别象棋棋子的功能,并提供相应的源代码。通过以上代码,我们可以实现对棋盘图像中棋子的自动识别。需要注意的是,以上代码只是一个简单的示例,实际应用中可能需要根据具体情况进行参数调整和算法优化,以获得更好的识别效果。函数利用预处理后的图像,寻找图像中的轮廓,并根据轮廓的面积筛选出可能的棋子轮廓,最后在原图像中提取棋子区域。在主程序中,我们读取输入图像,并调用。

WzisTypescript的博客 908

R3LIVE代码详解(二)

我们在上文中提到R3LIVE主要由两个node节点所依赖的cpp文件组成,我们在上一节中完成了简单介绍,下面我们需要详细的看这个节点。这个节点也是我们R3LIVE的核心。

lovely_yoshino的博客 6665

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

R3LIVE开源代码全体验及测试

作者丨颍川滞@知乎来源丨https://zhuanlan.zhihu.com/p/453038352编辑丨3D视觉工坊前言:Hello,大家好,我是清华自动化的小郭,前两个月我开始做SLA...

3D视觉工坊 3279

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

R2Live、R3Live和 R3Live++

提出了一个实时的LiDAR-惯性-视觉紧耦合的多传感器融合框架,通过融合LiDAR、惯性测量单元(IMU)和相机传感器的数据,实现高鲁棒性和高精度的状态估计。:继承R2LIVE框架,在LiDAR-惯性里程计(LIO)中增加了视觉里程计(VIO)模块,实现了帧到地图光度误差优化,用以增强纹理渲染。:将LiDAR和VIO紧耦合程度提升,提出基于帧到地图的光度误差最小化算法,并融合在线光度校准,显著增强了地图的表现力。

czlmd的博客 2383

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

R3LIVE论文阅读

R3LIVE: A Robust, Real-time, RGB-colored, LiDAR-Inertial-Visual tightly-coupled state Estimation and mapping package 作者:Jiarong Lin and Fu Zhang(香港大学) 视频:视频链接 开源代码:https://github.com/hku-mars/r3live 论文地址:论文原文 文章概述 R3LIVE 是一个面向各种应用的多功能系统,不仅可以作为实时机器人应用的SLAM系

JaydenQ的博客 985

R3LIVE: A Robust, Real-time, RGB-colored, LiDAR-Inertial-Visual tightly-coupled state,香港大学R3LIVE论文解析

本文提出了一种新颖的激光雷达-惯性-视觉多传感器融合框架,称为 R3LIVE。该框架充分利用激光雷达、惯性测量单元与视觉传感器的观测数据,以实现鲁棒且准确的状态估计。**R3LIVE 由两个子系统构成:激光雷达-惯性里程计(LIO)与视觉-惯性里程计(VIO)。其中,LIO 子系统(即 FAST-LIO)利用激光雷达和惯性传感器的数据,构建地图的几何结构(即三维点的位置)。VIO 子系统则使用视觉-惯性传感器的数据,为地图赋予纹理信息(即三维点的颜色)。具体而言,VIO 子系统通过最小化帧到地图的光度误差,

m0_52115153的博客 856
上一篇: 贝叶斯滤波器
下一篇: 高斯推断推导
威士忌燕麦拿铁
博客等级 码龄10年 5443粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值