Частота обновления GPS для Android

Я пишу приложение для привязки коленей, но столкнулся с проблемой частоты обновления GPS. При скоростях выше 75 км / ч (21 м / с) мой код перестает работать. Мой вопрос: как я могу запрашивать обновления с большей скоростью? Мне нужно, чтобы он работал со скоростью до 300 км / ч (83 м / с) и хотел бы, чтобы приложение получало обновления каждые пару метров, что означало бы, что потребуется обновление каждые 0,025 секунды при 300 км / ч. Ниже мой код, я попробовал альтернативный код, чтобы получить отметку времени, но получил тот же результат, я считаю, что это проблема частоты обновления GPS, а не проблема с кодом. Я хотел обновлять каждые пару метров при 300 км / ч, если телефон проходит через радиус близости по касательной.

int prox = 30; // Proximity Switch To Finish Line = 30 meters int speedGov = 0; // Speed In Kmh public void OnProviderDisabled(string provider) { } public void OnProviderEnabled(string provider) { } public void OnStatusChanged(string provider, Availability status, Bundle extras) { } protected override void OnResume() { this.InitializeLocationManager(); base.OnResume(); _locationManager.RequestLocationUpdates(_locationProvider, 0, 0, this); } void InitializeLocationManager() { _locationManager = (LocationManager)GetSystemService(LocationService); Criteria criteriaForLocationService = new Criteria { Accuracy = Accuracy.Fine }; IList<string> acceptableLocationProviders = _locationManager.GetProviders(criteriaForLocationService, true); if (acceptableLocationProviders.Any()) { _locationProvider = acceptableLocationProviders.First(); } else { _locationProvider = String.Empty; } } public void OnLocationChanged(Location location) { _currentLocation = location; if (_currentLocation == null) { } else { d2fl = Convert.ToInt32(_currentLocation.DistanceTo(fl)); speedGov = Convert.ToInt32(_currentLocation.Speed * 3.6); } } int A = 0; // 1st Distance to Finish Line int B = 1000000; // 2nd Distance to Finish Line // Get Time Stamp while (true) { A = d2fl; if (A > B && d2fl < prox && speedGov > 2) // Travelling away from Finish Line & Within 30m proximity to Finish Line & Going faster than 2km/h { // Time stamp for when phone first starts travelling away from Finish Line string hours = DateTime.Now.ToString("HH"); string minutes = DateTime.Now.ToString("mm"); string seconds = DateTime.Now.ToString("ss"); string milliseconds = DateTime.Now.ToString("fff"); lapFinishTimeStamp = (Convert.ToDecimal(hours) * 3600) + (Convert.ToDecimal(minutes) * 60) + Convert.ToDecimal(seconds) + (Convert.ToDecimal(milliseconds) / 1000); A = 0; B = 1000000; break; } B = A; } // Alternate Get Time Stamp - worked the same as above "Get Time Stamp" while (true) { int A = d2fl; Thread.Sleep(5); int B = d2fl; if (A < B && d2fl < prox && speedGov > 2) { string hours = DateTime.Now.ToString("HH"); string minutes = DateTime.Now.ToString("mm"); string seconds = DateTime.Now.ToString("ss"); string milliseconds = DateTime.Now.ToString("fff"); lapFinishTimeStamp = (Convert.ToDecimal(hours) * 3600) + (Convert.ToDecimal(minutes) * 60) + Convert.ToDecimal(seconds) + (Convert.ToDecimal(milliseconds) / 1000); A = 0; B = 0; break; } A = 0; B = 0; } 

Прочитали некоторых других участников форума, но им несколько лет. Это приложение должно будет работать на Galaxy S4 и далее.

Плюс я немного запутался в частоте GPS, из-за того, что я читал, частота GPS работает на довольно высокой скорости (аппаратное обеспечение составляет около 1,6 ГГц), но операционные системы телефонов, похоже, отбирают данные на более низкую частоту, Это намеренно?

Не путайте значение радиочастоты (1,1-1,6 ГГц) от того, как часто вы будете получать обновления местоположения (1 Гц).

Вы видели список устройств в: Получить GPS-позицию на точный временной интервал ? Несмотря на то, что его несколько лет, я сомневаюсь, что на устройстве GPS будет сообщаться быстрее (возможно, из-за конструкции батареи / шума / использования). Даже если бортовое устройство сообщалось на частоте 10 Гц или 20 Гц, что составляет всего 100 мс или 50 мс, что еще медленнее, чем ваше требование в 25 мс. Помните, что процессор говорит с GPS и вычисляет местоположение – это есть батарея, которая является ограничивающим фактором для мобильных устройств.

Если вы хотите, чтобы последовательные обновления секундных значений GPS были необходимы, вам необходимо использовать внешнее устройство.

Потребительские устройства обновляют позиции gps со скоростью 1 Гц, поэтому одно местоположение в секунду.
Более высокая скорость, например, 10 / с, не имеет большого смысла.
Позиции не улучшатся, скорее они ухудшатся, однако это теоретическое обсуждение, поскольку потребительские GPS-чипы обычно не будут обеспечивать более высокую скорость, чем 1 или 2 Гц.

Поэтому просто измените дизайн приложения. Особенно на высоких скоростях сохраняется интерполяция между двумя точками.

Имейте в виду, что положение имеет круговую ошибку не менее 3-5 м. Таким образом, ваше приложение для привязки коленей, добавляет мигнет, выдает значение timeAccuracy. Ошибка 5 м при 100 км / ч приводит к точности синхронизации 0,18 с. Вы можете получить оцененную позиционную ошибку с помощью location.getHoricontalAccuracy() (или аналогичных имен)