#include <ros/ros.h>
#include <string>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <Eigen/Dense>
#include <cmath>
#include <limits> using namespace std;
using Eigen::MatrixXd; //
double generateGaussianNoise(double mu, double sigma)
{
const double epsilon = std::numeric_limits<double>::min();
const double two_pi = 2.0*3.14159265358979323846; static double z0, z1;
static bool generate;
generate = !generate; if (!generate)
return z1 * sigma + mu; double u1, u2;
do
{
u1 = rand() * (1.0 / RAND_MAX);
u2 = rand() * (1.0 / RAND_MAX);
} while (u1 <= epsilon); z0 = sqrt(-2.0 * log(u1)) * cos(two_pi * u2);
z1 = sqrt(-2.0 * log(u1)) * sin(two_pi * u2);
return z0 * sigma + mu;
} int main(int argc, char **argv)
{
std::cout<<"test qusetion2 start !"<<std::endl;
ros::init(argc,argv,"question2_node");
ros::NodeHandle node; ofstream fout("/media/kuang/code_test/result.txt"); double generateGaussianNoise(double mu, double sigma);//随机高斯分布数列生成器函数 const double delta_t = 0.1;//控制周期,100ms
const int num = ;//迭代次数
const double acc = ;//加速度,ft/m MatrixXd A(, );
A(, ) = ;
A(, ) = ;
A(, ) = delta_t;
A(, ) = ; MatrixXd B(, );
B(, ) = pow(delta_t, ) / ;
B(, ) = delta_t; MatrixXd H(, );//测量的是小车的位移,速度为0
H(, ) = ;
H(, ) = ; MatrixXd Q(, );//过程激励噪声协方差,假设系统的噪声向量只存在速度分量上,且速度噪声的方差是一个常量0.01,位移分量上的系统噪声为0
Q(, ) = ;
Q(, ) = ;
Q(, ) = ;
Q(, ) = 0.01; MatrixXd R(, );//观测噪声协方差,测量值只有位移,它的协方差矩阵大小是1*1,就是测量噪声的方差本身。
R(, ) = ; //time初始化,产生时间序列
vector<double> time(, );
for (decltype(time.size()) i = ; i != num; ++i) {
time[i] = i * delta_t;
//cout<<time[i]<<endl;
} MatrixXd X_real(, );
vector<MatrixXd> x_real, rand;
//生成高斯分布的随机数
for (int i = ; i<; ++i) {
MatrixXd a(, );
a(, ) = generateGaussianNoise(, sqrt());
rand.push_back(a);
}
//生成真实的位移值
for (int i = ; i < num; ++i) {
X_real(, ) = 0.5 * acc * pow(time[i], );
X_real(, ) = ;
x_real.push_back(X_real);
} //变量定义,包括状态预测值,状态估计值,测量值,预测状态与真实状态的协方差矩阵,估计状态和真实状态的协方差矩阵,初始值均为零
MatrixXd X_evlt = MatrixXd::Constant(, , ), X_pdct = MatrixXd::Constant(, , ), Z_meas = MatrixXd::Constant(, , ),
Pk = MatrixXd::Constant(, , ), Pk_p = MatrixXd::Constant(, , ), K = MatrixXd::Constant(, , );
vector<MatrixXd> x_evlt, x_pdct, z_meas, pk, pk_p, k;
x_evlt.push_back(X_evlt);
x_pdct.push_back(X_pdct);
z_meas.push_back(Z_meas);
pk.push_back(Pk);
pk_p.push_back(Pk_p);
k.push_back(K); //开始迭代
for (int i = ; i < num; ++i) {
//预测值
X_pdct = A * x_evlt[i - ] + B * acc;
x_pdct.push_back(X_pdct);
//预测状态与真实状态的协方差矩阵,Pk'
Pk_p = A * pk[i - ] * A.transpose() + Q;
pk_p.push_back(Pk_p);
//K:2x1
MatrixXd tmp(, );
tmp = H * pk_p[i] * H.transpose() + R;
K = pk_p[i] * H.transpose() * tmp.inverse();
k.push_back(K);
//测量值z
Z_meas = H * x_real[i] + rand[i];
z_meas.push_back(Z_meas);
//估计值
X_evlt = x_pdct[i] + k[i] * (z_meas[i] - H * x_pdct[i]);
x_evlt.push_back(X_evlt);
//估计状态和真实状态的协方差矩阵,Pk
Pk = (MatrixXd::Identity(, ) - k[i] * H) * pk_p[i];
pk.push_back(Pk);
} cout << "含噪声测量" << " " << "后验估计" << " " << "真值" << " " << endl;
for (int i = ; i < num; ++i) {
cout<<z_meas[i]<<" "<<x_evlt[i](,)<<" "<<x_real[i](,)<<endl;
fout << z_meas[i] << " " << x_evlt[i](, ) << " " << x_real[i](, ) << endl;
} fout.close();
getchar();
return ;
} 下面是python画图代码:
 #! /usr/bin/env python

 import os
