当前位置: 首页 > news >正文

ROS回顾学习(5): 订阅多个话题并对其进行同步处理

1. 研究背景

本小节针对在ROS节点中需要订阅两个及两个以上的话题时,需要保持对这两个话题数据的同步,且需要同时接收数据一起处理然后当做参数传入到另一个函数中。
研究背景:realsenseT265 和 realsense D435 都有IMU数据,但是这两个传感器都将imu的数据拆开进行发布了,区分了线加速度和角加速,而在有一些场合我们需要合并使用。

2. 详细代码如下:

		#include <message_filters/subscriber.h>
		#include <message_filters/synchronizer.h>
		#include <message_filters/sync_policies/approximate_time.h>
		#include <boost/thread/thread.hpp>
		
		using namespace message_filters;
		
		void imu_callback(const sensor_msgs::ImuConstPtr &imu_msg_accel, const sensor_msgs::ImuConstPtr &imu_msg_gyro)
		{
			    double t = imu_msg_accel->header.stamp.toSec();
			    double dx = imu_msg_accel->linear_acceleration.x;
			    double dy = imu_msg_accel->linear_acceleration.y;
			    double dz = imu_msg_accel->linear_acceleration.z;
			    double rx = imu_msg_gyro->angular_velocity.x;
			    double ry = imu_msg_gyro->angular_velocity.y;
			    double rz = imu_msg_gyro->angular_velocity.z;
 				Vector3d gyr(rx, ry, rz);
				Vector3d acc(dx, dy, dz);
			   /**
			  	处理函数 ......
			   */
		}
		
		int main(int argc, char** argv)
		{
			// 需要用message_filter容器对两个话题的数据发布进行初始化,这里不能指定回调函数
		    message_filters::Subscriber<sensor_msgs::Imu> sub_imu_accel(n,IMU_TOPIC_ACCEL,2000,ros::TransportHints().tcpNoDelay());
		    message_filters::Subscriber<sensor_msgs::Imu> sub_imu_gyro(n,IMU_TOPIC_GYRO,2000,ros::TransportHints().tcpNoDelay());
	  		
	  		// 将两个话题的数据进行同步
			typedef sync_policies::ApproximateTime<sensor_msgs::Imu, sensor_msgs::Imu> syncPolicy;
		  	Synchronizer<syncPolicy> sync(syncPolicy(10), sub_imu_accel, sub_imu_gyro);  
		  	// 指定一个回调函数,就可以实现两个话题数据的同步获取
		  	sync.registerCallback(boost::bind(&imu_callback, _1, _2));
		  	
		  	ros::spin();
		  	return 0;
  		}

3. CMakeLists.txt 和 packages.xml添加如下ROS包:

	// CMakeLists.txt下添加:
	find_package(catkin REQUIRED COMPONENTS
	  ....
	  image_transport
	  ....
	)
	// package.xml下添加:
	 <build_depend>image_transport</build_depend>
	 <exec_depend>image_transport</exec_depend>

相关文章:

  • 论文算法学习记录(3)---semantic-stixel-world:柱间像素的学习
  • 原创性版权声明
  • MarkDown编辑器语法记录
  • ROS回顾学习(6): launch文件参数集锦及优化
  • 论文算法学习记录(4):视锥体-- Frustum Culling
  • RobotSlamApplication(1):第一个三方库--Eigen3库的使用
  • 论文算法学习实现(5):动态障碍物的检测和剔除2
  • ubuntu学习技巧2:Terminal命令学习
  • RobotSlamApplication(2): 视觉SLAM中常用的一些第三方库简介
  • C++11回顾学习(1): 语法简要回顾和通俗解释
  • 菜鸟专学:从头到尾创建自己的SLAM系统
  • 菜鸟专学:Eigen--Sophus--CV--三种不同库对矩阵的操作方式
  • ROS回顾学习(7):ubuntu下设置(ROS)程序开机自启动
  • RTAB-Map学习和测试详解
  • ROS回顾学习(8): 项目研究中遇到问题和难点记录
  • HashMap剖析之内部结构
  • HTTP那些事
  • Java 多线程编程之:notify 和 wait 用法
  • Mysql数据库的条件查询语句
  • nodejs调试方法
  • PAT A1050
  • React as a UI Runtime(五、列表)
  • 给Prometheus造假数据的方法
  • 前端面试之闭包
  • 三栏布局总结
  • 说说我为什么看好Spring Cloud Alibaba
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ()、[]、{}、(())、[[]]命令替换
  • (C#)一个最简单的链表类
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四) Graphivz 颜色选择
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一)VirtualBox安装增强功能
  • (原)本想说脏话,奈何已放下
  • (转)C#调用WebService 基础
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .aanva
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NetCore 如何动态路由
  • .NET开发不可不知、不可不用的辅助类(一)
  • .sh 的运行
  • :=
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Async注解的坑,小心
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [android] 切换界面的通用处理
  • [autojs]autojs开关按钮的简单使用
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】