Камера

Камеры квадрокоптера позволяют получать изображения и использовать их в собственных программах.

Инициализация

from clover2 import Clover2

drone = Clover2()
# или с именем ноды:
drone = Clover2("my_drone")

Clover2 — обертка над ROS 2 Node. При создании объекта Clover2 создается нода и запускается фоновый поток для работы ROS 2.

Получение кадра в формате NumPy-массива

Используйте get_image(), чтобы получить текущий кадр с камеры в виде NumPy-массива.

img = drone.camera().get_image()                       # main_camera, bgr8
img = drone.camera("main_camera").get_image("rgb8")  # с указанием камеры и encoding

Если не указать параметры, get_image() использует камеру main_camera и формат изображения bgr8. Вы можете указать другую камеру и формат изображения с помощью параметров camera_name и encoding.

Получение ROS Image

Если вам нужно работать с изображением непосредственно в ROS 2, используйте get_image_msg().

img_msg = drone.camera().get_image_msg()

Используйте этот вариант, если ваша программа работает с ROS 2 и вам не нужно сразу преобразовывать изображение в NumPy-массив.

Получение параметров калибровки камеры

Чтобы получить параметры калибровки камеры, используйте get_camera_info().

info = drone.camera().get_camera_info()
# info.width, info.height, info.k (матрица), info.d (дисторсия)

Получать поток изображений

stream устанавливает callback, который вызывается для каждого нового кадра как numpy.ndarray. По умолчанию используется кодировка bgr8; её можно изменить аргументом desired_encoding.

import numpy as np


def on_image(img: np.ndarray):
    print(img.shape)


drone.camera().stream(on_image)

Для получения исходных ROS-сообщений sensor_msgs.msg.Image используйте stream_msg:

from sensor_msgs.msg import Image


def on_image_msg(msg: Image):
    print(msg.header.stamp)


drone.camera().stream_msg(on_image_msg)

Повторный вызов stream или stream_msg заменяет предыдущий callback. Подписка продолжает работать до завершения Clover2.

Пример: детекция QR-кода

В этом примере программа получает изображения с камеры и проверяет их на наличие QR-кода.

import cv2
from clover2 import Clover2

drone = Clover2()
detector = cv2.QRCodeDetector()

while True:
    img = drone.camera().get_image()
    data, bbox, _ = detector.detectAndDecode(img)
    if data:
        print(f"QR Code: {data}")
        break

cv2.QRCodeDetector() создает детектор QR-кодов из библиотеки OpenCV. В цикле while True программа постоянно получает кадры с камеры img = drone.camera().get_image(). Функция detectAndDecode() ищет QR-код на полученном изображении и пытается прочитать записанные в нем данные. После вывода данных команда break завершает цикл, и программа перестает получать новые кадры.