2017-05-25 119 views
6

在Android中获取指南针方向的所有指南我发现有一个错误:当您将手机放在肖像模式下并在地平线上方“看”时,指南针箭头将从正确的方向转动180度。如何检索高品质的指南针方向(如在谷歌地图)?

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

的另一个好处是谷歌地图已经是他们莫名其妙地估计罗盘精度。任何想法他们如何做到这一点?

+0

我觉得这个库可以给你实现一个指南针和自己计算的方向一个非常好的主意。使用它时我没有问题。它总是向我展示正确的方向。 https://github.com/artemiygrn/Compass-View 对于指南针的准确性,我不知道如何实现这一目标。兄弟抱歉。 –

回答

2

指南针会给你你想要的,但它很嘈杂。它有两个原因是很嘈杂的,其中一个原因是,它正在拾起,真正的噪音,真实的信号。所以,我们生活在一个非常嘈杂的环境中。所以,这包罗万象,拿起磁性的一切。另一个原因是,它没有集成,所以它没有降低频率分量的好处。所以,试着将你的指南针与陀螺仪数据结合起来。 This视频将帮助您使用这些传感器。

一些更多的细节,你也可以结合加速度计。总而言之,陀螺仪提供了定向,加速度计提供重力校正,圆规则提供磁北校正。

+0

嘿,谢谢,但是这并没有回答我的问题(1.当错误超过地平线2.精度时)。 – fhucho

3
  1. 错误寻找在地平线上时。

有一些棘手的部分,当你带指南针的工作。 指南针的方向取决于磁场和手机的方向,所以,为了纠正偏差,你需要做一些矩阵操作。

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

复述文章:“因此,如果设备没有持有平(∓45度偏差),你有一个非常有用的方式使用remapCoordinateSystem()获得正确的结果。“

  • 精度。
  • 首先,准确性依赖于存在于所述设备的物理部件。碎片是这里常见的问题。三星磁力计与LG的不同,Android系统不会从此抽象出你。

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

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

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

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

    因此,有趣的是,有一些抽象层(内插器/外推器),其接收来自Android系统中的数据的每个20,50,1000 ...。该层作一些操作,以便有一些均匀性,然后将数据传输到您的应用程序。

    这里的操作可能是当前和最后一个值,累计平均值也许另一种正常化之间的某种平均值。

    3

    错误你问的是或因此而造成的欧拉角称为万向锁。

    为了解决非常高的角度差,你应该检查,如果你的设备是平的,或者使用重力传感器或正从加速度计重力与低通滤波器获得后倾角不检查倾向。如果它不是平(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和发生万向节锁定)我已经看到Play商店,每个代码当你的设备平放或屏幕指向你时,这里有一个区别。这种差别有时会达到10度。我无法解决它。大部分区别在1-5度之间,但我有时会看到它上升到10度,这是不可接受的。

    谷歌措施方位角从您的位置。有一个代码可以找到方位。

    currentLocation.getBearing(); 
    

    拉长精度(当前位置的精度)是什么决定了方位的精度。的方式做一个指南针与最准确到最

    名单是为了

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

    OK,我自己想清楚了。首先你需要计算指南针的方位。那么地图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 compass1

    ,如果你可以了解更多的细节http://www.techotopia.com/index.php/Working_with_the_Google_Maps_Android_API_in_Android_Studio