<ROS> message_filters 对齐多种传感器数据的时间戳
联合标定三维雷达和IMU,第一步要先对齐两种传感信息的时间戳。
ros官网提供了message_filters用于对齐多种传感信息的时间戳。
http://wiki.ros.org/message_filters#Time_Synchronizer
注意,对齐传感信息时间戳有两种方式,一种是时间戳完全对齐 ExactTime Policy ,另一种是时间戳相近
ApproximateTime Policy ,前者更为严格。
msg_syn.h
#ifndef CLIMBING_ROBOT_GT_MAP_
#define CLIMBING_ROBOT_GT_MAP_ #include <string> #include <ros/ros.h>
#include <rosbag/bag.h>
#include <sensor_msgs/PointCloud2.h>
#include <geometry_msgs/PoseStamped.h> #include <message_filters/subscriber.h>
#include <message_filters/synchronizer.h>
#include <message_filters/sync_policies/approximate_time.h> namespace climbing_robot
{ class MsgSynchronizer{
public:
MsgSynchronizer(ros::NodeHandle node);
~MsgSynchronizer(){}; void callback(const sensor_msgs::PointCloud2::ConstPtr& ori_pointcloud, const geometry_msgs::PoseStamped::ConstPtr& ori_pose); inline void CloseBag()
{
msg_syn_bag.close();
} private:
// ros::Publisher pubVelodyne;
// ros::Publisher pubImu;
std::string syn_bag_path;
rosbag::Bag msg_syn_bag;
}; }//namespace climbing_robot #endif// CLIMBING_ROBOT_GT_MAP_
msg_syn.cpp
#include "msg_syn.h" #include <iostream> namespace climbing_robot
{ MsgSynchronizer::MsgSynchronizer(ros::NodeHandle node)
{
// pubVelodyne = nh.advertise<sensor_msgs::PointCloud2>("/Syn/imu/data", 1); message_filters::Subscriber<geometry_msgs::PoseStamped> pose_sub(node, "/vrpn_client_node/RigidBody/pose", );
message_filters::Subscriber<sensor_msgs::PointCloud2> velodyne_sub(node, "/velodyne_points", ); typedef message_filters::sync_policies::ApproximateTime<sensor_msgs::PointCloud2, geometry_msgs::PoseStamped> approximate_policy;
message_filters::Synchronizer<approximate_policy> sync(approximate_policy(), velodyne_sub, pose_sub);
sync.registerCallback(boost::bind(&MsgSynchronizer::callback, this, _1, _2)); node.getParam("msg_syn_bag_path", syn_bag_path);
msg_syn_bag.open(syn_bag_path, rosbag::bagmode::Write); ros::spin();
} void MsgSynchronizer::callback(const sensor_msgs::PointCloud2::ConstPtr& ori_pointcloud, const geometry_msgs::PoseStamped::ConstPtr& ori_pose)
{
ROS_INFO("pointcloud stamp value is: %f", ori_pointcloud->header.stamp.toSec());
ROS_INFO("pose stamp value is: %f", ori_pose->header.stamp.toSec()); // ros::Time timestamp = ori_pointcloud.header.stamp;
msg_syn_bag.write("/velodyne_points", ori_pointcloud->header.stamp, *ori_pointcloud);
msg_syn_bag.write("/vrpn_client_node/RigidBody/pose", ori_pointcloud->header.stamp, *ori_pose); // pubVelodyne.publish(syn_pointcloud);
} }//namespace climbing_robot
main.cpp
#include "msg_syn.h" int main(int argc, char** argv)
{
ros::init(argc, argv, "msg_synchronizer");
ros::NodeHandle node("~");
ROS_INFO("\033[1;32m---->\033[0m Sync msgs node Started."); climbing_robot::MsgSynchronizer synchronizer(node); // ros::spin(); synchronizer.CloseBag(); return ;
}
非常注意2点:
A
sync.registerCallback(boost::bind(&mySynchronizer::callback, this, _1, _2));
由于callback函数是类内函数,所以要使用类内成员函数的写法;
加上this关键字;
参考:https://blog.csdn.net/Felaim/article/details/78212738#commentBox
B
ros::spin(); 要放在订阅函数之后。如果放在主函数中,由于作用域的原因,会出现无法订阅/topic的错误。
参考:https://www.cnblogs.com/liu-fa/p/5925381.html
<ROS> message_filters 对齐多种传感器数据的时间戳的更多相关文章
- [ROS]一些传感器数据读取融合问题的思考
思考问题: 1. 如何实现传感器数据的融合,或者说时间同步? 比如里程计读数和雷达数据融合? void SlamGMapping::startLiveSlam() { entropy_publishe ...
- 【AllJoyn专题】基于AllJoyn和Yeelink的传感器数据上传与指令下行的研究
接触高通物联网框架AllJoyn不太久,但确是被深深地吸引了.在我看来,促进我深入学习的原因有三点:一.AllJoyn开源,对开源的软硬件总会有种莫名的喜爱,虽然或许不会都深入下去:二.顺应潮流,物联 ...
- python多种格式数据加载、处理与存储
多种格式数据加载.处理与存储 实际的场景中,我们会在不同的地方遇到各种不同的数据格式(比如大家熟悉的csv与txt,比如网页HTML格式,比如XML格式),我们来一起看看python如何和这些格式的数 ...
- 基于uFUN开发板的心率计(一)DMA方式获取传感器数据
前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...
- 云中树莓派(2):将传感器数据上传到 AWS IoT 并利用Kibana进行展示
云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 1. 传感器安装及配置 1.1 DHT22 安装 DHT22 是一款温度与湿度传感器,它有3 ...
- C#关于时间(获取特定格式的时间及多种方式获取当前时间戳)以及10位和13位时间戳转为特定格式
C#关于时间(获取特定格式的时间及多种方式获取当前时间戳)以及10位和13位时间戳转为特定格式 置顶 2018年03月06日 19:16:51 黎筱曦 阅读数:19098 标签: C#时间 更多 个人 ...
- STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载
//为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 //************************** //程序说明:stc ...
- [转]ROS中使用message_filters进行多传感器消息同步
转:http://www.rosclub.cn/post-1030.html 最近实验室老师在做一个多传感器数据采集实验,涉及到了消息同步.所以就学习了ROS官网下的消息同步工具message_fil ...
- ros学习笔记 - 深度传感器转换成激光数据(hector_slam)
前提条件:1,确保读者已经安装了kinect或者其他深度摄像头的驱动,如果未安装,可以直接在网盘下载:http://pan.baidu.com/s/1hqHB10w 提取密码:wrmn 利用深度相机仿 ...
随机推荐
- 万维网(WWW)
简介:万维网(WWW)是 Internet上最为普及的一种应用服务,它是由成千上万万维网站点(简称网站)组成的一个联机信息存储系统. 万维网的工作模式采用客户机/服务器方式,在用户计算机上运行浏览器作 ...
- 马凯军201771010116《面向对象与程序设计Java》
实验十八 总复习 实验时间 2018-12-30 1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设 ...
- CentOS系统Nginx安装配置,随时更新
./configure --prefix=/etc/nginx \ #指定安装目录 --sbin-path=/usr/sbin/nginx \ #指定执行路径--conf-path=/etc/ngin ...
- VIM学习二: VIM配置代码及效果图
vim学习及插件 参见:http://www.cnblogs.com/caixu/p/6337926.html .vimrc配置 "***************************** ...
- Java学习NO.2
这是我学习Java的第二天 学习内容: 一.运算符 赋值运算符 语法:变量名=表达式 算数运算符 + - * / % ++ -- += -= *= /= %= 其中尤为要注 ...
- mysql 实现 sqlserver的row_number over() 方法
1.创建表 CREATE TABLE `heyf_t10` ( `empid` int(11) DEFAULT NULL, `deptid` int(11) DEFAULT NULL, `salary ...
- C#获取当前日期时间
我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...
- C#杀掉进程的方法
C#杀掉进程的方法 private static string CmdName = "cmd"; /// <summary> /// 关闭进程 /// </sum ...
- nw 引用 sqlite
0.好吧,这对于我这个c 小白来说,真的有点难度. 1.安装Python 2.7.14 https://www.python.org/downloads/ 2.安装最新的nodejs+npm http ...
- ChIP-seq基本流程及工具
ChIP-seq数据分析整理 1.Alignment 2.Peak detection 3.Peak annotation 1. GO analysis 2. Pathway analysis 4.D ...