카테고리 없음

Py Tree - Tree

code911 2025. 3. 18. 20:23

Trees (트리)

트리 관리에 대한 설명입니다.

연결된 행동(behaviours)과 복합체(composites)의 그래프는 그 자체로 트리를 형성하지만(즉, 초기화하고 틱할 수 있음), 일반적으로는 많은 관리 작업을 처리하고 트리를 더 효과적으로 사용할 수 있게 해주는 추가 기능을 제공하는 다른 클래스로 트리를 감싸는 것이 편리합니다.

이 패키지는 직접 사용할 수 있는 기본 참조 구현을 제공하지만, 자신만의 트리 관리자를 만들기 위한 영감으로도 쉽게 활용할 수 있습니다.

행동 트리 (The Behaviour Tree)

python
복사
class py_trees.trees.BehaviourTree(root: Behaviour)[source]

이 트리 관리자를 사용하여 행동 트리를 성장시키고, 관리하고, 가지치기할 수 있습니다.

이 클래스는 단순히 트리의 루트 행동을 틱하는 것 이상의 몇 가지 기능을 제공합니다. 이러한 기능들은 더 풍부한 로깅, 내부 검사, 트리 자체의 동적 관리를 가능하게 합니다:

  • 틱 전후에 자동으로 코드를 실행하는 사전 및 사후 틱 핸들러
  • 틱 중에 트리의 탐색된 부분에 접근할 수 있는 방문자(visitor) 기능
  • 서브트리 가지치기 및 삽입 작업
  • 연속적인 틱-톡(tick-tock) 지원

참고

py-trees-demo-tree-stewardship 프로그램은 위의 기능들을 보여줍니다.

매개변수

root (Behaviour): 트리의 루트 노드

변수

  • count: 트리가 틱된 횟수
  • root: 트리의 루트 노드
  • visitors: 틱할 때 트리의 탐색된 부분을 방문하는 엔티티
  • pre_tick_handlers: 전체 트리가 틱되기 전에 실행되는 함수들
  • post_tick_handlers: 전체 트리가 틱된 후에 실행되는 함수들

예외

TypeError: root 변수가 Behaviour의 인스턴스가 아닌 경우 발생

 

Skeleton (스켈레톤)

행동 트리의 가장 기본적인 기능은 자동 틱-톡(tick-tock)입니다. tick_tock() 메서드를 사용하여 특정 횟수만큼 또는 무한히 실행할 수 있으며, interrupt() 메서드를 사용하여 중지할 수 있습니다.

다음은 간단한 행동 트리를 생성하고 틱하는 방법을 보여주는 예제입니다:

또는 자신만의 루프를 만들고 tick() 메서드를 사용하여 원하는 때에 틱을 수행할 수도 있습니다.

이 예제에서:

  1. 우선순위가 다른 세 개의 성공(Success) 노드가 있는 선택자(Selector) 복합체를 생성합니다.
  2. 이 루트 노드로 행동 트리를 만듭니다.
  3. 트리를 시각화하여 출력합니다.
  4. 트리를 설정합니다(최대 15초 타임아웃).
  5. 틱 후 트리 상태를 출력하는 함수를 정의합니다.
  6. 500ms 간격으로 계속해서 트리를 틱-톡하고, 틱 후에는 트리 상태를 출력합니다.
  7. 키보드 인터럽트(Ctrl+C)가 발생하면 트리를 중단합니다.

이 기본 스켈레톤을 기반으로 더 복잡한 행동 트리를 구축할 수 있습니다.

Pre/Post Tick Handlers (틱 전/후 핸들러)

틱 전/후 핸들러는 트리를 틱하기 직전과 직후에 트리에 대한 또는 트리를 사용한 어떤 활동을 수행하는 데 사용할 수 있습니다. 이는 주로 연속적인 tick_tock() 메커니즘과 함께 사용할 때 유용합니다.

이는 다양한 목적으로 유용합니다:

  • 로깅
  • 보고서 작성을 위한 트리 내부 검사
  • 블랙보드에서 데이터 추출
  • 트리를 수정하기 위한 외부 조건 트리거(예: 새로운 계획 도착)

이러한 핸들러가 실행되는 동안에는 트리가 틱되지 않기 때문에 잠금(locking) 없이도 이 작업을 수행할 수 있습니다. 그러나 이는 핸들러가 가벼워야 함을 의미합니다. 핸들러는 일반 틱 주기 외에 시간을 소비하게 됩니다.

py-trees-demo-tree-stewardship 프로그램은 현재 실행을 사용자에게 알리는 라인을 stdout에 출력하는 매우 간단한 틱 전 핸들러를 보여줍니다. 관련 코드는 다음과 같습니다:

틱 전 핸들러 함수

틱 전 핸들러 추가

 

위 코드는 틱 전 핸들러의 예시를 보여주지만, 완전하지 않은 것 같습니다. 일반적으로 틱 전/후 핸들러는 다음과 같이 행동 트리에 추가됩니다:

이러한 핸들러를 사용하면 트리의 실행을 모니터링하고, 필요한 경우 외부 조건에 따라 트리를 수정하거나, 트리의 현재 상태에 대한 정보를 수집하는 등의 작업을 수행할 수 있습니다.

 

Visitors (방문자)

행동에 대한 방문 권한에 관한 설명입니다.

방문자(Visitors)는 트리 구현(예: BehaviourTree)에 전달되어 트리의 모든 행동을 방문하거나, 실행 중인 틱에서 트리가 탐색될 때 행동들을 방문하는 데 사용될 수 있는 개체입니다. 각 행동에서 방문자는 로깅, 내부 검사 등 원하는 작업을 수행하기 위해 행동에 대해 자체 메서드를 실행합니다.

경고 방문자는 방문하는 행동을 수정해서는 안 됩니다.

py-trees-demo-tree-stewardship 프로그램은 두 가지 참조 방문자 구현을 보여줍니다:

  • DebugVisitor는 디버그 로깅 메시지를 stdout에 출력합니다.
  • SnapshotVisitor는 시각화에 사용될 런타임 데이터를 수집합니다.

트리에 방문자 추가하기:

 

 

이러한 방문자들은 트리의 tick 메서드 내에서 자동으로 실행됩니다. 전자는 즉시 화면에 로깅하고, 후자는 ASCII 트리를 표시하는 데 사용되는 정보를 수집합니다:

방문자 패턴을 사용하면 트리의 내부 구조를 변경하지 않고도 트리에 대한 다양한 관찰 및 분석 작업을 수행할 수 있습니다. 이는 디버깅, 모니터링, 시각화 등의 목적으로 매우 유용합니다.

자신만의 방문자를 구현하여 특정 요구사항에 맞는 정보를 수집하거나 특정 행동에 대한 분석을 수행할 수도 있습니다. 예를 들어, 특정 조건이 충족되었을 때 알림을 트리거하는 방문자나 트리 실행에 대한 통계를 수집하는 방문자를 만들 수 있습니다.