搜索
bottom↓
回复: 16

请教一下关于卡尔曼多维滤波的C语言程序

[复制链接]

出0入0汤圆

发表于 2017-3-14 20:33:21 | 显示全部楼层 |阅读模式
下面是我看到别人写的多维卡尔曼滤波程序,实在是看不明白,请高手们详细的分享一下你们的调试经验和关于这段程序的解读。不胜感激
void Kalman_Filter_X(float Accel, float Gyro) //¿¨¶ûÂüº¯Êý
{
        Angle_X_Final += (Gyro - Q_bias_x) * dt; //ÏÈÑé¹À¼Æ

        Pdot[0] = Q_angle - PP[0][1] - PP[1][0]; // Pk-ÏÈÑé¹À¼ÆÎó²îЭ·½²îµÄ΢·Ö

        Pdot[1] = -PP[1][1];
        Pdot[2] = -PP[1][1];
        Pdot[3] = Q_gyro;

        PP[0][0] += Pdot[0] * dt;   // Pk-ÏÈÑé¹À¼ÆÎó²îЭ·½²î΢·ÖµÄ»ý·Ö
        PP[0][1] += Pdot[1] * dt;   // =ÏÈÑé¹À¼ÆÎó²îЭ·½²î
        PP[1][0] += Pdot[2] * dt;
        PP[1][1] += Pdot[3] * dt;

        Angle_err_x = Accel - Angle_X_Final;        //zk-ÏÈÑé¹À¼Æ

        PCt_0 = C_0 * PP[0][0];
        PCt_1 = C_0 * PP[1][0];

        E = R_angle + C_0 * PCt_0;

        K_0 = PCt_0 / E;
        K_1 = PCt_1 / E;

        t_0 = PCt_0;
        t_1 = C_0 * PP[0][1];

        PP[0][0] -= K_0 * t_0;                 //ºóÑé¹À¼ÆÎó²îЭ·½²î
        PP[0][1] -= K_0 * t_1;
        PP[1][0] -= K_1 * t_0;
        PP[1][1] -= K_1 * t_1;

        Angle_X_Final += K_0 * Angle_err_x;         //ºóÑé¹À¼Æ
        Q_bias_x += K_1 * Angle_err_x;         //ºóÑé¹À¼Æ
        Gyro_x = Gyro - Q_bias_x;         //Êä³öÖµ(ºóÑé¹À¼Æ)µÄ΢·Ö=½ÇËÙ¶È
}

void Kalman_Filter_Y(float Accel, float Gyro) //¿¨¶ûÂüº¯Êý               
{
        Angle_Y_Final += (Gyro - Q_bias_y) * dt; //ÏÈÑé¹À¼Æ

        Pdot[0] = Q_angle - PP[0][1] - PP[1][0]; // Pk-ÏÈÑé¹À¼ÆÎó²îЭ·½²îµÄ΢·Ö

        Pdot[1] = -PP[1][1];
        Pdot[2] = -PP[1][1];
        Pdot[3] = Q_gyro;

        PP[0][0] += Pdot[0] * dt;   // Pk-ÏÈÑé¹À¼ÆÎó²îЭ·½²î΢·ÖµÄ»ý·Ö
        PP[0][1] += Pdot[1] * dt;   // =ÏÈÑé¹À¼ÆÎó²îЭ·½²î
        PP[1][0] += Pdot[2] * dt;
        PP[1][1] += Pdot[3] * dt;

        Angle_err_y = Accel - Angle_Y_Final;        //zk-ÏÈÑé¹À¼Æ

        PCt_0 = C_0 * PP[0][0];
        PCt_1 = C_0 * PP[1][0];

        E = R_angle + C_0 * PCt_0;

        K_0 = PCt_0 / E;
        K_1 = PCt_1 / E;

        t_0 = PCt_0;
        t_1 = C_0 * PP[0][1];

        PP[0][0] -= K_0 * t_0;                 //ºóÑé¹À¼ÆÎó²îЭ·½²î
        PP[0][1] -= K_0 * t_1;
        PP[1][0] -= K_1 * t_0;
        PP[1][1] -= K_1 * t_1;

        Angle_Y_Final += K_0 * Angle_err_y;         //ºóÑé¹À¼Æ
        Q_bias_y += K_1 * Angle_err_y;         //ºóÑé¹À¼Æ
        Gyro_y = Gyro - Q_bias_y;         //Êä³öÖµ(ºóÑé¹À¼Æ)µÄ΢·Ö=½ÇËÙ¶È
}

