Вы когда-нибудь задумывались, как программируются дроны? Как можно управлять роботами-манипуляторами и другими разными типами роботов? Эта статья специально для вас. Мы расскажем, что такое ROS, как она работает, как ее установить, и в довершение всего мы создадим базовый проект от начала до конца.

Что такое ROS и почему я должен ее использовать?

Операционная система робота не является (несмотря на название) операционной системой. ROS - это фреймворк, который используется для написания программного обеспечения для роботов. Он предоставляет библиотеки и инструменты для простого управления виртуальными и реальными роботами. Без ROS вам пришлось бы создавать собственные драйверы устройств, систему связи и выполнять другие сложные задачи только для управления своим роботом (и вам нужно будет повторить эти шаги, если вы хотите управлять другим типом роботов). В ROS все это не обязательно, вы можете просто сосредоточиться на разработке программного обеспечения для задач, которые должен выполнять ваш робот.

Какие языки я могу использовать с ROS?

Есть пара языков, которые вы можете использовать с ROS (Swift, Lisp, ..), но чаще всего используются 2 языка программирования: Python и C ++. Вы можете использовать любой из этих языков или оба. Мы увидим, как это возможно, позже в этой статье.

Теперь, если у вас нет опыта работы с C ++, ROS может быть очень трудным при использовании C ++. C ++ имеет преимущества в том, что он быстрее python, и вы можете делать практически все на C ++. Он также чаще всего используется в индустрии роботов, но чтобы начать программировать роботов, вам следует использовать python (и мы будем использовать его в этой статье). Позже вы всегда можете перейти на C ++, если хотите сделать карьеру программиста-робототехника.

Как именно работает ROS?

Прежде чем мы начнем использовать ROS, нам необходимо иметь общее представление о том, как работает ROS и как мы ее используем.

Система ROS имеет архитектуру графа узлов, что означает, что система разделена на разные узлы (компоненты). Эти узлы могут быть издателями или подписчиками. Узел издателя - это узел, который может отправлять сообщения, публикуя их в теме. Вы можете рассматривать тему как канал связи, по которому издатели могут отправлять данные и где подписчики могут «подписаться». Подписчики получают сообщения, отправленные издателями по этой конкретной теме.

В качестве примера возьмем изображение выше. У вас есть узел с именем number_publisher (издатель) и узел с именем number_subscriber (подписчик). Number_publisher необходимо отправить number_subscriber номер, он делает это, отправляя сообщение на созданную тему «номер». Number_subscriber знает, что может получать номера по теме номеров. Он подписывается на эту тему, чтобы получать эти сообщения.

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

Как было сказано ранее, вы можете использовать несколько языков в системе ROS. Вы можете написать, например, издателя на C ++, а подписчика - на python.

Все узлы управляются главным узлом. Как объяснено в документации ROS:

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

Главный узел можно запустить, запустив roscore в терминале или используя roslaunch

Установка ROS.

Единственное, что вам действительно нужно перед установкой ROS, - это система на базе Linux. Если у вас нет системы Linux, вы можете установить ее как виртуальную машину или создать двойную загрузку на своем ноутбуке или ПК. Я не буду вдаваться в подробности установки в этой статье, поэтому, если у вас еще нет Linux, я предлагаю вам сначала настроить и запустить систему Linux, прежде чем продолжить эту статью.

Мы установим ROS Melodic, потому что это последняя версия ROS, и она будет поддерживаться дольше всех других версий. (Примечание: следующая версия ROS будет выпущена в мае 2020 года, поэтому, если вы прочитаете эту статью примерно в это время или позже, убедитесь, что Melodic все еще является последней версией)

Чтобы установить ROS Melodic на свой компьютер, просто выполните эти простые шаги прямо здесь. Выполните шаги с 1.2 по 1.7 и установите версию Desktop-Full. Убедитесь, что вы правильно выполнили шаги в руководстве, чтобы потом у вас не было проблем.

Настройка среды ROS.

Мы начнем создавать нашу рабочую директорию, которая называется рабочим пространством Catkin. Если вам нужна дополнительная информация о рабочих пространствах catkin, вы можете найти ее здесь. Откройте терминал и введите следующие 3 команды:

mkdir -p ~/catkin_ws/src

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

cd ~/catkin_ws/

Это перемещает терминал в правую директорию папки.

catkin_make

Это создает и инициализирует рабочее пространство сережек.

Теперь, чтобы добавить рабочую область в среду ROS, вам необходимо создать сгенерированный установочный файл. Мы также собираемся добавить его в файл конфигурации по умолчанию, чтобы нам не нужно было исходить его каждый раз, когда мы запускаем новый терминал. Выполните следующие команды:

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

source ~/.bashrc

Теперь вы готовы начать разработку с помощью ROS.

Создание вашего первого проекта.

Теперь мы можем начать программировать наших роботов. Мы собираемся создать простой проект, в котором мы заставим робота (Turtlebot3) двигаться вперед и чтобы мы могли отслеживать его скорость в терминале. Мы будем визуализировать робота в беседке, трехмерном симуляторе робототехники с открытым исходным кодом. Давайте пройдемся по всем этапам один за другим. Я использую PyCharm в качестве своей IDE, но вы можете использовать любую удобную IDE, поддерживающую python.

Создание пакета сережек

Для начала создадим пакет catkin, это будет каталог вашего проекта. Перейдите в папку src из рабочего пространства catkin, откройте терминал и выполните следующую команду.

catkin_create_pkg robot_mover stdmsgs rospy roscpp

С помощью этой команды вы создаете пакет под названием robot_mover. Stdmsgs (сообщения), rospy (ROS python) и roscpp (ROS C ++) - это зависимости, которые автоматически добавляются в проект. Позже можно добавить другие зависимости. Теперь перейдите на один каталог ниже с помощью cd ~/catkin_ws и соберите пакет с помощью catkin_make.

