Ниже приведены этапы, которые ранее планировалось выполнить на этой неделе. Ниже мы поговорим о каждом более подробно. Если вы не читали мой предыдущий пост, прочтите его, прежде чем читать вторую часть.
✅ Загрузить симулятор с 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 на изображении поезда.
2. ПРОСЕВАТЬ
После проведения исследования этот алгоритм работает, даже если эталонное изображение и изображение поезда имеют разные размеры и углы.
Эта реализация хорошо работает на изображениях, снятых с одной и той же стороны, но в 3D-пространстве работает не очень хорошо.
Поскольку робот может видеть барьер с любой стороны, но я могу предоставить ему только одно эталонное изображение с одного ракурса, он считает, что эталонное изображение отличается от изображения поезда. Это было огромной проблемой, потому что SIFT не поддерживает 3D-изображения и не позволяет использовать несколько эталонных изображений.
3. YOLO (Вы только посмотрите один раз)
Этот алгоритм имеет предварительно обученное сопоставление признаков, которое может сопоставлять 80+ элементов. Я решил использовать его, так как он способен обнаруживать предметы в любом масштабе и под любым углом, даже сзади, что устраняет проблемы двух других алгоритмов.
(Это все еще реализуется)
✅ Остановить TurtleBot, когда предмет будет найден
Чтобы остановить TurtleBot, когда предмет будет найден, я убил узел /turtlebot_teleop_keyboard с помощью команды os.system("rosnode kill /turtlebot_teleop_keyboard")
✅ Создавать живую сетку занятости того, что робот видел раньше
Я смог сделать это, следуя учебнику, найденному здесь.
✅ Добавьте пакет сопоставления функций OpenCV в TurtleBot и передайте ему изображения с камеры, чтобы мы могли знать, когда TurtleBot найдет элемент, который мы ищем.
Для этого я решил, что если камера обнаружит знак остановки с точностью выше 80%, мы остановим робота в текущем местоположении. Это было сделано с помощью YOLO.