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.
Короткий ответ
- ArduPilot: нужный
SERIALxдолжен выдавать MAVLink2 с той же скоростью, которую использует Pi. - UART: TX и RX соединяются перекрёстно, GND должен быть общим, на Raspberry Pi должен работать нужный serial device.
- Router: только один процесс должен читать этот UART — например MAVProxy или mavlink-router.
- UDP: режим router должен соответствовать сценарию: либо Pi отправляет поток на фиксированный IP компьютера, либо слушает порт для внешних GCS.
- Mission Planner: выбран UDP/UDPCl по фактической схеме, совпадает порт, firewall не блокирует трафик.
Если на одном шаге нет подтверждения, следующий пока не диагностируйте: ping до Raspberry Pi не доказывает наличие MAVLink на UART, а HEARTBEAT в Mission Planner ещё не доказывает, что проходят параметры и команды.

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 до проверки питания и кабеля. |
Проверка по шагам
- Питание: Pi работает стабильно и не перезапускается под нагрузкой.
- Serial: выбран правильный UART, TX/RX/GND проверены,
/dev/serial0доступен. - MAVLink: один router получает HEARTBEAT и другие сообщения непосредственно с serial.
- UDP: определено направление — push на GCS или внешний endpoint на Pi.
- Mission Planner: совпадают адрес/порт, firewall разрешает соединение.
- Полноценность: загружаются параметры, двусторонние сообщения проходят, нет постоянного роста потерь.
Что считать успешным результатом
- Raspberry Pi стабильно получает MAVLink от полётного контроллера.
- Mission Planner подключается по выбранной UDP-схеме и загружает параметры.
- В статистике соединения нет устойчивого роста ошибок и потерь.
- После перезапуска Pi/router соединение восстанавливается предсказуемо.
- Перед первым полётом отдельно проверены failsafe, режимы, питание и реакция на потерю связи.
⚠️ Ограничение. HEARTBEAT или открывшийся HUD не подтверждают безопасное дистанционное управление. Сначала проверьте двустороннюю передачу параметров/команд на снятых пропеллерах и только потом переходите к лётному тесту.
Источники
- ArduPilot: Communicating with Raspberry Pi via MAVLink — проводка, питание,
SERIAL2_*, UART, MAVProxy и mavlink-router. - ArduPilot: MAVLink Routing — правила маршрутизации MAVLink.
- Mission Planner: Connect to AutoPilot — способы подключения Mission Planner.
- mavlink-router — документация самого router.
Следующий шаг: если MAVProxy уже видит FC, а Mission Planner по-прежнему нет, не меняйте параметры ArduPilot — зафиксируйте фактический IP компьютера, выбранный UDP-режим router и порт, затем проверьте входящий трафик и firewall именно на стороне GCS. Отдельный разбор USB/COM, bootloader и телеметрии: Mission Planner не видит ArduPilot.
