# ROS2: Node : 생명 주기 (Lifecycle)

ROS2에서는 Node(노드)라는 개념이 시스템의 구성 요소로서 중요한 역할을 한다. Node는 특정 작업을 수행하는 프로세스 단위로, 이들이 상호작용하며 로봇의 복잡한 기능을 구현한다. Node의 안정적인 운영과 관리는 시스템의 신뢰성과 직접적으로 연관되기 때문에, ROS2에서는 Node의 상태를 제어하고 관리할 수 있는 "생명 주기(Node Lifecycle)"라는 개념을 도입하였다.

### Node 생명 주기 상태 (Node Lifecycle States)

Node 생명 주기는 여러 가지 상태(State)로 구성되며, 각 상태는 Node가 수행할 수 있는 특정 작업과 관련이 있다. ROS2에서 정의된 주요 생명 주기 상태는 다음과 같다.

#### Unconfigured 상태

Node가 처음 생성되었을 때 기본적으로 진입하는 상태이다. 이 상태에서는 Node가 어떠한 작업도 수행하지 않으며, 외부 인터페이스도 활성화되지 않는다. 말 그대로 "미구성(Unconfigured)" 상태로, 아직 Node가 초기화되지 않았음을 의미한다.

#### Inactive 상태

Node가 초기화되어 필요할 경우 외부 인터페이스를 활성화할 수 있지만, 여전히 작업을 수행하지 않는 상태이다. 이 상태에서 Node는 필요한 준비 작업을 마치고, 사용자가 명시적으로 Node를 활성화할 때까지 대기한다. 이 상태에서의 Node는 구성을 완료하였지만, 실행을 위해 명시적인 "Activate" 명령을 기다리고 있는 상태이다.

#### Active 상태

Node가 실제 작업을 수행하는 상태이다. 이 상태에서는 외부 인터페이스가 완전히 활성화되며, Node는 주어진 목적에 따라 작업을 수행한다. ROS2에서는 이 상태를 운영 상태(Operation State)로 간주하며, Node가 실행 중인 동안 발생하는 모든 상호작용과 작업이 이 상태에서 이루어진다.

#### Finalized 상태

Node가 종료되는 과정에서 진입하는 상태이다. 이 상태에서는 Node가 더 이상 작업을 수행하지 않으며, 모든 자원이 해제되고 외부 인터페이스도 비활성화된다. 이 상태 이후에는 Node가 파괴되거나, 다시 초기화될 수 있다.

### 상태 전이 (State Transitions)

Node 생명 주기에서 중요한 개념은 상태 전이(State Transition)이다. 이는 Node가 한 상태에서 다른 상태로 이동하는 과정을 의미한다. 각 상태 전이에는 특정 조건과 이벤트가 필요하며, 이러한 전이 과정에서 Node는 필요한 작업을 수행하거나, 특정 조건을 만족시켜야 한다.

#### Unconfigured에서 Inactive로의 전이

이 전이는 Node가 초기화될 때 발생한다. Node 초기화 함수가 호출되면, 필요한 자원을 할당하고 초기 설정을 수행한 후 Inactive 상태로 진입한다. 이 과정에서는 설정 파일을 로드하거나, 하드웨어 인터페이스를 초기화하는 작업이 수행될 수 있다.

#### Inactive에서 Active로의 전이

Node가 작업을 수행할 준비가 되었을 때, Activate 명령을 통해 Inactive 상태에서 Active 상태로 전이한다. 이 전이 과정에서는 주로 타이머나 콜백 함수가 활성화되며, Node가 실제로 데이터를 처리하고 작업을 수행하게 된다.

#### Active에서 Inactive로의 전이

Node를 비활성화(Deactivate)할 때 발생하는 전이이다. 이 경우 Node는 더 이상 작업을 수행하지 않으며, 타이머와 같은 주기적인 작업이 중단된다. 이 상태로 전이하는 이유는 주로 시스템 리소스를 절약하거나, 다른 작업을 수행하기 위한 준비 단계로서 사용된다.

#### Inactive에서 Finalized로의 전이

Node가 종료될 때 발생하는 전이이다. 이 전이 과정에서는 Node가 사용하던 자원이 해제되고, 모든 외부 인터페이스가 비활성화된다. 이 상태 이후에는 Node를 다시 활성화할 수 없으며, 필요 시 새로운 Node를 생성해야 한다.

### Node 생명 주기 관리 (Node Lifecycle Management)

ROS2에서는 Node의 생명 주기를 효율적으로 관리할 수 있는 인터페이스와 도구를 제공한다. Node 생명 주기 관리 기능은 주로 고가용성 시스템이나 복잡한 로봇 시스템에서 안정성을 유지하기 위해 사용된다.

#### LifecycleNode 클래스

ROS2에서 Node 생명 주기를 지원하기 위해 제공되는 주요 클래스는 `rclcpp::LifecycleNode`이다. 이 클래스는 위에서 설명한 다양한 상태와 상태 전이를 지원하며, 사용자는 이를 통해 Node의 상태를 제어할 수 있다. 또한, 각 상태 전이에 대한 콜백 함수를 등록하여, 상태 전이 시 필요한 작업을 자동으로 수행할 수 있다.

#### 상태 전이 콜백

각 상태 전이 시점에 특정 작업을 수행하기 위해 상태 전이 콜백을 등록할 수 있다. 예를 들어, Node가 Unconfigured 상태에서 Inactive 상태로 전이될 때 하드웨어 장치를 초기화하거나, Active 상태에서 Inactive 상태로 전이될 때 데이터를 저장하는 등의 작업을 수행할 수 있다.

#### 외부 상태 제어

ROS2에서는 Node의 생명 주기를 외부에서 제어할 수 있는 기능도 제공한다. 이를 통해 다른 Node나 시스템 관리자에 의해 특정 Node의 상태를 모니터링하고, 필요 시 상태를 변경할 수 있다. 이는 주로 복잡한 시스템에서 중앙 집중식으로 Node를 관리할 때 유용하다.

***

관련 자료:

* ROS2 Official Documentation: <https://docs.ros.org/en/foxy/Concepts/About-Life-Cycle.html>
* ROS2 Design Documentation: <https://design.ros2.org/articles/node_lifecycle.html>
