测量非固定Android设备的垂直移动

时间:2015-07-07 12:43:06

标签: android-sensors sensor-fusion

我的目标是制作一款Android移动应用程序(SDK16 +),可以在骑自行车时测量道路质量。

我发现Sensor fusion demo for Android我认为会为我做所有的测量。

如果手机没有以某个方向固定,我怎样才能获得垂直移动?

1 个答案:

答案 0 :(得分:0)

问题

这里的问题是你有两个坐标系统,你的设备的dx,dy,dz和周围世界的wX,wY,wZ。当您移动设备时,两者之间的关系会发生变化。

制定问题的另一种方法是:

  

给定传感器读数[dx,dy,dz],如何找到与wZ平行的读数分量?

解决方案

幸运的是,方向传感器(例如Android自己的ROTATION_VECTOR传感器)提供了这两个坐标系之间转换的工具。

例如,ROTATION_VECTOR传感器的输出形式为axis-angle表示您的设备从某些特定的" base"旋转固定在世界框架中(另请参阅:Quaternions)。

Android提供方法SensorManager#getRotationMatrixFromVector(float[] R, float[] rotationVector),它从传感器获取轴角度表示并将其转换为rotation matrix。旋转矩阵用于将在一个参照系中给出的矢量变换为另一个参考帧(在本例中为[World - > Device])。

现在,您想将设备帧中的测量值转换为世界帧吗?没问题。旋转矩阵的一个很好的特征是旋转矩阵的逆是相反变换的旋转矩阵(在我们的例子中是[设备 - >世界])。另一个甚至更简单的事情是,旋转矩阵的逆是它的转置。

因此,您的代码可以遵循以下方式:

public void findVerticalComponentOfSensorValue() {
    float[] rotationVectorOutput = ... // Get latest value from ROTATION_VECTOR sensor
    float[] accelerometerValue = ... // Get latest value from ACCELEROMETER sensor

    float[] rotationMatrix = new float[9]; // Both 9 and 16 works, depending on what you're doing with it
    SensorManager.getRotationMatrixFromVector(rotationMatrix, rotationVectorOutput);

    float[] accelerationInWorldFrame = matrixMult(
            matrixTranspose(rotationMatrix), 
            accelerometerValue); 
    // Make your own methods for the matrix operations or find an existing library

    accelerationInWorldFrame[2] // This is your vertical acceleration
}

现在,我并不是说这是最好的解决方案,但它应该做你想做的事。

<强>声明

将使用传感器融合的设备(包括磁力计)捆扎到金属框架上可能会产生不一致的结果。由于你的罗盘标题在这里并不重要,我建议使用一种不涉及磁力计的传感器融合方法。