ros::spin()和ros::spinOnce()

目的:

Ros自带的时间同步函数存在着“当一个输入缺失,就无法进入回调函数,也无法处理数据”的缺点,所以决定不再使用系统自带函数;自己写一段时间同步的代码;

发现:

1.关于ros::spin()和ros::spinOnce();
  
  在这之前,我一直以为ros::spin()是订阅消息/回调函数的专属语句;ros::spinOnce()是发布函数的专属语句;
  
  实际上,这两者都是回调函数的专属语句…

回调函数的工作原理:
  
  回调函数的作用是接受订阅的消息,但是所接到的消息并不是立刻就被处理,而是必须要等到ros::spin()或ros::spinOnce()执行的时候才被调用,这就是回调函数的实现原理。
因此,当你使用callback()回调函数时,要么添加ros::spin(),要么添加ros::spinOnce(),否则你将永远收不到对方的消息(真惨==);
  那么,我们就产生了这样的疑问,应该在何时使用何种语句呢,接下来,就是他们两者之间的区别和使用时机。

ros::spin()和ros::spinOnce()的区别:
  
  ros::spin()不会在继续往下运行了,一直在帮助回调函数响应消息,接收数据;
  ros::spinOnce()是属于周期性语句,每隔多少秒,回调函数响应一次;它还可以继续执行后边的程序,也就是说,如果你不添加一个循环(一般是while()循环),那么回调函数只会响应一次;

ros::spin()和ros::spinOnce()的使用时机:
  
  如果你只是一个无情的接收消息机器,对接收消息的时间间隔么有要求,或者你的数据接收来就存起来或者进入到某个函数中进行处理或者直接发布出去(可以在回调函数中做简单的处理直接发布出去);那么就可以在main()函数中,return 0前添加ros::spin();总而言之吧,你是一个很随意的人(划掉),你的程序是一个很随意的处理过程,那么就可以使用ros::spin()省时省力;
  
  如果你的程序有时间间隔的要求,比如说我想要100ms获取一下数据进行处理或者发布,那么就可以使用ros::spinOnce();其实,ros::spinOnce()也并不是只能接收周期点的数据,只要你控制好存储容器的大小,一样可以把这段时间内的数据都取出来,但是因为我并没有这方面的需求,因此不再详细了解。

ros::Rate loop_rate(10);//10hz
while (ros::ok()){
	/**处理函数
	可以是直接数据的处理,然后使用发布节点,发布出去;
	可以是直接数据的处理,并不发布;**/
	ros::spinOnce();//必须和while()一起使用,否则就只执行一次
	loop_rate.sleep();
}

不知道自己理解的是否正确,如有不对之处,欢迎批评指正~

你可能感兴趣的:(2021程序,自动驾驶,人工智能,机器学习)