参照真北计算加速度

4
对于我的应用程序,我需要计算设备相对真北的加速度。我的想法是计算设备方向到磁北极的方向,并将偏角应用于它以获得真北方向。然后我想计算设备的加速度并将其参考到方向,但我不知道该如何操作。
我会尝试使用 SensorManager.getRotationMatrix()SensorManager.getOrientation() 获取设备的方向。然后我通过 GeomagneticField.getDeclination() 获取偏角,并将其应用于来自 SensorManager.getOrientation() 的方向值的方位角度数。
但是,我该如何将加速度计的值映射到这个方向上呢?这是否可能?

如果我理解正确的话,你的意思是如果设备向西或向东移动,那么在这种情况下加速器值应该为0,对吗? - Hoan Nguyen
不,我需要以这种方式重新映射加速度计的轴,即当设备向北移动时,y值为正,向南移动时为负。当向东移动时,x值为正,向西移动时为负。目前不需要z值。我认为在这个问题中我找到了一个好的来源:https://dev59.com/wGgu5IYBdhLWcg3wGjZF - htz
当然,如果有一个不断朝任何方向运动的物体,其加速度应该为0,因为没有可测量的加速度。 - htz
以上链接中解决方案中的所有计算似乎都是不必要的。请查看我的解决方案。 - Hoan Nguyen
1个回答

8

加速度计传感器返回设备的加速度。这是三维空间中的向量。该向量以设备坐标系返回。您需要的是在世界坐标系下该向量的坐标,简单地说,就是

R = rotation matrix obtained by calling getRotationMatrix
A_D = accelerator vector return by sensor ( A_D = event.values.clone )
A_W = R * A_D is the same acceleration vector in the world coordinate system.

A_W is an array of dimention 3 
A_W[0] is acceleration due east.
A_W[1] is acceleration due north.

以下是用于计算的代码(假设gravitymagnetic包含其各自传感器的输出):

            float[] R = new float[9];
            float[] I = new float[9];
            SensorManager.getRotationMatrix(R, I, gravity, magnetic);
            float [] A_D = values.clone();
            float [] A_W = new float[3];
            A_W[0] = R[0] * A_D[0] + R[1] * A_D[1] + R[2] * A_D[2];
            A_W[1] = R[3] * A_D[0] + R[4] * A_D[1] + R[5] * A_D[2];
            A_W[2] = R[6] * A_D[0] + R[7] * A_D[1] + R[8] * A_D[2];

1
我相信你的答案可能是错误的(请参见我在https://dev59.com/wGgu5IYBdhLWcg3wGjZF中接受答案的评论)。 - ravemir
1
在android-sdk --> sources --> android-17 --> android --> hardware --> SensorManager中。或者你想要的任何android-number。 - Hoan Nguyen
你必须过滤线性加速度,这就是为什么你至少要使用低通滤波器的原因。你可以在https://dev59.com/_uo6XIcBkEYKwwoYORoV#15317814阅读我的答案。如果你使用TYPE_GRAVITY,它比低通滤波器更好。 - Hoan Nguyen
计算以下代码行:A_W = R * A_D,是否得到的是世界坐标系中相同的加速度向量? - gregm
代码是正确的。你必须举一个“值不完全合理”的例子。 - Hoan Nguyen
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接