I am new to ROS and trying to understand this powerful tool. I am confused between the spin
and rate.sleep
functions. Could anyone help me with the difference between these two functions and when to use each one?

- 5,047
- 11
- 16
- 26

- 305
- 2
- 3
- 10
1 Answers
ros::spin()
and ros::spinOnce()
are responsible to handle communication events, e.g. arriving messages. If you are subscribing to messages, services, or actions, you must call spin
to process the events.
While ros::spinOnce()
handles the events and returns immediately, ros::spin()
blocks until ROS invokes a shutdown. So, ros::spinOnce()
gives you more control if needed. More on that matter here: Callbacks and Spinning.
rate.sleep()
on the other hand is merely a thread sleep with a duration defined by a frequency. Here is an example
ros::Rate rate(24.);
while(ros::ok())
{
rate.sleep();
}
This loop will be executed 24 times a second or less, depends what you do inside the loop. A ros::Rate
object keeps track of how much time since the last rate.sleep()
was executed and sleep for the correct amount of time to hit the 24 Hz mark. See ros::Rate::sleep()
API.
The equivalent way in the time domain is ros::Duration::sleep()
ros::Duration duration(1./24.);
while(ros::ok())
{
duration.sleep();
}
Which one you use is just a matter of convenience.
-
Could you please elaborate on these two sentences: **(1)** *"... `ros::spinOnce()` handles the events and returns immediately, ..."* **(2)** *"... `ros::spin()` blocks until ROS invokes a shutdown ... "* especially, what did you mean by *"ROS invokes a shutdown" ?* Did you mean killing all the nodes and eventually ROS master? I'm still confused. Thank you so much in advance! – Milan Dec 29 '20 at 04:03