|
Дрейф координат во время стоянки. EB-500 |
|
|
|
Nov 22 2011, 13:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Добрый день. Во время стоянки объекта раз в 30-270мин отсылаю координаты на сервер. Валидность данных проверяю по значению "A" в строке RMC NMEA (если "V" - данные недостоверны): Код $GPRMC,181057.000,A,5542.2389,N,03741.6063,E,0.47,74.50,190311,,,A*51 Так вот частенько координата убегает за 300-500м, плюс скорость скачет от 1 до 5км/ч. Во время же движения - все ОК. Пока на ум только приходит вариант с проверкой значения HDOP. Может кто-то уже решал подобную задачу? Спасибо.
Сообщение отредактировал Alt.F4 - Nov 22 2011, 13:16
|
|
|
|
|
 |
Ответов
(15 - 29)
|
Nov 23 2011, 11:07
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 14-05-09
Пользователь №: 49 051

|
Цитата(Alt.F4 @ Nov 22 2011, 17:15)  Добрый день. Во время стоянки объекта раз в 30-270мин отсылаю координаты на сервер. Валидность данных проверяю по значению "A" в строке RMC NMEA (если "V" - данные недостоверны): Код $GPRMC,181057.000,A,5542.2389,N,03741.6063,E,0.47,74.50,190311,,,A*51 Так вот частенько координата убегает за 300-500м, плюс скорость скачет от 1 до 5км/ч. Во время же движения - все ОК. Пока на ум только приходит вариант с проверкой значения HDOP. Может кто-то уже решал подобную задачу? Спасибо. Ситуация совершенно обычная, только разбросы что-то большие, обычно не более 100 м. В своих устройствах использую модули на базе SiRF и Ublox, в firmware обоих чипсетов есть функция фильтрации выбросов во время стоянки, которая вполне работает. Может у чипсета, который вы используете, тоже это реализовано?
|
|
|
|
|
Nov 23 2011, 14:26
|
Частый гость
 
Группа: Участник
Сообщений: 151
Регистрация: 24-06-11
Пользователь №: 65 866

|
Цитата(ssokol @ Nov 23 2011, 17:34)  Ну например, Геос-1м при HDOP=1.7 может наврать на несколько километров Не удивительно. Я когда прочитал в рекламе Геос-1 "Удалось значительно снизить габариты, за счет применения SMD технологии", чуть не помер от хохота. Во мля как нанотехнология шагнула -применили SMD.
|
|
|
|
|
Nov 23 2011, 15:37
|
Местный
  
Группа: Свой
Сообщений: 403
Регистрация: 29-04-11
Из: Украина
Пользователь №: 64 682

|
Цитата(butthead2 @ Nov 23 2011, 13:06)  Вчера HDOP 0,7 видел при >=10 спутниках. Прямо сейчас вижу 0.9 на 8. Приемник на сирфстаре4 Я ошибался - таки может... Почитал теорию, из полезного почерпнул только то, что разные чипсеты считают HDOP по разному, и величина ошибки при фиксировано HDOP действительно не постоянна, а зависит от к-ва фикс. спутников. В общем, проще всего выбрать фикс.порог и фильтровать. Но если сигнал постоянно слаб или спутников мало (в помещении), и надо хоть какие-то координаты, то это не выход. Все же оптимальным видится использование координаты с меньшим HDOP при перемещении меньше суммы ошибок точек, рассчитанных по эмпирической формуле (не знаю, для каких она условий и чипсетов): RMS_Error(HDOP)=sqrt((3.04*HDOP)^2+12.75) в метрах. Для этого в трекере потребуется плавающая математика (как минимум cos и sqrt).
|
|
|
|
|
Nov 25 2011, 12:52
|
Местный
  
Группа: Участник
Сообщений: 212
Регистрация: 2-02-11
Пользователь №: 62 643

|
Цитата(GeGeL @ Nov 23 2011, 19:37)  RMS_Error(HDOP)=sqrt((3.04*HDOP)^2+12.75) в метрах. 3.14 ? Цитата Для этого в трекере потребуется плавающая математика (как минимум cos и sqrt). Во-первых я не понимаю, почему бы просто паспортную погрешность приёмника не домножать на HDOP без PI, квадрата и 12.75 (что за magic numbers?) и не получать ту же 95% вероятность с учётом HDOP. Во-вторых плавающие числа не нужны и косинусы тем более. sqrt вот целочисленный: Код #include <stdint.h> #include <limits.h>
typedef struct { uint16_t i; /* integer part */ uint16_t d; } isqrt_t;
isqrt_t isqrt(uint_fast32_t l) { uint_fast32_t r; uint_fast32_t h, t; uint_fast8_t c; isqrt_t result; h=0; r=0; c=sizeof(long)*CHAR_BIT; do { /* consume two argument bits */ h = (h<<2) | (l>>(sizeof(long)*CHAR_BIT-2)); l <<= 2; /* compute next bit of square root */ r <<=1; t = ((unsigned long)r<<1) + 1; if (h >= t) { h -= t; r |= 1; } } while (--c); result.i=r>>16, result.d=r&0xffff; return result; }
|
|
|
|
|
Nov 25 2011, 17:11
|
Местный
  
