在我的Android應用程序中,我必須使用我當前的標題(使用加速度計和磁力計)和當前方位到targetLocation
(location.bearingTo(targetLocation)
)。爲什麼我的heading值在查看targetLocation時不同於bearingValue?
我已經知道使用加速度計和磁力計來計算當前航向從磁北向0°開始,當前軸承從地理北向開始。所以我想通了,我必須添加到headingValue
,取決於我目前的位置,一個稱爲赤緯的值。
例如,我從google-maps中獲取某個GPS點,並在應用程序中添加此點作爲位置點。開始使用前,請在測量設備(如無限符號)之前將設備移動到空中,然後將設備放在我面前,並將其對準目標方向。所以我注意到標題!=軸承。任何人都可以向我解釋錯誤?假設我嘗試了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()));
}
UPDATE
橙色標記的位置是targetLocation。 這兩個位置都前往targetLocation。 你能同意,這些結果是安靜正確顯示?
在創作這張照片的過程中,我注意到這兩個白色標記都不等於我站在的位置。這似乎是壞的GPS數據是因爲這個問題的原因,不是嗎?
「heading!= bearing」。您可以請這麼友好地發佈差異值嗎?這是一定程度的十度完全不同(10或更多?)? – AlexWien