1295.73 성공/실패 정책의 설정 방법

1. BehaviorTree.CPP에서의 정책 설정

BehaviorTree.CPP에서 Parallel 노드의 성공/실패 정책은 노드의 입력 포트를 통해 설정된다. 버전에 따라 설정 방식이 다르며, 본 절에서는 주요 버전별 설정 방법을 기술한다.

2. 버전 4.x: ParallelAll의 정책 설정

BehaviorTree.CPP 4.x에서는 ParallelAll 노드가 max_failures 포트를 통해 실패 정책을 설정한다. 성공 정책은 항상 SUCCESS_ALL(모든 자식 성공)로 고정되어 있다.

2.1 XML 설정

<!-- max_failures = 0: 하나라도 실패하면 전체 실패 (FAILURE_ONE) -->
<ParallelAll max_failures="0">
    <Action_A />
    <Action_B />
    <Action_C />
</ParallelAll>

<!-- max_failures = 1: 최대 1개 실패 허용 -->
<ParallelAll max_failures="1">
    <Action_A />
    <Action_B />
    <Action_C />
</ParallelAll>

<!-- max_failures = -1: 실패 무제한 허용 (모든 자식 실패해도 FAILURE 아님) -->
<ParallelAll max_failures="-1">
    <Action_A />
    <Action_B />
    <Action_C />
</ParallelAll>

2.2 max_failures 값에 따른 동작

max_failures의미동등한 정책
0실패 불허용FAILURE_ONE
1최대 1개 실패 허용FAILURE_COUNT(2)
N-1 (N은 자식 수)모든 자식 실패 시만 실패FAILURE_ALL
-1실패 무제한 허용실패 정책 비활성화

2.3 블랙보드를 통한 동적 설정

정책을 런타임에 동적으로 변경할 수 있다.

<ParallelAll max_failures="{dynamic_max_failures}">
    <Action_A />
    <Action_B />
</ParallelAll>

블랙보드 키 dynamic_max_failures의 값을 변경하면 다음 Tick부터 새로운 정책이 적용된다.

3. 버전 3.x: ParallelNode의 정책 설정

BehaviorTree.CPP 3.x에서는 ParallelNodesuccess_countfailure_count 두 개의 파라미터를 통해 정책을 설정하였다.

<!-- 3.x 방식 -->
<Parallel success_count="2" failure_count="1">
    <Action_A />
    <Action_B />
    <Action_C />
</Parallel>
파라미터의미
success_count이 수만큼의 자식이 SUCCESS이면 Parallel이 SUCCESS
failure_count이 수만큼의 자식이 FAILURE이면 Parallel이 FAILURE

3.1 정책 조합 예시 (3.x)

success_countfailure_count동작
3 (전체)1SUCCESS_ALL + FAILURE_ONE
13 (전체)SUCCESS_ONE + FAILURE_ALL
22SUCCESS_COUNT(2) + FAILURE_COUNT(2)
-11성공 정책 비활성화 + FAILURE_ONE

특수값 -1은 해당 정책을 비활성화한다.

4. C++ 코드에서의 프로그래밍적 설정

XML이 아닌 C++ 코드에서 직접 트리를 구성하는 경우, 포트 값을 프로그래밍적으로 설정한다.

// 4.x 방식
BT::NodeConfig config;
config.input_ports["max_failures"] = "1";

auto parallel = std::make_unique<BT::ParallelAll>("my_parallel", config);
parallel->addChild(action_a.get());
parallel->addChild(action_b.get());

5. 정책 선택 가이드

로봇공학에서의 일반적인 적용 시나리오에 따른 정책 선택 가이드이다.

5.1 행동 + 감시 패턴

<!-- 감시가 실패하면 즉시 전체 실패 -->
<ParallelAll max_failures="0">
    <NavigateToGoal />
    <SafetyMonitor />    <!-- FAILURE 시 전체 중단 -->
</ParallelAll>

감시 노드의 FAILURE가 주 행동의 즉시 중단을 유발하여야 하므로 max_failures="0"을 설정한다.

5.2 다중 센서 동시 처리 패턴

<!-- 일부 센서 실패를 허용 -->
<ParallelAll max_failures="1">
    <ProcessLidar />
    <ProcessCamera />
    <ProcessIMU />
</ParallelAll>

세 센서 중 하나가 실패하더라도 나머지 두 센서로 동작을 계속할 수 있으므로 max_failures="1"을 설정한다.

5.3 독립적 동시 작업 패턴

<!-- 모든 작업이 완료되어야 성공 -->
<ParallelAll max_failures="0">
    <TaskA />
    <TaskB />
    <TaskC />
</ParallelAll>

모든 작업이 필수적이므로 하나라도 실패하면 전체가 실패하여야 한다.

6. 정책 설정 시 유의 사항

  1. max_failures의 범위 확인: max_failures가 자식 수 이상이면 Parallel이 FAILURE를 반환할 수 없다. 의도하지 않은 설정인지 확인하라.

  2. 동적 정책 변경의 안전성: 블랙보드를 통해 정책을 런타임에 변경하는 경우, Parallel이 RUNNING 상태인 도중에 정책이 변경되면 예기치 않은 동작이 발생할 수 있다. 가능하면 Parallel이 IDLE 상태일 때만 정책을 변경하라.

  3. 3.x에서 4.x로의 마이그레이션: 3.x의 Parallel을 4.x의 ParallelAll로 마이그레이션할 때, success_count가 전체 자식 수와 같지 않았던 경우(SUCCESS_ONE이나 SUCCESS_COUNT 정책) 직접적인 대응이 불가능하다. 이 경우 커스텀 Parallel 노드를 구현하여야 한다.