with-RL
로봇 / ROS2024년 1월 27일

ROS2 Minimal Tutorial - Service

이 포스트는 이전 포스트에 이어서 ROS2의 Service에 대한 간단한 설명입니다.

이 포스트는 다음 과정을 완료한 후에 참고하시길 바랍니다.

1. Service

(img-src) https://docs.ros.org/en/foxy/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Services/Understanding-ROS2-Services.html
$ cd ~/Workspace/ros_ws
$ source install/setup.bash
$ ros2 launch ros_tutorial turtlesim.launch.py
$ ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 1.0, y: 1.0, theta: 0.0}"
$ ros2 service list
$ ros2 service type /turtle1/teleport_absolute
$ ros2 service find turtlesim/srv/TeleportAbsolute
$ ros2 interface show turtlesim/srv/TeleportAbsolute

2. Service - Client

<depend>turtlesim</depend>
'turtlesim_abs_client = ros_tutorial.turtlesim_abs_client:main',
#!/usr/bin/env python3

import rclpy
from rclpy.node import Node
from turtlesim.srv import TeleportAbsolute


class TurtlesimAbsoluteClient(Node):
    def __init__(self):
        super().__init__('turtlesim_abs_client')

        self.client = self.create_client(TeleportAbsolute, '/turtle1/teleport_absolute')

        while not self.client.wait_for_service(timeout_sec=1.0):
            self.get_logger().info('service not available, waiting again...')
        
        self.req = TeleportAbsolute.Request()
    
    def send_request(self, x, y, theta):
        self.req.x = x
        self.req.y = y
        self.req.theta = theta
        self.future = self.client.call_async(self.req)
        rclpy.spin_until_future_complete(self, self.future)
        return self.future.result()


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

    client = TurtlesimAbsoluteClient()
    client.send_request(10.0, 10.0, 1.0)

    client.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()
$ cd ~/Workspace/ros_ws
$ colcon build --symlink-install
$ source install/setup.bash
$ ros2 launch ros_tutorial turtlesim.launch.py
$ cd ~/Workspace/ros_ws
$ source install/setup.bash
$ ros2 run ros_tutorial turtlesim_abs_client

3. Service - Server

'turtlesim_abs_server = ros_tutorial.turtlesim_abs_server:main',
#!/usr/bin/env python3

import rclpy
from rclpy.node import Node
from turtlesim.srv import TeleportAbsolute


class TurtlesimAbsoluteServer(Node):
    def __init__(self):
        super().__init__('turtlesim_abs_server')

        self.client = self.create_service(TeleportAbsolute,
                                          '/turtle1/teleport_absolute',
                                          self.service_callback)
    
    def service_callback(self, request, response):
        print('request:', request)
        print('response:', response)
        return response


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

    service = TurtlesimAbsoluteServer()
    rclpy.spin(service)

    service.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()
$ cd ~/Workspace/ros_ws
$ colcon build --symlink-install
$ source install/setup.bash
$ ros2 run ros_tutorial turtlesim_abs_server
$ cd ~/Workspace/ros_ws
$ source install/setup.bash
$ ros2 run ros_tutorial turtlesim_abs_client