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 даёт возможность детектировать «активна/простаивает», мониторить прогресс операции, фиксировать завершение задачи и ловить ошибки. Ниже — конкретный список сообщений, какие поля смотреть, как их интерпретировать и примеры кода.
Содержание
- MAVLink ArduPilot: какие сообщения подходят для статуса полезной нагрузки
- ArduPilot telemetry: ключевые сообщения и поля (HEARTBEAT, SYS_STATUS, STATUSTEXT)
- Специализированные сообщения для полезной нагрузки (CAMERA_STATUS, CAMERA_FEEDBACK, PAYLOAD_STATUS)
- Команды и подтверждения: контроль и подтверждение действий (COMMAND_ACK, MAV_CMD_* )
- Как организовать подробный мониторинг: NAMED_VALUE_STRING, DATAxx и кастомные сообщения
- Практические примеры: запрос интервалов и обработка сообщений (pymavlink)
- Источники
- Заключение
MAVLink ArduPilot: какие сообщения подходят для статуса полезной нагрузки
Коротко: для надёжного отчёта по полезной нагрузке сочетайте
- общие системные сообщения (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):
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. Это ваш основной канал подтверждения того, что команда принята/выполнена/ошибка.
Как использовать:
- Отправили команду с
command_long_send. - Ожидаете
COMMAND_ACKот целевой системы/компонента. - Если
result==MAV_RESULT_ACCEPTED— команда принята. ЕслиMAV_RESULT_FAILED/DENIED— нужно логировать и предпринимать действия (retry/abort).
Пример (pymavlink):
# отправка 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.
Шаги для добавления кастомного сообщения:
- Определите сообщение в
ardupilotmega.xml(имена полей, типы, комментарии). - Пересоберите pymavlink/пакеты MAVLink (см. инструкцию по добавлению сообщения) — Adding a new MAVLink Message.
- Реализуйте отправку сообщения в коде 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 сообщения.
Пример установки интервала (псевдокод):
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)
Пример парсинга ключевых сообщений:
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
Источники
- Payload Protocols
- Dialect: ArduPilotMega (MAVLink messages)
- MAVLink Interface — Dev documentation (MAVLink commands)
- MAVLink Basics — Dev documentation
- How to Read Status of RC using MAVLink messages? — ArduPilot Discourse
- Adding a new MAVLink Message — ArduPilot Dev docs
Заключение
Используйте сочетание системных сообщений (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.