• +4917626969472
  • info@ur-techpartner.de

ROS Basics (10/17) – Use Service (Service Client)

Robot Operating System(ROS1/ROS2) ROS Programming

ROS Basics – Call Service using Service Client Program

Since there is a service and a service provider (service server) that we have already implemented, now there must be some client that uses the service.

Using a Service

The simplest way to use a service is to call it with “rosserive call” command. The structure of this command is as follows

rosservice call [Service_Name] [Arguments]

We have already use the command to call the service in previous blog as follows

rosservice call words_count “These are four lines”

We can use above commands to check whether any service is running properly or not.

However, the more useful way to use a service is to call it from another running node. Therefore, now we will call the service by developing a service client program.

Service Client Program

We will develop a client program for the same service “WordCount” that we have defined and Implemented in previous blogs.

Run following command to see the structure of the service message

rossrv show ros_basics/WordCount

We can see the structure in figure below

Where, the input (or request) of the service is a string type variable “words”.

While the output (or response) of the service is an unsigned integer type variable “count”.

Now we go to the package “ros_basics” and create the client node.

Run the commands

roscd ros_basics
cd src
ls

(ls command is run just to verify that the file is not already created)

Create the file “service_client.py”

Run command

touch service_client.py

give execute permission

chmod +x service_client.py

Open the file using “gedit” command and copy and paste following code in it.

gedit service_client.py

 

#!/usr/bin/env python
import rospy
from ros_basics.srv import WordCount, WordCountRequest

rospy.init_node('service_client')
rospy.wait_for_service('words_count')

word_counter = rospy.ServiceProxy('words_count', WordCount)
request = WordCountRequest()
request.words = "It is raining today"

result = word_counter (request)
#print result
#Simply "print result" will also work, however we print more clearly

print "Sentence is: ", request.words
print "Words Count: ", result.count

All above executed commands are shown in figure below

The “service_client.py” file will look like in figure below

Save and close the file.

Explaining the Code in Python file “service_client.py”

We will explain the important code lines here

#!/usr/bin/env python
import rospy

from ros_basics.srv import WordCount, WordCountRequest

#In above line, we are importing service message classes used by the service as already done before.

rospy.init_node(‘service_client’)

#In this line, we have initiated a ROS node named service_client

rospy.wait_for_service(‘words_count’)

#In this line, the program is waiting for the service “words_count”. It is possible that the service is not yet advertised (For example service server node is not running). Therefore, the program will not move forward until the service is available. It is different from topic, where we can subscribe to a topic which is not yet advertised. However, we will get error if we try to access a service which is not yet available.

word_counter = rospy.ServiceProxy(‘words_count’, WordCount)

# In this line, we have created a connection to the service. The object “word_counter” will be used to communicate with service server.

request = WordCountRequest()

#In above line, we have created an object of type “WordCountRequest”

request.words = “It is raining today”

#We have assigned value to the variable words of object request (you may notice that “words” is the string type variable in input part of service message)

result = word_counter (request)

# We sent the request through connection object.

#print result
#Simply “print result” will also work, however we print more clearly as below

print “Sentence is: “, request.words
print “Words Count: “, result.count

# This line will print the sentence and received result.

Executing the file “service_client.py”

Now we will use the service by running the program file “service_client.py”

First run the master

roscore

Then we will have to start the service by initiating service_server node (For this run python program file servoce_server.py)

Run following command in new terminal

rosrun ros_basics service_server.py

As the service is running, the terminal will look like in figure below

Now we call the service using service client program

Run the command in new terminal

rosrun ros_basics service_client.py

Congratulations: You have successfully created a client program to use the service.

Note: You do not need to build the work space for running a node using rosrun command. However, if you face any problem, you can again build the workspace using “catkin_make” command and “source” it as done before.

Conclusion

You have learned how to define, implement and use a service. We have given you core concept of the service, which is second main communication mechanism in ROS. You can learn more about service by exploring its documentation.

You should use service when it is completed in short time. If you want to perform any task which may take longer or not bounded, then you should use another ROS communication mechanism called Action.

We will learn about Action in next blogs.

No comments