본문으로 바로가기

ROS2 Action

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

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    → 최종 결과
 

 

이 이미지는 표윤석 박사님의 ROS2 강좌에서 참조한 것입니다. https://cafe.naver.com/openrt/24142

 

 

실제 인터페이스 구조는 다음과 같습니다:

float32 theta     # Goal
---
float32 delta     # Result
---
float32 remaining # Feedback
 

→ 이 구조가 action 파일입니다

 

 

ROS2 Action은 기본적으로 Action ClientAction 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

 

 

이 이미지는 표윤석 박사님의 ROS2 강좌에서 참조한 것입니다. https://cafe.naver.com/openrt/24142

 

 

 

위의 그림에서 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. 키보드 기반 절대 각도 회전 액션 제어

 

이번 실습에서는 기존의 방향키(← ↑ ↓ →) 기반 수동 이동을 넘어, 키보드 입력으로 거북이를 특정 각도로 정확하게 회전시키는 방법을 다룹니다. 핵심은 turtlesimrotate_absolute 액션을 활용하여 목표 각도(θ)를 전달하고, 필요시 액션 취소까지 수행하는 것입니다.

 

  • 기존: 속도 기반 제어 (Twist 메시지 → 연속 이동)
  • 이번: 각도 기반 제어 (Action → 목표 각도까지 회전 후 정지)

즉, “얼마나 빠르게 움직일 것인가”가 아니라 “정확히 어느 방향을 바라보게 할 것인가”를 제어합니다.

 

이번 실습에서는 키보드 F를 중심으로 주변 8개 키를 사용합니다. F키는 취소키로 사용합니다.

            키                               목표 각도 (rad)                                              방향
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 동작 흐름

  1. 키 입력 발생
  2. 목표 θ 값 결정
  3. Action Goal 전송
  4. 서버가 회전 수행
  5. 결과 반환

이 구조는 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
통신 방식 지속 송수신 요청/응답 목표/피드백/결과
처리 시간 계속 반복 짧은 작업 긴 작업
중간 상태 확인 어려움 어려움 가능
취소 기능 없음 없음 가능
예시 속도 명령, 센서 데이터 설정 변경, 상태 요청 이동, 회전, 경로 추종

 

정리하면 다음과 같습니다.

Topic  = 계속 흐르는 데이터
Service = 짧게 요청하고 응답받는 기능
Action = 오래 걸리는 목표 작업을 관리하는 기능

 

 

13. 로봇/드론 개발에서 Action 활용 예시

Action은 실제 로봇이나 드론 시스템에서 매우 많이 사용됩니다.

 

예를 들어 드론에서는 다음과 같은 작업에 적합합니다.

                         기능                                                                                  Action 적용 예
이륙 목표 고도까지 상승
착륙 안전 고도까지 하강 후 착륙
웨이포인트 이동 지정 좌표까지 이동
짐벌 제어 특정 각도로 카메라 회전
그리퍼 제어 물체 잡기/놓기 완료 확인
미션 수행 여러 단계 작업의 진행률 보고

 

특히 PX4, ROS2, 자율주행 로봇, 배송 드론 같은 시스템에서는 단순 명령보다 상태 확인과 결과 검증이 중요합니다. 그래서 Action 구조를 이해해두면 실전 개발에서 바로 활용할 수 있습니다.

 

728x90
728x90

'강좌 > 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