卡尔曼滤波

原方程:

  • 状态方程: xk=Ak⋅xk−1+B⋅uk+wkx_k = A_k \cdot x_{k-1} + B \cdot u_k + w_kxk=Akxk1+Buk+wk
  • 观测方程: zk=Ck⋅xk+vkz_k = C_k \cdot x_k + v_kzk=Ckxk+vk

预测步骤:

  • 预测状态: x^k,pred=Ak⋅x^k−1+B⋅uk\hat{x}_k,\text{pred} = A_k \cdot \hat{x}_{k-1} + B \cdot u_kx^k,pred=Akx^k1+Buk;其中,AkA_kAk为转移矩阵,BBB为控制输入矩阵,slam一般忽略BBB
  • 预测协方差:Pk,pred=Ak⋅Pk−1⋅AkT+RkP_k,\text{pred} = A_k \cdot P_{k-1} \cdot A_k^T + R_kPk,pred=AkPk1AkT+Rk;P为估计协方差矩阵,目标是最小化P值,RkR_kRk为过程噪声的协方差矩阵。

更新步骤:

  • 卡尔曼增益计算: Kk=Pk,pred⋅CkT⋅(Ck⋅Pk,pred⋅CkT+Qk)−1K_k = P_k,\text{pred} \cdot C_k^T \cdot (C_k \cdot P_k,\text{pred} \cdot C_k^T + Q_k)^{-1}Kk=Pk,predCkT(CkPk,predCkT+Qk)1KkK_kKk为卡尔曼增益,CkC_kCk为观测矩阵,QkQ_kQk为观测噪声的协方差矩阵。
  • 更新状态:x^k=x^k,pred+Kk⋅(zk−Ck⋅x^k,pred)\hat{x}_k = \hat{x}_k,\text{pred} + K_k \cdot (z_k - C_k \cdot \hat{x}_k,\text{pred})x^k=x^k,pred+Kk(zkCkx^k,pred);此步调整预测量,基于观测值的偏差确定其有效性。
  • 更新协方差: Pk=(I−Kk⋅Ck)⋅Pk,predP_k = (I - K_k \cdot C_k) \cdot P_k,\text{pred}Pk=(IKkCk)Pk,predIII为单位矩阵,此式反映经过校正后协方差矩阵的更新。

以上即为卡尔曼滤波的基本流程,通过预测与更新两个循环步骤,不断优化系统状态的估计。

高斯-牛顿(Gauss-Newton)方法是一种迭代优化算法,用于求解非线性最小二乘问题。在SLAM和其他工程领域中,它被广泛应用于参数估计问题,如优化传感器测量与模型预测之间的残差。高斯-牛顿法的核心思想是每一步迭代都通过线性化非线性函数来近似求解,并逐步减小目标函数值。下面是高斯-牛顿方法的基本公式和步骤概述:

1、最小二乘问题

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。最小二乘问题可以表述为:
min⁡xF(x)=∣∣f(x)∣∣2\min_{x} F(x) = ||f(x)||^2xminF(x)=∣∣f(x)2

2、高斯牛顿法原理

当 x 在 xkx_kxk 处,具有增量 Δxk\Delta x_kΔxk,优化目标函数取值为:
min⁡xF(xk+Δxk)=∣∣f(xk+Δxk)∣∣2\min_{x} F(x_k + \Delta x_k) = ||f(x_k + \Delta x_k)||^2xminF(xk+Δxk)=∣∣f(xk+Δxk)2
不同于牛顿法,我们不对优化目标函数进行泰勒展开,我们对优化目标函数中的一部分,即 f(x)f(x)f(x) 进行一阶泰勒展开。展开后优化目标函数为:
F(xk+Δxk)≈∣∣f(xk)+J(xk)Δxk∣∣2F(x_k + \Delta x_k) \approx ||f(x_k) + J(x_k) \Delta x_k||^2 F(xk+Δxk)∣∣f(xk)+J(xk)Δxk2

