卡尔曼滤波C++代码

news/2024/11/24 6:52:39/

卡尔曼滤波C++代码

卡尔曼滤波预测和更新两部分,卡尔曼滤波主要实现预测过程个更新过程;因此在代码实现的时候需要完成四部分

  1. 变量定义
    2)变量形状设置(由构造函数实现)
    3) 初始化,送入初始的状态量和协方差
    4) 预测过程
    使用状态转化方程完成状态量的先验估计,然后根据初始的协方差更新先验估计的协方差;
    5)更新过程
    首先需要从系统中得到当前时刻的观测量(该值是直接从系统中得到的,不需要再代码计算,因为是使用卡尔曼增益来平衡真实观察量与先验估计值的比例);这里需要观测矩阵,和观测噪声的协方差;
#define _MYKALMAN_H
#define _MYKALMAN_H
#include<iostream>
#include <Eigen\Dense>class KalmanFilter
{
private:int stateSize; //state variable's dimenssionint measSize; //measurement variable's dimessionint uSize; //control variables's dimenssionEigen::VectorXd x;  //状态量Eigen::VectorXd z;  //观测量Eigen::MatrixXd A;  //状态转移矩阵Eigen::MatrixXd B;  //控制矩阵Eigen::VectorXd u;  //输入矩阵Eigen::MatrixXd P;  //先验估计协方差Eigen::MatrixXd H;  //观测矩阵Eigen::MatrixXd R;  //测量噪声协方差Eigen::MatrixXd Q;  //过程噪声协方差
public:KalmanFilter(int stateSize_, int measSize_, int uSize_);~KalmanFilter() {}void init(Eigen::VectorXd& x_, Eigen::MatrixXd& P_, Eigen::MatrixXd& R_, Eigen::MatrixXd& Q_);Eigen::VectorXd predict(Eigen::MatrixXd& A_);Eigen::VectorXd predict(Eigen::MatrixXd& A_, Eigen::MatrixXd& B_, Eigen::VectorXd& u_);void update(Eigen::MatrixXd& H_, Eigen::VectorXd z_meas);
};KalmanFilter::KalmanFilter(int stateSize_ = 0, int measSize_ = 0, int uSize_ = 0) :stateSize(stateSize_), measSize(measSize_), uSize(uSize_)
// sateSize状态量个数
// uSize输入的维度
// 
{if (stateSize == 0 || measSize == 0){std::cerr << "Error, State size and measurement size must bigger than 0\n";}x.resize(stateSize);x.setZero();A.resize(stateSize, stateSize);A.setIdentity();u.resize(uSize);u.transpose();u.setZero();B.resize(stateSize, uSize);B.setZero();P.resize(stateSize, stateSize);P.setIdentity();H.resize(measSize, stateSize);H.setZero();z.resize(measSize);z.setZero();Q.resize(stateSize, stateSize);Q.setZero();R.resize(measSize, measSize);R.setZero();
}//初始化,卡尔曼滤波初始化只需要初始化初始状态,初始协方差矩阵,初始过程噪声协方差,初始化观测噪声协方差
void KalmanFilter::init(Eigen::VectorXd& x_, Eigen::MatrixXd& P_, Eigen::MatrixXd& R_, Eigen::MatrixXd& Q_)
{x = x_;P = P_;R = R_;Q = Q_;
}//有输入矩阵和控制矩阵的卡尔曼滤波预测过程
Eigen::VectorXd KalmanFilter::predict(Eigen::MatrixXd& A_, Eigen::MatrixXd& B_, Eigen::VectorXd& u_)
{A = A_;B = B_;u = u_;x = A * x + B * u;//根据时刻t-1的状态由状态转换举着预测时刻t的先验估计值,//因为当前是使用系统的状态转移矩阵来进行预测时刻t的预测值,并不清楚过程噪声如何,所以不适用过程噪声Eigen::MatrixXd A_T = A.transpose();P = A * P * A_T + Q;//时刻t先验估计值的的协方差,Q为过程噪声的协方差return x;
}//没有输入矩阵和控制矩阵的卡尔曼滤波预测过程
Eigen::VectorXd KalmanFilter::predict(Eigen::MatrixXd& A_)
{A = A_;x = A * x;Eigen::MatrixXd A_T = A.transpose();P = A * P * A_T + Q;//  cout << "P-=" << P<< endl;return x;
}void KalmanFilter::update(Eigen::MatrixXd& H_, Eigen::VectorXd z_meas)
// H_   观测矩阵
//z_means 观测量,由系统真实观测输入
{H = H_;Eigen::MatrixXd temp1, temp2, Ht;Ht = H.transpose();temp1 = H * P * Ht + R;temp2 = temp1.inverse();//(H*P*H'+R)^(-1)Eigen::MatrixXd K = P * Ht * temp2;z = H * x;x = x + K * (z_meas - z);Eigen::MatrixXd I = Eigen::MatrixXd::Identity(stateSize, stateSize);//Identity()单位阵P = (I - K * H) * P;//  cout << "P=" << P << endl;
}

