问题

卡尔曼滤波器是如何运用于多传感器融合的?

回答
卡尔曼滤波器在多传感器融合中的应用:详细解读

卡尔曼滤波器(Kalman Filter)是一种强大的递归估计算法,它通过结合一系列包含噪声的测量值,并考虑系统的动态特性,来估计一个动态系统的状态。在多传感器融合(MultiSensor Fusion)的场景下,卡尔曼滤波器能够有效地整合来自不同传感器的数据,以获得比单一传感器更准确、更可靠的状态估计。

下面我们将详细探讨卡尔曼滤波器是如何应用于多传感器融合的。

1. 多传感器融合的挑战

在深入了解卡尔曼滤波器之前,我们先看看多传感器融合所面临的挑战:

噪声: 每个传感器都会受到不同程度的测量噪声的影响,这些噪声会干扰对真实状态的估计。
不确定性: 传感器测量本身就存在不确定性,即误差范围。
异构性: 不同的传感器可能测量不同的物理量,或者采用不同的测量单位、精度、采样率。
时序差异: 传感器可能不是同步采样的,导致数据之间存在时间上的偏移。
传感器故障或不可靠: 某个传感器可能出现故障或提供不可靠的数据。
计算复杂性: 需要高效的算法来处理来自多个传感器的数据。

2. 卡尔曼滤波器核心原理回顾

卡尔曼滤波器通过一个迭代过程来工作,包含两个主要阶段:

预测(Prediction): 根据系统的动态模型和前一时刻的状态估计,预测当前时刻的状态。
更新(Update/Correction): 利用当前时刻的测量值,对预测的状态进行修正,得到更准确的当前状态估计。

卡尔曼滤波器的数学模型通常可以表示为:

状态方程 (State Equation):
$$ mathbf{x}_k = mathbf{F}_k mathbf{x}_{k1} + mathbf{B}_k mathbf{u}_k + mathbf{w}_k $$
$ mathbf{x}_k $:时刻 $k$ 的系统状态向量(例如:位置、速度、姿态)。
$ mathbf{F}_k $:状态转移矩阵,描述了状态从 $k1$ 到 $k$ 的演变规律(不考虑控制输入和噪声)。
$ mathbf{B}_k $:控制输入矩阵,将控制输入映射到状态空间。
$ mathbf{u}_k $:时刻 $k$ 的控制输入向量。
$ mathbf{w}_k $:过程噪声,通常假设为均值为零、协方差为 $ mathbf{Q}_k $ 的高斯白噪声,表示模型的不确定性。

测量方程 (Measurement Equation):
$$ mathbf{z}_k = mathbf{H}_k mathbf{x}_k + mathbf{v}_k $$
$ mathbf{z}_k $:时刻 $k$ 的测量向量(来自传感器)。
$ mathbf{H}_k $:测量矩阵,将状态向量映射到测量空间。
$ mathbf{v}_k $:测量噪声,通常假设为均值为零、协方差为 $ mathbf{R}_k $ 的高斯白噪声,表示传感器测量的不确定性。

卡尔曼滤波器的核心是估计状态 $ mathbf{x}_k $ 的最佳线性无偏估计,并同时估计其不确定性,用协方差矩阵 $ mathbf{P}_k $ 来表示。

3. 卡尔曼滤波器在多传感器融合中的几种常见策略

卡尔曼滤波器在多传感器融合中有多种实现方式,核心思想都是如何将来自不同传感器的测量信息有效地整合到滤波过程中。以下是几种常见的策略:

策略一:集成式卡尔曼滤波器 (Integrated/Centralized Kalman Filter)

这是最直接也最普遍的策略。在这种方法中,我们将所有传感器的测量值在测量方程层面进行融合。

具体实现步骤:

