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에서는 ParallelNode가 success_count와 failure_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_count | failure_count | 동작 |
|---|---|---|
| 3 (전체) | 1 | SUCCESS_ALL + FAILURE_ONE |
| 1 | 3 (전체) | SUCCESS_ONE + FAILURE_ALL |
| 2 | 2 | SUCCESS_COUNT(2) + FAILURE_COUNT(2) |
| -1 | 1 | 성공 정책 비활성화 + 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. 정책 설정 시 유의 사항
-
max_failures의 범위 확인:
max_failures가 자식 수 이상이면 Parallel이FAILURE를 반환할 수 없다. 의도하지 않은 설정인지 확인하라. -
동적 정책 변경의 안전성: 블랙보드를 통해 정책을 런타임에 변경하는 경우, Parallel이
RUNNING상태인 도중에 정책이 변경되면 예기치 않은 동작이 발생할 수 있다. 가능하면 Parallel이IDLE상태일 때만 정책을 변경하라. -
3.x에서 4.x로의 마이그레이션: 3.x의
Parallel을 4.x의ParallelAll로 마이그레이션할 때,success_count가 전체 자식 수와 같지 않았던 경우(SUCCESS_ONE이나 SUCCESS_COUNT 정책) 직접적인 대응이 불가능하다. 이 경우 커스텀 Parallel 노드를 구현하여야 한다.