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

时间:2017-05-25 11:43:07

标签: android android-sensors compass-geolocation

所有在Android中获取指南针方向的指南都有一个错误:当您以纵向模式握住手机时,"看起来"在地平线上方,指南针箭头从正确的方向转动180度。

Google地图定位指示器没有此问题。

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

4 个答案:

答案 0 :(得分:4)

你问的错误是由于欧拉角或称为万向节锁而造成的。

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

这解决了万向节锁定,然而,3D指南针(正常的指南针没有给出正确的结果,因为它们只映射在x,y中并且发生了Gimbal Lock)我在Play商店看过,这里的每个代码都有差异当你让你的设备平放或屏幕指向你。这种差异有时会达到10度。我无法解决它。大多数差异在1-5度之间,但我有时看到它上升到10度,这是不可接受的。

Google会测量您所在位置的方位角。有一个代码可以找到方位。

currentLocation.getBearing();

lat long的精度(当前位置的精度)决定了轴承的精度。

使用最准确到最少的指南针的顺序列表

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

答案 1 :(得分:2)

  1. 看着地平线上的错误。
  2. 使用指南针时,有一些棘手的部分。 罗盘方向取决于磁场和手机方向,因此,为了纠正偏差,您需要进行一些矩阵运算。

    查看这篇文章,它提供了一个简单的例子 - > https://www.journal.deviantdev.com/android-compass-azimuth-calculating/

    解释文章:“因此,如果设备没有保持平坦(∓45°偏差),你必须以有用的方式使用remapCoordinateSystem()来获得正确的结果。”

    1. 精确度。
    2. 首先,准确性依赖于设备中存在的物理组件。碎片化是一个常见的问题。三星磁力计与LG不同,Android系统不会从中抽象出来。

      另一方面,设备可以依赖于不同类型的传感器:harward或传感器融合。所以你要试验一个设备和其他设备之间的差异。

      所以这是一团糟。但它存在一些技术,你可以应用这些技术来获得传感器的准确性和统一数据(不仅是指南针,也可能是GPS)。

      1. 有些人会丢弃传感器数据的前几秒钟。为了校准信号需要一些时间,因此检索的第一个数据用于产生一些偏差。您需要丢弃的时间取决于制造商,购买我会尝试5秒左右。

      2. 使用插补器和外推器。 android中的许多传感器为您提供了每隔几毫秒检索数据的方法。但这是Android提供的抽象。 Harward传感器有自己的定时,当他们认为有必要时,他们会更新信号。其余的时间,当Android向传感器询问信号数据时,传感器返回最后一个值,或者是制造商提供的最后一个信号数据的某种操作(再次)。

      3. 因此,有一个抽象层(插值器/外推器)从Android系统接收每个20,50,1000的数据是有趣的...这个层做一些操作以便有一定的一致性,然后传达数据到你的应用程序。

        这里的操作可能是当前值和最后值之间的某种平均值,累积平均值或者可能是另一种规范化。

答案 2 :(得分:1)

指南针会给你你想要的东西,但它太吵了。它有两个原因是嘈杂的,其中一个原因是它正在拾取,真正的噪声,真实的信号。所以,我们生活在一个非常嘈杂的环境中。所以,这个圆规,拿起所有磁性的东西。另一个原因是,它没有集成,因此它没有降低频率成分的好处。因此,尝试将指南针与陀螺仪数据结合起来。 This视频可以帮助您使用这些传感器。

更多细节,您也可以组合加速度计。总而言之,陀螺仪提供方向,加速度计提供由于重力引起的校正,并且罗盘提供由于磁北的校正。

答案 3 :(得分:1)

好吧,我自己想通了。首先,您需要从罗盘计算轴承。然后可以旋转Maps api-2相机。

public void updateCamera(float bearing) {
            CameraPosition currentPlace = new CameraPosition.Builder()
                    .target(new LatLng(centerLatitude, centerLongitude))
                    .bearing(bearing).tilt(65.5f).zoom(18f).build();
            googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(currentPlace));

    }

在代码中设置SensorListener,并在onSensorChanged事件中调用此方法。我添加了倾斜值,因此地图将以3D旋转。

[参考:] [Android Maps v2 rotate mapView with compass 1

如果您可以了解更多详细信息http://www.techotopia.com/index.php/Working_with_the_Google_Maps_Android_API_in_Android_Studio