Год назад я закончил свое славное обучение в университете на факультете геоинженерии и кадастра. Я, как и, наверняка, многие студенты, стремился написать диплом с пользой для себя, чтобы не было жалко потраченного времени и сил, поэтому и тему дипломного проекта выбирал поинтереснее. В поисках интересного материала я наткнулся на эту статью и загорелся желанием попробовать что-то похожее.
Я подумал тогда: спутниковые системы, спутниковые приемники, геодезия, съемочные работы — близко соприкасающиеся вещи в строительной и инженерной области. И появилась тема дипломного проекта: применение одночастотных спутниковых приемников в земельном кадастре.
Понятное дело, что применять одночастотники в земельном кадастре, да и в геодезии — дело неразумное: помехи, точность, продолжительность приема сигнала. Но мне было важно посмотреть и разобраться, как работает приемник, как обрабатываются данные, как можно визуализировать результат. Мне было интересно.
Диплом я защитил, но интерес к теме не угас. Я продолжил работать в этом направлении и поставил перед собой задачу: наладить систему позиционирования в реальном времени с передачей данных через Интернет. В этой статье я хочу рассказать, что у меня получилось.
В статье я не описал подробно, что такое RTKLib, какие подпрограммы в него входят и как он работает. Подробно можно почитать здесь. Я советую хотя бы бегло ознакомиться с этой статьей прежде чем продолжать читать дальше.
Итак, приступим. Что у нас есть:
- Raspberry pi — 2 штуки;
- NVS NV08C-CSM — 2 штуки;
- Антенна NV2410 — 2 штуки;
- Powerbank на 3000 мАч и дисплей (для передвижной станции).
Из всего этого я собрал базовую станцию и ровер. Оба приемника работают в NVS BINR.
Внешний вид ровера. За неимением второго USB преобразователя подключил приемник через Arduino
Далее по моей задумке: должен быть сервер, который будет принимать и сохранять данные с базовой станции, затем по требованию выдавать их роверам, а роверы уже самостоятельно рассчитывают свое положение и отправляют координаты на сервер или еще куда-нибудь.
Сказано — сделано. Сначала я написал python-скрипты, которые настраивают приемники для работы и записывают данные в файл/отправляют данные на сервер. Потом наступила очередь сервера: зарегистрировался на OpenShift и запустил сервис с использованием Tornado и MongoDB, для отладки подключил RockMongo, написал нужные handler-ы.
С ровером оказалось немного сложнее. Проблем с компиляцией RTKLib под Raspbian не возникло: программы для *nix в консольном варианте, все замечательно собирается одним sh makeall.sh. Нам нужен rtkrcv — это линуксовый аналог rtknavi, используемый для реализации RTK.
Я обрадовался, когда обнаружил, что rtkrcv уже поддерживает http в качестве входного потока. Но потом понял, что мне это не подходит. Значит использовать один rtkrcv не получится. Тогда я написал передатчик между сервером и rtkrcv, который отправляет запросы, принимает данные и по сокету отправляет их в rtkrcv.
Если интересно более подробное описание, то весь написанный код, файлы конфигурации, *.pos и сырые данные для тестирования есть в открытом доступе на github.
Написал, проверил, попробовал. Пришло время первого теста: поставил антенну на крышу машины, на пассажирском сидении лежит приемник, телефон в режиме точки доступа. Антенна базовой станции установлена на крыше загородного дома, запущена заранее, с запасом в час. Ровер работает без ошибок, данные передаются корректно. В rtkrcv наблюдается 9-11 валидных спутников. Решения нет.
Сначала я подумал, что данные повреждаются в процессе передачи и это мешает расчетам. Перехватил данные на входе в rtkrcv и стал пробовать другие варианты. Попробовал отправить те же данные, но в виде файлов, на вход rtkrcv и получил вот такой трек.
Весь трек полностью
Здесь я еще стою на парковке, но по треку не скажешь
А здесь я очень медленно и законопослушно ползу в плотном потоке машин
Вверху окна: график с количеством спутников
Затем попробовал провести постобработку: сначала конвертируем сырые данные в RINEX, производим постобработку и получаем трек. И получилось.
Весь трек полностью. Зеленые точки — есть решение, желтые — решение есть, но неточное
Здесь я еще стою на парковке, обратите внимание на шаг сетки в нижнем правом углу
Вверху окна: график с количеством спутников. Добавил для сравнения с аналогичным рисунком выше
Почему так произошло и rtkrcv не выдал решения мне не понятно до сих пор. Я пробовал по разному переписать конфиг, пробовал с разными данными и в разное время, но безрезультатно. Ошибки в своих действиях я пока не обнаружил. Обновлю пост, если вдруг получится.
Но нужно двигаться дальше. Я подумал: если у меня получилось получить координаты вручную, то может попробовать каждый раз так обрабатывать данные? Обработка стала занимать больше времени, появились промежуточные файлы и стадии, получается не совсем RTK, да и в целом это неграмотно. Но это работает.
Для красоты и удобства сделал страницу с обновляющимися каждые десять секунд маркерами, получился такой своеобразный трекер.
Условия использования Google Maps API накладывает ряд ограничений на использование сервиса. В нашем случае нам интересен пункт 10.4.c.iii, который гласит:
No navigation. You will not use the Service or Content for or in connection with (a) real-time navigation or route guidance; or (b) automatic or autonomous vehicle control.
Технически настроить и запустить RTK мне так и не удалось, навигации по маршруту так же не ведется. Но я на всякий случай все-таки уточню, не нарушают ли подобные действия условия использования.
Сейчас я собираю такую же систему, но для связи буду использовать радиоканал и nRF24L01+, должно получиться что-то больше похожее на RTK, но на небольшом расстоянии. Статью об этом напишу позже.
Спасибо за внимание!
Комментарии (8)
ilyavyalkov
15.05.2016 10:21Отличная статья, сам сейчас развлекаюсь написанием ntrip to rinex конвертером.
wolowizard
16.05.2016 13:55На первый взгляд, получилось как-то сложно.
Я обрадовался, когда обнаружил, что rtkrcv уже поддерживает http в качестве входного потока. И огорчился, когда понял, что он не работает в виде request/response. Значит использовать один rtkrcv не получится. Тогда я написал передатчик между сервером и rtkrcv, который отправляет запросы, принимает данные и по сокету отправляет их в rtkrcv.
А почему не стали использовать стандартный для геодезистов протокол NTRIP? Ставим куда-нибудь бесплатный NTRIP-кастер (они есть и под линукс, и под виндовс), настраиваем базу на выдачу RTCM и транслируем измерения базы на кастер (в составе RTKlB есть средства для этого). На ровере rtkrcv штатно подключается к кастеру. Если вдруг будут моменты, сходные с:
Сначала я подумал, что данные повреждаются в процессе передачи и это мешает расчетам.
можно через консоль rtkrcv смотреть в реальном времени состояние потока с базы, или параллельно подключить к тому же источнику rtknavi и посмотреть в удобном диагностическом вьювере, что не так с измерениями базы.ashchuk
16.05.2016 14:16Да, вы совершенно правы. Это было бы проще, изящнее, точнее и быстрее. Так и надо делать.
RTCM я не использовал по той причине, что на тех приемниках, которые у меня имеются, нет возможности получить доступ ко второму UART, с которого сыплется RTCM: не припаяны контакты, а сам с паяльником лезть я побоялся. Но доделать очень хотелось до какого-то ощутимого результата.
То, что существуют бесплатные NTRIP-кастеры, я тоже знаю, но мне с самого начала хотелось попробовать самому попробовать сделать что-то похожее самому, с нуля. Поэтому и получился такой велосипед.
wolowizard
16.05.2016 14:50кстати, а какой приемник был в качестве базы?
На фото ровера видно, что там Навис.
Про RTCM сказал на автомате, rtklib поддерживает много форматов, может в конкретном случае логичнее использовать другой (BINR, если база тоже Навис)
увидел что тоже Нависashchuk
16.05.2016 15:32Оба приемника работают в BINR. Упустил этот момент в статье, сейчас поправлю.
В скором времени у меня должны появиться другие приемники, с них уже смогу получать RTCM.
Мне показалось странным, что в постобработке BINR есть решение, а в RTK — нет. Пока не прояснил для себя, почему конкретно так происходит. Я еще буду пробовать разные варианты и как появятся результаты, то либо этот пост обновлю, либо напишу ещё один: хочу попробовать наладить радиоканал, поэкспериментировать.
Еще в процессе узнал о PylonGPS, думаю, что затрону еще и его.
Ждите продолжения в скором времени.
x893
Можно использовать радиомодули 433 или 868 MHz. На 5-10 км от базы должно хватать (не в городе конечно). У меня от базы на 14 этаже на 4-6 км на 17 см антену принимало.
Хочу NEO-M8T попробовать.