Перейти к содержанию

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 для более подробной информации.