套公式原来这么简单,卡尔曼滤波在单片机上面实际应用,转
本帖最后由 小笨蛋 于 2012-5-11 16:28 编辑很形象的卡尔曼滤波的原理说明
http://www.ourdev.cn/thread-5474930-1-1.html
#ifndef _KALMAN_H_
#define _KALMAN_H_
externKalmanGain;//卡尔曼增益
externEstimateCovariance;//估计协方差
externMeasureCovariance;//测量协方差
externEstimateValue;//估计值
extern void KalmanFilterInit(void);
extern KalmanFilter( Measure);
#endif
#include "config.h"
#include "math.h"
KalmanGain;//卡尔曼增益
EstimateCovariance;//估计协方差
MeasureCovariance;//测量协方差
EstimateValue;//估计值
void KalmanFilterInit(void);
extern floatKalmanFilter(float Measure);
void KalmanFilterInit(void)
{
EstimateValue=0;
EstimateCovariance=0.1;
MeasureCovariance=0.02;
}
KalmanFilter( Measure)
{
//计算卡尔曼增益
KalmanGain=EstimateCovariance*sqrt(1/(EstimateCovariance*EstimateCovariance+MeasureCovariance*MeasureCovariance));
//计算本次滤波估计值
EstimateValue=EstimateValue+KalmanGain*(Measure-EstimateValue);
//更新估计协方差
EstimateCovariance=sqrt(1-KalmanGain)*EstimateCovariance;
//更新测量方差
MeasureCovariance=sqrt(1-KalmanGain)*MeasureCovariance;
//返回估计值
return EstimateValue;
}转自http://blog.163.com/tianjunqiang666@126/blog/static/87259119201131314343274/ 从上班就开始听说卡尔曼一直没见过,哈哈 mark 备用! mark!正准备搞呢 mark 备用! 学习了.谢谢!{:smile:}{:smile:}{:smile:} 还是浮点运算啊 单片机执行,够呛吧
来自:amoBBS 阿莫电子论坛 Android客户端 怎么看不到图啊 mark,过两天搞起 markxiexie 只知道这是个预测模型,由于太复杂一直没有弄懂,得好好研究下 mark......
有时间试试。 我用软件模拟了一下上面的代码,发现几个公式有点问题,首先是卡尔曼增益,好多资料上说是
KalmanGain=sqrt(EstimateCovariance*EstimateCovariance/(EstimateCovariance*EstimateCovariance + MeasureCovariance*MeasureCovariance));
其他几个公式感觉也有问题,还在验证中,有没有已经验证成功的,分享一下经验。 这是哪门子卡尔曼 也就是个互补滤波 互补滤波...................... 卡尔曼是什么呀。适用于何处? 认真学习 单片机完全可以跑起来 我确定。。 建议看看现代控制理论或者随机信号处理一类的书吧,这个貌似有点…… 还没用过,先留个脚印!
多谢楼主! 到底是kalman还是互补啊 互补滤波,鉴定完毕,卡尔曼滤波的融合系数是通过对噪声的观测得到的。互补滤波是人为设定的,这个程序里融合系数是人为设定的。 好东西mark
还是没懂 很多人都不知道kalman滤波的作用,我觉得其实就是讲加速度计和陀螺仪的输出转换成角度,至于用什么kalman,balance,average看自己的处理器是否给力了 顺便说下,如果楼下认为我有错误,欢迎讨论,我不保证我一定是对的,但是我保证一定给大家一个正确的交代 找到一个帖子,讲到互补滤波:
http://www.amobbs.com/thread-5493125-1-1.html 备用呢。。。mark 是个1维的卡尔曼滤波,他有更新协方差阵和观测噪声阵。 这个不科学啊
因为 代码 41 行的计算卡尔曼增益结果必然是在0到1之间的,很简单,Ec 拿到根号里面,公式变形后的分子小于分母且都分子分母同为正
所以 代码 47 49 行的更新协方差的结果必然是 Ec 和 Mc 越来越小,最终趋向 0
都变成0了,那公式还怎么用?!
另外没看懂更新协方差的算法,抛开计算精度的问题,Ec 和 Mc 都是同时分别乘以(1-Kg)有什么用?Kg根本不会变嘛! 还是顶一下,留作备用{:smile:} MARK, 谢谢 Mark,thanks! Mark,有没有已经验证成功的,分享一下经验。 MARK谢谢LZ 很好的资源,收藏了 学习中先收藏{:lol:}谢谢LZ MARK,先收藏了 linnjing 发表于 2013-1-19 11:42 static/image/common/back.gif
这个不科学啊
因为 代码 41 行的计算卡尔曼增益结果必然是在0到1之间的,很简单,Ec 拿到根号里面,公式 ...
兄台 这个是简单的卡尔曼,只能用一次的。
真正的卡尔曼,需要一个动态响应方程。或者说变化量。
单变量高速卡尔曼作用不大。 这个必须赞一个啊。NB楼主 用手机记号一下 有试过做成四维的卡尔曼滤波器吗?感觉用在stm32f3上跑不太起来 好帖留名,谢谢分享 学习一下~以后备用 mark学习中 没想到看到了自己的程序。
当时做的时候是为了滤除采集到的波形的小尖刺,找了一个牛叉师兄的论文,里面发现了卡尔曼滤波器抽离成一维的滤波器公式。
由于单片机字长限制,也出现了两个系数很快衰减到0,单片机无法表示的数,因此我就设定了一个阈值,当这俩系数小到那个阈值的时候就重新给他们赋初值。我搞东西丢三落四,怕找不到这个程序了就贴了博客上了~~,由于时间久远,记得滤波效果差不多是这个样子
以后用得着! 学习了,帮顶 mark套公式原来这么简单,卡尔曼滤波在单片机上面实际应用,转 [复制链接]
顶楼主,学习了 mark 我看了好多卡尔曼的论文,现在终于明白一些道理了,但是要落实的话还是有点难,但是性能好的话也不错的 看不到图片
谢谢楼主! 先收藏了吧 wo还不明白加速度为什么能和陀螺仪的数据相融合。。 mark!学习一下 贴子很不错,收藏备用了! mark!!!!! 学习了,通俗易懂的东西 贴子很不错,学习了!!
贴子很不错,学习了!! 谢谢分享 ! MARK,先收藏了 mark 备用! 卡尔曼滤波,速度马克备用,多谢楼主 感谢楼主分享 好东西 进来学习 xsh2005105326 发表于 2012-5-11 23:40
单片机执行,够呛吧
来自:amoBBS 阿莫电子论坛 Android客户端
只有不好的算法,一般AVR单片机也能够执行,只要程序优化的好 mark下,备用 mark,标记下,说不定什么时候就用上了 上学的时候没有认真,现在看都看不懂了 收藏备用 运行算过程都是典型的浮点运行算,直接把程序放在MCU中运行不合理。大体估计了一下时间,2812级的单片机运算时间应该在100微妙左右。 学习了,谢谢 搞传感器和四轴姿态融合的可以用上哦!帮顶上去! 感觉不全对, EstimateCovariance;//估计协方差
MeasureCovariance;//测量协方差
没有更新 卡尔曼滤波 make mark................ mark下...... 收藏备用,经典的PID Mark,卡尔曼滤波器C语言实现。 一般来说,最好配上原始波形和滤波后的波形的对比图比较好,方便看效果。
8位单片机一样可以使用,速度没有问题。 卡尔曼滤波,学习一下 卡尔曼滤波 卡尔曼还是互补滤波器? 反正都能用 有人测试效果了吗? 不错,效果看49楼 linnjing 发表于 2013-1-19 11:42
这个不科学啊
因为 代码 41 行的计算卡尔曼增益结果必然是在0到1之间的,很简单,Ec 拿到根号里面,公式 ...
(引用自33楼)
我用楼主的代码。验证了你的结论;刚开始效果还是有的,时间长了卡尔曼增益变为0,就没用了。。。
怎么解决还在思考。。。 mainbp 发表于 2022-4-18 16:23
我用楼主的代码。验证了你的结论;刚开始效果还是有的,时间长了卡尔曼增益变为0,就没用了。。。
怎么解 ...
(引用自94楼)
好像49楼有注释。哈哈 D.lovers 发表于 2022-4-18 17:01
好像49楼有注释。哈哈
(引用自95楼)
嗯,谢谢啦,没注意看;
测试了,可以的;{:victory:} Thank you !!!
页:
[1]