首页 > 编程知识 正文

ros结果分析,iometer测试结果分析

时间:2023-05-05 05:06:57 阅读:49176 作者:2394

时间同步机制对多机器人(主)系统和多传感器信息的融合非常重要,可分为硬同步和软同步。

硬同步从源同步时间,消除传输延迟的影响。 软同步时间由话题发布时间决定,其间存在传感器到主站话题订阅节点的传输延迟mgdgb,这种延迟可能很严重,但在软同步解决不了延迟问题时需要采用硬同步方式。 注意收集时刻和到达时刻的不同:在ROS中,由于假设分发时间为收集时刻时间,订阅时间为到达时刻时间,所以时间戳近似机构(仅通过基于时间戳信息的自适应算法来匹配多个话题间的时间同步性)能够实现时间传输网络和数据ROS提供了三种同步机制,但实际上是两种。 通常的时间同步机制、时间戳完全相同的机制、时间戳近似机制。 前两个本质是一样的。 在message_filters包中实现。

其实,在本篇学习ROS时刻同步的结构的同时,也要学习计时器和c包ROS的知识。

目录

测试源代码

执行结果

测试1 :两个计时器频率,timer1=0.1s,timer2=0.5s

测试2 :两个计时器频率,timer1=0.5s,timer2=0.5s

测试3 :时间同步器订阅同一话题

测试源是将ROS封装为c格式的,与c有一些不同之处,需要特别注意

# ifndef time _ synchronizer _ h _ # define time _ synchronizer _ h _ # include ROS/ROS.h # include ROS/timer.h # # include message _ filters/synchronizer.h # include message using STD : endl; //# define time _ synch # define exact _ synch//# define appro _ synchclasstimesynch { public 3360 time synch (ROS 333: ) ros:Timer timer1; ros:Timer timer2; //message _ filters 33603360 subscriber timer1_ sub,timer2_sub; //message _ filters 33603360 subscriber geometry _ msgs 33603360 pointstampedtimer1_ sub; 公共: bool初始化(; void time R1 handler (控制:3360 timer event; void timer2handler (控制:3360 timer event; 语音同步转换器(const

geometry_msgs::PointStampedConstPtr &p1, const geometry_msgs::PointStampedConstPtr &p2); private: ros::NodeHandle node_; std::string topic_name1_, topic_name2;};bool TimeSynch::Initialization() { /* 2个定时器,以不同频率发布数据 */ timer1 = node_.createTimer(ros::Duration(1), &TimeSynch::Timer1Handler, this); timer2 = node_.createTimer(ros::Duration(1), &TimeSynch::Timer2Handler, this); /* 2个订阅器,分别订阅上述2个定时器发布的话题 */ timer1_pub = node_.advertise<geometry_msgs::PointStamped>("p1", 10); timer2_pub = node_.advertise<geometry_msgs::PointStamped>("p2", 10); // timer1_sub = node_.subscribe("p1", 10); // wrong! // 再在构造函数或初始化函数中进行初始化 timer1_sub.subscribe(node_, "p1", 10); // 直接在构造函数或初始化函数中定义并初始化 message_filters::Subscriber<geometry_msgs::PointStamped> timer2_sub(node_, "p2", 10);/* 以下分别定义了3种类型时间同步器,测试其效果,使用同一个回调函数 *//* 1、普通时间同步器 */#ifdef TIME_SYNCH message_filters::TimeSynchronizer<geometry_msgs::PointStamped, geometry_msgs::PointStamped> time_synch(timer1_sub, timer2_sub, 10); // time_synch.registerCallback(boost::bind(&TimeSynch::TimeSynchHandler, _1, _2)); // 错误! time_synch.registerCallback(&TimeSynch::TimeSynchHandler, this);#endif/*2、时间同步器:要求时间戳完全相同 */#ifdef EXACT_SYNCH using ExactSynch = message_filters::sync_policies::ExactTime<geometry_msgs::PointStamped, geometry_msgs::PointStamped>; message_filters::Synchronizer<ExactSynch> exact_synch(ExactSynch(10), timer1_sub, timer2_sub); exact_synch.registerCallback(&TimeSynch::TimeSynchHandler, this);#endif/*3、时间同步器:只要求时间戳近似即可 *//* 默认近似范围多大?近似范围是否支持自定义?如何定义? */#ifdef APPRO_SYNCH typedef message_filters::sync_policies::ApproximateTime<geometry_msgs::PointStamped, geometry_msgs::PointStamped> ApproSynch; message_filters::Synchronizer<ApproSynch> appro_synch(ApproSynch(10), timer1_sub, timer2_sub); appro_synch.registerCallback(&TimeSynch::TimeSynchHandler, this);#endif // 注意!由于作用域原因,必须放在订阅函数之后(不能放在主函数中,否则无法订阅到话题)! ros::spin(); cout << "Initialized." << endl; return true;}void TimeSynch::Timer1Handler(const ros::TimerEvent&) { cout << "timer1=" << ros::Time::now() << endl; geometry_msgs::PointStamped p1; p1.header.stamp = ros::Time::now(); timer1_pub.publish(p1);}void TimeSynch::Timer2Handler(const ros::TimerEvent&) { cout << "timer2=" << ros::Time::now() << endl; geometry_msgs::PointStamped p2; p2.header.stamp = ros::Time::now(); timer2_pub.publish(p2); }void TimeSynch::TimeSynchHandler(const geometry_msgs::PointStampedConstPtr &p1, const geometry_msgs::PointStampedConstPtr &p2) { cout << "p1 time = " << p1->header.stamp << " p2 time = " << p2->header.stamp << endl;}int main(int argc, char **argv) { ros::init(argc, argv, "time_synch"); ros::NodeHandle node; TimeSynch timeSynch(node); timeSynch.Initialization(); // ros::spin(); // 不能放这儿! return true;}#endif

 

运行结果 测试1:2个定时器频率,timer1=0.1s, timer2=0.5s

从左到右:时间戳近似同步机制,时间戳完全相同机制,普通时间同步机制。

只有时间戳近似定时器能够订阅到2个时间戳大致相近的话题。其他2个机制只有在2个话题时间戳完全相同时才能订阅到(以下没有出现完全相同的时候,因此没有订阅到)

 

测试2:2个定时器频率,timer1=1s, timer2=1s

我们将2个定时器发布频率设定相同都为1秒,由于两个发布器发布时间不可能完全相同,会存在一点点时间偏差,导致时间戳完全相同机制和普通时间同步机制都无法订阅到2个话题

测试3:时间同步器订阅相同话题

之所以这样做,是为了保证“2”个话题时间戳完全相同,测试时间戳完全相同机制。

此时,时间戳完全相同机制和普通时间同步机制都可以订阅到话题进入回调函数了。话题时间戳完全相同。

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。