ArduPilot через Raspberry Pi: MAVLink

Симптом: Raspberry Pi подключена к полётному контроллеру, но Mission Planner не видит аппарат по UDP, параметры не скачиваются или поток пропадает при смене Wi-Fi. В обратной ситуации QGroundControl подключается, а Mission Planner — нет. Это не одна «настройка Raspberry Pi»: нужно разделить питание, UART, MAVLink на борту, маршрутизатор и UDP-соединение с GCS.

⚠️ До любого теста: сними пропеллеры, зафиксируй раму и не выполняй команды arm из SSH или MAVProxy. Сначала проверяй поток на столе без запуска моторов. Raspberry Pi не должна получать питание через TELEM-порт без расчёта бюджета 5 V: официальная документация предупреждает, что потребление разных конфигураций может быть от десятков миллиампер до 2,5 A.
Подключение Raspberry Pi к TELEM-порту Pixhawk
Пример соединения TELEM2 автопилота с Ground, TX и RX Raspberry Pi. Это иллюстрация из официальной документации ArduPilot; распиновку и питание нужно сверить с конкретными FC и платой расширения. Источник, лицензия CC BY-SA 3.0.

Сначала разложи цепочку по узлам

1. FCArduPilot формирует MAVLink на выбранном SERIALx.
2. UARTTX/RX/GND соединены с Raspberry Pi и совпадает скорость.
3. RouterMAVProxy или mavlink-router принимает serial и выдаёт UDP.
4. GCSMission Planner слушает тот же IP и порт, который указан в маршруте.

Если нарушен один узел, внешне симптомы похожи. Поэтому «Pi пингуется» ещё не означает, что на ней есть MAVLink: ping проверяет IP, а не байты от UART. Аналогично, запущенный MAVProxy ещё не доказывает, что Mission Planner получает поток.

Проводка и питание: типовые ошибки

Для примера из официальной схемы TELEM2 автопилота соединяется с GND, TX и RX Raspberry Pi. Передача должна идти перекрёстно: TX автопилота на RX Pi, RX автопилота на TX Pi. Нельзя ориентироваться только на одинаковые подписи на разъёмах: у разных плат маркировка и нумерация могут отличаться.

Сноска 1. В ArduPilot имя TELEM2 часто соответствует SERIAL2, но это не универсальное правило для каждой платы и прошивки. Сначала открой pinout и параметрную страницу конкретного FC, затем меняй именно тот SERIALx, который физически связан с нужным UART.

Безопасная проверка мультиметром

  1. Отключи аккумулятор и USB, сними пропеллеры.
  2. Проверь общий GND и отсутствие короткого замыкания между 5 V и GND.
  3. Уточни, откуда питается Pi: отдельный BEC, carrier board или USB. Суммируй пиковый ток Pi, камеры, модема и периферии.
  4. Не подавай одновременно несколько 5 V источников, если плата не предусматривает их OR-ing.

Параметры ArduPilot: сначала порт, потом UDP

Официальный пример для TELEM2 использует MAVLink 2 и скорость 921600:

Параметр Пример Что проверяет
SERIAL2_PROTOCOL 2 MAVLink 2 на выбранном последовательном порту.
SERIAL2_BAUD 921 921600 бод; значение на Pi и в маршрутизаторе должно совпадать.
Физический порт TELEM2 Конкретное соответствие TELEM2 ↔ SERIAL2 нужно сверить по FC.

После изменения параметров сделай перезагрузку автопилота и снова проверь поток. Если ты подключаешься к другому UART, не копируй SERIAL2_* механически: номер должен соответствовать физическому порту.

Настройка UART Raspberry Pi

На Raspberry Pi официальная инструкция предлагает включить аппаратный serial и отключить login shell на нём:

sudo raspi-config
# Interface Options → Serial Port
# login shell over serial: No
# serial port hardware: Yes
sudo reboot
ls -l /dev/serial0

Ожидаемый результат — доступный алиас /dev/serial0. Если его нет, сначала исправь UART и только потом устанавливай маршрутизатор. Подключение по Wi-Fi само по себе UART не заменяет.

Выбери один маршрут до Mission Planner

Для первичной диагностики достаточно одного процесса, который читает serial и выдаёт UDP. Не запускай одновременно MAVProxy и mavlink-router на одном UART: они будут конкурировать за устройство.

