鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    ROS2 humble接收回调函数延迟进入的问题

    已定时 已固定 已锁定 已移动 未解决
    ROS 2相关问题
    ros2 humble 延时高 回调函数
    2
    5
    1.7k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • W
      wangmiao900618
      最后由 wangmiao900618 编辑

      环境:ubuntu22.04 + humble
      发布:启动时读取rosbag中的100条点云数据到内存中(只读取一次),通过按照4HZ频率发送;
      订阅:订阅回调不处理数据,只打印两次进入回调的时间间隔(4HZ理论上间隔为250ms)
      问题:遇到两次回调间隔概率性出现超过250ms,达到1s甚至2s;如下面日志图片

      0a992584-d048-485e-b195-0cc4d6a47878-image.png

      现象:从日志图片看,进入回调间隔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
          };
      
      小鱼小 2 条回复 最后回复 回复 引用 0
      • W wangmiao900618 将这个主题转为问答主题,在
      • 小鱼小
        小鱼 技术大佬 @wangmiao900618
        最后由 编辑

        @wangmiao900618 什么中间件

        新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

        1 条回复 最后回复 回复 引用 0
        • 小鱼小
          小鱼 技术大佬 @wangmiao900618
          最后由 编辑

          @wangmiao900618 单个数据多大

          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

          W 2 条回复 最后回复 回复 引用 0
          • W
            wangmiao900618 @小鱼
            最后由 编辑

            @小鱼 你好!
            中间件:默认的 fastdds (如图)
            数据大小:898560Byte,大概877.5KB,点云数据。
            da7dd2c1-24e4-4408-af58-9d1673f0b569-image.png

            1 条回复 最后回复 回复 引用 0
            • W
              wangmiao900618 @小鱼
              最后由 编辑

              @小鱼 你好,

              我做了新的尝试,将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
              Screenshot from 2025-10-22 15-00-48.png
              2)wireshark抓包发现,在2025-10-22 06:39:02.557394522 连续收到2个包;(小时为06,是wireshark显示异常,分钟和秒是对应上的)
              2025-10-22 06:39:02.571319420收到的是另一个主题sub6的数据
              Screenshot from 2025-10-22 15-07-49.png
              3)为了证实确实少发了,通过wireshark查看上一个250ms的时间点2025-10-22 06:39:02.323376345
              只有一次数据发送
              Screenshot from 2025-10-22 15-12-51.png
              4)再通过wireshark查看上上个250ms的时间点2025-10-22 06:39:02.046650514 和 2025-10-22 06:39:02.058843368 ,在12ms收到了2帧数据(sub1和sub6)
              Screenshot from 2025-10-22 15-14-33.png

              1 条回复 最后回复 回复 引用 0
              • 第一个帖子
                最后一个帖子
              皖ICP备16016415号-7
              Powered by NodeBB | 鱼香ROS