온도 범위 확인 조건 노드 (Temperature Range Check Condition Node)

온도 범위 확인 조건 노드 (Temperature Range Check Condition Node)

1. 개요

온도 범위 확인 조건 노드는 로봇 시스템의 구성 요소 또는 운용 환경의 온도가 허용 범위 내에 있는지를 판정하는 조건 노드이다. 모터, 배터리, 전자 기기, 센서 등의 온도가 설계 한계를 초과하면 성능 저하, 구성 요소 손상, 화재 위험 등이 발생할 수 있다. 본 조건 노드는 열 관련 안전 조건의 감시와 과열 방지 행동의 유발에 활용된다.

2. ROS2 온도 메시지

2.1 sensor_msgs::msg::Temperature

필드타입단위설명
headerstd_msgs/Header-타임스탬프 및 프레임
temperaturefloat64°C측정된 온도
variancefloat64°C²온도 측정 분산 (0이면 미상)

3. 기본 구현

3.1 온도 범위 확인

class IsTemperatureInRange
    : public BT::RosTopicSubNode<sensor_msgs::msg::Temperature>
{
public:
    IsTemperatureInRange(const std::string& name,
                         const BT::NodeConfiguration& config,
                         const BT::RosNodeParams& params)
        : RosTopicSubNode(name, config, params)
    {}

    static BT::PortsList providedPorts()
    {
        return providedBasicPorts({
            BT::InputPort<double>("min_temp", -20.0,
                "최소 허용 온도 (°C)"),
            BT::InputPort<double>("max_temp", 60.0,
                "최대 허용 온도 (°C)")
        });
    }

    BT::NodeStatus onTick(
        const sensor_msgs::msg::Temperature::SharedPtr& msg) override
    {
        if (!msg)
        {
            return BT::NodeStatus::FAILURE;
        }

        if (!std::isfinite(msg->temperature))
        {
            return BT::NodeStatus::FAILURE;
        }

        double min_temp, max_temp;
        getInput("min_temp", min_temp);
        getInput("max_temp", max_temp);

        if (msg->temperature >= min_temp &&
            msg->temperature <= max_temp)
        {
            return BT::NodeStatus::SUCCESS;
        }
        return BT::NodeStatus::FAILURE;
    }
};

3.2 과열 감지 조건 노드 (히스테리시스 적용)

class IsNotOverheated
    : public BT::RosTopicSubNode<sensor_msgs::msg::Temperature>
{
public:
    IsNotOverheated(const std::string& name,
                    const BT::NodeConfiguration& config,
                    const BT::RosNodeParams& params)
        : RosTopicSubNode(name, config, params),
          is_normal_(true)
    {}

    static BT::PortsList providedPorts()
    {
        return providedBasicPorts({
            BT::InputPort<double>("overheat_temp", 70.0,
                "과열 판정 온도 (°C)"),
            BT::InputPort<double>("recovery_temp", 55.0,
                "복구 판정 온도 (°C)")
        });
    }

    BT::NodeStatus onTick(
        const sensor_msgs::msg::Temperature::SharedPtr& msg) override
    {
        if (!msg || !std::isfinite(msg->temperature))
        {
            return BT::NodeStatus::FAILURE;
        }

        double overheat_temp, recovery_temp;
        getInput("overheat_temp", overheat_temp);
        getInput("recovery_temp", recovery_temp);

        if (msg->temperature >= overheat_temp)
        {
            is_normal_ = false;
        }
        else if (msg->temperature <= recovery_temp)
        {
            is_normal_ = true;
        }

        return is_normal_ ? BT::NodeStatus::SUCCESS
                          : BT::NodeStatus::FAILURE;
    }

private:
    bool is_normal_;
};

과열 판정 온도 T_{\text{over}}와 복구 판정 온도 T_{\text{recover}} 사이의 히스테리시스 대역은 과열과 정상 상태 사이의 빈번한 전환을 방지한다. 온도가 T_{\text{over}}를 초과하면 과열 상태로 전환되고, T_{\text{recover}} 이하로 냉각되어야만 정상 상태로 복귀한다.

4. 다중 온도 센서 감시

로봇 시스템에는 복수의 온도 센서가 장착될 수 있다.

감시 대상토픽 이름 (예시)허용 범위
배터리/battery/temperature0~45°C
모터/motor/temperature-10~80°C
CPU/cpu/temperature0~90°C
환경/ambient/temperature-40~50°C
<BehaviorTree ID="ThermalSafety">
    <ReactiveSequence>
        <Condition ID="IsNotOverheated"
                   topic_name="/battery/temperature"
                   overheat_temp="45.0"
                   recovery_temp="38.0"/>
        <Condition ID="IsNotOverheated"
                   topic_name="/motor/temperature"
                   overheat_temp="80.0"
                   recovery_temp="65.0"/>
        <Action ID="ContinueOperation"/>
    </ReactiveSequence>
</BehaviorTree>

5. 설계 시 고려 사항

5.1 온도 센서의 지연

온도 변화는 열 전달 과정을 거쳐 센서에 도달하므로, 실제 온도 변화와 센서 측정값 사이에 시간 지연이 존재한다. 급격한 온도 상승(예: 단락)은 센서가 감지하기 전에 손상을 초래할 수 있으므로, 전류 감시 등 보완적 안전 메커니즘을 함께 운용하여야 한다.

5.2 운용 환경 온도의 영향

극한 환경(사막, 극지)에서는 환경 온도 자체가 구성 요소의 허용 범위를 초과할 수 있다. 환경 온도에 따라 임계값을 동적으로 조정하거나, 운용 불가 환경을 사전에 판정하는 조건 노드를 배치하여야 한다.

5.3 열 보호와 성능 저하의 균형

온도 이상 감지 시 즉시 정지하는 것이 항상 최선은 아니다. 임무 완수가 중요한 상황에서는 출력을 제한(throttling)하여 발열을 줄이면서 임무를 지속하는 점진적 대응이 적절할 수 있다. 행동 트리에서 온도 수준에 따라 다단계 행동을 선택하는 구조를 설계하는 것이 바람직하다.

6. 참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • ROS2 공식 문서. https://docs.ros.org/en/humble/
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

버전날짜변경 사항
v0.12026-04-04초안 작성