搜索
bottom↓
回复: 96

国外网站上找到的简单的卡尔曼滤波算法

  [复制链接]

出0入0汤圆

发表于 2011-8-21 02:02:02 | 显示全部楼层 |阅读模式
折腾了一晚上,搜索了好久也没能整明白卡尔曼滤波里的几个变量都具体起什么作用。
稀里糊涂的算有效果了。
国内网站大家都是你转载我的,我转载你的,没几个说的明白的,更有甚者,转载都出现错误。
没办法,试试去外网找,还真找着好用的了。呵呵。贴出来大家参考下。

/** A simple kalman filter example by Adrian Boeing
www.adrianboeing.com
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double frand() {
    return 2*((rand()/(double)RAND_MAX) - 0.5);
}

int main() {

    //initial values for the kalman filter
    float x_est_last = 0;
    float P_last = 0;
    //the noise in the system
    float Q = 0.022;
    float R = 0.617;
   
    float K;
    float P;
    float P_temp;
    float x_temp_est;
    float x_est;
    float z_measured; //the 'noisy' value we measured
    float z_real = 0.5; //the ideal value we wish to measure
   
    srand(0);
   
    //initialize with a measurement
    x_est_last = z_real + frand()*0.09;
   
    float sum_error_kalman = 0;
    float sum_error_measure = 0;
   
    for (int i=0;i<30;i++) {
        //do a prediction
        x_temp_est = x_est_last;
        P_temp = P_last + Q;
        //calculate the Kalman gain
        K = P_temp * (1.0/(P_temp + R));
        //measure
        z_measured = z_real + frand()*0.09; //the real measurement plus noise
        //correct
        x_est = x_temp_est + K * (z_measured - x_temp_est);
        P = (1- K) * P_temp;
        //we have our new system
        
        printf("Ideal    position: %6.3f \n",z_real);
        printf("Mesaured position: %6.3f [diff:%.3f]\n",z_measured,fabs(z_real-z_measured));
        printf("Kalman   position: %6.3f [diff:%.3f]\n",x_est,fabs(z_real - x_est));
        
        sum_error_kalman += fabs(z_real - x_est);
        sum_error_measure += fabs(z_real-z_measured);
        
        //update our last's
        P_last = P;
        x_est_last = x_est;
    }
   
    printf("Total error if using raw measured:  %f\n",sum_error_measure);
    printf("Total error if using kalman filter: %f\n",sum_error_kalman);
    printf("Reduction in error: %d%% \n",100-(int)((sum_error_kalman/sum_error_measure)*100));
   
   
    return 0;
}//在此未对原程序做任何改动

高手指点一下 Q 和 R 这两个噪声量是干嘛的吧!它们的大小会影响什么?

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

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

出0入0汤圆

发表于 2011-8-21 02:09:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-21 06:57:13 | 显示全部楼层
收藏

出0入476汤圆

发表于 2011-8-21 07:18:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-21 07:52:29 | 显示全部楼层
怎么国内资料这么难找?

出0入0汤圆

发表于 2011-8-21 07:53:53 | 显示全部楼层
这就是楼主说的那个被无数人转来转去的那个温度的例子吧……你去外国网站还是找来了这个例子
Q是系统噪声,R是测量噪声,大概意思就是说该信谁多一点,如果Q=0就最后完全信预测结果,R=0则完全信测量结果

编辑加入:搜这类东西用google scholar吧,很好用的,不过不要期望现成的代码就是了

出0入0汤圆

发表于 2011-8-21 09:12:22 | 显示全部楼层
这类东西想搜索到实用的代码是想都不用想的,国内外都一样
代码确实是有
国内的一般是学生用来做作业的代码,选的例子虚无缥缈暂且不说,要么是MATLAB的验证型代码,若是C或C++的,代码风格和效率那简直就是悲剧,这类代码抄来抄去非常普遍.
而国外的代码,一般都是二次简化的代码,何谓二次简化?
第一次,将例子降维,比如三维多变量系统,他们会把它变成一维单变量的,比如姿态的卡尔曼滤波简化为单轴的卡尔曼滤波
第二次,将代码简化,主要是为了提高效率,但简化后的代码基本没有可更改性,可读性也是大大降低,甚至看不懂,但是代码的编写基础却是十分严格复杂的推导

要想针对应用写这类代码,只能通过自己理解再慢慢的积累起来,比如先针对硬件写一个高效的数学库,然后通过这个库来建立算法
而算法的基础理论,还是老老实实的啃一啃书,啃一啃资料,老外的书和资料还是毫不含糊的

出0入0汤圆

发表于 2011-8-21 09:27:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-21 09:41:45 | 显示全部楼层
mark
~

出0入0汤圆

发表于 2011-8-21 09:42:47 | 显示全部楼层
楼主可以看看这个《Some of my Experiences with Kalman Filters》By Ronald Yannone
http://www.megasociety.org/noesis/138/kalman.html
这篇文章说了作者的一些经验,并且在最后给出了
R、Q、P取值不当对系统的影响以及对策。

出0入0汤圆

发表于 2011-8-21 10:04:33 | 显示全部楼层
还有我刚刚从Google Books上找到的一本书,部分预览,平均每10页抽掉2页,基本还能看
http://books.google.com/books?id=J_fqMHOCzB8C&source=gbs_navlinks_s

Kalman filtering: theory and practice using MATLAB

出0入0汤圆

发表于 2011-8-21 10:09:12 | 显示全部楼层
一个是过程噪声,一个是观测噪声

出0入0汤圆

发表于 2011-8-21 11:07:39 | 显示全部楼层
这个好!

出0入0汤圆

发表于 2011-8-21 11:26:55 | 显示全部楼层
MARK

出0入0汤圆

 楼主| 发表于 2011-8-21 12:29:45 | 显示全部楼层
回复【5楼】cbeeee  
-----------------------------------------------------------------------

恩,想想确实是这样。

谢谢!

出0入0汤圆

 楼主| 发表于 2011-8-21 12:30:29 | 显示全部楼层
回复【6楼】lijieamd  
-----------------------------------------------------------------------

有道理,研究挺深啊。

出0入0汤圆

 楼主| 发表于 2011-8-21 12:35:01 | 显示全部楼层
回复【9楼】02015678 周光
-----------------------------------------------------------------------

确实不错!谢谢!

出0入0汤圆

发表于 2011-8-21 13:43:10 | 显示全部楼层
MARK一下

出0入0汤圆

发表于 2011-8-21 14:17:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-26 19:47:04 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-10-5 00:42:02 | 显示全部楼层
不错

出0入0汤圆

发表于 2011-10-5 01:41:47 | 显示全部楼层
先MARK
日后用得着

出0入0汤圆

发表于 2011-10-5 02:53:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-5 08:35:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-5 08:37:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-9 19:13:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-9 20:29:21 | 显示全部楼层
学习了一些东西,虽然也一样没弄明白卡尔曼滤波,但知道有Google Scholar和Google Books这两个好东东。

出0入0汤圆

发表于 2011-10-11 21:26:36 | 显示全部楼层
mark,太高深,看来数学是基石啊,以前还以为数学
除了算账,学的没啥用。。。

出0入0汤圆

发表于 2011-10-18 22:25:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-20 12:11:46 | 显示全部楼层
找卡尔曼本人问问最好

出0入0汤圆

发表于 2011-10-22 20:48:33 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-10-22 22:09:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-2 13:45:14 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-2 13:58:36 | 显示全部楼层
MARK卡尔曼

出0入4汤圆

发表于 2011-11-2 15:56:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-2 18:52:47 | 显示全部楼层
回复【楼主位】ailibuli 爱理不理
-----------------------------------------------------------------------

很好

出0入0汤圆

发表于 2011-11-2 19:04:10 | 显示全部楼层
mark

出65入0汤圆

发表于 2011-11-2 23:15:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-2 23:25:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-3 09:04:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-3 09:18:39 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-3 17:45:57 | 显示全部楼层
建议lz先看看kalman的书把那5个公式弄懂再看程序就比较简单了

出0入0汤圆

发表于 2011-11-5 18:30:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-5 18:55:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-13 16:10:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-13 21:31:02 | 显示全部楼层
mark...

出0入0汤圆

发表于 2011-11-14 09:18:36 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-11-14 10:23:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-14 11:44:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-9 01:10:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-9 09:17:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-9 12:04:20 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-12-9 12:53:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-13 10:15:24 | 显示全部楼层
看看

出0入0汤圆

发表于 2012-2-1 16:36:10 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-2-16 17:16:13 | 显示全部楼层
其实一维的卡尔曼滤波很简单,只需要五个基本的公式,(两个时间更新的,三个状态更新的)套公式就可以解决;不过要明白原理就要多多看看了;一篇论文名字是《An Introduction to the Kalman Filter》,讲得较为详细。

出0入0汤圆

发表于 2012-2-16 17:28:00 | 显示全部楼层
回复【楼主位】ailibuli  爱理不理
-----------------------------------------------------------------------
根据我看的一片论文《An Introduction to the Kalman Filter》中介绍的公式,你所列出的程序是一个验证性的,而不是应用性的,不过思路很清晰;在应用性的程序中z_measured = z_real + frand()*0.09; //the real measurement plus noise 是不必要的,因为计算更新状态的表达式应用的本身就是测量值,在这里是为了验证程序最后能够得到z-real的值,以验证算法的正确性;R值一般是离线测量,而Q值一般是取较小的值;

出0入0汤圆

发表于 2012-5-27 11:16:42 | 显示全部楼层
mark一个,留着学习

出0入0汤圆

发表于 2012-6-13 16:49:06 | 显示全部楼层
学习了。

出0入0汤圆

发表于 2012-6-13 17:28:45 | 显示全部楼层
终于可以注册新账号了。mark

出0入0汤圆

发表于 2012-6-13 18:04:02 | 显示全部楼层
国内的资料基本不敢看,看来看去大家都一个样。Google Scholar 还是不错的

出0入0汤圆

发表于 2012-6-13 20:33:56 | 显示全部楼层
顶一下 ~ 有机会试试看~

出0入0汤圆

发表于 2012-6-14 09:31:58 | 显示全部楼层
不错啊,看看

出0入0汤圆

发表于 2012-6-15 14:28:33 | 显示全部楼层
卡尔曼滤波,mark

出0入0汤圆

发表于 2012-6-17 23:28:40 | 显示全部楼层
mark 一下  卡曼滤波

出0入0汤圆

发表于 2012-7-4 23:09:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-7-5 02:44:47 | 显示全部楼层
學習了~

出0入0汤圆

发表于 2012-7-17 16:59:01 | 显示全部楼层
mark      

出0入0汤圆

发表于 2012-7-20 14:39:42 | 显示全部楼层
卡尔曼的Mark一下

出0入0汤圆

发表于 2012-7-20 14:44:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-7-20 15:21:01 | 显示全部楼层
marrrrrrkkkkk

出675入8汤圆

发表于 2012-8-7 19:29:34 | 显示全部楼层
这个学习要

出0入0汤圆

发表于 2012-8-9 00:45:40 | 显示全部楼层
的确蛮简洁的~~~~

出0入0汤圆

发表于 2012-8-11 18:47:58 | 显示全部楼层
翻了2页帖子,大部分都是mark……

出0入0汤圆

发表于 2012-8-11 19:12:55 | 显示全部楼层
个人认为卡尔曼算法应用在ARM或者MCU中的简化方式,是杜绝浮点的。

出0入0汤圆

发表于 2012-8-21 15:54:34 | 显示全部楼层
mark               

出0入0汤圆

发表于 2012-8-27 18:43:07 | 显示全部楼层
嗯,要多加强数学的学习

出0入0汤圆

发表于 2012-9-21 15:17:32 | 显示全部楼层
卡尔曼滤波的,我都mark一下

出0入0汤圆

发表于 2012-9-22 01:03:10 来自手机 | 显示全部楼层
谢谢了                                   

出0入0汤圆

发表于 2012-9-27 17:03:50 | 显示全部楼层
传感器的测量值 加速度Acc_Mess    陀螺仪 Gyro_Mess
卡尔曼滤波器增益 Kg
卡尔曼滤波后的真实角度值 Acc_Real
系统时钟 Time_Loop
最优角度值的偏差 L
高斯白噪声 T
中间变量 Acc_Media

Q = 0.022;
R = 0.617;

Acc_Media=Acc_Real+Gyro_Mess*Time_Loop ;//计算瞬时角度值
T=sqrt(Q*Q+L*L);                                  //计算高斯白噪声
Kg=T*sqrt(1/(T*T+R*R)) ;                          //计算卡尔曼滤波器的增益
Acc_Real=Acc_Media+Kg*(Acc_Mess-Acc_Media); //计算真实角度值
L=sqrt(1-Kg)*T;                                           //计算真实角度值的偏差

return Acc_Real ;     



请问这个正确吗

出0入0汤圆

发表于 2012-12-21 13:41:46 | 显示全部楼层
MARK 卡尔曼,学习学习了~

出0入0汤圆

发表于 2013-5-14 21:03:23 | 显示全部楼层
mark                              

出0入0汤圆

发表于 2013-5-14 23:10:15 | 显示全部楼层
卡尔曼。。

出0入0汤圆

发表于 2013-11-3 16:33:16 | 显示全部楼层
收藏

出0入0汤圆

发表于 2013-11-17 22:14:41 | 显示全部楼层
不错

出0入0汤圆

发表于 2013-12-9 16:29:41 | 显示全部楼层
mark  以后学习用

出0入0汤圆

发表于 2013-12-9 19:30:25 | 显示全部楼层
感谢楼主,学习一下!

出0入0汤圆

发表于 2013-12-9 22:04:43 | 显示全部楼层
静不下心来看啊。。。

出0入0汤圆

发表于 2013-12-12 15:15:27 | 显示全部楼层
感谢楼主

出0入0汤圆

发表于 2013-12-13 13:35:53 | 显示全部楼层
国内风气真心不如国外啊,好东西还是得上英文论坛找啊,可惜还有gfw

出0入0汤圆

发表于 2013-12-13 17:44:10 | 显示全部楼层
卡尔曼滤波,毕业论文写信息融合的几个算法的时候就有这个,就没弄懂是什么,太虚无缥缈了

出0入0汤圆

发表于 2013-12-13 17:55:02 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2013-12-20 16:17:35 | 显示全部楼层
怎么感觉没有太多使用的呢,大家老师MARK,讲讲道理吗?

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2016-11-29 21:28:01 | 显示全部楼层
Q:预测误差,R:测量误差吧

出675入8汤圆

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

本版积分规则

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

GMT+8, 2024-4-23 15:57

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

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