SLAM【九】后端2

当机器人在更大范围的时间和空间运动时,由于算力不够及数据太多的原因,必须考虑一些解决方式:1. 滑动窗口:丢弃一些历史数据 2. 位姿图:舍弃对路标点的优化,只保留Pose之间的边。

滑动窗口滤波和优化

问题:需要控制BA的规模,保持计算的实时性,需要限制后端的计算时间。
控制计算规模的方法:
滑动窗口法:仅保留当前时刻最近的 N N N个关键帧,去掉时间上更早的关键帧。即将BA固定在一个时间窗口内,离开这个窗口的关键帧将被丢弃。
共视图:按照某种原则,取时间上靠近,空间上又可以展开的关键帧,从而保证相机即使在 停止不动时,BA的结构也不至于缩成一团。与现在的相机存在共同观测的关键帧构成的图

在这里插入图片描述

滑动窗口法

现考虑一个滑动窗口,其中有 N N N个关键帧和 M M M个路标点, N N N个关键帧的位姿表示和 M M M个路标点的世界坐标表示为:
x 1 , . . . , x N 和 y 1 , . . . , y M x_1,...,x_N和y_1,...,y_M x1,...,xNy1,...,yM
根据这 N N N个关键帧和 M M M个路标可以组成一个局部地图,然后根据上一讲SLAM【八】后端1介绍的BA方法处理这个滑动窗口,整个系统的均值和协方差应该是
[ x 1 , … , x N ] T ∼ N ( [ μ 1 , … , μ N ] T , Σ ) \left[\boldsymbol{x}_{1}, \ldots, \boldsymbol{x}_{N}\right]^{\mathrm{T}} \sim N\left(\left[\boldsymbol{\mu}_{1}, \ldots, \boldsymbol{\mu}_{N}\right]^{\mathrm{T}}, \boldsymbol{\Sigma}\right) [x1,,xN]TN([μ1,,μN]T,Σ)
其中 μ k \mu_k μk为第 k k k和关键帧的位姿均值, Σ \boldsymbol{\Sigma} Σ为所有关键帧的协方差矩阵,那么显然,均值部分就是指BA迭代后的结果,而 Σ \boldsymbol{\Sigma} Σ就是对整个BA的 H \boldsymbol{H} H矩阵进行边缘化后的 S \boldsymbol{S} S矩阵。这里不懂 的可以看这里

在滑动窗口中,当窗口结构发生改变时,整个过程可以分成两部分:

  1. 在窗口中新增一个关键帧,以及它观测到的路标点。
  2. 把窗口中旧的关键帧删除,也可能删除它观测到的路标点。

新增一个关键帧和路标点
在这个过程中,并没有什么问题,按照正常的BA流程处理即可,对所有点进行边缘化时,得到这个N+1个关键帧的高斯分布参数。

删除一个旧的关键帧

遇到的问题:要删除旧关键帧 x 1 x_1 x1,但是 x 1 x_1 x1并不是孤立的,这一帧和其他帧观测到同样的路标。
解决:边缘化这一帧,但是因为它不是孤立的,所以会使整个问题不再稀疏。

在这里解释为什么是边缘化会删除一个不是孤立的帧
边缘化实际上在概率上的意义就是指条件概率。当我们边缘化某个关键帧,即“保持这个关键帧当前的估计值,求其他状态变量以这个关键帧为条件的条件概率”。
p ( x 1 , … x 4 , y 1 , … y 6 ) = p ( x 2 , … , x 4 , y 1 … y 6 ∣ x 1 ) p ( x 1 ) ⏟ 舍去 p\left(x_{1}, \ldots x_{4}, y_{1}, \ldots y_{6}\right)=p\left(x_{2}, \ldots, x_{4}, y_{1} \ldots y_{6} \mid x_{1}\right) \underbrace{p\left(x_{1}\right)}_{\text {舍去}} p(x1,x4,y1,y6)=p(x2,,x4,y1y6x1)舍去 p(x1)
当某个关键帧被边缘化,它观测的路标就会产生一个“这些路标应该在哪里”的先验信息(其实是保持当前的估计值,在下一个优化过程中,不再优化这个变量了,这个变量其实是路标点的世界坐标系)。如果再边缘化这些路标点,那么它们将得到一个“观测它们的关键帧应该在哪里”(其实是确定了相机的姿态)

