Программирование

MAVLink ArduPilot: Сообщения для состояния полезной нагрузки

Какие MAVLink сообщения использовать в ArduPilot для мониторинга состояния полезной нагрузки: HEARTBEAT, SYS_STATUS, CAMERA_STATUS, PAYLOAD_STATUS. Примеры кода pymavlink, телеметрия ardupilot, обработка ошибок и прогресса операций.

Какие MAVLink сообщения можно использовать для отчета или мониторинга состояния полезной нагрузки в ArduPilot?

Я работаю с ArduPilot и пользовательской системой полезной нагрузки. Я могу отправлять команды полезной нагрузки (например, развертывание, освобождение, активация), но я пытаюсь понять, как получать подробные обновления о состоянии самой полезной нагрузки.

В частности, я хотел бы отслеживать, находится ли полезная нагрузка в состоянии:

  • Активна или простаивает
  • Выполняет операцию
  • Завершила задачу
  • Встретила сбой или ошибку

Я знаю, что MAVLink определяет несколько типов командных и статусных сообщений, но я не нашел четкой документации о том, какие из них ArduPilot фактически использует (или поддерживает) для телеметрии/отчета о состоянии полезной нагрузки.

mavlink ardupilot позволяет получать состояние полезной нагрузки через сочетание стандартных MAVLink‑сообщений (HEARTBEAT, SYS_STATUS, STATUSTEXT, COMMAND_ACK) и payload‑ориентированных сообщений (CAMERA_STATUS/CAMERA_FEEDBACK, NAMED_VALUE_STRING, DATA16/32/64/96 и при наличии — PAYLOAD_STATUS). Правильная комбинация этих сообщений в ardupilot telemetry даёт возможность детектировать «активна/простаивает», мониторить прогресс операции, фиксировать завершение задачи и ловить ошибки. Ниже — конкретный список сообщений, какие поля смотреть, как их интерпретировать и примеры кода.


Содержание


Коротко: для надёжного отчёта по полезной нагрузке сочетайте

  • общие системные сообщения (HEARTBEAT, SYS_STATUS, STATUSTEXT),
  • подтверждения команд (COMMAND_ACK),
  • payload‑ориентированные сообщения (CAMERA_STATUS, CAMERA_FEEDBACK) и
  • лёгкие/произвольные каналы для кастомной информации (NAMED_VALUE_STRING, DATA16/32/64/96).
    Если вам нужна более формальная структура — ArduPilot может иметь собственный PAYLOAD_STATUS (или вы можете добавить его) с полями статус/progress/error.

Почему именно так? HEARTBEAT и SYS_STATUS дают базовую видимость «жива ли система и в каком состоянии контроллер», COMMAND_ACK сообщает результат конкретной команды, а CAMERA_* / NAMED_VALUE_STRING / DATAxx дают payload‑специфичные события и данные. Подробности по командам payload и общим сообщениям — в официальной документации MAVLink и ArduPilot: см. Payload Protocols и MAVLink Basics — ArduPilot.

Примечание: у других подсистем есть свои сообщения — например, для датчиков движения и наведения встречается запросы по optical flow (optical flow ardupilot mavlink), а для моторных контроллеров — ESC telemetry (ardupilot esc telemetry). Подход к мониторингу у них тот же: искать статус/ошибки/пакеты прогресса в соответствующих сообщениях.


ArduPilot telemetry: ключевые сообщения и поля (HEARTBEAT, SYS_STATUS, STATUSTEXT)

Что смотреть первым делом

  • HEARTBEAT — основной «пульс» каждого узла. Поле system_status показывает общее состояние (standby/active/critical и т.д.). Частота HEARTBEAT даёт индикацию «онлайн/оффлайн».
  • SYS_STATUS — битмап onboard_control_sensors_health и другие поля применимы для диагностики; в некоторых случаях можно использовать флаги здоровья, чтобы понять, доступна ли периферия.
  • STATUSTEXT — текстовые сообщения с уровнями серьезности (INFO/WARNING/ERROR) — удобны для передачи человекочитаемых ошибок с полезной нагрузки.

Пример чтения (псевдокод на pymavlink):

python
from pymavlink import mavutil
m = mavutil.mavlink_connection('udp:127.0.0.1:14550')
m.wait_heartbeat()
while True:
 msg = m.recv_match(blocking=True, timeout=5)
 if not msg:
 continue
 t = msg.get_type()
 if t == 'HEARTBEAT':
 print('HEARTBEAT system_status=', msg.system_status)
 elif t == 'SYS_STATUS':
 print('SYS_STATUS health_bits=', msg.onboard_control_sensors_health)
 elif t == 'STATUSTEXT':
 print('STATUSTEXT:', msg.severity, msg.text)

