Это вторая из серии статей о робототехнической платформе ROS. Первую статью можно найти здесь. В этой статье я расскажу о launch файлах. Кому интересно прошу под кат.
Стандартный способ запуска нод в ROS это с использованием команды rosrun. Но если нам нужно запустить одновременно несколько нод нам придется запускать команду rosrun для каждой ноды в новом терминале.
launch файлы позволяют автоматизировать этот процесс так что можно запустить несколько нод ROS и rosmaster одной командой.
Для этого в ROS есть специальный пакет roslaunch. Запуск launch файла выглядит так:
roslaunch package_name launch_file.launch
launch файлы это файлы в формате xml с расширением launch.
Также можно запустить launch файл указав путь до launch файла
roslaunch path/to/launch/file/launch_file.launch
roslaunch автоматически запускает roscore если он еще не запущен. Чтобы не запускался roscore можно указать параметр --wait. В этом случае roslaunch будет ждать пока не будет обнаружен запущенный roscore.
Синтаксис launch файлов
launch файлы поддерживают набор тегов, которые предназначены для конфигурации различных аспектов запускаемого процесса. Тег node предназначен для запуска узлов ROS. В атрибутах тега node можно указать имя пакета, ноды итд.
Пример тега node в launch файле:
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim" respawn="true"/>
Здесь атрибут pkg задает имя пакета. type определяет имя исполняемого файла (имя узла которое мы задаем в CMakeLists.txt в инструкции add_executable и которое следует после имени пакета при запуске узла). respawn="true" означает что узел будет автоматически перезапущен после завершения. Аналогичная команда для запуска узла выглядит так
rosrun turtlesim turtlesim_node
Мы можем с помощью тега node запустить проигрывание rosbag файла
<node pkg="rosbag" type="play" name="player" output="screen" args="-l --hz=10 /home/vlad/Downloads/rgbd_dataset_freiburg1_rpy-2hz-with-pointclouds.bag"/>
Эта инструкция аналогична команде:
rosbag play -l --hz=10 /home/vlad/Downloads/rgbd_dataset_freiburg1_rpy-2hz-with-pointclouds.bag
Внутри тега можно использовать теги remap, param, env и rosparam.
Тег remap позволяет задать алиас (псевдоним) для топика. Благодаря этому тегу узел будет думать что он подписал на топик /topic1 хотя на самом деле он подпишется на топик /topic2. Это может быть удобно когда целевой топик имеет длинное или нестандартное имя. Например, если стандартный топик для получения видеопотока с камеры /usb_cam/image_raw, а мы хотим вместо реальной камеры использовать rosbag файл, который публикует в какой-то свой топик. remap будет выглядеть так
<remap from="~camera_info" to="/image_publisher_1727120104720172865/camera_info" />
Тег param нужен для задания параметров. Пример тега для задания топика:
<param name="topic" value="/camera/depth_registered/points" />
Можно задать булевое значение
<param name="calculate_points_density" type="bool" value="true" />
Можно задать глобальные переменные в теге arg
<arg name="framerate" default="20" />
и потом обращаться к этой переменной в другом теге через $(arg framerate):
<param name="framerate" value="$(arg framerate)" />
Можно импортировать другие launch файлы launch файл с помощью тега include
<include file="$(find pkg-name)/path/filename.launch"/>
Отладка и профилирование launch файлов
Мы можем запустить launch файл в режиме отладки gdb или профилирования с помощью Valgrind.
Чтобы запустить launch файл в режиме отладки gdb нужно добавить атрибут launch-prefix="gdb -ex run --args"в тег node.
Пример launch файла
<launch>
<node name="test_node" pkg="test_slam_metrics" type="test_metrics_node" output="screen" launch-prefix="gdb -ex run --args"/>
</launch>
При запуске launch файла автоматически запустится терминал gdb.
Также можно запустить узел в режиме профилировщика Valgrind. Установим Valgrind и KCachegrind:
sudo apt install valgrind kcachegrind
Теперь добавим атрибут в launch файл:
<launch>
<node name="test_node" pkg="test_slam_metrics" type="test_metrics_node" output="screen" launch-prefix="valgrind --tool=callgrind --callgrind-out-file=outfile"/>
</launch>
Запустим launch файл и получим такой вывод:
Для визуализации данных профилировщика Valgrind запустим KCachegrind
kcachegrind ~/.ros/outfile
Откроется окно программы KCachegrind
В сети можно найти много гайдов по работе с KCachegrind, например вот этот.
В завершение покажу пример реального launch файла для узла драйвера камеры:
<?xml version="1.0" ?>
<launch>
<arg name="name" default="camera_front" />
<arg name="framerate" default="20" />
<arg name="camera_info" default="package://my_cam_driver/ost.yaml" />
<node name="$(arg name)" pkg="my_cam_driver" type="my_cam_driver_node" output="screen">
<param name="framerate" value="$(arg framerate)" />
<param name="camera_info_url" value="$(arg camera_info)" />
</node>
</launch>
Здесь есть несколько глобальных переменных arg, которые используются для параметров узла внутри тега node.
Более подробно можно прочитать о roslaunch на официальной странице. Там также можно найти серию обучающих туториалов.
На этом пока все.