[ROS2] EP11. 다수의 서비스 클라이언트 구현하기

김희상·2024년 7월 29일

ROS2

목록 보기
11/17
post-thumbnail

  • OS : Ubuntu 22.04
  • ROS 2 Humble
  • Gazebo 11

1. 서비스 서버 만들기

1. 코드 수정

from my_first_package_msgs.srv import MultiSpawn
from turtlesim.srv import TeleportAbsolute
from turtlesim.srv import Spawn

import time
import rclpy as rp
import numpy as np
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)
        self.teleport = self.create_client(TeleportAbsolute, '/turtle1/teleport_absolute')
        self.spawn = self.create_client(Spawn, '/spawn')
        self.req_teleport = TeleportAbsolute.Request()
        self.req_spawn = Spawn.Request()
        self.center_x = 5.54
        self.center_y = 5.54

    def calc_position(self, n, r):
        gap_theta = 2.*np.pi / n
        theta = [gap_theta*n for n in range(n)]
        x = [r*np.cos(th) for th in theta]
        y = [r*np.sin(th) for th in theta]

        return x, y, theta

    def callback_service(self, request, response):
        x, y, theta = self.calc_position(request.num, 3)
        for n in range(len(theta)):
            self.req_spawn.x = x[n] + self.center_x
            self.req_spawn.y = y[n] + self.center_y
            self.req_spawn.theta = theta[n]

            self.spawn.call_async(self.req_spawn)
            time.sleep(0.1)

        response.x = x
        response.y = y
        response.theta = theta


        return response
    
def main(args=None):
    rp.init(args=args)
    multi_spawn = MultiSpawning()
    rp.spin(multi_spawn)
    rp.shutdown()
  • MultiSpawn은 x[], y[], theta[]가 array 형태로 있는 데이터 타입
  • TeleportAbsolute는 거북이 옮기는 역할
  • Spawn은 원하는 위치에 거북이 출력

2. 실행

  • 빌드 후 터틀심 실행
  • my_serivce_server 실행
  • service client 실행 - multi_spawn 서비스 - my_first_package_msgs/srv/MultiSpawn 데이터 타입, 9마리 생성

3. 결과 확인

  • 거북이 9마리 스폰 확인

같은 서비스를 사용하는 서비스 클라이언트는 많이 있을 수 있지만,
한 서비스를 위한 서비스 서버는 하나만 있을 수 있다.

"source : ROS 2 Documentation"
profile
3D 모델러의 개발 도전기

0개의 댓글