Заметки по ROS: Простое введение в launch файлы

Это вторая из серии статей о робототехнической платформе 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 файле:

Здесь атрибут pkg задает имя пакета. type определяет имя исполняемого файла (имя узла которое мы задаем в CMakeLists.txt в инструкции add_executable и которое следует после имени пакета при запуске узла). respawn=«true» означает что узел будет автоматически перезапущен после завершения. Аналогичная команда для запуска узла выглядит так

rosrun turtlesim turtlesim_node

Мы можем с помощью тега node запустить проигрывание rosbag файла

Эта инструкция аналогична команде:

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 будет выглядеть так

Тег param нужен для задания параметров. Пример тега для задания топика:

Можно задать булевое значение

Можно задать глобальные переменные в теге arg

и потом обращаться к этой переменной в другом теге через $(arg framerate):

Можно импортировать другие launch файлы launch файл с помощью тега include

Отладка и профилирование launch файлов

Мы можем запустить launch файл в режиме отладки gdb или профилирования с помощью Valgrind.

Чтобы запустить launch файл в режиме отладки gdb нужно добавить атрибут launch-prefix=«gdb -ex run --args«в тег node.

Пример launch файла


    
    

При запуске launch файла автоматически запустится терминал gdb.

Также можно запустить узел в режиме профилировщика Valgrind. Установим Valgrind и KCachegrind:

 sudo apt install valgrind kcachegrind

Теперь добавим атрибут в launch файл:


    

Запустим launch файл и получим такой вывод:

41e31ca69f0bc5ca7e98fd164f304d61.png

Для визуализации данных профилировщика Valgrind запустим KCachegrind

 kcachegrind ~/.ros/outfile

Откроется окно программы KCachegrind

В сети можно найти много гайдов по работе с KCachegrind, например вот этот.

В завершение покажу пример реального launch файла для узла драйвера камеры:




    
    
    

    
        
        
    

Здесь есть несколько глобальных переменных arg, которые используются для параметров узла внутри тега node.

Более подробно можно прочитать о roslaunch на официальной странице. Там также можно найти серию обучающих туториалов.

На этом пока все.

© Habrahabr.ru