ROS中EKF(扩展卡尔曼跟踪)的使用

0.简版(更新于2020年最后一天)

#include <bfl/wrappers/matrix/matrix_wrapper.h>
#include <bfl/filter/extendedkalmanfilter.h>
#include <bfl/model/linearanalyticsystemmodel_gaussianuncertainty.h>
#include <bfl/model/linearanalyticmeasurementmodel_gaussianuncertainty.h>
#include <bfl/pdf/linearanalyticconditionalgaussian.h>
#include <fstream>
#include <iostream>

using namespace std;
using namespace BFL;
using namespace MatrixWrapper;

class MYEKF
{
   
public:
    BFL::Gaussian prior_;
    BFL::ExtendedKalmanFilter *filter_;
    BFL::LinearAnalyticConditionalGaussian *sys_pdf_;
    BFL::LinearAnalyticSystemModelGaussianUncertainty *sys_model_;
    BFL::LinearAnalyticConditionalGaussian *meas_pdf_;
    BFL::LinearAnalyticMeasurementModelGaussianUncertainty *meas_model_;
    MatrixWrapper::Matrix sys_matrix_;
    MatrixWrapper::SymmetricMatrix sys_sigma_;
    float time_;

    MYEKF() : filter_(NULL),
              sys_pdf_(NULL),
              sys_model_(NULL),
              meas_pdf_(NULL),
              meas_model_(NULL),
              sys_matrix_(6, 6) {
   }

    void Init(float x, float y, float t)
    {
   
        sys_matrix_ = 0;
        for (unsigned int i = 1; i <= 3; i++)
        {
   
            sys_matrix_(i, i) = 1;
            sys_matrix_(i + 3, i + 3) = 0.9;
        }
        // 噪声的u和sigma,sys_noise即Q
        ColumnVector sys_mu(6);
        sys_mu = 0;
        sys_sigma_ = SymmetricMatrix(6);
        sys_sigma_ = 0;
        for (unsigned int i = 0; i < 3; i++)
        {
   
            sys_sigma_(i + 1, i + 1) = pow(0.05, 2);
            sys_sigma_(i + 4, i + 4) = pow(1.0, 2);
        }
        Gaussian sys_noise(sys_mu, sys_sigma_);
        //
        sys_pdf_ = new LinearAnalyticConditionalGaussian(sys_matrix_, sys_noise);
        sys_model_ = new LinearAnalyticSystemModelGaussianUncertainty(sys_pdf_);

        // =============================create meas model
        // meas_matrix即H
        Matrix meas_matrix(3, 6);
        meas_matrix = 0;
        for (unsigned int i = 1; i <= 3; i++)
            meas_matrix(i, i) = 1;
        // 噪声的u和sigma,meas_noise即R
        ColumnVector meas_mu(3);
        meas_mu = 0;
        SymmetricMatrix meas_sigma(3);
        meas_sigma = 0;
        for (unsigned int i = 0; i < 3; i++)
            meas_sigma(i + 1, i + 1) = 0;
        Gaussian meas_noise(meas_mu, meas_sigma);
        //
        meas_pdf_ = new LinearAnalyticConditionalGaussian(meas_matrix, meas_noise);
        meas_model_ = new LinearAnalyticMeasurementModelGaussianUncertainty(meas_pdf_);
        // first point
        ColumnVector mu_vec(6);
        SymmetricMatrix sigma_vec(6);
        sigma_vec = 0;
        mu_vec(1) = x;
        mu_vec(2) = y;
        mu_vec(3) = 0;
        for (unsigned int i = 0; i < 3; i++)
        {
   
            // mu_vec(i + 1) = pos[i];
            mu_vec(i + 4) = 0.0;
            sigma_vec(i + 1, i + 1) = pow(0.1, 2);
            sigma_vec(i + 4, i + 4) = pow(0.0000001, 2);
        }
        prior_ = Gaussian(mu_vec, sigma_vec);
        filter_ = new ExtendedKalmanFilter(&prior_);
        time_ = t;
    }
    bool Predict(float t)
    {
   
        // set F
        for (unsigned int i = 1; i <= 3; i++)
            sys_matrix_(i, i + 3) = t - time_;
        sys_pdf_->MatrixSet(0, sys_matrix_);

        // scale system noise for dt
        sys_pdf_->AdditiveNoiseSigmaSet(sys_sigma_ * pow(t - time_, 2));
        time_ = t;
        // update filter
        return filter_->Update(sys_model_);
    }
    bool Update(float x, float y)
    {
   
        ColumnVector meas_vec(3);
        // for (unsigned int i = 0; i < 3; i++)
        //     meas_vec(i + 1) = p[i];
        meas_vec(1) = x;
        meas_vec(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀么克瑟拉莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值