概率机器人总结——(扩展)卡尔曼滤波先实践再推导

概率机器人总结——(扩展)卡尔曼滤波先实践再推导

为什么要把扩展两个字加个括号呢,因为本文的实践过程是以扩展卡尔曼为例,但是推导过程主要是参考博客卡尔曼滤波 – 从推导到应用(一),相较于《概率机器人》上的推导过程更容易理解,而《概率机器人》上对于扩展卡尔曼滤波的推到也是基于卡尔曼滤波进行了一个拓展,因此本文以卡尔曼滤波推导为学习样例,然后加入个人的一些理解分析

(1)卡尔曼、扩展卡尔曼、粒子滤波到底什么关系?

徐亦达老师的卡尔曼滤波的推导视频里强调了这几个滤波的关系,如下:

模型类型 p ( x k ∣ x k − 1 ) p\left(x_{k} \mid x_{k-1}\right) p(xkxk1) p ( y t ∣ x t ) p(y_t \mid x_t) p(ytxt) p ( x 1 ) p(x_1) p(x1)说明
离散状态动态模型 A x t + B u t Ax_t+Bu_t Axt+But H x t Hx_t Hxt π \pi π隐马尔科夫模型,无滤波
线性高斯动态模型 N ( A x t + B u t + δ , Q ) N(Ax_t+Bu_t+\delta, Q) N(Axt+But+δ,Q) N ( H x t + c , R ) N(Hx_t+c, R) N(Hxt+c,R) N ( μ , σ ) N(\mu,\sigma) N(μ,σ)卡尔曼滤波
非线性非高斯动态模型 f ( x t − 1 ) f(x_{t-1}) f(xt1) g ( x t − 1 ) g(x_{t-1}) g(xt1) f ( x 0 ) f(x_0) f(x0)粒子滤波
首先什么是动态模型呢?
在这里插入图片描述
这个就是状态模型,在离散状态下就是大名鼎鼎的隐马尔科夫模型,在机器学习范畴内非常有效的一种模型,而当我们的状态转移方程和观测方程都变成线性高斯模型之后,这时候处理最有效的方式之一就是卡尔曼滤波,而扩展卡尔曼呢?当动态模型都为非线性高斯模型是就是用扩展卡尔曼滤波(其基本思路就是将非线性模型线性化),而最后最复杂的是非线性非高斯模型,怎么办呢?粒子滤波咯,粒子滤波我写了一个同款博客,欢迎参考概率机器人总结——粒子滤波先实践再推导,这就是他们之间的关系。

(2)实践——扩展卡尔曼滤波

首先给出线性高斯动态模型的状态转移方程和观测方程,如下: x t = A t x t − 1 + B t u t + ε t x_{t}=A_{t} x_{t-1}+B_{t} u_{t}+\varepsilon_{t} xt=Atxt1+Btut+εt z t = C t x t + δ t z_{t}=C_{t} x_{t}+\delta_{t} zt=Ctxt+δt
其中 ε t \varepsilon_{t} εt δ t \delta_{t} δt分别为满足零均值高斯分布的噪声。
然后,我们从卡尔曼滤波的公式开始,如下:
μ ‾ t = A t μ t − 1 + B t u t Σ ‾ t = A t Σ t − 1 A t T + R t K t = Σ ‾ t C t T ( C t Σ ‾ t C t T + Q t ) − 1 μ t = μ ‾ t + K t ( z t − C t μ ‾ t ) Σ t = ( I − K t C t ) Σ ‾ t \begin{aligned} \overline{\mu}_{t} &=A_{t} \mu_{t-1}+B_{t} u_{t} \\ \overline{\Sigma}_{t} &=A_{t} \Sigma_{t-1} A_{t}^{T}+R_{t} \\ K_{t} &=\overline{\Sigma}_{t} C_{t}^{T}\left(C_{t} \overline{\Sigma}_{t} C_{t}^{T}+Q_{t}\right)^{-1} \\ \mu_{t} &=\overline{\mu}_{t}+K_{t}\left(z_{t}-C_{t} \overline{\mu}_{t}\right) \\ \Sigma_{t} &=\left(I-K_{t} C_{t}\right) \overline{\Sigma}_{t} \end{aligned} μtΣtKtμtΣt=Atμt1+Btut=AtΣt1AtT+Rt=ΣtCtT(CtΣtCtT+Qt)1=μt+Kt(ztCtμt)=(IKtCt)Σt
如果没有接触过卡尔曼滤波,第一次看到这些公式会觉得怎么这么复杂,学明白之后发现其实还是蛮简单的,这里先简单说下对这个公式的理解
第一个公式和均值(期望)有关,指的是通过上一个状态的均值 μ t − 1 \mu_{t-1} μt1和控制量以及状态转移方程预测出下一个状态的均值 μ ‾ t \overline{\mu}_{t} μt
第二个公式和方差有关,指的是根据上一个状态的方差 Σ t − 1 \Sigma_{t-1} Σt1和噪声的方差 R t R_{t} Rt预测出下一个状态的方差 Σ ‾ t \overline{\Sigma}_{t} Σt

