我的目标是制作一款Android移动应用程序(SDK16 +),可以在骑自行车时测量道路质量。
我发现Sensor fusion demo for Android我认为会为我做所有的测量。
如果手机没有以某个方向固定,我怎样才能获得垂直移动?
答案 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
}
现在,我并不是说这是最好的解决方案,但它应该做你想做的事。
<强>声明强>
将使用传感器融合的设备(包括磁力计)捆扎到金属框架上可能会产生不一致的结果。由于你的罗盘标题在这里并不重要,我建议使用一种不涉及磁力计的传感器融合方法。