글 / ROS 2 기초

ROS 2 액션의 Goal·Feedback·Result

액션은 Goal로 작업을 요청하고 Feedback으로 경과를 수신하다가 Result 하나로 종료되며, 종료 사유는 상태로 구분한다.

작성일 · 읽는 시간 2분 · ROS 2 Jazzy 기준

구성 요소

액션은 토픽과 서비스 위에 구축한 통신 방식이다. 액션 클라이언트가 goal(목표)을 전송하면 액션 서버가 이를 수락하고, 작업을 실행하는 동안 feedback(경과)을 여러 번 전송하다가 result(결과) 하나로 종료한다.

액션 클라이언트와 서버 사이의 goal·feedback·result 순서

.action 파일

세 부분을 ---로 구분하여 작성한다. 순서는 goal, result, feedback이다. feedback이 마지막에 위치한다는 점은 혼동하기 쉽다.

textFibonacci.action
# goal: 계산할 항의 수
int32 order
---
# result: 끝났을 때 한 번
int32[] sequence
---
# feedback: 진행하는 동안 여러 번
int32[] partial_sequence

.action 파일에 적는 순서와 전송되는 순서의 대응

빌드하면 타입 이름은 패키지 이름/action/Fibonacci 형식이 된다.

명령줄 시험

클라이언트 코드를 작성하기 전에 명령줄에서 goal을 전송하여 시험할 수 있다. goal 값은 YAML로 작성한다.

bash
# 정의를 확인한다
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을 지정하지 않으면 취소 요청을 거절한다.

진행 중인 goal이 세 가지 종료 상태로 끝나는 조건

참고

rclpy 서버의 실행 콜백에서 goal_handle.succeed()를 호출하지 않고 종료하면 해당 goal은 ABORTED로 처리된다.