10 概率机器人 Probabilistic Robotics 粒子滤波

本文介绍了概率机器人中的粒子滤波方法,首先阐述了概率分布的两种描述方式,然后讲解了非线性贝叶斯滤波的基础,包括系统方程和预测更新过程。接着,引入了蒙特卡洛积分、重要性采样以及序列化重要性采样(SIS),讨论了如何确定采样点位置和权重。接着,文章详细探讨了Condensation Filter,分析了其最优解和次优解。最后,解释了重采样在避免粒子退化中的作用,以及粒子滤波的完整算法流程。
摘要由CSDN通过智能技术生成

1 前言

  • 在介绍粒子滤波之前大家要知道一个重要观念:一个概率分布可以如何描述?

    1. 可以通过概率密度函数(pdf)函数,表示某一区间的概率就是概率密度函数在这一区间的积分
    2. 还可以通过离散的点的位置和权重,表示某一区间的概率就是这一区间上点的位置与权重加权平均和
  • 用概率密度函数(pdf)函数表示一个分布: 高斯分布 N ( 0 , 4 ) N(0, 4) N(0,4), 求这个分布在 [ 0 , 4 ] [0,4] [0,4]上的概率:
    p ( x ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 = 1 2 2 π e − x 2 8 ↓ p 0 : 4 = ∫ 0 4 p ( x ) d x = ∫ 0 4 1 2 2 π e − x 2 8 d x ≈ 0.48 \begin{aligned} p(x) &= \frac{1}{\sigma\sqrt{2 \pi }} e^{\frac{-(x - \mu)^2}{2\sigma^2}}\\ & = \frac{1}{2\sqrt{2 \pi}} e^{\frac{-x^2}{8}}\\ \end{aligned}\\ \downarrow\\ p_{0:4} = \int_0^4 p(x) dx = \int_0^4 \frac{1}{2\sqrt{2 \pi}} e^{\frac{-x^2}{8}} dx \approx 0.48 p(x)=σ2π 1e2σ2(xμ)2=22π 1e8x2p0:4=04p(x)dx=0422π 1e8x2dx0.48
    在这里插入图片描述

  • 用离散的点的位置和权重表示一个分布: 高斯分布 N ( 0 , 4 ) N(0, 4) N(0,4), 求这个分布在 [ 0 , 4 ] [0,4] [0,4]上的概率:
    散点的位置: x k = − 7.0 , − 6.9 , − 6.8 , ⋯   , 0 , 0.1 , 0.2 , ⋯   , 6.8 , 6.9 , 7.0 散点的权重: ω k = p ( x k ) = 1 2 2 π e − x k 2 8 = ⋯ ↓ p 0 : 4 = 4 n ∑ x k = 0 4 w k = 4 40 ∑ x k = 0 4 w k = 0.49 \text{散点的位置:}x_k = -7.0, -6.9, -6.8, \cdots, 0, 0.1, 0.2, \cdots,6.8, 6.9, 7.0\\ \text{散点的权重:} \omega_k = p(x_k) = \frac{1}{2\sqrt{2 \pi}} e^{\frac{-x_k^2}{8}} = \cdots\\ \downarrow\\ p_{0:4} = \frac{4}{n}\sum_{x_k=0}^4 w_k = \frac{4}{40}\sum_{x_k=0}^4 w_k = 0.49 散点的位置:xk=7.0,6.9,6.8,,0,0.1,0.2,,6.8,6.9,7.0散点的权重:ωk=p(xk)=22π 1e8xk2=p0:4=n4xk=04wk=404xk=04wk=0.49
    在这里插入图片描述

  • 大家比较一下一个是积分计算,一个是权重求和,但是都以得出近似的结果,而且上述散点越多,结果与积分的误差越小

  • 这里透露一下,上述的散点其实就是粒子滤波的粒子

  • 再说一下,介绍上面的内容是为了说明离散的粒子的位置+权重可以表示一个概率密度函数,需要强调的是一个位置有1个粒子,权重为0.5;与一个相同位置有2个粒子,权重均为0.25;这两种情况对于计算概率和分析来说是等价的,这就是粒子滤波中重采样的思想

  • 下面说一下本片博客的介绍流程:

    • 因为任何滤波都是基于贝叶斯滤波的,所以先介绍非线性贝叶斯滤波
    • 但是非线性贝叶斯滤波需要计算积分,有些积分函数是不存在的,所以介绍一种数值积分方法:蒙特卡洛积分
    • 当原函数未知的时候,利用蒙特卡洛积分也无法计算积分,那么就引出重要性采样:即利用与原函数类似的分布代替原函数。
    • 但是重要性采样面临一个问题如何确定粒子的位置和粒子的权重?这就引出序列化重要性采样
    • 有了序列化重要性采样其实就有了粒子滤波的雏形
    • 但是在实施的过程中存在粒子退化的现象,那么就引出重采样
    • 其实粒子滤波 = 序列化重要性采样 + 重采样
    • 这时仅有一个问题没有解决:与原函数类似的分布怎么确定?为了解决这个问题,就有了Condensation Filter,它是序列化重要性采样的一种方法。
    • 最后用Condensation Filter代替序列化重要性采样就有了粒子滤波 = Condensation Filter + 重采样

2 非线性贝叶斯滤波

  • 说到贝叶斯滤波前面已经介绍过:
    • 详细推导和讲解过程见:贝叶斯滤
    • 这里简单介绍一下主要部分
  • 贝叶斯滤波的思想是:基于测量信号 z 1 : k z_{1:k} z1:k,评估 x k x_k xk
    • 也就是计算置信度(条件概率): p ( x k ∣ z 1 : k ) p(x_k | z_{1:k}) p(xkz1:k)
    • 类似数学归纳法:
      • 初始时刻: p ( x 0 ∣ z 0 ) = p ( x 0 ) p(x_0 | z_{0}) = p(x_0) p(x0z0)=p(x0)已知
      • 已知后验概率: p ( x k − 1 ∣ z 1 : k − 1 ) p(x_{k-1}|z_{1:k-1}) p(xk1z1:k1)
      • 计算后验概率: p ( x k ∣ z 1 : k ) p(x_{k}|z_{1:k}) p(xkz1:k)
  • 在进行贝叶斯滤波前需要知道系统方程和预测方程:
    系统方程: x k = g k ( x k − 1 , ϵ k − 1 ) ( ϵ k − 1 : 系统噪声 ) 测量方程: z k = h k ( x k , δ k ) ( δ k : 测量噪声 ) \text{系统方程:} x_k = g_k(x_{k-1}, \epsilon_{k-1}) \qquad (\epsilon_{k-1}: \text{系统噪声})\\ \text{测量方程:}z_k = h_k(x_k, \delta_k) \qquad (\delta_k: \text{测量噪声}) 系统方程:xk=gk(xk1,ϵk1)(ϵk1:系统噪声)测量方程:zk=hk(xk,δk)(δk:测量噪声)
  • 滤波主要分为两个步骤:
    • 已知后验概率: p ( x k − 1 ∣ z 1 : k − 1 ) p(x_{k-1}|z_{1:k-1}) p(xk1z1:k1)
    • 根据系统方程进行预测:计算 p ( x k ∣ z 1 : k − 1 ) p(x_{k}|z_{1:k-1}) p(xkz1:k1)
    • 根据测量方程进行更新:计算 p ( x k ∣ z 1 : k ) p(x_{k}|z_{1:k}) p(xkz1:k)
  • 那么具体怎么预测和更新呢?
    • 预测计算
      p ( x k ) = ∫ p ( x k , x k − 1 ) d x k − 1 = ∫ p ( x k ∣ x k − 1 ) p ( x k − 1 ) d x k − 1 ↓ p ( x k ∣ z 1 : k − 1 ) = ∫ p ( x k ∣ x k − 1 , z 1 : k − 1 ) p ( x k − 1 ∣ z 1 : k − 1 ) d x k − 1 ↓ p ( x k ∣ x k − 1 , z 1 : k − 1 ) = p ( x k ∣ x k − 1 ) = ∫ p ( x k ∣ x k − 1 ) p ( x k − 1 ∣ z 1 : k − 1 ) d x k − 1 \begin{aligned} p(x_k) &= \int p(x_k, x_{k-1})dx_{k-1}\\ &= \int p(x_k|x_{k-1})p(x_{k-1})dx_{k-1} \end{aligned}\\ \downarrow\\ \begin{aligned} p(x_k|z_{1:k-1}) &= \int p(x_k|x_{k-1},z_{1:k-1})p(x_{k-1}|z_{1:k-1})dx_{k-1}\\ &\downarrow p(x_k|x_{k-1},z_{1:k-1})=p(x_k|x_{k-1})\\ &= \int p(x_k|x_{k-1})p(x_{k-1}|z_{1:k-1})dx_{k-1}\\ \end{aligned} p(xk)=p(xk,xk1)dxk1=p(xkxk1)p(xk1)dxk1p(xkz1:k1)=p(xkxk1,z1:k1)p(xk1z1:k1)dxk1p(xkxk1,z1:k1)=p(xkxk1)=p(xkxk1)p(xk1z1:k1)dxk1
    • 更新计算
      p ( x k ∣ z 1 : k ) = p ( x k ∣ z k , z 1 : k − 1 ) = p ( z k ∣ x k , z 1 : k − 1 ) p ( x k ∣ z 1 : k − 1 ) p ( z k ∣ z 1 : k − 1 ) = p ( z k ∣ x k ) p ( x k ∣ z 1 : k − 1 ) p ( z k ∣ z 1 : k − 1 ) 分子为归一化常数: p ( z k ∣ z 1 : k − 1 ) = ∫ p ( z k ∣ x k , z 1 : k − 1 ) p ( x k ∣ z 1 : k − 1 ) d x k = ∫ p ( z k ∣ x k ) p ( x k ∣ z 1 : k − 1 ) d x k \begin{aligned} p(x_k|z_{1:k}) &= p(x_k|z_k,z_{1:k-1})\\ &= \frac{p(z_k|x_k,z_{1:k-1})p(x_k|z_{1:k-1})}{p(z_k|z_{1:k-1})}\\ &= \frac{p(z_k|x_k)p(x_k|z_{1:k-1})}{p(z_k|z_{1:k-1})}\\ \end{aligned}\\ \text{分子为归一化常数:} \begin{aligned} p(z_k|z_{1:k-1}) &= \int p(z_k|x_k,z_{1:k-1}) p(x_k|z_{1:k-1}) d x_k\\ &= \int p(z_k|x_k) p(x_k|z_{1:k-1}) d x_k \end{aligned} p(xkz1:k)=p(xkzk,z1:k1)=p(zkz1:k1)p(zkxk,z1:k1)p(xkz1:k1)=p(zkz1:k1)p(zkxk)p(xkz1:k1)分子为归一化常数:p(zkz1:k1)=p(zkxk,z1:k1)p(xkz1:k1)dxk=p(zkxk)p(xkz1:k1)dxk
    • 总结
      预测: p ( x k ∣ z 1 : k − 1 ) = ∫ p ( x k ∣ x k − 1 ) p ( x k − 1 ∣ z 1 : k − 1 ) d x k − 1 更新: p ( x k ∣ z 1 : k ) = p ( z k ∣ x k ) p ( x k ∣ z 1 : k − 1 ) p ( z k ∣ z 1 : k − 1 ) p ( z k ∣ z 1 : k − 1 ) = ∫ p ( z k ∣ x k ) p ( x k ∣ z 1 : k − 1 ) d x k \text{预测:}p(x_k|z_{1:k-1}) = \int p(x_k|x_{k-1})p(x_{k-1}|z_{1:k-1})dx_{k-1}\\ \text{更新:} \qquad p(x_k|z_{1:k}) = \frac{p(z_k|x_k)p(x_k|z_{1:k-1})}{p(z_k|z_{1:k-1})}\\ p(z_k|z_{1:k-1}) = \int p(z_k|x_k) p(x_k|z_{1:k-1}) d x_k 预测:p(xkz1:k1)=p(xkxk1)p(xk1z1:k1)dxk1更新:p(xkz1:k)=p(zkz1:k1)p(zkxk)p(xkz1:k1)p(zkz1:k1)=p(zkxk)p(xkz1:k1)dxk
  • 上述计算概率需要积分计算,那么有些函数是很难积分的,所以下面介绍一种数值积分方法

3 蒙特卡洛积分

  • 求函数 f ( x ) f(x) f(x)在区间 [ a , b ] [a,b] [a,b]上的积分 ∫ a b f ( x ) d x \int_a^b f(x) dx abf(x)dx
    • 如果函数 f ( x ) f(x) f(x)的解析积分形式很容易求得,那么积分 ∫ a b f ( x ) d x \int_a^b f(x) dx abf(x)dx很简单
    • 如果函数 f ( x ) f(x) f(x)的解析积分形式很难计算,那么积分 ∫ a b f ( x ) d x \int_a^b f(x) dx abf(x)dx怎么算呢?
      • 方法是我们在区间 [ a , b ] [a,b] [a,b]上均匀取 N N N个点 { x 1 , x 2 , ⋯   , x N } \{x_1, x_2, \cdots, x_N\} { x1,x2,,xN},并计算这些点所对应的函数值 { f ( x 1 ) , f ( x 2 ) , ⋯   , f ( x N ) } \{f(x_1), f(x_2), \cdots, f(x_N)\} { f(x1),f(x2),
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
粒子滤波(Particle Filter)是一种用于状态估计的非参数滤波方法,常用于机器人定位和跟踪等领域。在Python中,可以使用NumPy和SciPy等库来实现粒子滤波算法。 粒子滤波的基本思想是通过一组随机采样的粒子来表示系统的状态空间,并根据观测数据对粒子进行重采样和权重更新,从而逼近真实的状态分布。具体步骤如下: 1. 初始化粒子集合:根据先验分布从状态空间中随机采样一组粒子,并为每个粒子赋予相同的权重。 2. 预测步骤:根据系统的动力学模型,对每个粒子进行状态预测,以模拟系统的状态演化。 3. 权重更新:根据观测数据,计算每个粒子的权重,用于反映粒子与观测数据的一致性。常用的权重更新方法有重要性采样和卡尔曼滤波等。 4. 重采样:根据粒子的权重,对粒子进行重采样,以保留具有较高权重的粒子,并淘汰具有较低权重的粒子。 5. 重复步骤2至4,直到达到滤波的终止条件。 在Python中,可以使用NumPy库来生成随机粒子集合,并进行状态预测和重采样操作。同时,可以使用SciPy库中的概率分布函数来计算粒子的权重。通过迭代执行这些步骤,可以实现粒子滤波算法。 需要注意的是,粒子滤波算法的性能受到粒子数目的影响,通常需要根据具体应用场景进行调优。此外,粒子滤波算法也存在一些问题,如样本退化和粒子多样性不足等,需要结合具体问题进行改进和优化。 参考文献: \[1\] Thrun, S., Burgard, W., & Fox, D. (2005). Probabilistic robotics. MIT press. \[2\] Doucet, A., De Freitas, N., & Gordon, N. (2001). Sequential Monte Carlo methods in practice. Springer Science & Business Media. \[1\]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值