在这里插入图片描述
滑动窗口删除关键帧将破坏路标部分的对角结构(这里的删除就是边缘化一个关键帧)

边缘化 x 1 x_1 x1,Schur消元过程相当于通过矩阵行和列操作消去非对角线处几个非零矩阵块(这个非零矩阵块就是上一讲 E 和 E T E和E^T EET),显然这将导致右下角的路标点矩阵块不再是对角矩阵。称这个过程为填入(Fill-in)

当我们边缘化路标点时,Fill-in将出现在左上角的位姿块中。不过,因为BA不要求位姿块(左上角)为对角块,所以稀疏BA求解仍然可行,但是,当边缘化关键帧时,将破坏右下角路标点之间的对角块结构,这时BA就无法按照先前的稀疏方式迭代求解。

解决方案:对边缘化的过程进行改造,也可以保持滑动窗口BA的稀疏性。

  1. 在边缘化某个旧的关键帧时,同时边缘化它观测到的路标点。这样,路标点的信息就会转换成剩下那些关键帧之间的共视信息,从而保持右下角部分的对角块结构。
  2. 判断要边缘化的那个关键帧,它看到的路标点是否在最新的关键帧中仍能看到。如果不能,就直接边缘化这个路标点,如果能,就丢弃被边缘化关键帧对这个路边点的观测,从而保持BA的稀疏性。

位姿图

问题:经过若干次观测之后,收敛的特征点再进行观测优化,变化也不会太大,发散的外点也早就被剔除了,这时优化特征点的性价比已经不高了。
解决:优化几次后,把特征点固定住,只把它们看作位姿估计的约束,而不再实际的优化它们的位置估计了。

在这里插入图片描述
构建一个只有轨迹的凸优化,而位姿节点之间的边,可以由两个关键帧之间通过特征匹配之后得到的运动估计来给定初始值。一旦初始估计完成,我们就不再优化那些路标点的位置,指保留了关键帧的轨迹,从而构建了所谓的位姿图。

位姿图的优化

节点表示相机位姿,以 T 1 , . . . , T n T_1,...,T_n T1,...,Tn 来表达。而边,则是两个位姿节点之间相对运动的估计,该估计可能来自于特征点法或直接法,也可以来着GPS或 IMU 积分。假设估计了 T i T_i Ti T j T_j Tj之间的一个运动 Δ T i j \Delta T_{ij} ΔTij

Δ ξ i j = ξ i − 1 ∘ ξ j = ln ⁡ ( exp ⁡ ( ( − ξ i ) ∧ ) exp ⁡ ( ξ j ∧ ) ) ∨ \Delta \boldsymbol{\xi}_{i j}=\boldsymbol{\xi}_{i}^{-1} \circ \boldsymbol{\xi}_{j}=\ln \left(\exp \left(\left(-\boldsymbol{\xi}_{i}\right)^{\wedge}\right) \exp \left(\boldsymbol{\xi}_{j}^{\wedge}\right)\right)^{\vee} Δξij=ξi1ξj=ln(exp((ξi))exp(ξj))

或者:

Δ T i j = T i − 1 T j \Delta T_{i j}=T_{i}^{-1} T_{j} ΔTij=Ti1Tj

按照图优化的思路,实际中上式不会精确成立,因此设立最小二乘误差,然后讨论误差关于优化变量的导数。把上式中的 Δ T i j \Delta T_{ij} ΔTij除到右边。定义误差 e i j e_{ij} eij