Как этот набор помогает определить состояния:

  • «Активна/Простаивает» — если HEARTBEAT от компонента полезной нагрузки есть и system_status соответствует рабочему состоянию, это «активно». Если heartbeat отсутствует длительное время — считается «не в сети».
  • «Ошибка/Сбой» — STATUSTEXT с уровнем WARNING/ERROR или бит ошибки в SYS_STATUS.
  • Но учтите: HEARTBEAT и SYS_STATUS описывают контроллер/компонент в целом, а не доменно‑специфические состояния payload (для этого нужны payload‑сообщения).

Подробнее об установке частоты сообщений и потоков — в MAVLink Basics/REQUEST_DATA_STREAM и SET_MESSAGE_INTERVAL.


Специализированные сообщения для полезной нагрузки (CAMERA_STATUS, CAMERA_FEEDBACK, PAYLOAD_STATUS)

Сообщения, которые часто используются для payload:

  • CAMERA_STATUS (ArduPilot dialect) — heartbeat/события камеры: event_id (heartbeat, trigger, error, low-battery, low-storage), поля p1..p4 с контекстом. Подходит для камер и похожих устройств.
  • CAMERA_FEEDBACK — подтверждение захвата/записи, координаты кадра, флаги записи/триггера, фокус и т. п.
  • PAYLOAD_STATUS — (если реализовано в ArduPilot или добавлено вами) — типовое сообщение для payload с полями status, error_code, progress. Очень удобно для агрегирования состояния.

Практическое применение:

  • «Выполняет операцию»: CAMERA_STATUS (event_id = trigger или recording) + PAYLOAD_STATUS.progress > 0 и < 100.
  • «Завершила задачу»: PAYLOAD_STATUS.progress == 100 или CAMERA_FEEDBACK подтверждение + COMMAND_ACK с результатом ACCEPTED (если задача инициировалась командой).
  • «Сбой»: PAYLOAD_STATUS.error_code != 0 или STATUSTEXT severity = ERROR с текстом, или CAMERA_STATUS с event_id = error.

Подробные определения сообщений и полей находятся в спецификации ArduPilot/MAVLink: см. ArduPilotMega messages и примечания по payload в MAVLink Payload Protocols.

Замечание: не все сборки ArduPilot содержат одну и ту же реализацию PAYLOAD_STATUS — иногда сообщение придётся добавить самостоятельно (см. ниже).


Команды и подтверждения: контроль и подтверждение действий (COMMAND_ACK, MAV_CMD_* )

Когда вы посылаете команду полезной нагрузке (например, MAV_CMD_DO_SET_SERVO, MAV_CMD_DO_SET_ACTUATOR, MAV_CMD_NAV_PAYLOAD_PLACE), ArduPilot возвращает COMMAND_ACK с полем result. Это ваш основной канал подтверждения того, что команда принята/выполнена/ошибка.

Как использовать:

  1. Отправили команду с command_long_send.
  2. Ожидаете COMMAND_ACK от целевой системы/компонента.
  3. Если result == MAV_RESULT_ACCEPTED — команда принята. Если MAV_RESULT_FAILED/DENIED — нужно логировать и предпринимать действия (retry/abort).

Пример (pymavlink):

python
# отправка SET_SERVO
m.mav.command_long_send(target_sys, target_comp,
 mavutil.mavlink.MAV_CMD_DO_SET_SERVO, 0,
 servo_number, pwm_value, 0,0,0,0,0)
ack = m.recv_match(type='COMMAND_ACK', blocking=True, timeout=5)
if ack and ack.result == mavutil.mavlink.MAV_RESULT_ACCEPTED:
 print('Команда принята')
else:
 print('Команда не выполнена или таймаут')

Команды и их обработка подробно описаны в документации ArduPilot — см. MAVLink Interface — Dev documentation и список payload‑команд в MAVLink payload docs.

Важно: COMMAND_ACK сообщает только о приёме/результате команды; для детальной информации о прогрессе и ошибках используйте PAYLOAD_STATUS / NAMED_VALUE_STRING / STATUSTEXT.


Как организовать подробный мониторинг: NAMED_VALUE_STRING, DATAxx и кастомные сообщения

Если стандартных сообщений недостаточно, используйте лёгкие каналы:

  • NAMED_VALUE_STRING — пара (name, value) строкой. Очень удобно для передачи состояний: name="payload_state" value="working", name="progress" value="45", name="error" value="overtemp".
  • DATA16 / DATA32 / DATA64 / DATA96 — для произвольных бинарных блоков (телеметрия в компактной форме).
  • Кастомные MAVLink‑сообщения — вы можете добавить собственную структуру (например, полноценный PAYLOAD_STATUS) в ardupilotmega.xml, затем пересобрать pymavlink и добавить поддержку в код ArduPilot/companion.

