1295.17 성공 정책 충족 시 나머지 자식 Halt

1295.17 성공 정책 충족 시 나머지 자식 Halt

1. 성공 충족 시 Halt의 필요성

Parallel 노드가 성공 정책을 충족하여 SUCCESS를 반환할 때, 아직 RUNNING 상태에 있는 자식 노드들은 더 이상 실행할 필요가 없다. 이러한 잔류 RUNNING 자식을 명시적으로 중단(halt)하지 않으면, 해당 자식이 내부적으로 계속 실행 중인 것으로 간주되어 리소스 누수, 상태 불일관, 그리고 후속 실행에서의 비정상 동작이 발생할 수 있다(Colledanchise & Ögren, 2018).

2. Halt 대상의 식별

성공 정책이 충족된 시점에서 Halt 대상은 다음과 같이 식별된다.

\text{Halt 대상} = \{C_i : \text{completed}[i] = \text{false}\}

즉, 아직 최종 상태를 반환하지 않고 RUNNING 상태를 유지하고 있는 모든 자식 노드가 Halt 대상이다. 이미 SUCCESS 또는 FAILURE를 반환하여 완료 표시된 자식은 Halt 대상에서 제외된다.

2.1 정책별 Halt 대상 분석

정책성공 충족 시점예상 Halt 대상 수
SUCCESS_ONE (M = 1)첫 SUCCESS 반환 시최대 N - 1
SUCCESS_COUNT(M)M번째 SUCCESS 반환 시최대 N - M
SUCCESS_ALL (M = N)모든 자식 SUCCESS 시0 (Halt 불필요)

SUCCESS_ALL 정책에서는 모든 자식이 SUCCESS를 반환해야 성공이므로, 성공 시점에서 RUNNING 자식이 존재하지 않아 Halt가 불필요하다. 반면 SUCCESS_ONE에서는 하나의 성공으로 즉시 종료되므로, 나머지 N - 1개의 자식이 Halt 대상이 된다.

3. Halt 절차의 상세

3.1 단계적 Halt 실행

Procedure: haltOnSuccess()
1   for i ← 1 to N do
2       if completed[i] = false then
3           children[i].haltNode()
4           children[i].setStatus(IDLE)
5       end if
6   end for
7   resetCompletedFlags()

순회 순서는 자식의 정의 순서를 따른다. 이는 결정론적 Halt 순서를 보장하여, 디버깅과 테스트에서의 재현성을 확보한다.

3.2 자식 노드 유형별 Halt 동작

자식 노드의 유형에 따라 haltNode() 호출 시 수행되는 구체적 동작이 상이하다.

자식 노드 유형Halt 시 동작
동기 액션 노드내부 상태 초기화, IDLE로 전환
비동기 액션 노드ROS2 액션 목표 취소 요청, 콜백 해제, IDLE로 전환
조건 노드내부 상태 초기화 (일반적으로 경량 처리)
서브트리서브트리 내 모든 RUNNING 노드에 재귀적 Halt 전파
데코레이터 노드자식에 Halt 전파 후 자체 상태 초기화

3.3 ROS2 액션 노드의 Halt 처리

ROS2 액션 서버와 연동된 비동기 행동 노드의 Halt는 특별한 주의가 필요하다.

void AsyncActionNode::halt()
{
    // 진행 중인 목표 취소 요청
    if (goal_handle_ && goal_handle_->get_status() == GoalStatus::EXECUTING)
    {
        action_client_->async_cancel_goal(goal_handle_);
    }
    // 내부 상태 정리
    goal_handle_.reset();
    setStatus(NodeStatus::IDLE);
}

목표 취소 요청은 비동기적으로 처리되므로, halt() 호출 시점에서 즉시 취소가 완료되는 것은 보장되지 않는다. 그러나 행동 트리 프레임워크의 관점에서는 halt() 호출 이후 해당 노드의 상태가 IDLE로 전환되므로, 다음 틱에서 해당 노드가 다시 틱을 수신하면 초기 상태부터 새로 실행된다.

4. Halt 이후의 상태 일관성

성공 정책 충족 후 Halt가 완료되면, Parallel 노드의 내부 상태는 다음을 만족해야 한다.

  1. 완료 플래그 초기화: 모든 자식의 completed[i]false로 재설정된다.
  2. 캐싱 상태 초기화: 모든 last_status[i]가 IDLE로 재설정된다.
  3. 자식 상태 초기화: 모든 자식 노드의 상태가 IDLE로 전환된다.
  4. 블랙보드 일관성: 성공한 자식이 블랙보드에 기록한 결과는 유지되어야 하며, 중단된 자식의 불완전한 데이터는 후속 처리에 영향을 미치지 않아야 한다.

5. 로봇공학에서의 실제 사례

5.1 내비게이션 성공 시 감시 행동 중단

<Parallel success_count="1">
    <NavigateToGoal goal="{target}"/>
    <MonitorSurroundings/>
</Parallel>

NavigateToGoal이 목표 지점에 도달하여 SUCCESS를 반환하면, SUCCESS_ONE 정책이 충족된다. 이때 MonitorSurroundings는 RUNNING 상태에서 Halt된다. MonitorSurroundings가 ROS2 토픽 구독 기반이라면, Halt 시 구독 콜백이 비활성화되어야 한다.

5.2 경쟁적 경로 계획 성공 시

<Parallel success_count="1">
    <PlanPathRRT/>
    <PlanPathPRM/>
    <PlanPathAPF/>
</Parallel>

세 가지 경로 계획 알고리즘 중 PlanPathRRT가 가장 먼저 유효한 경로를 생성하여 SUCCESS를 반환하면, PlanPathPRMPlanPathAPF가 Halt된다. 이로써 불필요한 경로 계획 연산이 즉시 중단되어 계산 리소스가 절약된다.

6. 참고 문헌

  • Colledanchise, M., & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Faconti, D., & contributors. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/

Version: 1.0-2026.04.03