1. #include <ros/ros.h>
  2. #include <string>
  3. #include <stdlib.h>
  4. #include <iostream>
  5. #include <fstream>
  6. #include <string>
  7. #include <vector>
  8. #include <Eigen/Dense>
  9. #include <cmath>
  10. #include <limits>
  11.  
  12. using namespace std;
  13. using Eigen::MatrixXd;
  14.  
  15. //
  16. double generateGaussianNoise(double mu, double sigma)
  17. {
  18. const double epsilon = std::numeric_limits<double>::min();
  19. const double two_pi = 2.0*3.14159265358979323846;
  20.  
  21. static double z0, z1;
  22. static bool generate;
  23. generate = !generate;
  24.  
  25. if (!generate)
  26. return z1 * sigma + mu;
  27.  
  28. double u1, u2;
  29. do
  30. {
  31. u1 = rand() * (1.0 / RAND_MAX);
  32. u2 = rand() * (1.0 / RAND_MAX);
  33. } while (u1 <= epsilon);
  34.  
  35. z0 = sqrt(-2.0 * log(u1)) * cos(two_pi * u2);
  36. z1 = sqrt(-2.0 * log(u1)) * sin(two_pi * u2);
  37. return z0 * sigma + mu;
  38. }
  39.  
  40. int main(int argc, char **argv)
  41. {
  42. std::cout<<"test qusetion2 start !"<<std::endl;
  43. ros::init(argc,argv,"question2_node");
  44. ros::NodeHandle node;
  45.  
  46. ofstream fout("/media/kuang/code_test/result.txt");
  47.  
  48. double generateGaussianNoise(double mu, double sigma);//随机高斯分布数列生成器函数
  49.  
  50. const double delta_t = 0.1;//控制周期,100ms
  51. const int num = ;//迭代次数
  52. const double acc = ;//加速度,ft/m
  53.  
  54. MatrixXd A(, );
  55. A(, ) = ;
  56. A(, ) = ;
  57. A(, ) = delta_t;
  58. A(, ) = ;
  59.  
  60. MatrixXd B(, );
  61. B(, ) = pow(delta_t, ) / ;
  62. B(, ) = delta_t;
  63.  
  64. MatrixXd H(, );//测量的是小车的位移,速度为0
  65. H(, ) = ;
  66. H(, ) = ;
  67.  
  68. MatrixXd Q(, );//过程激励噪声协方差,假设系统的噪声向量只存在速度分量上,且速度噪声的方差是一个常量0.01,位移分量上的系统噪声为0
  69. Q(, ) = ;
  70. Q(, ) = ;
  71. Q(, ) = ;
  72. Q(, ) = 0.01;
  73.  
  74. MatrixXd R(, );//观测噪声协方差,测量值只有位移,它的协方差矩阵大小是1*1,就是测量噪声的方差本身。
  75. R(, ) = ;
  76.  
  77. //time初始化,产生时间序列
  78. vector<double> time(, );
  79. for (decltype(time.size()) i = ; i != num; ++i) {
  80. time[i] = i * delta_t;
  81. //cout<<time[i]<<endl;
  82. }
  83.  
  84. MatrixXd X_real(, );
  85. vector<MatrixXd> x_real, rand;
  86. //生成高斯分布的随机数
  87. for (int i = ; i<; ++i) {
  88. MatrixXd a(, );
  89. a(, ) = generateGaussianNoise(, sqrt());
  90. rand.push_back(a);
  91. }
  92. //生成真实的位移值
  93. for (int i = ; i < num; ++i) {
  94. X_real(, ) = 0.5 * acc * pow(time[i], );
  95. X_real(, ) = ;
  96. x_real.push_back(X_real);
  97. }
  98.  
  99. //变量定义,包括状态预测值,状态估计值,测量值,预测状态与真实状态的协方差矩阵,估计状态和真实状态的协方差矩阵,初始值均为零
  100. MatrixXd X_evlt = MatrixXd::Constant(, , ), X_pdct = MatrixXd::Constant(, , ), Z_meas = MatrixXd::Constant(, , ),
  101. Pk = MatrixXd::Constant(, , ), Pk_p = MatrixXd::Constant(, , ), K = MatrixXd::Constant(, , );
  102. vector<MatrixXd> x_evlt, x_pdct, z_meas, pk, pk_p, k;
  103. x_evlt.push_back(X_evlt);
  104. x_pdct.push_back(X_pdct);
  105. z_meas.push_back(Z_meas);
  106. pk.push_back(Pk);
  107. pk_p.push_back(Pk_p);
  108. k.push_back(K);
  109.  
  110. //开始迭代
  111. for (int i = ; i < num; ++i) {
  112. //预测值
  113. X_pdct = A * x_evlt[i - ] + B * acc;
  114. x_pdct.push_back(X_pdct);
  115. //预测状态与真实状态的协方差矩阵,Pk'
  116. Pk_p = A * pk[i - ] * A.transpose() + Q;
  117. pk_p.push_back(Pk_p);
  118. //K:2x1
  119. MatrixXd tmp(, );
  120. tmp = H * pk_p[i] * H.transpose() + R;
  121. K = pk_p[i] * H.transpose() * tmp.inverse();
  122. k.push_back(K);
  123. //测量值z
  124. Z_meas = H * x_real[i] + rand[i];
  125. z_meas.push_back(Z_meas);
  126. //估计值
  127. X_evlt = x_pdct[i] + k[i] * (z_meas[i] - H * x_pdct[i]);
  128. x_evlt.push_back(X_evlt);
  129. //估计状态和真实状态的协方差矩阵,Pk
  130. Pk = (MatrixXd::Identity(, ) - k[i] * H) * pk_p[i];
  131. pk.push_back(Pk);
  132. }
  133.  
  134. cout << "含噪声测量" << " " << "后验估计" << " " << "真值" << " " << endl;
  135. for (int i = ; i < num; ++i) {
  136. cout<<z_meas[i]<<" "<<x_evlt[i](,)<<" "<<x_real[i](,)<<endl;
  137. fout << z_meas[i] << " " << x_evlt[i](, ) << " " << x_real[i](, ) << endl;
  138. }
  139.  
  140. fout.close();
  141. getchar();
  142. return ;
  143. }
  144.  
  145. 下面是python画图代码:
  1. #! /usr/bin/env python
  2.  
  3. import os
  4. import math
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7.  
  8. def mean(data):
  9. sum=0
  10. for i in data:
  11. sum = sum+i
  12. return sum/len(data)
  13.  
  14. if __name__ == "__main__":
  15.  
  16. file1 = "/media/kuang/code_test/result.txt"
  17.  
  18. frame=[]
  19. measure_noise = []
  20. post_eval = []
  21. groundtruth = []
  22. counter = 0
  23.  
  24. # Read all data
  25. document1 = open(file1,'rw+')
  26. for line1 in document1:
  27. split_line1 = line1.split()
  28. counter = counter + 1
  29. frame.append(counter)
  30. measure_noise.append(float(split_line1[0]))
  31. post_eval.append(float(split_line1[1]))
  32. groundtruth.append(float(split_line1[2]))
  33. document1.close()
  34.  
  35. START = 0
  36. END = len(frame)-1 #
  37. frame_sub = frame[START:END]
  38. measure_noise_sub = measure_noise[START:END]
  39. post_eval_sub = post_eval[START:END]
  40. groundtruth_sub = groundtruth[START:END]
  41.  
  42. fig, ax1 = plt.subplots()
  43.  
  44. color = 'blue'
  45. ax1.set_xlabel('Frame No.')
  46. ax1.set_ylabel('measure noise', color=color)
  47. ax1.set_ylim(-10,500)
  48. ax1.plot(frame_sub, measure_noise_sub,'s-', color=color)
  49. ax1.tick_params(axis='y', labelcolor=color)
  50.  
  51. ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis
  52. color = 'red'
  53. ax2.set_ylabel('post eval', labelpad=40,color=color) # we already handled the x-label with ax1
  54. ax2.set_ylim(-10,500)
  55. ax2.plot(frame_sub, post_eval_sub, 's-',color=color)
  56. ax2.tick_params(axis='y',pad=30.0, labelcolor=color)
  57.  
  58. ax3 = ax1.twinx()
  59. color = 'yellow'
  60. ax3.set_ylabel('groundtruth', color=color, labelpad=30)
  61. ax3.set_ylim(-10,500)
  62. ax3.tick_params(axis='y', labelcolor=color)
  63. ax3.plot(frame_sub, groundtruth_sub, 's-' , color=color)
  64.  
  65. fig.tight_layout() # otherwise the right y-label is slightly clipped
  66. ax1.grid()
  67. plt.title("Kalman Test")
  68. plt.show()
  69.  
  70. # 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. 教妹学 Java:动态伴侣 Groovy

    ​ 00.故事的起源 “二哥,听说上一篇<多线程>被 CSDN 创始人蒋涛点赞了?”三妹对她提议的<教妹学 Java>专栏一直很关心. “嗯,有点激动.刚开始还以为是个马甲,没 ...

  2. 黄聪:mysql的SQL_CALC_FOUND_ROWS 使用 类似count(*) 使用性能更高

    mysql的SQL_CALC_FOUND_ROWS 使用 类似count(*) 使用性能更高 在很多分页的程序中都这样写: SELECT COUNT(*) from `table` WHERE ... ...

  3. 转Ubuntu 16.04 创建无线热点

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ac_dao_di/article/deta ...

  4. SQLPrompt8.2 安装之后找不到激活入口

    如果你发现是这样的,找不到像其他人说的serial number这个选项,不要惊慌.. 首先你得先断网,然后再打开sql客户端,点击Manage License ,然后你会看到 activate 这个 ...

  5. PHP语法入门以及变量

    1PHP语法入门 1.1PHP是编译型语言      编译语言和解释语言的区别在于是否保存最终的可执行程序. 1.2PHP定界符       因为PHP是脚本语言,所以需要定界符 <?php e ...

  6. Python中使用requests和parsel爬取喜马拉雅电台音频

    场景 喜马拉雅电台: https://www.ximalaya.com/ 找到一步小说音频,这里以下面为例 https://www.ximalaya.com/youshengshu/16411402/ ...

  7. 关于Spring Boot你不得不知道的事

    1 Spring Boot官网[2.1.5 CURRENT GA] 1.1 Pivotal Wiki Pivotal Software, Inc. is a software and services ...

  8. IDEA创建maven web工程

    一.新建一个maven web工程 step1 File --> New --> Project step2 按下图步骤操作 step3 填写项目信息 step4 选择本地的maven安装 ...

  9. 【转载】每个 Android 开发者必须知道的消息机制问题总结

    Android的消息机制几乎是面试必问的话题,当然也并不是因为面试,而去学习,更重要的是它在Android的开发中是必不可少的,占着举足轻重的地位,所以弄懂它是很有必要的.下面就来说说最基本的东西. ...

  10. 【转载】Gradle for Android 第六篇( 测试)

    由于现阶段Android开发趋于敏捷开发,再加上国内大大小小的互联网公司都在做app,导致很多这会是一个系列,所以如果你看完这篇文章,请看下列文章: 开发人员对单元测试没有基本的概念,但是本篇博文不会 ...