卡尔曼滤波--使用心得与体会与C代码块

卡尔曼滤波是一种观测器,他的核心在于对 测量值与估计值进行数据融合。
关于内容和推导最后面会给出参考文章和视频链接。
公式和公式融合需要借助MATLAB进行矩阵运算推导,所以感叹MAT的强大。
代码部分是很简单的一个流水模型,称重和流量作为数据融合的两个参考。


一、直接给代码

1.欢迎批评指正

代码如下:

#include <iostream>
#include <stdio.h>
#include "stdlib.h"
#include <string.h>
using namespace std;

double spray_weightsensor_val;//测量称重
double weight_mea = 0.0;//输入称重

double rate[2] = {0.0};//测量流量
double fr_mea = 0.0;//输入流量

double weight_k_pre = 0.0;//先验称重预测
double weight_k_est = 0.0;//后验称重估计
double q_k_pre = 0.0;//先验流量预测
double q_k_est = 0.0;//后验流量估计

double dt = 1.0;
double W1 = 0.0;//过程噪声
/* A[][] = {1 , -dt
            0 ,  1} */
double zk_we = 0.0;//观测值
double zk_fr = 0.0;//观测值
double Hat[2][2] = {1.0f,0.0,
                    0.0,1.0f};

double V_1K = 0.0;//观测噪声
double V_2K = 0.0;//观测噪声

double Pk_pre[2][2] = {0,0,
                       0,0};//先验误差方差

double Pk_est[2][2] = {0,0,
                       0,0};//更新误差方差
/* 超参数 */
double Q[2][2] = {1,0,
                  0,1};//过程噪声方差=协方差矩阵
double R[2][2] = {1,0,
                  0,1};//观测噪声方差=协方差矩阵

double K_kal[2][2] = {0,0,
                      0,0};//卡尔曼增益
double Jes = 0.0;//Kalman增益分母简化 

int main()
{
    /* 传感器测量数据 */
    /* 200ms进入一次 */
    fr_mea = (rate[0] + rate[1]) /  60.0 / 5.0 / 2;// g/200ms / 2 
    weight_mea = spray_weightsensor_val;//0:传感器观测值
    
    /* ==============预测============== */
    /* 1:先验估计 */
    weight_k_pre = weight_k_est - (dt * q_k_est) + W1; 
    q_k_pre = q_k_est + W1;

    zk_we = weight_mea * Hat[0][0] + V_1K;//Z_1k
    zk_fr = fr_mea * Hat[0][0] + V_2K; //Z_2k

    /* 2:先验误差的协方差矩阵 = 误差方差 */
    Pk_pre[0][0] = Pk_est[0][0] - dt * Pk_est[1][0] - dt * Pk_est[0][1] + dt*dt * Pk_est[1][1] + Q[0][0];  //P0
    Pk_pre[0][1] = Pk_est[0][1] - dt * Pk_est[1][1]; //P1
    Pk_pre[1][0] = Pk_est[1][0] - dt * Pk_est[1][1]; //P2
    Pk_pre[1][1] = Pk_est[1][1] + Q[1][1]; //P3
    /* ================矫正=============== */
    /* 3:求卡尔曼增益 */
    Jes = Pk_pre[0][0]*Pk_pre[1][1] - Pk_pre[0][1] * Pk_pre[1][0] + Pk_pre[0][0] * R[1][1] + Pk_pre[1][1]*R[0][0] + R[0][0] * R[1][1];
    K_kal[0][0] = (Pk_pre[0][0]*(Pk_pre[1][1]+R[1][1]) - Pk_pre[0][1]*Pk_pre[1][0])/Jes;
    K_kal[0][1] = (Pk_pre[0][1]*(Pk_pre[0][0]+R[0][0]) - Pk_pre[0][0]*Pk_pre[0][1])/Jes;
    K_kal[1][0] = (Pk_pre[1][0]*(Pk_pre[1][1]+R[1][1]) - Pk_pre[1][0]*Pk_pre[1][1])/Jes;
    K_kal[1][1] = (Pk_pre[1][1]*(Pk_pre[0][0]+R[0][0]) - Pk_pre[0][1]*Pk_pre[1][0])/Jes;
    /* 4:后验估计 */
    weight_k_est = weight_k_pre + K_kal[0][0]*(zk_we-Hat[0][0]*weight_k_pre)+K_kal[0][1]*(zk_fr-Hat[1][1]*q_k_pre);
    q_k_est = q_k_pre + K_kal[1][0] * (zk_we - Hat[0][0]*weight_k_pre) + K_kal[1][1]*(zk_fr-Hat[1][1]*q_k_pre);
    /* 5: 更新误差的协方差矩阵 */
    Pk_est[0][0] = 0 - Pk_pre[0][0]*(Hat[0][0]*K_kal[0][0] - 1) - Hat[1][1] * K_kal[0][1] * Pk_pre[1][0];
    Pk_est[0][1] = 0 - Pk_pre[0][1]*(Hat[0][0]*K_kal[0][0] - 1) - Hat[1][1] * K_kal[0][1] * Pk_pre[1][1];
    Pk_est[1][0] = 0 - Pk_pre[1][0]*(Hat[1][1]*K_kal[1][1] - 1) - Hat[0][0] * K_kal[1][0] * Pk_pre[0][0];
    Pk_est[1][1] = 0 - Pk_pre[1][1]*(Hat[1][1]*K_kal[1][1] - 1) - Hat[0][0] * K_kal[1][0] * Pk_pre[0][1];




    return 0;
}

总结

DR_CAN-卡尔曼滤波推导与介绍
一种比较容易入门的卡尔曼介绍文章与实战

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
卡尔曼滤波器和神经网络是两种不同的技术,分别在信号处理和人工智能领域有广泛的应用。 卡尔曼滤波器是一种用于估计不确定过程的滤波器。它使用了一种递归方法来估计系统的状态,这种方法基于对过去和现在的观测值进行线性最小方差优化。卡尔曼滤波器在许多应用中都非常有用,包括传感器数据融合、机器人导航和控制系统等。 神经网络是一种深度学习技术,它使用人工神经元模拟人脑的工作方式。神经网络通过学习大量数据来识别模式和预测新的数据。它们在许多应用中都非常有用,包括图像识别、语音识别、自然语言处理和机器学习等。 将卡尔曼滤波器和神经网络结合使用可能可以提高模型的性能。卡尔曼滤波器可以用于提供输入数据的高精度估计,而神经网络则可以学习从这些估计中提取有用的信息。例如,神经网络可以用于预测未来的状态或识别异常值,而卡尔曼滤波器则可以提供这些预测或识别所需的输入数据的高精度估计。这种结合使用的方法通常被称为卡尔曼神经网络(Kalman Neural Network)或卡尔曼深度学习(Kalman Deep Learning)。 值得注意的是,虽然卡尔曼滤波器和神经网络可以结合使用,但它们并不是互斥的。许多应用可以使用单一的技术来实现,而不需要结合使用这两种技术。因此,选择使用哪种技术取决于具体的应用需求和数据特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cap reagan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值