首页 > 编程语言 >【纯代码复制粘贴即可使用】卡尔曼滤波的C++实现

【纯代码复制粘贴即可使用】卡尔曼滤波的C++实现

时间:2023-12-19 11:12:18浏览次数:40  
标签:measSize Eigen int 卡尔曼滤波 C++ 复制粘贴 VectorXd stateSize MatrixXd

使用Eigen实现卡尔曼滤波。如果实现扩展卡尔曼滤波只需将H矩阵换成雅可比的求解。

#ifndef _MYKALMAN_H
#define _MYKALMAN_H
#include <Eigen\Dense>


class KalmanFilter
{
public:
    KalmanFilter(int stateSize, int measSize,int uSize);
    ~KalmanFilter() = default;
    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);
private:
    int stateSize_; //state variable's dimenssion
    int measSize_; //measurement variable's dimession
    int uSize_; //control variables's dimenssion
    Eigen::VectorXd x_;
    Eigen::VectorXd z_;
    Eigen::MatrixXd A_;
    Eigen::MatrixXd B_;
    Eigen::VectorXd u_;
    Eigen::MatrixXd P_;//coveriance
    Eigen::MatrixXd H_;
    Eigen::MatrixXd R_;//measurement noise covariance
    Eigen::MatrixXd Q_;//process noise covariance
};

KalmanFilter::KalmanFilter(int stateSize = 0, int measSize = 0, int uSize=0) :stateSize_(stateSize), measSize_(measSize), uSize_(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_;
    Eigen::MatrixXd A_T = A.transpose();
    P = A*P*A_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_; 
    return x_;
}

void KalmanFilter::update(Eigen::MatrixXd& H,Eigen::VectorXd z_meas)
{
    H_ = H;
    Eigen::MatrixXd temp1, temp2,Ht;
    Ht = H_.transpose();
    temp1 = H_*P_*Ht + R_;
    temp2 = temp1.inverse();
    Eigen::MatrixXd K = P_*Ht*temp2;
    z_ = H_*x_;
    x_ = x_ + K*(z_meas-z_);
    Eigen::MatrixXd I = Eigen::MatrixXd::Identity(stateSize_, stateSize_);
    P_ = (I - K*H_)*P_;
}

标签:measSize,Eigen,int,卡尔曼滤波,C++,复制粘贴,VectorXd,stateSize,MatrixXd
From: https://www.cnblogs.com/linglingdog/p/17913231.html

相关文章

  • C++ 获取 vector 最大的 3 个数字
    假设现在有一个数组存储了成绩信息,要获得前三名#include<iostream>#include<vector>#include<algorithm>std::vector<int>scores{10,30,90,30,100,20,10,0,30,40,40,70,70};下面这种方法可以将前3名成绩复制到结果里,同时考虑到scores长度小于3的情况。......
  • c++学习书籍
      C++ Primer 第五版 第四版 对比 差异C++Primer是一本经典的C++编程教材,它的第五版与第四版有哪些不同点呢?首先,C++Primer第五版引入了C++11标准,讲解了C++11的新特性,例如auto类型推导、lambda表达式、右值引用、智能指针等等。这些新特性有助于提高C++程序的性能......
  • C++ Qt开发:TableWidget表格组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableWidget表格组件的常用方法及灵活运用。QTableWidget是Qt中用于显示表格数据的部件。它是......
  • C++ Qt开发:MdiArea多窗体组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍MdiArea`组件的常用方法及灵活运用。QMdiArea(MultipleDocumentInterfaceArea)是Qt中用于创建多......
  • C++基础 -9- 函数的默认参数
     ———————函数的默认参数——————— ......
  • c/c++中typedef定义结构体内成员赋初值
    写数据结构作业时遇到的问题:需要给typedef定义的结构体中的成员数组赋初值。如下:写数据结构作业时遇到的问题:需要给typedef定义的结构体中的成员数组赋初值。如下:typedefstruct{Node*nodes[maxsize];intfront,rear;}Queue;赋值方法如下:Queuenodes={{0},1,0};......
  • 不容错过的 13 个顶级 C++ 程序库
    不容错过的13个顶级C++程序库Incredibuild​已认证账号​关注 135人赞同了该文章关于C++,不论是其长达40年的发展历史,或者C++是高级还是低级编程语言的争论等等,这些内容都已老生常谈。如果你对C++库有所研究,不用我多说,大家也都心中......
  • cpp: enum in C,C++
    C:C11以上第一种方式:/***@fileduLangMap.h*@authorgeovindu,GeovinDu([email protected])*@briefvscodec11*@version0.1*@date2023-12-18**@copyrightCopyright(c)站在巨人的肩膀上StandingontheShouldersofGiants2023**/#ifnd......
  • C++图的邻接表创建
    C++图的邻接表存储结构typedefstructNode{ intnextVex; structNode*next; }*node;structHeadNode{ Eelement; structNode*next;};typedefstructGraphTable{ intvex,edge; structHeadNodeVertex[MAXV];}*Graph;图的创建函数Graphcreate(){ Grap......
  • 29道C++ 面向对象高频题整理(附答案背诵版)
    1、什么是类?在C++中,类是一种用户定义的数据类型,它可以包含数据成员和函数成员。数据成员用于存储与类相关的状态,而函数成员可以定义对这些数据进行操作的方法。可以把类想象为一个蓝图,根据这个蓝图可以创建对象,这些对象在内存中是类的实例。比如说,我们可以定义一个Car类来表示汽......