ROS2에서 노드 간 통신 방식은 크게 Topic, Service, Action으로 나눌 수 있습니다.
이 중 Action은 시간이 오래 걸리는 작업을 처리할 때 사용하는 통신 방식입니다. 예를 들어 로봇이 특정 위치까지 이동하거나, 드론이 목표 고도까지 상승하거나, 터틀심의 거북이가 특정 각도까지 회전하는 작업처럼 즉시 끝나지 않는 명령에 적합합니다.
Action은 내부적으로 다음 요소를 사용합니다.
| Goal | 클라이언트가 서버에 전달하는 목표값 |
| Feedback | 작업 진행 중 서버가 클라이언트에 보내는 중간 상태 |
| Result | 작업 완료 후 서버가 반환하는 최종 결과 |
| Cancel | 실행 중인 목표를 취소하는 요청 |
| Status | 현재 Action의 상태 정보 |
즉, Action은 단순히 “명령 보내고 끝”이 아니라, 목표 전달 → 진행 상황 확인 → 결과 수신까지 가능한 구조입니다.
1. Action이 왜 필요한가 (핵심 개념)
ROS 2에서 Action은 단순한 메시지 송수신이 아니라,
**“시간이 걸리는 작업을 제어하기 위한 통신 구조”**입니다.
예를 들어 아래 같은 작업을 생각해 보시면 이해가 빠릅니다.
- 드론이 특정 위치까지 이동
- 로봇 팔이 물체를 집고 이동
- 자율주행 로봇이 목적지까지 이동
이 작업들의 공통점은 다음과 같습니다.
- 즉시 끝나지 않음 (시간 소요)
- 중간 상태 확인 필요 (진행률)
- 중간에 취소 가능해야 함
이걸 해결하는 구조가 바로 Action입니다.
2. Topic / Service / Action 차이 (현실 기준 정리)
| Topic | 비동기, 계속 데이터 흐름 | 센서 데이터, 상태 |
| Service | 요청 → 응답 (즉시) | 설정값 변경 |
| Action | 장시간 작업 + 상태 관리 | 이동, 제어 |
핵심은 이것입니다:
Action = Topic + Service의 혼합 구조
- Goal 요청 → Service
- Cancel 요청 → Service
- Result 요청 → Service
- Feedback → Topic
- Status → Topic
즉, ROS 2는 ROS 1보다 훨씬 구조적으로 개선되었습니다.
3. Action 내부 구조 (개발자 관점 핵심)
Action은 내부적으로 다음 3가지 데이터 흐름을 가집니다:
Goal → 목표 설정
Feedback → 진행 상황
Result → 최종 결과

실제 인터페이스 구조는 다음과 같습니다:
float32 theta # Goal
---
float32 delta # Result
---
float32 remaining # Feedback
→ 이 구조가 action 파일입니다
ROS2 Action은 기본적으로 Action Client와 Action Server로 동작합니다.
Action Client → Goal 요청 → Action Server
Action Client ← Feedback ← Action Server
Action Client ← Result ← Action Server
Action Client는 목표를 요청하는 쪽이고, Action Server는 그 목표를 실제로 수행하는 쪽입니다.
예를 들어 turtlesim에서는 다음처럼 볼 수 있습니다.
| Action Server | /turtlesim 노드 |
| Action Client | /teleop_turtle 노드 |
| Action 이름 | /turtle1/rotate_absolute |
| Action 타입 | turtlesim/action/RotateAbsolute |

