basic - actions

ROS 2에서 **액션(Action)**은 피드백과 취소·선점(preempt)이 가능한 장시간 원격 프로시저 호출이다. 예: 상위 상태 기계가 내비게이션에 “웨이포인트까지 이동해라”고 액션을 호출하면, 수 초~수 분 걸리는 동안 진행 상황 피드백을 받고, 필요 시 목표(goal)를 취소하거나 선점할 수 있다.

액션 메시지 정의는 요청(goal) / 응답(result) / 피드백(feedback) 세 부분으로 구성된다.

int32 order        # goal: 요청
---
int32[] sequence   # result: 최종 결과
---
int32[] sequence   # feedback: 진행 중 피드백

장시간 작업에는 액션을, 짧은 RPC에는 서비스를 사용한다. 액션은 연결 설정·모니터링 오버헤드가 있으므로 단시간 호출에는 서비스가 적합하다. 액션은 액션 이름(토픽 이름과 비슷하지만 별도 네임스페이스)으로 식별된다.

Action Server

Action Server는 원격 프로시저 요청(goal)을 받아 실행하는 쪽이다. 실행 중 피드백을 보내고, 취소·선점 요청에 반응해야 한다. 예: 피보나치 수열 계산 액션 — order를 받아 수열을 계산하며 중간 sequence를 피드백하고, 최종 결과를 sequence로 반환.

하나의 액션 이름에는 Action Server는 하나만 있어야 한다. 같은 이름에 서버가 여러 개면 어떤 서버가 요청을 받을지 정의되지 않는다.

Action Client

Action Client는 Action Server에게 작업(goal) 수행을 요청하는 쪽이다. 위 예에서 클라이언트는 order를 담은 goal을 보내고, 서버가 수열을 계산해 결과(result)와 피드백을 돌려줄 때까지 대기한다. Action Client는 동일 액션 이름에 여러 개 존재할 수 있다.

Action 명령어

# 액션 목록 및 타입 확인 (-t: with type)
ros2 action list -t
# /turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]

# 액션 인터페이스(Goal/Result/Feedback) 확인
ros2 interface show turtlesim/action/RotateAbsolute
# float32 theta
# ---
# # The angular displacement in radians to the starting position
# float32 delta
# ---
# # The remaining rotation in radians
# float32 remaining

# Goal 전송 (theta: 목표 각도, 라디안)
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}"

# Goal 전송 + 진행 피드백 실시간 출력
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}" --feedback

참고: Actions — ROS 2 Jazzy