注意高斯分布的状态的变量其实就均值和方差两个东西,通过第一步和第二步我们就完成了【预测过程】

第三个公式和卡尔曼增益有关,指的是通过观测方程及其噪声的方差计算卡尔曼增益
第四个公式和均值有关,指的是通过卡尔曼增益对预测出来的均值进行更新
第五个公式和方差有关,和第四步一样,指的是通过卡尔曼增益对预测出来方差进行更新

我们先计算了卡尔曼增益然后分别跟新了均值和方差两个东西,通过后面三步我们就完成了【更新过程】

好了,卡尔曼滤波搞清楚了,我们再来看下扩展卡尔曼滤波,首先给出非线性高斯动态模型的方程,如下: x t = g ( u t , x t − 1 ) + ε t x_{t}=g\left(u_{t}, x_{t-1}\right)+\varepsilon_{t} xt=g(ut,xt1)+εt z t = h ( x t ) + δ t z_{t}=h\left(x_{t}\right)+\delta_{t} zt=h(xt)+δt
同理,其中 ε t \varepsilon_{t} εt δ t \delta_{t} δt分别为满足零均值高斯分布的噪声。
μ ‾ t = g ( u t , μ t − 1 ) Σ ‾ t = G t Σ t − 1 G t T + R t K t = Σ ‾ t H t T ( H t Σ ‾ t H t T + Q t ) − 1 μ t = μ ‾ t + K t ( z t − h ( μ ‾ t ) ) Σ t = ( I − K t H t ) Σ ‾ t \begin{aligned} \overline{\mu}_{t} &=g\left(u_{t}, \mu_{t-1}\right) \\ \overline{\Sigma}_{t} &=G_{t} \Sigma_{t-1} G_{t}^{T}+R_{t} \\ K_{t} &=\overline{\Sigma}_{t} H_{t}^{T}\left(H_{t} \overline{\Sigma}_{t} H_{t}^{T}+Q_{t}\right)^{-1} \\ \mu_{t} &=\overline{\mu}_{t}+K_{t}\left(z_{t}-h\left(\overline{\mu}_{t}\right)\right) \\ \Sigma_{t} &=\left(I-K_{t} H_{t}\right) \overline{\Sigma}_{t} \end{aligned} μtΣtKtμtΣt=g(ut,μt1)=GtΣt1GtT+Rt=ΣtHtT(HtΣtHtT+Qt)1=μt+Kt(zth(μt))=(IKtHt)Σt
和卡尔曼滤波一对比,发现简直一模一样,主要不同的是将状态转移方程中系数矩阵 A t , C t A_t,C_t At,Ct换成了非线性方程的雅克比矩阵 G t , H t G_t,H_t Gt,Ht,为什么是雅克比矩阵,这当然是和推导有关,我们可以先直观感受下,在《概率机器人》的推导过程中,在对状态转移的分布进行积分获状态的置信度时需要提取出来一个关键公式: L t = 1 2 ( x t − A t x t − 1 − B t u t ) T R t − 1 ( x t − A t x t − 1 − B t u t ) + 1 2 ( x t − 1 − μ t − 1 ) T Σ t − 1 − 1 ( x t − 1 − μ t − 1 ) \begin{aligned} L_{t}=& \frac{1}{2}\left(x_{t}-A_{t} x_{t-1}-B_{t} u_{t}\right)^{\mathrm{T}} R_{t}^{-1}\left(x_{t}-A_{t} x_{t-1}-B_{t} u_{t}\right)+\\ & \frac{1}{2}\left(x_{t-1}-\mu_{t-1}\right)^{\mathrm{T}} \Sigma_{t-1}^{-1}\left(x_{t-1}-\mu_{t-1}\right) \end{aligned} Lt=21(xtAtxt1Btut)TRt1(xtAtxt1Btut)+21(xt1μt1)TΣt11(xt1μt1)
而扩展卡尔曼滤波的这个对应的公式是 L t = 1 2 [ x t − g ( u t , μ t − 1 ) − G t ( x t − 1 − μ t − 1 ) ] T R t − 1 [ x t − g ( u t , μ t − 1 ) − G t ( x t − 1 − μ t − 1 ) ] + 1 2 ( x t − 1 − μ t − 1 ) T Σ t − 1 − 1 ( x t − 1 − μ t − 1 ) \begin{aligned} L_{t}=& \frac{1}{2}\left[x_{t}-g\left(\boldsymbol{u}_{t}, \boldsymbol{\mu}_{t-1}\right)-G_{t}\left(\boldsymbol{x}_{t-1}-\boldsymbol{\mu}_{t-1}\right)\right]^{\mathrm{T}} \boldsymbol{R}_{t}^{-1}\left[\boldsymbol{x}_{t}-g\left(\boldsymbol{u}_{t}, \boldsymbol{\mu}_{t-1}\right)-G_{t}\left(\boldsymbol{x}_{t-1}-\boldsymbol{\mu}_{t-1}\right)\right] \\ &+\frac{1}{2}\left(\boldsymbol{x}_{t-1}-\boldsymbol{\mu}_{t-1}\right)^{\mathrm{T}} \boldsymbol{\Sigma}_{t-1}^{-1}\left(\boldsymbol{x}_{\boldsymbol{t}-1}-\boldsymbol{\mu}_{t-1}\right) \end{aligned} Lt=21[xtg(ut,μt1)Gt(xt1μt1)]TRt1[xtg(ut,μt1)Gt(xt1μt1)]+21(xt1μt1)TΣt11(xt1μt1)
我们发现状态 x t − 1 x_t-1 xt1前的系数矩阵就是由 A t A_t At变为了 G t G_t Gt,但是这样理解可能还不够直观。

