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

    ROS2中如何同时运行Timer回调函数和订阅消息的回调函数

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    多线程 订阅回调 例行任务 周期任务
    2
    3
    776
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 凌云凌
      凌云
      最后由 编辑

      想要实现一个节点功能:既有timer这样的例行任务,也有回调函数来订阅数据。
      于是我写了:

      类的构造函数中:
      subComm_ = this->create_subscription<std_msgs::msg::UInt8MultiArray>("comm_serial_in", 1, std::bind(&FmtComm::Callback, this, 1));
      timer
      = this->create_wall_timer(30ms, std::bind(&FmtComm::TimerCallbackLoop, this));

      主函数:
      int main(int argc, char * argv[])
      {
      rclcpp::init(argc, argv);
      rclcpp::spin(std::make_shared<FmtComm>());
      rclcpp::shutdown();
      return 0;
      }

      但是测试发现Timer回调函数正常运行,订阅消息的回调函数没有触发。当注释掉创建Timer后,订阅消息的回调函数正常触发。

      我想请教,如何实现我开头说的,在ROS2中既执行例行任务,又可以订阅消息,通过类来实现。感谢。

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

        @凌云 ROS2默认是单线程的,依次调用回调函数,所以在回调函数中不要堵塞,否则另外的就执行不下去了,你的timer周期也很短.
        解决方案可以使用回调组,或者自己单独开线程.

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

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

          @小鱼 这点感觉不如ROS1的spinOnce好用,一般处理数据都是需要订阅数据的同时,定时对数据进行处理和结果发布的。
          那你说的回调组是看官方教程的Demos这一章中Setting up efficient intra-process commnunication这一节吗?
          还是Intermediate一章中的Composing multiple nodes in a single process这一小节?

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