예제로 사용할 service입니다.

ros2 interface show example_interfaces/srv/AddTwoInts

Screenshot from 2023-01-27 16-47-31.png

형태를 보면 두개의 정수를 받아 합을 반환해주는 service임을 알 수 있습니다.

Service server

service_server.py

from example_interfaces.srv import AddTwoInts

import rclpy
from rclpy.node import Node

class MinimalService(Node):

    def __init__(self):
        super().__init__('minimal_service')
        self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_two_ints_callback)

    # reuqust를 처리하여 response로 돌려 줍니다.
    def add_two_ints_callback(self, request, response):
        response.sum = request.a + request.b
        self.get_logger().info('Incoming request\\na: %d b: %d' % (request.a, request.b))

        return response

def main(args=None):
    rclpy.init(args=args)

    minimal_service = MinimalService()

    rclpy.spin(minimal_service)

    rclpy.shutdown()

if __name__ == '__main__':
    main()

Service client

service_client.py

import sys

from example_interfaces.srv import AddTwoInts
import rclpy
from rclpy.node import Node

class MinimalClientAsync(Node):

    def __init__(self):
        super().__init__('minimal_client_async')
        self.cli = self.create_client(AddTwoInts, 'add_two_ints')
        while not self.cli.wait_for_service(timeout_sec=1.0):
            self.get_logger().info('service not available, waiting again...')
        self.req = AddTwoInts.Request()

# request하는 함수
    def send_request(self, a, b):
        self.req.a = a
        self.req.b = b
        self.future = self.cli.call_async(self.req)
        rclpy.spin_until_future_complete(self, self.future)
        return self.future.result()

def main(args=None):
    rclpy.init(args=args)

    minimal_client = MinimalClientAsync()
# client는 실행할 때 두개의 인자를 입력해야합니다.
# 받은 인자를 request 합니다.
    response = minimal_client.send_request(int(sys.argv[1]), int(sys.argv[2]))
    minimal_client.get_logger().info(
        'Result of add_two_ints: for %d + %d = %d' %
        (int(sys.argv[1]), int(sys.argv[2]), response.sum))

    minimal_client.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

setup.py

'service_server = first_package.service_server:main',
'service_client = first_package.service_client:main'

Screenshot from 2023-01-27 20-26-08.png

실행

빌드 후 실행하면 됩니다.

colcon build --packages-select first_package
ros2 run first_package service_server

Screenshot from 2023-01-27 16-56-26.png

ros2 run first_package service_server 1 2