Группа: Свой
Сообщений: 403
Регистрация: 29-04-11
Из: Украина
Пользователь №: 64 682

|
Это не PI Не я придумывал, см.тут: http://users.erols.com/dlwilson/gpshdop.htmИ HDOP - не просто множитель, я и сам толком не понял, что... Этот алго sqrt по моему тот же Ньютона, только со сдвигами. Вот еще: Код //SQRT using Newton algo for int
s32 mysqrt(s64 l) { s64 ret=l;s64 div=l; if(l<=0)return 0; while(TRUE) { div=(l/div+div)/2; if(ret>div)ret=div;else return (s32)ret; } } Но я имел ввиду ежесекундное СРАВНЕНИЕ суммы RMSError (расчитанных по HDOP по формуле выше) для какой-то координаты (назовем ее текущей) и новой координаты с расстоянием в метрах между этими координатами (перемещением). Если перемещение больше суммы ошибок, то можем считать, что объект сдвинулся, и меняем текущую координату на новую. Если нет, но HDOP новой МЕНЬШЕ чем HDOP текущей, то тоже заменяем. Если больше-равно, то игнорируем новую. Расстояние между координатами считаем по теореме Пифагора, но вот чтобы преобразовать дельту градусов долготы в дельту метров, потребуется косинус широты. Правде, есть приближенный алго для cos через тангенс двойного угла с заданной точностью, так что отсутствие math не проблема, но это если хватает вычислительной мощности.
Сообщение отредактировал GeGeL - Nov 25 2011, 17:16
|
|
|
|
|
Nov 25 2011, 21:41
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Тоже немного поигрался с приемником на МТ3329 в офисе с металлическими жалюзи на окнах. Ситуация примерно такая же. После холодного старта сначала спутников видит мало, начиная с 4-х, HDOP может достигать и 50-100. Ошибка 100-200м. Но потом за пару минут находит спутники, HDOP уменьшается до 0.7-2.0 и ошибки снижаются. На небольших временах около 10мин дрейф 20-30м. За большее время попадаются ситуации с худшими условиями приема и разброс увеличивается. В чипсете, видимо, есть фильтр - координаты не прыгают хаотично, а все время плавно "плывут". На картинке пример дрейфа.
Видимо во время движения этот дрейф не заметен потому, что как-бы "разворачивается" вдоль маршрута движения, который гораздо длинее чем сам дрейф. Предложенные вычисления довольно интересны, но кажутся малоэффективными - даже при ошибках в десятки метров HDOP меняется очень незначительно. Наверное достаточно грубой фильтрации по порогу HDOP и кол-ва спутников. А на стоянке (при скорости <5км/ч) можно просто считать среднее по координатам за какое-то кол-во точек.
|
|
|
|
|
Nov 26 2011, 13:50
|
Местный
  
Группа: Участник
Сообщений: 212
Регистрация: 2-02-11
Пользователь №: 62 643

|
Цитата(GeGeL @ Nov 25 2011, 21:11)  Этот алго sqrt по моему тот же Ньютона, только со сдвигами. Вот еще: Это скорей CORDIC (Цифра-за-цифрой). Алгоритм Ньютона требует деление и это его фатальный недостаток. Многие небольшие MCU имеют аппаратный умножитель (уже, раньше и того не было), но аппаратное деление до сих по роскошь (да и выполняется, если есть, не быстро). Цикл в CORDIC алгоритме может быть развёрнут, код оптимизирован и может тратиться всего несколько тактов на итерацию цикла (которых 32). В алгоритме Ньютона итераций может меньше, но одно только деление на 8-битном MCU может занять тысячу тактов, например. Цитата Но я имел ввиду ежесекундное СРАВНЕНИЕ суммы RMSError (расчитанных по HDOP по формуле выше) для какой-то координаты (назовем ее текущей) и новой координаты с расстоянием в метрах между этими координатами (перемещением). Если перемещение больше суммы ошибок, Не совсем понял откуда взять сумму ошибок. Вот стоит ночью на одном месте и улетает то на 180 метров туда, то на 180 метров сюда (в две точки, пол-часа там, пол-часа тут) -- как понимать? Цитата Расстояние между координатами считаем по теореме Пифагора, но вот чтобы преобразовать дельту градусов долготы в дельту метров, потребуется косинус широты. Да, нужен. Синус, косинус и арктангенс (верней, atan2(y,x)) считаются тоже кордиком достаточно легко. От безысходности для pic18 писал код. Хотя для более-менее вменяемого компилятора всё считается быстро и в плавучке (раз в секунду-то). Цитата Правде, есть приближенный алго для cos через тангенс двойного угла с заданной точностью, так что отсутствие math не проблема, но это если хватает вычислительной мощности. Вот тангенс как раз неудобен тем, что не влезает ни в какой int. Удобней отдельно представлять синусную и косинусную составляющую (получаемую из одной функции угла за одну итерацию на бит, примерно, методом CORDIC).
|
|
|
|
|
Nov 26 2011, 15:56
|
Местный
  
