Цель работы
- Изучение основ 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 пакета
- Знакомство с процедурой написания программного кода и его компиляции.
- Изучение базовых возможностей 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
).
Исследование пакета
Данный пакет содержит:
scripts
- папка с Python файламиCMakeLists.txt
- инструкции для системы сборки программного кода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
?
Оставить комментарий