Appearance
Справка: политики и профили QoS
Профиль QoS (Quality of Service) — набор политик доставки для одной конечной точки: издателя, подписчика, сервера или клиента сервиса. Лекция 06 разбирает три главные политики на графике; здесь собраны все остальные, правила совместимости и готовые профили. Полное описание — в официальной статье ROS 2 о QoS.
Политики
| Политика | Значения | Что решает | Участвует в совместимости |
|---|---|---|---|
| History | keep last, keep all | сколько сообщений хранить | нет: очередь локальна |
| Depth | число N | размер очереди при keep last | нет |
| Reliability | reliable, best effort | повторять ли потерянные сообщения | да |
| Durability | volatile, transient local | отдавать ли прошлое позднему подписчику | да |
| Deadline | длительность | максимальный интервал между сообщениями | да |
| Lifespan | длительность | через сколько сообщение считается устаревшим; просроченное отбрасывается без ошибки | нет |
| Liveliness | automatic, manual by topic | как система узнаёт, что издатель жив | да |
| Lease duration | длительность | сколько издатель может молчать до потери liveliness | да |
У политик без длительности есть значение system default (берётся из middleware). Длительность default означает «не задана», обычно это бесконечность. Depth учитывается только при keep last.
Совместимость: запрос не строже предложения
Издатель предлагает профиль, подписчик запрашивает. Соединение возникает, только если по каждой политике запрос не строже предложения. Если хотя бы одна политика несовместима, сообщения не передаются, хотя имя и тип топика совпадают.
| Политика | Когда совместимо | Несовместимая пара |
|---|---|---|
| Reliability | издатель reliable подходит любому подписчику; best effort — только best effort | best effort → reliable |
| Durability | издатель transient local подходит любому; volatile — только volatile | volatile → transient local |
| Deadline | подписчик просит интервал не короче предложенного (y ≥ x) | издатель без deadline, подписчик с ним; y < x |
| Liveliness | издатель manual by topic подходит любому; automatic — только automatic | automatic → manual by topic |
| Lease duration | так же, как у Deadline | так же, как у Deadline |
Чтобы тема была «защёлкнутой» и позднему подписчику отдавалась история, издатель и подписчик оба должны использовать transient local. Несколько подписчиков с разными запросами могут быть подключены к одному издателю одновременно.
Готовые профили
Чтобы не задавать все политики вручную, ROS 2 предлагает готовые профили. Значения основных в Python (rclpy.qos):
| Профиль | History, depth | Reliability | Durability | Для чего |
|---|---|---|---|---|
qos_profile_default | keep last, 10 | reliable | volatile | издатели и подписчики по умолчанию |
qos_profile_sensor_data | keep last, 5 | best effort | volatile | измерения: свежесть важнее полноты |
qos_profile_services_default | keep last, 10 | reliable | volatile | сервисы |
qos_profile_parameters | keep last, 1000 | reliable | volatile | параметры: запросы не должны теряться |
qos_profile_parameter_events | keep last, 1000 | reliable | volatile | события изменения параметров |
qos_profile_action_status_default | keep last, 1 | reliable | transient 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). Обработчики этих событий можно передать при создании издателя или подписчика.