卡尔曼滤波,是最优估计理论中十分重要的一个部分。
要全面地理解卡尔曼滤波,你需要一点统计学的知识,以及一点矩阵理论。通常最优估计理论的教材是从最小二乘估计讲起,接着讲到最小方差估计,极大似然估计以及维纳滤波,再到卡尔曼滤波、扩展卡尔曼、无迹卡尔曼-------这是从统计的角度来理解卡尔曼滤波。
事实上,卡尔曼滤波与《自动控制原理》中的状态观测器非常相似。状态观测器利用原系统的输入输出来估计系统状态,对原系统建模(状态方程,输出方程),把观测器的输出与原系统输出的差乘上一个增益反馈给观测器的状态,这样构成一个闭环系统使得观测器状态跟踪原系统状态。卡尔曼滤波中,同样要对系统建模得到状态方程,输出方程则取决于你的测量手段,因此改称量测方程。卡尔曼同样要预测量测值,并把预测值与真实量测值比较,乘上一个增益返回给状态。不同之处在于,状态观测器不考虑噪声,要求系统可检测,并且增益通常是时不变的,而卡尔曼滤波则详细考虑了噪声和初始估计误差,智能的计算每一步的增益,以达到对状态的最优的估计。
实际工程常常面临这样的情况:变量XXX无法直接测量,能测量的是一些与XXX相关的量ZZZ,通常可以得到确定的函数关系:Z=H(X)Z=H(X)Z=H(X),例如要用mpu6050测量转动欧拉角(ψ,θ,γ)T(\psi, \theta,\gamma)^T(ψ,θ,γ)T,无法直接测量,但是加速度计的测量值与欧拉角有关系:
[axayaz]=[−gsinγcosθgsinθgcosγcosθ]\begin{bmatrix}a_x\\a_y\\a_z\end{bmatrix}=\begin{bmatrix}-g\sin\gamma \cos\theta\\g\sin\theta\\g\cos\gamma\cos\theta\end{bmatrix}
axayaz
=
−gsinγcosθgsinθgcosγcosθ
由测量值Z估计状态X,典型的方法–最小二乘估计,即对X的估计—X^\hat XX^应当使得E{
(Z−H(X^))(Z−H(X^))T}E\{(Z-H(\hat X))(Z-H(\hat X))^T\}E{(Z−H(X^))(Z−H(X^))T}最小。典型例子如用直尺测量一支笔的长度,多次测量取平均值就是一个最简单的最小二乘估计。
实际工程中,对状态XXX可以通过建模,给出XXX的动力学过程:X˙=f(X,t)\dot X=f(X,t)X˙=f(X,t),若能确定初始时刻的状态X0X_0X0,那么显然初始时刻以后的状态都可以确定,对状态XXX的确定就是一个微分方程求解的问题。然而实际系统f(X)f(X)f(X)多具有复杂的形式,给出XXX的解析解是一件困难甚至不可能的事。好在我们并不要求XXX绝对精确的值,只需要满足精度需求的值,那么我们可以依靠数值积分方法给出状态XXX的解,只要步长Δt\Delta tΔt取得足够小,龙格库塔法正是其中的一种典型方法。
XXX的动力学过程与对ZZZ的测量都包含有关于XXX的信息,卡尔曼滤波正是综合运用了这两种信息来给出状态x的最优估计。
卡尔曼滤波包含两个基本方程–状态方程和量测方程,这也是卡尔曼滤波最根本的地方,但凡要实现一个卡尔曼滤波器,只要写出状态方程和量测方程,剩下的就只是代公式了,如果连状态方程和测量方程都写不出来搞不清楚,那也别谈什么实现卡尔曼滤波器。
状态方程:Xk=Φk/k−1Xk−1+Γk−1Wk−1X_{k}=\Phi_{k/k-1}X_{k-1}+\Gamma_{k-1}W_{k-1}Xk=Φk/k−1Xk−1+Γk−1Wk−1
状态方程描述了状态XXX的动力学过程,Φk/k−1\Phi_{k/k-1}Φk/k−1是从k-1时刻到k时刻的状态转移矩阵,Γk−1\Gamma_{k-1}Γk−1是k-1时刻的噪声输入矩阵,Wk−1W_{k-1}Wk−1是k-1时刻的系统噪声。
量测方程:Zk=HkXk+VkZ_{k}=H_kX_k+V_kZk=HkXk+Vk
量测方程描述了状态与量测量的关系,VkV_kVk是k时刻的测量噪声。
上述两个方程是标准线性卡尔曼的基本方程,它要求两个方程是线性的,还要求系统噪声WWW和测量噪声VVV都是白噪声。
卡尔曼的推导过程需要较强的数学基础,这里不讨论,只说明卡尔曼的具体做法和物理意义。
卡尔曼要解决的问题:若在k-1时刻估计状态为X^k−1\hat X_{k-1}