Группа: Свой
Сообщений: 403
Регистрация: 29-04-11
Из: Украина
Пользователь №: 64 682

|
Цитата(Frolov Kirill @ Nov 26 2011, 16:50)  Не совсем понял откуда взять сумму ошибок. Вот стоит ночью на одном месте и улетает то на 180 метров туда, то на 180 метров сюда (в две точки, пол-часа там, пол-часа тут) -- как понимать? Я вот что имел ввиду: держим в памяти координату, и ее ошибку (определенную как функцию от HDOP). Ее можно геометрически представить кругом с центром в координате и радиусом ошибки. Это наша рабочая координата, для выдачи, скажем, наружу. Ежесекундно получаем NMEA новую координату, определяем ее ошибку по ее HDOP. Если полученный круг не пересекается с рабочим, то тогда рабочим становится вновь полученный круг. И если радиус нового круга меньше рабочего, то опять же рабочим становится вновь полученный круг. Но это уже проехали, т.к. нет прямой функциональной зависимости между HDOP и ошибкой в метрах: если HDOP - это вероятностный показатель, то возможны редкие, но значительные отклонения даже при низкой HDOP (что показали вышеприведенные тесты), а это будет сбивать данный алгоритм. PS: а держится оно полчаса тут, полчаса там, скорее всего потому, что похожий алгоритм УЖЕ ЕСТЬ в чипсете. На самом деле изначально оно должно скакать постоянно. И, скорее всего, от чипсета к чипсету этот алгоритм фиксации различный (т.к. нигде не регламентируется), поэтому и имеем неопределенность.
Сообщение отредактировал GeGeL - Nov 26 2011, 16:03
|
|
|
|
|
Nov 29 2011, 17:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Включение EB500 каждые полчаса и выключение сразу после определения координат. В общем HDOP не показатель - 3, 17, 31 строки. Да и количество спутников тоже - 3, 7, 24, 31, 38 строки.
То что скорость прыгает, можно просто писать 0 до 10км/ч, пусть грубо, но зато не будут потом звонить: "Почему тачка едет, если она стоит?" А вот по поводу скачков (500м) - даже не знаю...
Сообщение отредактировал Alt.F4 - Nov 29 2011, 17:54
|
|
|
|
|
Nov 29 2011, 21:04
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Alt.F4 @ Nov 29 2011, 19:38)  Включение EB500 каждые полчаса и выключение сразу после определения координат. Немного не понятно: в таблице самые первые валидные координаты после включения, или как? Если это так, то я бы предложил все-же изменить условия эксперимента и фиксировать координаты только через минуту-другую после появления валидных значений. Там в чипсете еще какая-то пост обработка координат явно есть, и как она себя ведет после даже "горячего" старта неизвестно. У меня точность после "горячего" старта через пару минут точно улучшалась.
|
|
|
|
|
Nov 30 2011, 04:14
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Цитата Немного не понятно: в таблице самые первые валидные координаты после включения, или как? Да, это так. Цитата Если это так, то я бы предложил все-же изменить условия эксперимента и фиксировать координаты только через минуту-другую после появления валидных значений. А если объект движется? За минуту - другую можно далеко уехать. Определять по скорости движется ли объект? Так ведь и во время стоянки скорость скачет. Скорее всего лучшим вариантом будет фильтрация на сервере сразу по HDOP и по количеству спутников, так и прошивку трекера не надо менять и статистику можно набить получше.
Сообщение отредактировал Alt.F4 - Nov 30 2011, 04:16
|
|
|
|
|
Nov 30 2011, 09:39
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Alt.F4 @ Nov 30 2011, 06:14)  А если объект движется? За минуту - другую можно далеко уехать. Определять по скорости движется ли объект? Так ведь и во время стоянки скорость скачет. Во время стоянки скорость скачет до 5 км/ч (скажем так с 95% вероятностью  ) Но я как-то основную тему упустил. Топик вроде начинался с вопроса о дрейфе координат во время стоянки. Я и думал, что эти данные для этой темы. При движении вряд ли есть смысл выключать приемник и фиксировать координаты только раз в 30 мин. У нас в основной функционал прибора входит подключение к зажиганию - это основной сигнал перехода в активный режим. Цитата Скорее всего лучшим вариантом будет фильтрация на сервере сразу по HDOP и по количеству спутников, так и прошивку трекера не надо менять и статистику можно набить получше. Ну, это смотря как у кого система организована. Если вы держатель картографического онлайн сервера - тогда да. Если только производитель трекеров - тогда нет. Да и лишние данные (HDOP и по количеству спутников) придется передавать на сервер.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|