1297.28 불리언 값 확인 조건 노드의 구현
1. 불리언 조건의 개요
불리언 값 확인 조건 노드는 블랙보드에 저장된 불리언(boolean) 값의 참/거짓을 판정하는 조건 노드이다. 불리언 조건은 로봇 시스템에서 플래그(flag) 상태 확인, 토글(toggle) 상태 검사, 이진 센서 값 판독 등에 사용된다. 비상 정지 활성화 여부, 무장(arming) 상태, 센서 캘리브레이션 완료 여부 등이 대표적인 불리언 조건 평가 대상이다(Colledanchise & Ogren, 2018).
2. 기본 불리언 확인 구현
블랙보드의 불리언 값이 참(true)인지를 판정하는 가장 기본적인 구현이다.
class IsFlagSet : public BT::ConditionNode
{
public:
IsFlagSet(const std::string& name, const BT::NodeConfig& config)
: BT::ConditionNode(name, config) {}
BT::NodeStatus tick() override
{
bool flag_value;
auto result = getInput("flag", flag_value);
if (!result)
{
return BT::NodeStatus::FAILURE;
}
return flag_value
? BT::NodeStatus::SUCCESS
: BT::NodeStatus::FAILURE;
}
static BT::PortsList providedPorts()
{
return {
BT::InputPort<bool>("flag", "확인할 불리언 값")
};
}
};
<!-- 로봇이 무장(armed) 상태인지 확인 -->
<Condition ID="IsFlagSet" flag="{is_armed}"/>
<!-- 캘리브레이션이 완료되었는지 확인 -->
<Condition ID="IsFlagSet" flag="{calibration_done}"/>
3. 기대값 지정 불리언 비교
불리언 값이 특정 기대값과 일치하는지를 판정하는 확장 구현이다. expected 매개변수를 통해 참 확인과 거짓 확인을 모두 수행할 수 있다.
class IsBoolEqual : public BT::ConditionNode
{
public:
IsBoolEqual(const std::string& name, const BT::NodeConfig& config)
: BT::ConditionNode(name, config) {}
BT::NodeStatus tick() override
{
bool value;
auto result = getInput("value", value);
if (!result)
{
return BT::NodeStatus::FAILURE;
}
bool expected;
getInput("expected", expected);
return (value == expected)
? BT::NodeStatus::SUCCESS
: BT::NodeStatus::FAILURE;
}
static BT::PortsList providedPorts()
{
return {
BT::InputPort<bool>("value", "검사 대상 불리언 값"),
BT::InputPort<bool>("expected", true, "기대 값 (기본값: true)")
};
}
};
<!-- 비상 정지가 비활성 상태인지 확인 (expected=false) -->
<Condition ID="IsBoolEqual" value="{emergency_stop}" expected="false"/>
<!-- 센서가 활성 상태인지 확인 (expected 생략 → true) -->
<Condition ID="IsBoolEqual" value="{sensor_active}"/>
4. 부정 불리언 확인
불리언 값이 거짓(false)인지를 판정하는 전용 노드이다. IsFlagSet에 Inverter 데코레이터를 적용하는 대안도 있으나, 전용 노드가 XML에서의 의미 전달에 더 명확하다.
class IsFlagClear : public BT::ConditionNode
{
public:
IsFlagClear(const std::string& name, const BT::NodeConfig& config)
: BT::ConditionNode(name, config) {}
BT::NodeStatus tick() override
{
bool flag_value;
auto result = getInput("flag", flag_value);
if (!result)
{
return BT::NodeStatus::FAILURE;
}
return (!flag_value)
? BT::NodeStatus::SUCCESS
: BT::NodeStatus::FAILURE;
}
static BT::PortsList providedPorts()
{
return {
BT::InputPort<bool>("flag", "확인할 불리언 값")
};
}
};
<!-- 비상 정지가 해제되었는지 확인 -->
<Condition ID="IsFlagClear" flag="{emergency_stop}"/>
<!-- 오류 플래그가 없는지 확인 -->
<Condition ID="IsFlagClear" flag="{has_error}"/>
5. 로봇공학에서의 불리언 조건 적용
| 불리언 변수 | 참(true)의 의미 | 적용 분야 |
|---|---|---|
is_armed | 로봇이 무장 상태 | 드론, 이동 로봇 |
emergency_stop | 비상 정지 활성화 | 모든 로봇 시스템 |
is_localized | 위치 추정 완료 | 내비게이션 |
path_blocked | 경로 장애물 존재 | 자율 주행 |
gripper_closed | 그리퍼 닫힘 | 매니퓰레이터 |
sensor_calibrated | 센서 캘리브레이션 완료 | 센서 시스템 |
communication_ok | 통신 연결 정상 | 원격 제어 |
geofence_violated | 지오펜스 위반 | 드론 비행 |
6. 블랙보드에서의 불리언 값 저장
불리언 값은 액션 노드, ROS2 토픽 콜백, 서비스 응답 등에서 블랙보드에 저장된다.
// 액션 노드에서 불리언 값 저장
BT::NodeStatus UpdateFlags::tick()
{
bool armed = checkArmingState();
setOutput("is_armed", armed);
bool localized = checkLocalization();
setOutput("is_localized", localized);
return BT::NodeStatus::SUCCESS;
}
7. XML에서의 종합 활용 패턴
<ReactiveSequence>
<!-- 안전 조건: 비상 정지가 해제되어 있을 것 -->
<Condition ID="IsFlagClear" flag="{emergency_stop}"/>
<!-- 전제 조건: 무장 상태일 것 -->
<Condition ID="IsFlagSet" flag="{is_armed}"/>
<!-- 전제 조건: 위치 추정이 완료되었을 것 -->
<Condition ID="IsFlagSet" flag="{is_localized}"/>
<!-- 행동 실행 -->
<Action ID="Navigate" goal="{target}"/>
</ReactiveSequence>
이 구조에서 세 가지 불리언 조건이 매 tick마다 재평가되어, 비상 정지가 활성화되거나 무장이 해제되거나 위치 추정이 유실되면 내비게이션이 즉시 중단된다.
8. 데이터 부재 시의 처리
블랙보드에 불리언 키가 존재하지 않는 경우, getInput()이 실패하며 FAILURE를 반환한다. 이는 실패 안전(fail-safe) 원칙에 부합한다. 시스템 초기화 전에 플래그가 설정되지 않은 상태에서는 해당 조건을 미충족으로 판정하여 행동의 실행을 차단하는 것이 안전하다.
초기 상태에서 특정 플래그의 기본값을 설정하려면, 트리 실행 전에 블랙보드에 초기값을 저장한다:
auto blackboard = BT::Blackboard::create();
blackboard->set("emergency_stop", false);
blackboard->set("is_armed", false);
blackboard->set("is_localized", false);
9. 참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Faconti, D., & Colledanchise, M. (2022). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/
version: 0.1.0