Цель работы

  • Изучение основ Linux, необходимых для работы с ROS
  • Установка и базовая настройка ROS
  • Знакомство с базовыми возможностями ROS по обмену данными

В данной работе необходимо пользоваться теоретическими материалами и инструкциями по установке необходимого программного обеспечения.

Подготовка операционной системы

Необходимо установить операционную систему Ubuntu (либо как вторую операционную систему, либо установить WSL), следуя инструкциям, приведенным в приложении A.

Установка редактора исходного кода (IDE)

Чтобы установить редактор VS Code, выполните на Ubuntu:

sudo snap install code --classic

Если вы работаете на операционной системе Windows, необходимо скачать с официального сайта программу Visual Studio Code и установить, убедившись, что выполняете операцию вне WSL и Docker контейнера.

В VS code имеются полезные расширения, которые облегчат работу (их желательно установить): Python, Cmake, ROS.

Первый запуск ROS

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

ROS Master

Для работы ROS необходим ROS Master, который запускается утилитой roscore. Если roscore не установлен, установить можно следующей командой (в версии desktop-full уже установлен roscore):

sudo apt install python3-roslaunch

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

printenv | grep ROS

Следующим шагом откройте файл ~/.bashrc в текстовом редакторе и проверьте его содержимое. В файле должен быть прописан путь к установленной версии ROS, как показано ниже.

source /opt/ros/noetic/setup.bash

Запуск ROS Master

Запустить ROS Master можно при помощи команды roscore в отдельном окне терминала. Запустите roscore, выполнив команду:

roscore

Запуск "publisher"

Откройте новый терминал (не закрываем предыдущий, в котором запущен roscore) и попробуйте запустить узел, публикующий сообщения (publisher), используя уже установленный пакет rospy_tutorials:

rosrun rospy_tutorials talker

Вы должны увидеть, как talker публикует сообщения с содержанием "Hello world".

Запуск "listener"

Откройте еще один терминал и запустите ноду listener из аналогичного пакета, воспользовавшись следующей командой:

rosrun rospy_tutorials listener

В результате у вас должно быть открыто три окна (три терминала), и вы должны увидеть, как listener считывает сообщения, публикуемые talker. Если вы остановите talker, нажав курсором на окно, и затем клавиши CTRL + C, то listener перестанет получать сообщения.

Визуализация вычислительного графа

В данном разделе необходимо научиться исследовать готовый (написанный другими разработчиками) ROS пакет.

Используйте утилиту rqt_graph, чтобы отобразить вычислительный граф:

rqt_graph

Ответьте на следующие вопросы:

  • Через какой топик происходит обмен данными?
  • Посмотрите на вычислительный граф и определите название узлов, которые обмениваются данными.

Запуск симуляции черепахи

Остановите все ранее запущенные файлы (кроме roscore) и запустите симуляцию черепахи из установленного по умолчанию пакета turtlesim. Для этого выполните команду:

rosrun turtlesim turtlesim_node

Снова запустите rqt_graph и проверьте, какие новые узлы и топики появились в вычислительном графе.

Отправка управляющих команд

Чтобы черепашка двигалась, необходимо отправить "правильное" сообщение в "правильный" топик. Найдите названия "правильных" топиков с помощью ROS команд:

rostopic list

Тип сообщения в топике "topic_name" определяется командой:

rostopic type /topic_name

Проверьте, за что отвечает каждый топик, подставляя вместо topic_name названия топиков из списка топиков, который выдала команда rostopic list.

Для просмотра структуры сообщения с названием типа 'msg_type':

rosmsg show msg_type

Публикация сообщений

Сообщение для управления можно отправить из терминала (консоли):

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist '{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}'

Управление черепахой с клавиатуры

Для управления черепахой с клавиатуры можно воспользоваться узлом turtle_teleop_key, который имеется в ROS пакете turtlesim

Запустите:

