Проблемы с записью треков

Честно говоря не знаю где еще можно задать подобный вопрос, по этому задаю здесь. Я уже много лет пишу треки и использовал для этого кучу разных устройств. После того как забыл свой трекер в прокатной машине стал писать треки телефоном Samsung Galaxy S5. Надо сказать, что он очень неплохо ловит сигнал, но очень странно пишет треки.

Дело в том что между соседними точками могут быть разные интервалы времени. Если я ставлю “записывать каждую секунду” то имею примерно следующее: 17:09.345, 10:17:10.344, 17:11.342, 10:17:12.366, 17:14.402 и т.п.

Вроде ничего особенного, стал допиливать поддержку таких треков на GPSLib. Но не тут то было. Даже с учетном разных интервалов получается дикий разброс в скоростях (последняя колонка). Алгоритм оценки качества трека считает такой трек некачественным и не загружает в OSM. И правильно делает, скорость нормального трека не может прыгать +/- 10 км/ч каждую секунду.

Вопрос. Что за фигня? Как так-то? Ниже отрывок GPS трека записанный на ровном участке при движении с одинаковой скоростью.


Координаты                      Дата и время                    Timestamp       Расст (м)       Инт-вал Скорость
58.38637600	31.02285300	2015-05-23T10:17:09.345Z	1432376229.345	21.32287	0.99800	76.916140121056
58.38622600	31.02259300	2015-05-23T10:17:10.344Z	1432376230.344	22.51881	0.99900	81.148864235985
58.38609600	31.02236700	2015-05-23T10:17:11.342Z	1432376231.342	19.54247	0.99800	70.493880862055
58.38595500	31.02212300	2015-05-23T10:17:12.366Z	1432376232.366	21.15210	1.02400	74.362843784546
58.38580400	31.02186600	2015-05-23T10:17:12.366Z	1432376233.365	22.48459	0.99900	81.025547284555
58.38567300	31.02164000	2015-05-23T10:17:14.402Z	1432376234.402	19.62484	1.03700	68.128676856532
58.38552200	31.02138000	2015-05-23T10:17:15.336Z	1432376235.336	22.60137	0.93400	87.114499442806
58.38538000	31.02113400	2015-05-23T10:17:16.384Z	1432376236.384	21.31282	1.04800	73.211962527383
58.38524500	31.02089900	2015-05-23T10:17:17.388Z	1432376237.388	20.30640	1.00400	72.811795813159

На графике это выглядит так:

Есть версия, что время искажено специально.

Это скорей время не GPS, а записи , а т.к. это целый компьютер, мало ли что он там ещё делает на процессоре, поэтому ожидать точность в 0.001 секунды от него глупо. Ну и считать мгновенную, секундную скорость как-то странно.

Предположу, что z-координата “прыгает”.
А чем трек пишется - и в какой проге его можно так посмотреть - тоже хочу так.

Имхо это как-то не правильно, можно было по свалить на софт, но у всего что я пробовал результат такойю

Для оценки качества трека самое то.

Высоту при расчете скорости я не учитываю. График построен с помощью GPSLib, а таблица написаной на коленке отладочной программе.

Надо сваливать не на прикладное ПО, а на систему. Ведь все программы получают данные из его API. Странно, что он вообще там копейки секунд пишет, мог бы с чистой совестью отрезать их до секунд.

Если округлять до секунд то скорость получается “ровнее” :slight_smile:

В целом понятно.

Проблема описана тут:
http://stackoverflow.com/questions/10266175/how-to-get-accurate-time-stamps-from-android-gps-location

Возможное решение тут (ну или другими словами, ничего не поделаешь, так должно быть):
http://kindalame.com/2012/08/22/lpt-improve-android-gps-accuracy-by-keeping-accurate-time/

Записывайте сырые данные с GPS приемника, в NMEA. Тогда никакие API и системы не будут влиять.

