Перейти к содержимому

Урок 34 из 43 · Модуль 4. Lua-скрипты и компаньон-компьютер

Mission Planner для технического персонала · Урок 34 из 43 · Модуль 4. Эксплуатация и диагностика

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

Скрипт с ошибкой, управляющий аппаратом в GUIDED, — это летающий баг. Тестирование в SITL и возможность перехвата с пульта обязательны.

Содержание

1. Цели урока

После этого урока вы будете понимать:

  • как включить и загрузить Lua-скрипты на автопилот
  • какие задачи разумно решать скриптом
  • как настроить порт для компаньон-компьютера
  • базовый пример управления через pymavlink
↑ К оглавлению

2. Lua-скрипты на борту

Начиная с ArduPilot 4.0, автопилот умеет выполнять пользовательские скрипты на Lua. Это способ добавить свою логику без пересборки прошивки.

Включение

SCR_ENABLE = 1
SCR_HEAP_SIZE = 100000    (или больше для сложных скриптов)
Text

После перезагрузки автопилот будет искать скрипты в папке APM/scripts/ на SD-карте.

Что можно делать

  • реагировать на события телеметрии и менять параметры на лету;
  • реализовывать нестандартные последовательности взлёта и посадки;
  • добавлять драйверы для нового оборудования (гиростабилизаторы, EFI, генераторы);
  • вести собственные проверки перед армированием;
  • управлять полезной нагрузкой по сложным условиям;
  • отправлять свои сообщения в наземную станцию.

Пример: скрипт, который отправляет предупреждение при превышении заданной вибрации.

local THRESHOLD = 25.0
function update()
local vibe = ins:get_vibration(0)
if vibe and vibe:length() > THRESHOLD then
gcs:send_text(3, string.format(
"Высокая вибрация: %.1f м/с2", vibe:length()))
end
return update, 1000   -- повтор через 1000 мс
end
return update, 1000
Text

Загрузка скриптов через Mission Planner: CONFIG → MAVFtp позволяет копировать файлы на SD-карту без её извлечения.

Скрипты выполняются в реальном времени: Скрипт с бесконечным циклом или тяжёлыми вычислениями отбирает процессорное время у контуров управления. ArduPilot ограничивает время выполнения, но всё равно: проверяйте скрипты в SITL, следите за PM.Load и не превышайте разумной сложности.

Готовые примеры

В репозитории ArduPilot (libraries/AP_Scripting/applets/ и examples/) есть десятки готовых скриптов: расчёт остатка заряда, драйверы подвесов, автоматическое переключение батарей, режимы следования и многое другое.

↑ К оглавлению

3. Компаньон-компьютер

Одноплатный компьютер (Raspberry Pi, Jetson, Odroid) на борту, соединённый с автопилотом по последовательному порту или Ethernet.

Настройка порта

SERIAL2_PROTOCOL = 2      (MAVLink2)
SERIAL2_BAUD = 921        (921600 бод)
SERIAL2_OPTIONS = 0
BRD_SER2_RTSCTS = 0
Text

Стек ПО на компаньоне

Слой Варианты
Библиотека MAVLink pymavlink, MAVSDK, DroneKit (устарел)
Маршрутизация mavlink-routerd, MAVProxy
Высокоуровневый API MAVSDK-Python, ROS 2 + mavros
Видео GStreamer, RTSP-сервер

Простейший пример управления через pymavlink:

from pymavlink import mavutil
import time
mav = mavutil.mavlink_connection('/dev/ttyAMA0', baud=921600)
mav.wait_heartbeat()
print(f"Соединение с системой {mav.target_system}")
# Перевод в GUIDED
mav.set_mode_apm('GUIDED')
# Армирование
mav.arducopter_arm()
mav.motors_armed_wait()
# Взлёт на 10 м
mav.mav.command_long_send(
mav.target_system, mav.target_component,
mavutil.mavlink.MAV_CMD_NAV_TAKEOFF,
0, 0, 0, 0, 0, 0, 0, 10)
time.sleep(15)
# Полёт в точку (широта, долгота в 1e7, высота в мм)
mav.mav.set_position_target_global_int_send(
0, mav.target_system, mav.target_component,
mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT_INT,
0b0000111111111000,
int(52.5185 * 1e7), int(5.4714 * 1e7), 30,
0, 0, 0, 0, 0, 0, 0, 0)
Python
Компаньон-компьютер и безопасность: Скрипт с ошибкой, управляющий аппаратом в GUIDED, — это летающий баг. Обязательные меры: тестирование в SITL, watchdog на стороне автопилота (FS_GCS_ENABLE), возможность мгновенного перехвата управления с пульта, геозона как последний рубеж.
↑ К оглавлению

4. Чек-лист самопроверки

Урок освоен, если каждый пункт выполнен на практике:

  • Понимаю границу между задачами Lua и компаньона
  • Знаю, как контролировать нагрузку через PM.Load
  • Настроен GCS-failsafe при работе через GUIDED
Результат: все пункты выполнены — переходите к следующему уроку.
↑ К оглавлению

5. Что дальше

  • Предыдущий урок: 33. SITL из командной строки и отработка сценариев
  • Следующий урок: 35. Подвесы, обход препятствий, точная посадка и группы
  • Полный перечень тем — в статье «Содержание курса».
↑ К оглавлению
  • Четверг, 30 июля 2026