savagego 发表于 2014-3-28 13:02 static/image/common/back.gif
void calculate_xz()
{
xz=xz+t*gyro;
1.测量噪声的协方差是根据不同情况算的,我并没有计算是因为我用的卡尔曼假设过程和测量的噪音都是不随时间变化的,我在取样附近找了一个点收敛比较好就用了,当然如果需要可以取样拟合一下得到近似解。
2.最后要更新当前状态下X(K|K)的协方差,这样算法才能自回归算下去,这里的‘’1‘’是因为是单模型单测量,所以单位对角阵退化为1.
不知道我说的是否还有错误或者不清楚的地方,咱们继续讨论。
zhangzhe0617 发表于 2014-3-28 16:51 static/image/common/back.gif
1.测量噪声的协方差是根据不同情况算的,我并没有计算是因为我用的卡尔曼假设过程和测量的噪音都是不随时 ...
@leicheng 这个我还真没注意到,受教了。这个过程噪音是最头疼的,我是还迷糊的,用一堆值试出来的,是个隐患
本帖最后由 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 += dt * (dt*P - P - P + Q_angle);
P -= dt * P;
P -= dt * P;
P += Q_bias * dt;
本帖最后由 leicheng 于 2014-4-1 20:38 编辑
@savagego :差不多去年的这个时候,有一位叫作笨笨的童鞋写了篇文章:Arduino+MPU6050+Kalman filter。你去看看~
另外有篇文章有详细介绍:A practical approach to Kalman filter and how to implement it
本帖最后由 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
:D正在学习卡尔曼滤波。
mark :loveliness:
想问以下 Axz 是代表什么?
savagego 发表于 2014-3-26 11:27 static/image/common/back.gif
2,p_xz=p_xz+q_xz;
3, k_xz=p_xz/(p_xz+r_xz);
第二条是防止程序飞掉,因为第三条用到除法,如果除数为 ...
什么叫防止程序飞掉
woi314ow 发表于 2015-3-14 19:38 static/image/common/back.gif
什么叫防止程序飞掉
应该是第二个状态方程,楼主这里理解有错误,他已经解释了
电子秤有卡尔曼逗我的吧!还是想想怎么在硬件上改进吧!
mark~~~~~~~~~
楼主讲的真棒,看其他的卡尔曼讲解,都是贴上一段代码,然后翻译,完全不知道其算法的精妙和核心思想。你这样一讲瞬间就明白了,即使不看代码,也会大概知道了。真心谢谢!!!
阴霾の微笑 发表于 2014-8-1 22:44 static/image/common/back.gif
想问以下 Axz 是代表什么?
我也看到这个Axz,就不知道了
还在学习中,借鉴下楼主的笔记