Ask Your Question
1

Explanation of rospy.Rate()

asked 2017-06-26 18:14:20 -0500

michaelszer gravatar image

updated 2018-06-05 07:38:47 -0500

felix k gravatar image

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/ht...

edit retag flag offensive close merge delete

Comments

What's the link for the documentation that you're reading?

jayess gravatar imagejayess ( 2017-06-26 18:40:59 -0500 )edit

I have added it to the question.

michaelszer gravatar imagemichaelszer ( 2017-06-26 18:48:32 -0500 )edit

1 Answer

Sort by ยป oldest newest most voted
5

answered 2017-06-26 19:17:54 -0500

jayess gravatar image

updated 2017-06-26 19:23:57 -0500

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!)

edit flag offensive delete link more

Comments

good answer.

img5d gravatar imageimg5d ( 2019-07-24 19:34:07 -0500 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2017-06-26 18:14:20 -0500

Seen: 7,956 times

Last updated: Jun 05 '18