在我的 Android 应用程序中,我必须使用当前航向(使用加速度计和磁力计)和当前方位targetLocation
(location.bearingTo(targetLocation)
)。
我已经知道使用加速度计和磁力计来确定当前航向从磁北的 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()));
}
更新
橙色标记的位置是 targetLocation。两个位置都指向 targetLocation。您是否同意这些结果正确显示?
在创建这张照片期间,我注意到两个白色标记都不等于我站立的位置。看起来糟糕的gps数据是问题的原因,不是吗?