위의 그림에서 Action Client는 Service Client 3개와 Topic Subscriber 2개로 구성되어 있으며, Action Server는 Service Server 3개와 Topic Publisher 2개로 구성되어 있습니다. 액션 목표/피드백/결과(goal/feedback/result) 데이터는 msg 및 srv 인터페이스의 변형으로 action 인터페이스라고 합니다.
4. turtlesim 실행
먼저 첫 번째 터미널에서 turtlesim 노드를 실행합니다.
ros2 run turtlesim turtlesim_node
두 번째 터미널에서는 키보드 제어 노드를 실행합니다.
ros2 run turtlesim turtle_teleop_key
turtle_teleop_key를 실행하면 키보드 방향키로 거북이를 움직일 수 있습니다. 이때 단순 이동 명령은 Topic을 통해 전달되고, 특정 방향으로 회전하는 기능은 Action을 통해 처리됩니다.
5. rqt_graph로 구조 확인
다른 터미널에서 다음 명령을 실행합니다.
rqt_graph
그러면 현재 실행 중인 ROS2 노드와 Topic, Action 관련 연결 구조를 확인할 수 있습니다.
turtle_teleop_key 노드는 /turtlesim 노드로 명령을 보내며, /turtle1/cmd_vel Topic을 통해 속도 명령이 전달됩니다.
또한 Action과 관련된 다음 항목도 확인할 수 있습니다.
/turtle1/rotate_absolute
/turtle1/rotate_absolute/_action/feedback
/turtle1/rotate_absolute/_action/status
여기서 feedback과 status는 Action이 실행 중일 때 상태를 확인하기 위한 통신 경로입니다.

6. 키보드 기반 절대 각도 회전 액션 제어
이번 실습에서는 기존의 방향키(← ↑ ↓ →) 기반 수동 이동을 넘어, 키보드 입력으로 거북이를 특정 각도로 정확하게 회전시키는 방법을 다룹니다. 핵심은 turtlesim의 rotate_absolute 액션을 활용하여 목표 각도(θ)를 전달하고, 필요시 액션 취소까지 수행하는 것입니다.
- 기존: 속도 기반 제어 (Twist 메시지 → 연속 이동)
- 이번: 각도 기반 제어 (Action → 목표 각도까지 회전 후 정지)
즉, “얼마나 빠르게 움직일 것인가”가 아니라 “정확히 어느 방향을 바라보게 할 것인가”를 제어합니다.
이번 실습에서는 키보드 F를 중심으로 주변 8개 키를 사용합니다. F키는 취소키로 사용합니다.
| G | 0.0 | 3시 방향 (기준) |
| B | 0.7854 | 4시 방향 |
| V | 1.5708 | 6시 방향 |
| C | 2.3562 | 7시 방향 |
| D | 3.1416 | 9시 방향 |
| E | 3.9270 | 10시 방향 |
| R | 4.7124 | 12시 방향 |
| T | 5.4978 | 1시 방향 |
- 각도 간격: π/4 (≈ 0.7854 rad)
- 증가 방향: 반시계 방향(CCW)
- 기준점: G 키 (0 rad)
(1) Action Client 동작 흐름
- 키 입력 발생
- 목표 θ 값 결정
- Action Goal 전송
- 서버가 회전 수행
- 결과 반환
이 구조는 ROS2의 Action 통신 모델을 따릅니다.
(2) 핵심 액션 메시지
rotate_absolute 액션은 다음 개념으로 구성됩니다:
- Goal: 목표 각도 (theta)
- Feedback: 현재 회전 상태
- Result: 성공 / 취소 여부

실행결과에서 정상완료와 중간취소 가 아래와 같이 출력됨을 확인할 수 있습니다.
정상 완료
[INFO]: Rotation goal completed successfully
중간 취소
[INFO]: Rotation goal canceled
7. Action 목록 확인
현재 사용 가능한 Action 목록은 다음 명령으로 확인합니다.
ros2 action list

이는 turtlesim에서 거북이를 절대 각도 기준으로 회전시키는 Action이 존재한다는 뜻입니다.
Action 타입까지 함께 보고 싶다면 -t 옵션을 사용합니다.
ros2 action list -t

위의 결과에서 중요한 정보는 두 가지입니다.
Action 이름: /turtle1/rotate_absolute
Action 타입: turtlesim/action/RotateAbsolute
Action을 직접 실행하려면 이 두 정보를 모두 알아야 합니다.
8. Action 인터페이스 확인
Action이 어떤 데이터를 주고받는지 확인하려면 다음 명령을 사용합니다.
ros2 interface show turtlesim/action/RotateAbsolute

