*`Updated: 2023/08/08`* ## Block Diagram ![fig_1](https://i.imgur.com/vGmvoFp.jpg) ## QoS Update Detail The QoS update process can be simply separated in three steps: 1. Get update signal from QoS server via topic 2. Send request to QoS server to get `topic name`'s QoS profile 3. Response QoS profile for `topic name` and update QoS For **initial state** QoS setting, **ignore** first step and request QoS profile just once. Otherwise, for **dynamic QoS updating**, several rules need to be followed: 1. The QoS server must have a QoS ID (`qid`) to describe the current status of all QoS profile settings, and the `qid` must be unique. The `qid` changes **if and only if** some of QoS profile changes. 2. The QoS publisher (server side) sends QoS ID (`qid`) and string array (`topic_table`) as the update signal. The `topic_table` shows the specific topics which QoS profile had been changed, and `qid` describes the whole current QoS profiles in QoS server. Subscriber (client side) can easily identify `qid` to prevent updating the same QoS profile. 3. While the device (client) finished the QoS update process, remember to record the `qid`, the QoS server can also record which client finish the QoS update process, to decrease the publish times. ## Service Interface - File in `vehicle_interfaces/srv/QosReq.srv` ```QosReq.srv # Get topic_name QoS setting string topic_name # Device type corresponds to vehicle_interfaces header DEVTYPE_XXX definitions (preserve) uint8 dev_type --- # response is true if value accepted, otherwise server ignore the request and response false bool response # Unique ID describes current qos profile uint64 qid # Ref to enum rmw_qos_history_policy_t int8 history # Ref to size_t depth int64 depth # Ref to enum rmw_qos_reliability_policy_t int8 reliability # Ref to enum rmw_qos_durability_policy_t int8 durability # Ref to struct rmw_time_t deadline float64 deadline_ms # Ref to struct rmw_time_t lifespan float64 lifespan_ms # Ref to enum rmw_qos_liveliness_policy_t int8 liveliness # Ref to struct rmw_time_t liveliness_lease_duration float64 liveliness_lease_duration_ms ``` ## Topic Interface - File in `vehicle_interfaces/msg/QosUpdate.msg` ```QosUpdate.msg vehicle_interfaces/Header header uint64 qid string[] topic_table ``` ## Rclcpp QoS Members (Additional) - **QoS Profile** ```cpp /* * QoS definition in rclcpp/qos.hpp * QoS private member: rmw_qos_profile_t (rmw/types.h) * */ typedef struct rmw_qos_profile_t { enum rmw_qos_history_policy_t history; size_t depth; enum rmw_qos_reliability_policy_t reliability; enum rmw_qos_durability_policy_t durability; struct rmw_time_t deadline; struct rmw_time_t lifespan; enum rmw_qos_liveliness_policy_t liveliness; struct rmw_time_t liveliness_lease_duration; bool avoid_ros_namespace_conventions; } rmw_qos_profile_t; ``` - **Enumerators in QoS Profile** ```cpp enum rmw_qos_history_policy_t { RMW_QOS_POLICY_HISTORY_SYSTEM_DEFAULT, RMW_QOS_POLICY_HISTORY_KEEP_LAST, RMW_QOS_POLICY_HISTORY_KEEP_ALL, RMW_QOS_POLICY_HISTORY_UNKNOWN }; enum rmw_qos_reliability_policy_t { RMW_QOS_POLICY_RELIABILITY_SYSTEM_DEFAULT, RMW_QOS_POLICY_RELIABILITY_RELIABLE, RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT, RMW_QOS_POLICY_RELIABILITY_UNKNOWN }; enum rmw_qos_durability_policy_t { RMW_QOS_POLICY_DURABILITY_SYSTEM_DEFAULT, RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL, RMW_QOS_POLICY_DURABILITY_VOLATILE, RMW_QOS_POLICY_DURABILITY_UNKNOWN }; enum rmw_qos_liveliness_policy_t { RMW_QOS_POLICY_LIVELINESS_SYSTEM_DEFAULT = 0, RMW_QOS_POLICY_LIVELINESS_AUTOMATIC = 1, RMW_DECLARE_DEPRECATED( RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_NODE, RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_NODE_DEPRECATED_MSG) = 2, // Using `3` for backwards compatibility. RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_TOPIC = 3, RMW_QOS_POLICY_LIVELINESS_UNKNOWN = 4 }; ```