下面我们可以看下PythonRobotics中提供的拓展卡尔曼滤波的python代码是怎么写的

def ekf_estimation(xEst, PEst, z, u):

    #  Predict
    xPred = motion_model(xEst, u)
    jF = jacobF(xPred, u)
    PPred = jF.dot(PEst).dot(jF.T) + R

    #  Update
    jH = jacobH(xPred)
    zPred = observation_model(xPred)
    y = z.T - zPred
    S = jH.dot(PPred).dot(jH.T) + Q
    K = PPred.dot(jH.T).dot(np.linalg.inv(S))
    xEst = xPred + K.dot(y)
    PEst = (np.eye(len(xEst)) - K.dot(jH)).dot(PPred)

    return xEst, PEst

我这里都不要太多解释,对应着公式看就能都对应上,这里比较有意思的一个点是代码为了追求简单采样了线性高斯动态模型来代替的非线性高斯动态模型,就是用扩展卡尔曼滤波来解了一个线性高斯动态模型,我们可以看下这个雅克比矩阵是怎么处理的,以状态转移方程为例:

def jacobF(x, u):
    yaw = x[2, 0]
    v = u[0, 0]
    jF = np.array([
        [1.0, 0.0, -DT * v * math.sin(yaw), DT * math.cos(yaw)],
        [0.0, 1.0, DT * v * math.cos(yaw), DT * math.sin(yaw)],
        [0.0, 0.0, 1.0, 0.0],
        [0.0, 0.0, 0.0, 1.0]])

    return jF