e i j = ln ⁡ ( Δ T i j − 1 T i − 1 T j ) ∨ = ln ⁡ ( exp ⁡ ( ( − Δ ξ i j ) ∧ ) exp ⁡ ( ( − ξ i ) ∧ ) exp ⁡ ( ξ j ∧ ) ) ∨ \begin{aligned} \boldsymbol{e}_{i j} &=\ln \left(\Delta \boldsymbol{T}_{i j}^{-1} \boldsymbol{T}_{i}^{-1} \boldsymbol{T}_{j}\right)^{\vee} \\ &=\ln \left(\exp \left(\left(-\Delta\boldsymbol{\xi}_{i j}\right)^{\wedge}\right) \exp \left(\left(-\boldsymbol{\xi}_{i}\right)^{\wedge}\right) \exp \left(\boldsymbol{\xi}_{j}^{\wedge}\right)\right)^{\vee} \end{aligned} eij=ln(ΔTij1Ti1Tj)=ln(exp((Δξij))exp((ξi))exp(ξj))

对两个优化变量 ξ i \xi_i ξi ξ j \xi_j ξj求导。按照李代数的求导方式,给 ξ i \xi_i ξi ξ j \xi_j ξj各一个左扰动: δ ξ i \delta \xi_i δξi δ ξ j \delta \xi_j δξj,则误差变为:

e ^ i j = ln ⁡ ( Δ T i j − 1 T i − 1 exp ⁡ ( ( − δ ξ i ) ∧ ) exp ⁡ ( δ ξ j ∧ ) T j ) ∨ \hat{\boldsymbol{e}}_{i j}=\ln \left(\Delta\boldsymbol{T}_{i j}^{-1} \boldsymbol{T}_{i}^{-1} \exp \left(\left(-\boldsymbol{\delta} \boldsymbol{\xi}_{i}\right)^{\wedge}\right) \exp \left(\delta \boldsymbol{\xi}_{j}^{\wedge}\right) \boldsymbol{T}_{j}\right)^{\vee} e^ij=ln(ΔTij1Ti1exp((δξi))exp(δξj)Tj)

