Server parameters

На этом уроке мы столкнемся с новой для нас темой - Сервер Параметров (Parameter Server).

Сервер параметров проще всего описать как некоторое сетевое хранилище, где можно хранить переменные, которые мы хотим использовать в наших программах.

Например, если в программе есть какая-либо настройка (например максимальная скорость движения), то нам удобно хранить эти настройки в одном месте. Таким образом можем довольно просто разобраться, какие настройки есть у каких программ и какие у этих настроек текущие значения. Также для изменения настроек нам не нужно менять код программы, а достаточно изменить параметры на сервере.

Сервер параметров может хранить только простые переменные, числа, строки и тп. Он не создан для хранения сложных типов данных, например сообщений ROS.

Для работы с параметрами есть удобная консольная утилита rosparam

rosparam list: Получить список параметров
rosparam get parameter: Прочитать значение параметра
rosparam set parameter value: Установить значение параметра
rosparam delete parameter: Удалить значение параметра
rosparam dump file: Сохранить все переменные в файл 
rosparam load file: Восстановить переменные из файла

Использование параметров в программах

Библиотека rospy имеет все необходимые методы для работы с Сервером параметров.

Рассмотрим простой пример

import rospy

rospy.init_node('params_demo')
default_param = "some_value"

try:
    my_param = rospy.get_param("~my_param")
except KeyError as e:
    my_param = default_param
    rospy.set_param("~my_param", my_param)

print(my_param)

Знак "~" в названии параметра означает, что параметр "приватный" и принадлежит конкретной ноде.

В этой программе мы "пытаемся" получить значение параметра my_params, если у нас не получилось (параметра пока нет на сервере), то мы сохраняем параметр на сервере со значением по умолчанию.

При запуске программы мы увидим вывод строчки some_value, что является значением по умолчанию.

Получим список параметров

rosparam list  

/params_demo/my_param
/rosdistro
/roslaunch/uris/host_ubuntu__33259
/rosversion
/run_id

Мы видим, что параметр my_param появился в списке. При этом полный адрес параметра начинается с /params_demo, что является названием ноды.

Прочитаем его и убедимся, что параметр содержит установленное значение.

rosparam get /params_demo/my_param

some_value

Поменяем значение

rosparam set /params_demo/my_param other_value

Запустим наш скрипт и убедимся, что в python мы получили новое значение, а не значение по умолчанию.

python params.py                  
other_value

Также можно использовать конструкцию получения параметров со значением по умолчанию

default_param = rospy.get_param('default_param', 'default_value')

Тогда если параметр будет найден на сервере, то мы получим значение с сервера, а если нет, значение по умолчанию. Но у такого способа есть небольшой минус: параметр не сохранится на сервере, поэтому мы не сможем найти его командой rosparam list. Но если мы знаем имя, мы можем использовать rosparam set/get и провести его настройку.

results matching ""

    No results matching ""