# ROS2 : Node

#### Node의 개념과 역할

ROS2(로봇 운영 체제 2, Robot Operating System 2)에서 "Node"는 로봇 소프트웨어의 기본적인 실행 단위이다. Node는 독립적으로 실행되는 프로그램으로, 각 Node는 특정한 작업을 수행하는 로직을 가지고 있다. ROS2 시스템에서는 다양한 Node가 상호작용하며 복잡한 로봇 시스템을 구현한다.

Node는 주로 센서 데이터 수집, 제어 명령 실행, 데이터 처리 등을 담당한다. 각 Node는 다른 Node들과 메시지를 주고받으며, ROS2의 통신 인프라를 통해 이 상호작용이 이루어진다. 이를 통해 분산 시스템의 형태로 로봇 애플리케이션이 구성된다.

#### Node의 구조와 구성 요소

Node는 크게 다음과 같은 요소들로 구성된다:

1. **ROS2 통신 인터페이스**:\
   Node는 ROS2 통신 인터페이스를 통해 다른 Node와 데이터를 주고받는다. 이 인터페이스는 주로 퍼블리셔(publisher), 서브스크라이버(subscriber), 서비스 서버(service server), 서비스 클라이언트(service client)로 구성된다. 퍼블리셔는 데이터를 송신하고, 서브스크라이버는 데이터를 수신한다. 서비스 서버는 클라이언트의 요청에 응답하는 역할을 하며, 서비스 클라이언트는 특정 작업을 요청하는 역할을 한다.
2. **콜백 함수**:\
   Node가 데이터를 수신하거나 요청을 받을 때 실행되는 함수이다. 콜백 함수는 특정 이벤트가 발생할 때 실행되며, 이를 통해 Node가 반응한다. 예를 들어, 새로운 센서 데이터가 들어왔을 때 이를 처리하는 로직이 콜백 함수로 작성될 수 있다.
3. **스핀 함수**:\
   ROS2 Node는 이벤트 기반 구조로 동작하며, 이를 관리하기 위해 스핀 함수가 사용된다. 스핀 함수는 Node가 종료될 때까지 계속해서 콜백 함수를 호출하며, 이를 통해 Node는 새로운 데이터나 요청에 지속적으로 응답할 수 있다.

#### Node의 생명주기

ROS2에서는 Node의 상태를 관리하기 위해 Node 생명주기(lifecycle)를 지원한다. Node 생명주기는 Node의 상태를 제어하고 관리하기 위한 표준화된 방법을 제공한다. Node는 다음과 같은 상태를 가질 수 있다:

1. **Unconfigured**:\
   Node가 초기화되었지만 아직 구성되지 않은 상태이다. 이 상태에서는 Node가 활성화되지 않으며, 주요 기능이 실행되지 않는다.
2. **Inactive**:\
   Node가 구성되었지만 활성화되지 않은 상태이다. 이 상태에서는 Node의 퍼블리셔와 서브스크라이버가 동작하지 않으며, 외부와의 통신이 제한된다.
3. **Active**:\
   Node가 완전히 활성화된 상태로, 퍼블리셔와 서브스크라이버를 포함한 모든 기능이 정상적으로 동작한다.
4. **Finalized**:\
   Node가 종료되는 상태로, 모든 리소스가 해제된다.

Node 생명주기는 특히 복잡한 로봇 시스템에서 유용하며, Node의 상태를 체계적으로 관리할 수 있게 해준다.

#### Node 간의 통신

Node 간의 통신은 ROS2의 핵심 기능 중 하나이다. ROS2는 분산된 시스템에서 여러 Node가 서로 효율적으로 통신할 수 있도록 다양한 통신 메커니즘을 제공한다:

1. **토픽(Topic)**:\
   Node 간 비동기적으로 데이터를 주고받는 통신 메커니즘이다. 퍼블리셔 Node는 특정 토픽으로 데이터를 송신하며, 서브스크라이버 Node는 해당 토픽을 구독하여 데이터를 수신한다. 이는 주로 센서 데이터나 상태 정보를 주고받을 때 사용된다.
2. **서비스(Service)**:\
   Node 간 동기적으로 통신하는 방법이다. 서비스 클라이언트 Node는 서비스 서버 Node에 요청(request)을 보내고, 서버는 이에 대한 응답(response)을 반환한다. 주로 명령을 실행하거나 특정 작업을 요청할 때 사용된다.
3. **액션(Action)**:\
   서비스와 유사하지만, 비동기적 작업을 처리할 때 사용된다. 액션은 요청과 동시에 작업 진행 상황을 피드백받을 수 있으며, 작업이 완료되면 최종 결과를 반환받는다.

이러한 통신 메커니즘을 통해 Node들은 협력하여 복잡한 작업을 수행할 수 있다.

#### Node의 구현과 개발

ROS2에서 Node를 구현하는 과정은 주로 프로그래밍 언어(C++ 또는 Python)를 사용하여 이루어진다. 개발자는 ROS2 API를 사용하여 퍼블리셔, 서브스크라이버, 서비스, 액션 등을 정의하고, 필요한 로직을 콜백 함수로 작성한다.

Node 구현의 일반적인 흐름은 다음과 같다:

1. **Node 클래스 정의**:\
   Node는 ROS2의 rclcpp(또는 rclpy) 라이브러리를 상속받아 클래스로 정의된다. 이 클래스 안에서 퍼블리셔, 서브스크라이버, 서비스, 액션 등을 설정한다.
2. **Node 초기화**:\
   main 함수에서 Node를 초기화하고, 스핀 함수를 호출하여 Node의 이벤트 루프를 시작한다.
3. **콜백 함수 작성**:\
   각 통신 메커니즘에 대한 콜백 함수를 작성하여 데이터를 처리하거나 요청에 응답하는 로직을 구현한다.
4. **빌드 및 실행**:\
   CMakeLists.txt 파일과 패키지 설정 파일을 작성한 후, colcon 빌드 시스템을 사용하여 Node를 빌드하고 실행한다.

이와 같은 과정으로 개발자는 다양한 기능을 가진 ROS2 Node를 구현할 수 있다.

***

관련 자료:

* ROS2 Documentation: <https://docs.ros.org/en/foxy/index.html>
* Programming Robots with ROS2 by Morgan Quigley, Brian Gerkey, and William D. Smart
