조건 평가 결과 로깅 (Condition Evaluation Result Logging)
1. 개요
조건 평가 결과 로깅은 조건 노드의 매 tick에서의 반환 상태를 체계적으로 기록하는 기법이다. 이를 통해 조건 노드의 동작 이력을 추적하고, 예상치 못한 상태 전환의 원인을 분석하며, 시스템의 전반적인 의사 결정 과정을 사후적으로 검토할 수 있다.
2. 로깅 수준과 전략
2.1 상태 전환 로깅
매 tick이 아닌, 조건 결과가 변경된 시점에서만 로깅하여 로그 볼륨을 제한한다.
class LoggingConditionWrapper : public BT::ConditionNode
{
public:
BT::NodeStatus tick() override
{
BT::NodeStatus result = evaluateCondition();
if (result != previous_result_)
{
RCLCPP_INFO(node_->get_logger(),
"Condition [%s] changed: %s → %s",
name().c_str(),
BT::toStr(previous_result_).c_str(),
BT::toStr(result).c_str());
previous_result_ = result;
}
return result;
}
protected:
virtual BT::NodeStatus evaluateCondition() = 0;
private:
BT::NodeStatus previous_result_{BT::NodeStatus::IDLE};
rclcpp::Node::SharedPtr node_;
};
2.2 주기적 요약 로깅
지정된 주기마다 조건 평가 통계를 요약하여 로깅한다.
void logSummary()
{
auto elapsed = (now() - summary_start_).seconds();
if (elapsed >= summary_interval_)
{
RCLCPP_INFO(node_->get_logger(),
"Condition [%s] summary (%.0fs): "
"SUCCESS=%d, FAILURE=%d, rate=%.1f%%",
name().c_str(), elapsed,
success_count_, failure_count_,
100.0 * success_count_ /
(success_count_ + failure_count_));
success_count_ = 0;
failure_count_ = 0;
summary_start_ = now();
}
}
3. BehaviorTree.CPP의 로깅 인프라
3.1 TreeObserver 기반 자동 로깅
BT::Tree tree = factory.createTree("MainTree");
BT::TreeObserver observer(tree);
tree.tickWhileRunning();
// 모든 조건 노드의 통계 조회
for (const auto& [uid, stats] : observer.statistics())
{
if (stats.success_count + stats.failure_count > 0)
{
RCLCPP_INFO(node->get_logger(),
"Node [%s]: SUCCESS=%d, FAILURE=%d",
tree.getNode(uid)->name().c_str(),
stats.success_count, stats.failure_count);
}
}
3.2 FileLogger2를 통한 영구 로깅
BT::FileLogger2 file_logger(tree, "condition_log.btlog");
tree.tickWhileRunning();
생성된 .btlog 파일은 Groot2에서 시각적으로 재생하거나, 스크립트로 파싱하여 분석할 수 있다.
4. ROS2 diagnostics를 통한 조건 상태 발행
조건 노드의 상태를 ROS2 진단 시스템에 통합하여 발행한다.
class DiagnosticCondition : public BT::ConditionNode
{
public:
BT::NodeStatus tick() override
{
BT::NodeStatus result = evaluateCondition();
diagnostic_msgs::msg::DiagnosticStatus status;
status.name = "BT Condition: " + name();
status.hardware_id = "behavior_tree";
if (result == BT::NodeStatus::SUCCESS)
{
status.level = diagnostic_msgs::msg::DiagnosticStatus::OK;
status.message = "Condition satisfied";
}
else
{
status.level = diagnostic_msgs::msg::DiagnosticStatus::WARN;
status.message = "Condition not satisfied";
}
diagnostics_pub_->publish(createDiagArray(status));
return result;
}
};
5. 설계 시 고려 사항
5.1 로깅 성능 영향
매 tick마다 로깅을 수행하면 I/O 오버헤드가 발생한다. 프로덕션 환경에서는 상태 전환 시에만 로깅하거나, 로그 수준을 DEBUG로 설정하여 필요 시에만 활성화한다.
5.2 로그 데이터의 구조화
로그 메시지에 타임스탬프, 노드 이름, 입력 값, 결과를 구조화된 형식으로 포함하면 자동화된 분석이 용이하다.
5.3 개인정보 보호
로봇이 사람과 상호작용하는 환경에서는 로그 데이터에 민감한 정보(카메라 영상, 위치 정보 등)가 포함될 수 있으므로, 로그 데이터의 보존 정책과 접근 제한을 설정하여야 한다.
6. 참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-04 | 초안 작성 |