ArduPilot через Raspberry Pi: MAVLink по UDP до Mission Planner

Если Raspberry Pi видит полётный контроллер, а Mission Planner не подключается по UDP, проверяйте не «всю сеть» сразу, а одну цепочку: FC → UART → Raspberry Pi → MAVLink router → UDP → Mission Planner. Ниже — порядок, который позволяет найти первый реально сломанный узел и не менять параметры ArduPilot наугад.

⚠️ Безопасность. Снимите пропеллеры и зафиксируйте аппарат. Для проверки MAVLink не требуется армить моторы. Raspberry Pi также не стоит питать от TELEM-порта без расчёта 5 V: ArduPilot отдельно предупреждает, что потребление разных конфигураций Pi и периферии может приближаться к 2,5 A.

Короткий ответ

  1. ArduPilot: нужный SERIALx должен выдавать MAVLink2 с той же скоростью, которую использует Pi.
  2. UART: TX и RX соединяются перекрёстно, GND должен быть общим, на Raspberry Pi должен работать нужный serial device.
  3. Router: только один процесс должен читать этот UART — например MAVProxy или mavlink-router.
  4. UDP: режим router должен соответствовать сценарию: либо Pi отправляет поток на фиксированный IP компьютера, либо слушает порт для внешних GCS.
  5. Mission Planner: выбран UDP/UDPCl по фактической схеме, совпадает порт, firewall не блокирует трафик.

Если на одном шаге нет подтверждения, следующий пока не диагностируйте: ping до Raspberry Pi не доказывает наличие MAVLink на UART, а HEARTBEAT в Mission Planner ещё не доказывает, что проходят параметры и команды.

Подключение Raspberry Pi к TELEM-порту Pixhawk для MAVLink
Пример соединения TELEM2 автопилота с Ground, TX и RX Raspberry Pi из документации ArduPilot. Распиновку и допустимое питание сверяйте с конкретной платой. Источник.

1. Сначала проверьте проводку и питание

В примере ArduPilot TELEM2 соединяется с Ground, TX и RX Raspberry Pi. Передача идёт перекрёстно: TX автопилота → RX Pi, RX автопилота → TX Pi. Название TELEM2 не гарантирует, что на любой плате это именно SERIAL2: соответствие физического порта и SERIALx нужно брать из pinout конкретного FC.

  • Отключите аккумулятор и USB перед проверкой проводки.
  • Проверьте общий GND и отсутствие короткого замыкания между 5 V и GND.
  • Уточните источник питания Pi: отдельный BEC, carrier board или USB.
  • Не соединяйте несколько источников 5 V, если конкретная плата не предусматривает такое подключение.

2. Проверьте SERIALx на ArduPilot

Актуальный пример ArduPilot для TELEM2 использует MAVLink2 и 921600 бод:

Параметр Пример Что означает
SERIAL2_PROTOCOL 2 MAVLink2 на выбранном последовательном порту.
SERIAL2_BAUD 921 921600 бод. Та же скорость должна быть задана на стороне Pi/router.
Физический порт TELEM2 Это пример. На другой плате номер SERIALx может отличаться.

После изменения параметров перезагрузите автопилот. Если Raspberry Pi подключена к другому UART, не копируйте SERIAL2_* механически — сначала определите номер реального serial-порта.

3. Включите UART Raspberry Pi

В документации ArduPilot используется аппаратный serial Raspberry Pi с отключённой 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 до настройки UDP. Wi-Fi и Ethernet не заменяют serial-связь между Pi и полётным контроллером.

4. Подтвердите MAVLink на Pi через MAVProxy

Для первого теста удобно запустить один процесс напрямую на serial:

mavproxy.py --master=/dev/serial0 --baudrate 921600 --aircraft MyCopter

На этом этапе цель — увидеть устойчивый MAVLink-поток от FC. Не запускайте одновременно MAVProxy и mavlink-router на одном /dev/serial0: два процесса будут конкурировать за одно устройство.

После подтверждения serial-потока MAVProxy можно использовать как router, который отправляет телеметрию на компьютер с Mission Planner:

mavproxy.py --master=/dev/serial0 --baudrate 921600 --out=udp:GCS_IP:14550