MAVProxy: короткий тест

mavproxy.py --master=/dev/serial0 --baudrate 921600 --aircraft MyCopter
# после подтверждения потока добавь выход на IP компьютера с Mission Planner
mavproxy.py --master=/dev/serial0 --baudrate 921600 --out=udp:GCS_IP:14550

GCS_IP — адрес компьютера в сети, а 14550 — пример порта. Если Mission Planner настроен на другой порт, значение должно совпадать с ним. В официальной документации ArduPilot также приведён вариант запуска MAVProxy как фонового маршрутизатора и отдельно отмечено, что на слабой Raspberry Pi при высокой нагрузке могут понадобиться альтернативы.

mavlink-router: отдельный маршрутизатор

Этот вариант удобен, когда поток должен стабильно работать как сервис. Синтаксис и имена секций сверяй с версией установленного пакета:

[UartEndpoint to_fc]
Device = /dev/serial0
Baud = 921600

[UdpEndpoint mission_planner]
Mode = Normal
Address = GCS_IP
Port = 14550

Официальная документация ArduPilot ссылается на проект mavlink-router для установки и запуска. Не воспринимай пример выше как универсальный готовый конфиг: путь к файлу, права сервиса и названия параметров зависят от пакета и дистрибутива.

Mission Planner по UDP: что должно совпасть

В верхней панели Mission Planner выбери сетевое UDP-соединение и подключись. Для списка соединений официальная документация показывает формат вроде udp://127.0.0.1:14550. При отдельной Raspberry Pi адрес должен указывать на IP Pi или на тот endpoint, который слушает компьютер, в зависимости от режима маршрутизатора.

Сноска 2. Направление UDP важно. --out=udp:GCS_IP:14550 означает, что Pi отправляет поток на компьютер. Если GCS сам слушает входящий порт, укажи этот порт в Mission Planner. Не подставляй 127.0.0.1 на компьютере, если MAVLink реально приходит с другой машины.

Если процесс на Pi запущен, но параметры не скачиваются, проверь Windows Firewall и IP-адрес компьютера. Mission Planner прямо указывает на firewall как на одну из причин проблем UDP/TCP. Если подключение есть, но команды и параметры не проходят, отдельно проверь MAVLink2 Signing: поток может быть виден, а управление — отвергаться.

Интерактив: где обрывается твоя цепочка

Диагностическое дерево / MAVLink over UDP

Проверь фактический маршрут

Отметь только то, что реально проверено на своей сборке. Дерево остановится на первом блокере и даст следующий шаг.

Есть прогресс и reset

Пропеллеры сняты, рама закреплена
Без этого интерактив не разрешает переход к проверке питания и моторов.

Заполнено: 0 из 6 проверок

Результат появится после проверкиНе подставляй желаемый результат вместо фактического.

Как отличить четыре похожих симптома

Симптом Первая проверка Не делай сразу
Pi не видит поток в serial TX/RX/GND, UART-консоль, /dev/serial0, питание. Менять UDP-порты и firewall.
MAVProxy видит FC, Mission Planner нет IP компьютера, UDP-порт, firewall Windows. Менять SERIALx наугад.
Mission Planner подключён, параметры не приходят Signing, маршрутизация, один активный router. Считать это доказательством исправного управления.
Поток обрывается через время Питание Pi, нагрузка CPU, Wi-Fi и логи сервиса. Поднимать baudrate без проверки кабеля и помех.

Критерий успешной проверки

  1. На Pi стабильно открывается /dev/serial0 и маршрутизатор получает MAVLink без ошибок.
  2. Mission Planner подключается по выбранному UDP-порту и скачивает параметры.
  3. В окне статистики нет постоянного роста ошибок и потерь.
  4. Команды проверяются только на снятых пропеллерах; первый реальный полёт выполняется в безопасном режиме и месте.
⚠️ Важно: наличие heartbeat или успешного подключения GCS не означает, что безопасно армить аппарат. До полёта отдельно проверь failsafe, режимы, геозону, питание и реакцию на потерю связи.

Источники и связанные материалы

Сноска 3. Примеры параметров и команд показывают диагностическую цепочку, а не готовую конфигурацию для любого FC. Перед изменениями сверяй версию ArduPilot, pinout платы, тип Raspberry Pi, Linux-дистрибутив и фактический IP компьютера.




Прокрутить вверх