Панель управления
Главный интерфейс мониторинга — телеметрия в реальном времени
Главный интерфейс системы для мониторинга квадрокоптера на рабочем столе (bench) или в режиме подключения через MAVLink/Wi-Fi.
Функции и возможности
- Индикатор положения (Авиагоризонт): Отображает углы
Roll,PitchиYaw. Приложение непрерывно опрашивает FC через пейлоадMSP_ATTITUDE. Пространственные отклонения в интерфейсе указывают на инерциальные сбои MPU6000 или аналогичного гироскопа. - Монитор батареи и потребления: Данные по амперажу и ячейкам в реальном времени получаются через
MSP_ANALOG. Служит ранним предупреждением при нестабильном напряжении PDB.
Проверка Pre-Arm
Валидация безопасности перед взлётом
Блок, определяющий, разрешит ли микроконтроллер ESC начать последовательность оборотов. Дрон не будет армирован, если хотя бы один флаг в красном состоянии.
Распространённые аппаратные блокировки (флаги)
| Флаг | Значение | Как исправить |
|---|---|---|
CLI_ACTIVE |
FC находится в режиме командной строки. | Закройте вкладку CLI, отключитесь или введите exit. |
NOPREARM |
Отсутствует валидация безопасного взлёта. | Проверьте переключатель "Pre-Arm" на вашем пульте управления. |
CALIBRATING |
Гироскопы всё ещё калибруются. | Держите аппарат плоско и неподвижно. Нажмите Calibrate ACC и повторите попытку. |
Элементы управления действиями
Кнопки Calibrate ACC (Акселерометр) и Calibrate MAG (Магнетометр) отправляют импульсы MSP_ACC_CALIBRATION. Калибровку необходимо проводить на строго горизонтальной поверхности — это значение влияет на расчёт PID Angle (стабилизированный полёт).
Тест моторов
Управление DSHOT — проверка вращений и Motor Mapping
Этот режим позволяет отправлять явные PWM-прерывания каждому мотору дрона для тестирования вращений, состояния подшипников и порядка моторов (Motor Mapping).
Техническое функционирование
Кнопка подтверждения отключает маску безопасности протокола. При перемещении ползунка любого мотора система отправляет MSP_SET_MOTOR, упакованный в 16 бит, для регулировки ускорения в наносекундах (PWM) или цифровых команд через протокол DShot.
Реверс мотора: Можно изменить направление вращения мотора без перепайки кабелей ESC — используется возможность реверса прошивки BLHeli/Bluejay.
Основная конфигурация
Обнаружение и анализ базовой прошивки контроллера полёта
Обнаруживает и отображает версию базового микроконтроллера. Показывает жизненно важные схемы используемого Target и варианта (INAV или BTFL). В зависимости от этих схем последующие окна изменятся, чтобы избежать инъекции нестабильных команд (INAV использует совершенно иную индексированную карту PID, чем Betaflight).
MSP_API_VERSION, MSP_FC_VARIANT и MSP_FC_VERSION при начальном подключении. Создание профиля прошивки происходит полностью прозрачно для пользователя.
Назначение портов (UART)
Маршрутизация периферии — STM32 F4/F7/H7
Модуль маршрутизированной конфигурации. Процессоры STM32F4/F7/H7 имеют физические порты (Передатчик/Приёмник или TX/RX).
Настраиваемая периферия
| Тип | Физический пример | Требуемый Baud Rate |
|---|---|---|
Serial RX |
Приёмник ELRS, Crossfire или SBUS | 115200 до 400000+ |
GPS / Сенсор |
GPS-модуль (Beitian, Matek) | 57600 или 115200 |
VTX / SmartAudio |
TBS Unify, Rush Tank (аналоговый) | Определяется протоколом IRC Tramp |
MSP_SET_SERIAL_CONFIG, требующий перезагрузки платы (Reboot) для применения.
Визуальный редактор OSD
Drag-and-drop для проектирования On-Screen Display FPV
Утилита drag-and-drop для проектирования компоновки интерфейса On-Screen Display, накладываемого на видеопоток FPV-камеры.
Как влиять на значения
Canvas точно симулирует стандартную аналоговую видеоматрицу MAX7456 или цифровую (Canvas Mode для Walksnail/DJI). Сетка отображается в координатах X,Y.
Добавляйте или перемещайте элементы, такие как напряжение батареи, таймер полёта или авиагоризонт. При сохранении Volkov вычисляет математические смещения и молча инъектирует их через серию терминальных команд set osd_vbat_pos = X... в CLI.
Настройка PID
Пропорциональный, интегральный и дифференциальный регуляторы — динамика полёта
Сердце динамики полёта мультироторного аппарата. Управляет реакцией пропорциональных регуляторов в коде дрона на внешние воздействия.
Что означает каждый параметр?
- P (Пропорциональный): Грубая корректирующая сила. Насколько агрессивно дрон будет стремиться к наклону, который задаёт стик. Слишком высокое значение: дрон быстро вибрирует (высокочастотные колебания).
- I (Интегральный): Математическая память. Исправляет накопленные ошибки со временем — порывы ветра, гравитационный дисбаланс. Слишком низкое: дрон дрейфует под действием инерции.
- D (Дифференциальный): Предиктивный гаситель движения. Предугадывает направление инерции и мягко тормозит, избегая отскоков при резком отпускании стика. Слишком высокое — моторы перегреются!
Настройка в реальном времени
Real-Time Tuning — изменения в полёте без записи в EEPROM
Продвинутый экспериментальный модуль. Позволяет изменять значения P-I-D в воздухе без необходимости открывать тяжёлый интерфейс и без записи в EEPROM (статическую память).
Планировщик миссий
Только INAV — автономный полёт GPS/Глонасс
Генерирует полностью автономные профили полёта, в которых мультиротор использует спутниковый приёмник GPS/Глонасс и барометрические датчики для прокладки маршрута без участия пилота.
Функциональное взаимодействие
- Создание: С помощью интерактивной спутниковой картографии (Leaflet.js + OpenStreetMap) нажмите правую кнопку мыши для вставки точных координат (Широта/Долгота). Перетаскивайте точки для изменения позиции.
- Атрибуты стратегических точек: Меню под картой позволяет выбрать действие: переход к точке (
WAYPOINT), зависание (HOLD_TIME) или возврат домой (RTH). - Экспорт координат: После завершения картирования миссии записываются в буфер EEPROM INAV. Мультиротор выполнит её по переключателю (режим AUTO-NAV).
Терминал CLI
Прямой доступ к ядру микропроцессора — командная строка
Неограниченный прямой доступ к ядру и главному терминалу микропроцессора. При открытии консоли Volkov прерывает бинарный парсер MSP, вводя последовательность # для перехода в синхронный дамп строк.
Здесь инженер/пилот может запрашивать расширенные листинги памяти командами вроде tasks (просмотр загрузки CPU), взаимодействовать через diff all или применять специфические фильтры, недоступные в графическом интерфейсе.
save для записи во FLASH. Без этого шага изменения будут потеряны при перезагрузке платы.
Установщик прошивки
Flasher с защитой Anti-Brick — протокол DFU
Критический модуль для стирания и записи полной операционной системы в микропроцессор STM по протоколу DFU (Device Firmware Upgrade).
Системная аналитическая защита (Anti-Brick)
Volkov имеет валидатор, который динамически считывает официальный Target из REST API реестра Github (например: SPEEDYBEEF405). Выпадающий список принудительно предотвращает установку неверного целевого объекта.
Просмотрщик Blackbox
Инспектор BBL-логов — криминалистический анализ полёта
Полёт дрона оставляет огромный след необработанных математических метрик (ударные G-силы, резонансы, внутренний электрический шум), обычно записываемых на карту памяти SD или встроенную FLASH 16МБ — известные как BBL-логи.
В отличие от устаревших систем, Volkov служит щитом между необработанными бинарными данными и графическим представлением, требуя выполнения нативной зависимости blackbox_decode (C++), предотвращая отображение ложных аномалий или симулированных артефактов.
Diff и резервное копирование
Диффенциальный аудит — резервирование и клонирование профилей
Система, извлекающая надёжную резервную копию через текстовый последовательный или USB-интерфейс. Инструмент запускает в фоне diff all и перехватывает различия, внесённые инженером, относительно заводских настроек производителя.
Генерирует компактные файлы, позволяющие воспроизводить целые профили или "клонировать" программную идентичность одного дрона на другой парк, не затрагивая неизменённые конфигурации.
Редактор LUA и передача
IDE с синтаксисом OpenTX/EdgeTX — передача V-FAT на пульт
Среда IDE с подсветкой синтаксиса, ориентированная на асинхронные LUA-скрипты для пультов управления (таких как Radiomaster Boxer или TX16S).
Механизм удалённой загрузки (V-FAT Upload)
После завершения сложного редактирования (например скрипт, читающий CRSF-телеметрию Crossfire на вашем экране), Volkov фрагментирует весь код на асинхронные блоки (Chunked Payload Structs) и через команду MSP_SDCARD_WRITE отправляет пакет за пакетом через интерфейс дрона на реальную SD-карту в её директорию (/SCRIPTS/TELEMETRY/).
Маркетплейс плагинов
Экосистема масштабируемых модулей — сообщество разработчиков
Экосистема масштабируемых и автоматически загружаемых модулей, размещённых на наших асинхронных серверах, значительно расширяющих возможности наземной станции управления.
- Живая структура: Плагины извлекаются по требованию централизованно с
plugins.volkov.uy, обрабатывая стабильные спецификации или метаданные локального репозитория. - Система инъекции: Кнопка Load Local Plugin... позволяет устанавливать файлы в нативном коде (Python
*.py), хранящиеся в внутренней директории ПО (src/plugins/community/), где они интегрируются в Volkov Plugin Manager.
Руководство по разработке плагинов
Официальный API для разработчиков — архитектура, сигналы и публикация
Добро пожаловать в официальную документацию для разработчиков. Система плагинов Volkov позволяет перехватывать телеметрию, управлять командами Serial/MSP и добавлять графические интерфейсы без изменения базового кода конфигуратора.
1. Архитектура и минимальная структура
Локальные плагины размещаются по пути: src/plugins/community/<имя_плагина>.py
Volkov использует архитектуру частичной горячей загрузки через PluginManager. При запуске приложение сканирует путь и инициализирует классы, определённые в файле.
class MyCustomPlugin:
def __init__(self, controller, translator):
# Manager внедряет FlightController и Translator
self._controller = controller
self._translator = translator
def get_name(self) -> str:
"""Возвращает человекочитаемое название плагина для интерфейса."""
return "My Custom Plugin"
# --- Опциональные ---
def get_ui_widget(self):
"""Возвращает QWidget из PySide6 для встраивания во вкладку."""
return None
def get_msp_handlers(self) -> dict:
"""Возвращает dict, сопоставляющий ID команды MSP с callback."""
return {}
2. Доступный API
Объект controller (FlightController): Главная точка входа для общения с дроном.
controller.is_connected() -> bool: Проверяет активное соединение.controller.send_msp_command(id, payload): Позволяет отправлять произвольные бинарные команды.controller.telemetry_updatedиconnection_changed: Qt-сигналы для подписки.
Определение визуального интерфейса (get_ui_widget)
def get_ui_widget(self):
from PySide6.QtWidgets import QWidget, QVBoxLayout, QPushButton
widget = QWidget()
layout = QVBoxLayout(widget)
btn = QPushButton("Выполнить действие!")
btn.clicked.connect(self._my_action)
layout.addWidget(btn)
return widget
Подписка на MSP-сообщения (get_msp_handlers)
def get_msp_handlers(self) -> dict:
return {
108: self._on_attitude_received # MSP_ATTITUDE
}
def _on_attitude_received(self, data: dict):
print(f"Текущий угол тангажа: {data.get('pitch')}")
3. Функциональный пример: Battery Logger
Плагин, пассивно записывающий телеметрические данные и сохраняющий их в CSV при завершении сессии.
from datetime import datetime
class BatteryLoggerPlugin:
def __init__(self, controller, translator):
self.controller = controller
self.last_voltage = 0.0
if self.controller:
self.controller.telemetry_updated.connect(self._on_telem)
self.controller.connection_changed.connect(self._on_conn)
def get_name(self) -> str:
return "CSV Battery Logger"
def _on_telem(self, data: dict):
if "voltage" in data:
self.last_voltage = data["voltage"]
def _on_conn(self, is_connected: bool):
if not is_connected and self.last_voltage > 0:
with open("battery_log.csv", "a") as f:
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
f.write(f"{now},{self.last_voltage}\n")
self.last_voltage = 0.0
4. Процесс публикации в каталоге
- Разместите плагин: Загрузите файл на Github, Gitlab или Gist. Получите URL, заканчивающийся на
.pyв сыром виде (raw). - Создайте PR в JSON-каталог: Перейдите в репозиторий
volkov-pluginsи добавьте объект вcatalog.json, указав переменнуюdownload_url.
{
"name": "My Custom Plugin",
"author": "Your Name / Github",
"version": "1.0.0",
"description": "Краткое описание того, что делает плагин.",
"tags": ["telemetry", "gps"],
"stable": true,
"license": "MIT",
"installed": false,
"download_url": "https://raw.githubusercontent.com/user/plugin/main/plugin.py"
}
serial_reader. Весь код, обновляющий UI в QObjects, должен быть отправлен через QMetaObject.invokeMethod, если он выполняется вне главного GUI-потока.