联合标定三维雷达和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 对齐多种传感器数据的时间戳的更多相关文章

  1. [ROS]一些传感器数据读取融合问题的思考

    思考问题: 1. 如何实现传感器数据的融合,或者说时间同步? 比如里程计读数和雷达数据融合? void SlamGMapping::startLiveSlam() { entropy_publishe ...

  2. 【AllJoyn专题】基于AllJoyn和Yeelink的传感器数据上传与指令下行的研究

    接触高通物联网框架AllJoyn不太久,但确是被深深地吸引了.在我看来,促进我深入学习的原因有三点:一.AllJoyn开源,对开源的软硬件总会有种莫名的喜爱,虽然或许不会都深入下去:二.顺应潮流,物联 ...

  3. python多种格式数据加载、处理与存储

    多种格式数据加载.处理与存储 实际的场景中,我们会在不同的地方遇到各种不同的数据格式(比如大家熟悉的csv与txt,比如网页HTML格式,比如XML格式),我们来一起看看python如何和这些格式的数 ...

  4. 基于uFUN开发板的心率计(一)DMA方式获取传感器数据

    前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...

  5. 云中树莓派(2):将传感器数据上传到 AWS IoT 并利用Kibana进行展示

    云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 1. 传感器安装及配置 1.1 DHT22 安装 DHT22 是一款温度与湿度传感器,它有3 ...

  6. C#关于时间(获取特定格式的时间及多种方式获取当前时间戳)以及10位和13位时间戳转为特定格式

    C#关于时间(获取特定格式的时间及多种方式获取当前时间戳)以及10位和13位时间戳转为特定格式 置顶 2018年03月06日 19:16:51 黎筱曦 阅读数:19098 标签: C#时间 更多 个人 ...

  7. STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载

    //为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 ​ //************************** //程序说明:stc ...

  8. [转]ROS中使用message_filters进行多传感器消息同步

    转:http://www.rosclub.cn/post-1030.html 最近实验室老师在做一个多传感器数据采集实验,涉及到了消息同步.所以就学习了ROS官网下的消息同步工具message_fil ...

  9. ros学习笔记 - 深度传感器转换成激光数据(hector_slam)

    前提条件:1,确保读者已经安装了kinect或者其他深度摄像头的驱动,如果未安装,可以直接在网盘下载:http://pan.baidu.com/s/1hqHB10w 提取密码:wrmn 利用深度相机仿 ...

随机推荐

  1. Groovy学习笔记-动态类型

    1.respondsTo方法判断对象是否存在指定方法 interface IHelp{ void helpMoveThings() } class Man implements IHelp{ void ...

  2. Java学习NO.3

    今日学习重点: while循环: 语法:while(条件表达式){ 循环操作 } 条件表达式符合,循环继续执行:否则,退出循环. 循环四要素:循环初始化.循环条件.循环操作.循环变量的改变 do-wh ...

  3. Python 语法2

    文档字符串,这个只能是用于紧跟函数第二行的内容. 输出文档说明的部分,代码格式是 函数名称.(dot)__(双下划线)doc__(双下划线) ///////////////////////////// ...

  4. 安装MySql 8.x版本客户端连接失败解决方案

    ---恢复内容开始--- 安装完8.0.11MySql数据库及客户端工具Navicat Premium 12(具体安装方法不详细赘述,自行百度,推荐网址:https://blog.csdn.net/c ...

  5. 小伙 zwfw-new.hunan.gov.cn.iname.damddos.com [222.240.80.52]

    由于这个应用出问题非常影响用户体验:于是立马让运维保留现场 dump 线程和内存同时重启应用,还好重启之后恢复正常.于是开始着手排查问题.

  6. 【转载】 什么是AutoML

    文章来源:企鹅号 - 仲耀晖的碎碎念 tzattack Studio presents 来源:Google AI Blog 编译:仲耀晖 ------------------------------- ...

  7. CSS Sprites ——雪碧图的使用方法

    首先解释下CSS Sprites是什么:有称CSS精灵,有称CSS雪碧的,无论叫什么,他的作用就是把网页上很多小图标放到一张图片里面,然后通过CSS里面的background-position来控制每 ...

  8. springCloud、springBoot学习

    http://projects.spring.io/spring-cloud/  官网https://springcloud.cc/spring-cloud-netflix.htmlhttp://cl ...

  9. vue项目打包后的资源路径问题

    最近做的vue项目,本地测试完成后,build上线,却发现了文件路径问题,提示各种诸如js,css等资源找不到的错: 正确解决方式有两种,一种是绝对路径配置,详细可以网上查,个人推荐第二种相对路径,这 ...

  10. TCP 三次握爪 四次挥手

    TCP三次握手和四次挥手过程 1.三次握手 (1)三次握手的详述 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向 ...