Параметры узлов
Чтобы менять поведение узла без перекомпиляции, в 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.0ros2 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.
- Параметры строго типизированы и могут меняться на лету.