一叶知舟 发表于 2012-12-9 20:19:41

卡尔曼滤波过程噪声和测量噪声方差如何选取

大家好,小弟最近刚开始弄MPU6050,想使用卡尔曼作为我的滤波方法
现在碰到一个问题就是:过程噪声的方差Q和测量噪声的方差R如何选取的问题

之前看过一个入门帖,温度的例子
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1487&reltid=2161&pre_thread_id=0&pre_pos=1&ext=
这里Q=1e-6,R=1e-1但也没有提如何选取。网上收了下是根据经验选取{:soso_e103:}

然后在坛子里找到个帖子
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=681
角度的方差噪声,给了0.01,不太清楚如何给的

小弟现在已经有MPU6050二十分钟的静态数据,
请问
1、我该如何从该组数据中提取测量方差R?
2、过程噪声Q又如如何确定?

谢谢各位了{:soso_e154:}

提供下温度模拟示例Matlab代码

clear
N=116;
%w(1)=0;
%w=randn(1,N);
w=0;                  %系统控制矩阵
x(1)=0;
a=1;                  %温度模拟A为1
V=randn(1,N);
q1=std(V);
%Rvv=q1.^2;
Rvv=0.1;            %测量过程协方差 温度模拟R为1e-1
q2=std(x);
Rxx=q2.^2;
q3=std(w);
%Rww=q3.^2;
%Rww=0.000001         %温度模拟Q为1e-6
Rww = 0.000001;       %静态数据的方差
%c=0.6;
c=1;                  %温度模拟H为1

for k=1:N;
Y(k)=25+sqrt(0.1)*randn(1);%温度模拟平均温度为25度 方差(协方差)为0.1的温度输入 测量方程,其中V为测量系统的噪声,c为测量系统的参数
end

p(1)=10;            %协方差 初始值
s(1)=1;               %最优估计 初始值
for t=2:N;
s(t)=a*s(t-1)+w;               %先验估计 求当前时刻的估计值
p1(t)=a.^2*p(t-1)+Rww;         %协方差估计 求当前时刻的估计值的偏差,a为系统参数,没有控制量,所以没有参数b,Rww为噪声
b(t)=c*p1(t)/(c.^2*p1(t)+Rvv);   %求Kg,b(t)为Kg,即Kalman增量
s(t)=a*s(t)+b(t)*(Y(t)-a*c*s(t));%后验估计 求t时刻的最优值,即当前时刻的最优值
p(t)=p1(t)-c*b(t)*p1(t);         %后验协方差 求当前最状态最优值的偏差,即式子5:(1-c*b(t))*p1(t)
end

figure(1);
plot(Y,'g--');hold on;
plot(s,'r--');hold on;



还有MPU6050的静态数据



johnsonzzd 发表于 2012-12-12 11:09:44

本帖最后由 johnsonzzd 于 2012-12-12 11:17 编辑

你的数据,9列各是什么东西?
数学模型:角速度积分得出角度。角速度传感器的零漂等对应模型噪声Q,这个值要小。模型不准,啥都白搭。
测量:加速度值测出来的角度。测量值的方差就是测量方差R。这个值大小不重要,估计一下就行了。

你的温度例子有点复杂,给你写一个简单的便于理解
clc; clear
N=200;
for t=1:N
    z(t)=25+3*randn;   %测量值
end
R=std(z)^2             %测量噪声

V=0.1*randn(1,N);
Q=std(V)^2             %模型噪声

p(1)=10;
x(1)=0;
for t=2:N;
    x1(t)=x(t-1);                      %预测状态
    p1(t)=p(t-1)+Q;               %预测估计协方差
   
    k(t)=p1(t)/(p1(t)+R);         %最优卡尔曼增益
    x(t)=x1(t)+k(t)*(z(t)-x1(t));   %更新状态估计
    p(t)=(1-k(t))*p1(t);                %更新协方差估计
end

t=1:N;
plot(,,'g',t,z,'b',t,x,'r');
legend('真实值','测量值','估计值');



最后,MPU6050内部自己有算法,能够直接取出角度,不需要自己再写卡尔曼之类的程序了。

月,依旧故乡明 发表于 2013-4-25 02:11:34

johnsonzzd 发表于 2012-12-12 11:09 static/image/common/back.gif
你的数据,9列各是什么东西?
数学模型:角速度积分得出角度。角速度传感器的零漂等对应模型噪声Q,这个值 ...

http://www.geek-workshop.com/forum.php?mod=viewthread&tid=2747
这里面的角度置信度,角速度数据置信度指的是方差吗?都是通过数据测量计算出来的吗?这个值在滤波算法里是不是越小越好?

ioiomi 发表于 2014-7-15 23:00:06

mark       :loveliness:

bruce_gong 发表于 2015-6-30 09:22:15

那个不是ARDUINO代码吧,ARDUINO应该是C/C++代码

zhangkun24 发表于 2016-12-5 18:20:21

johnsonzzd 发表于 2012-12-12 11:09
你的数据,9列各是什么东西?
数学模型:角速度积分得出角度。角速度传感器的零漂等对应模型噪声Q,这个值 ...

大神,你好,想请教您一个问题,我现在有加速度计和陀螺仪的数据,怎么实现实现卡尔曼滤波呢?得出一个图像,有一条加速度计的曲线,一条陀螺仪的曲线,一条融合之后的曲线,关键这个图怎么得到呢,我基础比较差。
页: [1]
查看完整版本: 卡尔曼滤波过程噪声和测量噪声方差如何选取