Спецификация сетевого интерфейса
Для создания собственного API, необходимо реализовать клиент для сетевого интерфейса симулятора. В основе интерфейса лежит ZeroMQ - библиотека для обмена сообщениями.
Конвенции
При описании бинарного формата предполагается, что все числа в сообщении имеют порядок байтов "от младшего к старшему" (little-endian), если не указано иное.
Изображения
Канал для получения изображений имеет тип PUB/SUB. TCP-сокет, порт :5555. Каждое сообщение является multipart и состоит из трех частей:
| Значение | Тип |
|---|---|
| ID АНПА | uint8 |
| Передняя камера в формате JPEG | uint8[] |
| Донная камера в формате JPEG | uint8[] |
Пример клиента на Python
import cv2 as cv
import numpy as np
import zmq
AUV_ID = 0
ctx = zmq.Context()
socket = ctx.socket(zmq.SUB)
socket.connect("tcp://localhost:5555")
socket.subscribe(bytes([AUV_ID])) # фильтруем по АНПА с ID=0
_auv_id, msg_front, msg_bottom = socket.recv_multipart(0)
data_front = np.frombuffer(msg_front, np.uint8)
data_bottom = np.frombuffer(msg_bottom, np.uint8)
img_front = cv.imdecode(data_front, cv.IMREAD_COLOR)
img_bottom = cv.imdecode(data_bottom, cv.IMREAD_COLOR)
Движители
Канал для установки значения тяги движителей имеет тип PUSH/PULL. TCP-сокет, порт :5556. Отправляемое сообщение имеет следующую кодировку:
| Значение | Тип |
|---|---|
| Тяга левого движителя | int8 |
| Тяга правого движителя | int8 |
| Тяга бокового движителя | int8 |
| Тяга вертикального движителя | int8 |
Каждое значение должно быть в диапазоне от -100 до 100 включительно, либо -127 для пропуска значения параметра.
Пример клиента на Python
import struct
import zmq
AUV_ID = 0
LEFT = 75
RIGHT = -50
SIDE = 0
VERTICAL = -127
ctx = zmq.Context()
socket = ctx.socket(zmq.PUSH)
socket.connect("tcp://localhost:5556")
data = struct.pack("Bbbbb", AUV_ID, LEFT, RIGHT, SIDE, VERTICAL)
socket.send(data)
Телеметрия
Канал для получения телеметрии имеет тип PUB/SUB. TCP-сокет, порт :5557. Каждое сообщение является multipart и состоит из двух частей:
| Значение | Тип |
|---|---|
| ID АНПА | uint8 |
| Телеметрия | См. ниже |
Телеметрия закодирована следующим образом:
| Значение | Тип |
|---|---|
| X | float32 |
| Y | float32 |
| Z | float32 |
| Курс | float32 |
| Тангаж | float32 |
| Крен | float32 |
Пример клиента на Python
import struct
import zmq
AUV_ID = 0
ctx = zmq.Context()
socket = ctx.socket(zmq.SUB)
socket.connect("tcp://localhost:5557")
socket.subscribe(bytes([AUV_ID])) # фильтруем по АНПА с ID=0
_auv_id, data = socket.recv_multipart(0)
x, y, z, yaw, pitch, roll = struct.unpack("<ffffff", data)