ros2中一个节点同时订阅两个话题,怎样是它们的时间同步,C++代码
时间: 2024-04-17 15:24:54 浏览: 521
在ROS 2中,可以使用`message_filters`库来现多个话题的时间同步。以下是一个示例的C++代码,展示了如何同时订阅两个话题并进行时间同步:
```cpp
#include <rclcpp/rclcpp.hpp>
#include <message_filters/subscriber.h>
#include <message_filters/time_synchronizer.h>
#include <sensor_msgs/msg/image.h>
#include <sensor_msgs/msg/laser_scan.h>
using namespace std::placeholders;
void callback(const sensor_msgs::msg::Image::ConstSharedPtr& image_msg,
const sensor_msgs::msg::LaserScan::ConstSharedPtr& laser_msg)
{
// 这里是回调函数,接收到两个话题的数据后进行处理
// image_msg 是 sensor_msgs/Image 消息类型的数据
// laser_msg 是 sensor_msgs/LaserScan 消息类型的数据
// 在这里进行时间同步后的处理逻辑
// ...
}
int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("time_sync_node");
// 创建两个订阅器,分别用来订阅两个话题
auto image_sub = message_filters::Subscriber<sensor_msgs::msg::Image>(node, "image_topic");
auto laser_sub = message_filters::Subscriber<sensor_msgs::msg::LaserScan>(node, "laser_topic");
// 创建时间同步器,指定回调函数和队列大小
auto sync = std::make_shared<message_filters::TimeSynchronizer<sensor_msgs::msg::Image, sensor_msgs::msg::LaserScan>>(image_sub, laser_sub, 10);
sync->registerCallback(std::bind(&callback, _1, _2));
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
```
在这个示例中,我们创建了一个名为`time_sync_node`的ROS节点,同时订阅了名为`image_topic`和`laser_topic`的两个话题。然后,我们使用`TimeSynchronizer`类来进行时间同步,指定了回调函数`callback`和队列大小为10。当两个话题的消息在时间上相近时,回调函数将被调用,并传递接收到的消息。
请注意,以上代码仅为示例,你需要根据实际情况进行适当修改和扩展。同时,确保你已经安装了`message_filters`库,并在CMakeLists.txt中添加了相应的依赖项。
阅读全文