filtering - 卡尔曼滤波器中的协方差矩阵 (P) 如何根据测量值和状态估计更新?
问题描述
我正在用 C++ 实现基于卡尔曼滤波器的 AHRS。过滤器的方程式对我来说有些奇怪。
我找不到实际更新 P(协方差)矩阵以表示预测不确定性的部分。在“预测”步骤中,P 估计值是根据其先前的值 A 和 Q 计算的。据我所知,A(系统矩阵)和 Q(噪声协方差)是恒定的。然后在“正确”期间,根据 K、H 和预测 P 计算 P。H(观察矩阵)是常数,因此影响 P 的唯一变量是 K(卡尔曼增益)。但是 K 是根据预测的 P、H 和 R(观察噪声)计算得出的,它们要么是常数,要么是 P 本身。那么使 P 与 x 相关的方程部分在哪里呢?对我来说,似乎 P 在这里递归循环仅取决于 P 的常量和初始值。这没有任何意义。我错过了什么?
解决方案
你没有错过任何东西。
令人惊讶的是,线性卡尔曼滤波器中的状态误差协方差矩阵 (P) 确实不依赖于数据 (z)。减少意外的一种方法是注意协方差的含义:考虑到您使用的模型(实际上是 A、Q 和 H、R)是准确的,您应该处于估计状态的不确定性。这并不是说:这是不确定性。通过明智地调整 Q 和 R,您可以任意更改 P。特别是,您不应将 P 解释为“质量”数字,而应查看观察残差。例如,您可以通过减小 R 来使 P 更小。但是,与计算出的 sd 相比,残差会更大。
当观察以恒定的速率进入时,并且始终是相同的一组观察,P 将趋于稳定状态,原则上可以提前计算。
然而,当您在每次观察之间有不同的时间和不同的观察集时,应用卡尔曼滤波器没有困难,例如,如果您有具有不同采样周期的各种传感器系统。在这种情况下,您将看到 P 的更多变化,尽管原则上这可以提前计算。
此外,卡尔曼滤波器可以扩展(以各种方式,例如扩展卡尔曼滤波器和无迹卡尔曼滤波器)以处理非线性动力学和非线性观察。在这种情况下,因为转移矩阵 (A) 和观察模型矩阵 (H) 具有状态依赖性,所以 P 也是如此。
推荐阅读
- c# - Sharepoint在线CSOM生成列表项显示url
- c++ - 为什么 C++ 编译器不能知道指针指向派生类?
- python - spaCy - 自定义模型上的文本处理
- php - PHP从项目列表创建数组
- javascript - Laravel:如何在创建后停留在页面上再创建一个项目
- amazon-web-services - 在 AWS 中创建具有多个值的标签
- python - 使用 Python3 抓取雅虎财经
- spring - 自动装配 Bean 的 Spring 配置文件
- java - 在选择处于活动状态时添加/删除时线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常
- delphi - 我可以使用 Delphi 10.3 或 10.4 Professional 通过 FireDAC 连接到远程 Firebird 数据库吗?