卡尔曼滤波C++代码
#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-Matlab模拟温度例子--代码比较乱,还需优化
温度模拟参数选取 xk 系统状态 实际温度 A 系统矩阵 温度不变,为1 B.uk 状态的控制量 无控制量,为0 Zk 观测值 温度计读数 H 观测矩阵 直接读出,为1 wk 过程噪声 温度变化偏差, ...
- 扩展卡尔曼滤波(MRPT)
EKF relies on a linearisation of the evolution and observation functions which are good approximatio ...
- 卡尔曼滤波(Kalman Filter)
一.引言 以下我们引用文献[1]中的一段话作为本文的開始: 想象你在黄昏时分看着一仅仅小鸟飞行穿过浓密的丛林.你仅仅能隐隐约约.断断续续地瞥见小鸟运动的闪现.你试图努力地猜測小鸟在哪里以及下一时刻它会 ...
- Google Cardboard的九轴融合算法——基于李群的扩展卡尔曼滤波
Google Cardboard的九轴融合算法 --基于李群的扩展卡尔曼滤波 极品巧克力 前言 九轴融合算法是指通过融合IMU中的加速度计(三轴).陀螺仪(三轴).磁场计(三轴),来获取物体姿态的方法 ...
- 树莓派 连接 JY901(MPU9250) python 代码
先说BUG,最近要做项目需要树莓派和陀螺仪,资金充足的话肯定是买一个硬件卡尔曼滤波的传感器类似JY901模块,资金不足的就买MPU6050. 网上关于MPU6050在树莓派上的代码还能用,关于JY90 ...
- 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...
- 卡尔曼滤波(Kalman Filter) ZZ
一.引言 以下我们引用文献[1]中的一段话作为本文的開始: 想象你在黄昏时分看着一仅仅小鸟飞行穿过浓密的丛林.你仅仅能隐隐约约.断断续续地瞥见小鸟运动的闪现.你试图努力地猜測小鸟在哪里以及下一时刻它会 ...
- 卡尔曼滤波(Kalman Filter)在目标边框预测中的应用
1.卡尔曼滤波的导论 卡尔曼滤波器(Kalman Filter),是由匈牙利数学家Rudolf Emil Kalman发明,并以其名字命名.卡尔曼出生于1930年匈牙利首都布达佩斯.1953,1954 ...
- 滤波器算法(1)-卡尔曼滤波小车附带题目与MATLAB程序
1 简介 由卡尔曼这个学者提出的最佳线性滤波器,单纯时域维度即可实现[无需进行频域变换] 2 思路 由上一时刻的最佳估计值XKE_P预测①当前时刻预测值Pxv 与 ②当前时刻的测量值Mxv 进行联立计 ...
随机推荐
- pytorch-argparse的用法
import argparse def parse(): parser = argparse.ArgumentParser() parser.add_argument('--scales',help= ...
- SqlServer ----- 拷贝数据表
两种方式,第一种方式只是把表中的字段进行拷贝,第二种把表中的关联关系,主键自增长全部拷贝. 1.把表中的关联关系,主键自增长全部拷贝. 选择需要拷贝的表,点击编辑器窗口,会看到这个表的sql 语句,主 ...
- 对并发Map的测试
/** * ConcurrentHashMap效率最高 */ public class MapTest { public static void main(String[] args) throws ...
- RadioButtonList
RadioButtonList <asp:Label ID="txt_Gender" runat="server" Text="性别" ...
- HTTP 响应的分块传输
Transfer-Encoding 响应头用于告诉客户端服务器发送内容的编码格式. 其可选值有: chunked:数据分块发送.此时应缺省 Content-Length 响应头. compress:使 ...
- Docker是什么、为什么是一种趋势
Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来.并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响.那么我就不需要专门运送水果的船和专门运 ...
- HC595驱动数码管
74HC595是一个8位串行输入.并行输出的位移缓存器 引脚定义 Q0~Q7:并行输出 Q7':串行输出 SH_CP:移位寄存器时钟输入 ST_CP:存储寄存器时钟输入 DS:串行输入 原理图 举例 ...
- 数据库 OR 运维 ____bayaim
最近一直在思考,想想未来的道路和自己努力的方向.马云曾说过现在的年轻人缺少“慢下来”,只有人慢下来才能更好思考,想好方法和目标才更靠近才成功.如果,一直不停的努力,在错误的道路越走越远,势必会浪费时间 ...
- Houdini设置
关闭网络编辑器动画 Animate network changes 平移时保持视口枢轴 Maintain Viewport Pivot when Panning 通知帮助提示将出现在Houdini的状 ...
- CodeForces - 1251E2 (思维+贪心)
题意 https://vjudge.net/problem/CodeForces-1251E2 一共有 n 个选民,你可以付出 pi 的代价让第 i 个选民为你投票,或者,在为你投票的人数达到 mi ...