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 서비스 정의는 성공적으로 생성된 것입니다.
'강좌 > ROS2' 카테고리의 다른 글
| 서비스 서버 만들기 (0) | 2026.05.21 |
|---|---|
| 토픽, 서비스, 액션 정리 (0) | 2026.05.19 |
| ROS2 사용자 정의 메세지 만들기 #2 (0) | 2026.05.09 |
| ROS2 사용자 정의 메세지 만들기 #1 (0) | 2026.05.09 |
| ROS2 패키지 만들고 토픽 다루기 (0) | 2026.05.08 |
