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

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

Комментарии (0)