Py Tree - idiom
Idioms(관용구)
Idioms은 흔한 서브트리 패턴을 만들기 위한 생성자입니다.
일반적인 의사 결정 패턴은 종종 기본 동작(behaviours)과 블랙보드를 특정 조합으로 사용하여 구현할 수 있습니다. 이 방식이 트리를 다소 장황하게 만들더라도, 새로운 복합(composite) 타입을 만들거나 기존 복합 타입을 재정의하는 것보다 선호됩니다. 새 타입을 만들거나 재정의하면 트리 로직의 복잡성이 증가하거나 세부 사항이 숨겨지게 되고, 둘 다 트리의 내부 구조 파악이나 시각화에 기하급수적인 비용을 추가합니다.
이 패키지에서 이러한 패턴들은 PyTree Idioms라고 불리며, 이 모듈에서는 이러한 패턴을 생성하는 데 도움이 되는 편의 기능들을 찾을 수 있습니다.
Either Or(둘 중 하나)
이 함수는 선택자(selector)와 비슷한 특성을 가지지만, 우선순위에 대한 고려가 없는 관용구를 생성합니다.
종종 우선순위를 구현하지 않는 일종의 선택자가 필요할 때가 있습니다. 즉, 선착순(first-come, first-served) 방식으로 다른 경로를 선택하고 싶을 때 사용합니다.
먼저 XOR 조건 검사가 있어서 결과를 지정된 네임스페이스 아래의 블랙보드에 '잠금(lock)'합니다. 결과를 잠그면 조건 변수가 미래의 틱(tick)에서 변경되더라도 선택된 서브트리의 실행을 방해하지 않습니다. (조건 변수의 예로는 조이스틱 버튼 누름을 등록한 변수가 있을 수 있습니다.)
결과가 잠기면 선택자 아래에서 관련 서브트리가 활성화됩니다. 선택자의 자식들은 왼쪽에서 오른쪽으로 나열되지만, 이전의 XOR 선택이 이미 잠겨있고 서브트리가 완전히 실행될 때까지 재방문되지 않기 때문에 우선순위 순서가 없습니다. 하나만 활성화될 수 있고 다른 것들에 의해 중단될 수 없습니다.
실행을 중단하는 유일한 방법은 이 관용구가 포함된 트리에서 더 높은 우선순위를 통해서입니다.
매개변수
- conditions (List[ComparisonExpression]): 어떤 서브트리를 활성화할지 선택하는 트리거 목록
- subtrees (List[Behaviour]): either_or 작업에서 틱(tick)할 서브트리 목록
- name (str): 이 관용구의 루트 동작에 사용할 이름
- preemptible: 서브트리가 서로 선점(중단)할 수 있는지 여부
- namespace (Optional[str]): 이 관용구의 개인 변수는 이 네임스페이스 뒤에 배치됨
예외
조건의 수가 서브트리의 수와 일치하지 않으면 ValueError가 발생합니다.
반환 유형
Behaviour
네임스페이스가 제공되지 않으면 관용구의 이름에서 고유한 네임스페이스가 파생됩니다.
참고
py-trees-demo-either-or
할 일(Todo)
다른 서브트리가 활성 분기를 (우선순위 없이) 선점할 수 있는 버전
Oneshot (원샷)
특정 패턴이 단 한 번만 완료될 때까지 실행되도록 보장합니다. 그 이후에는 완료 상태로 바운드됩니다(다시 실행되지 않고 완료 상태만 반환).
정책(policy)을 설정하여 실패할 경우 원샷이 계속 시도하도록 하거나, FAILURE 상태로 끝났는지 여부에 관계없이 추가 시도를 중단하도록 구성할 수 있습니다.
매개변수
- behaviour (Behaviour): 원샷으로 실행할 단일 동작 또는 복합 서브트리
- name (str): 원샷 루트(선택자)에 사용할 이름
- variable_name (str): 블랙보드에서 사용하는 변수 이름, 중첩될 수 있음
- policy (OneShotPolicy): 성공 또는 실패에 관계없이 한 번만 실행할지, 또는 실패할 경우 계속 시도할지 여부
반환값
원샷 서브트리의 루트
반환 유형
Behaviour
참고
py_trees.decorators.OneShot
Pickup Where You Left Off (중단했던 부분부터 다시 시작)
작업 순서가 중단됐던 곳에서 다시 시작할 수 있게 해주는 관용구를 만듭니다.
샌드위치를 즐기던 중 무례하게 방해받은 동굴인(그들이 수건만 입었다고 해서 문명화되지 않았다는 의미는 아닙니다)은 자신의 성소를 침범한 사브르투스 호랑이를 마치 모기를 쫓아내듯 곤봉을 들고 방어합니다. 임무를 완수한 후, 그는 샌드위치의 층들을 우물거리며 즐기던 기쁨으로 돌아갑니다.
이 관용구를 구현하는 데는 장단점이 있는 대체 방법들이 있습니다:
a) 시퀀스의 작업들은 상태를 동적으로 확인하고, 작업 시퀀스가 처음 진입할 때마다 필요한 작업들을 생성하며, 완료되거나 무효화될 때 그것들을 무효화/삭제하는 팩토리 동작으로 대체될 수 있습니다. 이 방법은 여기서 사용되는 블랙보드 장치가 많이 필요하지 않다는 장점이 있지만, 항상 작업 시퀀스 자체를 보이지 않게 한다는 단점이 있습니다(즉, 세부 사항을 숨김).
b) 초기화 사이에 인덱스를 유지하는 새로운 복합체도 더 적은 블랙보드 조작으로 동일한 패턴을 달성할 수 있지만, 트리의 논리적 복잡성 비용이 증가합니다(각 새로운 복합체는 의사 결정 복잡성을 O(n!)로 증가시킴).
매개변수
- name (str): 작업 시퀀스 동작에 사용할 이름
- tasks ([Behaviour]): 순차적으로 수행될 작업 목록
반환값
생성된 서브트리의 루트
반환 유형
Behaviour