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 и провести его настройку.