Работа с камерой
Эта статья описывает работу с образом версии 0.24, который пока находится в стадии тестирования. Для версии 0.23 доступна более старая документация.
Для работы с основной камерой необходимо убедиться что она включена в файле ~/catkin_ws/src/clover/clover/launch/clover.launch
:
<arg name="main_camera" default="true"/>
Также нужно убедиться, что камера сфокусирована и для нее указано корректное расположение и ориентация.
При изменении launch-файла необходимо перезапустить пакет clover
:
sudo systemctl restart clover
Для мониторинга изображения с камеры можно использовать rqt или web_video_server.
Неисправности
Если изображение с камеры отсутствует, попробуйте проверить ее с помощью утилиты raspistill
.
Остановите сервисы Клевера:
sudo systemctl stop clover
Получите картинку с камеры утилитой raspistill
:
raspistill -o test.jpg
Если команда завершается с ошибкой, проверьте качество подключения шлейфа камеры к Raspberry Pi или замените его.
Настройки камеры
Ряд параметров камеры - размер изображения, максимальную частоту кадров, экспозицию - можно настроить в файле main_camera.launch
. Список настраиваемых параметров можно посмотреть в репозитории cv_camera.
Параметры, не указанные в этом списке, можно указывать через код параметра OpenCV. Например, для установки фиксированной экспозиции добавьте следующие параметры в ноду камеры:
<param name="property_0_code" value="21"/> <!-- property code 21 is CAP_PROP_AUTO_EXPOSURE -->
<param name="property_0_value" value="0.25"/> <!-- property values are normalized as per OpenCV specs, even for "menu" controls; 0.25 means "use manual exposure" -->
<param name="cv_cap_prop_exposure" value="0.3"/> <!-- set exposure to 30% of maximum value -->
Компьютерное зрение
Для реализации алгоритмов компьютерного зрения рекомендуется использовать предустановленную на образ SD-карты библиотеку OpenCV.
Python
Пример создания подписчика на топик с изображением с основной камеры для обработки с использованием OpenCV:
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from clover import long_callback
rospy.init_node('cv')
bridge = CvBridge()
@long_callback
def image_callback(data):
img = bridge.imgmsg_to_cv2(data, 'bgr8') # OpenCV image
# Do any image processing with cv2...
image_sub = rospy.Subscriber('main_camera/image_raw', Image, image_callback)
rospy.spin()
Обработка изображения может занимать значительное время. Это может вызвать проблему в библиотеке rospy, которая приведет к обработке устаревших кадров с камеры. Для решения этой проблемы необходимо использовать декоратор
long_callback
из библиотекиclover
, как в примере выше.
Ограничение использования CPU
При использовании топика main_camera/image_raw
скрипт будет обрабатывать максимальное количество кадров с камеры, активно используя CPU (вплоть до 100%). В задачах, где обработка каждого кадра не критична, можно использовать топик, где кадры публикуются с частотой 5 Гц: main_camera/image_raw_throttled
:
image_sub = rospy.Subscriber('main_camera/image_raw_throttled', Image, image_callback, queue_size=1)
Публикация изображений
Для отладки обработки изображения можно публиковать отдельный топик с обработанным изображением:
image_pub = rospy.Publisher('~debug', Image)
Публикация обработанного изображения:
image_pub.publish(bridge.cv2_to_imgmsg(img, 'bgr8'))
Получаемые изображения можно просматривать используя web_video_server или rqt.
Получение одного кадра
Существует возможность единоразового получения кадра с камеры. Этот способ работает медленнее, чем подписка на топик; его не следует применять в случае необходимости постоянной обработки изображений.
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
rospy.init_node('cv')
bridge = CvBridge()
# ...
# Retrieve a frame:
img = bridge.imgmsg_to_cv2(rospy.wait_for_message('main_camera/image_raw', Image), 'bgr8')
Примеры
Работа с QR-кодами
Для высокоскоростного распознавания и позиционирования лучше использовать ArUco-маркеры.
Для программирования различных действий коптера при детектировании нужных QR-кодов можно использовать библиотеку pyZBar. Она уже установлена в последнем образе для Raspberry Pi.
Распознавание QR-кодов на Python:
import rospy
from pyzbar import pyzbar
import cv2
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
from clover import long_callback
rospy.init_node('cv')
bridge = CvBridge()
@long_callback
def image_callback(msg):
img = bridge.imgmsg_to_cv2(msg, 'bgr8')
barcodes = pyzbar.decode(img)
for barcode in barcodes:
b_data = barcode.data.decode('utf-8')
b_type = barcode.type
(x, y, w, h) = barcode.rect
xc = x + w/2
yc = y + h/2
print('Found {} with data {} with center at x={}, y={}'.format(b_type, b_data, xc, yc))
image_sub = rospy.Subscriber('main_camera/image_raw_throttled', Image, image_callback, queue_size=1)
rospy.spin()
Смотрите другие примеры по работе с компьютерным зрением в каталоге
~/examples
образа для RPi.
Запись видео
Для записи видео может использована нода video_recorder
из пакета image_view
:
rosrun image_view video_recorder image:=/main_camera/image_raw
Видео будет сохранено в файл output.avi
. В аргументе image
указывается название топика для записи видео.