为什么在查看目标位置时我的 headingValue 与 bearingValue 如此不同?
why is my headingValue such diffrent from bearingValue while looking at targetLocation?
在我的 Android 应用程序中,我必须使用当前航向(使用加速度计和磁力计)和当前方位 targetLocation
(location.bearingTo(targetLocation)
)。
我已经知道使用加速度计和磁力计计算当前航向从磁北 0° 开始,当前方位从地理北开始。所以我想通了,我必须添加到 headingValue
,这取决于我当前的位置,一个称为偏角的值。
比如我从google-maps中拾取了某个GPS点,在应用中添加了这个点作为locationpoint。启动应用程序,在像空中 infinity-sign 一样测量设备之前移动并将设备放在我面前,聚焦目标方向。所以我注意到标题!=方位。谁能向我解释错误?假设我尝试了 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
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()));
}
更新
橙色标记的位置是targetLocation。
两个位置都指向 targetLocation。
您是否同意这些结果显示正确?
在创作这张照片的过程中,我注意到两个白色标记都不等于我所站的位置。看来 gps 数据不好是问题的原因,不是吗?
Heading 是你看的方向,例如坦克会朝哪个方向射击,而 bearing 是这辆车移动的方向。所以这应该可以回答为什么轴承没有航向。
它们具有不同的名称和含义,它们的计算方式不同,不能期望它们提供相同的价值。
更多详情
你可以向北移动(bearing = North),但要看NE。 (标题)
Gps 提供方位(或航向(在地面上)),车辆移动的方向(尽管有些 Api 错误地称之为航向)
指南针(=磁力计)提供您握住设备的方向=(航向)
当您计算在 lat,lon 中定义为坐标的两个位置之间的方位时,就像您在 targetLocation (location.bearingTo(targetLocation)).
中所做的那样,这就是方位!它没有航向!
并且无论是指南针还是加速度计都不会提供合适的航向值。
一些 android 设备的磁力计非常错误(我看到 +-20 度,而我的 iPhone 为 +/- 2 度。始终使用传统的高质量指南针作为参考)
ios 设备在校准良好时显示航向在 +/- 2 度以内(您必须每次在查看 decice 值之前进行校准,而不仅仅是在操作系统要求您进行校准时)。
移动 > 10 公里时的 GPS(h 提供 goot 方位结果,但不提供航向。
即使在校准时,磁力计也会有一定程度的偏差。
通常偏角小于误差。
赤纬在欧洲几乎没有,非常北(欧洲)3 度,只有少数地方有高赤纬 >6-7°(北阿拉斯加)
更新您在图形中的进一步解释:
您放置的两个点之间的距离只有 15 米,而 GPS 不会比 3-6 米更准确。
想象一下起点或终点偏移 6 米:这样一个三角形,其中 a = 6 米,b = 15,角度为 atan2(6 / 15.0) = 21°。所以你有 21° 的偏移量只是因为位置不准确。不过还是想一想两个地点之间的罗盘航向和视线方位的区别。
在我的 Android 应用程序中,我必须使用当前航向(使用加速度计和磁力计)和当前方位 targetLocation
(location.bearingTo(targetLocation)
)。
我已经知道使用加速度计和磁力计计算当前航向从磁北 0° 开始,当前方位从地理北开始。所以我想通了,我必须添加到 headingValue
,这取决于我当前的位置,一个称为偏角的值。
比如我从google-maps中拾取了某个GPS点,在应用中添加了这个点作为locationpoint。启动应用程序,在像空中 infinity-sign 一样测量设备之前移动并将设备放在我面前,聚焦目标方向。所以我注意到标题!=方位。谁能向我解释错误?假设我尝试了 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
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()));
}
更新
橙色标记的位置是targetLocation。 两个位置都指向 targetLocation。 您是否同意这些结果显示正确?
在创作这张照片的过程中,我注意到两个白色标记都不等于我所站的位置。看来 gps 数据不好是问题的原因,不是吗?
Heading 是你看的方向,例如坦克会朝哪个方向射击,而 bearing 是这辆车移动的方向。所以这应该可以回答为什么轴承没有航向。 它们具有不同的名称和含义,它们的计算方式不同,不能期望它们提供相同的价值。
更多详情
你可以向北移动(bearing = North),但要看NE。 (标题)
Gps 提供方位(或航向(在地面上)),车辆移动的方向(尽管有些 Api 错误地称之为航向)
指南针(=磁力计)提供您握住设备的方向=(航向)
当您计算在 lat,lon 中定义为坐标的两个位置之间的方位时,就像您在 targetLocation (location.bearingTo(targetLocation)).
中所做的那样,这就是方位!它没有航向!
并且无论是指南针还是加速度计都不会提供合适的航向值。
一些 android 设备的磁力计非常错误(我看到 +-20 度,而我的 iPhone 为 +/- 2 度。始终使用传统的高质量指南针作为参考)
ios 设备在校准良好时显示航向在 +/- 2 度以内(您必须每次在查看 decice 值之前进行校准,而不仅仅是在操作系统要求您进行校准时)。
移动 > 10 公里时的 GPS(h 提供 goot 方位结果,但不提供航向。
即使在校准时,磁力计也会有一定程度的偏差。 通常偏角小于误差。 赤纬在欧洲几乎没有,非常北(欧洲)3 度,只有少数地方有高赤纬 >6-7°(北阿拉斯加)
更新您在图形中的进一步解释:
您放置的两个点之间的距离只有 15 米,而 GPS 不会比 3-6 米更准确。 想象一下起点或终点偏移 6 米:这样一个三角形,其中 a = 6 米,b = 15,角度为 atan2(6 / 15.0) = 21°。所以你有 21° 的偏移量只是因为位置不准确。不过还是想一想两个地点之间的罗盘航向和视线方位的区别。