1. 定义全局状态向量: 假设系统有一个统一的状态向量 $ mathbf{x} $,包含所有需要估计的变量。
2. 构建联合测量向量: 将来自所有传感器 $m$ 的测量值 $ mathbf{z}_{k}^{(1)}, mathbf{z}_{k}^{(2)}, dots, mathbf{z}_{k}^{(m)} $ 组合成一个大的联合测量向量 $ mathbf{z}_k $。
$$ mathbf{z}_k = egin{bmatrix} mathbf{z}_{k}^{(1)} \ mathbf{z}_{k}^{(2)} \ vdots \ mathbf{z}_{k}^{(m)} end{bmatrix} $$
3. 构建联合测量矩阵: 相应地,构建一个大的联合测量矩阵 $ mathbf{H}_k $,将全局状态向量映射到这个联合测量空间。如果传感器 $i$ 的测量方程是 $ mathbf{z}_{k}^{(i)} = mathbf{H}_{k}^{(i)} mathbf{x}_k + mathbf{v}_{k}^{(i)} $,那么联合测量矩阵为:
$$ mathbf{H}_k = egin{bmatrix} mathbf{H}_{k}^{(1)} \ mathbf{H}_{k}^{(2)} \ vdots \ mathbf{H}_{k}^{(m)} end{bmatrix} $$
4. 构建联合测量噪声协方差矩阵: 将所有传感器的测量噪声协方差矩阵 $ mathbf{R}_{k}^{(1)}, mathbf{R}_{k}^{(2)}, dots, mathbf{R}_{k}^{(m)} $ 组合成一个大的联合测量噪声协方差矩阵 $ mathbf{R}_k $。
$$ mathbf{R}_k = egin{bmatrix} mathbf{R}_{k}^{(1)} & mathbf{0} & dots & mathbf{0} \ mathbf{0} & mathbf{R}_{k}^{(2)} & dots & mathbf{0} \ vdots & vdots & ddots & vdots \ mathbf{0} & mathbf{0} & dots & mathbf{R}_{k}^{(m)} end{bmatrix} $$
(注意:这里假设不同传感器之间的测量噪声是独立的,因此协方差矩阵是非对角块矩阵。如果存在关联,则需要更复杂的协方差矩阵。)

卡尔曼滤波器流程(集成式):

初始化: 初始化状态向量 $ mathbf{x}_0 $ 和其协方差矩阵 $ mathbf{P}_0 $。
预测阶段:
预测状态:$ hat{mathbf{x}}_{k|k1} = mathbf{F}_k hat{mathbf{x}}_{k1|k1} + mathbf{B}_k mathbf{u}_k $
预测协方差:$ mathbf{P}_{k|k1} = mathbf{F}_k mathbf{P}_{k1|k1} mathbf{F}_k^T + mathbf{Q}_k $
更新阶段:
计算卡尔曼增益:$ mathbf{K}_k = mathbf{P}_{k|k1} mathbf{H}_k^T (mathbf{H}_k mathbf{P}_{k|k1} mathbf{H}_k^T + mathbf{R}_k)^{1} $
更新状态估计:$ hat{mathbf{x}}_{k|k} = hat{mathbf{x}}_{k|k1} + mathbf{K}_k (mathbf{z}_k mathbf{H}_k hat{mathbf{x}}_{k|k1}) $
更新协方差估计:$ mathbf{P}_{k|k} = (mathbf{I} mathbf{K}_k mathbf{H}_k) mathbf{P}_{k|k1} $

优点:

理论最优性: 在假设模型和噪声为高斯分布的情况下,这是理论上最优的融合方式,能够充分利用所有传感器信息。
全局一致性: 保持了状态估计的全局一致性。

缺点:

计算量大: 联合测量向量和矩阵的维度会随着传感器数量的增加而快速增长,特别是计算逆矩阵 $ (mathbf{H}_k mathbf{P}_{k|k1} mathbf{H}_k^T + mathbf{R}_k)^{1} $ 的计算量会急剧增加,特别是当传感器数量非常多时。
数据同步要求高: 要求所有传感器的数据能够以某种方式对齐到同一个时间点进行融合。

策略二:去中心化/分布式卡尔曼滤波器 (Decentralized/Distributed Kalman Filter)

为了克服集成式卡尔曼滤波器的计算复杂性问题,尤其是在大规模多传感器系统或通信受限的环境下,可以采用去中心化方法。这里有几种具体实现方式:

2.1. 顺序融合 (Sequential Fusion)

在这种策略下,传感器的数据不是同时融合,而是依次融合。一个滤波器的输出作为下一个滤波器的输入。

具体实现步骤:

