在我的Android应用程序中,我必须使用我当前的标题(使用加速度计和磁力计)和当前的轴承到targetLocation
(location.bearingTo(targetLocation)
)。
我已经知道,使用加速度计和磁力计计算电流航向从磁北0°开始,电流方位从地理北开始。所以我弄清楚了,我必须添加到headingValue
,根据我当前的位置,一个叫做偏角的值。
例如,我从google-maps中选取某个GPS点,将该点添加为应用程序中的locationpoint。启动应用程序,在移动之前测量设备,就像空中的无限号一样,并将设备放在我面前,专注于目标方向。所以我注意到标题=方位。谁能给我解释一下这个错误吗?假设我尝试了50到3米之间的不同距离,并且我的设备校准正确。下面是重要的源代码方法:
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
mGravity = event.values.clone();
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
mGeomagnetic = event.values.clone();
if (mGravity != null && mGeomagnetic != null) {
float R[] = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
if (success) {
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
double tempAzimuth = Math.toDegrees(orientation[0]); // orientation contains: azimut, pitch and roll
if(tempAzimuth < 0){
currentHeading = tempAzimuth + 360;
} else {
currentHeading = tempAzimuth;
}
TVheadingMag.setText(""+String.format( "%.2f",currentHeading)+"°");
}
}
}
@Override
public void onLocationChanged(Location location) {
//Declination http://stackoverflow.com/questions/4308262/calculate-compass-bearing-heading-to-location-in-android
geoField = new GeomagneticField(
Double.valueOf(location.getLatitude()).floatValue(),
Double.valueOf(location.getLongitude()).floatValue(),
Double.valueOf(location.getAltitude()).floatValue(),
System.currentTimeMillis());
if(location.bearingTo(this.target)<0){
currentBearing = location.bearingTo(this.target)+360;
} else {
currentBearing = location.bearingTo(this.target);
}
headingWithDeclination = currentHeading;
headingWithDeclination += geoField.getDeclination();
currentDistance = location.distanceTo(this.target);
TVheading.setText(""+String.format( "%.2f", headingWithDeclination)+"°");
TVheadingMag.setText(""+String.format( "%.2f",currentHeading)+"°");
TVbearing.setText(""+String.format( "%.2f",currentBearing)+"°");
TVgps.setText(""+ String.format( "%.6f",location.getLatitude()) + " " + String.format( "%.6f",location.getLongitude()));
}
图片:https://pl.vc/1r6ap
橙色标记的位置为targetLocation。两个位置都指向targetLocation。您是否同意这些结果被正确地显示?
在创作这张照片的过程中,我注意到两个白色标记不等于我站的位置。似乎糟糕的gps数据是问题的原因,不是吗?
方向是你看的方向,例如坦克会朝哪个方向射击,而方位是车辆移动的方向。这就解释了为什么方位不是航向。它们有不同的名称和含义,它们的计算方法不同,不能期望它们提供相同的值。
你可以向北移动(方位= North),但是看NE。(标题)
-
Gps提供方位(或航向(在地面上)),车辆移动的方向(尽管一些Api错误地称之为航向)
-
指南针(=磁力计)提供您握住设备的方向=(标题)
当您计算两个位置之间的方位时,定义为纬度坐标,就像您在targetLocation (location.bearingTo(targetLocation)).
中所做的那样,那么这就是方位!它没有航向!
指南针和加速度计都不能提供一个像样的航向值。一些安卓设备的磁力计非常错误(我看到的是+-20度,而我的iPhone是+/- 2度)。(始终使用传统的高质量指南针作为参考)ios设备在校准好后显示标题在+/- 2度内(您必须在每次查看设备值之前校准,而不仅仅是在操作系统要求校准时)。
当移动> 10 km(h)时,GPS可以提供良好的方位结果,但不能提供方向。
即使在校准时,磁力计也可以有一定程度的偏差。通常赤纬小于误差。在欧洲几乎没有赤纬,3度非常北(欧洲),只有少数地方有高赤纬>6-7度(阿拉斯加北部)
将更新为您在图形中的进一步解释:
你放置了两个点,距离只有15m,而GPS不会比3-6m精确多少。假设起点和终点之间的距离为6m: a = 6m, b = 15,三角形的角度为atan2(6/15.0) = 21°。所以你有21°的偏移只是由于位置不准确。然而,还是要考虑两个地点之间的罗盘航向和视线方位的差异。