无迹卡尔曼滤波-2

对于上一篇中的问题:X ∼ N(µ, σ^2 ) , Y = sin(X)要求随机变量Y的期望和方差。还有一种思路是对X进行采样,比如取500个采样点(这些采样点可以称为sigma点),然后求取这些采样点的期望和方差。当采样值足够大时,结果与理论值接近。这种思路的问题显而易见,当随机变量维数增大时采样点的数量会急剧增加,比如一维需要500个采样点,二维就需要500^=250,000个采样点,三维情况下需要500^3=125,000,000个采样点,显然这样会造成严重的计算负担。无迹卡尔曼滤法中采用一种方法来选取2n+1个sigma点,n为随机变量维数。

如上图所示,考虑正态分布曲线的对称性,选取3个sigma点来计算(sigma点的选取方法不唯一),其中一个是均值,另外两个sigma点关于均值对称分布。比如三个点可选为:

χ= μ;

χ= μ + σ;

χ= μ - σ;

然后选取合适的权值Wi满足如下关系

使用同样的公式近似计算Y=sin(X)分布的数字特征:

类比推广到多维随机变量X ∼ N(μ ,Σ),Σ为协方差矩阵,采用Cholesky分解计算出矩阵L(Σ = LLT)  ,矩阵L可以类比一维情况下的标准差σ。则sigma点可以写成下面的形式:

χ0 = μ;

χi = μ + cL;

χn+i = μ - cL; c为一个正的常数

则对于非线性变换Y=g(X),可以计算出变换后的期望和方差:

关键问题是如何选取sigma点和权值。常见的一种方法是第一个sigma点选为χ0=μ,n是随机变量X的维数,α,κ,λ均为常数,并有如下关系

 

其余2n个sigma点的计算公式如下,其中下标i表示矩阵L的第i列

接下来要计算权值。对求期望来说,第一个sigma点的权值为:

对求方差来说,第一个sigma点的权值为如下,式子中的β也为一个常数

对于剩下的2n个sigma点来说求期望的权值和求方差的权值都相同:

因此,一共有三个常数(α,β,κ)需要我们来设定。根据其它参考资料,选择参数的经验为:β=2 is a good choice for Gaussian problems, κ=3−n is a good choice for κ , and 0≤α≤1 is an appropriate choice for α.

α越大,第一个sigma点(平均值处)占的权重越大,并且其它sigma点越远离均值。如下图所示,对2维随机变量选取5个sigma点,点的大小代表权重,由感性认识可知sigma点离均值越远其权重应该越小。

根据上述计算步骤和公式我们可以编程实现sigma点的选择,权值的计算。在Python中我们可以采用现成的工具FilterPy安装pip工具后可以直接输入命令:pip install filterpy进行安装。

 1 # -*- coding: utf-8 -*-
 2 from filterpy.kalman import MerweScaledSigmaPoints as SigmaPoints
 3
 4 mean = 0    # 均值
 5 cov =  1    # 方差
 6
 7 points = SigmaPoints(n=1, alpha=0.1, beta=2.0, kappa=1.0)
 8 Wm, Wc = points.weights()
 9 sigmas = points.sigma_points(mean, cov)
10
11 print Wm, Wc    # 计算均值和方差的权值
12 print sigmas    # sigma点的坐标

对于标准正态分,输出结果如下:

下面举一个2维正态分布的例子。从一个服从二维正态分布的随机变量中随机选取1000个点,该二维随机变量的期望和协方差矩阵为:

接下来将这1000个点进行如下非线性变换:

下面使用unscented transform方法近似计算非线性变换后随机变量的期望,并与直接从1000个点计算出的期望值对比

 1 # -*- coding: utf-8 -*-
 2 import numpy as np
 3 from scipy import stats
 4 import matplotlib.pyplot as plt
 5 from numpy.random import multivariate_normal
 6 from filterpy.kalman import unscented_transform
 7 from filterpy.kalman import MerweScaledSigmaPoints as SigmaPoints
 8
 9 # 非线性变换函数
