Python API
Программировать АНПА можно на языке Python.
Установка
Через pip
pip install naus
Из исходников
В репозитории выполните:
pip install ./python
Использование
Инициализация
Для начала необходимо инициализировать объект АНПА.
import naus
auv = naus.AUV(0)
В качестве аргумента принимается ID аппарата. Его можно узнать, нажав на АНПА в симуляторе:

Получение телеметрии
Для получения телеметрии используется метод get_telemetry. Его определение:
def get_telemetry(self) -> Telemetry:
...
Объект Telemetry представляет собой датакласс, в котором содержатся мировые координаты АНПА, его курс, крен и тангаж:
class Telemetry:
x: float
y: float
z: float
yaw: float
pitch: float
roll: float
Ось Y означает глубину аппарата и направлена вверх относительно мира. Это значит, Y отрицателен для погруженного в воду АНПА.
Пример:
telemetry = auv.get_telemetry()
print(telemetry) # Telemetry(x=1.2 y=3.4, z=5.6, yaw=7.8, pitch=9.0, roll=4.2)
Управление движителями
Для управления движителями используется метод set_motor_powers. Его определение:
def set_motor_powers(
self,
*,
left: int | None = None,
right: int | None = None,
side: int | None = None,
vertical: int | None = None,
) -> None:
...
Параметры left, right, side и vertical описывают значения тяги соответствующих движителей. Данные значения находятся в промежутке от -100 до 100 включительно.
Примеры:
# Плыть вперед с тягой 75 ед.:
auv.set_motor_powers(left=75, right=75)
# Крутиться вокруг себя с тягой 50 ед.:
auv.set_motor_powers(left=50, right=-50)
# Отключить все движители:
auv.set_motor_powers(left=0, right=0, side=50, vertical=0)
Получение изображений с камер
Для получения изображения с камер АНПА используется метод get_images, который возвращает кортеж из двух BGR матриц: фронтального и донного изображений. Его определение:
def get_images(self) -> tuple[MatLike, MatLike]:
Размер изображения постоянный и равен 320x240 пикселей. Изображения пригодны для использования в OpenCV и NumPy.
Пример:
import cv2 as cv
import numpy as np
img_front, img_bottom = auv.get_images()
stack = cv.vstack([img_front, img_bottom]) # соединяем изображения вертикально
cv2.imshow("Images", stack)
cv2.waitKey(0) # ждем нажатие любой клавиши
Подход к программированию
Самый простой подход - бесконечный цикл, в котором считываются данные, и обновляется состояние (в том числе тяга движителей):
import naus
import time
auv = naus.AUV(0)
while True:
telemetry = auv.get_telemetry()
img_front, img_bottom = auv.get_images()
# <обрабатываем телеметрию>
# <применяем компьютерное зрение>
# <обновляем состояние>
# <меняем значения тяги движителей>
time.sleep(0.01) # цикл с частотой ~100 Гц.
Для управления несколькими АНПА в одной программе, можно использовать многопоточность:
import naus
import threading
def foo() -> None:
auv = naus.AUV(0)
...
def bar() -> None:
auv = naus.AUV(1)
...
def baz() -> None:
auv = naus.AUV(2)
...
tasks = [
threading.Thread(target=foo),
threading.Thread(target=bar),
threading.Thread(target=baz),
]
for t in tasks:
t.start()
Обратитесь к документации модуля threading для более подробной информации.