Các câu lệnh cơ bản với Dịch vụ (Service) – Vietnamese ROS2 Tutorial

Written by Tung Ngo

07/05/2024

This tutorial is created by Robotics Ambassador Tung

 

Robotics Ambassador: theconstruct.ai/robotics-ambassador/

Xin chào các bạn!

Hôm nay mình sẽ hướng dẫn các bạn các câu lệnh cơ bản với Dịch vụ (Service) trong ROS2 sử dụng nền tảng The Construct.

Nguồn tham khảo

  1. Nền tảng học ROS trực tuyến The Construct
  2. Khóa học ROS2 cơ bản (Python) ROS2 Basics in 5 Days

Liệt kê các Dịch vụ đang sẵn sàng hoạt động

Đầu tiên chúng ta sẽ làm quen với câu lệnh giúp liệt kê tất cả các Dịch vụ đang sẵn sàng hoạt động trên hệ thống ROS2 bằng lệnh sau:

source /opt/ros/humble/setup.sh
ros2 service list

Sau khi nhập lệnh trên, Terminal sẽ hiện ra danh sách đầy đủ các Dịch vụ đang sẵn sàng hoạt động. Trong bài hôm nay, chúng ta sẽ làm việc với hai Dịch vụ rất đơn giản là /moving/stop . Khi gọi Dịch vụ /moving thì robot sẽ tự động di chuyển ngẫu nhiên, còn khi gọi Dịch vụ /stop thì robot sẽ dừng di chuyển.

Thông tin chi tiết về một Dịch vụ

Sau khi đã liệt kê các Dịch vụ đang sẵn sàng hoạt động, chúng ta cùng tìm hiểu các câu lệnh để xem thông tin chi tiết về chúng. Để biết một Dịch vụ có kiểu dữ liệu là gì, ta sử dụng câu lệnh ros2 service type . Các bạn hãy thử câu lệnh này với Dịch vụ /moving nhé:

ros2 service type /moving

Terminal hiện ra kiểu dữ liệu của Dịch vụ /movingstd_srvs/srv/Empty . Hi vọng các bạn còn nhớ cách để xem thông tin chi tiết của một interface mà mình đã hướng dẫn trong các bài trước. Ở đây để xem thông tin chi tiết của kiểu dữ liệu std_srvs/srv/Empty mình sử dụng lệnh liên quan tới interface như sau:

ros2 interface show std_srvs/srv/Empty

Terminal hiện lên ba dấu gạch ngang. Một kiểu dữ liệu Dịch vụ sẽ gồm hai phần là Yêu cầu (Request) ở trước ba dấu gạch ngang và phần Phản hồi (Response) ở sau ba dấu gạch ngang. Tuy nhiên, trong trường hợp này ta không thấy thông tin gì hiện lên ngoài ba dấu gạch ngang. Đây là do kiểu dữ liệu std_srvs/srv/Empty không yêu cầu truyền dữ liệu gì cả, mà nó thường được dùng để chỉ kích hoạt một hành động nào đó của robot mà không tốn băng thông truyền tải dữ liệu.

Hầu hết các kiểu dữ liệu Dịch vụ nào cũng sẽ có quy định cụ thể yêu cầu và phản hồi là gì. Ta cùng thử một loại kiểu dữ liệu Dịch vụ khác để thấy rõ hơn:

ros2 interface show std_srvs/srv/SetBool

Như các bạn thấy trên Terminal, Dịch vụ này chỉ nhận Yêu cầu là một dữ liệu dạng bool và sẽ phản hồi hai lại hai thông tin. Một thông tin là tín hiệu xác nhận Dịch vụ đã được kích hoạt hay chưa, cũng thuộc dạng bool. Thông tin còn lại là một thông báo chi tiết định dạng string.

Gọi một Dịch vụ

Sau khi đã liệt kê các Dịch vụ đang sẵn sàng hoạt động và thông tin chi tiết của chúng, chúng ta sẽ tiếp tục tìm hiểu cách gọi các Dịch vụ mà chúng ta cần. Câu lệnh để gọi một Dịch vụ là ros2 service call. Câu lệnh này có cú pháp như sau:

ros2 service call <service_name> <service_type> <value>

Trong đó:

  • <service_name>: tên của Dịch vụ
  • <service_type>: kiểu dữ liệu của Dịch vụ
  • <value>: giá trị muốn truyền tới Dịch vụ trong Yêu cầu

Trong bài hôm nay, chúng ta sẽ thực hành gọi một Dịch vụ cụ thể /moving với câu lệnh như sau:

ros2 service call /moving std_srvs/srv/Empty

Như mình đã nói ở trên, do kiểu dữ liệu của Dịch vụ std_srvs/srv/Empty không yêu cầu dữ liệu truyền vào nên phần Giá trị <value> của câu lệnh được bỏ trống. Khi nhập câu lệnh này, hệ thống sẽ thực hiện tuần tự các hoạt động như sau:

  • Tìm một Dịch vụ trên hệ thống có tên là /moving
  • Tạo một Client (Khách hàng) trên hệ thống với một Yêu cầu được gửi tới Dịch vụ tương ứng
  • Đợi Server trả lời và thông báo kết quả

Đồng thời các bạn sẽ thấy là trong phần mô phỏng Gazebo thì robot cũng bắt đầu chạy sau khi mình gọi Dịch vụ /moving .

Bây giờ mình sẽ gửi yêu cầu gọi tới Dịch vụ /stop để dừng robot lại. Cách làm cũng hoàn toàn tương tự như khi gọi Dịch vụ /moving .

Ta cùng xem kiểu dữ liệu của Dịch vụ /stop bằng lệnh:

ros2 service type /stop

Vậy là kiểu dữ liệu của Dịch vụ /stop cũng giống như Dịch vụ /moving, đều là std_srvs/srv/Empty. Tiếp theo, ta sẽ gọi Dịch vụ /stop này để dừng robot lại vơi cách làm tương tự như khi gọi Dịch vụ /moving:

ros2 service call /stop std_srvs/srv/Empty

Sau khi Dịch vụ /stop được gọi thì robot cũng đã dừng lại trên phần mô phỏng.

Vậy là trong bài viết này mình đã hướng dẫn các bạn các câu lệnh cơ bản để thao tác với Dịch vụ (Service) ở trong ROS2. Chúc các bạn thực hành thành công!

 

Video Tutorial

Topics:
Masterclass 2023 batch2 blog banner

Check Out These Related Posts

0 Comments

Pin It on Pinterest

Share This