Исследование бортовой системы

Отчёт об исследовании вычислительного модуля Пионер Мини 2 (pioneermini@10.42.0.1), выполненном в режиме «только чтение» по SSH. Описаны аппаратная платформа, камеры и сенсоры, сеть, службы systemd, карта портов, полётная архитектура, gRPC API, видео, нейроускоритель и ключевые пути файловой системы.

Данные получены в SSH-сессии к бортовому компьютеру; файлы, службы, сетевые настройки и полётное ПО на борту не изменялись. Это снимок одной прошивки (PioneerOS 0.9.0, ядро сборки 20.02.2026): часть значений (температуры, загрузка, счётчики трафика, время работы) меняется от запуска к запуску и приведена как ориентир.

1. Общая идентификация

ПараметрЗначение
Hostname / модельpioneermini / PioneerMini 2
Device Treemodel PioneerMini 2, compatible geoscan,pioneermini2 + rockchip,rk3576
ОСPioneerOS (Ubuntu 24.04.4 LTS, noble)
Версия образа/etc/armbian-release: BOARD pioneer-mini2, VERSION/REVISION 0.9.0, commit d0a28f33d, ARCH arm64
Ядро6.1.99-geoscan-sdk-rk3576 (aarch64), сборка #1 SMP Fri Feb 20 13:37:44 UTC 2026
machine-id47a9b5dca98d49008d1850e9c7da0a4d
ЗагрузчикU-Boot (linux-u-boot-pioneer-mini2-geoscan-sdk 0.9.0), DTB rockchip/rk3576-pioneermini2.dtb
ВремяUTC; служба chrony запущена, но без источников синхронизации, системные часы не синхронизированы, RTC 2021-01-01

2. Аппаратная платформа (Rockchip RK3576)

КомпонентЗначение
CPU8 ядер: 4×Cortex-A72 (CPU part 0xd08) + 4×Cortex-A53 (0xd03), nproc = 8
RAM / Swap3.8 ГиБ (MemTotal 3995012 кБ) / zram0 1.9 ГиБ
ПЗУeMMC 28.9 ГБ (mmcblk0), корень на mmcblk0p1 ext4 (занято 5.0 ГБ, 19%)
GPU / NPUMali-G52 (libmali-bifrost-g52) / RKNPU (librknnrt)
  • zram: zram0 — swap 1.9 ГиБ; zram1 (50 МБ) смонтирован на /var/log (armbian-zram-config) для снижения износа eMMC.
  • Термозоны (/sys/class/thermal): soc-thermal, bigcore-thermal, little-core-thermal, ddr-thermal, npu-thermal, gpu-thermal. В снимке ~57–61 °C; порог перегрева для флага gRPC — 80 °C.
  • Периферия: gpiochip0…5; I²C-шины i2c-0,1,2,3,6; UART ttyS3, ttyS5; дальномер /dev/vi5300; видеоконвейер video0…48 + video-dec0 / video-enc0.
  • CAN0: контроллер rk3576_canfd, битрейт ≈1 Мбит/с (996644), состояние ERROR-ACTIVE, активный обмен.
  • USB: два OTG-контроллера, сконфигурированы как два RNDIS-гаджета (usb0 и usb1) скриптом setup_twousbotg.sh.
  • Сервопривод: pwm-setup.service + pwm-servo.service, управление через Unix-сокет /tmp/servo.sock; аппаратный PWM через sysfs (файла /dev/pwmchip* в снимке нет).

3. Камеры и сенсоры

УстройствоМодельПодключение / роль
Основная камераOV13B10 13 Мпиксi2c-2; RKISP/RKCIF → rkvpss; программируемый поток 1080×720@30, запись до 4K
Оптический потокOV9281 (глобальный затвор)i2c-0; 1280×800@60
Дальномер ToFVI5300i2c-0, ioctl через /dev/vi5300
Полётные сенсорыIMU / магнитометр / баро / GPS / RCчерез полётный контроллер по PlazLink (не через Linux)

Отображение видеоконвейера (имена из /sys/class/video4linux): video41 = rkvpss_scale0 (record_device основной камеры), video42 = scale1, video44 = scale3 (программируемый поток основной камеры, crop 1080×720), video46 = scale1 (запись/поток оптической камеры), video47 = scale2 (оптическая камера, 1280×800), video48 = scale3.

4. Сеть

