极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: savagego

卡尔曼滤波学习笔记

[复制链接]
发表于 2014-3-28 16:51:35 | 显示全部楼层
savagego 发表于 2014-3-28 13:02
void calculate_xz()
{
xz=xz+t*gyro[1];

1.测量噪声的协方差是根据不同情况算的,我并没有计算是因为我用的卡尔曼假设过程和测量的噪音都是不随时间变化的,我在取样附近找了一个点收敛比较好就用了,当然如果需要可以取样拟合一下得到近似解。
2.最后要更新当前状态下X(K|K)的协方差,这样算法才能自回归算下去,这里的‘’1‘’是因为是单模型单测量,所以单位对角阵退化为1.
不知道我说的是否还有错误或者不清楚的地方,咱们继续讨论。

点评

当然,实际中R、Q的取值最后还是要根据情况进行调整的。  发表于 2014-3-28 19:26
凑个热闹咯~ 测量噪声R,工程上近似地取噪声的均方根值的平方,R=(RMS_acc)^2,这个值可以在操作手册中找到。比如ADXL345的R(x,y)= 0.75 LSB rms。对于过程噪声Q,工程上一般取噪声的均方根值的平方除以带宽。  发表于 2014-3-28 19:22
回复 支持 反对

使用道具 举报

发表于 2014-3-28 23:37:52 | 显示全部楼层
zhangzhe0617 发表于 2014-3-28 16:51
1.测量噪声的协方差是根据不同情况算的,我并没有计算是因为我用的卡尔曼假设过程和测量的噪音都是不随时 ...

@leicheng 这个我还真没注意到,受教了。这个过程噪音是最头疼的,我是还迷糊的,用一堆值试出来的,是个隐患

点评

如果你不计算 r_xz 全部用参数带入,那么第一次k(1)第二次k(2)。。。。第n次k(n) 的值都会是固定的,k值不随着测量变化总觉得哪里不对劲  发表于 2014-3-31 13:20
回复 支持 反对

使用道具 举报

发表于 2014-3-31 21:44:59 | 显示全部楼层
本帖最后由 leicheng 于 2014-3-31 22:06 编辑

savagego童鞋,俺认真看了下。
严格讲zhangzhe0617童鞋写的04句计算误差协方差有点省略:p_xz=p_xz+q_xz;公式省略了一阶和二阶小项,所以只剩下常数项了,你可以认为这里的q_xz=Q_angle *dt。
黑马的那种写法只省略了2阶小项:  P_00 += -(P_10 + P_01) * dt + Q_angle *dt;。
下面是没有省略任何项,完全按照定义推导得出的,可供你参考:
//Step 2 :先验估计  更新误差协方差矩阵 P
   P[0][0] += dt * (dt*P[1][1] - P[0][1] - P[1][0] + Q_angle);
   P[0][1] -= dt * P[1][1];
   P[1][0] -= dt * P[1][1];
   P[1][1] += Q_bias * dt;

点评

看来是我理解错误了,我一直以为q_xz是为了防止程序出错(第5句有个除法,除数为0程序就bug了)。基础不够扎实,要重新学习了。有完整的没删减的例子不?有实例学的比较快。  发表于 2014-4-1 11:54
回复 支持 反对

使用道具 举报

发表于 2014-4-1 20:26:49 | 显示全部楼层
本帖最后由 leicheng 于 2014-4-1 20:38 编辑

@savagego :差不多去年的这个时候,有一位叫作笨笨的童鞋写了篇文章:Arduino+MPU6050+Kalman filter。你去看看~
另外有篇文章有详细介绍:A practical approach to Kalman filter and how to implement it
回复 支持 反对

使用道具 举报

发表于 2014-4-6 21:22:07 | 显示全部楼层
本帖最后由 zenki 于 2014-4-6 21:25 编辑

针对LZ的程序,有两个问题:
1. q_xz也就是过程噪声,是怎么确定的?
2. r_xz也就是测量噪声,是怎么确定的?
q_xz如果太大,角度的估计值就会跟着利用重力计算的角度走,用q_xz=0.0025测试了下:

蓝线是用角速度积分计算的Roll角(绕X轴旋转的角度)
红*线是用重力加速度计算的角度
绿+线是用kalman数据融合后计算的角度,(都是静止的下面的)
untitled.jpg





如果让q_xz = 0;
那么就是下面的结果:
untitled2.jpg

q_xz=0.0025

q_xz=0.0025

q_xz=0.0000

q_xz=0.0000
回复 支持 反对

使用道具 举报

发表于 2014-4-14 19:22:03 | 显示全部楼层
正在学习卡尔曼滤波。
回复 支持 反对

使用道具 举报

发表于 2014-7-15 22:54:19 | 显示全部楼层
mark           
回复 支持 反对

使用道具 举报

发表于 2014-8-1 22:44:22 | 显示全部楼层
想问以下 Axz 是代表什么?

点评

Axz 是什么,不知道是什么意思  发表于 2015-8-20 15:05
回复 支持 反对

使用道具 举报

发表于 2015-3-14 19:38:31 | 显示全部楼层
savagego 发表于 2014-3-26 11:27
2,p_xz=p_xz+q_xz;
3, k_xz=p_xz/(p_xz+r_xz);
第二条是防止程序飞掉,因为第三条用到除法,如果除数为 ...

什么叫防止程序飞掉
回复 支持 反对

使用道具 举报

发表于 2015-3-16 10:29:34 | 显示全部楼层
woi314ow 发表于 2015-3-14 19:38
什么叫防止程序飞掉

应该是第二个状态方程,楼主这里理解有错误,他已经解释了
回复 支持 反对

使用道具 举报

发表于 2015-5-16 10:12:06 | 显示全部楼层
电子秤有卡尔曼逗我的吧!还是想想怎么在硬件上改进吧!
回复 支持 反对

使用道具 举报

发表于 2015-6-29 21:12:07 | 显示全部楼层
mark~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2015-7-23 22:44:42 | 显示全部楼层
楼主讲的真棒,看其他的卡尔曼讲解,都是贴上一段代码,然后翻译,完全不知道其算法的精妙和核心思想。你这样一讲瞬间就明白了,即使不看代码,也会大概知道了。真心谢谢!!!
回复 支持 反对

使用道具 举报

发表于 2015-8-20 15:03:43 | 显示全部楼层
阴霾の微笑 发表于 2014-8-1 22:44
想问以下 Axz 是代表什么?

我也看到这个Axz,就不知道了
回复 支持 反对

使用道具 举报

发表于 2015-8-20 18:10:47 | 显示全部楼层
还在学习中,借鉴下楼主的笔记
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-4-10 21:58 , Processed in 0.061604 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表