Ros2 qos简介
用于节点之前的数据通信,为了保证数据能够可靠和高校的传输。ROS2提供了一套非常丰富的服务质量(Quality of Service, QoS)策略
Ros2 qos 注意事项
发布器、订阅器、服务端和客户端可以指定Profile,且它们的每个实例都可以单独指定Profile,但不兼容的Profiles可能导致无法通信。
Qos策略
当前,QoS Profile提供了对以下QoS策略的设置:
(1)历史记录(History)
保留近期记录(Keep last):缓存最多N条记录,可通过队列长度选项来配置。
保留所有记录(Keep all):缓存所有记录,但受限于底层中间件可配置的最大资源。
(2)深度(Depth)
队列深度(Size of the queue):只能与Keep last配合使用。
(3)可靠性(Reliability)
尽力的(Best effort):尝试传输数据但不保证成功传输(当网络不稳定时可能丢失数据)。
可靠的(Reliable):反复重传以保证数据成功传输。
(4)持续性(Durability)
局部瞬态(Transient local):发布器为晚连接(late-joining)的订阅器保留数据。
易变态(Volatile):不保留任何数据。
以上每个策略都有系统默认值。这个默认值就是底层中间件的默认值,由DDS供应商工具(如XML配置文件)定义。DDS本身提供了许多可配置的策略。这些策略与ROS1的特征相似,所以在ROS1中是可见的。之后可能会有更多的策略在ROS2中可见。
自定义Ros2 qos 策略
-
c版
-
首先创建一个default_qos.h,添加自定义的策略
#ifndef RCL_ACTION__DEFAULT_QOS_H_
#define RCL_ACTION__DEFAULT_QOS_H_
#ifdef __cplusplus
extern "C"
{
#endif
#include "rmw/types.h"
static const rmw_qos_profile_t rcl_msg_qos_profile_status_default =
{
RMW_QOS_POLICY_HISTORY_KEEP_LAST,
10,
RMW_QOS_POLICY_RELIABILITY_RELIABLE,
RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL,
RMW_QOS_DEADLINE_DEFAULT,
RMW_QOS_LIFESPAN_DEFAULT,
RMW_QOS_POLICY_LIVELINESS_SYSTEM_DEFAULT,
RMW_QOS_LIVELINESS_LEASE_DURATION_DEFAULT,
false
};
#ifdef __cplusplus
}
#endif
#endif
- 第二步把定义好策略赋值到qos的结构体中
int start_msg(rcl_node_t* node, rclc_support_t* support)
{
rcl_node_options_t node_ops = rcl_node_get_default_options();
RCCHECK(rcl_node_init(node, "char_long_sequence_subscriber_rcl", "", &support->context, &node_ops))
rcl_subscription_options_t subscription_ops = rcl_subscription_get_default_options();
rcl_subscription_t subscription = rcl_get_zero_initialized_subscription();
//设置配置好的qos策略
subscription_ops.qos = rcl_msg_qos_profile_status_default;
RCCHECK(rcl_subscription_init(&subscription, node

本文深入探讨了ROS2中的服务质量(QoS)策略,包括历史记录、深度、可靠性及持久性等关键策略,并介绍了如何在C++和Python中自定义QoS策略,以实现高效可靠的数据通信。
最低0.47元/天 解锁文章
7682

被折叠的 条评论
为什么被折叠?



