0
$\begingroup$

Rosanswers logo

I am looking for an explanation of rospy.rate(), I have looked it in the documentation and it says the following:

Convenience class for sleeping in a loop at a specified rate.

Can someone clarify this? What does it mean to sleep in a loop?

Documentation: http://docs.ros.org/jade/api/rospy/html/rospy.timer.Rate-class.html


Originally posted by michaelszer on ROS Answers with karma: 93 on 2017-06-26

Post score: 9


Original comments

Comment by jayess on 2017-06-26:
What's the link for the documentation that you're reading?

Comment by michaelszer on 2017-06-26:
I have added it to the question.

$\endgroup$

1 Answer 1

0
$\begingroup$

Rosanswers logo

From rospy Time wiki entry,

rospy.Rate(hz)

rospy provides a rospy.Rate convenience class which makes a best effort at maintaining a particular rate for a loop. For example:

r = rospy.Rate(10) # 10hz 
while not rospy.is_shutdown():
    pub.publish("hello")
    r.sleep()

In the above example, the Rate instance will attempt to keep the loop at 10hz by accounting for the time used by any operations during the loop. Rate.sleep() can throw a rospy.ROSInterruptException if the sleep is interrupted by shutdown.

Basically, it allows your loops to run at (nearly) the exact rate (in Hz) that you specify. It's a pretty standard way of looping with ROS. Check out the source code that's linked to in the documentation that you were looking at:

 87 -    def sleep(self): 
 88          """ 
 89          Attempt sleep at the specified rate. sleep() takes into 
 90          account the time elapsed since the last successful 
 91          sleep(). 
 92           
 93          @raise ROSInterruptException: if ROS shutdown occurs before 
 94          sleep completes 
 95          @raise ROSTimeMovedBackwardsException: if ROS time is set 
 96          backwards 
 97          """ 
 98          curr_time = rospy.rostime.get_rostime() 
 99          sleep(self._remaining(curr_time)) 
100          self.last_time = self.last_time + self.sleep_dur 
101   
102          # detect time jumping forwards, as well as loops that are 
103          # inherently too slow 
104          if curr_time - self.last_time > self.sleep_dur * 2: 
105              self.last_time = curr_time 

Go through the rospy tutorials if you haven't already. From the writing a publisher and subscriber tutorial:

rate = rospy.Rate(10) # 10hz

This line creates a Rate object rate. With the help of its method sleep(), it offers a convenient way for looping at the desired rate. With its argument of 10, we should expect to go through the loop 10 times per second (as long as our processing time does not exceed 1/10th of a second!)


Originally posted by jayess with karma: 6155 on 2017-06-26

This answer was ACCEPTED on the original site

Post score: 12


Original comments

Comment by img5d on 2019-07-24:
good answer.

Comment by lxg on 2020-08-06:
thanks for the answer. but what happens if the process timing exceeds 1/10th of a second?

Comment by jayess on 2020-08-06:
That really shouldn't change anything as long as your computer can handle it

Comment by lxg on 2020-08-07:
Thanks jayes. so is it safe to conclude that all the code within the while loop above will execute 10 times a second as long as the computer can handle it? regardless of the code within the while loop?

Comment by jayess on 2020-08-07:
I wouldn't want to make any sweeping generalizations, but I'd say generally yes. If you examine the code above, basically what's happening is that a call to r.sleep() sleeps for the amount of time needed to keep the loop running at the given rate as best as it can.

Comment by lxg on 2020-08-07:
alright, thank you. Does r.sleep() trying to maintain the given rate have anything to do with python scripts running even after Ctr + C is pressed. I mean ROS definitely stops but the script keeps executing especially if there are loops within the while loop. especially data read from a buffer. Could it be related or is it an entirely different issue?

Comment by jayess on 2020-08-08:
I'd say probably not, but if this is an issue that you're having then you should post a question about it

Comment by lxg on 2020-08-09:
thanks. i did. and it got answered.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.