- 从本节开始步入后端,对前端视觉里程计粗略得到的位姿以及空间点进一步优化.
- 共介绍两种方法:卡尔曼滤波器(EKF)和光束法平差(BA).
- 建议在初学BA时多下些功夫了解什么是边缘化,不光本节用到,下一节的滑动窗口法也要用到边缘化的概念.(当然,本讲也给出了相应的理解)
视觉SLAM学习打卡【9】-后端·EKF&BA
一、后端状态估计问题的处理方法
(1)批量(Batch):考虑一段长时间内的状态估计问题,不仅用过去的所有信息更新自己的状态,也会用未来的信息来更新。
(2)渐进(Incremental / recursive / 滤波):当前状态只由前一个时刻决定。
- 线性系统+高斯噪声=卡尔曼滤波器(KF)
- 非线性系统+线性近似+高斯噪声=扩展卡尔曼滤波器(EKF)
- 非线性系统+非高斯噪声+非参数化=粒子滤波器
二、卡尔曼滤波器KF
希望用过去0到k中的数据更新现在的状态 x k x_{k} xk(批量式处理),即估计 P ( x k ∣ x 0 , u 1 : k , z 1 : k ) . P(\boldsymbol{x}_k|\boldsymbol{x}_0,\boldsymbol{u}_{1:k},\boldsymbol{z}_{1:k}). P(xk∣x0,u1:k,z1:k).
(1)总体思路:从贝叶斯法则推导卡尔曼滤波(似然 x 先验)
P ( x k ∣ x 0 , u 1 : k , z 1 : k ) ∝ P ( z k ∣ x k ) P ( x k ∣ x 0 , u 1 : k , z 1 : k − 1 ) . P\left(\boldsymbol{x}_k|\boldsymbol{x}_0,\boldsymbol{u}_{1:k},\boldsymbol{z}_{1:k}\right)\propto P\left(\boldsymbol{z}_k|\boldsymbol{x}_k\right)P\left(\boldsymbol{x}_k|\boldsymbol{x}_0,\boldsymbol{u}_{1:k},\boldsymbol{z}_{1:k-1}\right). P(xk∣x0,u1:k,z1:k)∝P(zk∣xk)P(xk∣x0,u1:k,z1:k−1).
附:贝叶斯公式 : P ( A ∣ B ) = P ( B ∣ A ) × P ( A ) / P ( B ) \mathrm:{P(A|B)=P(B|A)\times P(A)/P(B)} :P(A∣B)=P(B∣A)×P(A)/P(B)
(2)利用一阶马尔可夫性 预测(渐进式处理)
- 一阶马尔可夫性:k时刻状态只与k-1时刻状态有关
- 假设满足一阶马氏性的线性高斯系统为: { x k = A k x k − 1 + u k + w k z k = C k x k + v k k = 1 , … , N . \begin{cases}\boldsymbol{x}_k=\boldsymbol{A}_k\boldsymbol{x}_{k-1}+\boldsymbol{u}_k+\boldsymbol{w}_k\\\boldsymbol{z}_k=\boldsymbol{C}_k\boldsymbol{x}_k+\boldsymbol{v}_k\end{cases}\quad k=1,\ldots,N. { xk=Akxk−1+uk+wkzk=Ckxk+vkk=1,…,N. w k ∼ N ( 0 , R ) . v k ∼ N ( 0 , Q ) . w_k\sim N(\mathbf{0},\boldsymbol{R}).\quad\boldsymbol{v}_k\sim N(\mathbf{0},\boldsymbol{Q}). wk∼N(0,R).vk∼N(0,Q).假设所有的状态和噪声均满足高斯分布
- 通过运动方程确定x的先验: P ( x k ∣ x 0 , u 1 : k , z 1 : k − 1 ) = N ( A k x ^ k − 1 + u k , A k P ^ k − 1 A k ⊤ + R ) . P\left(\boldsymbol{x}_k|\boldsymbol{x}_0,\boldsymbol{u}_{1:k},\boldsymbol{z}_{1:k-1}\right)=N\left(\boldsymbol{A}_k\hat{\boldsymbol{x}}_{k-1}+\boldsymbol{u}_k,\boldsymbol{A}_k\hat{\boldsymbol{P}}_{k-1}\boldsymbol{A}_k^\top+\boldsymbol{R}\right). P(xk∣x0,u1:k,z1:k−1)=N(Akx^k−1+uk,AkP^k−1Ak⊤+R). x ˇ k = A k x ^ k − 1 + u k , P ˇ k = A k P ^ k − 1 A k T + R . \check{\boldsymbol{x}}_k=\boldsymbol{A}_k\hat{\boldsymbol{x}}_{k-1}+\boldsymbol{u}_k,\quad\check{\boldsymbol{P}}_k=\boldsymbol{A}_k\hat{\boldsymbol{P}}_{k-1}\boldsymbol{A}_k^\mathrm{T}+\boldsymbol{R}. xˇk=Akx^k−1+uk,Pˇk=AkP^k−1AkT+R.
附:高斯分布性质: X ∼ N ( μ X , σ X 2 ) X\sim N(\mu_X,\sigma_X^2) X∼N(μX,σX2),Y=AX+b,则 Y ∼ N ( A μ X + b , A 2 σ X 2 ) Y\sim N(A\mu_X+b,A^2\sigma_X^2) Y∼N(AμX+b,A2σX2)
- 由观测方程确定观测数据: P ( z k ∣ x k ) = N ( C k x k , Q ) . P\left(\boldsymbol{z}_k|\boldsymbol{x}_k\right)=N\left(\boldsymbol{C}_kx_k,\boldsymbol{Q}\right). P(zk∣xk)=N(Ckxk,Q).
此处,笔者初学时不太理解, z k z_{k} zk是 x k {x}_{k} xk的线性方程, x k {x}_{k} xk满足高斯分布,那 z k z_{k} zk也应该服从高斯分布,为什么表示下来不符合上述附的高斯分布性质呢?
回头看,发现观测方程中的 x k {x}_{k} xk在书中前文已经进行了重定义, x k = d e f { x k , y 1 , … , y m } . \boldsymbol{x}_k\overset{\mathrm{def}}{\operatorname*{=}}\{\boldsymbol{x}_k,\boldsymbol{y}_1,\ldots,\boldsymbol{y}_m\}. xk=def{ xk,y1,…,ym}. 因此,观测方程中的 x k {x}_{k} xk其实已经不满足高斯分布。
(3)利用贝叶斯法则 更新
N ( x ^ k , P ^ k ) = η N ( C k x k , Q ) ⋅ N ( x ˇ k , P ˇ k ) . N(\hat{\boldsymbol{x}}_k,\hat{\boldsymbol{P}}_k)=\eta N\left(\boldsymbol{C}_k\boldsymbol{x}_k,\boldsymbol{Q}\right)\cdot N(\check{\boldsymbol{x}}_k,\check{\boldsymbol{P}}_k). N(x^k,P^k)=ηN(Ckxk,Q)⋅N(xˇk,Pˇk).
附:高斯分布概率密度函数: f ( x ) = 1 2 π σ 2 exp ( − ( x − μ ) 2 2 σ 2 ) f(x)=\frac{1}{\sqrt{2\pi\sigma^2}}\exp{(-\frac{(x-\mu)^2}{2\sigma^2})} f(x)=2πσ21exp(−2σ2(x−μ)2)
忽略系数,展开指数项,比较 x k x_{k} xk的二次和一次系数,两边近似相等得: ( x k − x ^ k ) T P ^ k − 1 ( x k − x ^ k ) = ( z k − C k x k ) T Q − 1 ( z k − C k x k ) + ( x k − x ˇ k ) T P ˇ k − 1 ( x k − x ˇ k ) . (\boldsymbol{x}_k-\hat{\boldsymbol{x}}_k)^\mathrm{T}\hat{\boldsymbol{P}}_k^{-1}\left(\boldsymbol{x}_k-\hat{\boldsymbol{x}}_k\right)=(\boldsymbol{z}_k-\boldsymbol{C}_k\boldsymbol{x}_k)^\mathrm{T}\boldsymbol{Q}^{-1}\left(\boldsymbol{z}_k-\boldsymbol{C}_k\boldsymbol{x}_k\right)+\left(\boldsymbol{x}_k-\check{\boldsymbol{x}}_k\right)^\mathrm{T}\check{\boldsymbol{P}}_k^{-1}\left(\boldsymbol{x}_k-\check{\boldsymbol{x}}_k\right). (xk−x^k)TP^k−1(xk−x^k)=(zk−Ckxk)TQ−1(zk−Ckxk)+(xk−xˇk)TPˇk−1(xk−xˇk).定义中间变量·卡尔曼增益K: K = P ^ k C k T Q − 1 . K=\hat{P}_kC_k^{\mathrm{T}}Q^{-1}. K=P^kCkTQ−1.由二次系数相等可得: P ^ k = ( I − K C k ) P ˇ k . \hat{P}_k=(I-KC_k)\check{P}_k. P^k=(I−KCk)Pˇk.由一次系数相等可得: x ^ k = x ˇ k + K ( z k − C k x ˇ k ) \hat{x}_k=\check{x}_k+K\left(\boldsymbol{z}_k-\boldsymbol{C}_k\check{\boldsymbol{x}}_k\right) x^k=xˇk+K(zk−Ckxˇk)
书中一共给出了K的两种表达式,本质都一样。 K = P ^ k C k T Q − 1 K=\hat{P}_kC_k^{\mathrm{T}}Q^{-1} K=P^kCkTQ−1(1)和 K = P ˇ k C k T ( C k P ˇ k C k T + Q k ) − 1 K=\check{P}_k\boldsymbol{C}_k^\mathrm{T}(\boldsymbol{C}_k\check{\boldsymbol{P}}_k\boldsymbol{C}_k^\mathrm{T}+\boldsymbol{Q}_k)^{-1} K=PˇkCkT(CkPˇkCkT+Qk)−1(2),把 P ^ k = ( I − K C k ) P ˇ k \hat{P}_k=(I-KC_k)\check{P}_k P^k=(I−KCk)Pˇk代入式(1)即可得到式(2).
三、扩展卡尔曼滤波器EKF
(1)整体的推导思路同上述KF,利用一阶泰勒展开把非线性系统转化为线性系统. x k ≈ f ( x ^ k − 1 , u k ) + ∂ f ∂ x k − 1 ∣ x ^ k − 1 ( x k − 1 − x ^ k − 1 ) + w k . \boldsymbol{x}_k\approx f\left(\hat{\boldsymbol{x}}_{k-1},\boldsymbol{u}_k\right)+\left.\frac{\partial f}{\partial\boldsymbol{x}_{k-1}}\right|_{\hat{\boldsymbol{x}}_{k-1}}(\boldsymbol{x}_{k-1}-\hat{\boldsymbol{x}}_{k-1})+\boldsymbol{w}_k. xk≈f(x^k−1,uk)+∂xk−1∂f
x^k−1(xk−1−x^k−1)+wk. z k ≈ h ( x ˇ k ) + ∂ h ∂ x k ∣ x ˇ k ( x k − x ˇ k ) + n k . \boldsymbol{z}_k\approx h\left(\check{\boldsymbol{x}}_k\right)+\left.\frac{\partial h}{\partial\boldsymbol{x}_k}\right|_{\check{\boldsymbol{x}}_k}(\boldsymbol{x}_k-\check{\boldsymbol{x}}_k)+\boldsymbol{n}_k. zk≈h(xˇk)+∂xk∂h
xˇk(xk−xˇk)+nk.记 F = ∂ f ∂ x k − 1 ∣ x ^ k − 1 F=\left.\frac{\partial f}{\partial\boldsymbol{x}_{k-1}}\right|_{\hat{\boldsymbol{x}}_{k-1}} F=∂xk−1∂f
x^k−1、 H = ∂ h ∂ x k ∣ x ˇ k H=\left.\frac{\partial h}{\partial\boldsymbol{x}_k}\right|_{\check{\boldsymbol{x}}_k} H=∂xk∂h
xˇk
(2)预测
运动方程根据高斯分布性质得 先验 P ( x k ∣ x 0 , u 1 : k , z 0 : k − 1 ) = N ( f ( x ^ k − 1 , u k ) , F P ^ k − 1 F T + R k ) . P\left(\boldsymbol{x}_k|\boldsymbol{x}_0,\boldsymbol{u}_{1:k},\boldsymbol{z}_{0:k-1}\right)=N(f\left(\hat{\boldsymbol{x}}_{k-1},\boldsymbol{u}_k\right),\boldsymbol{F}\hat{\boldsymbol{P}}_{k-1}\boldsymbol{F}^\mathrm{T}+\boldsymbol{R}_k). P(xk∣x0,u1:k,z0:k−1)=N(f(x^k−1,uk),FP^k−1FT+Rk). x ˇ k = f ( x ^ k − 1 , u k ) , P ˇ k = F P ^ k − 1 F T + R k . \check{\boldsymbol{x}}_k=f\left(\hat{\boldsymbol{x}}_{k-1},\boldsymbol{u}_k\right),\quad\check{\boldsymbol{P}}_k=F\hat{\boldsymbol{P}}_{k-1}\boldsymbol{F}^\mathrm{T}+\boldsymbol{R}_k. xˇk=f(x^k−1,uk),Pˇk=FP^k−1FT+Rk.
按照高斯分布性质,得 x ˇ k \check{x}_{k} xˇk= H x ^ k − 1 − H x ^ k − 1 + f ( x ^ k − 1 , u k ) H\hat{x}_{k-1}-H\hat{x}_{k-1}+f(\hat{x}_{k-1},u_{k}) Hx^k−1−Hx^k−1+f(x^k−1,uk)= f ( x ^ k − 1 , u k ) f\left(\hat{\boldsymbol{x}}_{k-1},\boldsymbol{u}_k\right) f(x^k−1,uk)
观测的分布满足: P ( z k ∣ x k ) = N ( h ( x ˇ k ) + H ( x k − x ˇ k ) , Q k ) . P\left(\boldsymbol{z}_k|\boldsymbol{x}_k\right)=N(h\left(\check{\boldsymbol{x}}_k\right)+\boldsymbol{H}\left(\boldsymbol{x}_k-\check{\boldsymbol{x}}_k\right),\boldsymbol{Q}_k). P(zk∣xk)=N(h(xˇk)+H(xk−xˇk),Qk).(3)更新
定义卡尔曼增益 K k K_{k} Kk: K k = P ˇ k H T ( H P ˇ k H T + Q k ) − 1 K_k=\check{P}_kH^\mathrm{T}(H\check{P}_kH^\mathrm{T}+Q_k)^{-1} Kk=PˇkHT(HPˇkHT+Qk)−1最终,得到: x ^ k = x ˇ k + K k ( z k − h ( x ˇ k ) ) , P ^ k = ( I − K k H ) P ˇ k . \hat{\boldsymbol{x}}_k=\check{\boldsymbol{x}}_k+\boldsymbol{K}_k\left(\boldsymbol{z}_k-h\left(\check{\boldsymbol{x}}_k\right)\right),\hat{\boldsymbol{P}}_k=\left(\boldsymbol{I}-\boldsymbol{K}_k\boldsymbol{H}\right)\check{\boldsymbol{P}}_k. x^k=xˇk+Kk(zk−h(xˇk)),P^k=(I−KkH)Pˇk.
EKF只做一次泰勒展开,可以认为EKF仅是优化中的一次迭代.
四、BA / 光束法平差 / 捆集调整
(1)运动方程、观测方程中参数详指
- x——相机位姿,指外参R,t(对应李群T,李代数ξ)
- 路标y——三维点P
- 观测值z——像素坐标 z = d e f [ u s , v s ] T \boldsymbol{z}\stackrel{\mathrm{def}}{=}[u_s,v_s]^\mathrm{T} z=def[us,vs]T
(2)以最小二乘角度考虑观测误差
e = z − h ( T , p ) . e=z-h(\boldsymbol{T},\boldsymbol{p}). e=z−h(T,p).整体的代价函数: 1 2 ∑ i = 1 m ∑ j = 1 n ∥ e i j ∥ 2 = 1 2 ∑ i = 1 m ∑ j = 1 n ∥ z i j − h ( T i , p j ) ∥ 2 . \frac12\sum_{i=1}^m\sum_{j=1}^n\|e_{ij}\|^2=\frac12\sum_{i=1}^m\sum_{j=1}^n\|\boldsymbol{z}_{ij}-h(\boldsymbol{T}_i,\boldsymbol{p}_j)\|^2. 21i=1∑mj=1∑n∥eij∥2=21i=1∑mj=1∑n∥zij−h(Ti,pj)∥2.同时把相机位姿和空间点作为优化变量 x = [ T 1 , … , T m , p 1 , … , p n ] T \boldsymbol{x}=[\boldsymbol{T}_1,\ldots,\boldsymbol{T}_m,\boldsymbol{p}_1,\ldots,\boldsymbol{p}_n]^\mathrm{T} x=[T1,…,Tm,p1,…,pn]T,从视觉图像中提炼最优的3D模型和相机参数,即为BA
(3)BA的求解
定义优化函数: 1 2 ∥ f ( x + Δ x ) ∥ 2 ≈ 1 2 ∑ i = 1 m ∑ j = 1 n ∥ e i j + F i j Δ ξ i + E i j Δ p j ∥ 2 . \frac12\left\|f(\boldsymbol{x}+\Delta\boldsymbol{x})\right\|^2\approx\frac12\sum_{i=1}^m\sum_{j=1}^n\left\|\boldsymbol{e}_{ij}+\boldsymbol{F}_{ij}\Delta\boldsymbol{\xi}_i+\boldsymbol{E}_{ij}\Delta\boldsymbol{p}_j\right\|^2. 21∥f(x+Δx)∥2≈21i=1∑mj=1∑n
eij+FijΔξi+EijΔpj
2.
把相机位姿变量、空间点变量各放到一起: x c = [ ξ 1 , ξ 2 , … , ξ m ] T ∈ R 6 m x_\mathrm{c}=[\xi_1,\xi_2,\ldots,\xi_m]^\mathrm{T}\in\mathbb{R}^{6m} xc=[ξ1,ξ2,…,ξm]T∈R6m x p = [ p 1 , p 2 , … , p n ] T ∈ R 3 n , \boldsymbol{x}_p=[\boldsymbol{p}_1,\boldsymbol{p}_2,\ldots,\boldsymbol{p}_n]^\mathrm{T}\in\mathbb{R}^{3n}, xp=[p1,p2,…,pn]T∈R3n,则目标函数简化为: 1 2 ∥ f ( x + Δ x ) ∥ 2 = 1 2 ∥ e + F Δ x c + E Δ x p ∥ 2 . \frac12\left\|f(\boldsymbol{x}+\Delta\boldsymbol{x})\right\|^2=\frac12\left\|\boldsymbol{e}+\boldsymbol{F}\Delta\boldsymbol{x}_c+\boldsymbol{E}\Delta\boldsymbol{x}_p\right\|^2. 21∥f(x+Δx)∥2=21∥e+FΔxc+EΔxp∥2.利用G-N法( H = J T J H=J^{T}J H=JTJ)或者L-M法( H = J T J + λ I H=J^{T}J+\lambda I H=JTJ+λI),最后最小二乘问题都将转化为增量线性方程: HΔx=g,此处 J = [ F E ] \text{HΔx=g},此处J=[F E] HΔx=g,此处J=[FE]其中,H具有以下稀疏特性
则增量线性方程化为: [ B E E T C ] [ Δ x c Δ x p ] = [ v w ] . \begin{bmatrix}B&E\\E^T&C\end{bmatrix}\begin{bmatrix}\Delta x_c\\\Delta x_p\end{bmatrix}=\begin{bmatrix}v\\w\end{bmatrix}. [BETEC][ΔxcΔxp]=[vw].
其中, g = − J ( x ) f ( x ) = [ v w ] g=-J(x)f(x)=\left[\begin{matrix}v\\w\end{matrix}\right] g=−J(x)f(x)=[vw]
利用舒尔消元 边缘化得: [ I − E C − 1 0 I ] [ B E E T C ] [ Δ x c Δ x p ] = [ I − E C − 1 0 I ] [ v w ] \begin{bmatrix}I&-EC^{-1}\\0&I\end{bmatrix}\begin{bmatrix}B&E\\E^{\mathrm{T}}&C\end{bmatrix}\begin{bmatrix}\Delta x_{\mathrm{c}}\\\Delta x_{p}\end{bmatrix}=\begin{bmatrix}I&-EC^{-1}\\0&I\end{bmatrix}\begin{bmatrix}v\\w\end{bmatrix} [I0−EC−1I][BETEC][ΔxcΔxp]=[I0−EC−1I][vw] [ B − E C − 1 E T 0 E T C ] [ Δ x c Δ x p ] = [ v − E C − 1 w w ] . \begin{bmatrix}B-EC^{-1}E^{\mathrm{T}}&0\\E^{\mathrm{T}}&C\end{bmatrix}\begin{bmatrix}\Delta x_{c}\\\Delta x_{p}\end{bmatrix}=\begin{bmatrix}v-EC^{-1}w\\w\end{bmatrix}. [B−EC−1ETET0C][ΔxcΔxp]=[v−EC−1ww].
方程组第一行变成和Δxp无关的项,因此可以先通过第一行求出Δxc,代入第二行求出Δxp。
实际上把求(Δxc Δxp)的问题,转化成了先固定Δxp,求出Δxc,再求Δxp的过程.
笔者认为此处可以理解为求 联合分布 P ( X c X p ) = P ( X p ) P ( X c / X p ) P(X_{c}X_{p})=P(X_{p})P(X_{c}/X_{p}) P(XcXp)=P(Xp)P(Xc/Xp),先求Xc在Xp下的条件分布,再求Xp边缘分布,故称为边缘化。此处为路标点Xp的边缘化,还可以对位姿x进行边缘化.
利用 H 矩阵的稀疏性,使得线性方程求解变得简单(避免直接求 H − 1 H^{-1} H−1) ,仅用求对角矩阵C的逆.
神奇的是:边缘化后的H矩阵即为协方差矩阵 p ^ k \hat{p}_{k} p^k
(4)Huber核
Huber核是鲁棒核函数的一种。为了应对误差很大时,二范数增长太快,抹平其他正确值得影响而存在。 H ( e ) = { 1 2 e 2 当 ∣ e ∣ ⩽ δ , δ ( ∣ e ∣ − 1 2 δ ) 其他 H(e)=\begin{cases}\dfrac{1}{2}e^2&\text{当}|e|\leqslant\delta,\\\\\delta\left(|e|-\dfrac{1}{2}\delta\right)&\text{其他}\end{cases} H(e)=⎩
⎨
⎧21e2δ(∣e∣−21δ)当∣e∣⩽δ,其他
可见,在误差较大时,Huber核函数增长明显低于二次函数.