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

Спецификация сетевого интерфейса

Для создания собственного 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)