# ROS2 : Node : 아키텍처

#### Node 개요

ROS2에서 "Node(노드)"는 독립적으로 실행되는 최소 단위의 프로세스를 의미하며, ROS2의 분산 시스템을 구성하는 중요한 구성 요소이다. Node는 각각의 독립적인 실행 환경을 가지고 있으며, 서로 메시지를 주고받으면서 협력적으로 작업을 수행한다. 이러한 Node는 다양한 로봇 기능을 모듈화하고, 각 기능을 별도의 Node로 분리하여 시스템의 유연성을 높인다.

#### Node의 기본 구조

ROS2 Node는 기본적으로 `rclcpp::Node` 또는 `rclpy.Node` 클래스를 기반으로 생성된다. 이 클래스들은 ROS2에서 제공하는 C++ 및 Python API로, 각 Node가 통신을 하기 위한 기본적인 인터페이스를 제공한다. Node의 기본적인 구조는 다음과 같다:

* **Node 초기화 및 종료**: ROS2 Node는 시스템 리소스 관리와 네트워크 통신을 위해 Node의 생성과 종료 시점에서 초기화와 종료 단계를 거친다. 이는 `rclcpp::init()`와 `rclcpp::shutdown()`을 통해 이루어지며, 이 과정에서 ROS2 네트워크의 다른 Node들과의 통신 채널이 열리고 닫힌다.
* **Node 생성**: Node 생성 시, Node 이름을 부여하고, 고유한 네임스페이스를 설정할 수 있다. 이는 ROS2 네트워크 내에서 Node를 식별하고, Node 간의 이름 충돌을 방지하는 데 중요한 역할을 한다.

#### Node의 주요 구성 요소

Node는 여러 구성 요소를 포함하며, 이를 통해 다양한 기능을 수행한다. 주요 구성 요소로는 퍼블리셔, 서브스크라이버, 서비스 서버, 서비스 클라이언트, 액션 서버, 액션 클라이언트가 있다.

* **퍼블리셔(Publisher)**: Node는 퍼블리셔를 통해 특정 토픽에 메시지를 발행(publish)한다. 퍼블리셔는 `rclcpp::Publisher` 클래스를 통해 구현되며, 주로 센서 데이터나 상태 정보를 다른 Node에 전달할 때 사용된다.
* **서브스크라이버(Subscriber)**: 퍼블리셔가 발행한 메시지를 수신하는 역할을 한다. 서브스크라이버는 `rclcpp::Subscription` 클래스를 통해 구현되며, 주로 제어 명령이나 피드백을 받기 위해 사용된다.
* **서비스 서버(Service Server)**: Node는 서비스 서버를 통해 요청-응답 형태의 통신을 수행할 수 있다. 이는 `rclcpp::Service` 클래스를 통해 구현되며, 예를 들어, 특정 명령을 실행하거나 로봇의 현재 상태를 요청하는 데 사용된다.
* **서비스 클라이언트(Service Client)**: 서비스 서버와 통신하기 위해 사용된다. 이는 `rclcpp::Client` 클래스를 통해 구현되며, 주로 요청을 보내고 응답을 기다리는 방식으로 동작한다.
* **액션 서버(Action Server)와 액션 클라이언트(Action Client)**: 복잡한 작업이나 비동기 작업을 수행하기 위해 액션 서버와 클라이언트를 사용한다. 이는 긴 시간이 걸리는 작업을 시작하고, 진행 상태를 모니터링하며, 완료 여부를 확인할 수 있게 한다. `rclcpp_action::Server`와 `rclcpp_action::Client` 클래스를 통해 구현된다.

#### Node 간 통신 메커니즘

Node는 상호작용을 통해 데이터를 교환하며, 이는 다양한 통신 메커니즘에 의해 지원된다.

* **토픽 기반 통신**: 토픽은 퍼블리셔와 서브스크라이버 간의 비동기 메시지 전달을 위한 통신 채널이다. Node들은 토픽을 통해 데이터를 주고받으며, 이는 ROS2의 기본적인 통신 모델 중 하나이다. 토픽의 이름, 메시지 타입, QoS 설정 등을 통해 통신을 구성할 수 있다.
* **서비스 기반 통신**: 서비스는 요청과 응답의 형태로 동기적으로 통신을 수행하는 메커니즘이다. 이는 주로 특정 작업을 요청하고 그에 대한 결과를 즉각적으로 받아야 할 때 사용된다.
* **액션 기반 통신**: 액션은 장시간 수행되는 작업에 적합한 통신 모델이다. 액션을 통해 작업의 시작, 중간 상태 업데이트, 결과 수신 등을 비동기적으로 처리할 수 있다.

#### QoS (Quality of Service) 설정

ROS2에서는 QoS 설정을 통해 메시지 전달의 신뢰성, 대기 시간, 버퍼 크기 등 다양한 통신 품질을 조절할 수 있다. QoS 프로파일은 네 가지 주요 설정 요소로 구성된다:

* **신뢰성(Reliability)**: 메시지가 손실 없이 전달되도록 하는 설정이다. "Reliable" 모드에서는 모든 메시지가 보장되며, "Best Effort" 모드에서는 네트워크 상태에 따라 메시지 손실이 발생할 수 있다.
* **내구성(Durability)**: 메시지가 지속적으로 유지되는지를 결정한다. "Transient Local" 모드는 새로운 구독자가 이전에 발행된 메시지를 수신할 수 있도록 하는 반면, "Volatile" 모드는 현재 활성 상태에서만 메시지가 전달된다.
* **히스토리(History)**: 버퍼에 유지되는 메시지의 수를 설정한다. "Keep Last" 모드는 최신 n개의 메시지를 유지하며, "Keep All" 모드는 가능한 모든 메시지를 유지하려 시도한다.
* **데드라인(Deadline)**: 메시지가 지정된 시간 간격 내에 반드시 전달되어야 하는지 여부를 설정한다.

#### Node의 라이프사이클

ROS2는 Node의 상태를 관리하기 위해 라이프사이클을 지원한다. 이는 Node의 상태를 명확하게 정의하고, 각 상태에서의 동작을 제어할 수 있게 한다.

* **Unconfigured**: 초기화가 완료되었지만 아직 활성화되지 않은 상태이다.
* **Inactive**: Node가 구성되었으나 활성화되지 않은 상태로, 퍼블리셔와 서브스크라이버가 동작하지 않는다.
* **Active**: Node가 완전히 활성화되어 모든 기능을 수행할 준비가 된 상태이다.
* **Finalized**: Node가 종료된 상태로, 더 이상 어떤 작업도 수행하지 않는다.

라이프사이클 관리는 Node의 안전한 상태 전환과 예측 가능한 동작을 보장한다.

***

관련 자료:

1. ROS 2 Concepts, ROS 2 Documentation, <https://docs.ros.org/en/foxy/Concepts.html>
2. ROS2 Node, ROS 2 Design, <https://design.ros2.org/articles/node_lifecycle.html>
3. D. Thomas et al., ROS 2: Towards a Platform-Independent Robotics Framework, in International Conference on Robotics and Automation (ICRA), 2014.