10 def f_nonlinear_xy(x, y):
11     return np.array([x + y, 0.1*x**2 + y**2])
12
13 def plot1(xs, ys):
14     xs = np.asarray(xs)
15     ys = np.asarray(ys)
16     xmin = xs.min()
17     xmax = xs.max()
18     ymin = ys.min()
19     ymax = ys.max()
20     values = np.vstack([xs, ys])
21     kernel = stats.gaussian_kde(values)
22     X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
23     positions = np.vstack([X.ravel(), Y.ravel()])
24     Z = np.reshape(kernel.evaluate(positions).T, X.shape)
25     plt.imshow(np.rot90(Z),cmap=plt.cm.Greys,extent=[xmin, xmax, ymin, ymax])
26     plt.plot(xs, ys, ‘k.‘, markersize=2)
27     plt.xlim(-20, 20)
28     plt.ylim(-20, 20)
29
30 def plot2(xs, ys, f, mean_fx):
31     fxs, fys = f(xs, ys)    # 将采样点进行非线性变换
32     computed_mean_x = np.average(fxs)
33     computed_mean_y = np.average(fys)
34     plt.subplot(121)
35     plt.grid(False)
36     plot1(xs, ys)
37     plt.subplot(122)
38     plt.grid(False)
39     plot1(fxs, fys)
40     plt.scatter(fxs, fys, marker=‘.‘, alpha=0.01, color=‘k‘)
41     plt.scatter(mean_fx[0], mean_fx[1], marker=‘o‘, s=100, c=‘r‘, label=‘UT_mean‘)
42     plt.scatter(computed_mean_x, computed_mean_y, marker=‘*‘,s=120, c=‘b‘, label=‘mean‘)
43     plt.ylim([-10, 200])
44     plt.xlim([-100, 100])
45     plt.legend(loc=‘best‘, scatterpoints=1)
46     print (‘Difference in mean x={:.3f}, y={:.3f}‘.format(
47            computed_mean_x-mean_fx[0], computed_mean_y-mean_fx[1]))
48
49 # -------------------------------------------------------------------------------------------
50 mean = [0, 0]               # Mean of the N-dimensional distribution.
51 cov = [[32, 15], [15, 40]]  # Covariance matrix of the distribution.
52
53 # create sigma points(2n+1个sigma点)
54 # uses 3 parameters to control how the sigma points are distributed and weighted
55 points = SigmaPoints(n=2, alpha=.1, beta=2., kappa=1.)
56 Wm, Wc = points.weights()
57 sigmas = points.sigma_points(mean, cov)
58
59 # pass through nonlinear function
60 sigmas_f = np.empty((5, 2))
61 for i in range(5):
62     sigmas_f[i] = f_nonlinear_xy(sigmas[i, 0], sigmas[i ,1])
63
64 # use unscented transform to get new mean and covariance
65 ukf_mean, ukf_cov = unscented_transform(sigmas_f, Wm, Wc)
66
67 # generate random points
68 xs, ys = multivariate_normal(mean, cov, size=1000).T  # 从二维随机变量的正态分布中产生1000个数据点
69 plot2(xs, ys, f_nonlinear_xy, ukf_mean)
70
71 # 画sigma点
72 plt.xlim(-30, 30); plt.ylim(0, 90)
73 plt.subplot(121)
74 plt.scatter(sigmas[:,0], sigmas[:,1], c=‘r‘, s=30)
75 plt.show()

结果如下图所示,左图中黑点为1000个采样点,5个红色的点为sigma点,图中阴影表示概率密度的大小,颜色越深的地方概率密度越大。右图中的红点为用5个sigma点经UT变换计算出的近似期望,蓝色星号标记点为将1000个采样点非线性变换后直接计算出的期望。可以看出和直接产生1000个点经非线性变换计算期望相比,使用unscented transform的计算量要小的多,并且误差也不大。

时间: 2024-12-19 09:11:00

无迹卡尔曼滤波-2的相关文章

无迹卡尔曼滤波-1

无迹卡尔曼滤波(unscented kalman filter)中需要用到无迹变换.维基百科中对unscented transform的描述如下: The unscented transform (UT) is a mathematical function used to estimate the result of applying a given nonlinear transformation to a probability distribution that is character

【概率机器人】3.1 卡尔曼滤波、扩展卡尔曼滤波和无迹卡尔曼滤波

这一章将介绍卡尔曼滤波.扩展卡尔曼滤波以及无迹卡尔曼滤波,并从贝叶斯滤波的角度来进行分析并完成数学推导.如果您对贝叶斯滤波不了解,可以查阅相关书籍或阅读 [概率机器人 2 递归状态估计]. 这三种滤波方式都假设状态变量 $\mathbf{x}_t$ 的置信度 $\mathrm{bel}(\mathbf{x}_t)$ 为正态分布,这样在计算 $\mathbf{x}_t$ 的置信度时,只需要计算出其分布的均值与方差即可.下面将分别介绍这三种滤波算法. 1.卡尔曼滤波 首先,回顾一下贝叶斯滤波.其目标

机器人操作系统ROS | 简介篇

