【卡尔曼滤波到底是干什么的?】

电子专业 徐 自远 649℃

【卡尔曼滤波到底是干什么的?】

先看一个故事:

1960年,卡尔曼博士访问NASA的时候,首次提出了这套滤波体系,当时就震惊了NASA,于是他的这套理论也很快的被采用了,美国的标志性时间阿波罗登月任务,就是使用了这套崭新的估计理论,完美的登上了月球。

这套理论的厉害之处就不言而喻了。

卡尔曼滤波是干什么的?

可能对于大多数人接触卡尔曼滤波的时候,首先看到的是什么是状态方程和观测方程,研究的都是系统的能观性和能测性,可能对于学过现代控制系统的人可能不陌生。其它人可能就有点危险了。我励志做到大家都能看明白。

其实简单粗暴点,卡尔曼滤波就是帮助我们做测量的。有人可能有疑问了,不就是一个测量吗,还搞这么复杂干嘛,测长度,游标卡尺都可以测量0.001毫米了,几块钱的温度计就可以测量0.1度的温度了,够用了啊,还搞这些干啥呢,其实也的确如此,如果你要测量的东西没有什么随机干扰,那真的就不需要劳驾卡尔曼博士了。但是在实际的工程应用中,我们的测量因为随机干扰,无法准确得到,怎么办?卡尔曼先生就给我们想了个办法,让我们在干扰为高斯分布的情况下,得到的测量均方误差最小,也就是测量值扰动最小,看起来最平滑。这就厉害了。

在我们的生活中,对动态事物的感知不外乎有两种手段,一种是预测,一种是观测。

我们来看这样的一个例子:

假如我们今天要研究的对象是我们自己养的一只宠物狗,假如一周前这只宠物狗的体重是30斤,当然也不是一个精准值,有误差的。一个周过去了,今天我又想知道它的重量,我可以怎么办?

方法1:根据我养它的以前的体重增长经验推导出它的体重

方法2:直接使用称来称它的重量

但是现在称的也不能保证非常的精准,要是你的称的精度是0.0000001这个量级的,并且你的狗狗特别听话,在称的时候特别的安静,不乱动。还是那句话,那真的就不需要劳驾卡尔曼先生了。

假如根据我们的经验推算得到的体重是36斤,我们把这个量称为估计值。直接用称称得的体重为38斤,我们把这个量称为观察值。那么问题来了,我们使用哪个数据呢?

卡尔曼先生告诉了我们一个办法,这个办法其实也很简单,那就是加权平均,把称称出来的结果也就是观测值和按照经验估算出来的结果也就是估计值分别加一个权值,然后再做平均。当然这两个权值加起来是等于1的。也就是说如果你有0.6分相信称出来的体重,那么就只有0.4分相信自己估计的值了。说到这里貌似又出来了一个新问题?究竟该有多少相信自己推测的的,有多少相信自己称的呢?

别急,卡尔曼先生也体会到了你的烦恼,他告诉我们一个办法来决定这个权值,那就是根据以往的表现来做决定,你以前表现好,我就相信你多一点,权值也就给的高一点,以前表现不好,我就相信你少一点,权值自然给的低一点。那么什么是表现好表现不好呢,表现好意思就是测量结果稳定,方差很小,表现不好就是估计值或观测值不稳定,方差很大。想象你用称称的重量,第一次10斤第二次30斤,第三次5斤,你会相信你的称吗,我都不信。但是如果第一次29斤第二次30斤,第三次28斤,自然我就相信它多一点,给它一个大的权值了。其实就这么简单。

我希望有一种方法,可以同时结合这只狗一周前的体重、用经验公式估计的值和直接称量得到的值,综合考虑,得出一个最接近其真实体重的,误差最小的值。其实这就是卡尔曼滤波要完成的任务。

比如我们的观察值是Z,估计值是X, 那么新的估计值就应该是 Xnew = X + K ( Z-X),从这个公式可以看到,如果X估计小了,那么新的估计值会加上一个量K ( Z-X), 如果估计值大了,大过Z了,那么新的估计值就会减去一个量K ( Z-X),这就保证新的估计值一定比现在的准确,一次一次递归下去就会越来越准却了,当然这里面很有作用的也是这个K,也就是我们前面说的权值,书上都把他叫卡尔曼增益。(Xnew = X + K ( Z-X) = (1-K)X+ KZ ,也就是说估计值X的权值是1-k,而观察值Z的权值是k,究竟k 取多大,全看估计值和观察值以前的表现,也就是他们的方差情况了)

下面我们就用这两个值结合他们各自的噪声来估算实际值。

为了说的方便我们把周说成时刻啊,我的采样值其实就是1周。

假如我们要估算 k 时刻的是实际体重。首先你要根据 k-1 时刻的值,来预测 k 时刻的值。根据经验估计的结果是36斤,同时该值的高斯噪声的偏差是 5斤(5是这样得到的:如果 k-1 时刻 估算出的最优偏差是 3,你对自己预测的不确定度是 4 ,他们平方相加再开方, 就是 5)。直接用称称得的体重为38斤,误差3斤。 由于我们用于估算 k 时刻的实际体重有两个值,分别是 36和38。究竟实际是多少呢?相信自己推理出来的还是相信称得的结果呢?究竟相信谁多一点呢?我们可以用他们的协方差来判断。因为 Kg^2=5^2/(5^2+3^2),所以 Kg=0.85,我们可以估算出 k 时刻的实际值是:36+0.85* (38-36)=37.7。可以看出,因为用称称的协方差比较小,所以估算出的最终的体重更偏向用称称得值。

现在我们已经得到 k 时刻的最优体重值了,下一步就是要进入 k+1 时刻,进行新的最优估算。在进入 k+1 时刻之前, 我们还要算出 k 时刻那个最优值(37.7斤)的偏差。算法如下:((1-Kg)*5^2)^0.5=1.94。 这里的 5 就是上面的 k 时刻你预测的那个36斤的偏差,得出的1.94 就是进入 k+1 时刻以后 k 时刻估算出的最优的偏差(对应于上面的 3)。 就是这样,卡尔曼滤波器就不断的把协方差递归,从而估算出最优的值。他运行的很快,而且它只保留了上一时刻的数据,这对于计算机来说,这是非常方便的,并且还非常的节省内存。

后续我们看看卡尔曼滤波的C语言实现、在实际项目中的运用等。

http://m.toutiaocdn.com/group/6557662853476647438/?iid=33095443295&app=news_article&timestamp=1527115379&tt_from=android_share&utm_medium=toutiao_android&utm_campaign=client_share

转载请注明:徐自远的乱七八糟小站 » 【卡尔曼滤波到底是干什么的?】

喜欢 (0)

苏ICP备18041234号-1 bei_an 苏公网安备 32021402001397号