ИнтерфейсРежимАдресПримечание
wlan0AP (hotspot)10.42.0.1/24точка доступа, 5 ГГц ch36 (5180 МГц), SSID PMINI2-…, MAC 88:00:33:77:ad:e1
usb0RNDIS10.42.1.1/24USB-шлюз (MAC 42:6c:84:78:26:78) — по нему подключается ПК
usb1RNDIS—сконфигурирован, DOWN
can0CAN-FD—1 Мбит/с, полётная шина

Важно про адреса: по Wi-Fi коптер доступен как 10.42.0.1 (wlan0), по USB-кабелю — как 10.42.1.1 (usb0). Портал Pioneer Code и SSH слушают на всех интерфейсах, поэтому работают по любому из адресов.

  • Netplan → NetworkManager; соединения: hotspot (wlan0), netplan-usb0, netplan-usb1, client-usb0.
  • Конфиг /boot/firmware/netconfig: HOTSPOT=yes, HOTSPOT_BAND=5, клиентский Wi-Fi WIFI_SSID=ubnt. SSID точки доступа формируется автоматически как PMINI2-<случайный суффикс>.
  • SSH: порт 22, PermitRootLogin yes, PasswordAuthentication yes.
  • DNS/DHCP на USB- и Wi-Fi-интерфейсах раздаёт dnsmasq (порты 53/67).

5. Службы systemd

Отказов служб в снимке нет. Запущенные сервисы:

plazlink-core         → PlazLink-мост (ttyS3, 115200)
grpc-server           → управление БПЛА (gRPC :50051)
media-server          → mediamtx (RTSP/WebRTC/SRT/RTP)
motion-opt            → обработка оптического потока
pwm-servo + pwm-setup → привод сервопривода
pm2-power-manager     → защита серво по току/GPIO
servo-rc-trigger      → серво по RC-каналу
setup-can             → инициализация can0 (1 Мбит/с)
usb-gadget            → два RNDIS-гаджета
manage-connection     → hotspot / клиент Wi-Fi
model-registry        → реестр ИИ-моделей (:7777)
pioneer-bricks        → блочное программирование (:2020)
pioneer-code-web-menu → веб-меню Pioneer Code (:9090)
pm2-ctrl-server       → системный контроль (:17222)
pm2-test-server       → онборд-тесты (:4000)
dufs-recordings       → файловый сервер (:5000)
rkaiq_3A              → 3A-обработка камер
code-server@…         → VS Code в браузере (:9999)

Помимо них работают системные: chrony, cron, dbus, NetworkManager, wpa_supplicant, rpcbind, rsyslog, vnstat, unattended-upgrades, rng-tools, user@1000 и сессии getty.

6. Карта портов и сервисов

ПортПроцессНазначение
22sshdSSH
20556plazlink-server-rsмост PlazLink ↔ TCP (Pioneer SDK по TCP)
50051python3 grpc-servergRPC ControlService
8554mediamtxRTSP
8889mediamtxWebRTC (HTTP)
8000/8001/8189/8890mediamtxRTP / SRT / UDP
9997mediamtxREST API стримера
2020pioneer-bricksWeb-UI блочного программирования
9090web_menu.pyWeb-меню Pioneer Code
7777model_registry.pyреестр ИИ-моделей
4000pm2-test-serverонборд-тесты (actix/WS)
17222pm2-ctrl-serverсистемный контроль (axum)
5000dufsфайлы /mnt/media
9999code-serverVS Code в браузере
53/67dnsmasqDNS/DHCP интерфейсов
111rpcbindRPC (NFS-клиент)

7. Полётная архитектура (ядро системы)

  • Полётный контроллер подключён по UART /dev/ttyS3, 115200 8N1. Протокол — PlazLink (Rust-сервер plazlink-server-rs 0.2.1, порт 20556).
  • Pioneer SDK 2 0.15.1 — основной API: Pioneer, Camera, ImageViewer, ServoCamera, RecorderControl. Ядро протокола — Cython-модуль proto (Component/Field/FieldSet). Основной файл — piosdk2.py.
  • Компоненты телеметрии: Battery (charge/voltage/temperature), SensorMonitor (voltage, flags), UavMonitor.mode, SmartBoard.rcChan/rcServo, Allystar (GNSS), LpsMonitor / USNav_module (локальная навигация).
  • board_config.json (см. §8): board_type 23, серво −80…+30°, ranger/grab = true, cargo/flashlight = false.
  • SDK: arm / disarm / takeoff / land, go_to_local_point / go_to_local_point_body_fixed / go_to_global_point, скорость и рыскание, каналы RC, события (POINT_REACHED, LOW_VOLTAGE, ENGINES_STARTED), IMU/GPS/высота/дальномеры, LED, параметры автопилота.

