Ниже приведены этапы, которые ранее планировалось выполнить на этой неделе. Ниже мы поговорим о каждом более подробно. Если вы не читали мой предыдущий пост, прочтите его, прежде чем читать вторую часть.

Загрузить симулятор с TurtleBot

Эта задача была довольно легкой. Поскольку роботов мы уже запускали ранее, с помощью этого учебника я смог запустить Gazebo с TurtleBot.

Добавьте камеру RGB-Depth в TurtleBot

Мне удалось добавить 3D-сенсор с именем TURTLEBOT_3D_SENSOR kinect. Для этого я добавил его в качестве аргумента в свой файл запуска.

Добавьте к роботу пакет Keyboard Teleop, чтобы мы могли перемещать TurtleBot

Мне удалось изменить файл запуска, чтобы клавиатура могла управлять TurtleBot. Я следовал этому учебнику за помощью.

Узнайте, как заставить камеру возвращать поток того, что она видит

Чтобы увидеть какие потоки, мы должны подписаться на узел /camera/rgb/image_raw.

Предоставьте функции OpenCV изображение, чтобы она могла знать, какой элемент она ищет (изображение находится в теме ROS /camera/rgb/image_raw/compressed)

Вот три алгоритма сопоставления признаков, которые я пробовал:

  1. Шаблон соответствия

Мой первый тест алгоритма сопоставления признаков

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

2. ПРОСЕВАТЬ

После проведения исследования этот алгоритм работает, даже если эталонное изображение и изображение поезда имеют разные размеры и углы.

Эта реализация хорошо работает на изображениях, снятых с одной и той же стороны, но в 3D-пространстве работает не очень хорошо.

Поскольку робот может видеть барьер с любой стороны, но я могу предоставить ему только одно эталонное изображение с одного ракурса, он считает, что эталонное изображение отличается от изображения поезда. Это было огромной проблемой, потому что SIFT не поддерживает 3D-изображения и не позволяет использовать несколько эталонных изображений.

3. YOLO (Вы только посмотрите один раз)

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

(Это все еще реализуется)

Остановить TurtleBot, когда предмет будет найден

Чтобы остановить TurtleBot, когда предмет будет найден, я убил узел /turtlebot_teleop_keyboard с помощью команды os.system("rosnode kill /turtlebot_teleop_keyboard")

Создавать живую сетку занятости того, что робот видел раньше

Я смог сделать это, следуя учебнику, найденному здесь.

Добавьте пакет сопоставления функций OpenCV в TurtleBot и передайте ему изображения с камеры, чтобы мы могли знать, когда TurtleBot найдет элемент, который мы ищем.

Для этого я решил, что если камера обнаружит знак остановки с точностью выше 80%, мы остановим робота в текущем местоположении. Это было сделано с помощью YOLO.