У меня в NMEA пишется целыми секундами, каждую секунду. На других (особенно кто чаще 1 раза в секунду определяет положения) возможно по другому, но предполагаю, что число будет ровное (т.е. для 2Гц всегда будет после запятой будут либо нули, либо .500, для 5Гц - 000/200/400/600/800).

Возможно необходимо определять частоту получения данных и округлять в меньшую сторону до ближайшего целого числа.

У меня большие сомнения, что тот NMEA что можно получить идёт с приёмника (типа сырые данные), а не формируется андроидом.

Какое приложение используется?
Да, в NMEA будет время с GPS приемника, а не с часов устройства, да и скорость оттуда же.
В андроиде есть API для получения NMEA даных, другое дело, что некоторые приложения его действительно формируют сами, нужно подбирать.
Впрочем, API андроида тоже обычно нормальную скорость отдает, а в логе она явно расстояние/время. И Timestamp 1432376233.365 странно в дату/время сконвертировался.

Наборот, 2015-05-23T10:17:09.345 сконвертировано в 1432376229.345. Что не так?

В качестве исходных данных взят KML записанный гугловской “Мои треки”. Там есть только координаты, высота и время.
Пробовал несколько других программ, история та же.

Вопрос не только как на андроиде получить нормальный трек, но и как правильно анализировать треки записанные пользователями андроида.

Если “пользователь Андроида” использует нормальный софт и его аппарат не имеет никаких проблем с выдачей более-менее честного NMEA, то никакие ухищрения для обработки такого трека не нужны.
Если “пользователь Андроида” не использует нормальный софт или у него есть какие-то иные проблемы, то его треки ни на что не годятся кроме как на них любоваться ему самому - фарш невозможно провернуть назад.

Если пользователь Андроида использует софт работающий через API (а это основное большинство) то координаты пишутся вполне точно, чего вполне достаточно для использования в OSM. NMEA дамперов раз два и обчелся, да и не пользуется ими никто.

Ну и по сути вопроса. Действительно, если использовать для записи трека NMEA дампер, то проблем нет. Похоже, что все же дело в API Андроида.

Ну вот вы сами сначала сказали, что API - это достаточно хорошо, а потом признали, что это плохо.
Я не знаю, нужны ли на gpslib треки с разбросом в сотни метров от реального положения и т.п., может и нужны, но в OSM, за редчайшим исключением, они не нужны совсем.

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

Это не такая простая задача, как кажется.
Представьте себе дерьмовый трек в традиционном стиле “машина едет по домам”.
Очевидно, что более приличные треки по домам не проходят.
Так что трек, который идет там, где треков быть вообще не должно, при проверке на несовпадение, эту проверку гарантированно пройдет. Проверять на пересечения с домами - полумера, потому что они физически есть не везде.

Также это не решает проблемы, когда часть трека - хорошая, а часть - мусор.

Единственным решением, которое может быть реально полезно (а не являлось бы супер-сложным костылем, который решает одну двадцатую часть проблемы), было бы добавление методов удаления и разделения треков на части в базе OSM. И какой-то wiki-подобной морды для этого.
Только тогда можно будет очистить базу от откровенного мусора, оставив строго то, что нужно, и при этом не бояться, что кто-то его туда добавит.

Да, фиг с ним, пусть по домам, куда большая польза от треков в глубинке, где и домов то нет и меньшая это третья сотня по транку.
Редактирование треков - это тема для какого нибудь гугльсамекоде. Я бы с лёгкостью отдал голос за неё, чем какая-то модерация что сейчас там пилиться.

Ну вот в том то и дело, что трек в пресловутой глубинке тоже должен быть более-менее похож на правду, а не плюс-минус 300 метров, иначе его смысл теряется.

Что до задачи для google summer of code - полностью согласен, тем более, это вполне ясная и несложная задача, а с модерацией и прочим есть куча вещей, которые неочевидны административно-идеологически, что превращает любое решение в малополезное.

Где вы увидели сотни метров и вообще метры? Речь идет исключительно о неточности времени, и как следствия, скорости.