粒子滤波
来源:互联网 发布:mac如何关掉dashboard 编辑:程序博客网 时间:2024/04/27 17:04
之前一直在做移动机器人定位算法。查来查去,发觉粒子滤波算法(又叫MC算法)应该算是最流行的了。因此开始学习使用之。入手的是本英文书叫 “probalistic robotic” 很不错,我所见到的讲得最好的一本书。花了大量时间去研读。在这里我想谈谈我对粒子滤波的一点认识。因为在这一领域算是个新手。希望有前辈或者达人来指正 我的想法。也希望我的这篇文章对新手有理解他有所帮助(当初我就很是苦于它难于理解)在这里我不想谈粒子滤波的理论基础和推到,这点大家可以去自己翻书。 我只谈下我的体会。
粒子滤波算法。他源于Montecarlo的思想,即以某事件出现的频率来指代该事件的概率。因此在滤波过程中,需要用到概率如P(x)的地方,一 概对变量x采样,以大量采样的分布近似来表示P(x)。因此,采用此一思想,在滤波过程中粒子滤波可以处理任意形式的概率,而不像Kalman滤波只能处 理高斯分布的概率问题。他的一大优势也在于此。
再来看对任意如下的状态方程
x(t)=f(x(t-1),u(t),w(t))
y(t)=h(x(t),e(t))
其中的x(t)为t时刻状态,u(t)为控制量,w(t) 和e(t)分别为模型噪声和,观测噪声。前一个当然是状态转移方程,后一个是观测方程。那么对于这么一个问题粒子滤波怎么来从观测y(t),和x(t-1),u(t) 滤出真实状态x(t)呢?
看看滤波的预估阶段:粒子滤波首先根据x(t-1) 和他的概率分布生成大量的采样,这些采样就称之为粒子。那么这些采样在状态空间中的分布实际上就是x(t-1) 的概率分布了。好,接下来依据状态转移方程加上控制量可以对每一粒子得到一个预测粒子。所有的预测粒子就代表了涉及哪些参数化的东西)。
进入校正阶段来:有了预测粒子,当然不是所有的预测粒子都能得到我们的时间观测值y对不,越是接近真实状态的粒子,当然获得越有可能获得观测值y对吧。于是我们对所有的粒子得有个评价了,这个评价就是一个条件概率P(y|xi ),直白的说,这个条件概率代表了假设真实状态x(t)取第i个粒子xi 时获得观测y的概率。令这个条件概率为第i个粒子的权重。如此这般下来,对所有粒子都进行这么一个评价,那么越有可能获得观测y的粒子,当然获得的权重越高。好了预测信息融合在粒子的分布中,观测信息又融合在了每一粒子的权重中。
哈哈最后采用重采样算法(不知道什么是重采样算法,那就只好翻书去吧),去除低权值的粒子,复制高权值的粒子。所得到的当然就是我们说需要的真实状态x(t)了,而这些重采样后的粒子,就代表了真实状态的概率分布了。
下一轮滤波,再将重采样过后的粒子集输入到状态转移方程中,直接就能够获得预测粒子了。。
初始状态的问题: 咱们一开始对x(0)一无所知对吧,那咱们就认为x(0)在全状态空间内平均分布呗。于是初始的采样就平均分布在整个状态空间中。然后将所有采样输入状态 转移方程,得到预测粒子。嘿嘿再评价下所有预测粒子的权重,当然我们在整个状态空间中只有部分粒子能够获的高权值咯。马上重采样算法来了,去除低权值的, 将下一轮滤波的考虑重点立马缩小到了高权值粒子附近。哈哈就这么简单。也很实用。
明白了没?没看糊涂吧哈哈。
如果大家看得还不过瘾,后面有根据精彩的论述。
另外lishuai在文中也提到Particle filter的以下特点:
如果跟kalman滤波相比,那确实。毕竟kalman滤波可以直接得到状态的解析估计,计算量很小。如果跟Markov定位相比,恰恰与 ricky所说相反,粒子滤波计算量小很多,而事实上,粒子滤波被用于定位的背景就是为了降低普通的Markov定位计算量相当大并且随着维数的增长计算 量迅速增长的缺陷。(Sebastian Thrun, Wolfram burgard, Dieter fox等在90年代做的一个图书馆机器人导航的项目,其中很多当时他们的工作都成了现今机器人研究领域的热点,比如粒子滤波,SLAM等)。
好,现在就一一谈一下我的看法
1. Kalman滤波或者EKF都可以做定位并且运算量小,为什么还要用什么Markov定位呢?
2. 为什么Markov定位计算量大并且随着空间维数的增长而增长剧烈?
3.为什么粒子滤波这么神奇,让计算量如此之大的Markov定位运算量骤降?
4.到底粒子滤波实质是什么?
总结一下,粒子滤波就是一种基于动态系统前向模型利用奖惩机制估计状态值的一种方法。
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 粒子滤波
- 黑马程序员------反射
- 打印大X
- MyEclipse10安装SVN插件
- awk处理多行记录
- sqlserver中如何在两个数据库之间复制表
- 粒子滤波
- 数据段和只读数据段
- 拓扑排序(基于邻接表实现)
- MyEclipse10安装SVN插件
- 在Java中如何把char数组转换为字符串
- Rust中文翻译5
- Linux下面查看python帮助文档
- ndroid.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment benguo.simphon
- Teamcenter Organization