发布时间:2023-06-05 14:30
当机器人在更大范围的时间和空间运动时,由于算力不够及数据太多的原因,必须考虑一些解决方式: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,...,xN和y1,...,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]T∼N([μ1,…,μN]T,Σ)
其中 μ k \mu_k μk为第 k k k和关键帧的位姿均值, Σ \boldsymbol{\Sigma} Σ为所有关键帧的协方差矩阵,那么显然,均值部分就是指BA迭代后的结果,而 Σ \boldsymbol{\Sigma} Σ就是对整个BA的 H \boldsymbol{H} H矩阵进行边缘化后的 S \boldsymbol{S} S矩阵。这里不懂 的可以看这里
在滑动窗口中,当窗口结构发生改变时,整个过程可以分成两部分:
新增一个关键帧和路标点
在这个过程中,并没有什么问题,按照正常的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,y1…y6∣x1)舍去 p(x1)
当某个关键帧被边缘化,它观测的路标就会产生一个“这些路标应该在哪里”的先验信息(其实是保持当前的估计值,在下一个优化过程中,不再优化这个变量了,这个变量其实是路标点的世界坐标系)。如果再边缘化这些路标点,那么它们将得到一个“观测它们的关键帧应该在哪里”(其实是确定了相机的姿态)
滑动窗口删除关键帧将破坏路标部分的对角结构(这里的删除就是边缘化一个关键帧)
边缘化 x 1 x_1 x1,Schur消元过程相当于通过矩阵行和列操作消去非对角线处几个非零矩阵块(这个非零矩阵块就是上一讲的 E 和 E T E和E^T E和ET),显然这将导致右下角的路标点矩阵块不再是对角矩阵。称这个过程为填入(Fill-in)
当我们边缘化路标点时,Fill-in将出现在左上角的位姿块中。不过,因为BA不要求位姿块(左上角)为对角块,所以稀疏BA求解仍然可行,但是,当边缘化关键帧时,将破坏右下角路标点之间的对角块结构,这时BA就无法按照先前的稀疏方式迭代求解。
解决方案:对边缘化的过程进行改造,也可以保持滑动窗口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=ξi−1∘ξj=ln(exp((−ξi)∧)exp(ξj∧))∨
或者:
Δ T i j = T i − 1 T j \Delta T_{i j}=T_{i}^{-1} T_{j} ΔTij=Ti−1Tj
按照图优化的思路,实际中上式不会精确成立,因此设立最小二乘误差,然后讨论误差关于优化变量的导数。把上式中的 Δ 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(ΔTij−1Ti−1Tj)∨=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(ΔTij−1Ti−1exp((−δξ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(ξ∧)T−1
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(T−1)ξ)∧)
导出最右或者最左的雅可比矩阵,这里导数的为最右。
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(ΔTij−1Ti−1exp((−δξi)∧)exp(δξj∧)Tj)∨=ln(ΔTij−1Ti−1Tjexp((−Ad(Tj−1)δξi)∧)exp((Ad(Tj−1)δξj)∧))∨≈ln(ΔTij−1Ti−1Tj[I−(Ad(Tj−1)δξi)∧+(Ad(Tj−1)δξj)∧])∨≈eij+∂δξi∂eijδξi+∂δξj∂eijδξ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) ∂δξi∂eij=−Jr−1(eij)Ad(Tj−1)
关于 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) ∂δξj∂eij=Jr−1(eij)Ad(Tj−1)
由于 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] Jr−1(eij)≈I+21[ϕe∧0ρ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,j∈E∑eijTΣij−1eij
然后进行求解。
1.视觉SLAM十四讲