ROS 2 액션의 Goal·Feedback·Result
액션은 Goal로 작업을 요청하고 Feedback으로 경과를 수신하다가 Result 하나로 종료되며, 종료 사유는 상태로 구분한다.
구성 요소
액션은 토픽과 서비스 위에 구축한 통신 방식이다. 액션 클라이언트가 goal(목표)을 전송하면 액션 서버가 이를 수락하고, 작업을 실행하는 동안 feedback(경과)을 여러 번 전송하다가 result(결과) 하나로 종료한다.
.action 파일
세 부분을 ---로 구분하여 작성한다. 순서는 goal, result, feedback이다. feedback이 마지막에 위치한다는 점은 혼동하기 쉽다.
# goal: 계산할 항의 수
int32 order
---
# result: 끝났을 때 한 번
int32[] sequence
---
# feedback: 진행하는 동안 여러 번
int32[] partial_sequence
빌드하면 타입 이름은 패키지 이름/action/Fibonacci 형식이 된다.
명령줄 시험
클라이언트 코드를 작성하기 전에 명령줄에서 goal을 전송하여 시험할 수 있다. goal 값은 YAML로 작성한다.
# 정의를 확인한다
ros2 interface show custom_action_interfaces/action/Fibonacci
# goal을 보내고 feedback도 출력한다
ros2 action send_goal --feedback fibonacci \
custom_action_interfaces/action/Fibonacci "{order: 5}"
goal이 수락되면 goal ID가 출력되고, Feedback:이 반복된 뒤 Result:와 종료 상태가 출력된다.
종료 상태와 취소
| 상태 | 의미 |
|---|---|
SUCCEEDED |
서버가 목표를 달성함 |
CANCELED |
클라이언트의 취소 요청으로 종료됨 |
ABORTED |
취소 요청 없이 서버가 자체적으로 중단함 |
send_goal이 실행 중일 때 Ctrl+C를 누르면 진행 중인 goal에 대한 취소 요청이 전송된다. 취소 요청의 수락 여부는 서버가 결정한다. rclpy의 ActionServer는 cancel_callback을 지정하지 않으면 취소 요청을 거절한다.
참고
rclpy 서버의 실행 콜백에서 goal_handle.succeed()를 호출하지 않고 종료하면 해당 goal은 ABORTED로 처리된다.