1. 选择一个主传感器或第一个传感器: 使用该传感器的测量值进行初始化和第一次滤波。
2. 依次融合: 使用第一个传感器滤波得到的状态估计 $ hat{mathbf{x}}_{k|k}^{(1)} $ 和协方差 $ mathbf{P}_{k|k}^{(1)} $,然后将其作为第二个滤波器的“先验”估计。第二个滤波器使用第二个传感器的测量值对这个先验估计进行更新,得到 $ hat{mathbf{x}}_{k|k}^{(2)} $ 和 $ mathbf{P}_{k|k}^{(2)} $。这个过程循环进行。

卡尔曼滤波器流程(顺序融合):

传感器 1:
预测:$ hat{mathbf{x}}_{k|k1}^{(1)} = mathbf{F}_k hat{mathbf{x}}_{k1|k1} + mathbf{B}_k mathbf{u}_k $
预测协方差:$ mathbf{P}_{k|k1}^{(1)} = mathbf{F}_k mathbf{P}_{k1|k1} mathbf{F}_k^T + mathbf{Q}_k $
更新:$ hat{mathbf{x}}_{k|k}^{(1)} = hat{mathbf{x}}_{k|k1}^{(1)} + mathbf{K}_k^{(1)} (mathbf{z}_k^{(1)} mathbf{H}_k^{(1)} hat{mathbf{x}}_{k|k1}^{(1)}) $
协方差更新:$ mathbf{P}_{k|k}^{(1)} = (mathbf{I} mathbf{K}_k^{(1)} mathbf{H}_k^{(1)}) mathbf{P}_{k|k1}^{(1)} $
传感器 2:
预测(基于传感器1的输出):$ hat{mathbf{x}}_{k|k1}^{(2)} = hat{mathbf{x}}_{k|k}^{(1)} $
预测协方差:$ mathbf{P}_{k|k1}^{(2)} = mathbf{P}_{k|k}^{(1)} $
更新:$ hat{mathbf{x}}_{k|k}^{(2)} = hat{mathbf{x}}_{k|k1}^{(2)} + mathbf{K}_k^{(2)} (mathbf{z}_k^{(2)} mathbf{H}_k^{(2)} hat{mathbf{x}}_{k|k1}^{(2)}) $
协方差更新:$ mathbf{P}_{k|k}^{(2)} = (mathbf{I} mathbf{K}_k^{(2)} mathbf{H}_k^{(2)}) mathbf{P}_{k|k1}^{(2)} $
依此类推…

优点:

计算量较小: 避免了大型矩阵的逆运算,计算量相对较低。
易于实现: 相对容易实现和管理。
容忍传感器数据可用性不均: 如果某个传感器的数据暂时不可用,可以直接跳过该传感器的融合步骤。

缺点:

次优性: 顺序融合会丢失一些统计信息,不是理论最优的。融合的顺序会影响最终结果,尤其是在传感器噪声特性差异较大的情况下。
信息传递延迟: 信息传递是串行的,如果传感器数据时间戳差异较大,可能需要额外的处理。

2.2. 協方差交织/信息融合 (Covariance Intersection / Information Fusion)

在分布式卡尔曼滤波中,每个传感器节点可以维护自己的状态估计和协方差矩阵。然后通过一个中心节点或节点间的通信,将这些局部估计进行融合。这种方法避免了直接传递原始测量值,而是传递估计值和其不确定性。

概念:

状态信息(State Information): 除了状态向量 $ hat{mathbf{x}} $ 和协方差矩阵 $ mathbf{P} $,还可以使用“信息向量” $ mathbf{y} = mathbf{P}^{1} hat{mathbf{x}} $ 和“信息矩阵” $ mathbf{Y} = mathbf{P}^{1} $。
融合规则: 存在一些融合规则,可以将多个局部估计的信息进行有效结合。一个经典的例子是Jacobson的协方差交织算法,它提供了一种在未知关联情况下融合两个高斯分布的方法,保证了融合后协方差矩阵的凸组合,并且融合后的协方差小于任何一个单独的协方差(在矩阵范数意义下),从而减少了不确定性。

信息融合的数学形式:

假设有两个独立的估计 $ (hat{mathbf{x}}_1, mathbf{P}_1) $ 和 $ (hat{mathbf{x}}_2, mathbf{P}_2) $。融合后的估计 $ (hat{mathbf{x}}_f, mathbf{P}_f) $ 可以通过最小化某个风险函数来获得,例如:

$ mathbf{P}_f = (mathbf{P}_1^{1} + mathbf{P}_2^{1})^{1} $ (这是最优融合在知道精确关联时的形式,但实际中使用较少,因为需要直接融合后验信息)

