如何通过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; }
使用说明
- 编译时确保在
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})
- 运行节点后,就能看到目标话题的所有发布者QoS配置,你可以直接将这些参数应用到你的订阅器中,解决QoS不兼容的警告。
关键提示
- 如果话题当前没有活跃的发布者,
get_publishers_info_by_topic会返回空列表,此时可以考虑添加等待逻辑,或者检查话题名称是否正确。 - 若同一话题有多个发布者,它们的QoS可能不同,你需要选择能匹配所有发布者的QoS配置,或者根据需求选择对应发布者的配置进行订阅。
内容的提问来源于stack exchange,提问作者Flabala
相关产品推荐
相关产品推荐