rosrun turtlesim turtle_teleop_key

Теперь можно управлять черепахой с клавиатуры.

Просмотр данных

Выведите в терминале данные по положении черепахи, которые приходят в топик /turtle1/pose:

rostopic echo /turtle1/pose

Проверьте частоту публикации сообщений:

rostopic hz /turtle1/pose

Выведите данные из топика в виде графика (пример построения графика):

rosrun rqt_plot rqt_plot /turtle1/pose

Создание рабочего окружения и запуск ROS пакета

  1. Знакомство с процедурой написания программного кода и его компиляции.
  2. Изучение базовых возможностей ROS по обмену данными на примере управления моделью черепахи.

Установка catkin

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

sudo apt-get install python3-catkin-tools

В дальнейшем будет важно помнить: Наличие папки src внутри рабочего окружения catkin является обязательной для инициализации, в дальнейшем работа должна вестись именно внутри этой папки!

Создание catkin workspace

Создайте пользовательское окружение catkin в любом месте и запомните расположение, в дальнейшем вся работа с ROS пакетами будет осуществляться внутри этого окружения.

Следующие команды создают папку workspace, внутри которой еще одна папка src, затем инициализируют папку workspace в качестве catkin workspace и запускают пересборку всех имеющихся в окружении пакетов.

mkdir workspace
cd workspace
mkdir src
catkin init
catkin build

После каждой сборки пакетов catkin необходимо выполнить (обновление переменных окружения):

source devel/setup.bash

Создание ROS пакета

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

cd ../
git clone https://gitlab.com/likerobotics/ros-course-itmo.git

В скачанных файлах необходимо найти и скопировать папку my_robot_controller из task_1 в свое окружение catkin в папку src (пример команды для копирования на linux: cp -r /roscourseitmo/task_1/my_robot_controller /workspace/src/my_robot_controller).

Исследование пакета

Данный пакет содержит:

  1. scripts - папка с Python файлами
  2. CMakeLists.txt - инструкции для системы сборки программного кода
  3. package.xml - свойства пакета, такие как название, версия, авторы и зависимости от других пакетов.

Перед началом разработки программного кода с использованием ROS необходимо вспомнить два фундаментальных понятиях, часто называемых Publisher и Subscriber. Publisher - структура данных, имеющаяся в библиотеке ROS для публикации сообщений в соответствии с правилами ROS. Часто называют Publisher сам узел, который содержит вышеупомянутую структуру данных, если она публикует сообщения. Узел в общем случае может содержать как Publisher, так и Subscriber одновременно. Однако для простоты далее мы рассмотрим два узла, один из них Publisher, а другой Subscriber.

Создание Publisher

Далее создадим первый свой исполняемый файл в папке scripts, для этого перейдите внутрь папки и создайте файл с названием my_publisher.py, который будет содержать следующий программный код:

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

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

Данный пример публикует сообщения типа String в топик с названием chatter.

Дополните его, чтобы одновременно с этим публиковалось второе сообщение типа Twist в топик cmd_vel.

Добавьте импорт Twist по аналогии со String и в основном цикле добавьте следующее:

msg = Twist()
msg.linear.x = 1
pub.publish(msg)

Создание Subscriber

Необходимо создать файл my_subscriber.py со следующим содержанием:

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)

def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber("chatter", String, callback)
    rospy.spin()

if __name__ == '__main__':
    listener()

Выше указанный пример только принимает сообщение из топика chatter и выводит результат в терминал.

Не забудьте сделать файлы исполняемыми перед запуском. Запустить Publisher и Subscriber в разных терминалах при помощи команды rosrun.

Вопросы для самопроверки

  • Какую функцию выполняет ROS Master?
  • Как называется утилита для визуализации вычислительного графа в ROS?
  • Возможно ли редактирование ROS пакета, если его установка выполнена через apt?
  • В какой папке необходимо располагать программный код на языке Python?