滤波
为什么叫做滤波?
滤波一词来源于通信理论,它是从含有干扰的接收信号中提取有用信号的一种技术。“接收信号”相当于被观测的随机过程,“有用信号”相当于被估计的随机过程。
来自百度百科。
这个说法确实很形象,将有用的信息从一堆混在的信号中提取出来。
我们的现实世界确实充满着不确定性,没人能精准、完全的描述某种状态。对于想让机器智能的完成人类的任务的设计者来说,要重视这种不确定性,正面不确定性,并且能量化不确定性,能抓住主要矛盾,从而更精确的还原环境和自身的状态。
不确定性包含很多,如所处环境的不确定性,你不确定什么时候会冒出一个人,不确定路上是否有坑;传感器在测量的时候,由于自己的物理极限,也同样有局限,如观察不全面,观察有误差,比如摄像头,观察不了后面的,观察的东西有畸变,观察的分辨率有限等;控制机构也存在不确定性,如磨损造成的不精密,打滑等等;还有模型的不确定性,我们用于计算的物理模型,比真实的简陋,有些元素未被考虑,导致出现偏差。
我们要让机器在这么多不确定性中,可靠的完成任务,需要严谨的数学知识,来可靠的描述这种不确定性到底有多大,找到方法,来获得背后隐藏的真实状态。
在描述这些不确定性,概率、统计相关的知识就很重要了。
这下面的滤波知识,是按照《概率机器人》的顺序描述的,不是完全搬运,是自己的理解的记录。
http://www.probabilistic-robotics.org/
基本概念
状态
状态转移概率
测量概率
置信度
贝叶斯滤波
是一种递归的滤波方法:当前时刻的状态,由上一时刻的状态,结合当前的控制动作,可以推算出来一个先验的分布(因为有不确定性,所以是一个分布,而不是确切的某个量);而当前的测量仪器会给出当前观测的数据,利用这个观测的数据,来修正上面预测的分布。如此循环,一直递归下去。
上面的两个阶段,一个叫做预测,另一个叫做测量更新。其本质上是这两个数据的加权和得到最终的分布。
公式上描述是:
预测的依据是什么?
上面的p(
x
t
x_t
xt|
u
t
u_t
ut,
x
t
−
1
x_{t-1}
xt−1) 怎么解析?为什么要用条件概率来乘?
从最简单的例子来看:一个机器人沿着直线行走,其状态就是一个位置
p
x
p_x
px,如果施加一个推力,就有90%的可能向前走1m,5%的概率,向后走1米(很诡异),5%的概率不动。如果不施加任何力量,则95%不动,5%向前0.2m,5%向后0.2m。
现在,假设机器人的位置
p
x
p_x
px=3,这个是量出来的精确的值。此时推了它一把,现在机器人在哪里?
很明显,大家不会说它一定在
p
x
p_x
px=4,而是会说,它90%的可能性是在4,还有5%的可能性在3.8m,还有5%的可能性是在3m处没变。
这个就是p(
x
t
x_t
xt|
u
t
u_t
ut,
x
t
−
1
x_{t-1}
xt−1)的具体表现,数学上是这样:
p(
x
t
x_t
xt=3|
u
t
u_t
ut=push,
x
t
−
1
x_{t-1}
xt−1=3)=5%
p(
x
t
x_t
xt=3.8|
u
t
u_t
ut=push,
x
t
−
1
x_{t-1}
xt−1=3)=5%
p(
x
t
x_t
xt=4|
u
t
u_t
ut=push,
x
t
−
1
x_{t-1}
xt−1=3)=90%
所以预测的依据就是我们的状态转移的规律,也就是p(
x
t
x_t
xt|
u
t
u_t
ut,
x
t
−
1
x_{t-1}
xt−1) 这个状态转移概率。为何说概率,是因为不是一定确定性的转移到某种状态,而是有可能转移到不同状态,转到不同状态的概率不同,这个不同,就来自于我们的状态转移规律。
这个规律怎么来的?这个规律就是我们的运动方程,是我们已经研究清楚的某种运动规律。后面还会有专门的介绍运动模型的内容。
我们再看看上面的公式:
∫
\int
∫p(
x
t
x_t
xt|
u
t
u_t
ut,
x
t
−
1
x_{t-1}
xt−1)d
x
t
−
1
x_{t-1}
xt−1,这个意思是,将所有的
x
t
−
1
x_{t-1}
xt−1的状态都进行转移,然后累计。
比如,上面的
p
x
t
−
1
px_{t-1}
pxt−1并不是精确的等于3,而是一个分布,比如说:
p
x
t
−
1
px_{t-1}
pxt−1有90%的概率是3,5%的概率是2,5%的概率是4,这时候,我们再来计算一下,展开那个积分号(其实不严谨,这个例子是离散的
∑
\sum
∑,但积分号本身就是sum的首字母的变体,本质就是求和)。
p(
x
t
x_t
xt=3|
u
t
u_t
ut=push,
x
t
−
1
x_{t-1}
xt−1=3)
=p(
x
t
x_t
xt=3|
u
t
u_t
ut=push,
x
t
−
1
x_{t-1}
xt−1=3)*p(
x
t
−
1
x_{t-1}
xt−1=3)
+p(
x
t
x_t
xt=3|
u
t
u_t
ut=push,
x
t
−
1
x_{t-1}
xt−1=2)*p(
x
t
−
1
x_{t-1}
xt−1=2)
+p(
x
t
x_t
xt=3|
u
t
u_t
ut=push,
x
t
−
1
x_{t-1}
xt−1=4)*p(
x
t
−
1
x_{t-1}
xt−1=4)
=5%*90% (在3m处的概率,乘上推了不动的概率)
+90%*5%
+5%*5%
=9.25%
其他的t时刻的状态计算也如上所示。
上面举的例子是离散的,但实际上,我们的很多状态分布是连续的,就以上面的例子来说,位置可以取机器人所在的一维空间的任意地点的数值,实际上也是连续的。
不管离散还是连续的,求和的本质不变,贝叶斯全概率的公式不变,基本的逻辑不变。
说完了预测,那更新又是什么情况 ?
地一个问题就是:p(
z
t
z_t
zt|
x
t
x_t
xt)这个怎么来的?
这个其实就是我们的观测模型了,描述了如何从状态得到观测值的。注意,这里同样也是概率分布,是因为,真实的状态对我们是不可知的,我们所做的也只是尽量逼近真实状态而已。所以,对于某个真实状态,我们可能会观测到不同的观测值。比如,假设给了上面的机器人一个激光测距仪,让它自己测量到零点的距离。本来真实距离是1m的,由于上面说的不确定性中传感器的局限,可能会测出0.9m,0.8m,1m,1.1m,1.2m等等,所以,由真实值获取的测量值,也是一个分布,如:
p(z=0.9|x=1)=0.9
p(z=0.8|x=1)=0.1
…
p(z=1.2|x=1)=0.1
这个和时间一般没有关系,所以去掉了t。
在量程范围内,和具体的距离也没有关系,分布会呈现均值为真值,方差在一定范围内的情况。
所以,p( z t z_t zt| x t x_t xt) 这个是我们的先验来的,是我们预先知道的,如果用了某个厂家的设备,一般会标注出来方差。
高斯滤波
为什么叫做高斯滤波?
因为假设状态分布都是高斯分布的,单峰值的,符合我们对世界的认知。比如,当前在哪里,真值肯定只有一个,这个就是峰值,也是均值所在。
但是计算过程是否一定就是符合这种单峰的分布,却不一定。因为当你在一个完全对称的走廊的时候,你看到一扇门,你是完全估计不出来你在哪里的,这时候,就是大部分的概率平均分布在有门的地方,就不止一个峰了。(少部分在没门的地方,因为可能会看错)。
卡尔曼滤波
卡尔曼滤波,思想跟上面的贝叶斯滤波是一样的,用状态转移概率来预测,用观测数据来更新。