Как собрать собственный радарный трекер для гольфа на Raspberry Pi
Коммерческие гольф-мониторы вроде TrackMan или Bushnell стоят от двух до двадцати тысяч долларов. Для любительских тренировок в гараже или во дворе это безумные деньги. Проект OpenFlight предлагает альтернативу: собрать функциональный измеритель параметров удара своими руками на базе доступных доплеровских радаров и «малинки». Базовый сетап обходится примерно в $400, а расширенная версия с контролем угла запуска укладывается в $560.
Проект написан преимущественно на Python с веб-интерфейсом на React. Разработчик jewbetcha выложил исходники под лицензией AGPL-3.0 и активно развивает кодовую базу вместе с сообществом.
Как устроена система
Главная сложность при отслеживании удара по мячу в том, что события происходят за доли миллисекунды. Если считывать данные со стандартного датчика по таймеру, момент контакта клюшки с мячом легко пропустить.
OpenFlight решает эту задачу с помощью связки аппаратного акустического триггера и кольцевого буфера радара.
Архитектура системы состоит из четырех основных компонентов:
- Акустический датчик SparkFun SEN-14262 улавливает звук соударения клюшки с мячом. Он выдает аппаратное прерывание с задержкой около 10 микросекунд.
- 24-гигагерцевый радар OmniPreSense OPS243-A непрерывно пишет «сырые» квадратурные I/Q данные в кольцевой буфер с частотой дискретизации 30 kSPS. По сигналу триггера он выгружает 4096 сэмплов (примерно 136 мс вокруг момента удара).
- Дополнительный миллиметровый радар TI IWR6843 с кастомной прошивкой замеряет вертикальный угол вылета мяча и траекторию движения головки клюшки.
- Raspberry Pi 5 под управлением Linux рассчитывает физические параметры, запускает баллистическую модель полета и отдает данные через веб-сокеты на локальный React-дашборд.
Что умеет измерять OpenFlight
Радарный блок OPS243-A ловит сдвиг частоты отраженного радиосигнала. На базовой частоте 24.125 ГГц каждый 1 миль/ч скорости дает доплеровский сдвиг примерно 71.7 Гц. Проект фильтрует спектр и вычисляет несколько параметров:
- Скорость мяча в диапазоне от 35 до 200 миль/ч с точностью около ±0.5%.
- Скорость клюшки, которую софт вычисляет по спектру сигнала за несколько миллисекунд до акустического пика.
- Smash Factor, то есть коэффициент передачи энергии (отношение скорости мяча к скорости клюшки).
- Расчетную дистанцию переноса (carry distance) на базе математической баллистической модели.
Угол вылета мяча (Launch Angle) в базовой конфигурации вычисляется приближенно. Если подключить плату TI IWR6843, система считывает честный геометрический угол и экспериментальный угол атаки клюшки (Club Path).
Кстати, для тренировок махов без мяча предусмотрен отдельный режим swing-speed. В нем акустический триггер отключается, а софт считывает пиковые скорости непрерывным потоком.
Железо и особенности сборки
Собрать устройство можно на макетке без сложной пайки. В репозитории есть подробная таблица компонентов со ссылками.
Базовый комплект оборудования:
- Доплеровский радар OPS243-A ($249)
- Одноплатник Raspberry Pi 5 ($130)
- Сенсор звука SparkFun SEN-14262 ($18)
- Семидюймовый сенсорный дисплей для автономной работы ($46)
- Блок питания и вспомогательные провода ($27)
Если нужен угол вылета, придется докупить модуль TI IWR6843LEVM ($156). Раньше автор использовал модули K-LD7, но сейчас они объявлены устаревшими из-за ограничения по максимальной измеряемой скорости в 62 мили/ч.
Есть важный нюанс по питанию. Raspberry Pi не вытягивает одновременную работу двух радаров по USB. Поэтому OPS243-A подключают через пины GPIO UART (/dev/ttyAMA0), а плата TI занимает порт USB. Готовая прошивка для TI IWR6843 уже лежит в папке firmware/releases/, поэтому собирать ее в среде Texas Instruments не придется.
Быстрый старт
Установка на свежую Raspberry Pi OS 64-bit сведена к интерактивному скрипту:
git clone https://github.com/jewbetcha/openflight.git
cd openflight
./scripts/setup/setup.sh
Скрипт настроит права доступа к портам, обновит зависимости и сконфигурирует автозапуск. После этого трекер запускается в режиме киоска:
# Базовый запуск со звуковым триггером
scripts/start-kiosk.sh
# Запуск с угловым радаром IWR6843 (значения геометрии замеряются по месту)
scripts/start-kiosk.sh --iwr6843 \
--ops-port /dev/ttyAMA0 \
--iwr6843-tee-m 1.372 --iwr6843-net-m 4.064 \
--iwr6843-tilt-deg 5.5 --iwr6843-radar-height-m 0.229 \
--iwr6843-ball-height-m 0.021
Если радар еще не приехал, а код пощупать хочется, запуск с флагом --mock генерирует синтетические данные выстрелов для отладки UI.
Веб-морда открывается локально на порту 8080. Если развернуть ее на телевизоре или планшете через http://openflight.local:8080/display, получится удобный экран для тренировочной зоны.
Для разработчиков есть простой Python API. Получать метрики в собственных скриптах можно буквально в десять строк:
from openflight.rolling_buffer import RollingBufferMonitor
monitor = RollingBufferMonitor()
monitor.connect()
monitor.start()
print("Готов к удару...")
shot = monitor.wait_for_shot(timeout=60)
if shot:
print(f"Скорость мяча: {shot.ball_speed_mph:.1f} mph")
print(f"Дистанция: {shot.estimated_carry_yards:.0f} yd")
monitor.stop()
monitor.disconnect()
Текущие ограничения и слабые места
Автор честно документирует физические ограничения выбранного подхода.
Во-первых, косинусная погрешность: если мяч летит не строго по линии обзора радара, измеренная скорость будет чуть ниже реальной. Радар должен стоять строго в 1-1.5 метрах позади мяча на линии прицеливания.
Во-вторых, измерение вращения мяча (spin rate) пока остается экспериментальным. В замкнутых помещениях короткая траектория полета и паразитные переотражения сигнала дают шум, поэтому live-мультитейпер сейчас не используется в расчете дистанции. Команда проекта как раз работает над новым алгоритмом дечирпинга боковых полос Доплера (scripts/analysis/replay_spin_dechirp.py).
Кому проект будет полезен
OpenFlight — отличный пример прикладной цифровой обработки сигналов на доступном железе.
Проект понравится:
- Любителям гольфа, которые хотят симулятор для тренировок дома без переплаты за проприетарные брендовые коробки с закрытыми подписками.
- Разработчикам embedded-систем и энтузиастам DSP, желающим покопаться в реальных I/Q радиоданных, БПФ и алгоритмах подавления шумов.
- Создателям собственных спортивных симуляторов (в проекте уже есть коннекторы к GSPro и OpenGolfSim).
Кодовая база хорошо структурирована, тесты гоняются через pytest с виртуальным окружением на uv, а документация по геометрии установки и калибровке расписана до мелочей. Попробовать точно стоит.
