ROS2 humble接收回调函数延迟进入的问题
-
环境:ubuntu22.04 + humble
发布:启动时读取rosbag中的100条点云数据到内存中(只读取一次),通过按照4HZ频率发送;
订阅:订阅回调不处理数据,只打印两次进入回调的时间间隔(4HZ理论上间隔为250ms)
问题:遇到两次回调间隔概率性出现超过250ms,达到1s甚至2s;如下面日志图片
现象:从日志图片看,进入回调间隔2251ms后,后续马上0ms间隔处理完队列中对接的数据。
void start_publishers() { for (auto& [name, topic] : topics_) { auto qos = rclcpp::QoS( rclcpp::QoSInitialization(RMW_QOS_POLICY_HISTORY_KEEP_LAST, 40)); qos.reliability(RMW_QOS_POLICY_RELIABILITY_RELIABLE); qos.durability(RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL); // 创建发布者 if (topic.type == "pointcloud") { topic.publisher = this->create_publisher<sensor_msgs::msg::PointCloud2>(name, qos); } else if (topic.type == "feedback_status") { topic.publisher = this->create_publisher<ros_sms_msgs::msg::FeedbackStatus>(name, qos); } // 计算发布周期(毫秒) auto period_ms = std::chrono::milliseconds((int)(1000.0 / topic.frequency)); // 创建定时器,控制发布频率 topic.timer = this->create_wall_timer( period_ms, [this, &topic]() { publish_message(topic); } ); } }SubDifftime(const std::string & topic_name) { // 取topic最后3个字符作为节点名称的一部分 std::string suffix = topic_name.substr(topic_name.length() - 3); std::string node_name = "sub_difftime_" + suffix; node_ = std::make_shared<rclcpp::Node>(node_name); auto qos = rclcpp::QoS( rclcpp::QoSInitialization(RMW_QOS_POLICY_HISTORY_KEEP_LAST, 40)); qos.reliability(RMW_QOS_POLICY_RELIABILITY_RELIABLE); subscriber_ = node_->create_subscription<sensor_msgs::msg::PointCloud2>( topic_name, qos, // 使用自定义QoS配置 std::bind(&SubDifftime::callback, this, std::placeholders::_1) ); RCLCPP_INFO(node_->get_logger(), "Subscribing to topic: %s", topic_name.c_str()); #if 1 rclcpp::executors::MultiThreadedExecutor executor(rclcpp::ExecutorOptions(), 12); executor.add_node(node_); while (rclcpp::ok()) { executor.spin_once(std::chrono::milliseconds(10)); // 每次阻塞10ms,检查是否有新消息 // 或直接 executor.spin(); (完全阻塞,直到节点退出) } executor.remove_node(node_); #else rclcpp::spin(node_); #endif }; -
W wangmiao900618 将这个主题转为问答主题,在
-
@wangmiao900618 什么中间件
-
@wangmiao900618 单个数据多大
-
@小鱼 你好!
中间件:默认的 fastdds (如图)
数据大小:898560Byte,大概877.5KB,点云数据。

-
@小鱼 你好,
我做了新的尝试,将FastDDS改成强制UDP通信,用wireshark抓包,也有同样现象。
从抓到包的日志看**,ROS2发送的数据存在延迟发出**,wireshark接收到的包就存在延时,延时之后收到连续的几包。
详细日志如下:
1) 日志中在10-22 14:39:02.549559时间出现问题
[INFO] [1761115142.558019205] [subscriber_thread_node_9303776749428128748]: [10-22 14:39:02.549559][TID-140593497855552]!!!sub1 sub_callback_time: 509ms, Size=898560

2)wireshark抓包发现,在2025-10-22 06:39:02.557394522 连续收到2个包;(小时为06,是wireshark显示异常,分钟和秒是对应上的)
2025-10-22 06:39:02.571319420收到的是另一个主题sub6的数据

3)为了证实确实少发了,通过wireshark查看上一个250ms的时间点2025-10-22 06:39:02.323376345
只有一次数据发送

4)再通过wireshark查看上上个250ms的时间点2025-10-22 06:39:02.046650514 和 2025-10-22 06:39:02.058843368 ,在12ms收到了2帧数据(sub1和sub6)
