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

本文介绍如何使用ROS的message_filters库实现两个不同IMU话题的数据同步处理。通过具体代码示例,展示了如何从realsenseT265和realsenseD435传感器获取并同步线加速度和角加速度数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱发呆de白菜头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值