[ros-users] First Message Missing

Ken Conley kwc at willowgarage.com
Sun Sep 12 22:56:30 UTC 2010


Hi David,

There are a couple of issues here:

 1) your program starts and then exits, which means that only
subscribers that are really fast will get the message. Your node needs
to stay up if you want to guarantee that others receive its message
 2) you probably want to enable 'latching', described below

ROS topics are like tuning into a streaming broadcast -- if you tune
in 15 minutes late, you don't get to see the stat. Imagine you are
streaming data from the camera -- you want to start receiving messages
the most recent one available.

The fact that you're getting slightly different results is generally
initialization latency. If you put the Publisher init before the call
to init_node(), then the rospy node is able to send this data
immediately when it communicates with the master. If you put the
Publisher init call after init_node(), it has to go back to the
master, which incurs more latency.

There is a different behavior you can enable with ROS called
'latching', where a publisher will store the most recently published
message indefinitely and send it to any new subscriber. We often use
this behavior for data that can be static or slowly changing, like
maps.

See:
http://www.ros.org/wiki/rospy/Overview/Publishers%20and%20Subscribers#rospy.Publisher_initialization

You probably want to add a rospy.spin() or other sort of delay at the
end as well.

HTH,
Ken

On Sun, Sep 12, 2010 at 3:34 PM, David Lu!! <davidlu at wustl.edu> wrote:
> Hey all,
> I'm not quite sure if this is a bug, or if it is, where to file it,
> but it took me forever to track down the problem.
>
> Here's my test program based on rospy tutorials. (I'm using C-Turtle
> binaries on 10.04)
> #!/usr/bin/python
> import roslib; roslib.load_manifest('crazy')
> import rospy
> from std_msgs.msg import String
>
> def talker():
>    pub = rospy.Publisher('chatter', String)
>    rospy.init_node('talker', anonymous=True)
>    str = "hello world"
>    pub.publish(str)
>
> if __name__ == '__main__':
>    try:
>        talker()
>    except rospy.ROSInterruptException: pass
>
> Fairly standard, and it works like you would expect. However, if you
> switch the order of 7th and 8th lines, i.e.
>    rospy.init_node('talker', anonymous=True)
>    pub = rospy.Publisher('chatter', String)
> ...it does NOT publish the message.
>
> However, when I add a sleep(1) command after Publisher line, then it
> works fine.
>
> Is this...
> A) A bug
> B) A situation where I should just sleep
> C) A situation where I should publish the message repeatedly until I'm
> sure it's received.
>
> Thanks,
> -David!!
> _______________________________________________
> ros-users mailing list
> ros-users at code.ros.org
> https://code.ros.org/mailman/listinfo/ros-users
>



More information about the ros-users mailing list