对于卡尔曼滤波的直观理解便是对所掌握数据的融合处理,假设手头有两个随机变量,知道其均值和方差,而且均值相同,那么我希望找到一个权重,使得把这两个随机变量组合起来,均值不变,方差减小,从线条上看当然变得平稳了一些,于是被搞工程的人成为滤波。
问题是权重如何找呢?简化一下问题,把这两个随机变量都视作服从正态分布的随机变量,这样通过计算可知,权重与它们的方差有关。
下一个问题是,往往手头只有一个滤波器,怎么办?可以给系统建模,根据历史信息计算出一个额外的数值来,为了简化问题,认为系统是线性的,那么输入数学模型给出的数值任然服从某个正态分布,均值和方差都可以从模型中导出。然后就可以开开心心地滤波了。
齐次要理解粒子滤波。接上,然而问题接踵而至,系统的模型往往都不是线性的啊!输入个正态分布的量,有的连解析式都写不出来,根本不知道输出的是个啥啊!于是想了个办法,我们不用均值和方差来表示随机变量,我们用数量居多的采样点来表示!!!把每个采样带进模型去计算,统统算完就得到了下一次的随机变量的采样点,当需要计算权重的时候再把方差给算出来。在计算力十分十分强大的仿真平台上,这方法还能说得过去。因为一般要用到的采样点很多,所以也被称作粒子云滤波。
现在可以理解无迹卡尔曼滤波了,在一般情况下,应用粒子滤波困难重重,因为那些粒子云经过多次迭代,很容易发生聚集,这样就无法精准的描述随机变量了,所以一般要择机向粒子云里稀疏的地方添加粒子,在太过稠密的地方减去粒子,不过谁能保证这么操作不会带来均值与方差的偏差?
此外为了达到精度要求,粒子的数量需要很大,这很难算的过来啊。此时相信你已经体会到了,如何更准更快的计算某个随机变量经过某个函数变成了怎样的随机变量才是卡尔曼滤波器的关键所在。无迹变换是尝试解决这个问题的一个方案,通过某种规则去采样,在粒子数量尽量小的情况下,去保证采样点云的均值和方差不变。不过我没做过无迹卡尔曼的仿真,对ut的理解不深入。
ref:无迹卡尔曼到底是什么东西?
在时序运动系统中为了得到当前时刻自身的状态信息,一方面需要根据以往数据对当前时刻进行估计,同时需要使用传感器等测量工具对自身状态进行测量,进而调整估计模型使得估计更加准确。
x ˉ t = x ^ t + K t ( x ˙ t − H ⋅ x ^ t ) \bar{x}_t=\hat{x}_t+\mathcal{K}_t(\dot{x}_t-\mathcal{H}\cdot\hat{x}_t) xˉt=x^t+Kt(x˙t−H⋅x^t)
K t ∈ [ 0 , 1.0 ] \mathcal{K}_t\in[0,1.0] Kt∈[0,1.0]为卡尔曼增益, H \mathcal{H} H为测量转换矩阵。符号统一定义:
KF滤波器是线型滤波器,其理想状态转移方程(也可称为运动方程)可以描述为:
x t = F ⋅ x t − 1 + B ⋅ u t + ω t x_t=\mathcal{F}\cdot x_{t-1}+\mathcal{B}\cdot u_t+\omega_t xt=F⋅xt−1+B⋅ut+ωt
其中, F \mathcal{F} F代表状态转移矩阵, B \mathcal{B} B代表控制矩阵, u t u_t ut代表控制信号(如加速度、转向角度等变量), ω t \omega_t ωt代表系统噪声扰动,服从高斯分布。而上述的过程是理想情况下对线型系统的建模,而实际中对于实际运动预测描述为:
x ^ t = F ⋅ x ˉ t − 1 + B ⋅ u t \hat{x}_t=\mathcal{F}\cdot \bar{x}_{t-1}+\mathcal{B}\cdot u_t x^t=F⋅xˉt−1+B⋅ut
注意,上面的式子中运动状态为上一时刻的估计结果 x ˉ t − 1 \bar{x}_{t-1} xˉt−1,而不是上一时刻的预测结果 x ^ t − 1 \hat{x}_{t-1} x^t−1。在上述的过程中可以看到运动估计结果与真实无偏结果是存在偏差的,这里使用协方差去度量它们之间的差异:
P ^ t = E ( e ˉ e ˉ T ) = E ( ( x t − x ^ t ) ( x t − x ^ t ) T ) = E ( ( F ⋅ x t − 1 + B ⋅ u t + ω t − F ⋅ x ˉ t − 1 − B ⋅ u t ) ( F ⋅ x t − 1 + B ⋅ u t + ω t − F ⋅ x ˉ t − 1 − B ⋅ u t ) T ) = E ( ( F ( x t − 1 − x ˉ t − 1 ) + ω t ) ( F ( x t − 1 − x ˉ t − 1 ) + ω t ) T ) = E ( F ( x t − 1 − x ˉ t − 1 ) ( x t − 1 − x ˉ t − 1 ) T F T + ω t ω t T + F ( x t − 1 − x ˉ t − 1 ) ω t T + ω t ( x t − 1 − x ˉ t − 1 ) T F T ) = F E ( ( x t − 1 − x ˉ t − 1 ) ( x t − 1 − x ˉ t − 1 ) T ) F T + E ( ω t ω t T ) = F E ( ( x t − 1 − x ˉ t − 1 ) ( x t − 1 − x ˉ t − 1 ) T ) F T + Q t = F P ˉ t − 1 F T + Q t \begin{align} \hat{P}_t&=E(\bar{e}\bar{e}^T)=E((x_t-\hat{x}_t)(x_t-\hat{x}_t)^T) \\ & = E((\mathcal{F}\cdot x_{t-1}+\mathcal{B}\cdot u_t+\omega_t-\mathcal{F}\cdot \bar{x}_{t-1}-\mathcal{B}\cdot u_t)(\mathcal{F}\cdot x_{t-1}+\mathcal{B}\cdot u_t+\omega_t-\mathcal{F}\cdot \bar{x}_{t-1}-\mathcal{B}\cdot u_t)^T) \\ & = E((\mathcal{F}(x_{t-1}-\bar{x}_{t-1})+\omega_t)(\mathcal{F}(x_{t-1}-\bar{x}_{t-1})+\omega_t)^T) \\ & = E(\mathcal{F}(x_{t-1}-\bar{x}_{t-1})(x_{t-1}-\bar{x}_{t-1})^T\mathcal{F}^T+\omega_t\omega_t^T+\mathcal{F}(x_{t-1}-\bar{x}_{t-1})\omega_t^T+\omega_t(x_{t-1}-\bar{x}_{t-1})^T\mathcal{F}^T) \\ & = \mathcal{F}E((x_{t-1}-\bar{x}_{t-1})(x_{t-1}-\bar{x}_{t-1})^T)\mathcal{F}^T+E(\omega_t\omega_t^T) \\ & = \mathcal{F}E((x_{t-1}-\bar{x}_{t-1})(x_{t-1}-\bar{x}_{t-1})^T)\mathcal{F}^T+Q_t \\ & = \mathcal{F}\bar{P}_{t-1}\mathcal{F}^T+Q_t \end{align} P^t=E(eˉeˉT)=E((xt−x^t)(xt−x^t)T)=E((F⋅xt−1+B⋅ut+ωt−F⋅xˉt−1−B⋅ut)(F⋅xt−1+B⋅ut+ωt−F⋅xˉt−1−B⋅ut)T)=E((F(xt−1−xˉt−1)+ωt)(F(xt−1−xˉt−1)+ωt)T)=E(F(xt−1−xˉt−1)(xt−1−xˉt−1)TFT+ωtωtT+F(xt−1−xˉt−1)ωtT+ωt(xt−1−xˉt−1)TFT)=FE((xt−1−xˉt−1)(xt−1−xˉt−1)T)FT+E(ωtωtT)=FE((xt−1−xˉt−1)(xt−1−xˉt−1)T)FT+Qt=FPˉt−1FT+Qt
上面式子中由于状态变量和误差变量是无关,所以 E ( x t ω t ) E(x_t\omega_t) E(xtωt)相关的期望为0, E ( ω t ω t T ) = Q t E(\omega_t\omega_t^T)=Q_t E(ωtωtT)=Qt为噪声协方差。
另外测量方程(也就是测量结果)描述为:
x ˙ t = H ⋅ x t + v t \dot{x}_t=\mathcal{H}\cdot x_t+v_t x˙t=H⋅xt+vt
其中, H \mathcal{H} H代表测量转换矩阵(运动状态空间转换到测量空间), v t v_t vt代表测量噪声,服从高斯分布。对应的在当前估计结果基础上得到的测量:
x ˙ t ′ = H ⋅ x ^ t \dot{x}_t^{'}=\mathcal{H}\cdot \hat{x}_t x˙t′=H⋅x^t
这里也通过协方差的形式度量真实测量值和以估计为基准得到测量值的偏差,并套用上面关于状态变量协方差的推导形式,可以得到:
P ˙ t = E ( ( x ˙ t − x ˙ t ′ ) ( x ˙ t − x ˙ t ′ ) T ) = H P ^ t H T + R t \begin{align} \dot{P}_t & = E((\dot{x}_t-\dot{x}_t^{'})(\dot{x}_t-\dot{x}_t^{'})^T) \\ & = \mathcal{H}\hat{P}_t\mathcal{H}^T+R_t \end{align} P˙t=E((x˙t−x˙t′)(x˙t−x˙t′)T)=HP^tHT+Rt
在卡尔曼滤波中最后估计值的描述为,其中 K t \mathcal{K}_t Kt为未知且需要估计的量:
x ˉ t = x ^ t + K t ( x ˙ t − x ^ t ′ ) = x ^ t + K t ( H x t + v t − H x ^ t ) = x ^ t + K t H x t + K t v t − K t H x ^ t \begin{align} \bar{x}_t&=\hat{x}_t+\mathcal{K}_t(\dot{x}_t-\hat{x}_t^{'}) \\ & = \hat{x}_t+\mathcal{K}_t(\mathcal{H}x_t+v_t-\mathcal{H}\hat{x}_t) \\ & = \hat{x}_t+\mathcal{K}_t\mathcal{H}x_t+\mathcal{K}_tv_t-\mathcal{K}_t\mathcal{H}\hat{x}_t\\ \end{align} xˉt=x^t+Kt(x˙t−x^t′)=x^t+Kt(Hxt+vt−Hx^t)=x^t+KtHxt+Ktvt−KtHx^t
那么对应的估计值与真实值的偏差为:
x ˉ t = x ^ t + K t H x t + K t v t − K t H x ^ t x ˉ t = x ^ t + K t H ( x t − x ˉ t ) + K t v t x ˉ t − x t = ( x ^ t − x t ) + K t H ( x t − x ^ t ) + K t v t e ˉ t = e ^ t − K t H e ^ t + K t v t e ˉ t = ( 1 − K t H ) e ^ t + K t v t \begin{align} \bar{x}_t&= \hat{x}_t+\mathcal{K}_t\mathcal{H}x_t+\mathcal{K}_tv_t-\mathcal{K}_t\mathcal{H}\hat{x}_t\\ \bar{x}_t&= \hat{x}_t+\mathcal{K}_t\mathcal{H}(x_t-\bar{x}_t)+\mathcal{K}_tv_t\\ \bar{x}_t-x_t&= (\hat{x}_t-x_t)+\mathcal{K}_t\mathcal{H}(x_t-\hat{x}_t)+\mathcal{K}_tv_t\\ \bar{e}_t&= \hat{e}_t-\mathcal{K}_t\mathcal{H}\hat{e}_t+\mathcal{K}_tv_t\\ \bar{e}_t&= (1-\mathcal{K}_t\mathcal{H})\hat{e}_t+\mathcal{K}_tv_t\\ \end{align} xˉtxˉtxˉt−xteˉteˉt=x^t+KtHxt+Ktvt−KtHx^t=x^t+KtH(xt−xˉt)+Ktvt=(x^t−xt)+KtH(xt−x^t)+Ktvt=e^t−KtHe^t+Ktvt=(1−KtH)e^t+Ktvt
对应的误差用协方差进行描述得到:
P ˉ t = E ( e ˉ t e ˉ t T ) = E ( ( ( 1 − K t H ) e ^ t + K t v t ) ( ( 1 − K t H ) e ^ t + K t v t ) T ) = E ( ( 1 − K t H ) e ^ t e ^ t T ( 1 − K t H ) T + K t v t v t T K t T ) = ( 1 − K t H ) E ( e ^ t e ^ t T ) ( 1 − K t H ) T + K t R t K t T = ( 1 − K t H ) P ^ t ( 1 − K t H ) T + K t R t K t T \begin{align} \bar{P}_t&=E(\bar{e}_t\bar{e}_t^T) \\ & = E(((1-\mathcal{K}_t\mathcal{H})\hat{e}_t+\mathcal{K}_tv_t)((1-\mathcal{K}_t\mathcal{H})\hat{e}_t+\mathcal{K}_tv_t)^T) \\ & = E((1-\mathcal{K}_t\mathcal{H})\hat{e}_t\hat{e}_t^T(1-\mathcal{K}_t\mathcal{H})^T+\mathcal{K}_tv_tv_t^T\mathcal{K}_t^T)\\ & = (1-\mathcal{K}_t\mathcal{H})E(\hat{e}_t\hat{e}_t^T)(1-\mathcal{K}_t\mathcal{H})^T+\mathcal{K}_tR_t\mathcal{K}_t^T\\ & = (1-\mathcal{K}_t\mathcal{H})\hat{P}_t(1-\mathcal{K}_t\mathcal{H})^T+\mathcal{K}_tR_t\mathcal{K}_t^T\\ \end{align} Pˉt=E(eˉteˉtT)=E(((1−KtH)e^t+Ktvt)((1−KtH)e^t+Ktvt)T)=E((1−KtH)e^te^tT(1−KtH)T+KtvtvtTKtT)=(1−KtH)E(e^te^tT)(1−KtH)T+KtRtKtT=(1−KtH)P^t(1−KtH)T+KtRtKtT
为了使得卡尔曼滤波器的估计值与真实值的误差最小化,需要将上述协方差最小化则对上述协方差求去关于增益参数 K \mathcal{K} K的导数:
∂ P ˉ t ∂ K t = − 2 P ^ t H T + 2 K t ( H P ^ t H T + R t ) \frac{\partial\bar{P}_t}{\partial\mathcal{K}_t}=-2\hat{P}_t\mathcal{H}^T+2\mathcal{K}_t(\mathcal{H}\hat{P}_t\mathcal{H}^T+R_t) ∂Kt∂Pˉt=−2P^tHT+2Kt(HP^tHT+Rt)
则上面的协方差在上述导数为0的时候达到最小化,也就解得最佳卡尔曼增益为:
K t = P ^ t H T ( H P ^ t H T + R t ) − 1 \mathcal{K}_t=\hat{P}_t\mathcal{H}^T(\mathcal{H}\hat{P}_t\mathcal{H}^T+R_t)^{-1} Kt=P^tHT(HP^tHT+Rt)−1
进而得到最小协方差结果为:
P ˉ t = P ^ t − K t H P ^ t \bar{P}_t=\hat{P}_t-\mathcal{K}_t\mathcal{H}\hat{P}_t Pˉt=P^t−KtHP^t
Step1:预测阶段
得到运动预测状态:
x ^ t = F ⋅ x ˉ t − 1 + B ⋅ u t \hat{x}_t=\mathcal{F}\cdot \bar{x}_{t-1}+\mathcal{B}\cdot u_t x^t=F⋅xˉt−1+B⋅ut
得到当前运动状态协方差:
P ^ t = F P ˉ t − 1 F T + Q t \hat{P}_t= \mathcal{F}\bar{P}_{t-1}\mathcal{F}^T+Q_t P^t=FPˉt−1FT+QtStep2:更新阶段
计算卡尔曼增益:
K t = P ^ t H T ( H P ^ t H T + R t ) − 1 \mathcal{K}_t=\hat{P}_t\mathcal{H}^T(\mathcal{H}\hat{P}_t\mathcal{H}^T+R_t)^{-1} Kt=P^tHT(HP^tHT+Rt)−1
得到卡尔曼最终估计结果:
x ˉ t = x ^ t + K t ( x ˙ t − H x ^ t ) \bar{x}_t=\hat{x}_t+\mathcal{K}_t(\dot{x}_t-\mathcal{H}\hat{x}_t) xˉt=x^t+Kt(x˙t−Hx^t)
更新卡尔曼最终估计结果协方差:
P ˉ t = P ^ t − K t H P ^ t \bar{P}_t=\hat{P}_t-\mathcal{K}_t\mathcal{H}\hat{P}_t Pˉt=P^t−KtHP^tStep3:结果返回
x ˉ t , P ˉ t \bar{x}_t,\bar{P}_t xˉt,Pˉt
#include
#include
cv::KalmanFilter kalmanfilter(2,2);
cv::Mat last_measurement(2,1,CV_32FC1);
cv::Mat current_measurement(2,1,CV_32FC1);
cv::Mat last_prediction(2,1,CV_32FC1);
cv::Mat current_prediction(2,1,CV_32FC1);
cv::Mat frame(800,800,CV_8UC3);
void onMouseMove(int event,int x,int y,int flag,void* data)
{
last_prediction = current_prediction;
last_measurement = current_measurement;
current_measurement.at<float>(0) = x;
current_measurement.at<float>(1) = y;
std::cout << current_measurement << std::endl;
kalmanfilter.correct(current_measurement);
current_prediction = kalmanfilter.predict();
//kalmanfilter.predict();
cv::line(frame,cv::Point(last_measurement.at<float>(0),last_measurement.at<float>(1)),cv::Point(current_measurement.at<float>(0),current_measurement.at<float>(1)),cv::Scalar(0,255,0),2);
cv::line(frame,cv::Point(last_prediction.at<float>(0),last_prediction.at<float>(1)),cv::Point(current_prediction.at<float>(0),current_prediction.at<float>(1)),cv::Scalar(0,0,255),2);
std::cout << "on mouse move:" << current_prediction <<std::endl;
}
int main(int argc,char** argv)
{
//cv::Mat frame(800,800,CV_8UC3);
cv::namedWindow("test");
cv::setMouseCallback("test",onMouseMove,NULL);
cv::Mat F(2,2,CV_32F,cv::Scalar(0));
//m.at(0,0) = 1;
//m.at(1,1) = 1;
cv::setIdentity(F,cv::Scalar(1));
cv::Mat H(2,2,CV_32F);
cv::setIdentity(H,cv::Scalar(1));
cv::Mat p(2,2,CV_32F);
cv::setIdentity(p,cv::Scalar(0.1));
kalmanfilter.measurementMatrix = H;
kalmanfilter.transitionMatrix = F;
kalmanfilter.processNoiseCov = p;
while (true)
{
cv::imshow("test",frame);
if (cv::waitKey(30) == 113)
break;
}
cv::destroyAllWindows();
return 0;
}
FK存在的问题:
在KF滤波器中所用的运动方程和测量方程都是线性函数,但是在一些非线性情况下,如转弯、控制信号周期变换等,上述的KF滤波器中的线性函数就变成了非线性存在,直接套用KF就会出现较大偏差。也就是上面提到的运动方程和观测方程变为了如下非线性函数组合的形式,对于运动方程:
x t = f ( x t − 1 , u t ) + ω t x_t=f(x_{t-1},u_t)+\omega_t xt=f(xt−1,ut)+ωt
EKF算法的思想便是对于非线性函数在某一点上进行泰勒展开,这样使用n阶多项式的形式逼近原来的函数,对于上述函数非线性函数 f ( x t − 1 , u t ) f(x_{t-1},u_t) f(xt−1,ut)在上一次卡尔曼滤波结果估计结果 x ˉ t − 1 \bar{x}_{t-1} xˉt−1处展开得到:
f ( x , u ) ∣ x = x ˉ t − 1 , u = u t = f ( x ˉ t − 1 , u t ) + ∂ f ∂ x ∣ x = x ˉ t − 1 , u = u t ( x − x ˉ t − 1 ) + ∂ f ∂ u ∣ x = x ˉ t − 1 , u = u t ( u − u t ) + O ( x − x ˉ t − 1 ) + O ( u − u t ) ≈ f ( x ˉ t − 1 , u t ) + ∂ f ∂ x ∣ x = x ˉ t − 1 , u = u t ( x − x ˉ t − 1 ) ≈ f ( x ˉ t − 1 , u t ) + F t ( x − x ˉ t − 1 ) \begin{align} f(x,u)|_{x=\bar{x}_{t-1},u=u_t}&=f(\bar{x}_{t-1},u_t)+\frac{\partial f}{\partial x}|_{x=\bar{x}_{t-1},u=u_t}(x-\bar{x}_{t-1})+\frac{\partial f}{\partial u}|_{x=\bar{x}_{t-1},u=u_t}(u-u_t)+\mathcal{O}(x-\bar{x}_{t-1}) + \mathcal{O}(u-u_t)\\ & \approx f(\bar{x}_{t-1},u_t)+\frac{\partial f}{\partial x}|_{x=\bar{x}_{t-1},u=u_t}(x-\bar{x}_{t-1})\\ & \approx f(\bar{x}_{t-1},u_t)+F_t(x-\bar{x}_{t-1}) \end{align} f(x,u)∣x=xˉt−1,u=ut=f(xˉt−1,ut)+∂x∂f∣x=xˉt−1,u=ut(x−xˉt−1)+∂u∂f∣x=xˉt−1,u=ut(u−ut)+O(x−xˉt−1)+O(u−ut)≈f(xˉt−1,ut)+∂x∂f∣x=xˉt−1,u=ut(x−xˉt−1)≈f(xˉt−1,ut)+Ft(x−xˉt−1)
其中, F t = ∂ f ∂ x ∣ x = x ˉ t − 1 , u = u t F_t=\frac{\partial f}{\partial x}|_{x=\bar{x}_{t-1},u=u_t} Ft=∂x∂f∣x=xˉt−1,u=ut。则近似得到在上一次卡尔曼估计结果 x ˉ t − 1 \bar{x}_{t-1} xˉt−1处的泰勒一阶逼近的运动方程:
x t ≈ f ( x ˉ t − 1 , u t ) + F t ( x − x ˉ t − 1 ) + ω t x_t\approx f(\bar{x}_{t-1},u_t)+F_t(x-\bar{x}_{t-1})+\omega_t xt≈f(xˉt−1,ut)+Ft(x−xˉt−1)+ωt
由之前的真值与预测值的协方差定义得到(其中 x ^ t = f ( x ˉ t − 1 , u t ) \hat{x}_t=f(\bar{x}_{t-1},u_t) x^t=f(xˉt−1,ut)):
P ^ t = E ( ( x t − x ^ t ) ( x t − x ^ t ) T ) = E ( ( F t ( x − x ˉ t − 1 ) + ω t ) ( F t ( x − x ˉ t − 1 ) + ω t ) T ) = F t P ˉ t − 1 F t T + Q t \begin{align} \hat{P}_t&=E((x_t-\hat{x}_t)(x_t-\hat{x}_t)^T)\\ &=E((F_t(x-\bar{x}_{t-1})+\omega_t)(F_t(x-\bar{x}_{t-1})+\omega_t)^T)\\ &=F_t\bar{P}_{t-1}F_t^T+Q_t \end{align} P^t=E((xt−x^t)(xt−x^t)T)=E((Ft(x−xˉt−1)+ωt)(Ft(x−xˉt−1)+ωt)T)=FtPˉt−1FtT+Qt
对应的非线性观测方程变为:
x ˙ t = g ( x t ) + v t \dot{x}_t=g(x_t)+v_t x˙t=g(xt)+vt
同样需要对 g ( x t ) g(x_t) g(xt)进行泰勒展开,展开的位置是 x ^ t \hat{x}_t x^t处(当前时刻预测结果):
g ( x ) ∣ x = x ^ t = g ( x ^ t ) + ∂ g ∂ x ∣ x = x ^ t ( x − x ^ t ) + O ( x − x ^ t ) ≈ g ( x ^ t ) + ∂ g ∂ x ∣ x = x ^ t ( x − x ^ t ) ≈ g ( x ^ t ) + G t ( x − x ^ t ) \begin{align} g(x)|_{x=\hat{x}_t}&=g(\hat{x}_t)+\frac{\partial g}{\partial x}|_{x=\hat{x}_t}(x-\hat{x}_t)+ \mathcal{O}(x-\hat{x}_t)\\ & \approx g(\hat{x}_t)+\frac{\partial g}{\partial x}|_{x=\hat{x}_t}(x-\hat{x}_t)\\ & \approx g(\hat{x}_t)+G_t(x-\hat{x}_t) \end{align} g(x)∣x=x^t=g(x^t)+∂x∂g∣x=x^t(x−x^t)+O(x−x^t)≈g(x^t)+∂x∂g∣x=x^t(x−x^t)≈g(x^t)+Gt(x−x^t)
其中, G t = ∂ g ∂ x ∣ x = x ^ t G_t=\frac{\partial g}{\partial x}|_{x=\hat{x}_t} Gt=∂x∂g∣x=x^t。则观测方程在当前时刻预测结果 x ^ t \hat{x}_t x^t处的泰勒一阶近似化结果为:
x ˙ t ≈ g ( x ^ t ) + G t ( x − x ^ t ) + v t \dot{x}_t \approx g(\hat{x}_t)+G_t(x-\hat{x}_t)+v_t x˙t≈g(x^t)+Gt(x−x^t)+vt
同样按照上一节中对于测量误差计算协方差:
P ˙ t = G t P ^ t G t T + R t \dot{P}_t=G_t\hat{P}_tG_t^T+R_t P˙t=GtP^tGtT+Rt
接下来就是需要计算在泰勒展开近似的情况下卡尔曼滤波算法的更新过程了,具体的推导过程和线性卡尔曼滤波算法的原理近似,主要的变化是运动转换矩阵和观测矩阵变化了: F → F t , H → G t \mathcal{F}\rightarrow F_t,\mathcal{H}\rightarrow G_t F→Ft,H→Gt。这里就直接给出其更新迭代的计算公式:
Step1:预测阶段
得到运动预测状态:
x ^ t = f ( x ˉ t − 1 , u t ) \hat{x}_t=f(\bar{x}_{t-1},u_t) x^t=f(xˉt−1,ut)
得到当前运动状态协方差:
P ^ t = F t P ˉ t − 1 F t T + Q t \hat{P}_t= F_t\bar{P}_{t-1}F_t^T+Q_t P^t=FtPˉt−1FtT+QtStep2:更新阶段
计算卡尔曼增益:
K t = P ^ t G t T ( G t P ^ t G t T + R t ) − 1 \mathcal{K}_t=\hat{P}_tG_t^T(G_t\hat{P}_tG_t^T+R_t)^{-1} Kt=P^tGtT(GtP^tGtT+Rt)−1
得到卡尔曼最终估计结果:
x ˉ t = x ^ t + K t ( x ˙ t − g ( x ^ t ) ) \bar{x}_t=\hat{x}_t+\mathcal{K}_t(\dot{x}_t-g(\hat{x}_t)) xˉt=x^t+Kt(x˙t−g(x^t))
更新卡尔曼最终估计结果协方差:
P ˉ t = P ^ t − K t G t P ^ t \bar{P}_t=\hat{P}_t-\mathcal{K}_tG_t\hat{P}_t Pˉt=P^t−KtGtP^tStep3:结果返回
x ˉ t , P ˉ t \bar{x}_t,\bar{P}_t xˉt,Pˉt
EKF存在的问题:
对于上一小结中提到的EKF问题,迭代扩展卡尔曼滤波算法(IEKF)能有效的改善,其基本的思想与残差逼近类似。IEKF会将上一步修正后的输出作为下一次迭代修正误差的输入值,通过不断迭代来修正误差减小误差,具体的IEKF算法的步骤可表达如下:
Step1:预测阶段
得到运动预测状态:
x ^ t = f ( x ˉ t − 1 , u t ) \hat{x}_t=f(\bar{x}_{t-1},u_t) x^t=f(xˉt−1,ut)
得到当前运动状态协方差:
P ^ t = F t P ˉ t − 1 F t T + Q t \hat{P}_t= F_t\bar{P}_{t-1}F_t^T+Q_t P^t=FtPˉt−1FtT+QtStep2:迭代更新阶段
令: x ^ t 0 = x ^ t , P ^ t 0 = P ^ t , G t 0 = G t \hat{x}_t^0=\hat{x}_t,\hat{P}_t^0=\hat{P}_t,G_t^0=G_t x^t0=x^t,P^t0=P^t,Gt0=Gt,之后迭代更新计算:
for i = 1 to N do : K t i = P ^ t i − 1 G t i − 1 T ( G t i − 1 P ^ t i − 1 G t i − 1 T + R t ) − 1 x ˉ t i = x ^ t i − 1 + K t ( x ˙ t − g ( x ^ t i − 1 ) ) P ˉ t i = P ^ t i − 1 − K t G t i − 1 P ^ t i − 1 \begin{align} \text{for $i$}&=\text{1 to $N$ do}:\\ \mathcal{K}_t^i&=\hat{P}_t^{i-1}{G_t^{i-1}}^T(G_t^{i-1}\hat{P}_t^{i-1}{G_t^{i-1}}^T+R_t)^{-1}\\ \bar{x}_t^i&=\hat{x}_t^{i-1}+\mathcal{K}_t(\dot{x}_t-g(\hat{x}_t^{i-1}))\\ \bar{P}_t^i&=\hat{P}_t^{i-1}-\mathcal{K}_tG_t^{i-1}\hat{P}_t^{i-1} \end{align} for iKtixˉtiPˉti=1 to N do:=P^ti−1Gti−1T(Gti−1P^ti−1Gti−1T+Rt)−1=x^ti−1+Kt(x˙t−g(x^ti−1))=P^ti−1−KtGti−1P^ti−1Step3:结果返回
x ˉ t i , P ˉ t i \bar{x}_t^i,\bar{P}_t^i xˉti,Pˉti
ref:迭代扩展卡尔曼滤波算法-IEKF
在UKF中不在某点处展开,而是通过采样的形式(称为sigma点)寻找一个与真实分布近似的高斯分布(这些采样点是通过权重组合的:样本点权重 w m i w_m^i wmi和 w c i w_c^i wci),其想法是近似非线性函数的概率分布要比近似非线性函数本身要容易,因而这里的先验假设还是没有摆脱高斯分布的影响。对于非线性系统的运动方程:
x t = f ( x t − 1 , u t ) + ω t x_t=f(x_{t-1},u_t)+\omega_t xt=f(xt−1,ut)+ωt
对应的观测方程:
x ˙ t = g ( x t ) + v t \dot{x}_t=g(x_t)+v_t x˙t=g(xt)+vt
给定上一时刻卡尔曼滤波算法输出结果: x ˉ t − 1 , P ˉ t − 1 \bar{x}_{t-1},\bar{P}_{t-1} xˉt−1,Pˉt−1,也就是上一轮迭代结果的均值方差。则按照UKF的算法原理,这里在上一轮迭代结果为高斯参数的指引下采样数目为 2 n + 1 2n+1 2n+1(其中 n n n为与 P ˉ t − 1 \bar{P}_{t-1} Pˉt−1维度相关的数)的采样,这里将这些采样点记为 x ^ t i \hat{x}_t^i x^ti:
x ^ t i = { x ˉ t − 1 , if i =1 x ˉ t − 1 + ( ( n + λ ) P ˉ t − 1 ) i , if n ∈ [ 2 , … , n + 1 ] x ˉ t − 1 − ( ( n + λ ) P ˉ t − 1 ) i − n , if n ∈ [ n + 2 , … , 2 n + 1 ] \hat{x}_t^i= \begin{cases} \bar{x}_{t-1}, & \text{if $i$ =1} \\ \bar{x}_{t-1}+(\sqrt{(n+\lambda)\bar{P}_{t-1}})_i, & \text{if $n\in[2,\dots,n+1]$}\\ \bar{x}_{t-1}-(\sqrt{(n+\lambda)\bar{P}_{t-1}})_{i-n}, & \text{if $n\in[n+2,\dots,2n+1]$} \end{cases} x^ti=⎩ ⎨ ⎧xˉt−1,xˉt−1+((n+λ)Pˉt−1)i,xˉt−1−((n+λ)Pˉt−1)i−n,if i =1if n∈[2,…,n+1]if n∈[n+2,…,2n+1]
其中, ( ( n + λ ) P ˉ t − 1 ) i − n (\sqrt{(n+\lambda)\bar{P}_{t-1}})_{i-n} ((n+λ)Pˉt−1)i−n中的 i − n i-n i−n代表矩阵 ( ( n + λ ) P ˉ t − 1 ) i − n (\sqrt{(n+\lambda)\bar{P}_{t-1}})_{i-n} ((n+λ)Pˉt−1)i−n的第 i − n i-n i−n列,矩阵开放可用采用Cholesky分解计算出 P ˉ t − 1 = L L T \bar{P}_{t-1}=LL^T Pˉt−1=LLT( L L L为三角矩阵)。 λ \lambda λ表示采样点距离均值多远,越远权重越小。该参数满足:
λ = α 2 ( n + k ) − n \lambda=\alpha^2(n+k)-n λ=α2(n+k)−n
完成上述采样过程基础上,同时在采样的过程中需要满足如下约束( w i w^i wi为采样权重):
∑ i = 1 2 n + 1 w i = 1 x ˉ t − 1 = ∑ i = 1 2 n + 1 w i x ^ t i P ˉ t − 1 = ∑ i = 1 2 n + 1 w i ( x ^ t i − x ˉ t − 1 ) ( x ^ t i − x ˉ t − 1 ) T \begin{matrix} \sum_{i=1}^{2n+1}w^i=1 \\ \bar{x}_{t-1}=\sum_{i=1}^{2n+1}w^i\hat{x}_t^i \\ \bar{P}_{t-1}=\sum_{i=1}^{2n+1}w^i(\hat{x}_t^i-\bar{x}_{t-1})(\hat{x}_t^i-\bar{x}_{t-1})^T \\ \end{matrix} ∑i=12n+1wi=1xˉt−1=∑i=12n+1wix^tiPˉt−1=∑i=12n+1wi(x^ti−xˉt−1)(x^ti−xˉt−1)T
具体对于上述权重 w m i w_m^i wmi其权重定义如下
w m i = { λ n + λ , if n =1 1 2 ( n + λ ) , if n ∈ [ 2 , … , 2 n + 1 ] w_m^i = \begin{cases} \frac{\lambda}{n+\lambda}, & \text{if $n$ =1} \\ \frac{1}{2(n+\lambda)}, & \text{if $n\in[2,\dots,2n+1]$} \end{cases} wmi={n+λλ,2(n+λ)1,if n =1if n∈[2,…,2n+1]
具体对于上述权重 w c i w_c^i wci其权重定义如下
w c i = { λ n + λ + 1 − α 2 + β , if n =1 1 2 ( n + λ ) , if n ∈ [ 2 , … , 2 n + 1 ] w_c^i = \begin{cases} \frac{\lambda}{n+\lambda}+1-\alpha^2+\beta, & \text{if $n$ =1} \\ \frac{1}{2(n+\lambda)}, & \text{if $n\in[2,\dots,2n+1]$} \end{cases} wci={n+λλ+1−α2+β,2(n+λ)1,if n =1if n∈[2,…,2n+1]
上述的过程都是在高斯分布的假设下实现的,则对于上述超参数取值建议为: β = 2 , α ∈ [ 0 , 1. ] , k = 3 − n \beta=2,\alpha\in[0,1.],k=3-n β=2,α∈[0,1.],k=3−n。则按照上述过程中的采样准则之后新分布下的运动状态表述为:
x ^ t = ∑ i = 1 2 n + 1 w m i x ^ t i \hat{x}_t=\sum_{i=1}^{2n+1}w_m^i\hat{x}_t^i x^t=i=1∑2n+1wmix^ti
对应的预测协方差矩阵描述为( R t R_t Rt项是为了模拟过程噪声):
P ^ t = ∑ i = 1 2 n + 1 w c i ( x ^ t i − x ^ t ) ( x ^ t i − x ^ t ) T + R t \hat{P}_t=\sum_{i=1}^{2n+1}w_c^i(\hat{x}_t^i-\hat{x}_t)(\hat{x}_t^i-\hat{x}_t)^T+R_t P^t=i=1∑2n+1wci(x^ti−x^t)(x^ti−x^t)T+Rt
同样对于观测方程,也可以使其在 ( x ^ t , P ^ t ) (\hat{x}_t,\hat{P}_t) (x^t,P^t)上进行采样对应高斯采样点,但是一般为了效率直接沿用了上面的采样结果,这样带来的问题便是精度不足了。则对应的观测方程的预测结果描述为:
x ˙ t ′ = ∑ i = 1 2 n + 1 w m i g ( x ^ t i ) \dot{x}_t^{'}=\sum_{i=1}^{2n+1}w_m^ig(\hat{x}_t^i) x˙t′=i=1∑2n+1wmig(x^ti)
对应的预测协方差矩阵描述为( Q t Q_t Qt项是为了模拟过程噪声):
P ˙ t = ∑ i = 1 2 n + 1 w c i ( g ( x ^ t i ) − x ˙ t ′ ) ( g ( x ^ t i ) − x ˙ t ′ ) T + Q t \dot{P}_t=\sum_{i=1}^{2n+1}w_c^i(g(\hat{x}_t^i)-\dot{x}_t^{'})(g(\hat{x}_t^i)-\dot{x}_t^{'})^T+Q_t P˙t=i=1∑2n+1wci(g(x^ti)−x˙t′)(g(x^ti)−x˙t′)T+Qt
回顾之前关于卡尔曼增益的迭代计算式子: K t = P ^ t H t T ( H t P ^ t H t T + R t ) − 1 \mathcal{K}_t=\hat{P}_t\mathcal{H}_t^T(\mathcal{H}_t\hat{P}_t\mathcal{H}_t^T+R_t)^{-1} Kt=P^tHtT(HtP^tHtT+Rt)−1,则上述观测协方差的计算过程不就正好与该式子中取逆部分对应:
P ˙ t ≈ H t P ^ t H t T + R t \dot{P}_t \approx \mathcal{H}_t\hat{P}_t\mathcal{H}_t^T+R_t P˙t≈HtP^tHtT+Rt
为了令式子简洁设:
P ^ t x ^ , x ˙ = P ^ t H t T \hat{P}_t^{\hat{x},\dot{x}}=\hat{P}_t\mathcal{H}_t^T P^tx^,x˙=P^tHtT
则增益矩阵便为:
K t = P ^ t x ^ , x ˙ ( P ˙ t ) − 1 \mathcal{K}_t=\hat{P}_t^{\hat{x},\dot{x}}(\dot{P}_t)^{-1} Kt=P^tx^,x˙(P˙t)−1
对于协方差更新:
P ˉ t = ( 1 − K t H t ) P ^ t = P ^ t − K t H t P ^ t = P ^ t − K t ( P ^ t x ^ , x ˙ ) T = P ^ t − K t ( P ^ t x ^ , x ˙ P ˙ t − 1 P ˙ t ) T = P ^ t − K t ( K t P ˙ t ) T = P ^ t − K t P ˙ t T K t T = P ^ t − K t P ˙ t K t T \begin{align} \bar{P}_t&=(1-\mathcal{K}_t\mathcal{H}_t)\hat{P}_t\\ &=\hat{P}_t-\mathcal{K}_t\mathcal{H}_t\hat{P}_t\\ &=\hat{P}_t-\mathcal{K}_t(\hat{P}_t^{\hat{x},\dot{x}})^T\\ &=\hat{P}_t-\mathcal{K}_t(\hat{P}_t^{\hat{x},\dot{x}}\dot{P}_t^{-1}\dot{P}_t)^T\\ &=\hat{P}_t-\mathcal{K}_t(\mathcal{K}_t\dot{P}_t)^T\\ &=\hat{P}_t-\mathcal{K}_t\dot{P}_t^T\mathcal{K}_t^T\\ &=\hat{P}_t-\mathcal{K}_t\dot{P}_t\mathcal{K}_t^T\\ \end{align} Pˉt=(1−KtHt)P^t=P^t−KtHtP^t=P^t−Kt(P^tx^,x˙)T=P^t−Kt(P^tx^,x˙P˙t−1P˙t)T=P^t−Kt(KtP˙t)T=P^t−KtP˙tTKtT=P^t−KtP˙tKtT
Step1:预测阶段
得到运动预测状态:
x ^ t = ∑ i = 1 2 n + 1 w m i x ^ t i \hat{x}_t=\sum_{i=1}^{2n+1}w_m^i\hat{x}_t^i x^t=i=1∑2n+1wmix^ti
得到当前运动状态协方差:
P ^ t = ∑ i = 1 2 n + 1 w c i ( x ^ t i − x ^ t ) ( x ^ t i − x ^ t ) T + R t \hat{P}_t=\sum_{i=1}^{2n+1}w_c^i(\hat{x}_t^i-\hat{x}_t)(\hat{x}_t^i-\hat{x}_t)^T+R_t P^t=i=1∑2n+1wci(x^ti−x^t)(x^ti−x^t)T+Rt
得到预测状态:
x ˙ t ′ = ∑ i = 1 2 n + 1 w m i g ( x ^ t i ) \dot{x}_t^{'}=\sum_{i=1}^{2n+1}w_m^ig(\hat{x}_t^i) x˙t′=i=1∑2n+1wmig(x^ti)
预测协方差矩阵描述为:
P ˙ t = ∑ i = 1 2 n + 1 w c i ( g ( x ^ t i ) − x ˙ t ′ ) ( g ( x ^ t i ) − x ˙ t ′ ) T + Q t \dot{P}_t=\sum_{i=1}^{2n+1}w_c^i(g(\hat{x}_t^i)-\dot{x}_t^{'})(g(\hat{x}_t^i)-\dot{x}_t^{'})^T+Q_t P˙t=i=1∑2n+1wci(g(x^ti)−x˙t′)(g(x^ti)−x˙t′)T+QtStep2:更新阶段
计算卡尔曼增益:
K t = P ^ t x ^ , x ˙ ( P ˙ t ) − 1 \mathcal{K}_t=\hat{P}_t^{\hat{x},\dot{x}}(\dot{P}_t)^{-1} Kt=P^tx^,x˙(P˙t)−1
得到卡尔曼最终估计结果:
x ˉ t = x ^ t + K t ( x ˙ t − x ˙ t ′ ) \bar{x}_t=\hat{x}_t+\mathcal{K}_t(\dot{x}_t-\dot{x}_t^{'}) xˉt=x^t+Kt(x˙t−x˙t′)
更新卡尔曼最终估计结果协方差:
P ˉ t = P ^ t − K t P ˙ t K t T \bar{P}_t=\hat{P}_t-\mathcal{K}_t\dot{P}_t\mathcal{K}_t^T Pˉt=P^t−KtP˙tKtTStep3:结果返回
x ˉ t , P ˉ t \bar{x}_t,\bar{P}_t xˉt,Pˉt