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

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

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

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

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

image

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

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

Из всего этого я собрал базовую станцию и ровер. Оба приемника работают в NVS BINR.
image

Внешний вид ровера. За неимением второго 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 и получил вот такой трек.

image

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

image

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

image

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

image

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

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

image

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

image

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

image

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

Почему так произошло и 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 мне так и не удалось, навигации по маршруту так же не ведется. Но я на всякий случай все-таки уточню, не нарушают ли подобные действия условия использования.

image

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

Спасибо за внимание!
Поделиться с друзьями
-->

Комментарии (8)


  1. x893
    13.05.2016 21:46
    +2

    Можно использовать радиомодули 433 или 868 MHz. На 5-10 км от базы должно хватать (не в городе конечно). У меня от базы на 14 этаже на 4-6 км на 17 см антену принимало.
    Хочу NEO-M8T попробовать.


  1. ilyavyalkov
    15.05.2016 10:21

    Отличная статья, сам сейчас развлекаюсь написанием ntrip to rinex конвертером.


    1. Svrg
      15.05.2016 11:16

      м.б. имелось ввиду RTCM to RINEX? ;) NTRIP это вроде транспортный протокол


      1. ilyavyalkov
        15.05.2016 11:58

        точно))


  1. wolowizard
    16.05.2016 13:55

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

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


    А почему не стали использовать стандартный для геодезистов протокол NTRIP? Ставим куда-нибудь бесплатный NTRIP-кастер (они есть и под линукс, и под виндовс), настраиваем базу на выдачу RTCM и транслируем измерения базы на кастер (в составе RTKlB есть средства для этого). На ровере rtkrcv штатно подключается к кастеру. Если вдруг будут моменты, сходные с:
    Сначала я подумал, что данные повреждаются в процессе передачи и это мешает расчетам.

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


    1. ashchuk
      16.05.2016 14:16

      Да, вы совершенно правы. Это было бы проще, изящнее, точнее и быстрее. Так и надо делать.
      RTCM я не использовал по той причине, что на тех приемниках, которые у меня имеются, нет возможности получить доступ ко второму UART, с которого сыплется RTCM: не припаяны контакты, а сам с паяльником лезть я побоялся. Но доделать очень хотелось до какого-то ощутимого результата.
      То, что существуют бесплатные NTRIP-кастеры, я тоже знаю, но мне с самого начала хотелось попробовать самому попробовать сделать что-то похожее самому, с нуля. Поэтому и получился такой велосипед.


  1. wolowizard
    16.05.2016 14:50

    кстати, а какой приемник был в качестве базы?
    На фото ровера видно, что там Навис.

    Про RTCM сказал на автомате, rtklib поддерживает много форматов, может в конкретном случае логичнее использовать другой (BINR, если база тоже Навис)

    увидел что тоже Навис


    1. ashchuk
      16.05.2016 15:32

      Оба приемника работают в BINR. Упустил этот момент в статье, сейчас поправлю.
      В скором времени у меня должны появиться другие приемники, с них уже смогу получать RTCM.
      Мне показалось странным, что в постобработке BINR есть решение, а в RTK — нет. Пока не прояснил для себя, почему конкретно так происходит. Я еще буду пробовать разные варианты и как появятся результаты, то либо этот пост обновлю, либо напишу ещё один: хочу попробовать наладить радиоканал, поэкспериментировать.
      Еще в процессе узнал о PylonGPS, думаю, что затрону еще и его.
      Ждите продолжения в скором времени.