본문으로 바로가기

서비스 정의 만들기

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

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