我想在还可以使用三轴陀螺仪的情况下校准三轴磁力计。
我敢肯定,我可以使用各种优化算法来解决此问题,但是我更喜欢对数字使用无味的卡尔曼滤波器我稍后将讨论的原因有很多,简而言之:因为它是在线的,允许更改,并且显式地暴露了不确定性。 –我真的看不到它的协方差矩阵如何存储有关已确定和不确定的内容的足够信息,从而其递归过程可以消除现在不太可能的可能性。 />
使用无味的Kalman滤波器可以很好地解决此问题吗?
卡尔曼滤波器与批处理/离线优化算法一样好吗?
我应该如何添加归一化步骤我想了解的另一点是:我认为存在优化问题,其中(非线性)卡尔曼滤波器不适用,必须使用其他技术。我应该使用哪些因素来决定这一点?
背景
三轴磁力计产生随时间变化的3个矢量样本$ m_k $。这些在“身体框架”中。它们包含噪音。由于传感器的校准,设备的构造以及传感器周围的软铁和硬铁效应:测量值偏离原点的位置高度偏倚;测量值可能无法正确地与身体坐标系对齐;向量分量可能并非全部具有相同的增益,并且它们的轴向量可能彼此不正交。所有这些意味着未校准的传感器将无法给出真实的本地字段$ h $的有用指示。
校准磁力计的方法是在恒定磁场中将具有磁力计的设备旋转到许多姿势,并收集大量样本。将发现所有样本都位于椭球上。进行了最佳拟合,并确定了将椭球体转变为以原点为中心的单位球的映射。
我怀疑这种方法存在一些缺点:

磁场可能在这个过程中不是恒定的。
椭圆体的良好配合取决于椭圆体表面的相当均匀的采样,尤其是在其“极端”点。在人工协助的校准过程中可能不会发生这种情况。
该过程不能说明磁力计和设备机身之间的旋转。如果还可以使用陀螺仪,应该有可能获得更可靠,更准确和更快速的校准。
我相信所有这些都可以用以下方式建模:

$ h = R_k M(m_k-b)$

其中:


$ h $是真实的局部场(不是我要的卡尔曼观测函数使用$ \ mathbf {h} $表示–抱歉,术语重载);

$ R_k $ 3x3时变旋转矩阵从身体坐标转换为世界坐标;

$ M $一个3x3矩阵,可校正三轴磁力计的增益,旋转,非正交以及硬/软铁。

$ m_k $是磁力计的瞬时样本;

$ b $是磁力计的偏差。

这里的缩放比例没有限制,所以我ld添加了$ M $用$ \ det(M)= 1 $归一化的约束条件。我假设$ R_k $可以通过积分从陀螺仪获得。我正在使用的设备上的漂移似乎足够低。
我可以像这样收集“足够的”数据,然后进行优化以获得最佳拟合。所有样本的结果都应为相同的$ h $,因此这应该可以确定未知参数。
但是,我想使用无味的卡尔曼滤波器。

卡尔曼过滤器应允许$ h $在校准期间发生变化(由于局部场干扰),并且类似地允许$ R_k $发生一定程度的漂移。估计参数,然后我可以运行该过程,直到参数“足够确定”为止,或者只是一直保持运行状态。可以向用户显示。
有可能向用户提供从协方差矩阵得出的指令反馈。这将指导用户以一种可以更快地减少已知剩余不确定性的方式移动设备。

卡尔曼滤波器模型
采用Unscented Kalman的过程和测量模型筛选器教程– Terejanu

$ x_k = \ mathbf {f}(x_ {k-1})+ w_ {k-1} $
$ z_k = \ mathbf {h}(x_k )+ v_k $

此处的卡尔曼滤波过程模型为身份:$ \ mathbf {f} = \ mathbf {I} $。除了噪声之外,没有任何其他过程,因此$ x_k = x_ {k-1} + w_ {k-1} $。我相信过程噪声仅在$ h_k $上–其他参数应在预期的时间范围内保持恒定。 $ z_k $只是磁力计读数$ m_k $。因此,$ z_k = m_k = M_k ^ {-1} R_k ^ {-1} h_k + b_k + v_k $
在状态变量$ x_k $中保持$ M_k ^ {-1} $ ,而不是$ M_k $。由于$ R_k $是旋转值,因此$ R_k ^ {-1} = R_k ^ \ top $
初始状态


$ M_0 $可以初始化为$ I $。

$ b_0 $可以初始化为第一个读取$ m_0 $的传感器,因为偏置的幅度似乎比信号大。

$ h_0 $可以是零矢量。 $ \ cos(\ theta)\约1 $是预期的小$ \ theta $角。
非对角线项将取决于最大预期$ \ theta $的差异,为$ \ sin(\ theta )\ approx \ theta $。
$ h $的方差应取决于期望字段的大小。
$ b $的方差–我不确定!
我认为初始值协方差可以为0吗?

摘要
问题是–它将用作卡尔曼滤波器并给出有用的结果吗?它至少会和批量优化一样好吗?还是我完全错了? –还应该在哪里添加规范化,使得$ \ det(M)= 1 $?
用Lapack来实现这一点使其在iPhone上运行看来这将是一笔相当大的投资,所以我想在开始之前一定能确定它会起作用!
进展

我构建了一个简单的应用程序来捕获数据从我的测试设备(iPhone)中获取。
我将数据导入了Julia中。我捕获的数据中的参数,并希望看到哪个效果更好。
(25/1/16)我有优化版本可能在起作用。在捕获时间范围内,“校正”后的读数似乎比预期的要有更多的(陀螺仪)漂移,所以我认为我需要重新审视/检查我对此的假设。 br />