본문으로 바로가기

서비스 정의 만들기

category 강좌/ROS2 2026. 5. 21. 18:16

1. 서비스 정의 만들기

 

이번에는 토픽이 아니라 서비스를 만들어 보겠습니다.

 

토픽은 계속 흐르는 데이터 통신에 적합합니다. 반면 서비스는 요청과 응답이 명확한 작업에 적합합니다.

 

예를 들어 다음과 같은 작업은 서비스가 잘 맞습니다.

로봇 초기화 요청
맵 저장 요청
드론 이륙 요청
특정 좌표로 이동 요청
여러 개의 turtle 생성 요청
 

 

이번 예제에서는 사용자가 숫자를 요청하면, 그 수만큼 turtle을 생성하기 위한 좌표 정보를 응답하는 서비스 구조를 만들어 보겠습니다.

 

 

 

2. srv 폴더 생성하기

 

서비스 정의 파일은 srv 폴더에 저장합니다.

 

메시지 패키지로 이동합니다.

 

cd ~/ros2_study/src/my_first_package_msgs

 

 

 

srv 폴더를 생성합니다.

 

mkdir srv

 

 

 

서비스 파일을 생성합니다.

 

touch srv/MultiSpawn.srv

 

 

 

 

 

3. MultiSpawn.srv 작성하기

 

MultiSpawn.srv 파일에 다음 내용을 작성합니다.

 

int64 num
---
float64[] x
float64[] y
float64[] theta

 

 

 

 

서비스 정의 파일은 ---를 기준으로 위와 아래가 나뉩니다.

요청 Request
---
응답 Response
 

 

따라서 위 정의의 의미는 다음과 같습니다.

Request:
  int64 num
 

 

사용자가 생성하고 싶은 turtle 개수를 num으로 요청합니다.

Response:
  float64[] x
  float64[] y
  float64[] theta
 

 

서비스 서버는 turtle을 생성할 좌표 배열을 응답합니다.

 

여기서 float64[]는 배열 타입입니다. 즉, 여러 개의 값을 리스트처럼 담을 수 있습니다.

 

 

 

4. CMakeLists.txt에 srv 추가하기

 

my_first_package_msgs/CMakeLists.txt에서 rosidl_generate_interfaces() 부분에 서비스 파일을 추가합니다.

 

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/CmdAndPoseVel.msg"
  "srv/MultiSpawn.srv"
)

 

 

메시지와 서비스를 같은 인터페이스 패키지 안에서 함께 생성하는 구조입니다.

 

 

 

5. package.xml 확인하기

 

이전에 메시지 정의를 만들면서 아래 항목을 이미 추가했다면 그대로 사용하시면 됩니다.

 

<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

 

 

 

각 항목의 의미는 다음과 같습니다.

rosidl_default_generators
→ msg, srv, action 파일을 코드로 생성할 때 필요합니다.

rosidl_default_runtime
→ 실행 시 생성된 인터페이스 타입을 사용할 때 필요합니다.

rosidl_interface_packages
→ 이 패키지가 ROS 2 인터페이스 패키지임을 명시합니다.

 

 

 

 

6. 서비스 인터페이스 빌드하기

메시지 패키지만 빌드합니다.

 

cd ~/ros2_study
colcon build --packages-select my_first_package_msgs

 

 

빌드 후 환경을 다시 적용합니다.

 

source install/local_setup.bas

또는

sl

 

 

 

 

 

7. 서비스 정의 확인하기

 

정상적으로 등록되었는지 확인합니다.

 

ros2 interface show my_first_package_msgs/srv/MultiSpawn

 

 

정상적으로 실행되면 다음과 같은 출력을 얻을 수 있습니다. 만약 에러가 발생하면 "colcon build" 명령어를 사용하여 워크스페이스 전체를 다시 빌드하시기 바랍니다.

 

 

 

여기까지 나오면 MultiSpawn 서비스 정의는 성공적으로 생성된 것입니다.

 

728x90
728x90

'강좌 > ROS2' 카테고리의 다른 글

TurtleBot3 Odometry 분석  (0) 2026.05.21
서비스 서버 만들기  (0) 2026.05.21
URDF 이해  (0) 2026.05.16
launch 파일에서 실행 인자 사용하기 #1  (0) 2026.05.15
ROS 2 C++ 실행 인자 사용하기  (0) 2026.05.15