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

  • 概率机器人总结——(扩展)卡尔曼滤波先实践再推导
    • (1)卡尔曼、扩展卡尔曼、粒子滤波到底什么关系?
    • (2)实践——扩展卡尔曼滤波
    • (3)推导——卡尔曼滤波
    • (4)顺便问一句,如何通过卡尔曼滤波进行多传感器融合?

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

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

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

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

模型类型 p(xk∣xk−1)p\left(x_{k} \mid x_{k-1}\right)p(xk​∣xk−1​) p(yt∣xt)p(y_t \mid x_t)p(yt​∣xt​) p(x1)p(x_1)p(x1​) 说明
离散状态动态模型 Axt+ButAx_t+Bu_tAxt​+But​ HxtHx_tHxt​ π\piπ 隐马尔科夫模型,无滤波
线性高斯动态模型 N(Axt+But+δ,Q)N(Ax_t+Bu_t+\delta, Q)N(Axt​+But​+δ,Q) N(Hxt+c,R)N(Hx_t+c, R)N(Hxt​+c,R) N(μ,σ)N(\mu,\sigma)N(μ,σ) 卡尔曼滤波
非线性非高斯动态模型 f(xt−1)f(x_{t-1})f(xt−1​) g(xt−1)g(x_{t-1})g(xt−1​) f(x0)f(x_0)f(x0​) 粒子滤波

首先什么是动态模型呢?

这个就是状态模型,在离散状态下就是大名鼎鼎的隐马尔科夫模型,在机器学习范畴内非常有效的一种模型,而当我们的状态转移方程和观测方程都变成线性高斯模型之后,这时候处理最有效的方式之一就是卡尔曼滤波,而扩展卡尔曼呢?当动态模型都为非线性高斯模型是就是用扩展卡尔曼滤波(其基本思路就是将非线性模型线性化),而最后最复杂的是非线性非高斯模型,怎么办呢?粒子滤波咯,粒子滤波我写了一个同款博客,欢迎参考概率机器人总结——粒子滤波先实践再推导,这就是他们之间的关系。

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

首先给出线性高斯动态模型的状态转移方程和观测方程,如下:xt=Atxt−1+Btut+εtx_{t}=A_{t} x_{t-1}+B_{t} u_{t}+\varepsilon_{t} xt​=At​xt−1​+Bt​ut​+εt​zt=Ctxt+δtz_{t}=C_{t} x_{t}+\delta_{t} zt​=Ct​xt​+δt​
其中εt\varepsilon_{t}εt​和δt\delta_{t}δt​分别为满足零均值高斯分布的噪声。
然后,我们从卡尔曼滤波的公式开始,如下:
μ‾t=Atμt−1+BtutΣ‾t=AtΣt−1AtT+RtKt=Σ‾tCtT(CtΣ‾tCtT+Qt)−1μt=μ‾t+Kt(zt−Ctμ‾t)Σt=(I−KtCt)Σ‾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​Σt​Kt​μt​Σt​​=At​μt−1​+Bt​ut​=At​Σt−1​AtT​+Rt​=Σt​CtT​(Ct​Σt​CtT​+Qt​)−1=μ​t​+Kt​(zt​−Ct​μ​t​)=(I−Kt​Ct​)Σt​​
如果没有接触过卡尔曼滤波,第一次看到这些公式会觉得怎么这么复杂,学明白之后发现其实还是蛮简单的,这里先简单说下对这个公式的理解
第一个公式和均值(期望)有关,指的是通过上一个状态的均值μt−1\mu_{t-1}μt−1​和控制量以及状态转移方程预测出下一个状态的均值μ‾t\overline{\mu}_{t}μ​t​
第二个公式和方差有关,指的是根据上一个状态的方差Σt−1\Sigma_{t-1}Σt−1​和噪声的方差RtR_{t}Rt​预测出下一个状态的方差Σ‾t\overline{\Sigma}_{t}Σt​

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

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

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