更常用的信息融合方法是加权平均,但需要对权重进行仔细选择,使其满足不确定性减小的要求。例如,一种简单的方法是通过考虑不确定性的倒数来加权:

$ mathbf{P}_f^{1} = mathbf{P}_1^{1} + mathbf{P}_2^{1} $
$ hat{mathbf{x}}_f^{1} = mathbf{P}_1^{1} hat{mathbf{x}}_1 + mathbf{P}_2^{1} hat{mathbf{x}}_2 $ (这在信息形式下是正确的,需要转换回状态形式)

信息形式下的融合过程:

1. 每个节点维护其状态的信息矩阵 $ mathbf{Y}_i = mathbf{P}_i^{1} $ 和信息向量 $ mathbf{y}_i = mathbf{P}_i^{1} hat{mathbf{x}}_i $。
2. 通过通信将这些信息($ mathbf{Y}_i, mathbf{y}_i $)发送到中心节点或共享。
3. 中心节点将接收到的信息矩阵和向量相加:
$$ mathbf{Y}_{fused} = sum_i mathbf{Y}_i $$
$$ mathbf{y}_{fused} = sum_i mathbf{y}_i $$
4. 计算融合后的协方差矩阵和状态向量:
$$ mathbf{P}_{fused} = mathbf{Y}_{fused}^{1} $$
$$ hat{mathbf{x}}_{fused} = mathbf{P}_{fused} mathbf{y}_{fused} $$

优点:

可扩展性: 适用于大规模传感器网络。
灵活性: 不需要所有传感器数据在同一时间点同步。
通信效率: 只传递估计值和协方差,而非原始测量值。

缺点:

需要信息传递机制: 需要有效的通信协议来交换局部估计。
可能需要预先定义融合策略: 融合规则的选择可能需要根据具体场景。
协同卡尔曼滤波器 (Cooperative Kalman Filter): 这是信息融合的一个重要分支,其中传感器节点之间进行迭代的通信和融合,以达到比顺序融合更好的性能。

策略三:基于扩展卡尔曼滤波器 (EKF) 或无迹卡尔曼滤波器 (UKF) 的融合

当系统模型或测量模型是非线性的时,需要使用扩展卡尔曼滤波器 (EKF) 或无迹卡尔曼滤波器 (UKF)。这些滤波器在多传感器融合中也有类似的应用策略:

集成式 EKF/UKF: 将所有传感器的非线性测量模型合并成一个大的非线性测量模型,然后在一个全局 EKF/UKF 框架内进行融合。
去中心化 EKF/UKF: 每个传感器节点使用其局部的非线性模型进行滤波,然后将结果通过信息融合或协方差交织等方法进行整合。

4. 处理异构传感器数据的具体问题

在多传感器融合时,传感器可能测量不同类型的数据,或者采样率不同,或者坐标系不同。

坐标系变换: 需要将所有传感器的测量值转换到同一个参考坐标系下。这通常涉及旋转矩阵和平移向量的乘法。如果这些变换本身也包含不确定性,则需要将变换的不确定性传递到测量方程的 $ mathbf{H} $ 矩阵或 $ mathbf{R} $ 矩阵中。
采样率差异:
插值法: 将低采样率传感器的测量值通过插值(如线性插值、样条插值)提高到高采样率传感器的时间戳上。
预测法: 在没有高采样率测量值的情况下,利用系统的动态模型预测到需要融合的时间点。
多速率滤波: 使用更复杂的滤波器设计来同时处理不同采样率的数据。
测量模型差异:
如果传感器 $i$ 直接测量状态 $ mathbf{x} $ 的一部分,那么 $ mathbf{H}_i $ 就是将这部分状态提取出来。
如果传感器测量的是状态的某个函数 $ h(mathbf{x}) $,那么 $ mathbf{H}_i $ 就是在该函数上的雅可比矩阵(对于 EKF)或者直接使用该函数(对于 UKF)。
噪声协方差 $ mathbf{R}_k $ 的确定: $ mathbf{R}_k $ 是传感器噪声的方差,需要根据传感器的技术指标和实际测试来确定。在融合时,如果不同传感器测量的是同一物理量,其 $ mathbf{R} $ 矩阵的维度要匹配。

