当前位置:   article > 正文

ROS2多线程 MultiThreadedExecutor_ros2 多线程执行器

ros2 多线程执行器

参考文章:

ROS2探索(二)executor_rclcpp::executors::multithreadedexecutor-CSDN博客

情景:

  • 当一个ROS节点中含有多个回调函数时,默认创建的回调函数时互斥的,也就是说一次只能执行一个,无法同时运行。
  • 当一个main中需要创建两个节点,并运行时。

多线程运行多个节点:

  1. int main(int argc, char * argv[])
  2. {
  3. rclcpp::init(argc, argv);
  4. rclcpp::executors::MultiThreadedExecutor executor;
  5. auto pubnode = std::make_shared<PublisherNode>();
  6. auto subnode = std::make_shared<DualThreadedNode>();
  7. executor.add_node(pubnode);
  8. executor.add_node(subnode);
  9. executor.spin();
  10. rclcpp::shutdown();
  11. return 0;
  12. }

  多线程处理回调函数:

  1. rclcpp::CallbackGroup::SharedPtr callback_group_subscriber_;
  2. rclcpp::Subscription<sensor_msgs::msg::Imu>::SharedPtr imu_sub_;
  3. rclcpp::Subscription<sensor_msgs::msg::PointCloud2>::SharedPtr point_cloud_sub_;
  4. // 创建回调组。
  5. //Reentrant表示可以同时处理多个回调函数,MutuallyExclusive表示此组的回调函数是互斥的。
  6. callback_group_subscriber_ = create_callback_group(rclcpp::CallbackGroupType::Reentrant);
  7. auto sub_opt = rclcpp::SubscriptionOptions();
  8. sub_opt.callback_group = callback_group_subscriber_;
  9. // 订阅IMU消息
  10. imu_sub_ = create_subscription<sensor_msgs::msg::Imu>(
  11. params_.imuTopic, 2000, std::bind(&OnlineMapping::imuCallback, this, std::placeholders::_1), sub_opt);
  12. // 订阅lidar消息
  13. point_cloud_sub_ = create_subscription<sensor_msgs::msg::PointCloud2>(
  14. params_.pointCloudTopic, 1, std::bind(&OnlineMapping::pointCloud2Callback, this, std::placeholders::_1), sub_opt);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/797783
推荐阅读