ROS 2 Service Communication
1. Introduction
Service communication is a request--response communication model. The client sends a request, and the server processes it and returns a response.
2. Create a New Package
ros2 pkg create pkg_service --build-type ament_python --dependencies rclpy --node-name server_demo
3. Server Implementation
3.1 Create the Server Node
Edit server_demo.py:
import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts
class Service_Server(Node):
def __init__(self, name):
super().__init__(name)
self.srv = self.create_service(
AddTwoInts,
'/add_two_ints',
self.Add2Ints_callback
)
def Add2Ints_callback(self, request, response):
response.sum = request.a + request.b
print("response.sum =", response.sum)
return response
def main():
rclpy.init()
server_demo = Service_Server("publisher_node")
rclpy.spin(server_demo)
server_demo.destroy_node()
rclpy.shutdown()
3.2 Inspect the Service Interface
ros2 interface show example_interfaces/srv/AddTwoInts
3.3 Register the Server in setup.py
'server_demo = pkg_service.server_demo:main',
3.4 Build the Package
colcon build --packages-select pkg_service
3.5 Run the Server
ros2 run pkg_service server_demo
3.6 Call the Service
ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 1, b: 4}"
4. Client Implementation
4.1 Create the Client File
Create client_demo.py.
4.2 Client Implementation Code
import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts
class Service_Client(Node):
def __init__(self, name):
super().__init__(name)
self.client = self.create_client(AddTwoInts, '/add_two_ints')
while not self.client.wait_for_service(timeout_sec=1.0):
print("Service not available, waiting...")
self.request = AddTwoInts.Request()
self.request.a = 10
self.request.b = 20
self.future = self.client.call_async(self.request)
self.future.add_done_callback(self.response_callback)
def response_callback(self, future):
try:
response = future.result()
print("Service response:", response.sum)
except Exception as e:
print("Service call failed:", e)
def main():
rclpy.init()
client_demo = Service_Client("client_node")
rclpy.spin(client_demo)
client_demo.destroy_node()
rclpy.shutdown()
4.3 Register the Client in setup.py
'client_demo = pkg_service.client_demo:main',
4.4 Rebuild the Package
colcon build --packages-select pkg_service
4.5 Run the Client
Ensure the server is running first:
ros2 run pkg_service server_demo
Then run the client:
ros2 run pkg_service client_demo
Maintained by HemiHex.