Установка Turtlebot и беседки

Чтобы установить робота, который мы будем использовать (Turtlebot3), просто введите эту команду sudo apt install ros-melodic-turtlebot3-gazebo ros-melodic-turtlebot3.

Для установки нашего тренажера (беседки) выполните простую команду curl -sSL http://get.gazebosim.org | sh

Создание издателя

Мы приступим к созданию издателя (с именем mover.py). Мы собираемся начать с очень простого, просто двигая робота вперед. Обычно с издателями не все так просто, но главная цель здесь - получить представление о том, как работает издатель и как он создается.

Если вы используете PyCharm, вам необходимо запустить его с терминала, выполнив команду pycharm-community (если вы установили версию сообщества), иначе это может вызвать проблемы с библиотекой ROS. Откройте каталог robot_mover, и тогда мы, наконец, готовы создать нашего собственного издателя.

#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist


def move():
    rospy.init_node('mover')
    publisher = rospy.Publisher('cmd_vel', Twist, queue_size=10)
    rate = rospy.Rate(10)
    while not rospy.is_shutdown():
        twist = Twist()
        twist.linear.x = 2
        publisher.publish(twist)
        rate.sleep()


if __name__ == '__main__':
    try:
        move()
    except rospy.ROSInterruptException: pass

Это наш издатель. Давайте разделим код, чтобы лучше понять, как он работает.

#!/usr/bin/env python

Эта строка гарантирует, что мы можем запустить файл и что он выполняется как скрипт python.

import rospy
from geometry_msgs.msg import Twist

Это наш импорт. Rospy - это библиотека, которую мы используем для фактического использования ROS, geometry_msgs (Twist) - это тип сообщения, которое нам нужно отправить в нашу тему позже. Мы не можем просто отправить любой тип данных по любой теме, нам нужно убедиться, что отправляется правильный тип данных. В этом случае: объект Twist содержит линейные и угловые данные для управления роботом.

rospy.init_node('mover')
publisher = rospy.Publisher('cmd_vel', Twist)
rate = rospy.Rate(10)

Сначала мы даем нашему узлу-издателю имя, чтобы он мог быть распознан ROS, и поэтому мы также можем вызывать узел по его имени. Затем мы объявляем объект Publisher. Здесь мы объявляем тему (cmd_vel), в которой хотим опубликовать, и тип данных, которые мы хотим отправить (Twist). Позже мы используем «скорость», чтобы гарантировать, что мы публикуем что-то по теме только каждые 10 Гц.

while not rospy.is_shutdown():
    twist = Twist()
    twist.linear.x = 2
    publisher.publish(twist)
    rate.sleep()

Эта часть кода будет выполняться постоянно, пока ROS не перестанет работать (is_shutdown). Сначала мы создаем объект Twist, а затем даем аргумент, что робот должен двигаться вперед со скоростью 2. Мы публикуем объект Twist и ждем 10 Гц. (Это используется для более четкой визуализации нашего подписчика в дальнейшем)

if __name__ == '__main__':
    try:
        move()
    except rospy.ROSInterruptException: pass

Это начало нашего скрипта, он вызывает нашу функцию move () и возвращает исключение, если что-то пойдет не так.

Создание подписчика

Теперь мы создадим подписчика (с именем display.py), который будет отображать скорость нашего робота в терминале. Будем подписываться на тему cmd_vel и отображать скорость нашего робота.

#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist


def callback(data):
    rospy.loginfo("movement: " + str(data.linear.x))


def listener():
    rospy.init_node('display', anonymous=True)
    rospy.Subscriber("cmd_vel", Twist, callback)
    rospy.spin()


if __name__ == '__main__':
    listener()

Наши первые 3 строки кода такие же, как и от издателя (как и последние 2). Мы объясняем остальную часть кода функциями.

функция прослушивания

Инициализирует узел (как издатель), и мы также объявляем объект подписчика, как мы объявили объект издателя. Мы даем 1 дополнительный аргумент - функцию, которую он вызывает каждый раз, когда получает данные. Функция вращения просто не дает python выйти, пока этот узел не будет остановлен.

функция обратного вызова

Мы просто записываем вывод в терминал, чтобы отобразить наши последние полученные данные, в этом случае данные всегда одни и те же (2), потому что мы всегда публикуем одни и те же данные.

Все работает

Прежде чем мы запустим нашего издателя и подписчика, нам нужно загрузить turtlebot3 в gazebo. Поскольку turtlebot3 имеет разные модели, нам сначала нужно объявить, какую модель мы хотим использовать. Выполните команду export TURTLEBOT3_MODEL=burger , чтобы объявить, что мы будем использовать модель бургера.

Чтобы запустить беседку с Turtlebot, запустите roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch . Roslaunch используется для запуска мира с необходимыми моделями и мастером ROS. Его также можно использовать для запуска нескольких издателей, подписчиков и включать другие файлы запуска.

Теперь откройте другой терминал и запустите rosrun robot_mover mover.py. Если это не сработает, попробуйте предоставить файлу соответствующие разрешения (файл должен быть исполняемым). Rosrun используется для запуска одного узла. После запуска узла вы можете увидеть, как движется наш робот.

Для запуска подписчика запустите rosrun robot_mover display.py. Теперь в терминале отображаются последние сообщения из темы cmd_vel.

Поздравляю! Вы только что запрограммировали робота двигаться вперед с помощью ROS. Спасибо, что уделили время чтению этой статьи. Если вы хотите узнать больше, посмотрите документацию по ROS (http://wiki.ros.org/). Вы можете узнать больше о концепциях ROS и пройти больше руководств, чтобы лучше понять программирование собственных роботов.