1291.72 상태 머신 내부의 행동 트리 호출

하이브리드 아키텍처의 한 가지 구현 형태로서, 유한 상태 머신(Finite State Machine, FSM)의 특정 상태 내부에서 행동 트리(Behavior Tree, BT)를 호출하여 실행하는 설계 패턴이 존재한다. 이 패턴에서 유한 상태 머신은 시스템의 고수준 모드(Mode) 전환을 관리하고, 각 모드 내부의 세부 행동 논리는 행동 트리에 의해 구현된다.

1. 아키텍처 구조

이 패턴에서 유한 상태 머신의 각 상태는 독립적인 행동 트리 인스턴스를 보유한다. 시스템이 특정 상태에 진입하면 해당 상태에 연결된 행동 트리가 활성화되어 틱(Tick) 기반 실행을 시작하며, 상태를 탈출하면 해당 행동 트리가 중단(Halt)된다. 유한 상태 머신의 전이는 행동 트리의 실행 결과(최종 반환 상태)나 외부 이벤트에 의해 촉발된다.

[FSM]
  ├── State: 초기화 ─→ BT_초기화_시퀀스
  ├── State: 순찰   ─→ BT_순찰_임무
  ├── State: 복귀   ─→ BT_충전_복귀
  └── State: 대기   ─→ (행동 없음)

이 구조에서 유한 상태 머신은 시스템의 운영 모드를 관리하는 감독자(Supervisor) 역할을 수행하며, 각 모드 내부의 행동 논리는 행동 트리의 모듈성과 반응성을 활용하여 구현된다.

2. 설계 장점

이 패턴은 다음의 설계 장점을 제공한다.

첫째, 명확한 모드 관리이다. 시스템의 고수준 운영 모드(초기화, 임무 수행, 긴급 정지, 유지보수 등) 간의 전환이 유한 상태 머신의 전이 규칙에 의해 명시적으로 관리된다. 이를 통해 불법적 모드 전환이 구조적으로 차단되고, 모드별 진입/탈출 조건이 전이 도표에 명확하게 문서화된다.

둘째, 모드 내부 행동의 유연성이다. 각 모드 내부에서는 행동 트리의 반응적 행동 선택, 계층적 분해, 모듈적 구성이 자유롭게 활용된다. 모드 내부의 행동 논리를 수정하거나 확장할 때 해당 행동 트리만 변경하면 되며, 상위의 유한 상태 머신 구조에는 영향을 주지 않는다.

셋째, 행동 트리의 범위 제한이다. 각 행동 트리가 특정 모드 내부에서만 실행되므로, 개별 트리의 크기와 복잡도가 제한된다. 이는 트리 깊이 증가에 따른 성능 문제와 디버깅 복잡도를 완화한다.

넷째, 형식적 검증의 용이성이다. 유한 상태 머신의 모드 전이 논리는 상태 수가 제한적이므로 모델 검사를 통한 형식적 검증이 실행 가능하다. 핵심 안전 속성(예: “긴급 정지 모드에서는 모터 구동이 불가능하다”)을 유한 상태 머신 수준에서 검증할 수 있다.

3. 구현 방법

ROS2 환경에서 이 패턴의 구현은 다음의 방법으로 수행된다.

유한 상태 머신의 각 상태 진입 시 해당 행동 트리의 XML 파일을 로드하고 BT::Tree 인스턴스를 생성하여 틱 루프를 시작한다. 상태 탈출 시에는 tree.haltTree()를 호출하여 모든 실행 중인 노드를 정리한다. 전이 조건은 행동 트리의 루트 노드 반환 상태(Success → 정상 완료, Failure → 오류 발생)를 감시하여 판단하거나, 외부 이벤트(ROS2 서비스 호출, 토픽 수신 등)에 의해 촉발된다.

// 의사 코드
switch (current_state) {
    case PATROL:
        status = patrol_tree.tickOnce();
        if (status == BT::NodeStatus::SUCCESS)
            transition_to(IDLE);
        if (battery_low)
            transition_to(RETURN_TO_CHARGER);
        break;
    case RETURN_TO_CHARGER:
        status = return_tree.tickOnce();
        if (status == BT::NodeStatus::SUCCESS)
            transition_to(CHARGING);
        break;
    // ...
}

4. 설계 고려 사항

이 패턴의 적용 시 다음의 사항을 고려해야 한다.

첫째, 상태 전환 시 행동 트리의 정리이다. 모드 전환이 발생할 때 현재 실행 중인 행동 트리의 모든 Running 상태 노드가 적절하게 중단되어야 한다. 비동기 액션의 취소 처리와 블랙보드 상태의 정리가 누락되면 리소스 누수나 후속 행동의 오동작이 발생할 수 있다.

둘째, 블랙보드의 범위 관리이다. 각 모드별 행동 트리가 독립적인 블랙보드를 사용할 것인지, 전역 블랙보드를 공유할 것인지를 결정해야 한다. 독립적 블랙보드는 모드 간 데이터 격리를 보장하지만 모드 전환 시 데이터 이관이 필요하며, 공유 블랙보드는 이관 비용을 줄이지만 의도치 않은 데이터 간섭의 위험이 존재한다.

셋째, 전이 트리거의 적정한 배치이다. 전이 트리거를 유한 상태 머신 수준에 둘 것인지, 행동 트리 내부에서 블랙보드를 통해 유한 상태 머신에 전달할 것인지에 따라 아키텍처의 결합도가 달라진다.


참고 문헌

  • Colledanchise, M., & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Iovino, M., Scukins, E., Styrud, H., Ögren, P., & Smith, C. (2022). “A Survey of Behavior Trees in Robotics and AI.” Robotics and Autonomous Systems, 154, 104096.
  • Faconti, D., & Aurys, M. (2022). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/