void Kalman_Filter_Z(float Accel, float Gyro) //¿¨¶ûÂüº¯Êý
{
        Angle_Z_Final += (Gyro - Q_bias_z) * dt; //ÏÈÑé¹À¼Æ

        Pdot[0] = Q_angle - PP[0][1] - PP[1][0]; // Pk-ÏÈÑé¹À¼ÆÎó²îЭ·½²îµÄ΢·Ö

        Pdot[1] = -PP[1][1];
        Pdot[2] = -PP[1][1];
        Pdot[3] = Q_gyro;

        PP[0][0] += Pdot[0] * dt;   // Pk-ÏÈÑé¹À¼ÆÎó²îЭ·½²î΢·ÖµÄ»ý·Ö
        PP[0][1] += Pdot[1] * dt;   // =ÏÈÑé¹À¼ÆÎó²îЭ·½²î
        PP[1][0] += Pdot[2] * dt;
        PP[1][1] += Pdot[3] * dt;

        Angle_err_z = Accel - Angle_Z_Final;        //zk-ÏÈÑé¹À¼Æ

        PCt_0 = C_0 * PP[0][0];
        PCt_1 = C_0 * PP[1][0];

        E = R_angle + C_0 * PCt_0;

        K_0 = PCt_0 / E;
        K_1 = PCt_1 / E;

        t_0 = PCt_0;
        t_1 = C_0 * PP[0][1];

        PP[0][0] -= K_0 * t_0;                 //ºóÑé¹À¼ÆÎó²îЭ·½²î
        PP[0][1] -= K_0 * t_1;
        PP[1][0] -= K_1 * t_0;
        PP[1][1] -= K_1 * t_1;

        Angle_Z_Final += K_0 * Angle_err_z;         //ºóÑé¹À¼Æ
        Q_bias_z += K_1 * Angle_err_z;         //ºóÑé¹À¼Æ
        Gyro_z = Gyro - Q_bias_z;         //Êä³öÖµ(ºóÑé¹À¼Æ)µÄ΢·Ö=½ÇËÙ¶È
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-3-14 22:09:16 | 显示全部楼层
你这个执行还不够快.
要学习用就先做一个一维的实验一下, 琢磨体会原理和实际表现, 参考下面看看,
https://www.codeproject.com/articles/326657/kalmandemo
以前套垃圾级加速计用了一回, APP比原厂的改善很多, 不过Kalman gain初值设置还是有很大影响.
如果没有十分必要, 用快速的一阶RC滤波也差不多.

出0入0汤圆

发表于 2017-3-15 20:49:53 来自手机 | 显示全部楼层
先学卡尔曼滤波的原理,然后再看代码吧。不然越看越晕。

出0入0汤圆

 楼主| 发表于 2017-3-15 21:54:02 | 显示全部楼层
xiaolaba 发表于 2017-3-14 22:09
你这个执行还不够快.
要学习用就先做一个一维的实验一下, 琢磨体会原理和实际表现, 参考下面看看,
https:// ...

一维的我会用,就是多维的搞不明白,能帮忙讲解一下吗?困扰我很多天了

出0入0汤圆

 楼主| 发表于 2017-3-15 21:54:42 | 显示全部楼层
sbusr 发表于 2017-3-15 20:49
先学卡尔曼滤波的原理,然后再看代码吧。不然越看越晕。

嗯嗯  谢谢了

出0入0汤圆

 楼主| 发表于 2017-3-15 21:55:26 | 显示全部楼层
xiaolaba 发表于 2017-3-14 22:09
你这个执行还不够快.
要学习用就先做一个一维的实验一下, 琢磨体会原理和实际表现, 参考下面看看,
https:// ...

你给的资料好给力啊,好好学习一下,谢谢了,还是外国人写的给力一些

出100入101汤圆

发表于 2017-3-16 06:05:29 | 显示全部楼层
xiaolaba 发表于 2017-3-14 22:09
你这个执行还不够快.
要学习用就先做一个一维的实验一下, 琢磨体会原理和实际表现, 参考下面看看,
https:// ...


请教一阶RC滤波是否可以滤除基线的漂移,并捕捉突发尖峰信号?

出0入0汤圆

发表于 2017-3-16 06:13:54 来自手机 | 显示全部楼层
学习下,也在考虑用什么好滤波程序

出0入0汤圆

发表于 2017-3-16 09:03:33 | 显示全部楼层
fengyunyu 发表于 2017-3-16 06:05
请教一阶RC滤波是否可以滤除基线的漂移,并捕捉突发尖峰信号?

不太明白問題
估計這問號跟濾波的目的相反了

出100入101汤圆

发表于 2017-3-16 15:28:35 | 显示全部楼层
xiaolaba 发表于 2017-3-16 09:03
不太明白問題
估計這問號跟濾波的目的相反了

比如心电信号

出0入0汤圆

发表于 2017-3-16 15:49:40 | 显示全部楼层
先标记一下,可能以后会用到,多谢各位

出0入0汤圆

发表于 2017-3-17 12:05:04 | 显示全部楼层

你的訊號做成圖視沒? 上個圖看看
玩具還是做產品的?

出100入101汤圆

发表于 2017-3-17 12:40:58 | 显示全部楼层
xiaolaba 发表于 2017-3-17 12:05
你的訊號做成圖視沒? 上個圖看看
玩具還是做產品的?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2017-3-22 22:41:58 | 显示全部楼层
xiaolaba 发表于 2017-3-14 22:09
你这个执行还不够快.
要学习用就先做一个一维的实验一下, 琢磨体会原理和实际表现, 参考下面看看,
https:// ...

楼主网页链接进去程序下载不了啊,注册不了会员

出0入0汤圆

发表于 2017-3-23 00:03:22 | 显示全部楼层
wuquanhui2010 发表于 2017-3-22 22:41
楼主网页链接进去程序下载不了啊,注册不了会员

email 給出來
幫你註冊一個
收到認證通知信後, 自己改密碼

出0入0汤圆

发表于 2017-3-23 00:04:12 | 显示全部楼层

你都能做到這圖了, 不是完成了嗎
還要FILTER幹啥呢

出0入0汤圆

发表于 2017-3-23 08:27:51 | 显示全部楼层
下到demo code的能共享一下吗,最近也在学习卡尔曼滤波。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 17:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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