代码中这个矩阵是怎么来的呢?
首先状态转移方程的模型是这样的: x t + 1 = F x t + B u t \mathbf{x}_{t+1}=F \mathbf{x}_{t}+B \mathbf{u}_{t} xt+1=Fxt+But
其中 F = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 ] F=\left[ \begin{array}{llll}{1} & {0} & {0} & {0} \\ {0} & {1} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {0}\end{array}\right] F= 1000010000100000 以及 B = [ cos ⁡ ( ϕ ) d t 0 sin ⁡ ( ϕ ) d t 0 0 d t 1 0 ] B=\left[ \begin{array}{cc}{\cos (\phi) d t} & {0} \\ {\sin (\phi) d t} & {0} \\ {0} & {d t} \\ {1} & {0}\end{array}\right] B= cos(ϕ)dtsin(ϕ)dt0100dt0

然后雅克比矩阵的计算公式是 J F = [ d x d x d x d y d x d ϕ d x d v d y d x d y d y d y d ϕ d y d v d ϕ d x d ϕ d y d ϕ d ϕ d ϕ d v d v d x d v d y d v d ϕ d v d v ] J_{F}=\left[ \begin{array}{cccc}{\frac{d x}{d x}} & {\frac{d x}{d y}} & {\frac{d x}{d \phi}} & {\frac{d x}{d v}} \\ {\frac{d y}{d x}} & {\frac{d y}{d y}} & {\frac{d y}{d \phi}} & {\frac{d y}{d v}} \\ {\frac{d \phi}{d x}} & {\frac{d \phi}{d y}} & {\frac{d \phi}{d \phi}} & {\frac{d \phi}{d v}} \\ {\frac{d v}{d x}} & {\frac{d v}{d y}} & {\frac{d v}{d \phi}} & {\frac{d v}{d v}}\end{array}\right] JF= dxdxdxdydxdϕdxdvdydxdydydydϕdydvdϕdxdϕdydϕdϕdϕdvdvdxdvdydvdϕdvdv 把所有变量都带进去就可以得到 J F = [ 1 0 − v sin ⁡ ( ϕ ) d t cos ⁡ ( ϕ ) d t 0 1 v cos ⁡ ( ϕ ) d t sin ⁡ ( ϕ ) d t 0 0 1 0 0 0 0 1 ] J_{F}=\left[ \begin{array}{cccc}{1} & {0} & {-v \sin (\phi) d t} & {\cos (\phi) d t} \\ {0} & {1} & {v \cos (\phi) d t} & {\sin (\phi) d t} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right] JF= 10000100vsin(ϕ)dtvcos(ϕ)dt10cos(ϕ)dtsin(ϕ)dt01 通过这个例子可以加深我们对扩展卡尔曼滤波的实际操作的理解。
然后代码运行的结果如下(建议读下源码,对理解很有帮助):
在这里插入图片描述

(3)推导——卡尔曼滤波

卡尔曼滤波的推导各有千秋,《概率机器人》上是直接对高斯分布的形式进行积分,然后通过求积分结果(正态分布)的极小值和方差获得预测或者下一状态的均值和方差,而徐亦达老师的视频课程是通过高斯形式的联合分布来给出结论的,但是给我印象最深的还是白巧克力亦唯心博主(贺博,大佬大佬…)给出来的推导过程,下面我基于鉴于博客的推导过程给出自己的理解。

首先给出运动方程和观测方程,这应该没什么问题:
x k = A x k − 1 + B u k − 1 + w k − 1 ( 1 ) x_{k}=A x_{k-1}+B u_{k-1}+w_{k-1}(1) xk=Axk1+Buk1+wk11 z k = H x k + v k ( 2 ) z_{k}=H x_{k}+v_{k}(2) zk=Hxk+vk2其中, p ( w ) ∼ N ( 0 , Q ) p(w) \sim N(0, Q) p(w)N(0,Q) p ( v ) ∼ N ( 0 , R ) p(v) \sim N(0, R) p(v)N(0,R)
我们首先明确,这两个方程我们都是已知的,我们能够通过运动方程得到理论预测(先验),然后我们又有观测数据,通过观测数据我们可以对理论预测进行修正,从而得到后验。

