Всем привет! Представьте, что у вас есть маршрут на 250 километров в горах, где нет сотовой связи и дорог, а вам нужно обеспечить безопасность участников парапланерной гонки!
TL;DR: В этом рассказе я опишу, как запилил систему трекинга спортсменов для парапланерных гонок RusXFly из LoRa-трекеров, палок и пылесосных шлангов. А потом свозил то, что получилось, в Приэльбрусье. Было эмоционально, экстремально, местами — страшно, но всё получилось и закончилось хорошо.
Этот текст написан специально для vas3k, и я буду очень благодарен всем советам как по проекту, так и по самому тексту. И да, я просто люблю длинные тире – текст AI-free.

Глава 1. Предыстория!
Всё началось с того, что весной мне написали из “Объединенной федерации спорта сверхлёгкой авиации” (ОФ СЛА России). Осенью планировалась сложная гонка в горах, связи там нет, а участники гонки очень ценны для Федерации, и с этим нужно что-то делать. Так я и познакомился с Анной! Анна - организатор гонки RusXFly, очень жизнерадостный человек, и она всю жизнь посвятила парапланеризму.
Парапланы — это такие летающие штуки, про которые тут недавно уже была отличная статья: https://vas3k.club/post/29777/

Я же в обычной жизни — соучредитель и техдир маленькой провинциальной фирмы, которая занимается спутниковым контролем транспорта. Но в первую очередь я инженер. Поэтому, разумеется, мне было интересно попробовать запустить систему мониторинга там, где есть примерно ничего. Челлендж был в том, чтобы сделать это фактически на пустом месте и максимально бюджетно.
Я сам не летаю, но у меня была бурная молодость с мотоциклами, парусами и поглядываниями в сторону всего летающего… Всё говорило, что с этими ребятами мы явно сойдёмся по вайбу!
Организаторы RusFly вдохновлялись гонкой X-Alps в Альпах. У спортсменов есть параплан, и есть маршрут с контрольными точками. Можешь лететь — лети, не можешь — беги. И всем было бы неплохо понимать, где находится каждый из участников.
Следом за спортсменом двигается его группа поддержки — суппортеры. Они везут ему еду, дополнительную снарягу и всё такое. Суппортерам тоже неплохо понимать, где сейчас находится их атлет. Позвонить ему или включить трансляцию координат в телеграмчике скорее всего не получится. Максимум, что может помочь — рация, но по ней сложно передавать координаты. Если с человеком что-то случилось, он не всегда может в рацию ответить. Да и вообще, искать человека в горах — так себе развлечение.
Глава 2. Разве ничего ещё не изобретено?
Референсы, на которые можно опираться, разумеется были. Использовать технологию LoRa для трекинга в таких условиях логично, мы малой мощностью, разрешенной ГКРЧ “без регистраций и СМС” можем отправить сигнал за десятки километров.
Все мы делаем маленькие пет-проекты. Один из моих — это AGLoRa (Ардуино + GPS + LoRa), в котором я как раз захотел поэкспериментировать с простым прототипом GPS LoRa–трекера на Arduino, чтобы получить больше опыта в этой области.
Разумеется, каждый встречный-поперечный спрашивает, зачем изобретать велосипед, ведь есть Meshtastic: https://vas3k.club/post/28718/
Откровенно говоря, когда я начинал делать AGLoRa, я ничего про Meshtastic и не знал, тогда он еще не приобрел популярность. Это очень крутой проект, но везде есть свои плюсы и минусы. На мой взгляд Meshtastic — это всё-таки больше про “тактические чатики”.
Конечно, на его базе можно сделать трекинг. У индийских парапланеристов в Гималаях развернута сеть на его основе. Минус Meshtastic для трекинга — в очень больших размерах пакета, а LoRa — это всё–таки про максимальный минимализм. Каждый лишний байт реально снижает вероятность получения пакета с корректным CRC.
Второй недостаток длинных пакетов: если в одной точке будет много устройств, мы быстро засрём эфир, особенно с ретрансляциями. Это нехорошо и не приветствуется ни стандартами, ни другими пацанами с устройствами на 869 МГц в той же локации. Драка радиолюбителей на паяльниках в горах — это вообще самое неприятное, во что можно попасть в этой жизни.
Один из моих знакомых по AGLoRa-чатику — Павел — сделал полностью оффлайн– систему трекинга для спортивного ориентирования (https://habr.com/ru/companies/yoomoney/articles/922328/). Получилось круто, но для RusXFly его наработки использовать не получилось бы, из-за очень длинного маршрута гонки и мобильности организаторов.
Порядочные руководители соревнований должны сидеть в своём шатре и пить энергетики, а эти неугомонные люди носились по всем окрестностям на внедорожниках, наблюдая за погодой и участниками. Только и успевай их разглядывать в бинокль на очередном склоне. Да и сам базовый лагерь переезжает по мере продвижения спортсменов.
А еще у нас были зрители!!! Они следили за своими фаворитами на карте и активно комментировали в чате гонки их успехи! И возмущались когда от спортсмена долго не поступало актуальных координат! Так что без онлайна — никуда.
Из других теоретически существующих альтернатив, есть полётные приборы работающие в сети Fanet (это тоже 868 МГц как LoRa, только изначально про авиацию), но они не умеют в ретрансляцию.
Глава 3. Придумываем концепцию
Итак, для того, чтобы видеть спортсменов, нам необходимо повесить на них какие-нибудь устройства, и любыми способами заполучить с них координаты. Для этого около сотовых вышек (их критически мало по маршруту, но они есть) я поставлю приемники с 2G–модемами.
2G работает практически везде, где хоть как-то добивает сотовая связь. А еще эти модули просты в программировании и недороги. Назовем эти устройства для простоты “шлюзами”. С их помощью организаторы и зрители смогут видеть через сайт, где находятся спортсмены.
Кроме того, эти “шлюзы” можно поставить на машины групп поддержки, ведь чаще всего суппортеры стоят где-то на пригорочке с хорошими видами на своего спортсмена и иногда даже с интернетиком. Без него им скучно, да и связь с организаторами нужна, так что пригорочки будут подбирать поближе к сотовым вышкам.
Иногда суппортеры могут летать вместе со спортсменом, показывая ему потоки, это допускается правилами. Кроме этого, есть группа организаторов, которые сопровождают гонку, в том числе, и с воздуха. Они занимаются видеосъемкой, разведкой погоды, организацией медпомощи — и за их безопасностью тоже нужно следить. Все они не менее ценны команде, чем спортсмены. Используем их и для своих целей: нечего болтаться в воздухе просто так — пусть заодно поработают ретрансляторами!
Глава 4. Список нужного оборудования
Прикинем. Для того чтобы всё получилось нам нужно:
- Трекеры как маяки для спортсменов. Желательно, чтобы жили от батарейки максимально долго, мало ли что.
- Трекеры–ретрансляторы. Для летающей части команды организаторов и суппортеров. Время работы на одной зарядке уже не так важно, лишь бы день держались. Суппортеры и организаторы — на машинах, они точно найдут где подзарядиться.
- “Шлюзы”. По сути — просто приемники, которые будут отправлять всё, что услышали в эфире, на бэкенд, через GSM–связь. Они тоже будут работать автономно,но им можно прицепить большие повербанки или аккумуляторы, вес не важен. Даже наоборот, не сдует и сложнее утащить сусликам, если те вдруг заинтересуются!
- Софт: какой–то бэкенд, какой–то сайтик, какие–то приложения для мобилок, чтобы можно было видеть спортсменов там, где нет интернета.
Глава 5. Пилим железо
Нам нужен трекер! Максимально экономичный и надежный. Никаких экранов, но с Bluetooth, чтобы можно было подключиться с телефончика и посмотреть, кто там у нас есть рядом. Аккумулятора должно хватать минимум на сутки, желательно, с внешней антенной и минимальным весом (им же летать!).
Паять сам такое количество трекеров я бы просто не осилил. Конечно, можно взять готовые платы, например от Heltec - T114 (https://heltec.org/project/mesh-node-t114/) или ESP32 LoRa–модуль со встроенным GPS (https://heltec.org/project/wireless-tracker/) или популярный LILYGO TTGO T-Beam. Есть и готовые трекеры типа T1000, уже в корпусе. Но! Как минимум, их все где-то “надо взять”, а для 40 штук “взятие” может быть не таким простым, например, из-за таможни.
Поэтому я предложил поучаствовать в проекте своим знакомым из ООО “БУН” в Иннополисе. Это разработчики, которые плотно в теме изготовления LoRaWAN–устройств. Они пилят свой ГЛОНАСС LoRa/LoRaWAN–трекер, а я немного помогаю им в разработке, тестировании, маркетинге и продажах. Вы же помните, что “таксую программирую я для души, а так-то у меня бизнес”!
У меня уже было на руках несколько работающих прототипов, и я предложил протестировать всё в реальных условиях, а они взяли и согласились. Так что за следующие пару месяцев мне изготовили и прислали 40 LoRa–трекеров на базе STM32. Это уже почти серийное устройство, сделанное инженерами, которые собаку съели на энергосберегающих устройствах для ЖКХ и IoT.

Для своих “шлюзов” я использовал популярные Heltec LoRa Wireless Stick Lite V3 (https://heltec.org/project/wireless-stick-lite-v2/). Они дешевые и хорошо работают. Это никоим образом не реклама — модули на самом деле удобные и хорошо отработали.
Хотя, как-то так вышло, что когда шлюз был уже написан и модули куплены, менеджеры Heltec узнали от меня про гонку и по своей инициативе прислали мне еще несколько платок. А после, попросили рассказать как всё прошло, так что я теперь оставил след еще и на сайте Heltec: https://wiki.heltec.org/news/loRa-tracking-in-the-mountains/loRa-tracking-in-the-mountains
Едем дальше. Чтобы отправить данные в бэк, я припаял к этим LoRa Wireless Stick Lite V3 популярные “красные” GSM–модемы. В интернетах пишут что синие работают лучше, но у меня, почему-то вышло наоборот. GSM–модули очень любят кушать, так что не экономьте на конденсаторах. Лучше всего при 100% нагрузке у меня работали те, где на питании висели ионисторы на полтора фарада.

Я сознательно беру слово “шлюз” в кавычки, потому что это не LoRaWAN–шлюзы. Трекер умеет работать и в LoRaWAN–сети, но я же не совсем больной тащить дорогие и жрущие электричество LoRaWAN–шлюзы в горы. Я просто сделал максимально дешевые устройства для отправки LoRa–данных в бэк; их и потерять не жалко, случись что… Простота плюс дешевизна позволили быстро наклепать себе 10 штук “шлюзов”, посчитал, что столько будет достаточно.
Глава 6. Пишем код
В наши времена, когда код стремительно теряет ценность, про это и писать стыдно. Но “стыдно — когда видно”, а эти части я пока ещё не опенсорсил, так что читайте.
Прошивки и трекера, и “шлюза” — кастомные, написанные специально под мероприятие. Прошивка трекера не моя, но её по моей просьбе немного подкорректировали, “выкинув всё ненужное и добавив нужное”, типа высоты.
Мы сделали короткий идентификатор и передавали минимум информации. “Двадцати одного байта будет достаточно каждому!”, — косплеил я классика.
Режим ретрансляции сделали классическим алгоритмом flooding. Устройство помнит, какие пакеты принимало, и пересылает дальше, уменьшая им оставшееся число прыжков (то, что называется hops или TTL).
На самом деле это самый интересный вызов в проекте LoRa–трекера — сделать ретрансляцию пакетов максимально эффективной, зная реальные координаты и уровень сигнала соседних устройств.
По бэку время поджимало, и надо было взять что-то готовое. У меня есть доступ к самым разным платформам мониторинга, типа Wialon, но для этого проекта я использовал опенсорсный Traccar (https://www.traccar.org/).
Основных причин несколько:
- скрохоборить и не платить за объекты.
- функционал Виалона etc. тут излишен.
- у меня уже есть нормально работающий сервер Traccar.
- у меня есть свой собственный мобильный клиент для Traccar! А значит я могу быстро допилить под это мероприятие любые фишечки.
Ремарка. В этом нет рационального зерна или коммерции — только слабоумие и отвага, но за пару лет до описываемых событий я закрыл свой старый гештальт и написал клиента мониторинга транспорта для мобилок. Просто из любви к искусству хотелось сделать его таким, каким именно я его вижу.
Чтобы не привязываться к платным системам, писал под API очень классного проекта — Traccar, который очень люблю и часто использую для себя, когда дело не касается основной работы.
Нативное приложение удобней веб-версии тем, что я могу показывать направление и перепад высоты с объектом, используя встроенный компас телефона. Так что я немного поколдовал с высотой — и вуаля! Мы готовы трекать парапланеристов!
Приложение бесплатное, если будете качать, поставьте звездочки!
Another Tracking Client (https://apps.apple.com/ru/app/another-tracking-client/id6657993181).

Второе приложение, которое я допиливал под гонку, тоже моё. Оно написано специально для работы с трекерами по bluetooth — “LoRa RADAR”. Хотелось сделать приложение с векторными картами, которые кешируются при любом уровне зума и потом видны, даже если нет интернета.
Изначально оно писалось как клиент AGLoRa, но адаптировать под протокол нового трекера было несложно. Сейчас определяюсь с бесплатными источниками вектора. Очень не хочется делать приложение платным, поэтому пока не публиковал, только testflight и apk.
LoRa RADAR (https://github.com/Udj13/AGLoRa/wiki/Lora-Radar-app).
Глава 7. Что-то обязательно пойдет не так!
Так как “шлюза” в начале лета вообще не существовало в принципе, план был надёжный, как швейцарские часы: быстро навайбкодить его за несколько дней и максимально оттестировать на природе за лето.

Но, как оказалось, с эмбеддед такая самоуверенность не прокатывает. Чтобы всё заработало, пришлось самому разбираться и с АТ– командами, и со всякими другими подводными камнями. А еще у нейронок нет ручек, так что паять и разруливать аппаратные проблемы тоже пришлось, как будто мы в 18 веке живем! Когда уже будет CLI, к которой можно подключить роборуку? Когда всем выдадут по “Д.Ж.А.Р.В.И.С.”у? В итоге провозился дольше, чем планировал.
Из проблем, которые не успел устранить до поездки, — очень медленные http–запросы через 2G GSM–модем. Родной протокол Traccar не позволяет пульнуть ему сразу пачку точек с разных трекеров (что логично), а каждый http–запрос занимает примерно 2 секунды.
Ладно, это не вот прям “проблема”, я для драматургии так написал, но неприятно. Попробовал переделать на популярный UDP протокол WialonIPS, но принципиально ничего не улучшилось.
До гонки оставался месяц. За исключением долгих запросов, прошивка к тому моменту работала стабильно. И, руководствуясь принципом, “лучшее — враг хорошего”, на гонку тоже всё поехало в таком виде.
Важно это было только на стартах пролога и самой гонки: когда все трекеры запустили в одной локации, очередь сообщений в шлюзах росла быстрее, чем успевала выгружаться из памяти на сервер.
Пришлось временно выкрутиться, подключив один шлюз через usb к ноуту, и отправлять пакеты через него. Показывать приличным людям такое, конечно, нельзя, но всё сработало: все трекеры были онлайн.

Айтишники среди пилотов, дружно сделали вид, что моих костылей не заметили. Ну или решили, что так и надо. А потом все растянулись по маршруту, так что дальше всё уже работало нормально.
Оправдаюсь тем, что не хотел делать лишнюю точку отказа и обойтись стандартными механизмами Traccar. Но теперь видимо буду переписывать на MQTT или запускать промежуточный скрипт в который кидать батчи одним запросом. Умные пацаны советуют не выпендриваться и делать MQTT.
Глава 8. Едем к Эльбрусу!
Наступила вторая половина сентября, ребёнку, уже загрустившему от нового учебного года, были объявлены внеплановые каникулы, грузимся в тачку и погнали! Курс на Юг!
Мы так-то нормальные туристы, и незадолго до этого вернулись из поездки на север к Белому морю. Я особо даже вещи не разбирал, только удочки выложил… Но наши обычные локации — это водоемы, а они плоские. Поэтому когда на горизонте появился Пятигорск, пейзажи были для нас завораживающими.
Для начала нас заселили в гостевой дом “Термики”, уже набитый под завязку парапланеристами. Там мы сразу погрузились в тусовку. “Летаешь? Нет? Ну не переживай, это временно!” — таким вдохновляющим приветствием меня встретил веселый бородатый хозяин.

И это на самом деле круто! Во–первых, даже если ты не летаешь, то всё равно это повод высоко забираться! Сам старт гонки был на высоте 2600 метров в урочище Джилы-Су. Но ребятам показалось этого мало и они затащили один из “шлюзов” еще выше — на гору Сирх, где стоит сотовая вышка. Благодаря ему мы принимали данные со всего направления на Малый Бермамыт, где была следующая контрольная точка. Я же растопырил свои антеннки на краю обрыва и смотрел, что вообще у нас получается. Получалось неплохо —через ретрансляции удавалось видеть даже спортсменов, летавших на противоположной стороне горы.

За спиной величаво белел во всей своей красоте Эльбрус! Над головой парили орлы и парапланеристы. Светило солнышко! Под моим рабочим местом где–то далеко–далеко внизу бурлила река. И водопад. Казалось бы вот она — идиллия! Что тут может пойти не так?
Но приехал я со своими железками, как оказалось, не зря! На второй день — день старта самой гонки погода резко испортилась. Нас чуть не сдуло с плато ураганом (еле успели собрать палатки) и пошёл снег! Погода была нелетная, и спортсмены пошли пешком. Часть из них оказалась заблокирована непогодой в горах: дороги размыло, каша из грязи и снега не позволяла двигаться с нормальной скоростью и выйти в долину, а суппортеры не могли проехать к нужным точкам маршрута. Кто-то, не выдержав непогоды, снимался с гонки. И понять их было можно. До финиша дошла только половина стартовавших атлетов.
Снегом засыпало и шлюз на Сирхе. Хотя он героически ещё 6 дней передавал телеметрию из сугроба, пока не разрядился его повербанк.
Помните я выше писал, что шлюз дешевый? Ну засыпало и засыпало, не по льду же там за ним ползать! Просто заблокировал симку после гонки и поехал домой. Саму коробочку местные парапланеристы потом сняли с горы через пару недель, когда позволила погода. Дорогущий LoRaWAN–шлюз я бы так, разумеется, в горах не бросил! Полз бы по скользким склонам, но забрал!

В условиях непогоды организаторам особенно важно было понимать, на каком этапе маршрута находится каждый спортсмен. Сотовой связи, как я уже писал, нет, рации не везде добивают, но у нас было большое количество и летающих ретрансляторов, и “шлюзов” на машинах, так что в высокогорье практически все спортсмены трекались в реальном времени.
Забавно то, что хуже их видеть мы стали потом, когда гонка спустилась в долину, ближе к Кисловодску. Участники растянулись, кто-то сошёл (а значит, минус машина его суппортеров), и в итоге у нас стало меньше “шлюзов”, которые могли бы передать сигнал. Но в долине работала сотовая связь, так что там это было уже не так критично. Кроме того, мешали современные реалии – спуфинг GPS.
На одном из промежуточных стартов было можно было наблюдать как после набора высоты спуфер откидывал трекер на несколько десятков километров в сторону. Потом спортсмен приземляется и он опять на координатах старта.
Разумеется, любая гонка это тяжело и для участников, и для организаторов. Здесь тоже моментами было тяжело. Это фактически работа. Акклиматизация, непривычные условия, нервы, переживания что что-то не получится и ты подведешь людей, беготня с ноутом, прописывание подменных трекеров, если какие-то выходят из строя, езда на машине с антенной по несколько сотен км там, где нет других экипажей, чтобы поймать сигнал, опять нервы…

Но вспомним цели! Запустить систему трекинга “из ничего в нигде”, и получить новый опыт. Эти цели я выполнил на все 100%, так что поездкой доволен!
Ну и, как всегда, любое приключение — это, в первую очередь, интересные люди! Люди, которые нашли себя и делают своё интересное дело!
Глава заключительная. Выводы и что мы будем делать дальше
Для прототипов, которых в принципе не существовало за три месяца до гонки, всё прошло более чем хорошо. Признаться, я думал, будет хуже.
Да, были косяки, были странные проблемы, когда на некоторых трекерах отвалился GPS. В пылу гонки и походной жизни некоторым поотрывали антенны или сломали порты зарядки. Паяльник и ЗИП (хотя это, наверное, сейчас была тавтология?) я брал не зря.
Спортсмены с пониманием отнеслись к тому, что организаторы заботятся об их безопасности, и ночью ответственно заряжали своё оборудование. А суппортеры перед стартами проверяли работу трекера спортсмена, потому что сами днём следили за ним через приложение.

Да, трекеры оказались нужны! Даже с учетом того, что где-то сигнал мог не проходить, приложениями пользовались и организаторы, и суппортеры.
Ещё во время гонки Анна сказала , что у неё это первая подобная гонка, когда она понимала, где именно находятся спортсмены и чуть меньше нервничала. То же самое мне сказал и Константин, директор по безопасности гонки. Всё-таки RusXFly — это не лёгкая прогулка, а сложное и опасное мероприятие, даже когда спортсмены на земле. Скользкие горные дороги, просто пипец какие погодные условия, которые выпали участникам в этом году, всё это добавило Анне, Косте, другим организаторам и суппортерам седых волос.

Для меня же запустить 40 устройств в реальных условиях — это прекрасный тест! Теперь занимаюсь доработкой софта, мои партнеры из Иннополиса дорабатывают аппаратную часть трекеров и разбираются с найденными проблемами.
Причиной проблемы с GPS скорее всего оказался банальный непропай некоторых модулей. Конечно, есть вопросы и по прошивке, и по индикации, и по корпусу, но это всё — обычные технические моменты, которые мы планируем решить за зиму. Следующий большой тест, который у меня запланирован, это уже тест в LoRaWAN–сети.
“Шлюзы” (буду по-прежнему писать в кавычках, а то стыдно!), судя по телеметрии, которую я с них видел, тоже отработали нормально. Как помните, даже если оставить их в сугробах, это их не очень расстраивает и уж точно не влияет на работоспособность.
Что же касается моего open source-проекта, то я ещё немного побалбесничаю и, наконец, допишу Аглоре поддержку популярных платок с маркетплейсов, типа модулей LILYGO TTGO и Heltec.
Расскажите в комментариях, интересно было бы вам такое устройство для вашего активного хобби? И как ещё его могли бы применить? Это мотивирует не забивать! Пока это всё — некоммерческая тема, так что приятно видеть, когда твоя работа нужна людям.
Если вы хотите собрать себе своё кастомное устройство на базе модулей EByte, то у меня есть небольшой чатик в телеграмм по AGLoRa. Напишите мне в личку — и я вас туда добавлю (просто не хочется светить ссылку, а потом вычищать ботов с большими сиськами).
Ссылка на мой проект на GitHub: https://github.com/Udj13/AGLoRa
Если под какие-то задачи нужны не DIY, а нормальные LoRa или LoRaWAN трекеры с кастомной прошивкой, собранные в РФ (чтобы с НДС и всё такое) - напишите, скоро я смогу это организовать: shlyagin@gmail.com.
Спасибо, что дочитали! Старался не нудеть и писать не скучно!
Если что-то режет глаз или непонятно, напишите пожалуйста!

Ну и не могу не оставить ссылки на всех тех замечательных людей, которые втянули меня в это необычное приключение:
Ссылка на проект Анны, гонка RusXFly - https://rusxfly.ru/
Фильм про гонку RusXFly 2025: https://vk.com/wall-213617194_366
Директор по безопасности гонки Константин: https://parakot.ru/
Гостевой дом для парапланеристов в Пятигорске, где мы тусили: https://termiki.ru/





ML-щики, кто клюнул на LoRa в названии?
А есть какая-нить гифка, в стиле flightradar, с визуализацией?