In this post, we will see how to check the structure of ROS messages so we can properly use them in our programs.
This is the second part of this series, you can find the last one here: https://www.theconstruct.ai/ros-5-mins-018-ros-message-part1/
Let’s go!
Step 1: Grab a copy of the Project (ROSject) on ROSDS
We will use the project used in Part 1 of this series. Get it here: http://www.rosject.io/l/18f83296-0e7e-4c5c-95a7-2d3e3d6430d4/.
Once you have copied the project, open it up.
Step 2: Examine the structure of the String
message type
In the code, we used a ROS message type called String
. Let’s examine the structure of this message.
Pick a Shell from the Tools menu and run the following command:
user:~$ rosmsg show String [std_msgs/String]: string data [roseus/String]: string data
Pick the IDE from the Tools menu, navigate to catkin_ws/src
and open the obiwan_pub.py
program. You should see something like:
obiwan_pub.py
#! /usr/bin/env python import rospy from std_msgs.msg import String rospy.init_node("sos_2") rate = rospy.Rate(2) help_msg = String() help_msg.data = "help me Obi-Wan Kenobi, you're my only hope" pub = rospy.Publisher('/help_msg', String, queue_size = 1) while not rospy.is_shutdown(): pub.publish(help_msg) rate.sleep()
We see that the String
message is defined in two different packages (roseus
and std_msgs
), but we used the one defined in the std_msgs
package, as can be seen on line 4 of the code block.
We also see that the String
message has a single attribute named data
, which should be a string
. So, when creating a message of type String
, we need to set a value for data
, and the value must be a string (lines 8-9).
Now also take a look at the obiwan_sub.py
program:
obiwan_sub.py
#! /usr/bin/env python import rospy from std_msgs.msg import String def callback(msg): print "SOS received: '%s'!" %(msg.data) rospy.init_node('help_desk') sub = rospy.Subscriber('/help_msg', String, callback) rospy.spin()
We see that on lines 6-7 when accessing a message of type String
, we take it for granted that it has an attribute data
, therefore we could reference msg.data
.
Step 3: Determine the proper ROS message type to use for a given topic
In the obiwan_pub
program above, we created a new topic called /help_msg
. What if you are trying to publish to an existing topic and you are not sure the kind of message to send over it or you’re trying to subscribe to the topic and want to know what to expect? PS: every topic has a message type you must publish over it, or things will not work properly.
Let’s pretend we didn’t know the kind of message /help_msg
uses – we just know the name of the topic. Let’s see how we can find out:
- Start the
obiwan_pub
node, so that thehelp_msg
topic is created.
user:~$ cd catkin_ws/src user:~/catkin_ws/src$ ./obiwan_pub.py
- Now pick another Shell from the Tools menu and run
rostopic info /help_msg
to find out the type of message it uses:
ser:~$ rostopic info /help_msg Type: std_msgs/String Publishers: * /sos_2 (http://rosdscomputer:34691/) Subscribers: None
- So now we see that it uses the message
std_msgs/String
, and we can know about this message by running. Here, we are specifying the package name (std_msgs) also, since we know it for sure:
user:~$ rosmsg show std_msgs/String string data
Step 4: Wrapping it up
In summary, in order to use a ROS message properly, you need to know its structure. If you are working with an existing ROS topic, you can check what kind of message it uses and then check the structure of that message.
Extra: Video
Prefer to watch a video demonstrating the steps above? We have one for you below!
Related Resources
If you are a ROS beginner and want to learn ROS basics fast, we recommend you take any of the following courses on Robot Ignite Academy:
Feedback
Did you like this post? Whatever the case, please leave a comment in the comments section below, so we can interact and learn from each other.
If you want to learn about other ROS topics, please let us know in the comments area and we will do a post or video about it.
Thank you!
0 Comments