这里我们给出这样一个修正公式 x ^ k = x ^ k ′ + K k ( z k − z ^ k ) = x ^ k ′ + K k ( z k − H x ^ k ′ ) ( 3 ) \hat{x}_{k}=\hat{x}_{k}^{\prime}+K_{k}\left(z_{k}-\hat{z}_{k}\right)=\hat{x}_{k}^{\prime}+K_{k}\left(z_{k}-H \hat{x}_{k}^{\prime}\right)(3) x^k=x^k+Kk(zkz^k)=x^k+Kk(zkHx^k)3其中, x ^ k ′ \hat{x}_{k}^{\prime} x^k是我们理论预测值(先验), x ^ k \hat{x}_{k} x^k是我们修正后的估计值(后验), z ^ k \hat{z}_{k} z^k是测量值的预测值(就是将我们的状态预测值, x ^ k ′ \hat{x}_{k}^{\prime} x^k带入观测方程得到的结果), z k z_{k} zk就是我们实际的测量值, ( z k − H x ^ k ′ ) \left(z_{k}-H \hat{x}_{k}^{\prime}\right) (zkHx^k)就是残差。

这里通过协方差矩阵往下推,首先给出估计值和真实值之前的协方差矩阵: P k = E [ e k e k T ] = E [ ( x k − x ^ k ) ( x k − x ^ k ) T ] ( 4 ) P_{k}=E\left[e_{k} e_{k}^{T}\right]=E\left[\left(x_{k}-\hat{x}_{k}\right)\left(x_{k}-\hat{x}_{k}\right)^{T}\right](4) Pk=E[ekekT]=E[(xkx^k)(xkx^k)T]4将上文的(3)式和(2)式代入得 P k = E [ [ ( I − K k H ) ( x k − x ^ k ′ ) − K k v k ] [ ( I − K k H ) ( x k − x ^ k ′ ) − K k v k ] T ] ( 5 ) P_{k}=E\left[\left[\left(I-K_{k} H\right)\left(x_{k}-\hat{x}_{k}^{\prime}\right)-K_{k} v_{k}\right]\right.\left[\left(I-K_{k} H\right)\left(x_{k}-\hat{x}_{k}^{\prime}\right)-K_{k} v_{k}\right]^{T} ](5) Pk=E[[(IKkH)(xkx^k)Kkvk][(IKkH)(xkx^k)Kkvk]T]5然后我们给出理论预测值和真实值之间的协方差矩阵 P k ′ = E [ e k ′ e k ′ T ] = E [ ( x k − x ^ k ′ ) ( x k − x ^ k ′ ) T ] P_{k}^{\prime}=E\left[e_{k}^{\prime} e_{k}^{\prime T}\right]=E\left[\left(x_{k}-\hat{x}_{k}^{\prime}\right)\left(x_{k}-\hat{x}_{k}^{\prime}\right)^{T}\right] Pk=E[ekekT]=E[(xkx^k)(xkx^k)T]展开(5)式得 P k = ( I − K k H ) E [ ( x k − x ^ k ′ ) ( x k − x ^ k ′ ) T ] ( I − K k H ) + K k E [ v k v k T ] K k T P_{k}=\left(I-K_{k} H\right) E\left[\left(x_{k}-\hat{x}_{k}^{\prime}\right)\left(x_{k}-\hat{x}_{k}^{\prime}\right)^{T}\right]\left(I-K_{k} H\right)+\quad K_{k} E\left[v_{k} v_{k}^{T}\right] K_{k}^{T} Pk=(IKkH)E[(xkx^k)(xkx^k)T](IKkH)+KkE[vkvkT]KkT P k = ( I − K k H ) P k ′ ( I − K k H ) T + K k R K k T P_{k}=\left(I-K_{k} H\right) P_{k}^{\prime}\left(I-K_{k} H\right)^{T}+K_{k} R K_{k}^{T} Pk=(IKkH)Pk(IKkH)T+KkRKkT P k = P k ′ − K k H P k ′ − P k ′ H T K k T + K k ( H P k ′ H T + R ) K k T P_{k}=P_{k}^{\prime}-K_{k} H P_{k}^{\prime}-P_{k}^{\prime} H^{T} K_{k}^{T}+K_{k}\left(H P_{k}^{\prime} H^{T}+R\right) K_{k}^{T} Pk=PkKkHPkPkHTKkT+Kk(HPkHT+R)KkT协方差的矩阵的对角线元素就是方差,我们对上式所有对角线元素求和,求和结果满足下式 T [ P k ] = T [ P k ′ ] − 2 T [ K k H P k ′ ] + T [ K k ( H P k ′ H T + R ) K k T ] T\left[P_{k}\right]=T\left[P_{k}^{\prime}\right]-2 T\left[K_{k} H P_{k}^{\prime}\right]+T\left[K_{k}\left(H P_{k}^{\prime} H^{T}+R\right) K_{k}^{T}\right] T[Pk]=T[Pk]2T[KkHPk]+T[Kk(HPkHT+R)KkT]我们求一个K使得最小均方误差最小,于是对上式求导有 d T [ P k ] d K k = − 2 ( H P k ′ ) T + 2 K k ( H P k ′ H T + R ) \frac{d T\left[P_{k}\right]}{d K_{k}}=-2\left(H P_{k}^{\prime}\right)^{T}+2 K_{k}\left(H P_{k}^{\prime} H^{T}+R\right) dKkdT[Pk]=2(HPk)T+2Kk(HPkHT+R) K k = P k ′ H T ( H P k ′ H T + R ) − 1 K_{k}=P_{k}^{\prime} H^{T}\left(H P_{k}^{\prime} H^{T}+R\right)^{-1} Kk=PkHT(HPkHT+R)1当当当!这就是卡尔曼增益啦,卡尔曼增益里面包含了一个我们前文提到过的 P k ′ P_{k}^{\prime} Pk(预测值与真实值之间的协方差矩阵),它是怎么求的呢?通过我们预测过程求解出来的: P k + 1 ′ = E [ e k + 1 T e k + 1 T ′ ] = E [ ( x k + 1 − x ^ k + 1 ′ ) ( x k + 1 − x ^ k + 1 ′ ) r ] = E [ ( A ( x k − x ^ k ) + ω k ) ( A ( x k − x ^ k ) + ω k t ) r ] = E [ ( A e k ) ( A e k ) r ] + E [ ω k ω k T ] = A P k A T + Q \begin{aligned} P_{k+1}^{\prime} &=E\left[e_{k+1}^{T} e_{k+1}^{T \prime}\right] \\ &=E\left[\left(x_{k+1}-\hat{x}_{k+1}^{\prime}\right)\left(x_{k+1}-\hat{x}_{k+1}^{\prime}\right)^{r}\right] \\ &=E\left[\left(A\left(x_{k}-\hat{x}_{k}\right)+\omega_{k}\right)\left(A\left(x_{k}-\hat{x}_{k}\right)+\omega_{k t}\right)^{r}\right] \\ &=E\left[\left(A e_{k}\right)\left(A e_{k}\right)^{r}\right]+E\left[\omega_{k} \omega_{k}^{T}\right] \\ &=A P_{k} A^{T}+Q \end{aligned} Pk+1=E[ek+1Tek+1T]=E[(xk+1x^k+1)(xk+1x^k+1)r]=E[(A(xkx^k)+ωk)(A(xkx^k)+ωkt)r]=E[(Aek)(Aek)r]+E[ωkωkT]=APkAT+Q倒数第三步到倒数第二步的原因是状态变量与噪声独立,到这里卡尔曼滤波中的所有公式都可解释了,是不是很爽快!


