Параметры узлов

Чтобы менять поведение узла без перекомпиляции, в ROS есть параметры.

Параметр (parameter) — именованная настройка узла (число, строка, флаг), которую можно задать при запуске или изменить в работе, не трогая код.

Зачем нужны параметры

Жёстко зашивать значения в код — плохо. Максимальная скорость робота, порог обнаружения препятствия, частота публикации — всё это хочется настраивать под конкретную площадку или эксперимент, не пересобирая узел. Параметры дают именно это: один и тот же узел крутится на разных роботах с разными настройками, заданными снаружи.

Объявление и чтение в узле

Код узла — language-text:

class DriveForward(Node):
    def __init__(self):
        super().__init__('drive_forward')
        # объявить параметр со значением по умолчанию
        self.declare_parameter('max_speed', 0.2)
        # прочитать текущее значение
        speed = self.get_parameter('max_speed').value
        self.get_logger().info(f'Скорость: {speed} м/с')

Управление с консоли

# все параметры узла
ros2 param list /drive_forward

# прочитать значение
ros2 param get /drive_forward max_speed

# изменить на лету
ros2 param set /drive_forward max_speed 0.5

Вывод (param get):

Double value is: 0.2

Параметры из YAML

Когда параметров много, их выносят в YAML-файл и загружают при запуске узла. Это удобно для разных конфигураций (дом, склад, симуляция):

drive_forward:
  ros__parameters:
    max_speed: 0.5
    safe_distance: 0.3
    publish_rate: 10.0
ros2 run my_robot drive_forward --ros-args --params-file config.yaml

Реакция на изменение

Узел может не просто читать параметр на старте, но и реагировать на его изменение в работе через колбэк. Тогда, поменяв max_speed командой ros2 param set, вы мгновенно меняете поведение едущего робота — мощный инструмент настройки и отладки на ходу.

Как работает под капотом

Параметры — это часть состояния узла, доступная другим через стандартные сервисы (get/set/list параметров автоматически создаются для каждого узла). Когда вы пишете ros2 param set, инструмент вызывает сервис изменения параметра у нужного узла. Параметры строго типизированы: объявив max_speed как double со значением 0.2, вы не сможете присвоить ему строку — ROS отвергнет несовместимый тип. Это защищает от случайных ошибок конфигурации.

Частые ошибки

  • Читать параметр без declare_parameter. Незаявленный параметр недоступен и вызовет ошибку.
  • Путать тип. 0.2 — double, а 2 — integer; несовпадение типа при set отклоняется.
  • Хардкодить значения «временно». Это «временно» остаётся навсегда; сразу выносите настройки в параметры.

Итоги

  • Параметры настраивают узел без правки кода.
  • Объявляют через declare_parameter, читают через get_parameter.
  • Меняют командой ros2 param set или загружают из YAML.
  • Параметры строго типизированы и могут меняться на лету.
Проверьте себя
1. Зачем нужны параметры узлов?
AЧтобы ускорить процессор
BЧтобы настраивать поведение узла без правки и пересборки кода
CЧтобы создавать топики
DЧтобы заменить сервисы
2. Каким методом объявляют параметр в узле?
Acreate_publisher
Bdeclare_parameter
Cset_parameter_value
Dadd_param
3. Что произойдёт при попытке присвоить параметру значение неверного типа?
AТип молча изменится
BROS отвергнет несовместимый тип
CУзел упадёт без сообщения
DЗначение обнулится