Service
Service là mô hình giao tiếp dạng request/response: client gửi một yêu cầu có cấu trúc (request) tới đúng một server đang cung cấp service đó, server xử lý xong và trả về đúng một kết quả (response) tương ứng.
Khác topic ở chỗ có điểm bắt đầu và điểm kết thúc rõ ràng cho một lần gọi — giống gọi hàm từ một tiến trình khác hơn là phát một luồng dữ liệu. Một service chỉ có đúng một server xử lý tại một thời điểm (không "phát rộng" như topic), và client sẽ chờ tới khi nhận được response mới chạy tiếp.
Khi nào dùng service, khi nào dùng topic?
| Topic | Service | |
|---|---|---|
| Kiểu | Luồng liên tục, một chiều | Một lần hỏi, một lần đáp |
| Ví dụ | Dữ liệu cảm biến 10 Hz | "Đặt lại bộ đếm", "tính tổng hai số" |
| Người gửi biết kết quả? | Không | Có, khi server trả lời |
Xem từng bước
Client gửi a và b. Server cộng và trả về sum. Hãy theo dõi từng bước đang diễn ra.
Client chờ trong lúc server xử lý. Nếu server làm việc lâu (vài giây) thì dùng action thay vì service, sẽ học ở Module 12.
Ví dụ trong dự án: add_two_ints
Trong package ros2_basics có một server cộng hai số và một client gọi nó:
# Đăng ký service "add_two_ints" với hàm xử lý
self.service = self.create_service(AddTwoInts, "add_two_ints", self.on_add_two_ints)
# Hàm xử lý: nhận request, điền response, trả về
def on_add_two_ints(self, request, response):
response.sum = request.a + request.b
return response
Cần 2 terminal (đã source install/setup.bash, xem Module 0) — server giữ terminal chạy mãi, không tự thoát:
# Terminal 1 — để chạy, đừng tắt
ros2 run ros2_basics add_two_ints_server
# Terminal 2
ros2 run ros2_basics add_two_ints_client 3 5 # kết quả: 8
Thử ngay
# Terminal 2 — server ở Terminal 1 vẫn đang chạy
ros2 service list
ros2 service type /add_two_ints
ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 3, b: 5}"