1、新建功能包
ros2 pkg create pkg_service --build-type ament_python --dependencies rclpy --node-name server_demo
2、服務端實現
import rclpy from rclpy.node import Node from example_interfaces.srv import AddTwoInts class Service_Server(Node): def __init__(self, name): super().__init__(name)
# 創建一個服務端,使用的是create_service函數
# 參數分別爲:服務數據類型、服務名稱、服務回調函數 self.src = self.create_service(AddTwoInts, "/add_two_ints", self.AddTwoInts_callback)
# 定義服務回調函數 def AddTwoInts_callback(self, request, response): response.sum = request.a + request.b print("result.sum = ", response.sum) return response def main(): rclpy.init() server_demo = Service_Server("server_node") rclpy.spin(server_demo) server_demo.destroy_node() rclpy.shutdown()
ros2 interface show example_interfaces/srv/AddTwoInts
3、客戶端實現
import rclpy from rclpy.node import Node from example_interfaces.srv import AddTwoInts class Service_Client(Node): def __init__(self, name): super().__init__(name)
# 創建客戶端,使用create_client函數
# 傳入參數分別是:服務數據類型、服務名稱 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() def send_request(self): self.request.a = 10 self.request.b = 20
# 發送服務請求 self.future = self.client.call_async(self.request) def main(): rclpy.init() client_demo = Service_Client("client_node") client_demo.send_request() # 發送服務請求 while rclpy.ok(): rclpy.spin_once(client_demo)
# 判斷數據是否處理完成 if client_demo.future.done(): try:
# 獲取服務返回結果 response = client_demo.future.result() print("request.a = ", client_demo.request.a) print("request.b = ", client_demo.request.b) print("response.sum = ", response.sum) except Exception as e: print("Service call failed") break client_demo.destroy_node() rclpy.shutdown()
4、編輯配置文件、編譯工作空間
cd ~/ros_ws colcon build --package-selects pkg_service source install/setup.bash
5、運行程序
ros2 run pkg_service server_demo ros2 run pkg_service client_demo
服務端打印: