当前位置:网站首页>ROS 之订阅多个topic时间同步问题
ROS 之订阅多个topic时间同步问题
2022-07-31 05:16:00 【xp_fangfei】
message_filters的介绍:
message_filters是一个用于roscpp和rospy的实用程序库。 它集合了许多的常用的消息“过滤”算法。消息过滤器message_filters类似一个消息缓存,当消息到达消息过滤器的时候,可能并不会立即输出,而是在稍后的时间点里满足一定条件下输出。
举个例子,比如时间同步器,它接收来自多个源的不同类型的消息,并且仅当它们在具有相同时间戳的每个源上接收到消息时才输出它们,也就是起到了一个消息同步输出的效果。
Time Synchronizer 时间同步器:
C++ message_filters::TimeSynchronizer API docs
Python message_filters.TimeSynchronizer
TimeSynchronizer过滤器通过包含在其头中的时间戳来同步输入通道,并以单个回调的形式输出它们需要相同数量的通道。 C ++实现可以同步最多9个通道。
例子(C++):
#include <message_filters/subscriber.h>
#include <message_filters/time_synchronizer.h>
#include <sensor_msgs/Image.h>
#include <sensor_msgs/CameraInfo.h>
using namespace sensor_msgs;
using namespace message_filters;
void callback(const ImageConstPtr& image, const CameraInfoConstPtr& cam_info)
{
// Solve all of perception here...
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "vision_node");
ros::NodeHandle nh;
message_filters::Subscriber<Image> image_sub(nh, "image", 1);
message_filters::Subscriber<CameraInfo> info_sub(nh, "camera_info", 1);
TimeSynchronizer<Image, CameraInfo> sync(image_sub, info_sub, 10);
sync.registerCallback(boost::bind(&callback, _1, _2));
ros::spin();
return 0;
}
Policy-Based Synchronizer 基于策略的同步器 :
Synchronizer filter同步过滤器通过包含在其头中的时间戳来同步输入通道,并以单个回调的形式输出它们需要相同数量的通道。 C ++实现可以同步最多9个通道。
Synchronizer过滤器在确定如何同步通道的策略上进行模板化。 目前有两个策略:ExactTime和ApproximateTime。
C++ Header: message_filters/synchronizer.h
例1(ExactTime):
#include <message_filters/subscriber.h>
#include <message_filters/synchronizer.h>
#include <message_filters/sync_policies/exact_time.h>
#include <sensor_msgs/Image.h>
#include <sensor_msgs/CameraInfo.h>
using namespace sensor_msgs;
using namespace message_filters;
void callback(const ImageConstPtr& image, const CameraInfoConstPtr& cam_info)
{
// Solve all of perception here...
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "vision_node");
ros::NodeHandle nh;
message_filters::Subscriber<Image> image_sub(nh, "image", 1);
message_filters::Subscriber<CameraInfo> info_sub(nh, "camera_info", 1);
typedef sync_policies::ExactTime<Image, CameraInfo> MySyncPolicy;
// ExactTime takes a queue size as its constructor argument, hence MySyncPolicy(10)
Synchronizer<MySyncPolicy> sync(MySyncPolicy(10), image_sub, info_sub);
sync.registerCallback(boost::bind(&callback, _1, _2));
ros::spin();
return 0;
}
例2(ApproximateTime):
#include <message_filters/subscriber.h>
#include <message_filters/synchronizer.h>
#include <message_filters/sync_policies/approximate_time.h>
#include <sensor_msgs/Image.h>
using namespace sensor_msgs;
using namespace message_filters;
void callback(const ImageConstPtr& image1, const ImageConstPtr& image2)
{
// Solve all of perception here...
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "vision_node");
ros::NodeHandle nh;
message_filters::Subscriber<Image> image1_sub(nh, "image1", 1);
message_filters::Subscriber<Image> image2_sub(nh, "image2", 1);
typedef sync_policies::ApproximateTime<Image, Image> MySyncPolicy;
// ApproximateTime takes a queue size as its constructor argument, hence MySyncPolicy(10)
Synchronizer<MySyncPolicy> sync(MySyncPolicy(10), image1_sub, image2_sub);
sync.registerCallback(boost::bind(&callback, _1, _2));
ros::spin();
return 0;
}
注意:实现以上三种时间同步的前提是消息体中有包含时间戳的头:
std_msg/Header
uint32 seq //存储原始数据类型uint32
time stamp //存储ROS中的时间戳信息
string frame_id //用于表示和此数据关联的帧,在坐标系变化中可以理解为数据所在的坐标系名称
边栏推荐
- Navicat从本地文件中导入sql文件
- sql add default constraint
- 数据库 | SQL查询进阶语法
- quick-3.5 lua调用c++
- VS2017 connects to MYSQL
- Talking about the understanding of CAP in distributed mode
- Understanding of objects and functions in js
- Multi-Modal Face Anti-Spoofing Based on Central Difference Networks学习笔记
- js中的全局作用域与函数作用域
- 通信原理——纠错编码 | 汉明码(海明码)手算详解
猜你喜欢

计算图像数据集均值和方差

After unicloud is released, the applet prompts that the connection to the local debugging service failed. Please check whether the client and the host are under the same local area network.

微信小程序源码获取与反编译方式

The latest MySql installation teaching, very detailed

CNN的一点理解

flutter arr dependencies

QT VS中双击ui文件无法打开的问题

Pytorch学习笔记09——多分类问题

npm WARN config global `--global`, `--local` are deprecated. Use `--location solution

Take you to understand the MySQL isolation level, what happens when two transactions operate on the same row of data at the same time?
随机推荐
Pytorch学习笔记09——多分类问题
Gradle sync failed: Uninitialized object exists on backward branch 142
Attribute Changer的几种形态
random.randint函数用法
UiBot存在已打开的MicrosoftEdge浏览器,无法执行安装
Flutter mixed development module dependencies
Why does read in bash need to cooperate with while to read the contents of /dev/stdin
flutter arr 依赖
ERROR Error: No module factory availabl at Object.PROJECT_CONFIG_JSON_NOT_VALID_OR_NOT_EXIST ‘Error
quick-3.5 lua调用c++
cocos2d-x-3.2 不能混合颜色修改
我的训练函数模板(动态修改学习率、参数初始化、优化器选择)
quick-3.5 无法正常显示有混合纹理的csb文件
Take you to understand the MySQL isolation level, what happens when two transactions operate on the same row of data at the same time?
Principle analysis of famous website msdn.itellyou.cn
C语言 | 获取字符串里逗号间隔的内容
RuntimeError: CUDA error: no kernel image is available for execution on the device问题记录
quick-3.5 无法使用模拟器修改
二进制转换成十六进制、位运算、结构体
360 hardening file path not exists.