Заметки по ROS: параметры и Parameter server

Это третья из серии статей о робототехнической платформе ROS. Первую статью можно найти здесь. В этой статье я расскажу о параметрах и Parameter server в ROS. Кому интересно прошу под кат.

Параметры в ROS позволяют гибко настраивать поведение узлов ROS без изменения их кода. Мы можем запускать наш узел указав конкретные значения параметров и узел будет выполняться с учетом новых значений. Например, можно задать топик на который мы подпишемся и будем получать сообщения (вместо реальной камеры мы можем получать изображения из rosbag файла).

Параметры в ROS сохраняются в Parameter server.

Для работы с параметрами в ROS есть специальная утилита rosparam.

Чтобы получить список параметров выполним команду:

rosparam list

При запущенном turtlesim мы увидим что-то подобное

0956f350b05dcdc5a5a70eb567c00fb7.png

Чтобы установить значение параметра нужна команда

rosparam set parameter value

Чтобы получить значение параметра нужна команда rosparam set

rosparam set parameter

Например мы можем изменить цвет фона в приложении turtlesim:

rosparam set /background_b 255

Чтобы увидеть результат выполним команду:

rosservice call /clear

Мы увидим обновленный цвет фона

Также параметры можно читать и записывать в файл. Для записи параметров используется популярный формат YAML.

Создадим файл my_params.yaml с несколькими параметрами:

text: "Hello"
number_int: 42

Теперь загрузим параметры из этого файла в нашу среду ROS:

rosparam load my_params.yaml

Выведем список параметров

rosparam list

Результат должен быть таким

d4c1aae29d9c5ed4825b0fc76c98535a.png

Мы увидим новые параметры в списке.

Команда «rosparam get /text» выведет «Hello».

Чтобы сохранить параметры в файл можно использовать команду rosparam dump

rosparam dump my_params.yaml

Кроме того с параметрами ROS можно работать из кода на C++ и Python.

Например вот код для установки параметра на C++:

ros::NodeHandle nh;
nh.setParam("/global_param", 5);
nh.setParam("relative_param", "my_string");
nh.setParam("bool_param", false);

или вот так:

ros::param::set("/global_param", 5);

Аналогичный код на Python:

rospy.set_param('/global_param', 5)

Получить параметр на C++:

ros::NodeHandle nh;
double number_to_get;
nh.getParam("/custom_prefix/number_float", number_to_get);

или на Python:

rospy.get_param("/custom_prefix/number_float")

Более подробно о методах API по работе с параметрами можно посмотреть на официальной странице.

На этом все. Подробнее о параметрах и Parameter Server вы можете узнать здесь и здесь.

© Habrahabr.ru