Action 인터페이스는 --- 구분자를 기준으로 세 부분으로 나뉩니다.
| Goal | theta | 목표 회전 각도 |
| Result | delta | 시작 위치 기준 회전 변화량 |
| Feedback | remaining | 목표까지 남은 회전량 |
즉, theta는 사용자가 입력하는 목표값이고, delta는 최종 결과이며, remaining은 실행 중 계속 갱신되는 피드백 값입니다.
9. Action 정보 확인
검색된 액션 목록의 더 자세한 정보를 확인하기 위해서는 액션 정보 (ros2 action info) 명령어를 사용합니다.
이 명령어는 사용되는 액션 이름과 해당 액션의 서버 및 클라이언트 노드 이름 및 개수를 표시해 줍니다.
아래의 명령어를 실행합니다.
ros2 action info /turtle1/rotate_absolute

10. Action Goal 보내기
Action을 실행하려면 다음 형식을 사용합니다.
ros2 action send_goal <action_name> <action_type> <values>
turtlesim에서 거북이를 약 180도 회전시키려면 다음 명령을 입력합니다.
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}"
여기서 3.14는 라디안 값입니다.
3.14 rad ≒ 180도
실행하면 다음과 같은 흐름이 나타납니다.


Goal accepted는 Action Server가 목표를 정상적으로 받았다는 의미입니다.
Result의 delta는 실제 회전한 각도 차이를 나타냅니다.
SUCCEEDED는 목표가 성공적으로 완료되었다는 뜻입니다.
위에서 실행한 명령어는 피드백이 포함되어 있지 않았습니다. 현재 회전상태를 출력하고 싶으면 --feedback 옵션을 사용하면 됩니다. 이 옵션을 사용하면 거북이가 목표 theta (-1.5708, 6시 방향)로 회전하면서 목표 값, UID, 결괏값, 상태 값 이외에도 Feedback 값으로 총 회전 값의 남은 회전량을 피드백으로 표시합니다.
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.5708}" --feedback



11. 실습에서 주의할 점
turtlesim_node가 실행되지 않은 상태에서 Action 명령을 보내면 서버를 찾지 못합니다. 따라서 반드시 다음 순서로 실행하는 것이 좋습니다.
# 1번 터미널
ros2 run turtlesim turtlesim_node
# 2번 터미널
ros2 run turtlesim turtle_teleop_key
# 3번 터미널
ros2 action list
ros2 action list -t
ros2 interface show turtlesim/action/RotateAbsolute
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}"
12. Topic, Service, Action 비교
ROS2를 처음 공부할 때는 Topic, Service, Action의 차이를 명확히 잡는 것이 중요합니다.
| 통신 방식 | 지속 송수신 | 요청/응답 | 목표/피드백/결과 |
| 처리 시간 | 계속 반복 | 짧은 작업 | 긴 작업 |
| 중간 상태 확인 | 어려움 | 어려움 | 가능 |
| 취소 기능 | 없음 | 없음 | 가능 |
| 예시 | 속도 명령, 센서 데이터 | 설정 변경, 상태 요청 | 이동, 회전, 경로 추종 |
정리하면 다음과 같습니다.
Topic = 계속 흐르는 데이터
Service = 짧게 요청하고 응답받는 기능
Action = 오래 걸리는 목표 작업을 관리하는 기능
13. 로봇/드론 개발에서 Action 활용 예시
Action은 실제 로봇이나 드론 시스템에서 매우 많이 사용됩니다.
예를 들어 드론에서는 다음과 같은 작업에 적합합니다.
| 이륙 | 목표 고도까지 상승 |
| 착륙 | 안전 고도까지 하강 후 착륙 |
| 웨이포인트 이동 | 지정 좌표까지 이동 |
| 짐벌 제어 | 특정 각도로 카메라 회전 |
| 그리퍼 제어 | 물체 잡기/놓기 완료 확인 |
| 미션 수행 | 여러 단계 작업의 진행률 보고 |
특히 PX4, ROS2, 자율주행 로봇, 배송 드론 같은 시스템에서는 단순 명령보다 상태 확인과 결과 검증이 중요합니다. 그래서 Action 구조를 이해해두면 실전 개발에서 바로 활용할 수 있습니다.
'강좌 > ROS2' 카테고리의 다른 글
| Python에서 ROS2 토픽 구독 (0) | 2026.05.07 |
|---|---|
| ROS2 파라미터 (0) | 2026.05.06 |
| ROS2 Topic (0) | 2026.05.04 |
| ROS2 Service (0) | 2026.05.04 |
| ROS2 Humble에서 Turtlesim 설치 및 실행하기 (0) | 2026.05.03 |