(4)顺便问一句,如何通过卡尔曼滤波进行多传感器融合?

扩展卡尔曼滤波EKF与多传感器融合这个博客简单地讲清楚了这个问题,如下两张PPT所示:
在这里插入图片描述在这里插入图片描述
如果卡尔曼滤波搞得差不多清楚了的话这两张图就很好理解了,Predicition预测的方式是相同的,Update更新是他们的测量方程不同,例如这篇博客中举的例子,对于激光而言,观测矩阵如下: z = H x + R = [ 1 0 0 0 0 1 0 0 ] [ p x p y v x v y ] + [ 0.0225 0 0 0.0225 ] z =H x+R=\left[ \begin{array}{cccc}{1} & {0} & {0} & {0} \\ {0} & {1} & {0} & {0}\end{array}\right] \left[ \begin{array}{c}{p_{x}} \\ {p_{y}} \\ {v_{x}} \\ {v_{y}}\end{array}\right]+\left[ \begin{array}{cc}{0.0225} & {0} \\ {0} & {0.0225}\end{array}\right] z=Hx+R=[10010000] pxpyvxvy +[0.0225000.0225]对于雷达而言 z = f ( x ) + R = [ ρ ϕ ρ ˙ ] = [ p x 2 + p y 2 arctan ⁡ p y p x p x v x + p y v y p x 2 + p y 2 ] + [ 0.09 0 0 0 0.0009 0 0 0 0.09 ] z=f(x)+R=\left[ \begin{array}{c}{\rho} \\ {\phi} \\ {\dot{\rho}}\end{array}\right]=\left[ \begin{array}{c}{\sqrt{p_{x}^{2}+p_{y}^{2}}} \\ {\arctan \frac{p_{y}}{p_{x}}} \\ {\frac{p_{x} v_{x}+p_{y} v_{y}}{\sqrt{p_{x}^{2}+p_{y}^{2}}}}\end{array}\right]+\left[ \begin{array}{ccc}{0.09} & {0} & {0} \\ {0} & {0.0009} & {0} \\ {0} & {0} & {0.09}\end{array}\right] z=f(x)+R= ρϕρ˙ = px2+py2 arctanpxpypx2+py2 pxvx+pyvy + 0.090000.00090000.09
因此在扩展卡尔曼滤波的更新过程中就会不一样,在工程实践方面肯定还存在这许多实践细节要注意,这里就不在细究,之后遇到实际项目时再进一步考虑。

