Цель работы:
- Изучение процедуры создания пользовательского программного пакета
- Изучение процедуры создания пользовательского типа сообщений с использованием базовых типов данных
- Научиться создавать файлы запуска
Создание 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
Задание для самостоятельного выполнения
- Изменить созданный тип сообщений, чтобы он содержал только координаты
x, y
. - Написать программный код для узла, подписывающегося на топик
Pose
изturtlesim
и публикующееposition2d
сообщения с координатамиx, y
. - Проверить результат с помощью команды:
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?
- Какой командой необходимо воспользоваться для выполнения файла запуска?
Оставить комментарий