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

fhu*_*cho 6 android android-sensors compass-geolocation

所有在Android中获取指南针方向的指南我都发现了一个错误:当您以纵向模式握住手机并"俯视"地平线时,指南针箭头从正确的方向转动180度.

Google地图方向指示器没有此问题.

谷歌地图的另一个好处是它们以某种方式估计罗盘精度.知道他们是怎么做到的吗?

Thr*_*ian 5

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

要解决非常大的角度差,您应该检查您的设备是否平坦或在使用重力传感器获得倾斜度或使用低通滤波器从加速度计获得重力后不检查倾斜度。如果它不是平坦的(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);
Run Code Online (Sandbox Code Playgroud)

这解决了万向节锁定问题,但是,我在 Play 商店中看到的 3D 指南针(普通指南针无法给出正确的结果,因为它们仅在 x、y 中映射并发生万向节锁定),并且当您保留时,此处的每个代码都会有所不同您的设备平放或屏幕指向您。这种差异有时会达到 10 度。我无法解决它。大多数差异在 1-5 度之间,但我有时会看到它上升到 10 度,这是不可接受的。

Google 会根据您的位置测量方位角。有一个代码可以找到轴承。

currentLocation.getBearing();
Run Code Online (Sandbox Code Playgroud)

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

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

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


Jav*_*nly 1

指南针会给你你想要的东西,但它太吵了。它有噪音有两个原因,原因之一是,它正在拾取真实的噪音,真实的信号。因此,我们生活在一个磁力非常嘈杂的环境中。所以,这个指南针可以拾取所有具有磁性的东西。另一个原因是,它不是集成的,因此不具有去除频率分量的好处。因此,尝试将指南针与陀螺仪数据结合起来。视频将为您使用这些传感器提供很大帮助。

更多细节,您还可以结合加速度计。总之,陀螺仪提供方向,加速度计提供重力校正,罗盘提供磁北校正。