RTKLib + Python + Google Maps JS API. Робимо свій навігатор

Привіт!

Рік тому я закінчив своє славне навчання в університеті на факультеті геоинженерии та кадастру. Я, як і, напевно, багато студентів, прагнув написати диплом з користю для себе, щоб не було шкода витраченого часу і сил, тому і тему дипломного проекту вибирав цікавіше. У пошуках цікавого матеріалу я натрапив на цю статті і загорівся бажанням спробувати щось схоже.

Я подумав тоді: супутникові системи, супутникові приймачі, геодезія, знімальні роботи — близько дотичні речі у будівельній та інженерної області. І з'явилася тема дипломного проекту: застосування одночастотних супутникових приймачів в земельному кадастрі.

Ясна річ, що застосовувати одночастотники в земельному кадастрі, так і в геодезії — справа нерозумна: перешкоди, точність, тривалість прийому сигналу. Але мені було важливо подивитися і розібратися, як працює приймач, як обробляються дані, як можна візуалізувати результат. Мені було цікаво.

Я захистив Диплом, але інтерес до теми не згас. Я продовжив працювати в цьому напрямку і поставив перед собою завдання: налагодити систему позиціонування в реальному часі з передачею даних через Інтернет. У цій статті я хочу розповісти, що у мене вийшло.

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, але на невеликій відстані. Статтю про це напишу пізніше.

Спасибі за увагу!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.