首页 > 编程知识 正文

Omega滤波和卡尔曼滤波(卡尔曼滤波算法的优缺点)

时间:2023-05-03 20:40:51 阅读:75271 作者:4171

一方面,算法介绍卡尔曼滤波是一种魔法滤波算法,应用非常广泛,是一种先验经验与测量更新相结合的状态估计算法。

1、状态估计首先,对于我们关心的物理量,假设其符合以下规律

这里,该物理量的基本周期的实际值是该物理量的当前周期的实际值。 当然,这个物理量可能不符合这个规律,但我们只是做了假设。 匹配规律因物理量而异,是我们的经验,我们可以根据这个规律预测我们感兴趣的物理量。 例如,我们感兴趣的物理量是车速,当车辆接近匀速运动时,取的值是1,也就是说,该周期与上一个周期的速度相同。

看看这个物理量的测量公式

其中,是该物理量的测量值,是测量噪声。 我们预测一个物理,测量是必不可少的手段,测量不一定准确,但在很大程度上体现了物理量的实际值。 此公式表示实际值和测量值之间的关系。 还是以车速为例,用车速传感器得到的测量值。

实际上,物理量并不像我们上面的公式那样简单,一般用以下公式表示

这里表示的是处理噪声。 这种噪音与车速等处理模式的实际情况不同,受到人为加速、减速、路面不平等等外部因素的影响。

卡尔曼滤波的基本思想是综合利用上次的状态和测量值来预测和估计物理量的状态。 我们表示的估计值有以下公式

在该式中,综合利用前一个周期的估计值和该周期的测量值来进行估计。 其中,它被称为腼腆的烤鸡。 此表达式与初级过滤器非常类似。 但是,腼腆的烤鸡会发生变化,按周期更新,一次滤波器的系数为固定值。 考虑极端情况分析增益的作用,当时增益为0。 此时,这意味着我们对这个周期的估计与前面的周期相同,不相信当前的测量值; 此时,增益为1,此时,我们这个周期的估计值与测量值相同,意味着不信任前一个周期的估计值,实用化时在0~1之间,表示对测量值的可靠度。

2、在腼腆的烧鸡上我们用腼腆的烧鸡推算物理量的值,那么腼腆的烧鸡怎么取值呢? 用以下两个公式计算,并在每个循环中反复更新。

在上述公式中,是测量噪声的平均值。 测量噪声符合drdjy分布,一般可以从传感器制造商处获得测量噪声的平均值。 如果得不到,可以根据得到的数据给出经验值。 的尺寸对最终滤波效果的影响比较大。 这个周期的预测误差。 用分析腼腆烤鸡的方法分析预测误差的作用,采用假设极端情况的方法。 假设上次的预测误差,根据第一个公式,根据以上分析,这种情况的估计值在前一个周期的估计值即上次的预测误差的情况下,增益为,一般取值较小,所以在这种情况下将新测量的值作为估计值。

第二个公式中,腼腆的烤鸡为0时,即采用前一个周期的预测误差; 增益为1时。

3、完全卡尔曼滤波算法具有上述推导。 下面列举卡尔曼滤波器的公式。 卡尔曼滤波分为预测过程和更新过程两个过程。 公式中引入了定标因子和协方差。

预测流程:

更新流程:

上式适用于一维变量的卡尔曼滤波器。 通过将变量扩展到多维,并将上面的变量替换为向量和矩阵,可以实现多维变量的卡尔曼滤波器。 以下公式适用于多维变量:

预测流程:

更新流程:

二、在实现代码以下,卡尔曼滤波算法用c码实现,实现的算法为一维滤波算法。 首先定义卡尔曼滤波器的参数

typedef struct {浮动过滤器值; //过滤后的值float kalmanGain; //Kalamn增益浮动a; //状态矩阵float H; //观测矩阵float Q; //状态矩阵的方差浮点r; //观测矩阵的方差float P; //预测误差float B; 浮点u; (}KalmanInfo; 卡尔曼滤波器的初始化函数如下所示。 在此函数中,info是指向卡尔曼滤波器参数的指针。 的参数是车速过滤过程的设置。

void kalm :3360 initkalmanfilter (Kalman info * info ) { info-A=1; info-H=1; info-P=0.1; info-Q=0.05; info-R=0.1; info-B=0.1; info-u=0; 信息过滤器值=0; }卡尔曼滤波器的进程函数。 函数的输入info是指向卡尔曼滤波器参数的指针,new_value是新测量值,以及函数返回滤波后的估计。

浮动kalm : kalmanfilterfun (Kalman info * info,

float new_value){ float predictValue = info->A*info->filterValue+info->B*info->u;//计算预测值 info->P = info->A*info->A*info->P + info->Q;//求协方差 info->kalmanGain = info->P * info->H /(info->P * info->H * info->H + info->R);//计算腼腆的烤鸡 info->filterValue = predictValue + (new_value - predictValue)*info->kalmanGain;//计算输出的值 info->P = (1 - info->kalmanGain* info->H)*info->P;//更新协方差 return info->filterValue;} 三、示例

        下面我们通过是一个车速滤波的示例来体验卡尔曼滤波的效果。通过上面的介绍,R对滤波效果的影响比较大,在这个示例中,我们分别将R取为0.1和0.5,来看一下车速的滤波效果。首先R取为0.1时,滤波效果如下图所示。其中,蓝色线为滤波前的车速,红色线为滤波后的车速。从图中可以看到滤波后的信号与滤波前的信号跟随很好,滞后很小。基本波动被滤掉了,但也带入了一些波动。

下图为R取为0.5时的滤波效果,很明显,这张图信号的跟随效果比上图要差,滞后也多,但是滤波后曲线更平滑。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。