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
- Nền tảng học ROS trực tuyến The Construct
- 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
và /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ụ /moving
là std_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!
0 Comments