【ROS】message_filters时间同步

news/2024/7/10 22:20:35 标签: 开源, ros

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍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.niftyadmin.cn/n/4926908.html

相关文章

ChatGPT在大规模数据处理和信息管理中的应用如何?

ChatGPT作为一种强大的自然语言处理模型&#xff0c;在大规模数据处理和信息管理领域有着广泛的应用潜力。它可以利用其文本生成、文本理解和问答等能力&#xff0c;为数据分析、信息提取、知识管理等任务提供智能化的解决方案。以下将详细介绍ChatGPT在大规模数据处理和信息管…

死磕Android性能优化,卡顿原因与优化方案

随着移动互联网的快速发展&#xff0c;Android应用的性能优化变得尤为重要。卡顿是用户体验中最常见的问题之一&#xff0c;它会导致应用的响应变慢、界面不流畅&#xff0c;甚至影响用户的使用体验。因此&#xff0c;我们需要深入了解卡顿问题的原因&#xff0c;并寻找相应的解…

激活函数总结(三):激活函数补充

激活函数总结&#xff08;三&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Softmax激活函数2.2 Softplus激活函数2.3 Mish激活函数2.4 Maxout激活函数 3. 总结 1 引言 在前面的文章中已经介绍了过去大家较为常见的激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PR…

Windows和Linux系统上的矢量运算:指令级并行计算SIMD(SSE/AVX)应用细节以及相关跨平台的源码解释

注&#xff1a;本文的SIMD&#xff0c;指的是CPU(base intel x86 architecture)指令架构中的相关概念。不涉及GPU端的算力机制。下面的代码在Win10和Linux上均可用。 基本概念 SSE: Streaming SIMD Extensions, x86 architecture AVX: Advanced Vector Extensions SIMD&#…

通过实践学编程:20道C语言练习题助力学生编程技能提升专升本 期末考试,数据结构

当学生和考生投身于编程的学习之旅时&#xff0c;实践和挑战往往是提升技能的关键。在这篇博客中&#xff0c;我们将带您探索一系列激发兴趣和提升编程技能的C语言练习题。通过实际动手操作&#xff0c;您将会收获更多&#xff0c;提高您的编程熟练度。 学以致用&#xff1a;2…

Mirror网络库 | 说明

此篇为上文&#xff0c;下篇&#xff1a;Mirror网络库 | 实战 一、介绍 基于UNET&#xff0c;从2014年经过9年实战测试&#xff1b;服务器和客户端是一个项目&#xff1b;使用NetworkBehaviour而不是MonoBehaviour&#xff0c;还有NetworkServer和NetworkClient&#xff1b;Mi…

LeetCode-128-最长连续序列

力扣128题 题目描述&#xff1a;最长连续序列 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;n…

Win11中使用pip或者Cython报错 —— error: Microsoft Visual C++ 14.0 is required.

第一步&#xff1a;下载Visual Studio 2019 下载地址&#xff1a; https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/release-notes 第二步&#xff1a;安装组件 选择单个组件&#xff0c;勾选以下两个组件 其他错误&#xff1a; 无法打开文件“python37.li…