好了,卡尔曼滤波搞清楚了,我们再来看下扩展卡尔曼滤波,首先给出非线性高斯动态模型的方程,如下:xt=g(ut,xt−1)+εtx_{t}=g\left(u_{t}, x_{t-1}\right)+\varepsilon_{t} xt​=g(ut​,xt−1​)+εt​zt=h(xt)+δtz_{t}=h\left(x_{t}\right)+\delta_{t} zt​=h(xt​)+δt​
同理,其中εt\varepsilon_{t}εt​和δt\delta_{t}δt​分别为满足零均值高斯分布的噪声。
μ‾t=g(ut,μt−1)Σ‾t=GtΣt−1GtT+RtKt=Σ‾tHtT(HtΣ‾tHtT+Qt)−1μt=μ‾t+Kt(zt−h(μ‾t))Σt=(I−KtHt)Σ‾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​Σt​Kt​μt​Σt​​=g(ut​,μt−1​)=Gt​Σt−1​GtT​+Rt​=Σt​HtT​(Ht​Σt​HtT​+Qt​)−1=μ​t​+Kt​(zt​−h(μ​t​))=(I−Kt​Ht​)Σt​​
和卡尔曼滤波一对比,发现简直一模一样,主要不同的是将状态转移方程中系数矩阵At,CtA_t,C_tAt​,Ct​换成了非线性方程的雅克比矩阵Gt,HtG_t,H_tGt​,Ht​,为什么是雅克比矩阵,这当然是和推导有关,我们可以先直观感受下,在《概率机器人》的推导过程中,在对状态转移的分布进行积分获状态的置信度时需要提取出来一个关键公式:Lt=12(xt−Atxt−1−Btut)TRt−1(xt−Atxt−1−Btut)+12(xt−1−μt−1)TΣt−1−1(xt−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​(xt​−At​xt−1​−Bt​ut​)TRt−1​(xt​−At​xt−1​−Bt​ut​)+21​(xt−1​−μt−1​)TΣt−1−1​(xt−1​−μt−1​)​
而扩展卡尔曼滤波的这个对应的公式是Lt=12[xt−g(ut,μt−1)−Gt(xt−1−μt−1)]TRt−1[xt−g(ut,μt−1)−Gt(xt−1−μt−1)]+12(xt−1−μt−1)TΣt−1−1(xt−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​[xt​−g(ut​,μt−1​)−Gt​(xt−1​−μt−1​)]TRt−1​[xt​−g(ut​,μt−1​)−Gt​(xt−1​−μt−1​)]+21​(xt−1​−μt−1​)TΣt−1−1​(xt−1​−μt−1​)​
我们发现状态xt−1x_t-1xt​−1前的系数矩阵就是由AtA_tAt​变为了GtG_tGt​,但是这样理解可能还不够直观。

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

def ekf_estimation(xEst, PEst, z, u):#  PredictxPred = motion_model(xEst, u)jF = jacobF(xPred, u)PPred = jF.dot(PEst).dot(jF.T) + R#  UpdatejH = jacobH(xPred)zPred = observation_model(xPred)y = z.T - zPredS = jH.dot(PPred).dot(jH.T) + QK = 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

代码中这个矩阵是怎么来的呢?
首先状态转移方程的模型是这样的:xt+1=Fxt+But\mathbf{x}_{t+1}=F \mathbf{x}_{t}+B \mathbf{u}_{t} xt+1​=Fxt​+But​
其中F=[1000010000100000]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=⎣⎢⎢⎡​1000​0100​0010​0000​⎦⎥⎥⎤​以及B=[cos⁡(ϕ)dt0sin⁡(ϕ)dt00dt10]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(ϕ)dt01​00dt0​⎦⎥⎥⎤​

然后雅克比矩阵的计算公式是JF=[dxdxdxdydxdϕdxdvdydxdydydydϕdydvdϕdxdϕdydϕdϕdϕdvdvdxdvdydvdϕdvdv]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​=⎣⎢⎢⎢⎡​dxdx​dxdy​dxdϕ​dxdv​​dydx​dydy​dydϕ​dydv​​dϕdx​dϕdy​dϕdϕ​dϕdv​​dvdx​dvdy​dvdϕ​dvdv​​⎦⎥⎥⎥⎤​把所有变量都带进去就可以得到JF=[10−vsin⁡(ϕ)dtcos⁡(ϕ)dt01vcos⁡(ϕ)dtsin⁡(ϕ)dt00100001]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​=⎣⎢⎢⎡​1000​0100​−vsin(ϕ)dtvcos(ϕ)dt10​cos(ϕ)dtsin(ϕ)dt01​⎦⎥⎥⎤​通过这个例子可以加深我们对扩展卡尔曼滤波的实际操作的理解。
然后代码运行的结果如下(建议读下源码,对理解很有帮助):

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

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

首先给出运动方程和观测方程,这应该没什么问题:
xk=Axk−1+Buk−1+wk−1(1)x_{k}=A x_{k-1}+B u_{k-1}+w_{k-1}(1) xk​=Axk−1​+Buk−1​+wk−1​(1)zk=Hxk+vk(2)z_{k}=H x_{k}+v_{k}(2) zk​=Hxk​+vk​(2)其中,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′+Kk(zk−z^k)=x^k′+Kk(zk−Hx^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​(zk​−z^k​)=x^k′​+Kk​(zk​−Hx^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′​带入观测方程得到的结果),zkz_{k}zk​就是我们实际的测量值,(zk−Hx^k′)\left(z_{k}-H \hat{x}_{k}^{\prime}\right)(zk​−Hx^k′​)就是残差。

这里通过协方差矩阵往下推,首先给出估计值和真实值之前的协方差矩阵:Pk=E[ekekT]=E[(xk−x^k)(xk−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[ek​ekT​]=E[(xk​−x^k​)(xk​−x^k​)T](4)将上文的(3)式和(2)式代入得Pk=E[[(I−KkH)(xk−x^k′)−Kkvk][(I−KkH)(xk−x^k′)−Kkvk]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[[(I−Kk​H)(xk​−x^k′​)−Kk​vk​][(I−Kk​H)(xk​−x^k′​)−Kk​vk​]T](5)然后我们给出理论预测值和真实值之间的协方差矩阵Pk′=E[ek′ek′T]=E[(xk−x^k′)(xk−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[ek′​ek′T​]=E[(xk​−x^k′​)(xk​−x^k′​)T]展开(5)式得Pk=(I−KkH)E[(xk−x^k′)(xk−x^k′)T](I−KkH)+KkE[vkvkT]KkTP_{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​=(I−Kk​H)E[(xk​−x^k′​)(xk​−x^k′​)T](I−Kk​H)+Kk​E[vk​vkT​]KkT​得Pk=(I−KkH)Pk′(I−KkH)T+KkRKkTP_{k}=\left(I-K_{k} H\right) P_{k}^{\prime}\left(I-K_{k} H\right)^{T}+K_{k} R K_{k}^{T} Pk​=(I−Kk​H)Pk′​(I−Kk​H)T+Kk​RKkT​得Pk=Pk′−KkHPk′−Pk′HTKkT+Kk(HPk′HT+R)KkTP_{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​=Pk′​−Kk​HPk′​−Pk′​HTKkT​+Kk​(HPk′​HT+R)KkT​协方差的矩阵的对角线元素就是方差,我们对上式所有对角线元素求和,求和结果满足下式T[Pk]=T[Pk′]−2T[KkHPk′]+T[Kk(HPk′HT+R)KkT]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[Kk​HPk′​]+T[Kk​(HPk′​HT+R)KkT​]我们求一个K使得最小均方误差最小,于是对上式求导有dT[Pk]dKk=−2(HPk′)T+2Kk(HPk′HT+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) dKk​dT[Pk​]​=−2(HPk′​)T+2Kk​(HPk′​HT+R)Kk=Pk′HT(HPk′HT+R)−1K_{k}=P_{k}^{\prime} H^{T}\left(H P_{k}^{\prime} H^{T}+R\right)^{-1} Kk​=Pk′​HT(HPk′​HT+R)−1当当当!这就是卡尔曼增益啦,卡尔曼增益里面包含了一个我们前文提到过的Pk′P_{k}^{\prime}Pk′​(预测值与真实值之间的协方差矩阵),它是怎么求的呢?通过我们预测过程求解出来的:Pk+1′=E[ek+1Tek+1T′]=E[(xk+1−x^k+1′)(xk+1−x^k+1′)r]=E[(A(xk−x^k)+ωk)(A(xk−x^k)+ωkt)r]=E[(Aek)(Aek)r]+E[ωkωkT]=APkAT+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+1T​ek+1T′​]=E[(xk+1​−x^k+1′​)(xk+1​−x^k+1′​)r]=E[(A(xk​−x^k​)+ωk​)(A(xk​−x^k​)+ωkt​)r]=E[(Aek​)(Aek​)r]+E[ωk​ωkT​]=APk​AT+Q​倒数第三步到倒数第二步的原因是状态变量与噪声独立,到这里卡尔曼滤波中的所有公式都可解释了,是不是很爽快!

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

扩展卡尔曼滤波EKF与多传感器融合这个博客简单地讲清楚了这个问题,如下两张PPT所示:

如果卡尔曼滤波搞得差不多清楚了的话这两张图就很好理解了,Predicition预测的方式是相同的,Update更新是他们的测量方程不同,例如这篇博客中举的例子,对于激光而言,观测矩阵如下:z=Hx+R=[10000100][pxpyvxvy]+[0.0225000.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=[10​01​00​00​]⎣⎢⎢⎡​px​py​vx​vy​​⎦⎥⎥⎤​+[0.02250​00.0225​]对于雷达而言z=f(x)+R=[ρϕρ˙]=[px2+py2arctan⁡pypxpxvx+pyvypx2+py2]+[0.090000.00090000.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​​arctanpx​py​​px2​+py2​​px​vx​+py​vy​​​⎦⎥⎥⎤​+⎣⎡​0.0900​00.00090​000.09​⎦⎤​
因此在扩展卡尔曼滤波的更新过程中就会不一样,在工程实践方面肯定还存在这许多实践细节要注意,这里就不在细究,之后遇到实际项目时再进一步考虑。

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

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

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

  1. 概率机器人总结——占用栅格地图先实践再推导

    概率机器人总结--占用栅格地图先实践再推导 概率机器人总结--占用栅格地图构建先实践再推导 实践过程 伪代码分析 真代码分析 推导过程 静态二值贝叶斯滤波 概率机器人总结--占用栅格地图构建先实践再推 ...

  2. 机器人学习--扩展卡尔曼滤波算法用于机器人定位

    论文链接:leonard_ieeetroa19.pdf-互联网文档类资源-CSDN下载https://download.csdn.net/download/GGY1102/61742571 基于EKF ...

  3. 【概率机器人】3.1 卡尔曼滤波、扩展卡尔曼滤波和无迹卡尔曼滤波

    这一章将介绍卡尔曼滤波.扩展卡尔曼滤波以及无迹卡尔曼滤波,并从贝叶斯滤波的角度来进行分析并完成数学推导.如果您对贝叶斯滤波不了解,可以查阅相关书籍或阅读 [概率机器人 2 递归状态估计]. 这三种滤波 ...

  4. 基于扩展卡尔曼滤波(EKF)的机器人状态估计

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 EKF的目的是使卡尔曼滤波器能够应用于机器人等非线性运动系统,EK ...

  5. 始卡尔曼滤波算法(KF)、扩展卡尔曼滤波算法(EKF)以及无迹卡尔曼滤波算法(UKF)三者之间的区别?

    原始卡尔曼滤波算法(KF).扩展卡尔曼滤波算法(EKF)以及无迹卡尔曼滤波算法(UKF)三者之间的区别? 原文:https://www.zhihu.com/question/22714163/answ ...

  6. SLAM学习--2D激光SLAM-圣经-概率机器人学各种扩展

    零.教材 1.<Probabilistic-Robotics>--Sebastian Thrun 等人. 经典教材  几乎是该领域圣经级别的教材,第一作者是谷歌无人驾驶之父,其他的很多都和 ...

  7. 交互式多模型-扩展卡尔曼滤波IMM-EKF——机动目标跟踪中的应用

    交互式多模型-扩展卡尔曼滤波IMM-EKF--机动目标跟踪中的应用 原创不易,路过的各位大佬请点个赞 针对机动目标跟踪的探讨.技术支持欢迎联系,也可以站内私信 WX: ZB823618313 机动目标 ...

  8. 状态估计3(扩展卡尔曼滤波)

    1 简述 卡尔曼滤波适用于线性高斯系统,然而这是一个强假设:对于大部分机器人系统而言,非线性系统才是常态,如此卡尔曼滤波就不太适用了,那么该如何解决这个问题?这引出了扩展卡尔曼滤波. 2 扩展卡尔曼滤 ...

  9. 卡尔曼滤波(KF)和扩展卡尔曼滤波(EKF)相应推导

    从上个世纪卡尔曼滤波理论被提出,卡尔曼滤波在控制论与信息论的连接上做出了卓越的贡献.为了得出准确的下一时刻状态真值,我们常常使用卡尔曼滤波.扩展卡尔曼滤波.无迹卡尔曼滤波.粒子滤波等等方法,这些方法在 ...

最新文章

  1. 微服务架构之「 服务注册 」
  2. 《小账本》开发日志 第三天
  3. java gui 窗口 传值_java – GUI – 在不同窗口之间传输数据(J...
  4. python截图保存到内存卡_Python画月饼,云上过中秋,天池Python入门案例系列赛开启...
  5. 学习MySQL我们应该知道哪些东西?
  6. Python的虚拟环境配置(pyenv+virtualenv)
  7. 完整nagios安装最新pnp版绘图-sync模式
  8. 2、组件注册-@Configuration@Bean给容器中注册组件
  9. Pipeline As Code With Jenkins2.0
  10. FZU 2108 Mod problem
  11. 网关为0.0.0.0_距离ETH 2.0仅7天,目标价为?美元
  12. SQL Server2017 安装错误:Verify that you have sufficient access to that key
  13. pytorch使用万能模板
  14. 2022年天津专升本报考专业对口限制目录,升本专业课如何备考~
  15. 解决Centos8自带Firefox实现播放声音与视频-Linux、VMware
  16. RF射频信号,高速信号能将电源平面作为参考平面吗?
  17. uniapp开发抖音小程序注意事项
  18. 如何解决ARP欺骗攻击
  19. 在使用npm install时遇到的问题 npm ERR! code ERESOLVE
  20. 翻译: 成长心态 成功的新心理学

热门文章

  1. 一些恶心的代码片段,你看了就知道!
  2. Java IO流之打印流与标准流
  3. 从零开始学python人工智能课程_从零开始学人工智能(12)--Python · 决策树(零)· 简介...
  4. (Spring)AOP-面向切面编程
  5. 操作系统之进程调度——优先权法和轮转法(附上样例讲解)
  6. mybatis学习笔记(3)—数据库和bean名称不一样处理方案
  7. 错误The type XXX is deprecated解决
  8. Python3.5入门到项目实战(104天课程)
  9. small android,Android-Small框架-基础
  10. 计算机数值方法期末考试,《计算机数值方法》测试题二