Android 上可靠的传感器融合?
Posted
技术标签:
【中文标题】Android 上可靠的传感器融合?【英文标题】:Reliable Sensor Fusion on Android? 【发布时间】:2014-02-15 18:05:10 【问题描述】:目前正在开发增强现实应用程序,我正在试验传感器。我尝试使用原始传感器数据,通过 SensorManager 或一个将加速度计 + 磁场与旋转矩阵结合起来,但没有真正成功。
阅读有关传感器融合的更多信息后,我在 Play 商店中看到了一些应用程序,它们设法使罗盘功能同时具有俯仰和滚动功能,例如这个:3D Gyro Compass (https://play.google.com/store/apps/details?id=fi.finwe.gyrocompass&hl=de) - 传感器融合代码在 LGPL 下,所以我决定试一试,但我的读数仍然很差,而且方向有点搞砸了,所以看起来他们做得更多。
android 方向是否有任何解决方案,例如让我在某种指南针/AR 应用程序中使用它们?到目前为止,谷歌没有向我展示任何有用的东西。
【问题讨论】:
【参考方案1】:据我所知,在 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 的旧设备,您可以使用新 API 版本中已弃用的 TYPE_ORIENTATION 传感器。在这种情况下,您应该测试 API 版本并在此基础上选择要使用的版本。
如果您想编写自己的自定义融合传感器,这当然是可能的。我想说的是,除非您对最佳实践进行自己的个人研究,否则它不太可能击败这些人的稳健性。
【讨论】:
【参考方案2】:在最新版本的my GPSTest app on Github (master branch) 中,我使用TYPE_ROTATION_VECTOR 传感器来控制map camera (Android Maps API v2) 的方向和倾斜。这具有“魔术相机”效果(如this Google I/O talk 中所述),因此当您将设备举到您面前时,您会看到基于您的方向的第一人称地图视图,并且当您放下设备时,它会转换为俯视图(很像 AR 应用程序)。在我看来,它具有合理的性能。
请注意,您需要重新映射坐标系以处理设备方向更改(即纵向或横向),这可能是您的一些问题的根源。
有关在支持 TYPE_ROTATION_VECTOR(Android 2.3 及更高版本)的设备上使用 TYPE_ROTATION_VECTOR、在 Android 2.2 及更低版本上使用TYPE_ORIENTATION、根据设备方向重新映射坐标系以及处理的代码 sn-ps,请参阅 this *** answer与SensorManager.getRotationMatrixFromVector()
方法相关的三星特有的错误。完整实现见GPSTest on Github (master branch)。
【讨论】:
以上是关于Android 上可靠的传感器融合?的主要内容,如果未能解决你的问题,请参考以下文章