1261.44 노드 생명주기(Lifecycle)의 기초
1. 관리형 노드의 개념과 도입 배경
ROS2에서 노드(Node)는 분산 로봇 시스템의 기본 연산 단위이다. 초기 ROS1 환경에서는 노드가 실행되면 즉시 모든 기능이 활성화되어, 노드 간 초기화 순서 제어나 상태 전이에 대한 체계적 관리가 불가능하였다. 이러한 한계를 극복하기 위하여 ROS2에서는 관리형 노드(Managed Node), 즉 생명주기 노드(Lifecycle Node)라는 개념을 도입하였다.
관리형 노드의 설계는 ROS2 설계 문서 중 하나인 “Managed Nodes” 제안서(REP-2002)에 기초한다. 이 제안서는 노드가 명확하게 정의된 상태(State)를 따르도록 하여, 시스템 전체의 예측 가능성과 결정론적 행동(deterministic behavior)을 보장하는 것을 목표로 한다. 관리형 노드는 특히 복수의 노드가 협력하여 동작하는 로봇 시스템에서, 각 구성요소의 초기화 완료 여부를 확인하고 동기화된 방식으로 시스템을 가동하거나 정지시키는 데 핵심적 역할을 수행한다.
2. 생명주기 상태 모델
ROS2 생명주기 노드는 유한 상태 머신(Finite State Machine, FSM)으로 모델링된다. 이 상태 모델은 주 상태(Primary State)와 전이 상태(Transition State)로 구분된다.
2.1 주 상태
주 상태는 노드가 안정적으로 머무를 수 있는 상태를 의미하며, 다음의 네 가지로 정의된다.
| 주 상태 | 설명 |
|---|---|
| Unconfigured | 노드가 생성된 직후의 초기 상태이다. 어떠한 자원도 할당되지 않은 상태이다. |
| Inactive | 구성(Configuration)이 완료되었으나 실행이 중지된 상태이다. 토픽 발행, 서비스 응답 등의 연산이 수행되지 않는다. |
| Active | 노드가 정상적으로 동작하며 모든 기능을 수행하는 상태이다. |
| Finalized | 노드가 종료되어 더 이상 어떠한 전이도 불가능한 최종 상태이다. |
2.2 전이 상태
전이 상태는 하나의 주 상태에서 다른 주 상태로 이동하는 과정에서 일시적으로 거치는 상태이다. 각 전이 상태에서는 사용자가 정의한 콜백 함수가 실행된다.
| 전이 상태 | 시작 상태 | 목표 상태 | 설명 |
|---|---|---|---|
| Configuring | Unconfigured | Inactive | 노드 구성을 수행한다. 파라미터 로드, 자원 할당 등이 이루어진다. |
| CleaningUp | Inactive | Unconfigured | 구성된 자원을 해제하고 초기 상태로 복귀한다. |
| Activating | Inactive | Active | 노드를 활성 상태로 전환한다. |
| Deactivating | Active | Inactive | 노드의 실행을 중지하고 비활성 상태로 전환한다. |
| ShuttingDown | Unconfigured/Inactive/Active | Finalized | 노드를 종료한다. |
| ErrorProcessing | 임의 | Unconfigured 또는 Finalized | 오류 발생 시 복구를 시도하거나 종료한다. |
3. 상태 전이 다이어그램
생명주기 노드의 상태 전이는 다음과 같은 흐름을 따른다.
[Unconfigured] --(configure)--> [Configuring] --> [Inactive]
[Inactive] --(activate)--> [Activating] --> [Active]
[Active] --(deactivate)--> [Deactivating] --> [Inactive]
[Inactive] --(cleanup)--> [CleaningUp] --> [Unconfigured]
[Unconfigured/Inactive/Active] --(shutdown)--> [ShuttingDown] --> [Finalized]
각 전이는 외부 명령 또는 내부 트리거에 의해 발생하며, 전이 콜백의 반환값에 따라 성공(SUCCESS) 또는 실패(FAILURE)가 결정된다. 전이가 실패하면 오류 처리 상태(ErrorProcessing)로 진입하며, 오류 처리 콜백의 결과에 따라 Unconfigured 상태로 복구되거나 Finalized 상태로 종료된다.
4. 전이 콜백 함수
생명주기 노드를 구현할 때, 개발자는 각 전이에 대응하는 콜백 함수를 정의한다. ROS2의 rclcpp_lifecycle 라이브러리에서 제공하는 주요 콜백 함수는 다음과 같다.
| 콜백 함수 | 대응 전이 | 역할 |
|---|---|---|
on_configure() | Configuring | 파라미터 읽기, 발행자·구독자 생성, 메모리 할당 등 |
on_activate() | Activating | 타이머 시작, 통신 활성화 등 |
on_deactivate() | Deactivating | 타이머 중지, 통신 비활성화 등 |
on_cleanup() | CleaningUp | 할당된 자원 해제, 초기 상태 복원 |
on_shutdown() | ShuttingDown | 최종 자원 해제 및 종료 처리 |
on_error() | ErrorProcessing | 오류 복구 로직 수행 |
각 콜백 함수는 CallbackReturn 열거형 값을 반환하며, SUCCESS를 반환하면 목표 상태로 전이가 완료되고, FAILURE 또는 ERROR를 반환하면 오류 처리 경로로 진입한다.
5. rclcpp_lifecycle 라이브러리의 구조
C++ 환경에서 생명주기 노드는 rclcpp_lifecycle::LifecycleNode 클래스를 상속하여 구현한다. 이 클래스는 일반 rclcpp::Node 클래스의 기능을 확장하며, 다음과 같은 핵심 요소를 제공한다.
#include "rclcpp_lifecycle/lifecycle_node.hpp"
class MyLifecycleNode : public rclcpp_lifecycle::LifecycleNode
{
public:
MyLifecycleNode(const std::string & node_name)
: rclcpp_lifecycle::LifecycleNode(node_name) {}
CallbackReturn on_configure(const rclcpp_lifecycle::State &)
{
// 파라미터 로드, 발행자 생성 등
publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
return CallbackReturn::SUCCESS;
}
CallbackReturn on_activate(const rclcpp_lifecycle::State &)
{
// 타이머 활성화, 통신 시작
return CallbackReturn::SUCCESS;
}
CallbackReturn on_deactivate(const rclcpp_lifecycle::State &)
{
// 통신 중지
return CallbackReturn::SUCCESS;
}
CallbackReturn on_cleanup(const rclcpp_lifecycle::State &)
{
// 자원 해제
publisher_.reset();
return CallbackReturn::SUCCESS;
}
CallbackReturn on_shutdown(const rclcpp_lifecycle::State &)
{
// 최종 정리
return CallbackReturn::SUCCESS;
}
private:
rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::String>::SharedPtr publisher_;
};
위 코드에서 LifecyclePublisher는 일반 발행자와 달리 노드의 상태에 따라 메시지 발행 여부가 자동으로 제어된다. Inactive 상태에서는 발행 호출이 무시되며, Active 상태에서만 실제 메시지가 전송된다.
6. 생명주기 노드의 외부 제어
생명주기 노드의 상태 전이는 외부에서 서비스 호출을 통해 제어할 수 있다. 각 생명주기 노드는 생성 시 다음의 서비스들을 자동으로 등록한다.
| 서비스 이름 | 기능 |
|---|---|
~/change_state | 지정된 전이를 요청한다. |
~/get_state | 현재 상태를 조회한다. |
~/get_available_transitions | 현재 상태에서 가능한 전이 목록을 반환한다. |
~/get_transition_graph | 전체 상태 전이 그래프를 반환한다. |
명령행 도구를 통해서도 제어가 가능하며, ros2 lifecycle 명령을 사용한다.
ros2 lifecycle set /my_lifecycle_node configure
ros2 lifecycle set /my_lifecycle_node activate
ros2 lifecycle get /my_lifecycle_node
ros2 lifecycle list /my_lifecycle_node
7. 생명주기 노드와 일반 노드의 비교
| 비교 항목 | 일반 노드 (rclcpp::Node) | 생명주기 노드 (LifecycleNode) |
|---|---|---|
| 상태 관리 | 없음 | 명시적 상태 머신 |
| 초기화 제어 | 생성자에서 즉시 실행 | on_configure, on_activate 단계적 수행 |
| 발행자 동작 | 생성 즉시 발행 가능 | Active 상태에서만 발행 |
| 외부 제어 | 불가 | 서비스를 통한 상태 전이 제어 |
| 오류 복구 | 미지원 | on_error 콜백을 통한 체계적 복구 |
| 시스템 동기화 | 별도 구현 필요 | 상태 기반 동기화 자연스럽게 지원 |
8. 생명주기 노드의 적용 의의
생명주기 노드는 로봇 시스템의 신뢰성(reliability)과 결정론적 행동(deterministic behavior)을 확보하기 위한 핵심 메커니즘이다. 여러 노드로 구성된 복잡한 로봇 시스템에서, 특정 노드의 초기화가 완료된 이후에만 의존 노드를 활성화하는 순서 제어가 가능해진다. 또한 오류 발생 시 개별 노드 단위의 복구 또는 재시작이 체계적으로 수행될 수 있다.
Nav2(Navigation2), MoveIt2 등 ROS2 기반 주요 프레임워크에서는 생명주기 노드를 표준적으로 채택하여 시스템 관리자(Lifecycle Manager)를 통한 중앙 집중식 노드 상태 관리를 구현하고 있다. 이는 런칭(Launch) 시스템과의 통합을 통해 전체 로봇 소프트웨어 스택의 안정적 기동과 종료를 보장한다.
9. 참고 문헌
- Open Robotics, “ROS 2 Design: Managed Nodes,” ROS 2 Design Documentation, 2017.
- S. Macenski, T. Foote, B. Gerkey, C. Lalancette, W. Woodall, “Robot Operating System 2: Design, architecture, and uses in the wild,” Science Robotics, vol. 7, no. 66, eabm6074, 2022.
- Open Robotics, “rclcpp_lifecycle API Documentation,” ROS 2 Humble Hawksbill, 2022.
- Open Robotics, “Managed Nodes (Lifecycle),” ROS 2 Documentation, https://docs.ros.org/en/rolling/Concepts/About-Managed-Nodes.html.