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.theconstructsim.com/ros-5-mins-018-ros-message-part1/
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.pyprogram. You should see something like:
#! /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 (
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
#! /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
Step 3: Determine the proper ROS message type to use for a given topic
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_pubnode, so that the
help_msgtopic 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_msgto 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.
Prefer to watch a video demonstrating the steps above? We have one for you below!
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:
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.