无损卡尔曼滤波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点

考虑到噪声的影响??
  1. 扩充状态的平均值中添加了两个噪声值。
  2. 纵向加速度项和角加速度项。均值为0 ,一定方差的正态分布。
  3. 他们的平均值为零,因此在平均状态的Sigma点,将他们的值设置为零。
  4. 用零填充扩充的协方差矩阵。
  5. 然后,使用topLeftcorner函数设置扩充的协方差矩阵的左上块。
  6. 方差放入增强矩阵的右下块。 该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点的更多相关文章

  1. LSTM生成尼采风格文章

    LSTM生成文本 github地址 使用循环神经网络生成序列文本数据.循环神经网络可以用来生成音乐.图像作品.语音.对话系统对话等等. 如何生成序列数据? 深度学习中最常见的方法是训练一个网络模型(R ...

  2. 生成模型(Generative Model)和 判别模型(Discriminative Model)

    引入 监督学习的任务就是学习一个模型(或者得到一个目标函数),应用这一模型,对给定的输入预测相应的输出.这一模型的一般形式为一个决策函数Y=f(X),或者条件概率分布P(Y|X). 监督学习方法又可以 ...

  3. 蛋白质组DIA深度学习之谱图预测

    目录 1. 简介 2. 近几年发表的主要工具 1.DeepRT 2.Prosit 3. DIANN 4.DeepDIA 1. 简介 基于串联质谱的蛋白质组学大部分是依赖于数据库(database se ...

  4. 一文洞悉Python必备50种算法!资深大牛至少得掌握25种!

    一.环境需求 二.怎样使用 三.本地化 3.1扩展卡尔曼滤波本地化 3.2无损卡尔曼滤波本地化 3.3粒子滤波本地化 3.4直方图滤波本地化 四.映射 4.1高斯网格映射 4.2光线投射网格映射 4. ...

  5. opencv3.1自带demo的介绍和运行操作。转载

    opencv3.1自带demo的介绍和运行操作. 下列实验基本都试过,有些需要根据自己的电脑修改一些路径或者调试参数. 值得注意的是,控制台程序输入有时候要在图像所在的窗口输入相应的指令.我的电脑上安 ...

  6. 学习笔记TF060:图像语音结合,看图说话

    斯坦福大学人工智能实验室李飞飞教授,实现人工智能3要素:语法(syntax).语义(semantics).推理(inference).语言.视觉.通过语法(语言语法解析.视觉三维结构解析)和语义(语言 ...

  7. Generative Adversarial Nets[Theory&MSE]

    本文来自<deep multi-scale video prediction beyond mean square error>,时间线为2015年11月,LeCun等人的作品. 从一个视 ...

  8. 盖茨基金会:如何使用Python拯救生命

    每年全球都要花费数十亿美元来预防疾病,减少死亡,资助预防保健及治疗的各种研发项目,以及其他的健康方案.但资金毕竟是有限的,所以一些组织,比如全球卫生资金的主要捐助者比尔&梅林达·盖茨基金会(B ...

  9. tensorflow的写诗代码分析【转】

    本文转载自:https://dongzhixiao.github.io/2018/07/21/so-hot/ 今天周六,早晨出门吃饭,全身汗湿透.天气真的是太热了!我决定一天不出门,在屋子里面休息! ...

随机推荐

  1. swift中的category,扩展

    1.创建选择 :swift file 2.名称:UIBarButtonItem-Extension 3.category,便利构造函数 extension UIColor { /* 1.extensi ...

  2. [LC] 114. Flatten Binary Tree to Linked List

    Given a binary tree, flatten it to a linked list in-place. For example, given the following tree: 1 ...

  3. 五、RabbitMQ Java Client基本使用详解

    Java Client的5.x版本系列需要JDK 8,用于编译和运行.在Android上,仅支持Android 7.0或更高版本.4.x版本系列支持7.0之前的JDK 6和Android版本. 加入R ...

  4. 三、RabbitMQ安装

    安装前准备 Linux版本信息: 发行版本:CentOS Linux release 7.5.1804 (Core) 内核版本:Linux version 3.10.0-862.el7.x86_64 ...

  5. iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

    iOS精选源码 日期时间选择器,swift Space Battle 宇宙大战 SpriteKit游戏源码 LLDebugTool - 便捷的IOS调试工具(新增截屏功能) 相机扫描or长按识别二维码 ...

  6. JDK源码看Java域名解析

    前言 在互联网中通信需要借助 IP 地址来定位到主机,而 IP 地址由很多数字组成,对于人类来说记住某些组合数字很困难,于是,为了方便大家记住某地址而引入主机名和域名. 早期的网络中的机器数量很少,能 ...

  7. Nginx笔记:支持对用户提交URL和服务的URL不一致时,保持对POST提交的支持

    用户访问的URL和服务的URL不一致,需要对URL修改,同时使用的是POST提交方式 location ~* ^/portalproxy/([-]*)/portal$ { #rewrite '^/po ...

  8. Android开发之《实现类似Toast可以自动消失的提示栏Tip》

    import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.cont ...

  9. 签名旧版的pom文件

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  10. ES6-Set与Map数据结构

    Set 实例的属性和方法 Set类似与数组,但是成员值唯一没有重复! let arr = [3, 5, 2, 2, 5, 5]; let unique = [...new Set(arr)]; // ...