R2_UP/User/Algorithm/kalman.c

66 lines
3.1 KiB
C
Raw Permalink Normal View History

2025-03-12 10:46:02 +08:00
/**
* @author Liu heng
* RoboMaster论坛
*
* 使kalman指针kalmanCreate()
* KalmanFilter()
* 使
* extKalman p; //定义一个卡尔曼滤波器结构体
* float SersorData; //需要进行滤波的数据
* KalmanCreate(&p,20,200); //初始化该滤波器的Q=20 R=200参数
* while(1)
* {
* SersorData = sersor(); //获取数据
* SersorData = KalmanFilter(&p,SersorData); //对数据进行滤波
* }
*/
#include "kalman.h"
/**
* @name kalmanCreate
* @brief
* @param p:
* T_Q:
* T_R:
*
* @retval none
* @attention R固定Q越大Q无穷代表只用测量值
* Q越小代表越信任模型预测值Q为零则是只用模型预测
*/
void KalmanCreate(extKalman_t *p,float T_Q,float T_R)
{
p->X_last = (float)0;
p->P_last = 0;
p->Q = T_Q;
p->R = T_R;
p->A = 1;
p->B = 0;
p->H = 1;
p->X_mid = p->X_last;
}
/**
* @name KalmanFilter
* @brief
* @param p:
* dat:
* @retval
* @attention Z(k), X(k|k),
* A=1 B=0 H=1 I=1 W(K) V(k),,
* 5
* H',
*/
float KalmanFilter(extKalman_t* p,float dat)
{
p->X_mid =p->A*p->X_last; //百度对应公式(1) x(k|k-1) = A*X(k-1|k-1)+B*U(k)+W(K)
p->P_mid = p->A*p->P_last+p->Q; //百度对应公式(2) p(k|k-1) = A*p(k-1|k-1)*A'+Q
p->kg = p->P_mid/(p->P_mid+p->R); //百度对应公式(4) kg(k) = p(k|k-1)*H'/(H*p(k|k-1)*H'+R)
p->X_now = p->X_mid+p->kg*(dat-p->X_mid); //百度对应公式(3) x(k|k) = X(k|k-1)+kg(k)*(Z(k)-H*X(k|k-1))
p->P_now = (1-p->kg)*p->P_mid; //百度对应公式(5) p(k|k) = (I-kg(k)*H)*P(k|k-1)
p->P_last = p->P_now; //状态更新
p->X_last = p->X_now;
return p->X_now; //输出预测结果x(k|k)
}