5. 卡尔曼滤波器在多传感器融合中的高级应用

多模型卡尔曼滤波器 (Multiple Model Kalman Filter MMKF): 当系统可能存在多种工作模式(例如:正常模式、制动模式),每种模式有不同的动态模型时,可以使用 MMKF。融合来自不同传感器的信息可以帮助判断系统处于哪种模式。
粒子滤波器 (Particle Filter) 与卡尔曼滤波器结合: 对于高度非线性系统,卡尔曼滤波器(包括 EKF、UKF)可能失效。这时可以考虑使用粒子滤波器进行状态估计,然后将来自不同传感器的测量值作为粒子滤波器更新的依据。或者,将粒子滤波器的输出作为卡尔曼滤波器的初始值或用于修正卡尔曼滤波器的某些参数。
基于图优化的融合 (Graphbased Fusion) 与卡尔曼滤波的结合: 在某些场景下,例如 SLAM(同步定位与地图构建),卡尔曼滤波器可以用于局部的连续状态估计,而图优化则用于全局的位姿和地图优化。传感器融合的结果(如里程计、激光雷达数据)会作为因子加入到图优化问题中。

总结

卡尔曼滤波器在多传感器融合中的核心作用是提供一个统一的数学框架,用于整合来自不同(可能带噪声且不确定的)传感器的数据,以获得对系统状态的最佳估计。

集成式卡尔曼滤波器是理论最优的方法,适合传感器数量不多且计算资源充足的情况。
去中心化/分布式卡尔曼滤波器(如顺序融合、信息融合)则是在大规模或计算受限场景下的有效解决方案,通过权衡最优性和计算效率来工作。

选择哪种策略取决于具体的应用场景、传感器数量、计算资源、实时性要求以及对估计精度的需求。理解卡尔曼滤波器的预测更新机制,以及如何将多传感器的测量方程、噪声特性有效地整合到这个框架中,是实现成功多传感器融合的关键。

网友意见

user avatar

请恕我直言,现有的三个答案都没答到题主问的点子上。题主问的是多传感器使用卡尔曼滤波进行信息融合,而不是单个传感器,也不是经典卡尔曼滤波器得原理。

多传感器指的是系统观测方程不只一个,相当于经典方法,在算新息得时候算法不一样。具体内容我稍后填坑

更新。。。。。。。。。。。。。。。。。。。。。。

首先说题设,先看题设,卡尔曼滤波的多传感器信息融合指的是有以下系统:

w是建模噪声。和传统系统最大的区别是,它的观测方程是有n个的,大于一个,并且每个传感器测到的量不一样,这个传感器上的噪声的统计特性也可以是不一样的。

而回头看单传感器的观测器:

卡尔曼滤波的关键就是这个方程里的L(即卡尔曼增益)是怎么选取。到了多传感器的情况下,问题在于:

(1)不能直接算了,因为维度不一样。

(2)怎么选取最优增益L。

和现在大家讨论的不同的是,它的预测还是使用

计算出来的,而并非是用传感器A做预测,使用传感器B做新息。而是传感器A和B的观测数值都给算到新息里面去了

细节公式还是建议大家直接去看paper吧,还是比较长的,我就不往上敲了。

Multi-sensor optimal information fusion Kalman filter
user avatar

我在做毕设的时候有用kalman滤波得角度的算法,滤波程序不是我自己写的,但对kalman滤波也算是弄个半懂了。主要是没弄太懂参数、矩阵是如何得到的。

我用的是mpu6050,是个六轴的陀螺仪(3轴加速度+3轴叫速度,也就是三个方向的角速度+加速度),由两个轴的角加速度可以得到角度,但是抖动什么的对它的干扰太大,角速度积分也可以得到角度,但是因为是积分,会有累积误差。简单来说,由角速度得到的角度和加速度得到的角度都不是真实的角度值,需要将两者进行一定比例的融合,kalman滤波就是做这事的。kg(卡尔曼增益)决定两种方法得出的角度哪个可信度比较高,最后按比例将两者数据加在一起。

先简单这么说说,等有空了再贴具体的过程,论文还在我电脑里。

-------------------------------------------------------------------------------------------------------------------------------------------

我回来粘论文了!我看lz的提问,想必卡尔曼滤波的原理应该懂得差不多了,我就不再多赘述了。主要讲讲在实际中的运用了。我是学电子的,毕设做的东西有实物,不是纯软件、做些仿真的。

