卡尔曼滤波算法的代码验证

卡尔曼滤波算法它能够从一系列的不完全及包含噪声的测量中,估计动态系统的状态,实践中得到广泛应用,场景包括控制系统参数估计,移动预测等等,在深度学习中也常常用来配合神经网络输出做后处理,应用于目标跟踪等场景, 自动化专业在讲现代控制理论的时候会讲。

测试代码在:

GitHub - 13824125580/kalmanfilter-cpp: A basic Kalman Filter implementation in C++ using the Eigen library.https://github.com/13824125580/kalmanfilter-cpp.git

代码下载后,编译运行步骤如下。

1.安装eigen3

eigen3是一套高效的线性代数运行库,安装命令如下:

sudo apt-get install libeigen3-dev

具体用法可以参考下面这篇博客

ubuntu18.04安装eigen算法库_papaofdoudou的博客-CSDN博客_ubuntu18安装eigen

2.编译源码

源码下载后的目录结构如下图所示:

用例使用cmake编译,创建编译目录build,进入build目录,执行 cmake ../生成编译文件

之后执行make 编译,编译后,生成可执行测试程序kalman-test文件

测试

执行kalman-test用例,输出如下:

测试输出中的x_hat则是对下图中的测量值的经过卡尔曼滤波算法之后的输出值。

matlab kalman滤波实现

N=200;
w(1)=0;
w=randn(1,N)  % White Gaussian Noise of Prediction

x(1)=25;
a=1;  % prediction parameter
for k=2:N;
  x(k)=a*x(k-1)+w(k-1);
end

V=randn(1,N); % White Gaussian Noise of Measurement
q1=std(V);
Rvv=q1.^2; % covariance of Measurement
q2=std(x);
Rxx=q2.^2;
q3=std(w);
Rww=q3.^2; % covariance of prediction
c=0.2;   % measurement parameter
Y=c*x+V;

p(1)=10;  % initial prediction result
s(1)=26;  % initial optimal result
for t=2:N;
  p1(t)=a.^2*p(t-1)+Rww;  % covariance of t-1
  b(t)=c*p1(t)/(c.^2*p1(t)+Rvv); % kalman gain
  s(t)=a*s(t-1)+b(t)*(Y(t)-a*c*s(t-1)); % optimal result
  p(t)=p1(t)-c*b(t)*p1(t); % covariance of t
end

t=1:N;
plot(t,s,'r',t,Y,'g',t,x,'b',t,w,'m');

用OCTAVE验证:


参考资料:

卡尔曼滤波器|Little Stone - Huan Li's Blog

结束

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当使用C语言编写卡尔曼滤波算法时,可以通过创建一个结构体来表示卡尔曼滤波器,并根据算法的步骤进行实现。以下是一个简单的示例代码,演示了如何使用C语言实现卡尔曼滤波算法并进行验证。 ```c #include <stdio.h> // 定义卡尔曼滤波器结构体 typedef struct { float x; // 状态估计 float P; // 估计误差协方差 float Q; // 系统噪声协方差 float R; // 测量噪声协方差 float K; // 卡尔曼增益 } KalmanFilter; // 初始化卡尔曼滤波器 void kalmanFilterInit(KalmanFilter* filter, float initial_x, float initial_P, float Q, float R) { filter->x = initial_x; filter->P = initial_P; filter->Q = Q; filter->R = R; } // 更新卡尔曼滤波器状态估计估计误差协方差 void kalmanFilterUpdate(KalmanFilter* filter, float measurement) { // 预测步骤 float x_predict = filter->x; float P_predict = filter->P + filter->Q; // 更新步骤 filter->K = P_predict / (P_predict + filter->R); filter->x = x_predict + filter->K * (measurement - x_predict); filter->P = (1 - filter->K) * P_predict; } int main() { // 初始化卡尔曼滤波器 KalmanFilter filter; kalmanFilterInit(&filter, 0.0, 1.0, 0.01, 0.1); // 模拟测量数据 float measurements[] = {1.2, 1.4, 1.6, 1.8, 2.0}; // 使用卡尔曼滤波器进行滤波 int num_measurements = sizeof(measurements) / sizeof(measurements[0]); for (int i = 0; i < num_measurements; i++) { kalmanFilterUpdate(&filter, measurements[i]); printf("Filtered measurement %d: %.2f\n", i+1, filter.x); } return 0; } ``` 在上述代码中,我们首先定义了一个`KalmanFilter`结构体来表示卡尔曼滤波器。然后,我们实现了`kalmanFilterInit`函数来初始化滤波器,并实现了`kalmanFilterUpdate`函数来更新滤波器状态。 在主函数中,我们先初始化卡尔曼滤波器,并模拟一系列测量数据。然后,通过循环将每个测量值输入卡尔曼滤波器进行滤波,并打印滤波后的结果。 您可以根据自己的需求和数据进行验证,以确保卡尔曼滤波器的性能和预期一致。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

papaofdoudou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值