python

RTKLib + Python + Google Maps JS API. Делаем свой навигатор

  • суббота, 14 мая 2016 г. в 03:16:52
https://habrahabr.ru/post/283418/
  • Глобальные системы позиционирования
  • Python
  • Open source


Здравствуйте!

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

Я подумал тогда: спутниковые системы, спутниковые приемники, геодезия, съемочные работы — близко соприкасающиеся вещи в строительной и инженерной области. И появилась тема дипломного проекта: применение одночастотных спутниковых приемников в земельном кадастре.

Понятное дело, что применять одночастотники в земельном кадастре, да и в геодезии — дело неразумное: помехи, точность, продолжительность приема сигнала. Но мне было важно посмотреть и разобраться, как работает приемник, как обрабатываются данные, как можно визуализировать результат. Мне было интересно.

Диплом я защитил, но интерес к теме не угас. Я продолжил работать в этом направлении и поставил перед собой задачу: наладить систему позиционирования в реальном времени с передачей данных через Интернет. В этой статье я хочу рассказать, что у меня получилось.

image

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

Итак, приступим. Что у нас есть:
  • Raspberry pi — 2 штуки;
  • NVS NV08C-CSM — 2 штуки;
  • Антенна NV2410 — 2 штуки;
  • Powerbank на 3000 мАч и дисплей (для передвижной станции).

Из всего этого я собрал базовую станцию и ровер.
image

Внешний вид ровера. За неимением второго USB преобразователя подключил приемник через Arduino

Далее по моей задумке: должен быть сервер, который будет принимать и сохранять данные с базовой станции, затем по требованию выдавать их роверам, а роверы уже самостоятельно рассчитывают свое положение и отправляют координаты на сервер или еще куда-нибудь.

Сказано — сделано. Сначала я написал python-скрипты, которые настраивают приемники для работы и записывают данные в файл/отправляют данные на сервер. Потом наступила очередь сервера: зарегистрировался на OpenShift и запустил сервис с использованием Tornado и MongoDB, для отладки подключил RockMongo, написал нужные handler-ы.

С ровером оказалось немного сложнее. Проблем с компиляцией RTKLib под Raspbian не возникло: программы для *nix в консольном варианте, все замечательно собирается одним sh makeall.sh. Нам нужен rtkrcv — это линуксовый аналог rtknavi, используемый для реализации RTK.

Я обрадовался, когда обнаружил, что rtkrcv уже поддерживает http в качестве входного потока. И огорчился, когда понял, что он не работает в виде request/response. Значит использовать один rtkrcv не получится. Тогда я написал передатчик между сервером и rtkrcv, который отправляет запросы, принимает данные и по сокету отправляет их в rtkrcv.

Если интересно более подробное описание, то весь написанный код, файлы конфигурации, *.pos и сырые данные для тестирования есть в открытом доступе на github.

Написал, проверил, попробовал. Пришло время первого теста: поставил антенну на крышу машины, на пассажирском сидении лежит приемник, телефон в режиме точки доступа. Антенна базовой станции установлена на крыше загородного дома, запущена заранее, с запасом в час. Ровер работает без ошибок, данные передаются корректно. В rtkrcv наблюдается 9-11 валидных спутников. Решения нет.

Сначала я подумал, что данные повреждаются в процессе передачи и это мешает расчетам. Перехватил данные на входе в rtkrcv и стал пробовать другие варианты. Попробовал отправить те же данные, но в виде файлов, на вход rtkrcv и получил вот такой трек.

image

Весь трек полностью

image

Здесь я еще стою на парковке, но по треку не скажешь

image

А здесь я очень медленно и законопослушно ползу в плотном потоке машин

image

Вверху окна: график с количеством спутников

Затем попробовал провести постобработку: сначала конвертируем сырые данные в RINEX, производим постобработку и получаем трек. И получилось.

image

Весь трек полностью. Зеленые точки — есть решение, желтые — решение есть, но неточное

image

Здесь я еще стою на парковке, обратите внимание на шаг сетки в нижнем правом углу

image

Вверху окна: график с количеством спутников. Добавил для сравнения с аналогичным рисунком выше

Почему так произошло и rtkrcv не выдал решения мне не понятно до сих пор. Я пробовал по разному переписать конфиг, пробовал с разными данными и в разное время, но безрезультатно. Ошибки в своих действиях я пока не обнаружил. Обновлю пост, если вдруг получится.

Но нужно двигаться дальше. Я подумал: если у меня получилось получить координаты вручную, то может попробовать каждый раз так обрабатывать данные? Обработка стала занимать больше времени, появились промежуточные файлы и стадии, получается не совсем RTK, да и в целом это неграмотно. Но это работает.

Для красоты и удобства сделал страницу с обновляющимися каждые десять секунд маркерами, получился такой своеобразный трекер.

image

Сейчас я собираю такую же систему, но для связи буду использовать радиоканал и nRF24L01+, должно получиться что-то больше похожее на RTK, но на небольшом расстоянии. Статью об этом напишу позже.

Спасибо за внимание!