先介绍我做的东西的硬件基础吧,主要是两个芯片(或者可以说是芯片组成的外围电路)--MPU6050和stm32。MPU6050上面介绍了,不再说了,stm32 就是一单片机,卡尔曼的滤波就在stm32里处理。简单来说就是:

MPU6050得到的角度(两个方向的加速度经过反三角函数得到的)和一个方向的角速度送到stm32里进行卡尔曼滤波,得到最优估计的角度。

-----------------------------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------------

在这儿,我介绍一下滤波的必要性,开头也简单说明了。如果不想看这点的人可以略过。而且大部分的东西都是找到的资料里介绍的。

虽然MPU6050可以读出X轴、Y轴和Z轴的加速度,理论上是可以根据X轴和Z轴加速度由式(3-1)得出小车的倾角。

(3-1)


但在实际情况中,静止时MPU6050输出的角度信息噪声非常大;并且加速度计的输出实际包括a方向的加速度和重力加速度分量的叠加。这些干扰信号叠加在测量信号中会使输出信号无法得出准确的角度,如图3-1所示。

图3-1 小车运动过程中引起的加速度信号波动


小车行驶时产生的加速度使得输出加速度在实际倾角附近波动。这些噪声虽然可以通过数据平滑滤波将其滤除,但这一方面会使系统的实时性变差(无法及时输出当前角度值);另一方面,平滑滤波也会将角速度变化信息率除掉。因此,为了得到所需要的准确的平衡角度信息,需要融合MPU6050的陀螺仪数据。


陀螺仪可以得到物体当前运动的角速度。对角速度积分就可以得到角度。角速度由于不会受到小车运动的影响,因此该信号的噪声信号很小,得到的角度信号也就跟平稳。然而角速度经过积分运算后,角度信号中存在的微小偏差和飘逸经过积分运算后会逐渐累计。随着时间的延长,误差逐步增加,最终导致电路饱和,无法得到正确的信号,如图3-2。

图3-2 角度积分漂移现象


为了消除这个误差,在此采用卡尔曼滤波方法。加速度计输出和陀螺仪输出是互相弥补的关系:加速度计科院弥补陀螺仪输出零点受温度影响的缺陷,使积分输出信号的误差大大减少;而陀螺仪则可以减少加速度计输出噪声,加大的降低了静态输出噪声。



-----------------------------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------------

然后这儿就是卡尔曼滤波的具体运用了!!!


卡尔曼滤波主要是运用5个方程(推导看了半天…………真心看的晕了):两个预测方程和3个更新方程。

预测方程:(公式就直接截图我论文里打的了,公式编辑器打的公式复制不过来)

更新方程:

-----------------------------------------------------------------------------------------------------------------------------------------------------

在这儿粘些简单的文字性原理描述

卡尔曼滤波器在线性系统中产生最优估计,因此,传感器或者系统必须是(接近)线性系统才能被运用卡尔曼滤波。因为仅仅依靠上一次系统状态和定义系统状态被修正概率的方差矩阵,所以卡尔曼滤波器不需要很长的系统状态历史来经行滤波。这点在可确保系统的高实时性要求。


卡尔曼滤波有两类方程:预测方程和更新方程。预测方程根据之前的状态和控制量预测当前状态;更新方程表示相信传感器数据多些还是相信总体估计值多些(由卡尔曼增益Kg决定)。滤波器的大致工作原理为:根据预测方程预测当前状态并用更新方程检测预测结果,该过程一直在重复更新当前状态。预测方程和更新方程的关系如图3-3所示。

图3-3 预测方程与更新方程关系



这5个方程的关系就简单用一个流程图介绍下了:

-----------------------------------------------------------------------------------------------------------------------------------------------------

lz最想看的可是这一段了!!!!具体的kalman滤波代码:

       float K1 =0.02;  float angle, angle_dot;   float Q_angle=0.001;// 过程噪声的协方差 float Q_gyro=0.003;//0.003 过程噪声的协方差 过程噪声的协方差为一个一行两列矩阵 float R_angle=0.5;// 测量噪声的协方差 既测量偏差 float dt=0.005;//                  char  C_0 = 1; float Q_bias, Angle_err; float PCt_0, PCt_1, E; float K_0, K_1, t_0, t_1; float Pdot[4] ={0,0,0,0}; float PP[2][2] = { { 1, 0 },{ 0, 1 } }; void Kalman_Filter(float Accel,float Gyro)   {  angle+=(Gyro - Q_bias) * 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 = Accel - angle; //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 += K_0 * Angle_err;  //后验估计  Q_bias += K_1 * Angle_err;  //后验估计  angle_dot   = Gyro - Q_bias;  //输出值(后验估计)的微分=角速度 }      

