#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. 学习workerman之前需要知道的几种php回调写法

    在workerman中会经常使用,我们先写一个回调函数,当某个行为被触发后使用该函数处理相关逻辑. 在PHP中最常用的几种回调写法如下 匿名函数做为回调 匿名函数(Anonymous function ...

  2. swoole中http_server的配置与使用

    swoole中为我们提供了一个swoole_http_server类,方便我们处理http请求. 但是它对http协议的支持并不完整,所以一般建议在前面加一层nginx进行代理,对于php文件的处理交 ...

  3. 关于matlab2014a中生成dll文件,打包成com组件出现的问题和解决方法

    问题1:matlab2014a破解不完整,容易导致package打包失败 解决方法:1.下载破解文档:链接: http://pan.baidu.com/s/1eRJ4E2I 密码: 44th 2.下载 ...

  4. OpenGL光照1:颜色和基础光照

    本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...

  5. C#与SAP系统的接口调用

    Sap作为ERP的龙头企业,在企业信息化建设中是有目共睹的,特别是财务.人力.物流等发挥着极大作用,占领着半壁江山,所以与企业系统用SAP软件的接口对接很是普遍,简单介绍一下与SAP接口的一点点儿心得 ...

  6. 【jQuery】jQuery基础

    jQuery介绍 jQuery是一个轻量级JS库,使用十分简单: jQuery的核心是选择器,用于获取页面元素: jQuery提供了大量高效的方法,开发速度大幅提升: jQuery选择器 jQuery ...

  7. git本地忽略

    添加本地忽略文件 git update-index --assume-unchanged 忽略的文件名 恢复本地忽略文件 git update-index --no-assume-unchanged ...

  8. Hystrix工作流

    Hystrix工作流程图: 流程图详解 1. 构造HystrixCommand对象或者HystrixObservableCommand对象 构造HystrixCommand 或HystrixObser ...

  9. 查询Mysql数据库所有数据库所占磁盘空间大小

    查询Mysql数据库所有数据库所占磁盘空间大小: /,),' MB') as data_size, concat(truncate(sum(index_length)//,),'MB') as ind ...

  10. 3.JavaCC 语法描述文件的格式解析

      JavaCC的语法描述文件格式如下所示: options { JavaCC的选项 } PARSER_BEGIN(解析器类名) package 包名; import 库名; public class ...