同样,从个人微信公众号Nao(ID:qRobotics)搬运. 前言 先放一个ROS Industrial一周年剪辑视频. ROS已经发布八周年了,在国外科研机构中非常受欢迎.目前,以美国西南研究院为首的几位大佬开始尝试将ROS应用在工业机器人中,上面这个视频就是ROS-I项目一周年的进展情况. 为了说明讲清楚ROS,我就从ROS是什么,为什么使用ROS,如何使用ROS三个方面展开. △出自今年<机器人视觉与应用>课程本人制作的课件 是什么 ROS是Robot Operating System

ROS是Robot Operating System

ROS是Robot Operating System 机器人操作系统ROS | 简介篇 同样,从个人微信公众号Nao(ID:qRobotics)搬运. 前言 先放一个ROS Industrial一周年剪辑视频. ROS已经发布八周年了,在国外科研机构中非常受欢迎.目前,以美国西南研究院为首的几位大佬开始尝试将ROS应用在工业机器人中,上面这个视频就是ROS-I项目一周年的进展情况. 为了说明讲清楚ROS,我就从ROS是什么,为什么使用ROS,如何使用ROS三个方面展开. △出自今年<机器人视觉与

【深度学习Deep Learning】资料大全

转载:http://www.cnblogs.com/charlotte77/p/5485438.html 最近在学深度学习相关的东西,在网上搜集到了一些不错的资料,现在汇总一下: Free Online Books Deep Learning66 by Yoshua Bengio, Ian Goodfellow and Aaron Courville Neural Networks and Deep Learning42 by Michael Nielsen Deep Learning27 by

卡尔曼(Kalman)滤波(六)--卡尔曼滤波的应用: 四元数卡尔曼滤波(QKF)的C代码实现姿态解算

0 引言 在捷联惯导工程实践[6]中,我们希望陀螺仪能够非常精确的获取信息,或者说希望陀螺仪能非常准确的地反映观测量(加速度,磁场等)[6,7]的真实值,但是这个过程或多或少是受到噪声干扰的,导致测量的不准确:为了能够让陀螺仪在状态更新时做到准确,必须对状态变量和观测量进行数据融合和滤波,从而尽最大限度的降低噪声的干扰. 最常用也最有效的方法非卡尔曼滤波莫属,其在处理高斯模型的系统上效果颇佳:随着计算机技术的发展,Kalman滤波的计算要求和复杂性已不再成为其应用中的阻碍,并且越来越受到人们的青

卡尔曼滤波总结——KF、EFK、UKF

1.用途 现实是我们的处理和测量模型都是非线性的,结果就是一个不规则分布,KF能够使用的前提就是所处理的状态是满足高斯分布的,为了解决这个问题,EKF是寻找一个线性函数来近似这个非线性函数,而UKF就是去找一个与真实分布近似的高斯分布. KF处理线性模型: EKF 通过雅克比和偏导数近似非线性模型,但是忽略了高阶导数:(强非线性系统下误差大,另一方面Jacobian矩阵的计算复杂) UKF 通过去点的方式近似非线性模型,因为没有用雅克比和偏导数,让计算变得更加简单,同时也没有忽略高阶导数项. 2

卡尔曼滤波(Kalman Filter) 的进一步讨论

我们在上一篇文章中通过一个简单的例子算是入门卡尔曼滤波了,本文将以此为基础讨论一些技术细节. 卡尔曼滤波(Kalman Filter) http://blog.csdn.net/baimafujinji/article/details/50646814 在上一篇文章中,我们已经对HMM和卡尔曼滤波的关联性进行了初步的讨论.参考文献[3]中将二者之间的关系归结为下表. 上表是什么意思呢?我们其实可以下面的式子来表示,其中,w 和 v 分别表示状态转移 和 测量 过程中的不确定性,也即是噪声,既然是

卡尔曼滤波融合库函数+Arduino实例

-------这篇文章就作为放弃ACM比赛转行到电子设计大赛的开始吧,ACM比赛真的太需要时间了,准确的说对于我这样的菜鸟而言太浪费时间了,但是话说回来两年时间从中真心收获了很多 我是不理解卡尔曼滤波的原理啊,但是用这个库函数做个平衡车是绝对没问题 ,所以不理解没太大问题,只要知道它是用来融合加速度计 和 陀螺仪测定角度的.这个角度相对单纯求得的角度会更加精确,既然我弄不明白滤波的原理,下面我会特别详细的说明一下此库函数用到的变量,毕竟有很多人还是想弄明白的. Q_angle:相对于加速度计的噪