전공/ROS

ROS2 서비스 서버, 클라이언트 만들기

흔한 학생 2024. 11. 17. 20:02

서비스 서버, 클라이언트 만들기 (service_server.py)

서비스 서버의 구조

서버 노드 만들기(클래스)

  • init 정의
    • 서버를 만드는 함수 self.create_service(만든 서비스 타입, 이름, 실행함수)
  • callback 함수 정의 (response 반환)
    • client 로부터 request 받으면 실행

main 함수

  • 객체화
  • spin 실행
  • shutdown

if 문

서비스 서버 만들기

구독, 발행 노드를 만들때는 create_subscription, create_publisher를 이용했던 것처럼 이번에는 create_service를 이용한다.

multi_spawn이란 이름의 MultiSpawn 데이터 타입의 서비스를 호출?

callback 함수에서는 request와 response를 받고

from my_first_package_msgs.srv import MultiSpawn
import rclpy as rp  
from rclpy.node import Node

class MultiSpawning(Node):
    def __init__(self):
        super().__init__('multi_spawn')
        self.server = self.create_service(MultiSpawn, 'multi_spawn', self.callback_service)
    
    def callback_service(self, request, response):
        print('Request:', request)
        response.x= [1., 2., 3.]
        response.y= [10., 20., 30.]
        response.theta = [100., 200., 300.]

        return response 

def main(args=None):
    rp.init(args=args)
    multi_spawn = MultiSpawning()
    rp.spin(multi_spawn)
    rp.shutdown()

if __name__== '__main__':
    main()

터미널 상에서 service call

더보기
ros2 service call /multi_spawn my_first_package_msgs/srv/MultiSpawn “{num: 1}”

 

서비스를 호출하면 request를 전달하고 response를 반환받을 수 있다.

실제로 사용할 때에는 전달받은 request를 이용해

response를 도출해내고 반환하거나 하는 동작을 만들 수 있을 것이다.

teleport_absolute 에 대한 클라이언트 추가하기

동작

위에서 만든 서버는 그대로 두고

서버에 request가 들어오면 teleport_absolute 를 요청하는? 클라이언트를 추가하려고 한다.

코드 구현

teleport absolute 쓸 것이기에

from turtlesim.srv import TeleportAbsolute 임포트 해야함

class MultiSpawning(Node):
    def __init__(self):
        super().__init__('multi_spawn')
        self.server = self.create_service(MultiSpawn, 'multi_spawn', self.callback_service)
        self.teleport = self.create_client(TeleportAbsolute, '/turtle1/teleport_absolute')
        self.req_teleport = TeleportAbsolute.Request()
    
    def callback_service(self, request, response):
        self.req_teleport.x = 1.
        self.teleport.call_async(self.req_teleport)

        return response 

 

터틀심 실행 → 서버 실행 → 서비스 호출

서버도 만들고 클라이언트 호출도 가능하다.