我了解可用于 Blackberry 程序的 x/y/z G 力值和“方向”数据。
我的问题是如何提取旋转/方向 RAW-DATA?(如程序员用于“Blackberry-Spirit-Level”应用程序)
“Orientation” API 似乎返回常量ORIENTATION_TOP_UP
,ORIENTATION_RIGHT_UP
而不是某种程度的浮点数。
我了解可用于 Blackberry 程序的 x/y/z G 力值和“方向”数据。
我的问题是如何提取旋转/方向 RAW-DATA?(如程序员用于“Blackberry-Spirit-Level”应用程序)
“Orientation” API 似乎返回常量ORIENTATION_TOP_UP
,ORIENTATION_RIGHT_UP
而不是某种程度的浮点数。
我认为没有直接的方法来获取设备方向角度,但您可以使用AccelerometerSensor
您提到的类提供的原始数据来计算它们。
查看他们在 API 文档中显示的示例,您可以获得原始 X、Y 和 Z 加速度数据。然后,您使用三角函数来确定角度是多少。例如,一个设备的 Z 轴指向正下方(并且不移动......或相对于地球加速),将给出一个等于G的 Z 加速度值,即重力加速度。
如果将设备保持在其他角度,则沿该轴的加速度值将减少轴与朝向地球的垂直线之间夹角的正弦/余弦值。
此示例代码显示了如何获得其中一些角度:
public void run()
{
// open channel
Channel rawDataChannel = AccelerometerSensor.openRawDataChannel( Application.getApplication() );
// create raw sample vector with three components - X, Y, Z
short[] xyz = new short[ 3 ];
while( isRunning() ) {
// read acceleration
rawDataChannel.getLastAccelerationData( xyz );
// process the acceleration
process( xyz );
// sleep for maintaining query rate
try {
Thread.sleep( 500 );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// close the channel to stop sensor query routine
rawDataChannel.close();
}
private void process(short[] xyz) {
short X = xyz[0];
short Y = xyz[1];
short Z = xyz[2];
final double roll = MathUtilities.atan2(X, Z) * 180.0 / Math.PI;
final double pitch = MathUtilities.atan2(Y, Math.sqrt(X*X + Z*Z)) * 180.0 / Math.PI;
final double tilt = MathUtilities.acos(Z / Math.sqrt(X*X + Y*Y + Z*Z)) * 180.0 / Math.PI;
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
String output = "Angles are {" + roll + ", " + pitch + ", " + tilt + "}";
textField.setText(output);
}
});
}
有关滚动、俯仰和倾斜的含义的参考,请参阅此文档。这就是数学的来源。
这不是来自我编写的生产应用程序,因此代码尚未经过彻底测试。角度的符号可能是错误的,方程中可能存在不稳定性,或其他类似的事情。
此外,如果您使用的是原始加速度计数据,则需要实现校准功能。如果您运行任何类型的智能手机级应用程序,您将看到一个如何完成的示例。因此,上面计算的结果将需要根据您的校准常数进行调整。
最后,原始加速度计数据可能很嘈杂,因此您可能还需要过滤/平滑数据,具体取决于您希望如何使用它。
这只是一个起点。祝你好运!