【ROS】message_filters时间同步

news2024/11/16 5:44:05

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍message_filters时间同步。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. message_filters时间同步介绍
    • :blush:2. 应用示例
    • :satisfied:3. 其他示例

😏1. message_filters时间同步介绍

message_filters 是 ROS(机器人操作系统)中的一个功能包,用于实现多个传感器数据或消息的时间同步。它提供了一个简单而灵活的接口,可以方便地对不同话题发布的消息进行时间戳的同步,以确保数据在处理时具有一致的时间对齐。

在 ROS 中,不同传感器或节点通常以异步方式发布其数据,这意味着它们可能以不同的时间频率或时间延迟发布消息。当需要将这些数据进行融合或联合处理时,时间同步就变得至关重要。message_filters 提供了两种常见的时间同步策略:

  1. ApproximateTime:该策略通过近似匹配不同话题发布的消息的时间戳来实现同步。它会维护一个滑动窗口,在给定的时间窗口内寻找最接近的时间戳,并将相应的消息进行同步。该方法适用于相对短暂的延迟或较小的时间偏差,并且具有较好的实时性能。

  2. ExactTime:该策略要求不同话题发布的消息具有完全相同的时间戳才能进行同步。只有当所有待同步的消息在相同的时间戳下同时到达时,才会触发同步操作。这种策略对于精确的时间对齐要求比较严格,适用于相对较少的数据或对时间同步要求较高的场景。

使用 message_filters 进行时间同步的一般步骤如下:

1.创建一个 message_filters::Subscriber 对象来监听需要同步的话题,并指定消息类型。
2.创建一个 message_filters::Cache 对象来管理接收到的消息,并指定缓存的大小和策略(例如 ApproximateTime 或 ExactTime)。
3.创建一个回调函数,用于处理同步后的消息。该回调函数会在同步消息到达时被触发,并接收同步后的消息作为参数。
4.使用 message_filters::Synchronizer 类将订阅者、缓存和回调函数组合在一起,并设置同步的时间窗口大小等参数。
5.调用 Synchronizer 对象的 registerCallback() 函数来注册回调函数。
6.在主循环中调用 ROS 的 spin() 函数或使用回调队列来处理消息。

此外,在需要精确时间同步的场景,TimeSynchronizer更为适用,它也属于 message_filters 功能包的一部分,但应确保所有订阅的话题应具有相同的时间戳来源。如果不同话题的时间戳不一致,可能需要对其进行预处理或使用其他方法来实现时间同步。

😊2. 应用示例

项目Github地址:https://github.com/JackJu-HIT/learning_messages_filters

该项目演示了使用message_filters时间同步的示例,学习一下:

gps和imu的消息一般需要同步才能获得精确的定位消息,订阅两个消息并同步的示例:

#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>
#include <math.h>
#include "sensor_msgs/LaserScan.h"
#include "sensor_msgs/NavSatFix.h"
#include "sensor_msgs/Imu.h"
using namespace std;

using namespace sensor_msgs;
using namespace message_filters;
void callback(const sensor_msgs::Imu::ConstPtr& imu, const sensor_msgs::NavSatFix::ConstPtr& gps)
{
  // Solve all of perception here...?>
  cout<<"传感器数据同步..."<<endl;
  cout<<"imu:"<<imu->linear_acceleration.x<<endl;
  cout<<"gps:"<<gps->latitude<<endl;
}
 

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<sensor_msgs::Imu> imu_sub(nh, "/imu", 1);
  //message_filters::Subscriber<CameraInfo> info_sub(nh, "camera_info", 1);
  message_filters::Subscriber<sensor_msgs::NavSatFix> gps_sub(nh, "/fix", 1);
  typedef sync_policies::ExactTime<Imu, NavSatFix> MySyncPolicy;
  // ExactTime takes a queue size as its constructor argument, hence MySyncPolicy(10)
  Synchronizer<MySyncPolicy> sync(MySyncPolicy(10), imu_sub, gps_sub);
  sync.registerCallback(boost::bind(&callback, _1, _2));
  ros::spin();
 
  return 0;
}

同步之后发布出去:

#include "sensor_msgs/NavSatFix.h"
#include "sensor_msgs/Imu.h"
#include <ros/ros.h>

using namespace std;

