1317.16 관리형 노드와 상태 전이 모델

1. 관리형 노드의 상태 기계

ROS2의 관리형 노드(Managed Node)는 REP-2002에서 정의된 표준 상태 기계를 따른다. PlanSys2의 각 핵심 노드는 rclcpp_lifecycle::LifecycleNode를 상속하여 이 상태 기계를 구현한다.

2. 주요 상태(Primary States)

2.1 Unconfigured

노드가 생성된 직후의 상태이다. 최소한의 초기화만 수행되며, 서비스와 토픽이 활성화되지 않은 상태이다.

2.2 Inactive

구성(configure)이 완료되어 모든 자원이 준비되었으나, 외부 요청을 처리하지 않는 상태이다. 서비스 서버가 생성되었지만 활성화되지 않았다.

2.3 Active

노드가 완전히 작동하는 상태이다. 모든 서비스, 액션, 토픽이 활성화되어 외부 요청을 처리한다.

2.4 Finalized

노드가 종료되어 더 이상 상태 전이가 불가능한 최종 상태이다.

3. 전이 콜백(Transition Callbacks)

각 상태 전이 시 호출되는 콜백 메서드:

class PlanSys2Node : public rclcpp_lifecycle::LifecycleNode {
    CallbackReturn on_configure(const rclcpp_lifecycle::State &) override {
        // 자원 할당, 파라미터 로드, 내부 초기화
        return CallbackReturn::SUCCESS;
    }
    
    CallbackReturn on_activate(const rclcpp_lifecycle::State &) override {
        // 서비스 활성화, 처리 시작
        return CallbackReturn::SUCCESS;
    }
    
    CallbackReturn on_deactivate(const rclcpp_lifecycle::State &) override {
        // 서비스 비활성화, 처리 중단 (자원은 유지)
        return CallbackReturn::SUCCESS;
    }
    
    CallbackReturn on_cleanup(const rclcpp_lifecycle::State &) override {
        // 자원 해제, Unconfigured로 복귀
        return CallbackReturn::SUCCESS;
    }
    
    CallbackReturn on_shutdown(const rclcpp_lifecycle::State &) override {
        // 노드 종료 처리
        return CallbackReturn::SUCCESS;
    }
    
    CallbackReturn on_error(const rclcpp_lifecycle::State &) override {
        // 오류 발생 시 복구 처리
        return CallbackReturn::SUCCESS;
    }
};

4. 상태 전이 다이어그램

┌─────────────┐  configure   ┌──────────┐  activate   ┌────────┐
│ Unconfigured│─────────────→│ Inactive │────────────→│ Active │
└──────┬──────┘              └─────┬────┘  deactivate  └───┬────┘
       │                          │  ←───────────────────┘ │
       │  cleanup                 │                         │
       │  ←───────────────────────┘                         │
       │                                                    │
       │  shutdown                 shutdown                 │  shutdown
       ▼──────────────────────────▼────────────────────────▼
                        ┌───────────┐
                        │ Finalized │
                        └───────────┘

5. 오류 상태 처리

전이 콜백이 CallbackReturn::FAILURE를 반환하면, 노드는 오류 처리(ErrorProcessing) 상태로 전환된다. on_error 콜백이 호출되며, 성공적으로 복구되면 Unconfigured 상태로 돌아간다.

CallbackReturn on_configure(const rclcpp_lifecycle::State &) override {
    try {
        loadDomainFile();
        return CallbackReturn::SUCCESS;
    } catch (const std::exception & e) {
        RCLCPP_ERROR(get_logger(), "Configuration failed: %s", e.what());
        return CallbackReturn::FAILURE;  // → on_error 호출
    }
}

6. PlanSys2에서의 라이프사이클 활용 이점

  1. 도메인 재로딩: Deactivate → Cleanup → Configure → Activate 순서로 도메인 파일을 교체할 수 있다.
  2. 오류 복구: 플래너 오류 시 Planner 노드만 재구성하여 복구할 수 있다.
  3. 모듈 독립 관리: 각 노드를 독립적으로 시작/정지할 수 있다.

7. 참고 문헌

  • Gonzalez, F., Martin, F., Matellán, V., & Rodriguez, F. J. (2021). “PlanSys2: A Planning System Framework for ROS2.” IEEE ICARSC.
  • REP-2002. “ROS2 Managed Nodes.” ROS Enhancement Proposals.