根据您的应用程序所需的准确度,您可能需要解决以下几个问题:
1. 加速度计轴是否已校准?我见过MEMS加速度计其轴不相互垂直,并且每个轴具有明显不同的响应特性(通常X和Y会匹配,而Z会不同)。您需要从设备提供的任何物理读数中合成理想的XYZ轴。 (搜索“加速度计校准”)
2. 磁力计轴是否已校准?与上述问题类似,但难度更大:很难产生均匀校准的磁场。如果使用环境地磁场,则需要仔细控制工作环境和工具的局部磁性。 (搜索“磁力计校准”)
3. 在加速度计和磁力计分别进行校准后,它们的轴需要相对彼此进行校准。由于这两个设备通常焊接在PCB上,因此几乎肯定存在重大的错位。在许多情况下,板子布局和设备参数甚至可能不允许XYZ轴相互对应!这可能是从实验室角度最难的部分,因此我建议您使用其他已经校准了这两种传感器的硬件进行直接比较(例如iPhone或Android手机-但在使用之前请验证设备)。通常,这是通过调整前两个校准矩阵来完成的,直到它们生成正确对齐的向量为止。
4. 仅在您生成相互校准的磁场和加速度计向量后,才能应用其他回答者建议的解决方案。
我只描述了静态解决方案,其中磁力计和加速度计相对于当地的重力和磁场均保持静止。如果您需要在系统快速移动时实时生成响应,则需要考虑每个传感器的时间行为。有两种基本方法可以做到这一点:1)对每个传感器应用时域滤波器,以使它们的输出共享一个公共时间域(通常会添加一些延迟)。2)使用预测建模实时修改传感器输出(延迟较少,但噪声更多)。
我见过Kalman滤波器用于此类应用,但在向量域中应用它们可能需要使用四元数而不是欧拉矩阵。四元数在计算上更容易使用(与矩阵相比需要更少的操作),但我发现它们更难理解和正确使用。
或者,您可以选择完全不同的路径,并使用统计和数据拟合一次完成所有上述工作。考虑以下问题:给定6个输入值(XYZ分别来自未校准的磁力计和加速度计)和对设备的引用(假设它是手持的,并且在外壳上绘制了一个箭头),输出表示指向外壳箭头的磁性方位以及相对于重力矢量的箭头高度(外壳倾斜)。
使用校准过的参考设备(如上所述),将其与待校准的设备配对,并在不同方向下进行数百个数据点的采集。然后使用强大的数学软件包,如Matlab、MathCAD、R或SciPy来设置和解决非线性方程,以创建变换矩阵。