Распознавание QR-кода через подписку на топик

triangle-exclamation
  1. Откроем терминал и создадим пустой файл с расширением .py

circle-exclamation

2. Возьмем из официального гитбука шаблон по распознаванию qr-кода:

circle-exclamation

3. Скопируем его содержимое в наш файл:

circle-exclamation

В целом, этот код уже способен распознавать qr-коды, однако, много лишней информации, которую мы никак не используем, поэтому удалим ее. Наш код примет вид:

Давайте разберем построчно этот скрипт, поскольку, именно от него мы и будем отталкиваться при распознавании qr-кодов.

import rospy from pyzbar import pyzbar from cv_bridge import CvBridge from sensor_msgs.msg import Image

В этом блоке идет импорт, необходимых для нашей программы библиотек.

bridge = CvBridge() - вызов ROS-сервиса

rospy.init_node('barcode_test') - инициализация ноды с уникальным именем barcode_test

circle-info

Подробнее про вышеперечисленные фрагменты кода можно изучить по ссылке: https://clover.coex.tech/ru/ros.htmlarrow-up-right

def image_callback(data): - объявляем процедуру (функцию) с именем image_callback и задаем для нее единственный параметр data

cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') - захватываем изображение с камеры и кладем это изображение в переменную cv_image

barcodes = pyzbar.decode(cv_image) - расшифровка изображения, на котором есть qr-код. В результате получиться массив с именем barcodes (список элементов)

Отлично! Мы разобрали каждую строчку этого скрипта, теперь давайте добавим в конце кода строчку с выводом сообщения на экран с информацией о расшифрованном qr-коде.

Для этого добавьте в конец кода (во внутрь функции image_callback) данную строчку:

circle-info

Данная программа будет работать только тогда, когда мы к камере поднесём изображение с QR-кодом

В связи с этим добавим функции взлета и полета в точку с QR-кодом для его распознавания. Наша поле для полетов выглядит следующим образом:

Я выдели красным маркером место взлета. Расстояние до каждого соседнего объекта - 1 метр. Видно, что ближайший QR-код находится на расстояние 1 метр по оси Y. Совершим полет в эту точку и зависнем на высоте не более 1 метра.

Если забыли как это делать, можно освежить память по ссылке ниже:

Создание автономной программы программыchevron-right

Фрагмент с полетом должен выглядеть примерно так:

Не забудьте, чтобы эти строчки могли работать необходимо добавить импорт необходимых библиотек и вызов соответствующих сервисов:

Итоговый код примет вид:

Сохраним и запустим данный файл.

circle-exclamation
circle-exclamation

В результате ваш квадрокоптер успешно взлетит, совершит пролет до нашего QR-кода и приземлиться. Никакого распознавания не будет. Это происходит по тому, что функцию мы лишь объявили и никак ее не вызвали.

Также, нам необходимо выводить изображение qr-кода в топик web_video_serverarrow-up-right.

Для всего этого необходимо создать Publisher (публицист), publish (публикация) и Subscriber (подписчик). Благодаря этим трем методам происходит обмен данными между нодами.

Publisher создает топик с именем, который мы укажем.

publish этот топик опубликует и он будет нам виден.

Subscriber подписывается на publish, благодаря чему, он обменивается информацией с Publisher. Таким образом, результат распознавания, можно вывести на картинку с камеры в реальном времени.

circle-exclamation

Возьмем необходимые строчки из официального гитбука и вставим в наш код:

Получаем:

Подписчика (Subscriber) вставляем в то место, где хотим вызвать нашу функцию по распознаванию QR-кода. К примеру, добавим его в место, когда квадрокоптер уже прилетел на точку с изображением и завис над ним.

Публициста (Publisher) добавим в начало нашей программы, после объявление ноды с уникальным именем.

Публикацию (publish) добавляем во внутрь нашей функции, где происходит обработка изображения с QR-кодом.

Итого, наш код примет вид:

Сохраните и выйдите из редактора.

circle-exclamation

Перед тем как запустить этот код давайте откроем браузер "Firefox Web Browser", он расположен на рабочем столе виртуальной машины:

Теперь в поисковой строке пропищите данную строчку, которая обеспечит локальное подключение к вашему виртуальному квадрокоптеру:

Подробнее про каждую ссылку, представленной на этом web-сервисе, вы можете найти по ссылке ниже:

Просмотр топиковchevron-right

Откройте второй топик "View image topics".

Перед вами все существующие топики, которые связаны с просмотром и обработкой изображения с камеры. Когда мы запустим программу, то появится еще один топик, который мы прописали в программе. Напомню, что наименование топика мы задаем в Publisher.

circle-exclamation

Теперь, когда у вас запущен браузер с web-сервисом, запущен симулятор Gazebo, мы можем запустить наш код.

circle-exclamation

После запуска должно произойти следующее: у вас сначала появится ваш топик, открыв, который вы увидите белый экран.

Как только, квадракоптер увидит QR-код, тогда на экран: сразу появиться его изображение.

После завершения полета, в симуляторе отразиться информация зашифрованная в QR-коде. Эта информация повторяется несколько раз, поскольку он делает обработку изображения несколько раз в секунду:

Все выражение в квадратных скобках — это массив:

Внутри массива перечислен один элемент. Этот элемент имеется индекс ноль.

circle-check

Давайте обратимся к этому элементу и выведем на экран этот элемент. Для этого наша строчка с выводом на экран примет вид:

Наш код примет следующий вид:

Сохраним и запустим код. В результате в терминал выведется сообщение:

Как видим, результат тот же, только уже без квадратных скобок по краям. Эта вся информация которая хранится в любом QR-коде. Элемент представляет собой кортеж с именем Decoded.

circle-check

Можно заметить, что весь кортеж логически поделен на отдельные фрагменты, отделяемые запятой. Каждый фрагмент имеет свое имя и значение. Ниже я представлю эти фрагменты в виде столбца для удобного восприятия:

В элементе кортежа data хранится зашифрованный текст QR-кода.

В элементе кортежа type хранится тип зашифрованного изображения.

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

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

Давайте выведем в терминал только зашифрованный текст QR-кода. Следовательно, наша строчка с выводом на экран примет вид:

В результате получим:

Отлично, теперь только текст, который зашифрован в QR-коде.

Теперь давайте выведем только тип зашифрованного изображения, для этого укажем имя элемента кортежа type:

В результате получим:

Отлично, теперь получился только тип зашифрованного изображения.

К остальным элементам можно обратиться аналогичным способам. Однако, мы рассмотрим способ вывести на экран координаты углов изображения в пикселях. Для этого обратимся к элементу polygon:

В результате получим массив с 4-мя элементами:

Нумерация элементов начинается с нуля. Элемент под номером ноль - это координаты левого нижнего угла изображения; номер 1 - координаты левого верхнего угла; 2 - правый верхний; 3- правый нижний.

Выведем в терминал координаты правого нижнего угла изображения:

ЗАДАНИЯ НА САМОСТОЯТЕЛЬНУЮ РАБОТУ:

  1. Вывести в терминал только значение ширины (width) QR кода в пикселях.

  2. Вписать в QR код окружность красного цвета.

  3. Вывести в терминал только координаты левого верхнего угла QR кода в пикселях.

Last updated