Шаги для добавления кастомного сообщения:

  1. Определите сообщение в ardupilotmega.xml (имена полей, типы, комментарии).
  2. Пересоберите pymavlink/пакеты MAVLink (см. инструкцию по добавлению сообщения) — Adding a new MAVLink Message.
  3. Реализуйте отправку сообщения в коде payload/companion/autopilot и тестируйте через MAVProxy/QGroundControl.

Рекомендации по структуре сообщений:

  • Включайте status (enum или строка), progress (0–100), error_code (число) и seq/timestamp.
  • Используйте именованные строки в NAMED_VALUE_STRING для совместимости с GCS и логами.
  • Включайте местоположение (lat/lon/alt) для событий, если это релевантно.

Практические примеры: запрос интервалов и обработка сообщений (pymavlink, примеры)

Запрос потоков и установка частоты:

  • Старый метод — REQUEST_DATA_STREAM (группы сообщений).
  • Современный и более гибкий — MAV_CMD_SET_MESSAGE_INTERVAL (ArduPilot 4.0+), позволяет задать интервал для конкретного ID сообщения.

Пример установки интервала (псевдокод):

python
from pymavlink import mavutil
m = mavutil.mavlink_connection('udp:127.0.0.1:14550')
m.wait_heartbeat()
# установить интервал для PAYLOAD_STATUS в 1 секунду (1_000_000 мкс)
m.mav.command_long_send(m.target_system, m.target_component,
 mavutil.mavlink.MAV_CMD_SET_MESSAGE_INTERVAL, 0,
 mavutil.mavlink.MAVLINK_MSG_ID_PAYLOAD_STATUS,
 1000000, 0,0,0,0,0)

(если PAYLOAD_STATUS не определён в вашей сборке — используйте NAMED_VALUE_STRING или CAMERA_STATUS)

Пример парсинга ключевых сообщений:

python
while True:
 msg = m.recv_match(blocking=True, timeout=2)
 if not msg:
 # таймаут — возможно потеря HEARTBEAT/нет соединения
 continue
 t = msg.get_type()
 if t == 'PAYLOAD_STATUS':
 # msg.status, msg.progress, msg.error_code
 handle_payload_status(msg)
 elif t == 'CAMERA_STATUS':
 handle_camera_status(msg)
 elif t == 'NAMED_VALUE_STRING':
 if msg.name == 'payload_state':
 state = msg.value
 elif t == 'COMMAND_ACK':
 # msg.command, msg.result
 check_ack(msg)
 elif t == 'STATUSTEXT':
 log_text(msg.severity, msg.text)

Проверки и отказоустойчивость:

  • Не полагайтесь на один канал. Команда + COMMAND_ACK + PAYLOAD_STATUS(progress) + STATUSTEXT дают надёжную картину.
  • Реализуйте таймауты: если после отправки команды нет ACK/статуса в N секунд — переслать/отдать на ручной контроль.
  • У payload‑модуля должен быть уникальный component id и собственный HEARTBEAT — так вы отделите его от автопилота.

Отладка: используйте MAVProxy/QGroundControl для live‑мониторинга сообщений; в ArduPilot часто видно CAMERA_STATUS и STATUSTEXT прямо в GCS. Для разработки и тестирования полезно смотреть определения сообщений в ardupilotmega messages и примеры команд в ArduPilot MAVLink commands.

Типичный сценарий распознавания состояний (сводка):

  • Активна/простаивает: HEARTBEAT от payload компонент (+ NAMED_VALUE_STRING state=idle/active)
  • Выполняет операцию: PAYLOAD_STATUS.progress в (1…99), CAMERA_STATUS event_id=trigger/recording
  • Завершила задачу: progress==100 или CAMERA_FEEDBACK/COMMAND_ACK (успех)
  • Сбой/ошибка: PAYLOAD_STATUS.error_code != 0 или STATUSTEXT severity ERROR

Источники


Заключение

Используйте сочетание системных сообщений (HEARTBEAT, SYS_STATUS, STATUSTEXT), подтверждений команд (COMMAND_ACK) и payload‑ориентированных сообщений (CAMERA_STATUS/CAMERA_FEEDBACK, NAMED_VALUE_STRING, DATAxx и/или PAYLOAD_STATUS) — так вы получите надёжный отчёт о состоянии полезной нагрузки. Для расширенных требований добавляйте кастомные сообщения через ardupilotmega.xml и пересобирайте pymavlink; документация по этим шагам и по общим MAVLink/ArduPilot‑командам доступна в приведённых источниках. В итоге, комбинация mavlink ardupilot и ardupilot telemetry даёт гибкую и масштабируемую платформу для мониторинга любых пользовательских payload.

Авторы
Проверено модерацией
Модерация
MAVLink ArduPilot: Сообщения для состояния полезной нагрузки