import math
import matplotlib.pyplot as plt
import numpy as np def mean(data):
sum=0
for i in data:
sum = sum+i
return sum/len(data) if __name__ == "__main__": file1 = "/media/kuang/code_test/result.txt" frame=[]
measure_noise = []
post_eval = []
groundtruth = []
counter = 0 # Read all data
document1 = open(file1,'rw+')
for line1 in document1:
split_line1 = line1.split()
counter = counter + 1
frame.append(counter)
measure_noise.append(float(split_line1[0]))
post_eval.append(float(split_line1[1]))
groundtruth.append(float(split_line1[2]))
document1.close() START = 0
END = len(frame)-1 #
frame_sub = frame[START:END]
measure_noise_sub = measure_noise[START:END]
post_eval_sub = post_eval[START:END]
groundtruth_sub = groundtruth[START:END] fig, ax1 = plt.subplots() color = 'blue'
ax1.set_xlabel('Frame No.')
ax1.set_ylabel('measure noise', color=color)
ax1.set_ylim(-10,500)
ax1.plot(frame_sub, measure_noise_sub,'s-', color=color)
ax1.tick_params(axis='y', labelcolor=color) ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis
color = 'red'
ax2.set_ylabel('post eval', labelpad=40,color=color) # we already handled the x-label with ax1
ax2.set_ylim(-10,500)
ax2.plot(frame_sub, post_eval_sub, 's-',color=color)
ax2.tick_params(axis='y',pad=30.0, labelcolor=color) ax3 = ax1.twinx()
color = 'yellow'
ax3.set_ylabel('groundtruth', color=color, labelpad=30)
ax3.set_ylim(-10,500)
ax3.tick_params(axis='y', labelcolor=color)
ax3.plot(frame_sub, groundtruth_sub, 's-' , color=color) fig.tight_layout() # otherwise the right y-label is slightly clipped
ax1.grid()
plt.title("Kalman Test")
plt.show() # SAVE RESULT TO FILE

