【问题标题】:Is there a way to get a constant accuracy of 5-10 mts?有没有办法获得 5-10 米的恒定精度?
【发布时间】:2019-04-17 06:16:07
【问题描述】:

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

目前,我正在使用 fusedlocationproviderclient,我不需要 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);
        }
    }

}

它总是抛出 30 米或更多,正如我之前提到的,如果可能的话,我希望达到 10 米左右。清单文件带有 FINE_LOCATION。对于未来的使用,这也适用于电话数据(LTE/4g/3g)我是否也必须授予 COARSE_LOCATION 权限?它 fusedlocationproviderclient 是为此目的的最佳选择吗?使用卡尔曼可以改善纬度/经度数据吗?我在三星 S8 上进行了测试,但我想从棒棒糖中覆盖。谢谢大家。

【问题讨论】:

  • 您的设备在哪里?您是在室内还是室外读取 GPS 值?是在狭窄的小巷还是空旷的地方?
  • 您好 TDG,感谢您的回复。我测试了室内和室外,室内使用 WIFI(用于接入点和传感器)而不是 LTE,显示相同的精度(getAccuracy()=30mts~)。在外面做测试的时候是在城市里,还不是空旷的场地。

标签: android gps fusedlocationproviderclient


【解决方案1】:

在智能手机上保持 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 米的精度。

【讨论】:

  • 你好moises!我住的地区呢?这对我收到的数据有某种影响吗?或者只是手机的信号类型(L1-L5)?谢谢!
  • 您所在地区没有问题。所涉及的技术集存在限制。在 Google I/O '18 中,Google 工程师 presented 采用定位服务获得 1 米精度的策略。这个article 也采用了同样的方法。
  • @Pepe 我还没有测试过任何这个(大约 1 米的精度),如果你成功了,请告诉我 :)
猜你喜欢
  • 2021-10-29
  • 1970-01-01
  • 2016-12-04
  • 2019-07-23
  • 2014-03-20
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 2011-03-13
相关资源
最近更新 更多