A few days ago I started writing a series of tutorials that ease the work of beginners in ROS. The first tutorial was about a template for a publisher node, and the second tutorial was about a template for a subscriber node in ROS.
Today, I continue the series of tutorials with a template for a publisher and a subscriber node in Python. In addition, I’ll test it by writing and running a publisher and subscriber node.
Copy the template into a ‘. py’ file, delete the information that you don’t need and replace the text in capital letters.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#ROS Node Subscriber & Publisher template
#!/usr/bin/env python
#remove or add the library/libraries for ROS
import rospy, time, math, cv2, sys
#remove or add the message type
from std_msgs.msg import String, Float32, Image, LaserScan, Int32
varS=None
#define function/functions to provide the required functionality
def fnc_callback(msg):
    global varS
    varS==do_something(msg.data)
if __name__==‘__main__’:
    #Add here the name of the ROS. In ROS, names are unique named.
    rospy.init_node(‘NODE_NAME’)
    #subscribe to a topic using rospy.Subscriber class
    sub=rospy.Subscriber(‘TOPIC_NAME’, THE_TYPE_OF_THE_MESSAGE, fnc_callback)
    #publish messages to a topic using rospy.Publisher class
    pub=rospy.Publisher(‘TOPIC_NAME’, THE_TYPE_OF_THE_MESSAGE, queue_size=1)
    rate=rospy.Rate(10)
    while not rospy.is_shutdown():
        if varS<= var2:
            varP=something()
        else:
            varP=something()
        pub.publish(varP)
        rate.sleep()
|
I used the above template to write a ROS node that will display the random numbers received from another node, then I add some conditional statements, and finally I publish the results.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#!/usr/bin/env python
import rospy
from std_msgs.msg import Int32
varS=None
def fnc_callback(msg):
    global varS
    varS=msg.data
 Â
if __name__==‘__main__’:
    rospy.init_node(‘NODE_SUB_AND_PUB’)
 Â
    sub=rospy.Subscriber(‘rand_no’, Int32, fnc_callback)
    pub=rospy.Publisher(‘sub_pub’, Int32, queue_size=1)
    rate=rospy.Rate(10)
    while not rospy.is_shutdown():
        if varS<= 2500:
            varP=0
        else:
            varP=1
 Â
        pub.publish(varP)
        rate.sleep()
|
To run the above node, navigate to the .py file and make it executable. The command is:
C++
1
|
chmod u+x my_python_file.py
|
After the file is executable, you can run the node.
Step 1: open a new Terminal and run the command:
C++
1
|
roscore
|
Step 2: open a new Terminal and run the publisher node with the following command:
C++
1
|
rosrun your_package your_ros_node_that_generates_random_number.py
|
Step 3: open a new Terminal and run the publisher and subscriber node with the following command:
C++
1
|
rosrun your_package your_ros_node_for_publisher_and_subscriber.py
|