Skip to content

Справка: политики и профили QoS ​

Профиль QoS (Quality of Service) — набор политик доставки для одной конечной точки: издателя, подписчика, сервера или клиента сервиса. Лекция 06 разбирает три главные политики на графике; здесь собраны все остальные, правила совместимости и готовые профили. Полное описание — в официальной статье ROS 2 о QoS.

Политики ​

ПолитикаЗначенияЧто решаетУчаствует в совместимости
Historykeep last, keep allсколько сообщений хранитьнет: очередь локальна
Depthчисло Nразмер очереди при keep lastнет
Reliabilityreliable, best effortповторять ли потерянные сообщенияда
Durabilityvolatile, transient localотдавать ли прошлое позднему подписчикуда
Deadlineдлительностьмаксимальный интервал между сообщениямида
Lifespanдлительностьчерез сколько сообщение считается устаревшим; просроченное отбрасывается без ошибкинет
Livelinessautomatic, manual by topicкак система узнаёт, что издатель живда
Lease durationдлительностьсколько издатель может молчать до потери livelinessда

У политик без длительности есть значение system default (берётся из middleware). Длительность default означает «не задана», обычно это бесконечность. Depth учитывается только при keep last.

Совместимость: запрос не строже предложения ​

Издатель предлагает профиль, подписчик запрашивает. Соединение возникает, только если по каждой политике запрос не строже предложения. Если хотя бы одна политика несовместима, сообщения не передаются, хотя имя и тип топика совпадают.

ПолитикаКогда совместимоНесовместимая пара
Reliabilityиздатель reliable подходит любому подписчику; best effort — только best effortbest effort → reliable
Durabilityиздатель transient local подходит любому; volatile — только volatilevolatile → transient local
Deadlineподписчик просит интервал не короче предложенного (y ≥ x)издатель без deadline, подписчик с ним; y < x
Livelinessиздатель manual by topic подходит любому; automatic — только automaticautomatic → manual by topic
Lease durationтак же, как у Deadlineтак же, как у Deadline

Чтобы тема была «защёлкнутой» и позднему подписчику отдавалась история, издатель и подписчик оба должны использовать transient local. Несколько подписчиков с разными запросами могут быть подключены к одному издателю одновременно.

Готовые профили ​

Чтобы не задавать все политики вручную, ROS 2 предлагает готовые профили. Значения основных в Python (rclpy.qos):

ПрофильHistory, depthReliabilityDurabilityДля чего
qos_profile_defaultkeep last, 10reliablevolatileиздатели и подписчики по умолчанию
qos_profile_sensor_datakeep last, 5best effortvolatileизмерения: свежесть важнее полноты
qos_profile_services_defaultkeep last, 10reliablevolatileсервисы
qos_profile_parameterskeep last, 1000reliablevolatileпараметры: запросы не должны теряться
qos_profile_parameter_eventskeep last, 1000reliablevolatileсобытия изменения параметров
qos_profile_action_status_defaultkeep last, 1reliabletransient localстатус действий
qos_profile_system_defaultзначения RMW——поведение определяет middleware, у разных RMW оно может различаться

Для сервисов важна именно volatile: иначе перезапущенный сервер получит устаревшие запросы. В C++ те же профили доступны как rclcpp::SensorDataQoS(), rclcpp::ServicesQoS() и другие. В курсе вы встретите три характерных выбора: поток измерений — best effort, /tf_static — reliable и transient local, команды — reliable.

python
from rclpy.qos import qos_profile_sensor_data, QoSProfile, ReliabilityPolicy

sub = node.create_subscription(Pose, 'sensor_pose', callback, qos_profile_sensor_data)
custom = QoSProfile(depth=10, reliability=ReliabilityPolicy.BEST_EFFORT)

Как посмотреть и изменить QoS в командной строке ​

bash
ros2 topic info /топик --verbose          # профиль каждой конечной точки
ros2 topic echo /топик --qos-profile sensor_data
ros2 topic echo /топик --qos-reliability reliable --qos-durability transient_local
ros2 bag play запись --qos-profile-overrides-path config/qos-overrides.yaml

Флаги --qos-profile, --qos-depth, --qos-history, --qos-reliability, --qos-durability, --qos-liveliness есть у ros2 topic echo и ros2 topic pub. Без явных флагов ros2 topic echo подбирает профиль под найденных издателей, поэтому для проверки несовместимости задавайте политику явно.

События QoS ​

Если профили несовместимы, издатель и подписчик получают события offered incompatible QoS и requested incompatible QoS: именно из них появляется предупреждение в логе, которое вы видели в ПР05. Аналогичные события есть для deadline (deadline missed) и liveliness (liveliness lost, liveliness changed). Обработчики этих событий можно передать при создании издателя или подписчика.

Учебные материалы: CC BY 4.0 · Код: Apache-2.0