# Custom Service ในบทนี้เราจะเรียนรู้การสร้าง Service แบบกำหนดเอง (Custom Service) ซึ่งเป็นรูปแบบการสื่อสาร ระหว่างโหนด (Node) ในลักษณะ “ถาม–ตอบ” (Request–Response) ## สร้างไฟล์.srv เปิด VS Code ขึ้นมา สร้างโฟลเดอร์ srv ```{image} images/c12/12.1.1.png :width: 80% :align: center ``` สร้างไฟล์ AddTwoInts.srv ```{image} images/c12/12.1.2.png :width: 80% :align: center ``` เพิ่มเนื้อหาในไฟล์ AddTwoInts.srv ```{code-block} bash int64 a int64 b --- int64 sum ``` ```{image} images/c12/12.1.3.png :width: 80% :align: center ``` เพิ่มเนื้อหาใน CMakeList.txt ```{code-block} bash find_package(rosidl_default_generators REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} "msg/RobotStatus.msg" "srv/AddTwoInts.srv" ) ``` ```{image} images/c12/12.1.4.png :width: 80% :align: center ``` เปิด Terminal ขึ้นมา เพื่อทำการ คอมไพล์ ```{code-block} bash cd ~/ros2_ws colcon build ``` ```{image} images/c12/12.1.5.png :width: 80% :align: center ``` ตรวจสอบว่า service ถูกสร้างสำเร็จ ```{code-block} bash ros2 interface show custom_tutorials/srv/AddTwoInts ``` ```{image} images/c12/12.1.6.png :width: 80% :align: center ``` ## ทดลองใช้ Custom Service ที่เราสร้างไว้ (AddTwoInts.srv) สร้าง โหนด add_two_ints_server.py และ add_two_ints_client.py ภายใน my_package ```{image} images/c12/12.2.1.png :width: 80% :align: center ``` ตัวอย่างโค้ด add_two_ints_server.py ```{code-block} python import rclpy from rclpy.node import Node from custom_tutorials.srv import AddTwoInts class AddTwoIntsServer(Node): def __init__(self): super().__init__('add_two_ints_server') self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.callback) def callback(self, request, response): response.sum = request.a + request.b self.get_logger().info(f'Request: {request.a} + {request.b} = {response.sum}') return response def main(): rclpy.init() node = AddTwoIntsServer() rclpy.spin(node) rclpy.shutdown() if __name__ == '__main__': main() ``` ตัวอย่างโค้ด add_two_ints_client.py ```{code-block} python import rclpy from rclpy.node import Node from custom_tutorials.srv import AddTwoInts class AddTwoIntsClient(Node): def __init__(self): super().__init__('add_two_ints_client') self.client = self.create_client(AddTwoInts, 'add_two_ints') while not self.client.wait_for_service(timeout_sec=1.0): self.get_logger().info('Waiting for service...') def send_request(self, a, b): req = AddTwoInts.Request() req.a = a req.b = b future = self.client.call_async(req) rclpy.spin_until_future_complete(self, future) return future.result() def main(): rclpy.init() node = AddTwoIntsClient() response = node.send_request(3, 7) node.get_logger().info(f'Result: {response.sum}') rclpy.shutdown() if __name__ == '__main__': main() ``` ตั้งค่า setup.py ```{code-block} bash 'add_two_ints_server = my_package.add_two_ints_server:main', 'add_two_ints_client = my_package.add_two_ints_client:main', ``` ```{image} images/c12/12.2.2.png :width: 80% :align: center ``` เปิด Terminal ขึ้นมา ทำการ คอมไพล์ ```{code-block} bash cd ~/ros2_ws colcon build ``` ```{image} images/c12/12.2.3.png :width: 80% :align: center ``` ทดสอบการทำงานของโหนด add_two_ints_server และ add_two_ints_client กับ AddTwoInts Service ```{code-block} bash ros2 run my_package add_two_ints_server ``` ```{code-block} bash ros2 run my_package add_two_ints_client ``` ```{image} images/c12/12.2.4.png :width: 80% :align: center ```