卡尔曼滤波C++代码的更多相关文章

  1. 卡尔曼滤波学习笔记1-Matlab模拟温度例子--代码比较乱,还需优化

    温度模拟参数选取 xk 系统状态 实际温度 A 系统矩阵 温度不变,为1 B.uk 状态的控制量 无控制量,为0 Zk 观测值 温度计读数 H 观测矩阵 直接读出,为1 wk 过程噪声 温度变化偏差, ...

  2. 扩展卡尔曼滤波(MRPT)

    EKF relies on a linearisation of the evolution and observation functions which are good approximatio ...

  3. 卡尔曼滤波(Kalman Filter)

    一.引言 以下我们引用文献[1]中的一段话作为本文的開始: 想象你在黄昏时分看着一仅仅小鸟飞行穿过浓密的丛林.你仅仅能隐隐约约.断断续续地瞥见小鸟运动的闪现.你试图努力地猜測小鸟在哪里以及下一时刻它会 ...

  4. Google Cardboard的九轴融合算法——基于李群的扩展卡尔曼滤波

    Google Cardboard的九轴融合算法 --基于李群的扩展卡尔曼滤波 极品巧克力 前言 九轴融合算法是指通过融合IMU中的加速度计(三轴).陀螺仪(三轴).磁场计(三轴),来获取物体姿态的方法 ...

  5. 树莓派 连接 JY901(MPU9250) python 代码

    先说BUG,最近要做项目需要树莓派和陀螺仪,资金充足的话肯定是买一个硬件卡尔曼滤波的传感器类似JY901模块,资金不足的就买MPU6050. 网上关于MPU6050在树莓派上的代码还能用,关于JY90 ...

  6. 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码

    首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...

  7. 卡尔曼滤波(Kalman Filter) ZZ

    一.引言 以下我们引用文献[1]中的一段话作为本文的開始: 想象你在黄昏时分看着一仅仅小鸟飞行穿过浓密的丛林.你仅仅能隐隐约约.断断续续地瞥见小鸟运动的闪现.你试图努力地猜測小鸟在哪里以及下一时刻它会 ...

  8. 卡尔曼滤波(Kalman Filter)在目标边框预测中的应用

    1.卡尔曼滤波的导论 卡尔曼滤波器(Kalman Filter),是由匈牙利数学家Rudolf Emil Kalman发明,并以其名字命名.卡尔曼出生于1930年匈牙利首都布达佩斯.1953,1954 ...

  9. 滤波器算法(1)-卡尔曼滤波小车附带题目与MATLAB程序

    1 简介 由卡尔曼这个学者提出的最佳线性滤波器,单纯时域维度即可实现[无需进行频域变换] 2 思路 由上一时刻的最佳估计值XKE_P预测①当前时刻预测值Pxv 与 ②当前时刻的测量值Mxv 进行联立计 ...

随机推荐

  1. Linux-Bash终端快捷键

    ^C 终正在运行的进程或放弃当前编辑的命令^U 将光标所在字符到行首之间的所有字符删除,可以使用^E到行尾再^U来删除整行内容^Z 将前台运行的进程放入背景并暂停^D 发送EOF,结束当前输入流,如果 ...

  2. 实例调用(__call__())

    任何类,只需要定义一个__call__()方法,就可直接对实例进行调用 对实例进行直接调用就好比对一个函数进行调用一样 __call__()还可定义参数,所以调用完全可以把对象看成函数,把函数看成对象 ...

  3. selectpage选择订单的时候,订单数量和金额会动态改变

    1. 2. HTML部分: JS: PHP获取数据并return json

  4. 给 K8s API “做减法”:阿里巴巴云原生应用管理的挑战和实践

    作者 | 孙健波(天元)  阿里巴巴技术专家本文整理自 11 月 21 日社群分享,每月 2 场高质量分享,点击加入社群. 早在 2011 年,阿里巴巴内部便开始了应用容器化,当时最开始是基于 LXC ...

  5. Java 类加载机制(阿里)-何时初始化类

    (1)阿里的面试官问了两个问题,可以不可以自己写个String类 答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了; (2)能否在加载类的时候,对类的 ...

  6. MD5 加密工具类MD5Util

    我们在使用MD5 在线加密的时候,会发现下面情况,大小写的区别就不说啦,那么16位和32位有啥区别呢,其实16 位实际上是从 32 位字符串中,取中间的第 9 位到第 24 位的部分,就是str.su ...

  7. ctr预估论文梳理和个人理解

    问题描述 ctr的全称是click through rate,就是预估用户的点击率,可以用于推荐系统的ranking阶段.ctr预估可以理解为给用户的特征.item的特征以及context的特征(比如 ...

  8. centOS7安装mysql8.0完美教程!!只要按照步骤,无脑操作,一次成功!

    查看防火墙systemctl status firewalld重启防火墙systemctl start firewalld 1.mysql 首先关闭防火墙 systemctl stop firewal ...

  9. Linux—网络防火墙详解

    一.防火墙基本知识 二.firewall防火墙 # 安装firewalld [root@localhost ~]# apt-get install firewalld [root@localhost ...

  10. Java学习笔记(2)--- 对象和类入门,java包,this 和 super区别

    1.对象和类(Object and class): 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作. 面对对象编程是java非常重要的一部分,作者本身之前学过c ...