两个扰动项被夹在了中间,为了使用BCH近似,希望把扰动项移至式子左侧或右侧,根据下面的式子,通过引入一个伴随项,能够“交换”扰动项左右侧的 T T T,就可以将扰动挪到最右或者最左,
exp ⁡ ( ( Ad ⁡ ( T ) ξ ) ∧ ) = T exp ⁡ ( ξ ∧ ) T − 1 \exp \left((\operatorname{Ad}(\boldsymbol{T}) \boldsymbol{\xi})^{\wedge}\right)=\boldsymbol{T} \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{T}^{-1} exp((Ad(T)ξ))=Texp(ξ)T1
exp ⁡ ( ξ ∧ ) T = T exp ⁡ ( ( Ad ⁡ ( T − 1 ) ξ ) ∧ ) \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{T}=\boldsymbol{T} \exp \left(\left(\operatorname{Ad}\left(\boldsymbol{T}^{-1}\right) \boldsymbol{\xi}\right)^{\wedge}\right) exp(ξ)T=Texp((Ad(T1)ξ))
导出最右或者最左的雅可比矩阵,这里导数的为最右。
e ^ i j = ln ⁡ ( Δ T i j − 1 T i − 1 exp ⁡ ( ( − δ ξ i ) ∧ ) exp ⁡ ( δ ξ j ∧ ) T j ) ∨ = ln ⁡ ( Δ T i j − 1 T i − 1 T j exp ⁡ ( ( − Ad ⁡ ( T j − 1 ) δ ξ i ) ∧ ) exp ⁡ ( ( Ad ⁡ ( T j − 1 ) δ ξ j ) ∧ ) ) ∨ ≈ ln ⁡ ( Δ T i j − 1 T i − 1 T j [ I − ( Ad ⁡ ( T j − 1 ) δ ξ i ) ∧ + ( Ad ⁡ ( T j − 1 ) δ ξ j ) ∧ ] ) ∨ ≈ e i j + ∂ e i j ∂ δ ξ i δ ξ i + ∂ e i j ∂ δ ξ j δ ξ j \begin{aligned} \hat{\boldsymbol{e}}_{i j} &=\ln \left(\Delta\boldsymbol{T}_{i j}^{-1} \boldsymbol{T}_{i}^{-1} \exp \left(\left(-\boldsymbol{\delta} \boldsymbol{\xi}_{i}\right)^{\wedge}\right) \exp \left(\delta \boldsymbol{\xi}_{j}^{\wedge}\right) \boldsymbol{T}_{j}\right)^{\vee} \\ &=\ln \left(\Delta\boldsymbol{T}_{i j}^{-1} \boldsymbol{T}_{i}^{-1} \boldsymbol{T}_{j} \exp \left(\left(-\operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \boldsymbol{\delta} \boldsymbol{\xi}_{i}\right)^{\wedge}\right) \exp \left(\left(\operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \boldsymbol{\delta} \boldsymbol{\xi}_{j}\right)^{\wedge}\right))^{\vee}\right.\\ & \approx \ln \left(\Delta\boldsymbol{T}_{i j}^{-1} \boldsymbol{T}_{i}^{-1} \boldsymbol{T}_{j}\left[\boldsymbol{I}-\left(\operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \boldsymbol{\delta} \boldsymbol{\xi}_{i}\right)^{\wedge}+\left(\operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \boldsymbol{\delta} \boldsymbol{\xi}_{j}\right)^{\wedge}\right]\right)^{\vee} \\ & \approx \boldsymbol{e}_{i j}+\frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{\delta} \xi_{i}} \boldsymbol{\delta} \boldsymbol{\xi}_{i}+\frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{\delta} \xi_{j}} \boldsymbol{\delta} \boldsymbol{\xi}_{j} \end{aligned} e^ij=ln(ΔTij1Ti1exp((δξi))exp(δξj)Tj)=ln(ΔTij1Ti1Tjexp((Ad(Tj1)δξi))exp((Ad(Tj1)δξj)))ln(ΔTij1Ti1Tj[I(Ad(Tj1)δξi)+(Ad(Tj1)δξj)])eij+δξieijδξi+δξjeijδξj
注意:约等于号这里使用的是泰勒展开,略去小项。
按照李代数的求导法则,求出了误差关于两个位姿的雅可比矩阵。
关于 T i T_i Ti
∂ e i j ∂ δ ξ i = − J r − 1 ( e i j ) Ad ⁡ ( T j − 1 ) \frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{\delta} \boldsymbol{\xi}_{i}}=-\mathcal{J}_{r}^{-1}\left(\boldsymbol{e}_{i j}\right) \operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) δξieij=Jr1(eij)Ad(Tj1)

关于 T j T_j Tj
∂ e i j ∂ δ ξ j = J r − 1 ( e i j ) Ad ⁡ ( T j − 1 ) \frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{\delta} \boldsymbol{\xi}_{j}}=\mathcal{J}_{r}^{-1}\left(\boldsymbol{e}_{i j}\right) \operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) δξjeij=Jr1(eij)Ad(Tj1)

由于 s e ( 3 ) se(3) se(3)上的左右雅可比 J r \mathcal{J}_{r} Jr形式过于复杂,我们通常取他们的近似。如果误差接近零,我们就可以设它们近似为 I I I或者:

J r − 1 ( e i j ) ≈ I + 1 2 [ ϕ e ∧ ρ e ∧ 0 ϕ e ∧ ] \mathcal{J}_{r}^{-1}\left(e_{i j}\right) \approx \boldsymbol{I}+\frac{1}{2}\left[\begin{array}{cc} \phi_{e}^{\wedge} & \rho_{e}^{\wedge} \\ 0 & \phi_{e}^{\wedge} \end{array}\right] Jr1(eij)I+21[ϕe0ρeϕe]

优化问题:优化变量为各个顶点的位姿,边来自于位姿观测约束。总体目标函数为:

min ⁡ ξ 1 2 ∑ i , j ∈ E e i j T Σ i j − 1 e i j \min _{\boldsymbol{\xi}} \frac{1}{2} \sum_{i, j \in \mathcal{E}} \boldsymbol{e}_{i j}^{T} \boldsymbol{\Sigma}_{i j}^{-1} \boldsymbol{e}_{i j} ξmin21i,jEeijTΣij1eij

然后进行求解。

参考

1.视觉SLAM十四讲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值