2014-02-15 68 views
1

目前正在使用增強現實應用程序,我正在試驗傳感器。我嘗試過使用原始傳感器數據,通過SensorManager或一個傳感器將加速度計+磁場與旋轉矩陣結合在一起,但沒有真正成功。Android上的可靠傳感器融合?

閱讀關於傳感器融合的更多信息,我已經在Play商店中看到了一些可以同時獲得指南針功能的應用程序,例如:3D陀螺羅盤(https://play.google.com/store/apps/details?id=fi.finwe.gyrocompass&hl=de) - 傳感器融合代碼是在LGPL之下,所以我決定給它一個鏡頭,但我的閱讀仍然有問題,而且方向有些扭曲,所以看起來他們正在做更多。

是否有解決方案的android方向,例如讓我在某種指南針/ AR應用程序中使用它們?到目前爲止,Google並未向我展示任何有用的信息

回答

2

據我所知,Android上用於傳感器融合的最佳方法是TYPE_ROTATION_VECTOR。我在我的增強現實應用程序中使用這個方向。它是一個複合傳感器,其輸出使用來自加速度,磁力計和陀螺儀的最佳可用數據自動生成。如果你想很好的滾動 - 俯仰 - 方位型座標,而不是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版本並在此基礎上選擇要使用的版本。

如果你想編寫你自己的定製電容式傳感器,這當然是可能的。我想說,除非你自己對最佳實踐進行個人研究,否則不太可能擊敗這些傢伙的健壯性。

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

請注意,您將需要重新映射的座標系來處理設備方向的變化(即,縱向或橫向),這可能是你的一些問題的來源。

對於支持TYPE_ROTATION_VECTOR使用上的設備TYPE_ROTATION_VECTOR的代碼片段(Android 2.3及以上)參見this StackOverflow answer,在Android 2.2和更低,重映射基於設備取向的座標系統中使用TYPE_ORIENTATION,和處理特定三星錯誤相關到SensorManager.getRotationMatrixFromVector()方法。完整的實現可以在GPSTest on Github (master branch)中看到。