Цель работы:

  • Изучение процедуры создания пользовательского программного пакета
  • Изучение процедуры создания пользовательского типа сообщений с использованием базовых типов данных
  • Научиться создавать файлы запуска

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

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

Важно! Всегда работаем в папке src, и пакеты создаем внутри неё.

Создайте новый пакет с названием my_super_robot_controller, выполнив следующие команды:

cd src
catkin_create_pkg my_super_robot_controller rospy std_msgs
catkin build

После создания пакета необходимо проверить, что внутри ROS пакета находится папка src, а также файлы CMakeLists.txt и package.xml.

Примечание: Папка scripts внутри ROS пакета не создается автоматически, её нужно создать вручную:

mkdir scripts

Создание ноды с паблишером и сабскрайбером

Создайте скрипт в папке scripts и сделайте его исполняемым файлом (новые файлы в Linux по умолчанию не являются исполняемыми):

touch scripts/super_node.py
chmod +x scripts/super_node.py

Откройте файл super_node.py для редактирования и добавьте следующий программный код:

#!/usr/bin/env python3

import rospy
from turtlesim.msg import Pose
from geometry_msgs.msg import Twist

def pose_callback(pose):
    cmd = Twist()
    if pose.x > 9.0 or pose.x < 2.0:
        cmd.linear.x = 1.0
        cmd.angular.z = 1.4
    else:
        cmd.linear.x = 2.0
        cmd.angular.z = 0.0

    publisher.publish(cmd)
    rospy.loginfo("Super node sending new msg ...")

if __name__ == '__main__':
    rospy.init_node("turtle_super_node")
    rospy.loginfo("Node started...")
    subscriber = rospy.Subscriber("/turtle1/pose", Pose, callback=pose_callback)
    publisher = rospy.Publisher("/turtle1/cmd_vel", Twist, queue_size=10)
    rospy.spin()

Данный пример реализовывает простейший релейный регулятор для управления моделью черепахи (моделирование черепахи должно быть запущено командой rosrun turtlesim turtlesim_node).

Запустите только что созданный файл с помощью команды rosrun, как показано ниже.

rosrun my_super_robot_controller super_node.py

В результате вы должны увидеть сообщение "Super node sending new msg...". А если моделирование черепахи запущено, то должны увидеть движение модели черепахи.

Чтобы остановить запущенную программу, воспользуйтесь сочетанием клавиш CTRL+C.

Пользовательский тип сообщений

Ранее вы использовали только уже созданные типы сообщений, однако ROS предоставляет возможность создавать сообщения, имеющие произвольную структуру и любые поля. Такие типы сообщений называются пользовательскими. Любые типы сообщений в ROS существуют внутри определённого ROS-пакета, и название типа сообщения включает название пакета. Например, самые часто используемые типы сообщений относятся к пакету std_msgs.

Создание структуры сообщений

Внутри ROS пакета создайте папку msg для хранения структуры сообщений:

mkdir msg

Создайте файл структуры сообщения с названием Num.msg и содержанием "int64 num", выполнив следующую команду:

echo "int64 num" > msg/Num.msg

Отредактируйте файл, изменив поля в соответствии с примером ниже:

string first_name
string last_name
uint8 age
uint32 score

На этом этапе только что созданный пользовательский тип сообщений будет недоступен для использования в вашем ROS пакете.

Настройка сборки сообщений

Чтобы сборка новых типов сообщений выполнялась каждый раз при вызове команды catkin build, необходимо подключить два стандартных пакета message_generation и message_runtime.

Отредактируйте package.xml, добавляя строки:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

Также отредактируйте CMakeLists.txt добавив зависимости от message_generation и message_runtime, как показано ниже:

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)
  
catkin_package(
  CATKIN_DEPENDS message_runtime
)

Добавьте название файла со структурой сообщения в add_message_files:

add_message_files(
  FILES  
  Num.msg
)

Разрешите генерацию сообщений в generate_messages:

generate_messages(
  DEPENDENCIES
  std_msgs
)

Выполните повторную сборку пакета:

catkin build

Не забудьте, что после каждой сборки необходимо выполнить source, как было показано в Практической работе №1 (в дальнейшем это действие будет само собой подразумеваться).

Проверьте доступность созданного типа сообщений в ROS и отобразите содержимое созданной структуры сообщения:

rosmsg show my_super_robot_controller/Num

Задание для самостоятельного выполнения

  1. Изменить созданный тип сообщений, чтобы он содержал только координаты x, y.
  2. Написать программный код для узла, подписывающегося на топик Pose из turtlesim и публикующее position2d сообщения с координатами x, y.
  3. Проверить результат с помощью команды: rostopic echo /position2d.

Запуск нескольких узлов одновременно

Для одновременного запуска нескольких узлов используются файлы запуска .launch.

Внутри ROS пакета создайте папку для хранения файлов запуска:

mkdir launch

Создайте файл запуска:

touch launch/my_setup.launch

Отредактируйте файл, добавив следующее содержание:

<?xml version="1.0" encoding="UTF-8"?>
<launch>
    <node name="my_super_robot_controller" pkg="my_super_robot_controller" type="super_node.py"/>
</launch>

Выполните файл запуска:

roslaunch my_super_robot_controller my_setup.launch

В результате вы должны увидеть узлы, которые создает super_node.py.

В файлах запуска также можно указать пространство имен, внутри которого будет запускаться узел. В следующем примере super_node.py запускается внутри пространства имен с названием ns1, и таким образом все относительные имена топиков и узлов будут начинаться с /ns1/*.

<?xml version="1.0" encoding="UTF-8"?>
<launch>
    <group ns="ns1">
        <node name="controller" pkg="my_super_robot_controller" type="controller.py" output="screen"></node>
    </group>
    
    <group ns="ns2">
        <node name="controller" pkg="my_super_robot_controller" type="controller.py" output="screen"></node>
    </group>
</launch>

Задание для самостоятельного выполнения

Отредактируйте my_setup.launch, чтобы одновременно с управляющей программой запускалась имитационная модель черепахи из пакета turtlesim.

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

  • Достаточно ли создать файл с расширением .msg, чтобы новый тип сообщений стал доступен в ROS?
  • Какой командой необходимо воспользоваться для выполнения файла запуска?