You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过rclcpp根据话题名称获取ROS2话题的QoS配置?

在rclcpp中获取ROS2话题的QoS配置

完全可以通过rclcpp代码实现类似ros2 topic info /my_topic_name --verbose的功能,直接获取话题的QoS配置,解决订阅时的不兼容问题。

实现思路

ROS2的rclcpp节点提供了get_publishers_info_by_topic方法,能获取指定话题下所有发布者的QoS配置信息,包括你遇到的可靠性(RELIABILITY)策略等关键参数。

代码示例

#include "rclcpp/rclcpp.hpp"

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("qos_info_retriever");

  const std::string topic_name = "/my_topic_name";
  // 获取话题的发布者信息,第二个参数表示是否包含未匹配的订阅者/发布者
  auto publishers_info = node->get_publishers_info_by_topic(topic_name, true);

  if (publishers_info.empty()) {
    RCLCPP_WARN(node->get_logger(), "No publishers found on topic: %s", topic_name.c_str());
    rclcpp::shutdown();
    return 0;
  }

  RCLCPP_INFO(node->get_logger(), "QoS info for topic: %s", topic_name.c_str());
  for (const auto & info : publishers_info) {
    const auto & qos_profile = info.qos_profile();
    RCLCPP_INFO(node->get_logger(), "Publisher %s:", info.node_name().c_str());
    // 输出可靠性策略
    std::string reliability = qos_profile.reliability() == RMW_QOS_POLICY_RELIABILITY_RELIABLE 
                              ? "RELIABLE" : "BEST_EFFORT";
    RCLCPP_INFO(node->get_logger(), "  Reliability: %s", reliability.c_str());
    // 输出持久性策略
    std::string durability = qos_profile.durability() == RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL
                              ? "TRANSIENT_LOCAL" : "VOLATILE";
    RCLCPP_INFO(node->get_logger(), "  Durability: %s", durability.c_str());
    // 输出历史记录策略和队列深度
    std::string history = qos_profile.history() == RMW_QOS_POLICY_HISTORY_KEEP_LAST
                          ? "KEEP_LAST" : "KEEP_ALL";
    RCLCPP_INFO(node->get_logger(), "  History: %s, Depth: %zu", history.c_str(), qos_profile.depth());
    // 可根据需要输出更多QoS参数,比如 deadline、lifespan等
  }

  rclcpp::shutdown();
  return 0;
}

使用说明

  1. 编译时确保在CMakeLists.txt中链接rclcpp库:
find_package(rclcpp REQUIRED)
add_executable(qos_info_retriever src/qos_info_retriever.cpp)
ament_target_dependencies(qos_info_retriever rclcpp)
install(TARGETS qos_info_retriever DESTINATION lib/${PROJECT_NAME})
  1. 运行节点后,就能看到目标话题的所有发布者QoS配置,你可以直接将这些参数应用到你的订阅器中,解决QoS不兼容的警告。

关键提示

  • 如果话题当前没有活跃的发布者,get_publishers_info_by_topic会返回空列表,此时可以考虑添加等待逻辑,或者检查话题名称是否正确。
  • 若同一话题有多个发布者,它们的QoS可能不同,你需要选择能匹配所有发布者的QoS配置,或者根据需求选择对应发布者的配置进行订阅。

内容的提问来源于stack exchange,提问作者Flabala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:03:25