有没有办法获得5-10 mts的恒定精度?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法获得5-10 mts的恒定精度?相关的知识,希望对你有一定的参考价值。

我正在尝试构建一些位置应用程序,主要问题是准确性数据(不确定getAccuracy()是否可靠用于测量错误)。我在论坛上看到了一些帖子,其中精确度约为5-10,但对我来说总是大约30mts。

目前,我正在使用fuselocationproviderclient,我不需要这个API密钥吗? Wifi搜索启用,否则它跳到300~另一件事,我来自南美洲,也许只是我所在地区的更多错误。

public class MainActivity extends AppCompatActivity {

private FusedLocationProviderClient cliente;
private LocationRequest locationRequest;
private LocationCallback locationCallback;

@Override
protected void onCreate(Bundle savedInstanceState) {

    locationRequest = new LocationRequest();
    locationRequest.setInterval(5000);
    locationRequest.setFastestInterval(3000);
    locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

    gps_bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (gps_bt.isChecked()) {
                sensor.setText("GPS");
                locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            } else {
                sensor.setText("Torre celular y wifi");
                locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
            }
        }
    });

    upd_bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (upd_bt.isChecked()) {
                actualizacion.setText("Encendidas");
                actualizar = true;
                empezarActualizacion();
            } else {
                actualizacion.setText("Apagadas");
                actualizar = false;
                detenerActualizacion();
            }
        }
    });

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            super.onLocationResult(locationResult);
            for (Location location : locationResult.getLocations()) {
                latitud.setText(String.valueOf(location.getLatitude()));
                longitud.setText(String.valueOf(location.getLongitude()));
                precision.setText(String.valueOf(location.getAccuracy()));
                if (location.hasAltitude()) {
                    altitud.setText(String.valueOf(location.getAltitude()));
                } else {
                    altitud.setText("No se pudo colectar la altitud");
                }
                if (location.hasSpeed()) {
                    velocidad.setText(String.valueOf(location.getSpeed()) + "m/s");
                } else {
                    velocidad.setText("No se puede recuperar la velocidad");
                }
            }
        }
    };

    cliente = LocationServices.getFusedLocationProviderClient(this);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        cliente.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                if (location != null) {
                    latitud.setText(String.valueOf(location.getLatitude()));
                    longitud.setText(String.valueOf(location.getLongitude()));
                    precision.setText(String.valueOf(location.getAccuracy()));
                    if (location.hasAltitude()) {
                        altitud.setText(String.valueOf(location.getAltitude()));
                    } else {
                        altitud.setText("No se pudo colectar la altitud");
                    }
                    if (location.hasSpeed()) {
                        velocidad.setText(String.valueOf(location.getSpeed()) + "m/s");
                    } else {
                        velocidad.setText("No se puede recuperar la velocidad");
                    }
                }
            }
        });
    } else {
        //pedir permisos
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISO_FINE_LOCATION);
        }
    }

}

它总是扔30mts或更多,正如我之前提到的,如果可能,我希望达到大约10mts。清单文件使用FINE_LOCATION。对于未来的使用,这也适用于手机数据(LTE / 4g / 3g)我是否也必须同意COARSE_LOCATION?它融合位置提供客户端是否具有此目的的最佳选择?使用kalman可以改善纬度/经度数据吗?我在三星S8上进行了测试,但我想从棒棒糖中进行测试。谢谢你们。

答案

在智能手机上保持5到10米的常数,仍然无法做到。因为?在某些情况下,您可以达到最佳准确度,在大多数情况下不是。嵌入在器件中的GNSS芯片外部的元件有助于产生误差。例如:

  • 来自不同来源的电磁干扰,包括自然和人工;
  • GNSS芯片内部时钟延迟(计算设备和卫星之间距离的误差);
  • 当时可用的卫星数量(当setPriority == locationRequest.PRIORITY_HIGH_ACCURACY时);
  • 没有wifi和/或GSM信号(RBS)或质量信号(当setPriority == locationRequest.PRIORITY_BALANCED_POWER_ACCURACY时);
  • L1信号架构deficiencies(gnss信号在当前智能手​​机中最受欢迎);

但是有很好的news。承诺更精确的设备,因为它们将发布支持L5信号的芯片。 L5 signal的工作方式完全不同,在设计方面比旧L1更加强大。

高精度在能耗方面具有重要的impact,因此在绝大多数情况下你应该乐意获得20米,10米的精度。

以上是关于有没有办法获得5-10 mts的恒定精度?的主要内容,如果未能解决你的问题,请参考以下文章

如何获得数字列的确切类型,包括。规模和精度?

GLSL-片段着色器不同部分的精度不同

有没有办法关闭代码片段中的命名建议?

OracleInternal.MTS.DTCPSPEManager 错误

有没有办法获得可以在 Python 中使用的最大整数? [复制]

有没有办法将2个非常相似的代码片段组合成一个函数并重复?