Understanding ROS Services for Request-Response Interactions
📖 Scenario: You are building a simple robot control system using ROS (Robot Operating System). You want the robot to perform specific actions only when requested, and get a clear response back confirming the action or providing data.
🎯 Goal: Build a ROS service that handles a request from a client and sends back a response, demonstrating how services manage request-response interactions in ROS.
📋 What You'll Learn
Create a ROS service server node with a specific service name
Define a service type with request and response fields
Implement the service callback function to process requests and send responses
Create a ROS service client node that sends a request and waits for the response
💡 Why This Matters
🌍 Real World
Robots often need to perform specific actions only when asked, such as moving to a position or reading a sensor value. ROS services let one part of the robot ask another part to do something and wait for the answer.
💼 Career
Understanding ROS services is essential for robotics developers to build modular and interactive robot software that communicates reliably.
Progress0 / 4 steps
1
Create the ROS service definition file
Create a ROS service definition file named AddTwoInts.srv with two integers a and b as request fields, and one integer sum as the response field.
ROS
Hint
This file defines the request and response parts separated by ---.
2
Create the ROS service server node
Write a Python ROS node named add_two_ints_server.py that imports rospy and the AddTwoInts service. Initialize the node with rospy.init_node('add_two_ints_server') and create a service named 'add_two_ints' using rospy.Service with the service type AddTwoInts and a callback function handle_add_two_ints.
ROS
Hint
The callback function takes the request and returns the response.
3
Create the ROS service client node
Write a Python ROS node named add_two_ints_client.py that imports rospy and the AddTwoInts service. Initialize the node with rospy.init_node('add_two_ints_client'). Wait for the service 'add_two_ints' to be available using rospy.wait_for_service('add_two_ints'). Create a service proxy with rospy.ServiceProxy('add_two_ints', AddTwoInts) and call it with a=5 and b=3 to get the response.
ROS
Hint
The client sends a request and waits for the response from the server.
4
Print the response from the service
Add a line to print the sum field from the response object returned by the service call in add_two_ints_client.py.
ROS
Hint
Access the sum attribute from the response object to display the result.
Practice
(1/5)
1. Why do ROS services handle request-response interactions instead of continuous data streams?
easy
A. Because services continuously send data without waiting
B. Because services are designed for immediate answers to specific requests
C. Because services only work with sensor data streams
D. Because services store data for later use
Solution
Step 1: Understand the purpose of ROS services
ROS services are meant to handle specific requests and provide immediate responses, unlike topics which handle continuous data streams.
Step 2: Compare services with other communication methods
Services wait for a request, process it, and send back a response, making them ideal for commands or queries needing quick answers.
Final Answer:
Because services are designed for immediate answers to specific requests -> Option B
Quick Check:
Request-response = immediate answers [OK]
Hint: Services = ask once, get answer once [OK]
Common Mistakes:
Confusing services with continuous data streams
Thinking services store data permanently
Assuming services only handle sensor data
2. Which of the following is the correct way to define a ROS service in code?
easy
A. service = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)
B. service = rospy.Publisher('add_two_ints', AddTwoInts, queue_size=10)
C. service = rospy.Subscriber('add_two_ints', AddTwoInts, callback)
D. service = rospy.ActionServer('add_two_ints', AddTwoInts, execute_cb)
Solution
Step 1: Identify the correct ROS service creation syntax
In ROS Python, a service is created using rospy.Service with the service name, service type, and handler function.
Step 2: Differentiate from other communication types
Publisher and Subscriber are for topics, ActionServer is for actions, not services.
Final Answer:
service = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints) -> Option A
Quick Check:
rospy.Service creates services [OK]
Hint: Services use rospy.Service, not Publisher or Subscriber [OK]
Common Mistakes:
Using Publisher or Subscriber instead of Service
Confusing ActionServer with Service
Missing the handler function argument
3. Given this ROS service client code snippet, what will be the output if the service returns sum=7?
C. rospy.spin() should be called before service creation
D. The handler must return a response object, not just a sum
Solution
Step 1: Check the handler function return type
The handler must return a response object of the service type, not just a raw sum value.
Step 2: Understand ROS service response structure
Returning only req.a + req.b causes an error; the correct return is AddTwoIntsResponse(req.a + req.b).
Final Answer:
The handler must return a response object, not just a sum -> Option D
Quick Check:
Handler returns response object [OK]
Hint: Handler returns response object, not raw value [OK]
Common Mistakes:
Returning raw values instead of response objects
Calling rospy.spin() too early
Incorrect service name format
5. You want to design a ROS system where a robot arm must receive a command and confirm completion immediately. Why is using a service better than a topic for this interaction?
hard
A. Because services provide a direct request-response, ensuring the command was received and processed
B. Because topics automatically guarantee message delivery and response
C. Because topics are faster for one-time commands
D. Because services can send continuous sensor data streams
Solution
Step 1: Analyze the communication needs for command and confirmation
The robot arm needs to know immediately if the command was received and completed, requiring a synchronous interaction.
Step 2: Compare services and topics for this use case
Services provide a request-response pattern, confirming completion, while topics are asynchronous and do not guarantee immediate feedback.
Final Answer:
Because services provide a direct request-response, ensuring the command was received and processed -> Option A
Quick Check:
Request-response ensures confirmation [OK]
Hint: Use services for commands needing immediate confirmation [OK]
Common Mistakes:
Thinking topics guarantee immediate response
Using services for continuous data streaming
Confusing speed with communication pattern
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.