该式中,只有Δxk\Delta x_kΔxk是变量,而 xkx_kxk 是一个确定的数值,f(xk)f(x_k)f(xk)J(xk)TJ(x_k)^TJ(xk)T均是一个确定的数值,即这是一个以 Δxk\Delta x_kΔxk为变量的二次函数。且二次项的系数为正,因此该函数拥有最小值。其取最小值的条件就是该式对 Δx_k 的导数等于零,即:
∂∣∣f(xk)+J(xk)Δxk∣∣2∂Δxk=0\frac{\partial ||f(x_k) + J(x_k) \Delta x_k||^2}{\partial \Delta x_k} = 0Δxk∣∣f(xk)+J(xk)Δxk2=0
解得:
J(xk)TJ(xk)Δxk=−J(xk)Tf(xk)J(x_k)^TJ(x_k) \Delta x_k = -J(x_k)^Tf(x_k)J(xk)TJ(xk)Δxk=J(xk)Tf(xk)
记:
H(xk)=J(xk)TJ(xk),g(xk)=−J(xk)Tf(xk)H(x_k) = J(x_k)^TJ(x_k), g(x_k) = -J(x_k)^Tf(x_k)H(xk)=J(xk)TJ(xk),g(xk)=J(xk)Tf(xk)
则高斯牛顿法的增量方程为:
H(xk)Δxk=g(xk)H(x_k)\Delta x_k = g(x_k)H(xk)Δxk=g(xk)

罗德里格斯公式(Rodrigues’s Formula),也称为罗德里格斯旋转公式。这个公式在SLAM和其他涉及三维空间旋转计算的领域非常重要。罗德里格斯公式提供了一种方法,用于将一个围绕任意轴的旋转角度转换为一个3x3的旋转矩阵。这对于从IMU(惯性测量单元)数据中恢复姿态、在视觉里程计中处理相机姿态变化等SLAM关键步骤至关重要。

罗德里格斯公式的基本形式如下:
R=I+sin⁡(θ)K+(1−cos⁡(θ))K2\mathbf{R} = \mathbf{I} + \sin(\theta) \mathbf{K} + (1 - \cos(\theta)) \mathbf{K}^2 R=I+sin(θ)K+(1cos(θ))K2
其中:

  • R\mathbf{R}R 是最终得到的3∗33*333旋转矩阵。
  • θ\thetaθ 是绕单位旋转轴 n\mathbf{n}n的旋转角度。
  • K=[n]×\mathbf{K} = [\mathbf{n}]_\timesK=[n]× 是由旋转轴 n\mathbf{n}n 构成的反对称矩阵,[⋅]×[\cdot]_\times[]×表示向量到反对称矩阵的转换操作。
  • I\mathbf{I}I 是单位矩阵。

反对称矩阵

