카테고리 없음

Py Tree - initialise

code911 2025. 3. 18. 19:32

행동 트리(Behaviour Tree)의 주요 초기화 포인트

주요 집중 사항:

  • initialise() 메서드는 행동이 이미 실행 중이 아닐 때만 작동합니다.
  • 부모의 tick() 메서드가 언제 initialise(), stop(), terminate() 메서드를 호출할지 결정합니다.
  • 부모의 tick() 메서드는 항상 update()를 호출합니다.
  • update() 메서드는 행동의 상태(Status)를 결정하는 역할을 합니다.

초기화 과정

초기화에 세 가지 메서드가 사용되므로 초기화 코드를 어디에 배치해야 할지 구분하기 어려울 수 있습니다. 각 메서드의 역할을 자세히 살펴보겠습니다:

__init__ 메서드

  • 목적: 행동을 오프라인 DOT 그래프 생성에 충분하도록 인스턴스화합니다.
  • 중요성: 나중에 행동 트리를 DOT 그래프로 렌더링할 수 있게 합니다. 현재로서는 이것을 CI 서버(예: Jenkins)와 같은 곳에서 트리의 DOT 그래프를 생성할 수 있을 만큼 최소한으로 유지해야 한다는 것을 이해하면 충분합니다. 이것은 매우 유용한 기능입니다.
  • 포함하지 말아야 할 것:
    • 존재하지 않을 수 있는 하드웨어 연결 (예: USB 라이다)
    • 존재하지 않을 수 있는 다른 소프트웨어와의 미들웨어 연결 (예: ROS pub/sub/service)
    • 불필요하게 무거운 리소스 (예: 백그라운드에서 실행되는 무거운 스레드)

setup 메서드

  • 목적: 실행에 필요한 모든 다른 일회성 리소스 초기화를 처리합니다.
  • 내용: 기본적으로 생성자가 처리하지 않는 모든 것 - 하드웨어 연결, 미들웨어 및 기타 무거운 리소스를 초기화합니다.
  • 언제 호출되나: 프로그램에서 수동으로 호출하거나, 더 일반적으로 setup_with_descendants() 또는 BehaviourTree.setup()을 통해 호출됩니다.

initialise 메서드

  • 목적: 행동을 구성하고 (반복) 실행을 위해 준비합니다.
  • 내용: 여기서의 초기화는 작업의 즉각적인 실행을 준비하는 것입니다.
  • 예시:
    • 변수 초기화/재설정/지우기
    • 타이머 시작
    • 적시(Just-in-time) 미들웨어 연결 발견 및 설정
    • 시스템의 다른 곳에서 실행 중인 컨트롤러를 시작하기 위한 목표 전송
    • 기타...

초기화 흐름 이해하기

전체 초기화 흐름을 이해하는 것이 중요합니다:

  1. 단계 1: __init__에서는 최소한의 초기화만 수행하여 트리 구조를 생성하고 시각화할 수 있게 합니다.
  2. 단계 2: setup에서는 실행 전 무거운 리소스를 초기화합니다 (일반적으로 트리 시작 시 한 번만 호출).
  3. 단계 3: initialise에서는 각 실행 주기 시작 시 필요한 모든 것을 준비합니다 (행동이 실행될 때마다 호출).

이러한 구분은 행동 트리가 효율적으로 작동하고, 필요할 때만 리소스를 사용하며, 반복 실행과 재사용이 가능하도록 합니다. 특히 로봇 시스템에서 이러한 초기화 단계를 명확히 분리하는 것은 안정성과 효율성을 위해 매우 중요합니다.