Заметки по ROS: параметры и Parameter server
Это третья из серии статей о робототехнической платформе ROS. Первую статью можно найти здесь. В этой статье я расскажу о параметрах и Parameter server в ROS. Кому интересно прошу под кат.
Параметры в ROS позволяют гибко настраивать поведение узлов ROS без изменения их кода. Мы можем запускать наш узел указав конкретные значения параметров и узел будет выполняться с учетом новых значений. Например, можно задать топик на который мы подпишемся и будем получать сообщения (вместо реальной камеры мы можем получать изображения из rosbag файла).
Параметры в ROS сохраняются в Parameter server.
Для работы с параметрами в ROS есть специальная утилита rosparam.
Чтобы получить список параметров выполним команду:
rosparam list
При запущенном turtlesim мы увидим что-то подобное
Чтобы установить значение параметра нужна команда
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
Результат должен быть таким
Мы увидим новые параметры в списке.
Команда «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 вы можете узнать здесь и здесь.