8. gRPC API (ControlService)

Файл /opt/grpc-server/mproto/v2/pm2.proto, пакет mproto.v2, служба ControlService на порту 50051. Сервер (/opt/grpc-server/main.py) поднимает Pioneer из pioneer_sdk2 через --plazlink-host 127.0.0.1.

RPCСообщения / назначение
GetTelemetryОтвет: battery_voltage, battery_info (%), battery_temp, speed, height_opt (ToF), state
GetStatusautopilot (флаги SensorMonitor) + linux: 0x1 — перегрев, 0x2 — неисправность серво, биты 0xC — свободное место (00 норма, 01 <25%, 10 <5%, 11 <0.5%)
StreamControlsСтрим RC: aileron, elevator, throttle, rudder ∈ [−1…1] / [0…1], mode; 100 Гц, таймаут 5 с
FlyCommandoneof: arm / disarm / land / takeoff
VideoCommandoneof: start/stop стрима, start/stop записи, фото; разрешение enum Resolution = FOURK / TWOK / FULLHD
ServoCommandangle (sint32, комментарий в proto: [−90…30]) + Priority (UNSPECIFIED / MAX / DEFAULT / MIN); фактически через Unix-сокет /tmp/servo.sock

Перечисления: FlightState = NULL, ARMED, TAKEOFF_COMPLETED, POINT_REACHED, LANDED, DISARMED. Режимы RC (RC_MODES в main.py): STABILIZE, ALTHOLD, LOITER, HEADLESS, PROGRAMM.

Лог /tmp/jump_log: Pioneer connected to 127.0.0.1:20556 (persistent connection), SensorMux_rc set to 0: True, ControlService listening on [::]:50051.

9. Конфигурация борта (board_config.json)

ПараметрЗначение
board_type / board_name23 / «Pioneer Mini 2»; gtlp_version 2
Основная камераdriver gstreamer; программируемый поток 1080×720@30; записываемые: 3840×2160, 2560×1440, 1920×1080, 1280×720 (все @30); record_device 41
Оптическая камера1280×800@60, program + recordable, record_device 46
Сервоприводmin −80, max 30 (градусы)
Датчикиbattery (SensorMonitor.voltage, Battery.temperature), rc (SmartBoard.rcChan), gnss Allystar, lps LpsMonitor + USNav_module
Полезная нагрузкаranger true, grab true, cargo false, flashlight false, recorder true

10. Видео и запись

  • GStreamer 1.24.2 + патчи Geoscan, MPP-энкодер mpph264enc, RGA.
  • mediamtx поднимает по требованию: maincamera → /dev/video44 (crop 1080×720@30), optcamera → /dev/video47 (1280×800@30).
  • pm2-jmp-camera-control публикует потоки __jmp_stream (video42, 1920×1088) и __jmp_opt (video46, 1280×800). WebRTC: http://10.42.0.1:8889/MAIN/, /OPT/; RTSP: rtsp://10.42.0.1:8554/<путь>.
  • mediamtx REST API — порт 9997 (в mediamtx.yml authMethod: internal, пользователь any может publish/read).
  • motion-opt запускает mvopt.sh — тракт обработки оптического потока для навигации.
  • Записи/фото: /mnt/media/{videos,photos} (права 777), раздача через dufs (5000). В снимке файлов нет.

11. ИИ / NPU

  • pioneer-rknn 1.6.3, rknn-toolkit-lite2 2.3.0, librknnrt 2.3.0.
  • model-registry 1.3.4 (:7777): архитектуры yolov8, yolov8-pose, PP-OCRv5_mobile_det, PP-OCRv5_mobile_rec.
  • Веса в /usr/local/bin/model-registry/models (list.json): yolov8n.rknn (yolov8), yolov8n_pose.rknn (yolov8-pose), eslav_PP-OCRv5_mobile_rec_h48w960.rknn, PP-OCRv5_mobile_det_hw640.rknn.
  • В составе Python есть numpy 1.26.4, pillow 10.2.0, OpenCV 4.10.0 (пакет opencv), psutil, ruamel.yaml.