旋转轴 n\mathbf{n}n 对应的反对称矩阵 K\mathbf{K}K 定义为:
K=[n]×=(0−nznynz0−nx−nynx0) \mathbf{K} = [\mathbf{n}]_\times = \begin{pmatrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \end{pmatrix} K=[n]×= 0nznynz0nxnynx0

预测
p(t+Δt)=p(t)+vΔt+12(R(a~−ba))Δt2+12gΔt2,v(t+Δt)=v(t)+R(a~−ba)Δt+gΔt,R(t+Δt)=R(t)Exp((ω−bg)Δt),bg(t+Δt)=bg(t),ba(t+Δt)=ba(t),g(t+Δt)=g(t).(1) \begin{align*} p(t + \Delta t) &= p(t) + v\Delta t + \frac{1}{2}(R(\tilde{a} - b_a))\Delta t^2 + \frac{1}{2}g\Delta t^2, \\ v(t + \Delta t) &= v(t) + R(\tilde{a} - b_a)\Delta t + g\Delta t, \\ R(t + \Delta t) &= R(t)Exp((\omega - b_g)\Delta t), \\ b_g(t + \Delta t) &= b_g(t), \\ b_a(t + \Delta t) &= b_a(t), \\ g(t + \Delta t) &= g(t). \end{align*} \tag{1}p(t+Δt)v(t+Δt)R(t+Δt)bg(t+Δt)ba(t+Δt)g(t+Δt)=p(t)+vΔt+21(R(a~ba))Δt2+21gΔt2,=v(t)+R(a~ba)Δt+gΔt,=R(t)Exp((ωbg)Δt),=bg(t),=ba(t),=g(t).(1)
注:需要注意g的方向,这里g是当z轴朝上时,g(0,0,-9.8)朝下。

误差状态推导公式:
δp(t+Δt)=δp+δvΔt,δv(t+Δt)=δv+(−R(a~−ba)∧δθ−Rδba+δg)Δt−ηv,δθ(t+Δt)=Exp(−(ω−bg)Δt)δθ−δbgΔt−ηθ,δbg(t+Δt)=δbg+ηg,δba(t+Δt)=δba+ηa,δg(t+Δt)=δg.(2) \begin{align*} \delta p(t + \Delta t) &= \delta p + \delta v\Delta t, \\ \delta v(t + \Delta t) &= \delta v + (-R(\tilde{a} - b_a)^\wedge\delta\theta - R\delta b_a + \delta g)\Delta t - \eta_v, \\ \delta\theta(t + \Delta t) &= Exp(-(\omega - b_g)\Delta t)\delta\theta - \delta b_g\Delta t - \eta_\theta, \\ \delta b_g(t + \Delta t) &= \delta b_g + \eta_g, \\ \delta b_a(t + \Delta t) &= \delta b_a + \eta_a, \\ \delta g(t + \Delta t) &= \delta g. \end{align*} \tag{2} δp(t+Δt)δv(t+Δt)δθ(t+Δt)δbg(t+Δt)δba(t+Δt)δg(t+Δt)=δp+δvΔt,=δv+(R(a~ba)δθRδba+δg)Δtηv,=Exp((ωbg)Δt)δθδbgΔtηθ,=δbg+ηg,=δba+ηa,=δg.(2)

ηv\eta_vηvηa′∗Δt\eta_a'* \Delta tηaΔtηθ\eta_\thetaηθηg′∗Δt\eta_g'* \Delta tηgΔt,其中ηa′\eta_a'ηaR∗线加速度的测量噪声R*线加速度的测量噪声R线加速度的测量噪声ηg′\eta_g'ηg为角速度的测量噪声

ηg、ηa\eta_g 、 \eta_aηgηa 为高斯过程,表示零偏的随机游走、零偏的导数,运动过程中零偏的变化,其均值为0,协方差函数为Cov(bgb_gbg)δ(t−t′)、 Cov(bab_aba)δ(t−t′)其中,δ 函数是一个单位脉冲函数,表示只有当时间 t 和 t′相同时,两个变量才有相关性,imu出厂会标定这两个值。

预积分:

  1. Rwbkpbk+1w=Rwbk(pbkw+vbkwΔtk+12gwΔtk2)+αbk+1bkR_w^{b_k} p_{b_{k+1}}^ w= R_w^{b_k} \left(p_{b_k}^w + v_{b_k}^w\Delta t_k + \frac{1}{2} g^w\Delta t_k^2\right) + \alpha_{b_{k+1}}^{b_k}Rwbkpbk+1w=Rwbk(pbkw+vbkwΔtk+21gwΔtk2)+αbk+1bk

  2. Rwbkvbk+1w=Rwbk(vbkw+gwΔtk)+βbk+1bkR_w^{b_k} v_{b_{k+1}}^w = R_w^{b_k} (v_{b_k}^w + g^w\Delta t_k) + \beta_{b_{k+1}}^{b_k}Rwbkvbk+1w=Rwbk(vbkw+gwΔtk)+βbk+1bk

  3. qwbk⊗qbk+1w=γbk+1bkq_w^{b_k} \otimes q_{b_{k+1}}^w = \gamma_{b_{k+1}}^{b_k}qwbkqbk+1w=γbk+1bk

注:需要注意g的方向,这里g是当z轴朝上时,g(0,0,-9.8)朝下。

其中,α、β、γ\alpha、\beta、\gammaαβγ就是预积分量,当RwbkR_w^{b_k}Rwbk为幺元时,其退化为普通的预测公式,因此可以用作帧间约束。对应离散形式为:

a^i+1bk=a^ibk+βibkδt+12(R(γ^i+1bk)(a^i+1−ba))δt2\hat{a}_{i+1}^{b^k} = \hat{a}_i^{b^k} + \beta_i^{b^k}\delta t + \frac{1}{2}(R(\hat{\gamma}_{i+1}^{b^k})(\hat{a}_{i+1} - b_{a}))\delta t^2a^i+1bk=a^ibk+βibkδt+21(R(γ^i+1bk)(a^i+1ba))δt2

βi+1bk=βibk+R(γ^i+1bk)(a^i+1−ba)δt\beta_{i+1}^{b^k} = \beta_i^{b^k} + R(\hat{\gamma}_{i+1}^{b^k})(\hat{a}_{i+1} - b_{a})\delta tβi+1bk=βibk+R(γ^i+1bk)(a^i+1ba)δt

γ^i+1bk=γ^ibk⊗[112(ωi−bω)δt]\hat{\gamma}_{i+1}^{b^k} = \hat{\gamma}_i^{b^k} \otimes \left[ \begin{matrix} 1 \\ \frac{1}{2}(\omega_i - b_{\omega})\delta t \end{matrix} \right]γ^i+1bk=γ^ibk[121(ωibω)δt] ,这里运用了旋转向量转四元数时的等价无穷小

右扰动:
∂(Rexp⁡(ϕ∧)p+t)∂ϕ=lim⁡ϕ→0(Rexp⁡(ϕ∧)p+t)−(Rp+t)ϕ≈lim⁡ϕ→0(R(I+ϕ∧)p+t)−(Rp+t)ϕ=lim⁡ϕ→0Rϕ∧pϕ=−Rp∧ \begin{align*} \frac{\partial (R \exp(\phi^\wedge) p + t)}{\partial \phi} &= \lim_{\phi \to 0} \frac{(R \exp(\phi^\wedge) p + t) - (Rp + t)}{\phi}\\ &\approx \lim_{\phi \to 0} \frac{(R(I+\phi^\wedge)p+t)-(Rp+t)}{\phi}\\ &= \lim_{\phi \to 0} \frac{R\phi^{\wedge}p}{\phi}\\ &= -Rp^{\wedge} \end{align*} ϕ(Rexp(ϕ)p+t)=ϕ0limϕ(Rexp(ϕ)p+t)(Rp+t)ϕ0limϕ(R(I+ϕ)p+t)(Rp+t)=ϕ0limϕRϕp=Rp

使用四元数求解旋转量:
可以使用左乘矩阵和右乘矩阵来转成向量的求解
q1⊗q2=[q1]Lq2=[q2]Rq1q_1 \otimes q_2 = [q_1]_L q_2 = [q_2]_R q_1q1q2=[q1]Lq2=[q2]Rq1

SVD求解超定方程:
正交矩阵的保范性:乘一个正交矩阵,其模大小不变,可以想象成乘一个旋转矩阵。

∥Ax−b∥22=∥U[Σ0]VTx−b∥22(两边同时乘UT,不改变模大小)=∥[Σ0]VTx−[U‾nU‾]Tb∥22(UT=[U‾nU‾]T)=∥[ΣVTx−U‾nTb−U‾Tb]∥22=∥ΣVTx−U‾nTb∥22+∥U‾Tb∥22≥∥U‾Tb∥22 \begin{aligned} \|Ax-b\|_{2}^{2}& =\left\|U \left[\begin{matrix} \Sigma \\ 0 \end{matrix} \right] V^T x-b\right\|_{2}^{2} (两边同时乘U^T,不改变模大小) \\ &=\left\| \left[\begin{matrix} \Sigma \\ 0 \end{matrix} \right] V^T x - \left[\begin{array}{c c} \overline{U}_{n} & \overline{U} \end{array}\right]^{T} b\right\|_{2}^{2} (U^T=\left[\begin{array}{c c} \overline{U}_{n} & \overline{U} \end{array}\right]^{T}) \\ &=\left\|\left[\begin{matrix} \Sigma V^{T} x-\overline{U}_{n}^{T} b \\-\overline{U}^{T} b \end{matrix}\right]\right\|_{2}^{2} \\ &=\left\|\Sigma V^{T} x-\overline{U}_{n}^{T} b\right\|_{2}^{2}+\left\|\overline{U}^{T} b\right\|_{2}^{2} \geq \left\|\overline{U}^{T} b\right\|_{2}^{2} \end{aligned} Axb22= U[Σ0]VTxb 22(两边同时乘UT,不改变模大小)= [Σ0]VTx[UnU]Tb 22(UT=[UnU]T)= [ΣVTxUnTbUTb] 22= ΣVTxUnTb 22+ UTb 22 UTb 22
等号当且仅当ΣVTx−U‾nTb=0\Sigma V^{T} x-\overline{U}_{n}^{T} b=0ΣVTxUnTb=0时成立,所以:
x=(ΣVT)−1U‾nTb=VΣ−1U‾nTbx=(\Sigma V^{T})^{-1} \overline{U}_{n}^{T} b=V \Sigma^{-1} \overline{U}_{n}^{T} bx=(ΣVT)1UnTb=VΣ1UnTb这就是线性最小二乘问题的解。

特殊情况:齐次线性方程组Ax=0Ax=0Ax=0

min∣∣Ax∣∣st. ∣∣x∣∣=1min||Ax|| st.\ ||x||=1 min∣∣Ax∣∣st. ∣∣x∣∣=1

则:ΣVTx=0\Sigma V^{T} x=0ΣVTx=0
VTx=yV^T x = yVTx=y,由正交矩阵的保范性知∣∣y∣∣=1||y||=1∣∣y∣∣=1

当仅当y=[0,0,0,1]Ty=[0,0,0,1]^Ty=[0,0,0,1]T时,Σy\Sigma yΣy取得最小值,则x=V∗[0,0,0,1]Tx=V*[0,0,0,1]^Tx=V[0,0,0,1]T

此时,最小二乘解为ATAA^TAATA最小特征值对应的特征向量。

对于3维实向量ϕ⃗\vec{\phi}ϕ 和一个小量δϕ⃗\delta\vec{\phi}δϕ ,有下述近似性质:
Exp(ϕ⃗+δϕ⃗)≈Exp(ϕ⃗)⋅Exp(Jr(ϕ⃗)⋅δϕ⃗)Log(Exp(ϕ⃗)⋅Exp(δϕ⃗))=ϕ⃗+Jr−1(ϕ⃗)⋅δϕ⃗ \begin{aligned} &Exp(\vec{\phi}+\delta\vec{\phi})\approx Exp(\vec{\phi})\cdot Exp(J_r(\vec{\phi})\cdot\delta\vec{\phi}) \\ &Log(Exp(\vec{\phi})\cdot Exp(\delta\vec{\phi}))=\vec{\phi}+J^{-1}_r(\vec{\phi})\cdot\delta\vec{\phi} \end{aligned} Exp(ϕ +δϕ )Exp(ϕ )Exp(Jr(ϕ )δϕ )Log(Exp(ϕ )Exp(δϕ ))=ϕ +Jr1(ϕ )δϕ
式1可以这样理解:R3R^3R3中的向量ϕ⃗\vec{\phi}ϕ 加上一个小量δϕ⃗\delta\vec{\phi}δϕ ,对应到SO(3)中则是Exp(ϕ⃗\vec{\phi}ϕ )右乘一个Exp(Jr(ϕ⃗)⋅δϕ⃗J_r(\vec{\phi})\cdot\delta\vec{\phi}Jr(ϕ )δϕ );
式2则可这样理解:SO(3)中Exp(ϕ⃗\vec{\phi}ϕ )右乘一个Exp(δϕ⃗\delta\vec{\phi}δϕ ),对应到R3R^3R3中则是ϕ⃗\vec{\phi}ϕ 加上一项Jr−1(ϕ⃗)⋅δϕ⃗J^{-1}_r(\vec{\phi})\cdot\delta\vec{\phi}Jr1(ϕ )δϕ

Jr(ϕ⃗)J_r(\vec{\phi})Jr(ϕ )是SO(3)的右Jacobian,将切空间的“加性项”和SO(3)中的右“乘性项”联系在一起。Jr(ϕ⃗)J_r(\vec{\phi})Jr(ϕ )及其逆Jr−1(ϕ⃗)J^{-1}_r(\vec{\phi})Jr1(ϕ )的表达式如下:
Jr(ϕ⃗)=I−1−cos⁡(∥ϕ⃗∥)∥ϕ⃗∥2ϕ⃗∧+∥ϕ⃗∥−sin(∥ϕ⃗∥)∥ϕ⃗∥3(ϕ⃗∧)2Jr−1(ϕ⃗)=I+12ϕ⃗∧+(1∥ϕ⃗∥2−1+cos⁡(∥ϕ⃗∥)2⋅∥ϕ⃗∥⋅sin(∥ϕ⃗∥))(ϕ⃗∧)2\begin{align*} J_r(\vec{\phi}) &= I - \frac{1-\cos(\|\vec{\phi}\|)}{\|\vec{\phi}\|^2}\vec{\phi}^\wedge + \frac{\|\vec{\phi}\|-sin(\|\vec{\phi}\|)}{\|\vec{\phi}\|^3}(\vec{\phi}^\wedge)^2\\ J^{-1}_r(\vec{\phi}) &= I + \frac{1}{2}\vec{\phi}^\wedge + \left(\frac{1}{\|\vec{\phi}\|^2}-\frac{1+\cos(\|\vec{\phi}\|)}{2\cdot\|\vec{\phi}\|\cdot sin(\|\vec{\phi}\|)}\right)(\vec{\phi}^\wedge)^2 \end{align*} Jr(ϕ )Jr1(ϕ )=Iϕ 21cos(ϕ )ϕ +ϕ 3ϕ sin(ϕ )(ϕ )2=I+21ϕ +(ϕ 212ϕ sin(ϕ )1+cos(ϕ ))(ϕ )2

cartographer

缺点:没有使用预积分,因此为了较少计算量,使用了子地图,但是子地图生成时是直接使用预积分预测的,没考虑噪声,而子地图内部后端是不优化的,这里可能会存在误差,可以引入ESKF。

指数平均滤波对齐重力:https://blog.csdn.net/ergevv/article/details/136618411?spm=1001.2014.3001.5502

分支定界法计算后端约束:https://zhuanlan.zhihu.com/p/336807140

后端优化:前端计算的相对变换和后端计算的约束之差作为误差来优化

LIO-sam

点到线:在局部地图上,遍历当前帧点,找到5个最近的点,计算这5个点的方差,对其进行特征值分解(如果点云数据大致分布在一条直线上,那么数据变化最大的方向实际上是这条直线本身的方向。因为点云数据在该直线方向上是有组织、有规律地分布的,所以沿着直线方向的方差(或对应的最大特征值)实际上反映了数据的主要变化趋势,这是数据点分布最集中、而非最分散的方向。相反,在垂直于这条直线的维度上,理论上数据的变化应该是最小的,因为如果所有点完美地落在同一直线上,那么垂直方向上的方差应为0,对应特征值也应为0(表明没有变化)),最大特征值应远大于次大特征值,其对应特征向量是直线方向,从而求出当前点和局部地图对应的直线的两个点。使用外积计算三个点的面积,两点距离为底,则可求出高(残差),方向则是既垂直底,又垂直外积矢量,再归一化,即是雅可比

点到面:在局部地图上,遍历当前帧点,找到5个最近的点,根据Ax+By+Cz+1=0;来求解超定方程,之后再将5个点分别代进去,距离过大则舍弃。将当前点代入方程得到残差,A、B、C则是点到面的方向,即残差对位置的雅可比

因子图:使用gtsam里的因子图代替了以往的滑窗,随着新的观测数据到来,可以添加新的因子并重新优化整个图,利用已有的雅可比矩阵和新增的雅可比矩阵,减少计算量来优化全局位资,无需从头开始计算,大大提高了实时性和计算效率,因子图里面也包含边缘化操作,用于去除旧约束。

可优化:ICP使用的是欧拉角,可以改成四元数

VINS-mono

零偏初始化:特征点匹配的旋转量和预积分的旋转量之差作为误差来约束得到零偏

初始化速度、重力和尺度因子:残差可定义为相邻两帧之间 IMU 预积分出的增量与预测值之间的误差

边缘化:如果不考虑旧帧的影响,后端优化就是预积分与滑窗求得的位姿、重投影误差、回环检测(重投影误差)。为了保留旧帧的影响,引入边缘化,通过舒尔补把滑窗里的第0帧对后面帧的约束保留下来,对新的约束关系求得J和e,把新的约束也加入后端优化中。

DRT-init:
零偏初始化:两帧之间的一个特征点与两相机光点构成的平面的法向量垂直平移t,则考虑所有特征点,他们的法向量共面。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