无损卡尔曼滤波UKF(3)-预测-生成Sigma点
无损卡尔曼滤波UKF(3)-预测-生成Sigma点
1 选择创建Sigma点
A 根据
已知上一个时间戳迭代出来的
后验状态 \(x_{k|k}\) 和后验协方差矩阵 \(P_{k|k}\)
他们代表当前状态的分布。
Sigma点的数量取决于状态向量的维度
\(n_{\sigma} = 2\cdot n_x + 1\)
如果以两个维度的状态向量为例。就可以生成五个sigma点。
\(X_{k|k} = [P1,P2,P3,P4,P5]\)
矩阵的每一列都代表一个Sigma点。
\(X_{k|k} = [x_{k|k},x_{k|k}+\sqrt[2]{(\lambda+n_x)P_{k|k}},x_{k|k}-\sqrt[2]{(\lambda+n_x)P_{k|k}} ]\)
关于Lambda,是一个设计的参数,一般情况下,按下面的设置,效果还不错
\(\lambda = 3 - n_x\)
求矩阵的平方根 => 找到矩阵A
\(A = \sqrt[2]{P_{k|k}} <= A^T A = P_{k|k}\)
第一个点就是状态向量的均值。
如果Lambda值大,Sigma点会距离均值点远一些。
生成Sigma点的代码(1)
/*
根据上述公式,完成生成Sigma点的函数
*/
void UKF::GenerateSigmaPoints(MatrixXd* Xsig_out) {
// 设置状态向量的维度
int n_x = 5;
// 定义传播参数
double lambda = 3 - n_x;
// 给定一个样例状态
VectorXd x = VectorXd(n_x);
x << 5.7441,
1.3800,
2.2049,
0.5015,
0.3528;
// 给定一个样例状态的协方差矩阵
MatrixXd P = MatrixXd(n_x, n_x);
P << 0.0043, -0.0013, 0.0030, -0.0022, -0.0020,
-0.0013, 0.0077, 0.0011, 0.0071, 0.0060,
0.0030, 0.0011, 0.0054, 0.0007, 0.0008,
-0.0022, 0.0071, 0.0007, 0.0098, 0.0100,
-0.0020, 0.0060, 0.0008, 0.0100, 0.0123;
// 创建Sigma点的矩阵、一列代表一个Sigma点、
MatrixXd Xsig = MatrixXd(n_x, 2 * n_x + 1);
// 计算矩阵P的平方根
MatrixXd A = P.llt().matrixL();
// 设置Sigma矩阵的第一列,一列代表一个Sigma点
Xsig.col(0) = x;
// 设置Sigma矩阵剩下的点
for (int i = 0; i < n_x; ++i) {
Xsig.col(i+1) = x + sqrt(lambda+n_x) * A.col(i);
Xsig.col(i+1+n_x) = x - sqrt(lambda+n_x) * A.col(i);
}
// 打印结果
std::cout << "Xsig = " << std::endl << Xsig << std::endl;
// 返回结果
*Xsig_out = Xsig;
}
B 扩充后创建Sigma点