12. Инструменты разработки и пользователи

  • code-server 4.105.1 (:9999), рабочая папка /home/pioneermini/workspace: клон репозитория pioneer-sdk2-example и data.yml (калибровка камеры).
  • pioneer-bricks 2.1.1 (:2020) и pioneer-code-web-menu 2.2.1 (:9090) — визуальное/блочное программирование.
  • Пользователь pioneermini (uid 1000) в группах sudo, tty, disk, dialout, audio, video, plugdev, users, netdev, input, systemd-journal; sudo требует пароль. Root-SSH разрешён, authorized_keys пуст.

Безопасность по умолчанию: парольная аутентификация + root-логин по SSH, отсутствие firewall, открытые без авторизации dufs / mediamtx / веб-UI (2020, 9090, 7777) на USB- и Wi-Fi-интерфейсах. Это удобно для учебного класса, но требует доверенной сети.

13. Файловая система и обновления

  • / — ext4 на eMMC; /tmp — tmpfs; /var/log — zram (сбрасывается при перезагрузке); /dev/shm — tmpfs 2 ГБ.
  • Пакеты Geoscan: aic8800-* (Wi-Fi/BT), camera-engine-rkaiq-rk3576, iqfiles-mini2, gstpm2-image-processing, linux-*-geoscan-sdk-rk3576 0.9.0, motion-opt 1.7.5, plazlink-server-rs + plazlink-flasher, pm2-*, pioneer-bricks, pioneer-code-codeoss-mini2, pioneer-code-web-menu, pioneer-rknn, model-registry, dufs + dufs-geoscan-assets-mini2, pionet 0.2.1.
  • Обновления: unattended-upgrades активен; присутствует cloud-init.
  • Конфиги: /boot/firmware/netconfig, /etc/NetworkManager/system-connections/, /opt/configs/code/*.json, /usr/local/etc/mediamtx.yml.
  • Каталог /opt: configs/, grpc-server/, scripts/, tests/. Скрипты борта: can.sh, pwm-setup.sh, setup_twousbotg.sh, setup-hotspot.sh, manage-network.sh, internet-usb-client.sh, mvopt.sh, servo_example.py, servo_rc_trigger.py, test_nn.py, root-only get_uid и range_calibration. Тесты камер: /opt/tests/cam/{maincam,optcam,lasercam,servocam,eepromcam,util}.py.

14. Наблюдения и потенциальные риски

Часы: chrony запущен без источников, системное время и RTC не синхронизированы — это влияет на метки файлов, логов и на TLS-соединения.

Слабая защита: root-SSH, парольная аутентификация, нет firewall, открытые без аутентификации dufs/mediamtx/веб-UI на USB- и Wi-Fi-интерфейсах.

Wi-Fi hotspot виден всем; пароль по умолчанию — geoscan123 (если не переопределён). Пароль sudo совпадает с Wi-Fi-паролем прошивки — единая точка компрометации.

Нагрузка в основном от GStreamer-пайплайнов (H.264 двух камер), rkaiq_3A_server и python-сервисов.

/var/log живёт в zram и не сохраняется между перезагрузками — для длительного анализа используйте journalctl или rsyslog в реальном времени.

15. Сводка ключевых путей

РазделПути
SDK/usr/local/lib/python3.12/dist-packages/pioneer_sdk2/ (piosdk2.py, board_config.json, modules/) · /usr/lib/python3/dist-packages/proto*.so
gRPC / proto/opt/grpc-server/ (main.py, mproto/v2/pm2.proto, handlers/, servo/, thermal/)
Скрипты борта/opt/scripts/ (can.sh, pwm-setup.sh, setup_twousbotg.sh, manage-network.sh, test_nn.py…)
Сервисы/etc/systemd/system/*.service, /usr/lib/systemd/system/{grpc-server,pwm-servo,pm2-*}.service
Модели ИИ/usr/local/bin/model-registry/models/
Медиа / сокеты/mnt/media/{photos,videos}; /tmp/{maincamera,optcamera,servo.sock}, /tmp/jump_log
Рабочая папка/home/pioneermini/workspace/ (pioneer-sdk2-example, data.yml)
Логиjournalctl, /var/log/syslog, /var/log/auth.log, /var/log/kern.log (в zram)