Android上可靠的传感器融合?

时间:2014-02-15 18:05:10

标签: android android-sensors

目前正致力于增强现实应用,我正在试验传感器。我尝试过使用原始传感器数据,通过SensorManager或一个传感器数据将加速度计+ magnetic_field与旋转矩阵相结合,但没有取得真正的成功。

阅读有关传感器融合的更多信息,我在Play商店中看到了一些应用程序,这些应用程序设法获得罗盘和滚动功能,例如这一个:3D陀螺指南针(https://play.google.com/store/apps/details?id=fi.finwe.gyrocompass&hl=de) - 传感器融合代码在LGPL之下,所以我决定给它一个镜头,但我的读数仍然偏离,方向有些搞砸了,所以看起来他们正在做更多。

Android方向是否有任何解决方案,例如让我在某种指南针/ AR应用程序中使用它们?谷歌到目前为止没有向我展示任何有用的东西

2 个答案:

答案 0 :(得分:2)

据我所知,在Android上使用传感器融合的最佳方法是TYPE_ROTATION_VECTOR。我在增强现实应用程序中使用它作为方向。它是一个复合传感器,其输出是使用加速度,磁力计和陀螺仪的最佳可用数据自动生成的。如果你想要很好的Roll-Pitch-Azimuth类型坐标而不是RotationVector输出,假设你只有RotationVector传感器,你可以这样做:

public void onSensorChanged(SensorEvent event) {
    float[] lastRotVal = new float[3];

    try{
        System.arraycopy(event.values, 0, lastRotVal, 0, event.values.length); 
    } catch (IllegalArgumentException e) {
        //Hardcode the size to handle a bug on Samsung devices running Android 4.3
        System.arraycopy(event.values, 0, lastRotVal, 0, 3); 
    }

    SensorManager.getRotationMatrixFromVector(rotation, lastRotVal);
    SensorManager.getOrientation(rotation, orientation);

    double pitch = orientation[1];
    double roll = orientation[2];
    double azimuth = orientation[3];

    //Use them for something!
}

如果要支持不支持RotationVector的旧设备,可以使用TYPE_ORIENTATION传感器,该传感器在新的API版本中已弃用。在这种情况下,您应该测试API版本并选择在此基础上使用的版本。

如果您想编写自己的定制融合传感器,那肯定是可能的。我会说,除非你对最佳实践进行个人研究,否则不太可能超过这些人的稳健性。

答案 1 :(得分:2)

my GPSTest app on Github (master branch)的最新版本中,我使用TYPE_ROTATION_VECTOR传感器来控制map camera (Android Maps API v2)的方向和倾斜度。这具有“魔术相机”效果(如this Google I/O talk中所述),因此当您在您面前拿起设备时,您会根据您的方向看到地图的第一人称视图,并在您设置时设备关闭,它转换到俯视图(很像AR应用程序)。在我看来,它具有合理的性能。

enter image description here

请注意,您需要重新映射坐标系以处理设备方向更改(即纵向或横向),这可能是您的某些问题的根源。

请参阅this StackOverflow answer,了解在支持TYPE_ROTATION_VECTOR(Android 2.3及更高版本)的设备上使用TYPE_ROTATION_VECTOR的代码段,在Android 2.2及更低版本上使用TYPE_ORIENTATION,根据设备方向重新映射坐标系,并处理与SensorManager.getRotationMatrixFromVector()方法相关的特定于三星的错误。可以在GPSTest on Github (master branch)中看到完整的实施。