Есть ли способ получить постоянную точность 5-10 мтс? - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь создать некоторые приложения для определения местоположения, и основная проблема заключается в точности данных (не уверен, что getAccuracy () надежен для измерения ошибки). Я прочитал в форуме, и я увидел сообщение, в котором точность была около 5-10, но для меня это всегда около 30 МТС.

В настоящее время я использую fusedlocationproviderclient, мне не нужен ключ API для этого права? Поиск Wi-Fi включен, в противном случае он переходит на 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 лучший вариант для этой цели? Использование Кальмана может улучшить широту / долготу данных? Я сделал тест на Samsung S8, но я хотел бы прикрыть леденец. Спасибо всем.

1 Ответ

0 голосов
/ 24 апреля 2019

Сохраняйте постоянную от 5 до 10 метров на смартфонах, все еще невозможно. Так как? В некоторых случаях вы можете достичь оптимальной точности, в большинстве случаев нет. Элементы, внешние по отношению к чипу GNSS, встроенные в устройства, увеличивают погрешность. Например:

  • электромагнитные помехи от различных источников, как естественных, так и искусственных;
  • Задержка внутренних часов на чипе GNSS (влечет за собой ошибки в расчете расстояния между устройством и спутниками);
  • Количество спутников, доступных в это время (когда setPriority == locationRequest.PRIORITY_HIGH_ACCURACY);
  • Отсутствие сигнала Wi-Fi и / или GSM (RBS) или сигнала качества (когда setPriority == locationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
  • архитектурный сигнал L1 недостатки (сигнал GNSS самый популярный среди нынешних смартфонов);

Но есть хорошие новости . Устройства, которые обещают быть более точными, потому что они будут поставлять чипы, которые поддерживают сигнал L5. Сигнал L5 работает совершенно иначе и является более надежным с точки зрения дизайна, чем старый L1.

Высокая точность оказывает существенное влияние на энергопотребление, поэтому вы должны быть рады получить точность 20, 10 метров в подавляющем большинстве случаев.

...