Android加速 - 转换为用户坐标系

时间:2016-02-15 04:30:49

标签: android accelerometer android-sensors coordinate-systems coordinate-transformation

当用户在口袋中放置手机时,我希望能够在用户坐标系中沿XYZ捕捉加速度。我说用户协调系统有两个原因:

  1. 设备在口袋中的方向无关紧要,无论方向如何,都应该给我相同的XYZ加速度值
  2. 相对于世界坐标系的行走方向应该无关紧要,所以从西向东走,从东向西走,应该给我相同的数字
  3. 我的问题是,从基于设备的加速转换为基于用户的数学需要什么?

    我已经看到了一个类似的线程:Android Convert device coordinate system to "user" coordinate system,但是没有答案,而且我想在没有校准阶段(其他线程允许的话)的情况下实现这个目标。

    我还看到了从设备坐标系转换到世界坐标系的线程:Acceleration from device's coordinate system into absolute coordinate system

    我已经实现了以下内容:

    float[] accelerometerMatrix = new float[3];
    float[] accelerometerWorldMatrix = new float[3];
    float[] gravityMatrix = new float[3];
    float[] magneticMatrix = new float[3];
    float[] rotationMatrix = new float[9]; 
    
    <code to get and store the sensor values into the respective matrices>
    
    SensorManager.getRotationMatrix(rotationMatrix, null, gravityMatrix, magneticMatrix);
    
    accelerometerWorldMatrix[0] = rotationMatrix[0] * accelerometerMatrix[0] + rotationMatrix[1] * accelerometerMatrix[1] + rotationMatrix[2] * accelerometerMatrix[2];
    accelerometerWorldMatrix[1] = rotationMatrix[3] * accelerometerMatrix[0] + rotationMatrix[4] * accelerometerMatrix[1] + rotationMatrix[5] * accelerometerMatrix[2];
    accelerometerWorldMatrix[2] = rotationMatrix[6] * accelerometerMatrix[0] + rotationMatrix[7] * accelerometerMatrix[1] + rotationMatrix[8] * accelerometerMatrix[2];
    

    该代码虽然适用于它的功能,但却将加速度计XYZ值放在世界空间中。现在我需要从那里到用户空间。

    最终,当用户向前走时,我希望能够获得该加速度值,而不管1)他们走进哪个方向,以及2)设备如何在他们的口袋中定向。使用上面的代码,当用户面向NorthEast时向前走,XYZ值将与他们走向SouthWest时不同,为了我的目的,他们需要是相同的,因为用户仍在“向前”移动

    有没有办法实现这个目标?我将考虑校准阶段的答案,但理想情况下我想完全跳过任何校准阶段

0 个答案:

没有答案