用c++ 开发,ros2 订阅多个话题,多个节点如何通过多线程处理
时间: 2024-02-09 11:12:29 浏览: 402
C++进行多线程编程
4星 · 用户满意度95%
在ROS2中,可以通过使用多线程来同时处理多个订阅话题和节点的消息。具体来说,可以使用ROS2提供的`rclcpp::executors`模块来实现。
首先,我们需要创建一个`rclcpp::executors::MultiThreadedExecutor`对象,它可以管理多个回调函数和多个订阅者对象。接着,我们可以将订阅者的回调函数添加到这个执行器中,并启动它,让它开始运行。
具体的代码示例:
```cpp
#include <rclcpp/rclcpp.hpp>
#include <rclcpp/executors.hpp>
// 回调函数1
void callback1(const std::shared_ptr<msg1>& msg) {
// 处理msg1消息
}
// 回调函数2
void callback2(const std::shared_ptr<msg2>& msg) {
// 处理msg2消息
}
int main(int argc, char** argv) {
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("my_node");
// 创建订阅者1和2
auto sub1 = node->create_subscription<msg1>("topic1", callback1);
auto sub2 = node->create_subscription<msg2>("topic2", callback2);
// 创建执行器并将订阅者的回调函数添加到执行器中
rclcpp::executors::MultiThreadedExecutor executor;
executor.add_callback_group(node->get_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive));
executor.add_callback_group(sub1->get_callback_group());
executor.add_callback_group(sub2->get_callback_group());
// 启动执行器
executor.spin();
rclcpp::shutdown();
return 0;
}
```
在上面的代码中,我们创建了两个订阅者对象和两个回调函数。然后,我们使用`rclcpp::executors::MultiThreadedExecutor`创建一个执行器,并将订阅者的回调函数添加到执行器中。最后,我们启动执行器并等待消息的到来。当消息到来时,执行器会自动调用相应的回调函数来处理消息。
需要注意的是,我们需要为每个订阅者对象创建一个独立的回调函数。否则,多个订阅者的回调函数会在同一个线程中运行,会导致消息处理速度变慢。
阅读全文