rclcpp::Qos 是一个用于配置 ROS 2 发布者和订阅者质量保证(Quality of Service,QoS)的类。QoS 可以用来配置通信中的一些属性,例如消息传输的可靠性、延迟和带宽等。

在 ROS 2 中,发布者和订阅者可以通过使用 rclcpp::Qos 类来配置其QoS。

通讯需求-三参数

当使用 rclcpp::Qos 类配置 ROS 2 发布者和订阅者的 QoS 时,可以选择不同的 QoS 配置参数,以满足不同的通信需求。下面是一些常用的 QoS 配置参数:

        1.可靠性 (Reliability)

可靠性是指消息传输的可靠程度。在 ROS 2 中,有两种可靠性选项:

  • ReliabilityPolicyKind::BEST_EFFORT:不保证消息的传输,如果有消息丢失,将不会重发。
  • ReliabilityPolicyKind::RELIABLE:保证消息传输,如果有消息丢失,将会重发。

例如,以下代码创建一个发布者,并将其 QoS 配置为可靠性为 RELIABLE

auto publisher = node->create_publisher<std_msgs::msg::String>("my_topic", rclcpp::Qos(rclcpp::ReliabilityPolicyKind::RELIABLE));

        2.延迟 (Latency)

延迟是指消息在发送和接收之间所需的时间。在 ROS 2 中,可以选择以下延迟选项:

  • HistoryPolicyKind::KEEP_LAST:保留最近的一些消息,可以设置保留的消息数。
  • HistoryPolicyKind::KEEP_ALL:保留所有消息,可能会占用大量内存。
  • HistoryPolicyKind::KEEP_LAST + depth:保留最近的 depth 条消息。

例如,以下代码创建一个发布者,并将其 QoS 配置为保留最近的10条消息:

auto publisher = node->create_publisher<std_msgs::msg::String>("my_topic", rclcpp::Qos(rclcpp::KeepLast(10)));

         3.带宽 (Bandwidth)

带宽是指在给定时间内可以传输的消息数量。在 ROS 2 中,可以选择以下带宽选项:

  • ReliabilityPolicyKind::BEST_EFFORT + BandwidthPolicyKind::BEST_EFFORT:不保证带宽。
  • ReliabilityPolicyKind::RELIABLE + BandwidthPolicyKind::RELAXED:尽量提供带宽,但不保证完全可用。
  • ReliabilityPolicyKind::RELIABLE + BandwidthPolicyKind::DEDICATED:保证带宽完全可用。

例如,以下代码创建一个发布者,并将其 QoS 配置为带宽完全可用:

auto publisher = node->create_publisher<std_msgs::msg::String>("my_topic", rclcpp::Qos(rclcpp::ReliabilityPolicyKind::RELIABLE, rclcpp::BandwidthPolicyKind::DEDICATED));

同时配置多参数也可以参考配置带款的代码

这些仅仅是 QoS 配置参数的一部分,实际使用中,可以根据具体的通信需求选择适当的 QoS 配置参数。

同时配置qos的多参数可参考配置带宽的代码。

可以同时使用多个 QoS 配置参数,以满足不同的通信需求。以下是一个示例,展示如何同时使用可靠性、延迟和带宽 QoS 配置参数:

#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp>
int main(int argc, char ** argv) 
{
 // 初始化ROS节点
 rclcpp::init(argc, argv); 
 // 创建节点 
 auto node = std::make_shared<rclcpp::Node>("my_publisher");
 // 配置QoS
 rclcpp::Qos qos(rclcpp::QosInitialization::from_xml_file("/path/to/qos.xml"));
 // 创建发布者,指定消息类型为std_msgs::msg::String 
auto publisher = node->create_publisher<std_msgs::msg::String>("my_topic", qos);
 // ... }

在这个示例中,通过 rclcpp::QosInitialization::from_xml_file() 方法从 XML 文件中加载 QoS 配置参数,并将其传递给 rclcpp::Qos 对象。XML 文件可以包含可靠性、延迟和带宽等多个 QoS 配置参数,例如:

<?xml version="1.0" encoding="UTF-8"?>
<ros_qos_profile>
  <reliability>
    <kind>BEST_EFFORT</kind>
  </reliability>
  <history>
    <kind>KEEP_LAST</kind>
    <depth>10</depth>
  </history>
  <resource_limits>
    <max_samples>100</max_samples>
    <max_instances>1</max_instances>
    <max_samples_per_instance>100</max_samples_per_instance>
  </resource_limits>
</ros_qos_profile>

在这个 XML 文件中,使用了 BEST_EFFORT 可靠性、 KEEP_LAST 延迟和 100 次传输限制。可以根据实际需求修改这些配置参数。最后将 rclcpp::Qos 对象传递给发布者的构造函数,以将 QoS 配置参数应用于发布者。