android - 如何检索高质量的指南针方向(如谷歌地图)?

标签 android android-sensors compass-geolocation

我发现在 Android 中获得指南针方向的所有指南都有一个错误:当您以纵向模式握住手机并“看”地平线上方时,指南针箭头会从正确方向旋转 180 度。

谷歌地图方向指示器没有这个问题。

Google map 的另一个好处是它们可以以某种方式估计罗盘的准确度。知道他们是怎么做到的吗?

最佳答案

你问的错误是由于欧拉角或称为万向节锁引起的。

要解决非常大的角度差异,您应该检查您的设备是否平坦,或者在使用重力传感器获得倾斜度或使用低通滤波器从加速度计获得重力后不检查倾斜度。如果它不是平面的(AR 应用程序或倾角 >25 || 倾角 < 155),请将坐标系从 x,y 重新映射到 x,z。这将解决问题。

SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values);
SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, remappedRM);
SensorManager.getOrientation(remappedRM, orientation);

这解决了 Gimbal Lock,但是,我在 Play Store 上看到的 3D 圆规(普通圆规不会给出正确的结果,因为它们只映射到 x,y 并发生 Gimbal Lock),这里的每个代码都有差异当您将设备平放或屏幕对着您时。这种差异有时会达到 10 度。我没能解决它。大多数差异在 1-5 度之间,但我有时会看到它上升到 10 度,这是 Not Acceptable 。

Google 测量您所在位置的方位角。有找方位的代码。

currentLocation.getBearing();

纬度精度(您当前位置的精度)决定方位精度。

按照从最准确到最不准确的方式制作指南针的方法列表

  1. 使用 GPS/Wife(Google 的融合位置)位置并从位置获取方位
  2. 使用旋转矢量(需要磁场传感器,你应该检查它是否可用),它是一个融合传感器(磁场+陀螺仪+加速度计和软件部分)并使用卡尔曼滤波器平滑值但检查倾角以重新映射方向<
  3. 重力/加速度计 + 磁场传感器。这将有一个可怕的噪音附在它身上,为了平滑它你应该使用移动平均或低通滤波器(这不是为了隔离重力,它是为了使用阈值频率来防止跳高)

关于android - 如何检索高质量的指南针方向(如谷歌地图)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44179734/

相关文章:

Android 应用程序开发 - 基础项目包含错误

android - 未处理 fragment 的 AlertDialog 的单击事件中的自定义取消按钮

java - 使用 GreenRobot EventBus 在线程之间进行通信

android - 屏幕关闭时如何获取服务中的传感器数据?

android - 指南针校准

java - 如何根据我当前的位置使指南针指向我特定的经纬度位置?

iphone - 如果指南针不准确,我该怎么办

java - 透明渐变工具栏

android - 将箭头指向用户面对的方向

Android 手机方向概述,包括指南针