一、简介
卡尔曼滤波(Kalman Filter)是一种有效的递归滤波器(自回归滤波器),它能够从一系列的包含统计噪声的测量中估计动态系统的状态。卡尔曼滤波广泛应用于信号处理、控制理论、自动驾驶、金融等领域。
基本公式:假设系统状态方程和测量方程为:
二、卡尔曼滤波器
//1. 结构体类型定义
typedef struct
{float LastP;//上次估算协方差 初始化值为0.02float Now_P;//当前估算协方差 初始化值为0float out;//卡尔曼滤波器输出 初始化值为0float Kg;//卡尔曼增益 初始化值为0float Q;//过程噪声协方差 初始化值为0.001float R;//观测噪声协方差 初始化值为0.543
}KFP;//Kalman Filter parameter//2. 以高度为例 定义卡尔曼结构体并初始化参数
KFP KFP_height={0.02,0,0,0,0.001,0.543};/***卡尔曼滤波器*@param KFP *kfp 卡尔曼结构体参数* float input 需要滤波的参数的测量值(即传感器的采集值)*@return 滤波后的参数(最优值)*/float kalmanFilter(KFP *kfp,float input){//预测协方差方程:k时刻系统估算协方差 = k-1时刻的系统协方差 + 过程噪声协方差kfp->Now_P = kfp->LastP + kfp->Q;//卡尔曼增益方程:卡尔曼增益 = k时刻系统估算协方差 / (k时刻系统估算协方差 + 观测噪声协方差)kfp->Kg = kfp->Now_P / (kfp->NOw_P + kfp->R);//更新最优值方程:k时刻状态变量的最优值 = 状态变量的预测值 + 卡尔曼增益 * (测量值 - 状态变量的预测值)kfp->out = kfp->out + kfp->Kg * (input -kfp->out);//因为这一次的预测值就是上一次的输出值//更新协方差方程: 本次的系统协方差付给 kfp->LastP 威下一次运算准备。kfp->LastP = (1-kfp->Kg) * kfp->Now_P;return kfp->out;}/***调用卡尔曼滤波器 实践*/
int height;
int kalman_height=0;
kalman_height = kalmanFilter(&KFP_height,(float)height);