1292.56 비동기 액션 노드의 실행 모델
1. 비동기 액션 노드의 정의
비동기 액션 노드(asynchronous action node)는 행동의 실행이 여러 tick에 걸쳐 분산되는 액션 노드이다. 첫 번째 tick에서 행동을 시작하고 Running 상태를 반환하며, 후속 tick에서 행동의 진행 상태를 확인하여 완료 시 Success 또는 Failure를, 진행 중이면 Running을 반환한다. 비동기 액션 노드는 tick 함수 내에서 실행을 차단하지 않으며, 각 tick에서 행동의 진행 상태만을 확인하고 즉시 반환한다 (Faconti, BehaviorTree.CPP Documentation, 2024).
2. 실행 모델의 의미론
비동기 액션 노드의 실행 모델은 행동의 시작(initiation), 진행 확인(polling), 완료(completion)의 세 단계로 구성된다.
function AsyncActionNode.tick():
if current_status == Idle:
initiate_action()
return Running
// current_status == Running
progress = check_action_progress()
if progress == completed:
if action_succeeded():
return Success
else:
return Failure
else:
return Running
이 모델에서 각 tick의 실행 시간은 행동의 전체 실행 시간이 아닌, 진행 상태 확인에 소요되는 시간에 한정된다. 행동 자체는 행동 트리의 tick 루프와 독립적으로 진행되며, tick은 해당 행동의 현재 상태를 비차단적(non-blocking)으로 조회한다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).
3. 다중 Tick에 걸친 실행 흐름
비동기 액션 노드의 실행 흐름을 다음의 예제를 통해 추적한다. 액션 노드 A1이 목표 지점으로의 이동을 수행한다고 가정한다.
| Tick | 노드 상태 | 호출 콜백 | 수행 내용 | 반환 상태 |
|---|---|---|---|---|
| t_1 | Idle → Running | onStart | 이동 명령 송신, 경로 계획 시작 | Running |
| t_2 | Running | onRunning | 현재 위치 확인, 목표 미도달 | Running |
| t_3 | Running | onRunning | 현재 위치 확인, 목표 미도달 | Running |
| t_4 | Running → Idle | onRunning | 현재 위치 확인, 목표 도달 | Success |
tick t_1에서 행동이 시작되고, tick t_2와 t_3에서 진행 상태가 확인되며, tick t_4에서 행동이 완료되어 Success가 반환된다. 행동의 실제 실행은 tick 간의 시간에 외부 시스템(모터 제어기, 경로 추종 제어기 등)에 의해 진행된다.
4. 비차단 실행의 이점
4.1 행동 트리 반응성 유지
비동기 액션 노드는 tick 함수 내에서 실행을 차단하지 않으므로, 행동의 실행 시간이 행동 트리의 tick 주기에 영향을 미치지 않는다. 수 초에서 수 분이 소요되는 행동도 tick 주기를 지연시키지 않으며, 행동 트리의 다른 노드가 정상적인 주기로 tick을 수신할 수 있다.
4.2 동시적 감시
비동기 액션 노드가 Running 상태를 유지하는 동안, 상위의 제어 흐름 노드(특히 ReactiveSequence, ReactiveFallback)는 매 tick마다 선행 조건 노드를 재평가할 수 있다. 이를 통해 행동 수행 중에도 안전 조건, 장애물 감지, 배터리 잔량 등의 조건을 지속적으로 감시하고, 조건 위반 시 비동기 액션에 halt를 요청하여 즉시 행동을 중단할 수 있다 (Faconti, 2024).
5. 행동 실행의 분리
비동기 액션 노드에서 행동의 실제 실행은 행동 트리의 tick 루프와 분리된다. 이 분리를 구현하는 주요 방법은 다음과 같다.
5.1 외부 프로세스 위임
행동의 실행을 외부 프로세스에 위임하고, tick에서는 외부 프로세스의 상태를 조회한다. ROS2 환경에서 이 패턴은 액션 서버(action server)를 통해 구현된다. 액션 노드의 onStart에서 액션 목표(goal)를 송신하고, onRunning에서 액션 피드백(feedback)을 확인하여 완료 여부를 판단한다.
5.2 별도 스레드 실행
BehaviorTree.CPP 라이브러리에서 제공하는 ThreadedAction 패턴은 행동을 별도의 스레드에서 실행한다. tick 함수는 스레드의 상태를 비차단적으로 확인하고, 스레드가 완료되면 그 결과를 반환한다. 이 패턴은 행동 트리의 메인 스레드를 차단하지 않으면서 장시간 연산을 수행할 수 있게 한다 (Faconti, 2024).
5.3 상태 머신 기반
행동의 내부 로직을 상태 머신으로 구현하고, 매 tick에서 상태 머신을 한 단계씩 진행시킨다. 이 방법은 별도의 스레드를 사용하지 않으므로 스레드 안전성(thread safety) 문제가 발생하지 않지만, 행동의 로직을 상태 머신으로 분해하여야 하는 복잡성이 수반된다.
6. 상태 보존의 필요성
비동기 액션 노드는 여러 tick에 걸쳐 실행되므로, tick 간에 내부 상태를 보존하여야 한다. 보존되어야 하는 상태의 예시는 다음과 같다.
| 보존 상태 | 설명 |
|---|---|
| 행동 진행 단계 | 현재 실행 중인 하위 단계 |
| 외부 요청 핸들 | 액션 서버 목표 핸들, 서비스 응답 대기 핸들 |
| 누적 데이터 | 경과 시간, 이동 거리, 반복 횟수 |
| 중간 결과 | 부분 계산 결과, 수집된 센서 데이터 |
이 상태는 노드의 내부 멤버 변수에 저장되며, onStart에서 초기화되고, onRunning에서 갱신되며, halt 시 정리된다 (Colledanchise & Ögren, 2018).
7. Halt 처리
비동기 액션 노드는 Running 상태에서 halt 요청을 수신할 수 있다. halt 시에는 진행 중인 행동을 안전하게 중단하여야 한다.
function AsyncActionNode.halt():
cancel_ongoing_action() // 외부 시스템에 취소 요청
release_resources() // 할당된 자원 해제
reset_internal_state() // 내부 상태 초기화
set_status(Idle) // 상태를 Idle로 복원
외부 프로세스에 위임된 행동의 경우, halt 시 해당 외부 프로세스에 취소 요청(cancel request)을 송신하여야 한다. ROS2 액션 서버의 경우, 액션 목표의 취소(cancel goal)를 요청한다. 별도 스레드에서 실행 중인 행동의 경우, 스레드에 중단 신호를 전달하고 스레드의 종료를 대기한다 (Faconti, 2024).
8. 동기 액션 노드와의 비교
| 속성 | 동기 액션 노드 | 비동기 액션 노드 |
|---|---|---|
| Running 반환 | 불가 | 가능 |
| Tick 차단 | 차단 | 비차단 |
| 실행 기간 | 단일 tick | 다중 tick |
| 상태 보존 | 불필요 | 필요 |
| Halt 처리 | 불필요 | 필요 |
| 구현 복잡도 | 낮음 | 높음 |
| 적합한 행동 | 즉각적 연산 | 시간 소요 행동 |
9. 로봇 공학에서의 활용
9.1 이동 행동
로봇의 이동(navigation) 행동은 비동기 액션 노드의 대표적인 활용 사례이다. 목표 지점까지의 이동은 수 초에서 수 분이 소요되며, 이동 중에도 장애물 감지, 경로 재계획, 안전 조건 감시 등이 병행되어야 한다. 비동기 실행 모델은 이동 행동을 수행하면서 행동 트리의 다른 노드가 정상적으로 동작할 수 있게 보장한다.
9.2 센서 데이터 수집
환경 스캔, 3D 맵 생성, 영상 분석 등 시간이 소요되는 센서 데이터 수집 및 처리 작업은 비동기 액션 노드로 구현된다. 데이터 수집이 진행되는 동안 행동 트리는 다른 조건의 변화를 감시할 수 있다.
9.3 매니퓰레이션
로봇 팔의 물체 파지(grasping), 물체 배치(placing), 조립 등의 매니퓰레이션 작업은 모터의 물리적 동작 시간이 필요하므로 비동기 액션 노드로 구현된다 (Colledanchise & Ögren, 2018).
참고 문헌
- Colledanchise, M. & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Faconti, D. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/