对于Android应用程序,我需要跨全球(世界)坐标系的轴进行磁场测量.这是我要(猜测)实现此目标的方式.请帮我纠正.另外,请注意,问题与任务的算法部分有关,而不与传感器的Android API有关-我对后者有经验.
第一步是获取TYPE_MAGNETIC_FIELD传感器数据(M)和TYPE_ACCELEROMETER传感器数据(G).第二个应该根据Android的文档使用,但是我不确定是否不应该使用TYPE_GRAVITY(还是G),因为加速度计似乎不能提供纯重力.
下一步是通过getRotationMatrix(R,I,G,M)获得旋转矩阵,其中R和I分别是旋转矩阵和倾斜矩阵.
现在最可疑的部分是:为了将M向量转换为世界坐标系,我想将[R * I] * M相乘.
我不确定这是否是将磁场读数转换为其他基础的正确方法.另外,我不知道是否应将remapCoordinateSystem用作上述内容的补充或替代.
如果有已经执行此操作的源代码,我将不胜感激地发布一个链接,但是我不想为该特定任务使用大型通用库(例如,用于增强现实支持),因为我愿意喜欢保持尽可能简单.
附:
我想到这个想法是为了清楚起见在原始帖子中添加一些信息.
让我们假设一个设备放在桌子上,并从其磁传感器连续读取数据.每次测量都包含3个值,分别代表设备的局部坐标系,X,Y,Z轴上的磁场.我认为我可以忽略环境场的波动(由低通滤波器消除),因此这3个值在设备保持原位的过程中应保持几乎相同.如果我们绕任何轴旋转设备,则值都会更改,因为我们会更改局部坐标系.但是字段本身并没有实际更改.因此,我想将局部X,Y,Z场测量值转换为这样的X’,Y’,Z’,只要设备不从其位置移动(仅旋转),它们就保持各自的值而与设备旋转无关.
我已经实现了上述算法,并通过建议的转换获得了值X’,Y’,Z’的规则且引人注目的变化,所以其中有些错误.
P.P.S.
有时候,我在SO上找到了与我的问题完全相同的副本-How can I get the magnetic field vector, independent of the device rotation?-但不幸的是答案包含了我的建议,该问题的OP确认它们不起作用.
解决方法:
M相对于单词坐标的坐标只是乘积R * M.
旋转矩阵R在数学上是基本矩阵从设备坐标到字坐标的变化.
假设X,Y,Z为设备坐标基础,而W_1,W_2,W_3为字坐标基础,则
M = m_1 X m_2 Y m_3
并且
M = c_1 W_1 c_2 W_2 c_3 W_3
其中R *(m_1,m_2,m_3)=(c_1,c_2,c_3)转置.
低通滤波器仅用于滤除X,Y方向的加速度. RemapCoordinateSystem用于更改基础的顺序,即从W_1,W_2,W_3更改为W_1,W_3,W_2.