为什么我的headingValue与bearingValue如此不同,而看targetLocation



在我的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°的偏移只是由于位置不准确。然而,还是要考虑两个地点之间的罗盘航向和视线方位的差异。

相关内容

  • 没有找到相关文章

最新更新