GCS_IP — фактический IP компьютера с Mission Planner. Порт 14550 — распространённый пример; router и GCS должны использовать совместимую схему и один порт.

5. Если нужен mavlink-router — выберите правильную UDP-модель

mavlink-router удобен как отдельный системный сервис. UART-часть актуального примера ArduPilot выглядит так:

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

Дальше есть два разных сценария, и их нельзя смешивать.

Pi отправляет поток на конкретный компьютер

Для фиксированного GCS у mavlink-router используется обычный UDP endpoint с адресом компьютера:

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

Такой вариант удобен, когда IP компьютера стабилен и Pi должна сама отправлять телеметрию на него.

GCS подключается к UDP-порту Raspberry Pi

В текущей документации ArduPilot для доступа внешних ground station на той же сети показан endpoint:

[UdpEndpoint to_14550_external]
Mode = eavesdropping
Address = 0.0.0.0
Port = 14550
PortLock = 0

Это другая модель: Pi слушает внешний UDP endpoint. Синтаксис и допустимые режимы всегда сверяйте с версией установленного mavlink-router.

6. Настройте Mission Planner под фактическое направление UDP

Если Pi отправляет поток на IP компьютера, Mission Planner должен принимать входящий UDP на соответствующем порту, а Windows Firewall — разрешать этот трафик. Если используется схема, где Mission Planner сам инициирует соединение с Raspberry Pi, выбирайте сетевой режим, соответствующий IP Pi и порту endpoint.

Не используйте 127.0.0.1 для другой машины. Loopback указывает только на текущий компьютер. Для Raspberry Pi и отдельного Windows-PC нужны реальные адреса интерфейсов в общей сети.

Диагностика по первому сломанному звену

Симптом Проверьте первым Не делайте сразу
Pi не получает MAVLink с FC TX/RX/GND, pinout, SERIALx_PROTOCOL, baudrate, /dev/serial0, питание. Не меняйте UDP и firewall.
MAVProxy видит FC, Mission Planner — нет IP компьютера, направление UDP, порт 14550/выбранный порт, Windows Firewall. Не меняйте SERIALx наугад.
Mission Planner видит HEARTBEAT, но параметры не загружаются Маршрутизацию в обе стороны, MAVLink2 Signing, дублирующий router, packet loss. Не считайте один HEARTBEAT доказательством полноценного соединения.
Поток пропадает через время Питание Pi, CPU load, Wi-Fi, логи systemd/router, ошибки UART. Не повышайте baudrate до проверки питания и кабеля.

Проверка по шагам

  1. Питание: Pi работает стабильно и не перезапускается под нагрузкой.
  2. Serial: выбран правильный UART, TX/RX/GND проверены, /dev/serial0 доступен.
  3. MAVLink: один router получает HEARTBEAT и другие сообщения непосредственно с serial.
  4. UDP: определено направление — push на GCS или внешний endpoint на Pi.
  5. Mission Planner: совпадают адрес/порт, firewall разрешает соединение.
  6. Полноценность: загружаются параметры, двусторонние сообщения проходят, нет постоянного роста потерь.

Что считать успешным результатом

  • Raspberry Pi стабильно получает MAVLink от полётного контроллера.
  • Mission Planner подключается по выбранной UDP-схеме и загружает параметры.
  • В статистике соединения нет устойчивого роста ошибок и потерь.
  • После перезапуска Pi/router соединение восстанавливается предсказуемо.
  • Перед первым полётом отдельно проверены failsafe, режимы, питание и реакция на потерю связи.

⚠️ Ограничение. HEARTBEAT или открывшийся HUD не подтверждают безопасное дистанционное управление. Сначала проверьте двустороннюю передачу параметров/команд на снятых пропеллерах и только потом переходите к лётному тесту.

Источники

Следующий шаг: если MAVProxy уже видит FC, а Mission Planner по-прежнему нет, не меняйте параметры ArduPilot — зафиксируйте фактический IP компьютера, выбранный UDP-режим router и порт, затем проверьте входящий трафик и firewall именно на стороне GCS. Отдельный разбор USB/COM, bootloader и телеметрии: Mission Planner не видит ArduPilot.

Прокрутить вверх
На связи