Одним из преимуществ Robot Operating System (ROS) является то, что у него есть множество пакетов, которые можно использовать повторно в наших приложениях. В нашем случае мы хотим внедрить систему распознавания и обнаружения объектов. Пакет find_object_2d реализует SURF, SIFT, ORB, FAST и BRIEF детекторы функций и дескрипторы для обнаружения объектов. Используя графический интерфейс, предоставляемый этим пакетом, мы можем отметить объекты, которые мы хотим обнаружить, и сохранить их для будущего обнаружения. Узел детектора будет обнаруживать объекты в изображениях камеры и публиковать детали объекта через тему. Используя 3D-датчик, он может оценить глубину и ориентацию объекта.

В конце статьи, видео тестирования на примере алгоритмов ORB и SIFT.

Установка find_object_2d


Установка этого пакета довольно проста. Вот команда, чтобы установить его на Ubuntu 16.04 и ROS Kinetic:

$ sudo apt-get install ros-kinetic-find-object-2d

Установка из исходного кода


Переключитесь в рабочее пространство ROS:

$ cd ~/catkin_ws/src

Скопируйте исходный код в папку src:

$ git clone https://github.com/introlab/find-object.git
src/find_object_2d

Создайте рабочее пространство:

$ catkin_make

Запуск узлов find_object_2d с помощью веб-камер


Ниже приведена процедура запуска узлов детектора для веб-камеры. Если мы хотим обнаружить объект с помощью веб-камеры, сначала необходимо установить пакет usb_cam(см предыдущую статью).

1. Запусти roscore:

$ roscore

2.1 Подключите USB-камеру к компьютеру и запустите драйвер ROS usb_cam:

$ roslaunch usb_cam usb_cam-test.launch

Это запустит драйвер ROS для USB веб-камер, и вы сможете посмотреть темы в этом драйвере, используя команду rostopic list. Список тем в драйвере показан здесь:


Темы, публикуемые из драйвера камеры

2.2 Альтернативный вариант трансляции видео с камеры через uvc_camera:

$ rosrun uvc_camera uvc_camera_node

3. Из списка тем мы собираемся использовать тему необработанного изображения с камеры, которая публикуется в теме /usb_cam/image_raw. Если вы получаете эту тему, то следующим шагом будет запуск узла обнаружения объекта. Следующая команда запустит узел обнаружения объекта:

$ rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw

Эта команда откроет окно детектирования объекта, в котором мы видим канал камеры и особенности объектов.

4. Итак, как мы можем использовать его для обнаружения объекта? Ниже приведены процедуры, позволяющие выполнить базовое обнаружение с помощью этого инструмента:


Окно обнаружения Find-Object

5. Вы можете щелкнуть правой кнопкой мыши на левой боковой панели (Objects) этого окна, и вы получите возможность добавлять объекты из сцены. Если вы выберете эту опцию, вам будет предложено, пометить объект из текущей сцены, и после завершения маркировки отмеченный объект начнет отслеживаться со сцены. На предыдущем снимке экрана показан первый шаг, на котором происходит съемка сцены, имеющей объект.

6. После выравнивания объекта по направлению к камере нажмите кнопку “Take Picture”, чтобы сделать щелчок объекта:


Мастер добавления объектов для захвата объекта

7. Следующее окно предназначено для маркировки объекта из текущей привязки. На следующем рисунке показано это. Мы можем использовать указатель мыши для того чтобы отметить объект. Нажмите кнопку «Next», чтобы обрезать объект, и вы можете перейти к следующему шагу:


Мастер добавления объектов для маркировки объекта

8. После обрезки объекта он покажет вам общее количество дескрипторов функций объекта, и вы можете нажать кнопку «End», чтобы добавить шаблон объекта для обнаружения. На следующем рисунке показан последний этап добавления шаблона объекта в это приложение-детектор:


Последний шаг мастера добавления объектов

9. Поздравляем! Вы добавили объект для обнаружения. Теперь вы сможете увидеть обнаружение, показанное в следующем снимке. Вы можете увидеть ограничивающий прямоугольник вокруг обнаруженного объекта:


Мастер Find-Object, запускающий обнаружение

10. Достаточно ли этого? Как насчет положения объекта? Мы можем получить
позиции объекта, используя следующую команду:

$ rosrun find_object_2d print_objects_detected


Детали объекта

11. Вы также можете получить полную информацию об обнаруженном объекте из
/object темы. В этой теме публикуется многоадресный массив, состоящий из ширины и высоты объекта и матрицы гомографии для вычисления положения и ориентации объекта и его значений масштаба и сдвига. Вы можете echo the /objects topic получить так:


Значения темы /object

12. Мы можем вычислить новую позицию и ориентацию из следующих уравнений:


Уравнение для вычисления позиции объекта

Здесь H является гомографией 3 ? 3 матрицы, (x1, y1) является позицией объекта в сохраненном изображении, а (x2, y2) является вычисленной позицией объекта в текущем кадре.
Вы можете проверить исходный код узла print_objected_src, чтобы получить onversion, используя матрицу гомографии.

Вот исходный код этого узла.

Видео тестирования пакета find_object_2d на примере алгоритмов ORB и SIFT



Резюме по алгоритмам: ORB быстрый, но не видит удаленные объекты и часто не правильно определяет геометрию. SIFT видит удаленные объекты, точно определяет геометрию, минусы требует больших вычислительных ресурсов и платный для коммерческого использования.

Вопросы которые предстоит решить по роботу EduMIP:

  1. Получать с камеры Logitech C920 на BeagleBone Blue уже аппаратно закодированное видео и передать его в таком виде на большой компьютер в ROS.
  2. Подключить датчики расстояния VL6180X, Vl53l0x и бампер, чтобы строить карту в ROS.(комплектующие уже заказаны)
  3. Написать алгоритм в ROS который будет обрабатывать данные карты и обнаруженных объектов с камеры и строить на основе них маршрут движения.

Если есть такие же энтузиасты робототехники как я, готовые включиться в проект, то пишите в личку, по вышеописанным вопросам нужна помощь.

Комментарии (8)


  1. Tremere
    26.06.2018 11:10
    +1

    Как с помощью датчиков дистанции и бампера вы собираетесь строить карту?
    И как собираетесь соотнести данные с камеры(найденные объекты), с уже построенной картой?


    1. AmigoRRR Автор
      26.06.2018 11:16

      VL6180X, Vl53l0x выдают расстояние в миллиметрах до препятствия. А по бамперу буду считать что если сработал то стена пред роботом.


      1. Tremere
        26.06.2018 11:21
        +1

        есть примеры алгоритмов построения карты для таких датчиков?


        1. AmigoRRR Автор
          26.06.2018 11:24

          1. Tremere
            26.06.2018 11:36

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


            1. AmigoRRR Автор
              26.06.2018 11:56

              тесты покажут


      1. argz
        26.06.2018 11:26
        +1

        в миллиметрах

        Я бы не был так оптимистичен.
        Официальная документация на VL53L0X сообщает на странице 27 (раздел 5.3.1), что точность определения расстояния до белой мишени в помещении составляет 4%. Для истинного расстояния в 120 см ошибка получается 48 мм.
        VL6180X же подойдёт только для обнаружения объектов на расстоянии до 100 мм. Потому что он proximity sensor, а не ranging sensor.


  1. Hedgehogues
    27.06.2018 08:24

    ...