1

我了解可用于 Blackberry 程序的 x/y/z G 力值和“方向”数据。

我的问题是如何提取旋转/方向 RAW-DATA?(如程序员用于“Blackberry-Spirit-Level”应用程序

“Orientation” API 似乎返回常量ORIENTATION_TOP_UPORIENTATION_RIGHT_UP而不是某种程度的浮点数。

4

1 回答 1

1

我认为没有直接的方法来获取设备方向角度,但您可以使用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);
        }
    });
}

有关滚动俯仰倾斜的含义的参考,请参阅此文档。这就是数学的来源。

其他问题

这不是来自我编写的生产应用程序,因此代码尚未经过彻底测试。角度的符号可能是错误的,方程中可能存在不稳定性,或其他类似的事情。

此外,如果您使用的是原始加速度计数据,则需要实现校准功能。如果您运行任何类型的智能手机级应用程序,您将看到一个如何完成的示例。因此,上面计算的结果将需要根据您的校准常数进行调整。

最后,原始加速度计数据可能很嘈杂,因此您可能还需要过滤/平滑数据,具体取决于您希望如何使用它。

这只是一个起点。祝你好运!

于 2012-12-01T06:59:48.073 回答