int main(int argc, char **argv)
{
    // ROS节点初始化
    ros::init(argc, argv, "IMU_GPS_publisher");

    // 创建节点句柄
    ros::NodeHandle n;
    // 创建一个Publisher,发布名为/odom_info的topic,消息类型为learning_topic::Person,队列长度10
    ros::Publisher IMU_info_pub = n.advertise<sensor_msgs::Imu>("/imu", 10);
    ros::Publisher GPS_info_pub=n.advertise<sensor_msgs::NavSatFix>("/fix", 10);

    // 设置循环的频率
    ros::Rate loop_rate(1);
    ROS_INFO("The data of IMU already published!");
    int count = 0;
    while (ros::ok())
    {
        // 初始化learning_topic::Person类型的消息
    	sensor_msgs::Imu msg;
        sensor_msgs::NavSatFix msg2;
        msg.linear_acceleration.x=10;
        msg2.latitude=132;      
         // 发布消息
        IMU_info_pub.publish(msg);
        GPS_info_pub.publish(msg2);
        // ROS_INFO("The data of IMU: x:%d  y:%d  z:%d w:%d", 
		//	  msg.x, msg.y, msg.z,msg.w);
		loop_rate.sleep();
	}
    return 0;
}

😆3. 其他示例

其他用法参考官方及这篇翻译:http://t.csdn.cn/GibgB

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/853459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口mock常用工具

在进行测试时&#xff0c;我们经常需要模拟接口数据&#xff0c;尤其是在前后端分离项目的开发中&#xff0c;在后端未完成开发时&#xff0c;前端拿不到后端的数据&#xff0c;就需要对后端返回的数据进行模拟。 如下一些工具&#xff0c;可以完成接口的mock。 Yapi 首先添…

算法通关村——轻松搞定两树相等问题

题目 给你两棵二叉树的根节点p和q&#xff0c;编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为他们是相同的。 示例 输入&#xff1a;p[1,2,3] q[1,2,3] 输出&#xff1a;true 如下图所示&#xff1a; 输入&am…

制造执行系统(MES):优化生产管理的关键

制造业是现代经济的重要组成部分&#xff0c;随着技术的发展和市场需求的变化&#xff0c;制造企业面临着越来越大的挑战。为了在竞争激烈的市场中保持竞争力&#xff0c;企业需要实现生产过程的高效管理和优化。这就引入了制造执行系统&#xff08;MES&#xff09;&#xff0c…

【Spring Boot】了解Spring Boot 的日志文件

目录 一、日志的作用 二、日志文件的简单使用 1、Spring Boot中的默认日志 2、自定义日志打印 三、日志级别 1、日志级别分类 2、日志级别的设置 3、日志持久化 四、基于LomBok的日志输出 1、安装Lombok插件 2、使用Lombok添加日志 3、使用Lombok添加getter和setter…

