Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add option to wait for two subscriptions #4674

Merged
Original file line number Diff line number Diff line change
Expand Up @@ -244,36 +244,43 @@ Now that you have the message structure, you can publish data to a topic directl

The ``'<args>'`` argument is the actual data you'll pass to the topic, in the structure you just discovered in the previous section.

The turtle (and commonly the real robots which it is meant to emulate) require a steady stream of commands to operate continuously.
So, to get the turtle moving, and keep it moving, you can use the following command.
It's important to note that this argument needs to be input in YAML syntax.
Input the full command like so:

.. code-block:: console

ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

With no command-line options, ``ros2 topic pub`` publishes the command in a steady stream at 1 Hz.

.. image:: images/pub_stream.png

At times you may want to publish data to your topic only once (rather than continuously).
To publish your command just once add the ``--once`` option.

.. code-block:: console

ros2 topic pub --once -w 2 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so the prerequisites is that turtle nodes are up and running, but i think that is okay to have -w option here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that in my experience (running all of this in Docker) the -w 2 option is mandatory. If you don't use it, the results are inconsistent: The topic pub begins running as soon as it sees the first subscriber. Therefore: Sometimes the turtle moves (and you see nothing in the topic echo window), sometimes the turtle does not move (and you see something in the topic echo window). The only way I was able to guarantee the behavior the tutorial is trying to demonstrate is to use -w 2


``--once`` is an optional argument meaning “publish one message then exit”.

``-w 2`` is an optional argument meaning “wait for two matching subscriptions”.
This is needed because we have both turtlesim and the topic echo subscribed.

You will see the following output in the terminal:

.. code-block:: console

Waiting for at least 2 matching subscription(s)...
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

And you will see your turtle move like so:

.. image:: images/pub_once.png

The turtle (and commonly the real robots which it is meant to emulate) require a steady stream of commands to operate continuously.
So, to get the turtle to keep moving, you can run:

.. code-block:: console

ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

The difference here is the removal of the ``--once`` option and the addition of the ``--rate 1`` option, which tells ``ros2 topic pub`` to publish the command in a steady stream at 1 Hz.

.. image:: images/pub_stream.png

You can refresh rqt_graph to see what's happening graphically.
You will see that the ``ros2 topic pub ...`` node (``/_ros2cli_30358``) is publishing over the ``/turtle1/cmd_vel`` topic, which is being received by both the ``ros2 topic echo ...`` node (``/_ros2cli_26646``) and the ``/turtlesim`` node now.
Expand Down