Это четвертая из серии статей о робототехнической платформе ROS. Первую статью можно найти здесь. В предыдущей статье я рассказывал о параметрах в ROS. В этой статье я расскажу о том как можно динамически управлять параметрами в ROS с помощью dynamic_reconfigure . Кому интересно прошу под кат.
Пакет dynamic_reconfigure позволяет изменять параметры, которые хранятся на Parameter server в рантайме. Он отвечает за отправку нового значения параметра на сервер параметров и оперативное уведомление всех узлов, которые используют это параметр. Таким образом наш узел узнает об изменениях значения параметра без необходимости его перезапуска.
Например, у нас может быть GUI приложение, которое позволяет настраивать параметры в робототехнической системе. Также dynamic_reconfigure позволяет значительно упростить процесс файнтюнинга параметров с целью поиска оптимальной комбинации значений параметров.
Создание cfg файлов
Для начала нужно научиться создавать cfg файлы.
Перейдем в воркспейс и создадим пакет ROS
cd ~/catkin_ws/src catkin_create_pkg parameter_server_basics std_msgs roscpp rospy dynamic_reconfigure
Скомпилируем воркспейс
cd ~/catkin_ws/ && catkin_make
Теперь нужно создать внутри нашего пакета папку cfg, в которой будут лежат файлы cfg.
Создадим внутри папки cfg новый файл parameter_server_basics.cfg с таким содержимым:
#!/usr/bin/env python3 PACKAGE = "parameter_server_basics" from dynamic_reconfigure.parameter_generator_catkin import * gen = ParameterGenerator() gen.add('hor_angle', int_t, 0, "A horizontal angle", 10, 0, 90) gen.add('status', str_t, 0, "A state of device", "Active") exit(gen.generate(PACKAGE, 'parameter_server_basics', 'parameter_server_'))
Более подробно о синтаксисе файлов cfg можно прочитать здесь.
Если вкратце то с помощью метода add() мы добавляем параметр. Метод принимает следующие аргументы: название, тип, битовую маску level которая используется в колбеке (здесь обсуждают этот аргумент), описание параметра, значение по умолчанию. Последние два параметры в данном случае для численных типов это минимальное и максимальное значения.
Сделаем файл исполняемым:
chmod +x parameter_server_basics.cfg
Добавим такие строки в файл CMakeLists.txt:
#add dynamic reconfigure api #find_package(catkin REQUIRED dynamic_reconfigure) generate_dynamic_reconfigure_options( cfg/parameter_server_basics.cfg #... )
и такую строку в самый конец файла:
add_dependencies(parameter_server_basics ${PROJECT_NAME}_gencfg)
Теперь добавим узел который будет использовать файл cfg. Создадим файл parameter_server_basics.cpp в папке src:
#include <ros/ros.h> #include <dynamic_reconfigure/server.h> #include <parameter_server_basics/parameter_server_Config.h> void callback(parameter_server_basics::parameter_server_Config &config, uint32_t level) { ROS_INFO("Reconfigure Request: %d %s", config.hor_angle, config.status.c_str()); } int main(int argc, char* argv[]) { ros::init(argc, argv, "parameter_server_basics"); dynamic_reconfigure::Server<parameter_server_basics::parameter_server_Config> server; dynamic_reconfigure::Server<parameter_server_basics::parameter_server_Config>::CallbackType f; f = boost::bind(&callback, _1, _2); server.setCallback(f); ROS_INFO("Spinning node"); ros::spin(); return 0; }
Теперь добавим узел в конец файла CMakeLists.txt:
add_executable(parameter_server_basics src/parameter_server_basics.cpp) target_link_libraries(parameter_server_basics ${catkin_LIBRARIES})
Нам нужно сделать так чтобы узел rqt_reconfigure запускался с Python 3.
Выполним команду:
sudo ln -s /usr/bin/python3 /usr/bin/python
Соберем воркспейс и запустим узел:
cd ~/catkin_ws && catkin_make
Запустим наш узел:
rosrun parameter_server_basics parameter_server_basics
В другом терминале запустим rqt_reconfigure
rosrun rqt_reconfigure rqt_reconfigure
Мы увидим приложение

Изменим значение для параметра hor_angle или статус и получим такой вывод в терминале с запущенным узлом:

Теперь у вас есть простой способ легко настраивать параметры и все узлы, которые используют эти параметры будут автоматически осведомлены. На этом все.
