所有在Android中获取指南针方向的指南都有一个错误:当您以纵向模式握住手机时,"看起来"在地平线上方,指南针箭头从正确的方向转动180度。
Google地图定位指示器没有此问题。
谷歌地图的另一个好处是它们以某种方式估计罗盘精度。知道他们是怎么做到的吗?
答案 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 :(得分:2)
使用指南针时,有一些棘手的部分。 罗盘方向取决于磁场和手机方向,因此,为了纠正偏差,您需要进行一些矩阵运算。
查看这篇文章,它提供了一个简单的例子 - > https://www.journal.deviantdev.com/android-compass-azimuth-calculating/
解释文章:“因此,如果设备没有保持平坦(∓45°偏差),你必须以有用的方式使用remapCoordinateSystem()来获得正确的结果。”
首先,准确性依赖于设备中存在的物理组件。碎片化是一个常见的问题。三星磁力计与LG不同,Android系统不会从中抽象出来。
另一方面,设备可以依赖于不同类型的传感器:harward或传感器融合。所以你要试验一个设备和其他设备之间的差异。
所以这是一团糟。但它存在一些技术,你可以应用这些技术来获得传感器的准确性和统一数据(不仅是指南针,也可能是GPS)。
有些人会丢弃传感器数据的前几秒钟。为了校准信号需要一些时间,因此检索的第一个数据用于产生一些偏差。您需要丢弃的时间取决于制造商,购买我会尝试5秒左右。
使用插补器和外推器。 android中的许多传感器为您提供了每隔几毫秒检索数据的方法。但这是Android提供的抽象。 Harward传感器有自己的定时,当他们认为有必要时,他们会更新信号。其余的时间,当Android向传感器询问信号数据时,传感器返回最后一个值,或者是制造商提供的最后一个信号数据的某种操作(再次)。
因此,有一个抽象层(插值器/外推器)从Android系统接收每个20,50,1000的数据是有趣的...这个层做一些操作以便有一定的一致性,然后传达数据到你的应用程序。
这里的操作可能是当前值和最后值之间的某种平均值,累积平均值或者可能是另一种规范化。
答案 2 :(得分:1)
指南针会给你你想要的东西,但它太吵了。它有两个原因是嘈杂的,其中一个原因是它正在拾取,真正的噪声,真实的信号。所以,我们生活在一个非常嘈杂的环境中。所以,这个圆规,拿起所有磁性的东西。另一个原因是,它没有集成,因此它没有降低频率成分的好处。因此,尝试将指南针与陀螺仪数据结合起来。 This视频可以帮助您使用这些传感器。
更多细节,您也可以组合加速度计。总而言之,陀螺仪提供方向,加速度计提供由于重力引起的校正,并且罗盘提供由于磁北的校正。
答案 3 :(得分:1)
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