就到这里啦,有问题欢迎交流~

此外,对SLAM算法感兴趣的同学可以看考我的博客SLAM算法总结——经典SLAM算法框架总结

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
卡尔曼滤波(Kalman Filter)是一种用于状态估计的递归滤波器,常用于估计动态系统状态的线性高斯模型。它基于当前测量值和验(预测)估计值,通过加权融合这两个信息来得到最优的状态估计。 卡尔曼滤波的基本思想是利用系统的动态模型来进行状态的预测,然后通过观测值来进行修正。它将预测和修正两个步骤交替进行,从而实现对状态的逐步更新。卡尔曼滤波的核心数学模型是由卡尔曼滤波方程组组成,包括预测方程和修正方程。 扩展卡尔曼滤波(Extended Kalman Filter)则是卡尔曼滤波在非线性系统中的扩展。在非线性系统中,无法直接应用线性卡尔曼滤波,因为非线性函数通常不能满足高斯分布的假设。扩展卡尔曼滤波通过使用线性化技术,将非线性系统近似为线性系统,并在每个时间步骤上应用卡尔曼滤波扩展卡尔曼滤波的主要步骤包括状态预测、测量预测、状态更新和协方差更新。在状态预测和测量预测阶段,通过非线性函数的线性化来计算预测的状态和协方差;在状态更新和协方差更新阶段,通过融合测量数据和预测数据,得到修正后的状态和协方差。 总结起来,卡尔曼滤波扩展卡尔曼滤波都是用于状态估计的滤波器,卡尔曼滤波适用于线性高斯系统,而扩展卡尔曼滤波适用于非线性系统。它们在估计系统状态方面具有广泛的应用,例如机器人定位、导航系统、目标跟踪等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值