预估器
我们希望能够最大限度地使用測量结果来预计移动物体的运动。
所以,多个測量的累积能够让我们检測出不受噪声影响的部分观測轨迹。
一个关键的附加要素即此移动物体运动的模型。
有了这个模型,我们不仅能够知道该移动物体在什么位置,同一时候还能够知道我们观察支持模型的什么參数。
该任务分为两个阶段。在第一阶段,即预測阶段。用从过去得到的信息进一步修正模型以取得人或物体的下一个将对出现的位置。在第二阶段,即校正阶段,我们获得一个測量。然后与基于前一次測量的预測值(即模型)进行调整。完毕两个阶段预计任务的方法能够成为预估器。
关于Kalman滤波的通俗解释
在介绍Kalman滤波器原理之前,先从一个通俗的样例中了解一下该算法的功能和作用,以便更好的理解它。
下面是摘自网上的一段资料。
如果我们要研究的对象是一个房间的温度。依据你的经验推断,这个房间的温度是恒定的,也就是下一分钟的温度等于如今这一分钟的温度(如果我们用一分钟来做时间单位)。
如果你对你的经验不是100%的相信。可能会有上下偏差几度。
我们把这些偏差看成是高斯白噪声(White Gaussian Noise),也就是这些偏差跟前后时间是没有关系的并且符合高斯分布(Gaussian Distribution)。
另外,我们在房间里放一个温度计,可是这个温度计也不准确的,測量值会比实际值偏差。我们也把这些偏差看成是高斯白噪声。
好了。如今对于某一分钟我们有两个有关于该房间的温度值:你依据经验的预測值(系统的预測值)和温度计的值(測量值)。以下我们要用这两个值结合他们各自的噪声来估算出房间的实际温度值。
假如我们要估算k时刻的实际温度值。首先你要依据k-1时刻的温度值,来预測k时刻的温度。由于你相信温度是恒定的,所以你会得到k时刻的温度预測值是跟k-1时刻一样的,如果是23度。同一时候该值的高斯噪声的偏差是5度(5是这样得到的:如果k-1时刻估算出的最优温度值的偏差是3,你对自己预測的不确定度是4度,他们平方相加再开方,就是5)。然后。你从温度计那里得到了k时刻的温度值,如果是25度,同一时候该值的偏差是4度。
由于我们用于估算k时刻的实际温度有两个温度值,各自是23度和25度。到底实际温度是多少呢?相信自己还是相信温度计呢?到底相信谁多一点,我们能够用他们的covariance来推断。由于Kg=5^2/(5^2+4^2)。所以Kg=0.61,我们能够估算出k时刻的实际温度值是:23+0.61(25-23)=24.22度。能够看出。由于温度计的covariance比較小(比較相信温度计),所以估算出的最优温度值偏向温度计的值。
如今我们已经得到k时刻的最优温度值了,下一步就是要进入k+1时刻,进行新的最优估算。
到如今为止,好像还没看到什么自回归的东西出现。对了。在进入k+1时刻之前。我们还要算出k时刻那个最优值(24.22度)的偏差。算法例如以下:((1-Kg)5^2)^0.5=3.12。这里的5就是上面的k时刻你预測的那个23度温度值的偏差,得出的3.12就是进入k+1时刻以后k时刻估算出的最优温度值的偏差(相应于上面的3)。
就是这样,卡尔曼滤波器就不断的把covariance递归,从而估算出最优的温度值。
他执行的非常快,并且它仅仅保留了上一时刻的covariance。上面的Kg,就是卡尔曼增益(Kalman Gain)。他能够随不同的时刻而改变他自己的值,是不是非常奇妙!
Kalman滤波器简单介绍
Kalman(卡尔曼)滤波是一种高效率的递归滤波器(自回归滤波器), 它可以从一系列的不全然及包括噪声的測量中。预计动态系统的状态。
Kalman滤波的一个典型实例是从一组有限的。包括噪声的,对物体位置的观察序列(可能有偏差)预測出物体的位置的坐标及速度。
Kalman滤波器的基本思想是,若有一组强而合理(合理的意思是“限制很宽松使得这样的方法对真实世界中出现的相当多的实际问题都实用”)的如果。给出系统的历史測量值,则能够建立最大化这些早前測量值的后验概率的系统状态模型。
另外。无需存储非常长的早前測量历史。我们也能够最大化后验概率,即反复更新系统状态模型,并仅仅为下一次更新保存模型。
应用实例
一个简单的应用是预计物体的位置和速度。简要描写叙述例如以下:如果我们能够获取一个物体的包括噪声的一系列位置观測数据,我们能够获得此物体的精确速度和位置连续更新信息。
比如。对于雷达来说。我们关心的是跟踪目标,而目标的位置,速度,加速度的測量值是时刻含有误差的。卡尔曼滤波器利用目标的动态信息,去掉噪声影响。获取目标此刻好的位置预计(滤波)。将来位置预计(预測),也能够是过去位置预计的(插值或平滑)。
三个重要如果
Kalman滤波器须要三个重要如果:
- 被建模的系统是线性的
- 影响測量的噪声属于白噪声
- 噪声本质上是高斯分布的
第一条如果的意思是k时刻的系统状态能够用某个矩阵与k-1时刻的系统状态的乘积表示。余下两条如果,即如果噪声是高斯分布的白噪声。其含义为噪声与时间不相关,且仅仅用均值和协方差(噪声全然由一阶矩和二阶矩描写叙述)就能够准确地为幅值建模。
给定三条如果,Kalman滤波器是将从不同来源获取的数据或从统一来源不同一时候间获得的数据结合的最好的方法。从我们知道的信息開始。获取新的信息,然后依据对旧信息和新信息的确定程度。用新旧信息带权重的结合对我们知道的信息进行更新。
Kalman滤波器的数学知识
基本动态模型
卡尔曼滤波建立在线性代数和隐马尔可夫模型(hidden Markov model)上。其基本动态系统能够用一个马尔可夫链(Markov Chain)表示,该马尔可夫链建立在一个被高斯噪声(即正态分布的噪声)干扰的线性算子上的。系统的状态能够用一个元素为实数的向量表示。 随着离散时间的每个添加,这个线性算子就会作用在当前状态上,产生一个新的状态,并也会带入一些噪声,同一时候系统的一些已知的控制器的控制信息也会被添加。同一时候,还有一个受噪声干扰的线性算子产生出这些隐含状态的可见输出。
Kalman 滤波能够被看作为类似隐马尔科夫模型,它们的显著不同点在于:隐状态变量的取值空间是一个连续的空间。而离散状态空间则不是;另为,隐马尔科夫模型能够描写叙述下一个状态的一个随意分布,这也与应用于Kalman滤波器中的高斯噪声模型相反。
为了从一系列的噪声观測中。应用Kalman滤波预计观測过程的内部状态。
我们必须把这个过程在Kalman滤波器的框架下建立模型。 这就意味着。对于每一步k 我们要定义:
如果Kalman滤波器的k时刻的真实状态时从k-1时刻眼花而来,
满足X[k] = F[k]x[k-1]+B[k]u[k]+w[k]
- F[k]是作用在前一状态的状态转移模型(状态转移矩阵)
- B[k]是作用在控制向量u[k]上的控制输入模型(输入输出矩阵)。u[k]的作用是同意外部控制施加于系统
- w[k]是过程噪声,如果是均值为0的白噪声,协方差为Q[k],则w[k] ~ N(0,Q[k])
在k时刻,如果真实状态x[k]的观測,
Z[k]满足公式Z[k] = H[k]x[k]+v[k]
- H[k]是观測模型(观測矩阵),它把真实状态映射到观測空间
- v[k]是观測噪声。如果它是均值是0。方差是R[k]的高斯白噪声。v[k] ~ N(0,R[k])
模型图:
Kalman Filter基本动态系统模型如上图所看到的,当中,圆圈代表向量。方块代表矩阵,星号代表高斯噪声。其协方差在右下方标出。
- 初始状态以及每一时刻的噪声向量{x0, w1, ..., wk, v1 ... vk} 都为觉得是互相独立的。
- 实际中,真实世界中动态系统并非严格的符合此模型。可是Kalman模型是设计在噪声过程工作的,一个近似的符合已经能够使这个滤波器很实用。
三种运动
在Kalman滤波器应用中。我们将考虑三种运动。
动态运动
这样的运动时我们期望的前次測量时系统状态的直接结果。
控制运动
这样的运动是我们期望的,因为某种已知的外部因素以某种原因施加于系统。控制运动最普遍的一个样例是。当对我们施加了控制的系统预计其状态时,我们知道我们的控制会使系统产生什么样的执行。
随机运动
即便是最简单的一维情况。假设观測的目标有因任一原因而产生运动的可能性。那么就须要在预測阶段包括这样的随机运动。这样的随机运动影响的是简单地添加状态预计随时间的协方差。
公式
Kalman滤波器是一个递归的预计。即仅仅要获知上一时刻的状态预计和当前状态的观測就能够计算出当前状态的预计,不同于其它的预计技术。Kalman滤波器不须要观測或/和预计的历史记录,Kalman滤波器是一个纯粹的时域滤波器,而不像低通滤波器等频域滤波器那样,须要在频域中设计。然后转换到时域中应用。
Kalman 滤波包含两个阶段:预測和更新。在预计阶段。滤波器应用上一状态的预计做出对当前状态的预计。
在更新阶段。滤波器利用在当前状态的观測值优化预測阶段的预測值,以获的一个更精确的当前状态的预计。
预測
更新
基本概念图示
使用OpenCV中Kalman编程的主要步骤
步骤一
Kalman这个类须要初始化变量:
转移矩阵,測量矩阵,控制向量(没有的话,就是0),过程噪声协方差矩阵,測量噪声协方差矩阵,后验错误协方差矩阵,前一状态校正后的值,当前观察值。
void KalmanFilter::init(int dynamParams, int measureParams, int controlParams=0, int type=CV_32F)
//Parameters:
//dynamParams – Dimensionality of the state.
//measureParams – Dimensionality of the measurement.
//controlParams – Dimensionality of the control vector.
//type – Type of the created matrices that should be CV_32F or CV_64F.
步骤二
调用kalman这个类的predict方法得到状态的预測值矩阵
预測状态的计算公式例如以下:
predicted state (x'(k)): x'(k)=A x(k-1)+B u(k)
当中x(k-1)为前一状态的校正值,第一个循环中在初始化过程中已经给定了,后面的循环中Kalman这个类内部会计算。A,B,u(k),也都是给定了的值。这样进过计算就得到了系统状态的预測值x'(k)了。
const Mat& KalmanFilter::predict(const Mat& control=Mat())
//Parameters: control – The optional input control
步骤三:
调用kalman这个类的correct方法得到增加观察值校正后的状态变量值矩阵
其公式为:
corrected state (x(k)): x(k)=x'(k)+K(k) (z(k)-H x'(k))
当中x'(k)为步骤二算出的结果。z(k)为当前測量值,是我们外部測量后输入的向量。
H为Kalman类初始化给定的測量矩阵。K(k)为Kalman增益,其计算公式为:
Kalman gain matrix (K(k)): K(k)=P'(k) Ht inv(H P'(k) Ht+R)
计算该增益所依赖的变量要么初始化中给定,要么在kalman理论中通过其他公式能够计算。
const Mat& KalmanFilter::correct(const Mat& measurement)
//Parameters: measurement – The measured system parameters
经过步骤三后。我们又又一次获得了这一时刻的校正值,后面就不断循环步骤二和步骤三就可以完毕Kalman滤波过程。
參考资料
1、学习OpenCV 中文版
2、学习OpenCV——Kalman滤波
转载请注明作者Jason Ding及其出处
Github主页(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)