第48节:cesium 面交集计算(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><vc-navigation

13-把矩阵看作是对系统的描述

探索矩阵乘法&#xff1a;更深刻的理解与应用视角 &#x1f9e9;&#x1f50d; 引言 &#x1f4d6; 在我们进一步探讨矩阵乘法之前&#xff0c;让我们从不同的角度来理解什么是矩阵&#xff0c;以及如何将矩阵视为一个系统。我们之前已经介绍了矩阵的基本概念和运算&#xff…

那些没人教你的Jmeter 循环断言,百度不到的,收藏一下吧

前言 对于使用jmeter工具完成接口测试的测试工程师而言。在工作中&#xff0c;或者在面试中&#xff0c;都会遇到一个问题。 CSV文档做了一大笔测试数据后&#xff0c;怎么去校验这个结果呢&#xff1f; 现在大部分测试工程师可能都是通过人工的方法去查看结果&#xff0c;十几…

【3D卡片切换】基于jquery实现3D堆叠卡片切换效果(附完整源码)

文章目录 写在前面涉及知识点实现效果1、搭建页面1.1 创建ul li节点1.2 丰富元素Html代码所示CSS代码所示 2、JS实现堆叠切换3、源码分享3.1 百度网盘3.2 123云盘3.3 邮箱留言 总结 写在前面 其实3D卡片堆叠切换效果&#xff0c;从我入前端坑以来就一直喜欢的一种轮播效果&…

护网行动 | AD360 在网络安全中的重要作用

随着数字化时代的来临&#xff0c;网络已经成为了人们生活和工作中不可或缺的一部分。然而&#xff0c;随之而来的是网络安全问题日益突出。为了应对这些安全威胁&#xff0c;护网行动应运而生&#xff0c;其中AD360在保障网络安全方面扮演着至关重要的角色。 AD360是一个集成的…

封装上传组件(axios,进度条onUploadProgress,取消请求)

目录 定时模拟进度条 方法 A.axios B.xhr 取消请求​​​​​​​cancelToken A.axios.canceltoken B.source对象创建canceltoken 完整代码 A.自定义上传组件 B.二次封装组件 情况 增加cancelToken不生效&#xff0c;刷新页面 进度条太快->设置浏览器网速 定时…

发布属于自己的 npm 包

1 创建文件夹&#xff0c;并创建 index.js 在文件中声明函数&#xff0c;使用module.exports 导出 2 npm 初始化工具包&#xff0c;package.json 填写包的信息&#xff08;包的名字是唯一的&#xff09; npm init 可在这里写包的名字&#xff0c;或者一路按回车&#xff0c;后…

JedisDataException DENIED Redis is running in protected mode...异常的解决办法

一. 异常现象 壹哥最近在带学生做项目的过程中&#xff0c;有学生在使用Redis的时候&#xff0c;产生了如下这样的异常信息&#xff1a; com.yyg.demo.Demo01Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is runni…

企业邮箱安全对比:哪家公司的产品更可靠?

邮箱仍然是企业沟通的关键组成部分&#xff0c;但往往容易受到安全威胁。为了保护敏感信息&#xff0c;企业需要采取措施使企业邮箱更加安全。这可以通过投资先进的安全解决方案&#xff0c;创建限制或控制访问的策略&#xff0c;并定期对员工进行最佳实践培训来实现。 1、投资…

Java实战:高效提取PDF文件指定坐标的文本内容

前言 临时接到一个紧急需要处理的事项。业务侧一个同事有几千个PDF文件需要整理&#xff1a;需要从文件中的指定位置获取对应的编号和地址。 要的急&#xff0c;工作量大。所以就问到技术部有没有好的解决方案。 问技术的话就只能写个demo跑下了。 解决办法 1. 研究下PDF文档…

B站又添黑马UP主,首发创下1800万播放

众所周知&#xff0c;ACG类是B站最受欢迎的内容&#xff0c;毕竟B站由二次元内容为起点发展至今&#xff0c;吸引了众多年轻一代的用户群体。 而B站又是一个“来自用户”的平台&#xff0c;由用户转变成UP主自发投稿作品&#xff0c;构建出现在这个存在着大大小小几十个分区的…

固定资产管理工作总结

固定资产管理是现代企业管理工作的重点。在过去的一段时间里&#xff0c;企业专注于固定资产管理&#xff0c;以达到节约企业资源的效果。 企业要坚持以标准化管理为载体&#xff0c;制定完善的固定资产管理制度&#xff0c;全面规范固定资产进出口、汇总、储存、维护、损坏等…

利用 3D 地理空间数据实现Cesium的沉浸式环境

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 为了将大量异构 3D 地理空间数据处理和分散到各行各业的地理空间应用程序和运行时引擎&#xff0c;Cesium 创建了 3D Tiles&#xff0c;这是一种用于高效流式传输和渲染大量异构数据集的开放标准。3D Tile…

《Python入门到精通》函数详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 函数 1、函数的调用2、函数的参数2.1、变量的就近原则2.2、传递参数2.3、形参和实…

恶意扩展可滥用 VS Code 漏洞窃取认证令牌

微软的 Visual Studio Code (VS Code) 代码编辑器存在一个漏洞&#xff0c;允许恶意扩展程序检索 Windows、Linux 和 macOS 中存储的身份验证令牌。 这些令牌用于集成各种第三方服务和 API&#xff0c;如 Git、GitHub 和其他编码平台&#xff0c;因此窃取这些令牌可能会对数据…

试用MetaGPT

简介 最近朋友和B站都给我推 MetaGPT&#xff0c;正好有空就下载亲测了一下。MetaGPT 是目前&#xff08;230809&#xff09;github热榜第一名&#xff0c;今天就加了3000多个星。 MetaGPT是一个多智能体框架&#xff0c;能够生成不同的角色&#xff1a;工程师、产品经理、架…