http://www.ppmy.cn/news/661387.html

相关文章

用卡尔曼滤波处理轨迹

卡尔曼滤波这个词老是听到&#xff0c;一直也没有耐心看&#xff0c;最近准备看看轨迹挖掘相关的东西&#xff0c;第一步轨迹处理中卡尔曼滤波就又出现了&#xff0c;终于耐着性子研究了两天(一看一堆矩阵就脑壳痛&#xff09;&#xff0c;期间网上找了不少代码和博客&#xff…

卡尔曼滤波Q、R如何调节?

转载&#xff1a;作者&#xff1a;小心假设 链接&#xff1a;https://www.zhihu.com/question/30481204/answer/50092960 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 跑题一个&#xff0c;说几个准则吧。只是准则&…

string类学习

本篇将深入学习string类&#xff0c;通过各个测试函数玩遍cstring类&#xff0c;学到就是赚到&#xff01;&#xff01;&#xff01; 文章目录 1.头文件和源文件1.1源文件1.2头文件 2.构造函数3.赋值重载函数4.元素访问运算符5.迭代器5.1正向迭代器5.2反向迭代器 6.添加字符串…

模糊 (一)运动模糊失焦模糊 去卷积盲去卷积

&#xff08;一&#xff09;去空间不变的模糊核 1&#xff09;维纳滤波 一个理想点经过相机后成的像由点扩散函数PSF(Point Spread Function)来描述。 线性移不变的PSF导致的图像模糊&#xff1a;bc*xn n是噪声 例如衍射极限PSF 相机抖动模糊 直接去卷积会放大系统中高频部…

模糊集介绍

https://wenku.baidu.com/view/acb754583d1ec5da50e2524de518964bcf84d29a.html

汉语拼音的模糊音扩展(用于搜索纠错)

由于现在使用拼音输入法较多&#xff0c;很可能输入同音字而无法搜索到结果&#xff0c;或者由于普通话不标准&#xff08;前后鼻音不分&#xff09;输入了错误的拼音。例如用户想搜索”牛奶“却输入了刘来&#xff08;liulai&#xff09;&#xff0c;那我们可以对liulai进行模…

Vue-cli3 ,js根据汉字或拼音模糊搜索功能,汉字支持同音字、多音字,支持首字母

输入汉字模糊查询同音字&#xff0c;多音字&#xff0c;支持首字母&#xff0c; 目标用户为视障人士&#xff0c;需求是&#xff1a; 匹配字段&#xff1a;“行为” 。 可以使用 “兴魏”&#xff0c;“性未”&#xff0c;“xw”&#xff0c;“xingwei” &#xff0c;“航为”…

jquery easyui实现汉字拼音首字母模糊查询

本片文章并非原创&#xff0c;而是将网上的方法整理了一下&#xff1b;网上给出的代码不一定完全适合自己的项目&#xff0c;具体的要更加自己的情况修改&#xff1b; 不要直接复制粘贴代码&#xff0c;这样是行不通的&#xff1b;自己要理解前人这样实现的目的和原理 在实现…