考虑到噪声的影响??
- 扩充状态的平均值中添加了两个噪声值。
- 纵向加速度项和角加速度项。均值为0 ,一定方差的正态分布。
- 他们的平均值为零,因此在平均状态的Sigma点,将他们的值设置为零。
- 用零填充扩充的协方差矩阵。
- 然后,使用topLeftcorner函数设置扩充的协方差矩阵的左上块。
- 方差放入增强矩阵的右下块。 该2x2块对应于矩阵QQ。
除了这次创建了更多的sigma点,其余部分与以前完全相同。
void UKF::AugmentedSigmaPoints(MatrixXd* Xsig_out) {
// 维数
int n_x = 5;
// 扩展后维数为7
int n_aug = 7;
// Process noise standard deviation longitudinal acceleration in m/s^2
double std_a = 0.2;
// Process noise standard deviation yaw acceleration in rad/s^2
double std_yawdd = 0.2;
// 定义传播参数
double lambda = 3 - n_aug;
VectorXd x = VectorXd(n_x);
x << 5.7441,
1.3800,
2.2049,
0.5015,
0.3528;
MatrixXd P = MatrixXd(n_x, n_x);
P << 0.0043, -0.0013, 0.0030, -0.0022, -0.0020,
-0.0013, 0.0077, 0.0011, 0.0071, 0.0060,
0.0030, 0.0011, 0.0054, 0.0007, 0.0008,
-0.0022, 0.0071, 0.0007, 0.0098, 0.0100,
-0.0020, 0.0060, 0.0008, 0.0100, 0.0123;
// 创建扩充后的平均值向量
VectorXd x_aug = VectorXd(7);
// 创建扩充后的状态协方差矩阵
MatrixXd P_aug = MatrixXd(7, 7);
// 创建扩充后的Sigma矩阵
MatrixXd Xsig_aug = MatrixXd(n_aug, 2 * n_aug + 1);
// 设置扩充后的平均值向量的参数值
x_aug.head(5) = x;
x_aug(5) = 0;
x_aug(6) = 0;
// 设置扩充后的状态协方差矩阵
P_aug.fill(0.0);
P_aug.topLeftCorner(5,5) = P;
P_aug(5,5) = std_a*std_a;
P_aug(6,6) = std_yawdd*std_yawdd;
// 求P的平方根
MatrixXd L = P_aug.llt().matrixL();
// 设置Sigma矩阵其他位置的值
Xsig_aug.col(0) = x_aug;
for (int i = 0; i< n_aug; ++i) {
Xsig_aug.col(i+1) = x_aug + sqrt(lambda+n_aug) * L.col(i);
Xsig_aug.col(i+1+n_aug) = x_aug - sqrt(lambda+n_aug) * L.col(i);
}
std::cout << "Xsig_aug = " << std::endl << Xsig_aug << std::endl;
*Xsig_out = Xsig_aug;
}
无损卡尔曼滤波UKF(3)-预测-生成Sigma点的更多相关文章
- LSTM生成尼采风格文章
LSTM生成文本 github地址 使用循环神经网络生成序列文本数据.循环神经网络可以用来生成音乐.图像作品.语音.对话系统对话等等. 如何生成序列数据? 深度学习中最常见的方法是训练一个网络模型(R ...
- 生成模型(Generative Model)和 判别模型(Discriminative Model)
引入 监督学习的任务就是学习一个模型(或者得到一个目标函数),应用这一模型,对给定的输入预测相应的输出.这一模型的一般形式为一个决策函数Y=f(X),或者条件概率分布P(Y|X). 监督学习方法又可以 ...
- 蛋白质组DIA深度学习之谱图预测
目录 1. 简介 2. 近几年发表的主要工具 1.DeepRT 2.Prosit 3. DIANN 4.DeepDIA 1. 简介 基于串联质谱的蛋白质组学大部分是依赖于数据库(database se ...
- 一文洞悉Python必备50种算法!资深大牛至少得掌握25种!
一.环境需求 二.怎样使用 三.本地化 3.1扩展卡尔曼滤波本地化 3.2无损卡尔曼滤波本地化 3.3粒子滤波本地化 3.4直方图滤波本地化 四.映射 4.1高斯网格映射 4.2光线投射网格映射 4. ...
- opencv3.1自带demo的介绍和运行操作。转载
opencv3.1自带demo的介绍和运行操作. 下列实验基本都试过,有些需要根据自己的电脑修改一些路径或者调试参数. 值得注意的是,控制台程序输入有时候要在图像所在的窗口输入相应的指令.我的电脑上安 ...
- 学习笔记TF060:图像语音结合,看图说话
斯坦福大学人工智能实验室李飞飞教授,实现人工智能3要素:语法(syntax).语义(semantics).推理(inference).语言.视觉.通过语法(语言语法解析.视觉三维结构解析)和语义(语言 ...
- Generative Adversarial Nets[Theory&MSE]
本文来自<deep multi-scale video prediction beyond mean square error>,时间线为2015年11月,LeCun等人的作品. 从一个视 ...
- 盖茨基金会:如何使用Python拯救生命
每年全球都要花费数十亿美元来预防疾病,减少死亡,资助预防保健及治疗的各种研发项目,以及其他的健康方案.但资金毕竟是有限的,所以一些组织,比如全球卫生资金的主要捐助者比尔&梅林达·盖茨基金会(B ...
- tensorflow的写诗代码分析【转】
本文转载自:https://dongzhixiao.github.io/2018/07/21/so-hot/ 今天周六,早晨出门吃饭,全身汗湿透.天气真的是太热了!我决定一天不出门,在屋子里面休息! ...
随机推荐
- 4.Redis持久化方案
1.1 RDB持久化 RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘. RDB是Redis默认采用的持久化方式. ...
- BCM93349DCM 手动升级 Fireware 指导
PC:Personal Computer(这里用的Win7) CM:Cable MODEM(芯片:BCM93349DCM) 一.预置条件 1.PC上已安装TFTP Server,比如tftpd32: ...
- spring web项目中整合netty, akka
spring web项目中整合netty, akka 本身的web项目仍然使用tomcat/jetty8080端口, 在org.springframework.beans.factory.Initia ...
- MOOC(12) - 安装连接数据库的第三方库
1.连接数据库需要mysql-python驱动,可以官网下载离线安装包 安装 检查是否导入成功
- WIN10 蓝牙连接音箱之后,音量调节无效,音量从1-100,声音一样大,都是最大声,可以静音(解决方案)
1.win+r,输入regedit,打开注册表2.进入路径:计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Bluetooth\Audio\AV ...
- python-django-linux上mysql的安装和配置_20191124
又有了阻塞了,怎么在Linux创建数据库,mysql, 我把数据库安装在Linux上, 1,sudo apt-get install mysql-server 2,ps -aux | grep 'my ...
- 通过HTTP向kafka发送数据
在大数据整个处理流程过程中,数据的流向是一个很重要的问题,本篇博客主要记录数据是怎么从http发送到kafka的. 使用技术点: 1. java的Vert.x框架 (关于java框架Vert.x的使用 ...
- 牛客-小y的盒子
题目传送门 -------------------稍加观察就会发现,4n - 1就是题目要的答案.至于为什么,看官方的题解.不过这个n非常的大,用正常快速幂解决不了.这道题我学到的就是解决幂非常大的情 ...
- svn安装使用1(转载)
SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...
- openssl编译时!遇见的问题
openssl编译: 1.编译静态库 ./config --prefix=/root/openssl/soft make 2.编译动态库 ./config --prefix=/root/openssl ...