因为每个人有不同的矩阵运算定义,这里就将矩阵的运算用数组来进行运算处理了。

在这里看代码的两个入口参数楼主就知道kalman滤波的运用了吧。不过还要在此进行解释一下!!!!

代码里的卡尔曼滤波有一个周期dt !!!!! 这就要设计到和硬件结合了。

因为MPU6050(陀螺仪)采集数据有个采样频率,采样频率设置为200,也就是周期0.005s。MPU6050每次采样结束,就会产生一个中断,这个中断告诉stm32该进行卡尔曼滤波了。dt我的理解,不仅仅是简单的kalman的滤波周期,同时在底下的(4-1)式中,有一个乘dt的操作,这也是得角度的一个过程(角速度乘时间为角度)。

---------------------------------------------------------------------------------------------------------------------------------------------------

接下来就是代码的解释了。

卡尔曼滤波代码主要根据式(3-2)~(3-6)5个公式来写的。


在此,以Y轴角速度在时间上的积分为预测值的控制量,即U(k)=Gyro_Y;俯仰角(pitch=arctan(ACCEL_X/ACCEL_Z))作为观测值,即Z(k)=pitch。


因为需要同时得到Y轴的角速度和pitch角,所以进行卡尔曼滤波时需要估计两个值,一个是pitch角,另一个是陀螺仪漂移Q_bias。根据式(3-2)建立角度测量模型方程:

(原谅我要直接截图了,公式编辑起来实在麻烦)



我写的对代码的解释可能看起来不是那么清晰,lz也可以参考百度文库上的一篇文章。内容差不多,就排版方式的问题了。

卡尔曼滤波C代码分析

--------------------------------------------------------------------------------------------------------------------------------------------

最后也再来加两张滤波效果图。数据是用串口传送到上位机上,然后用matlab画了个图

图 5-1 静态时角度滤波效果




图5-2 动态时角度滤波效果

个人感觉还是静态时候的滤波效果比较好些,动态效果也还行,但是感觉没那么明显。其实我也只是看着个图自己理解下而已,怎么分析还是不大懂。


然后po一张最后的实物图

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

完!后续有问题再补充!

类似的话题

  • 回答
    卡尔曼滤波器在多传感器融合中的应用:详细解读卡尔曼滤波器(Kalman Filter)是一种强大的递归估计算法,它通过结合一系列包含噪声的测量值,并考虑系统的动态特性,来估计一个动态系统的状态。在多传感器融合(MultiSensor Fusion)的场景下,卡尔曼滤波器能够有效地整合来自不同传感器的.............
  • 回答
    卡尔曼滤波,这个听起来有些“技术宅”的术语,实际上却隐藏着许多令人惊叹的“魔法”,能让那些原本混沌不清、充满噪声的系统变得更加智能、精准和可预测。它不仅仅是一个数学工具,更是一种解决现实世界复杂问题的强大思维方式。下面我就来给你详细讲述一下卡尔曼滤波可以做哪些很酷很有趣的事情,并且尽量详细一些:核心.............
  • 回答
    卡尔曼滤波,这个名字听起来有点高大上,但其实它的核心思想非常接地气,就像我们生活中处理不确定性一样。想象一下,你想知道一辆车在路上的确切位置,但你手里只有一块不太准的GPS,它会告诉你一个大概范围,但不会给你一个绝对精确的点。同时,你也知道这辆车会怎么开,比如它会加速或者减速,这个运动规律是相对可预.............
  • 回答
    好的,非常乐意为您介绍关于自动控制(反馈控制理论、状态估计、卡尔曼滤波等)历史的书籍。这些领域的发展是一个渐进的过程,汇集了数学、工程、物理等多个学科的智慧。以下是一些具有代表性的书籍,我将尝试详细讲述它们如何描绘这段历史: 经典入门与发展脉络:1. 《现代控制工程》(Modern Control.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有