ROS 2에서는 노드 간 데이터를 주고받기 위해 Topic, Service, Action, parameter 등의 통신 방식을 사용한다.
이때 통신 과정에서 어떤 형태의 데이터를 주고받을 것인지 정의하는 것이 ROS Interface(인터페이스)다.
ROS 2에서는 주로 다음과 같은 인터페이스를 사용한다.
msg : Topic에서 사용srv : Service에서 사용action : Action에서 사용ROS 인터페이스는 노드 간 통신에 사용되는 데이터의 구조와 형태를 정의한 것이다.
정수(integer), 부동 소수점(float), Boolean과 같은 기본 자료형을 사용할 수 있으며, 하나의 메시지 안에 다른 메시지를 포함하거나 배열 형태의 데이터도 사용할 수 있다.
예를 들어 geometry_msgs/msg/Twist에서는 Vector3 형태의 데이터를 linear, angular라는 이름으로 포함하고 있다.
Vector3 linear
Vector3 angular
그리고 Vector3는 다시 다음과 같이 x, y, z 값을 가진다.
float64 x
float64 y
float64 z
즉, 인터페이스는 단순한 하나의 데이터뿐만 아니라 여러 데이터를 하나의 구조로 묶어서 전달할 수도 있다.
msg 인터페이스는 Topic에서 사용하는 데이터 형식이다.
파일 확장자는 다음과 같다.
*.msg
우리가 앞서 TurtleSim 실습에서 사용했던 /turtle1/cmd_vel Topic이 대표적인 예이다.
/turtle1/cmd_vel
이 Topic은 다음과 같은 인터페이스를 사용한다.
geometry_msgs/msg/Twist
Twist는 다음과 같이 구성되어 있다.
Vector3 linear
Vector3 angular
linear는 선속도, angular는 각속도에 대한 정보를 나타내며 각각 x, y, z 값을 포함한다.
따라서 앞에서 실습했던 다음 명령어에서도 Twist 인터페이스를 사용한 것이다.
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist ...
srv 인터페이스는 Service에서 사용하는 데이터 형식이다.
파일 확장자는 다음과 같다.
*.srv
Service는 Topic과 달리 요청(Request)을 보내고 응답(Response)을 받는 구조로 동작한다.
예를 들어 TurtleSim의 /spawn 서비스에서는 다음과 같은 Spawn.srv 인터페이스를 사용한다.
float32 x
float32 y
float32 theta
string name
---
string name
여기서 ---는 Request와 Response를 구분하는 구분자이다.
Request
├─ x
├─ y
├─ theta
└─ name
↓
Service
↓
Response
└─ name
인터페이스의 실제 구조는 다음 명령어로 확인할 수 있다.
ros2 interface show turtlesim/srv/Spawn.srv
action 인터페이스는 Action에서 사용하는 데이터 형식이다.
파일 확장자는 다음과 같다.
*.action
Action은 하나의 작업을 요청하고 결과를 기다리는 것뿐만 아니라, 작업이 수행되는 동안 Feedback을 전달할 수 있는 구조를 가진다.
기본적인 구조는 다음과 같다.
Goal
---
Result
---
Feedback
즉,
으로 구성된다.
| 구분 | Topic | Service | Action |
|---|---|---|---|
| 인터페이스 | msg | srv | action |
| 확장자 | .msg | .srv | .action |
| 데이터 구조 | Data | Request / Response | Goal / Result / Feedback |
| 특징 | 지속적인 데이터 전달 | 요청에 대한 응답 | 장시간 작업 및 진행 상황 전달 |
정리하면 msg, srv, action은 각각 Topic, Service, Action에서 사용되는 데이터 구조를 정의한다.
특히 --- 구분자를 기준으로 보면 차이를 쉽게 이해할 수 있다.
msg
Data
srv
Request
---
Response
action
Goal
---
Result
---
Feedback
ROS 2에서는 ros2 interface show 명령어를 이용하여 특정 인터페이스의 구조를 확인할 수 있다.
예를 들어:
ros2 interface show geometry_msgs/msg/Twist
또는:
ros2 interface show turtlesim/srv/Spawn
와 같이 사용할 수 있다.
이를 통해 실제로 어떤 자료형과 필드가 인터페이스에 정의되어 있는지 확인할 수 있다.
ROS 2의 인터페이스는 노드 간 통신에서 주고받는 데이터의 구조를 정의하는 역할을 한다.
Topic
↓
msg
↓
Data
Service
↓
srv
↓
Request → Response
Action
↓
action
↓
Goal → Result + Feedback
앞서 실습한 TurtleSim의 /turtle1/cmd_vel 역시 geometry_msgs/msg/Twist라는 인터페이스를 사용한다.
따라서 ROS 2에서 Topic, Service, Action을 이해하기 위해서는 각각 어떤 인터페이스를 사용하고, 그 인터페이스가 어떤 데이터 구조를 가지고 있는지 함께 이해하는 것이 중요하다.