# ROS2 Node의 ROS1 NodeHandle과 비교

#### ROS1의 NodeHandle 개념

ROS1에서는 `NodeHandle`이 매우 중요한 역할을 한다. `NodeHandle`은 ROS 시스템과 상호작용하는 대부분의 기능을 제공하는 객체로, 노드가 토픽을 게시하거나 구독하고, 서비스 서버를 생성하거나 호출하며, 파라미터 서버와 상호작용하는 등의 기능을 제공한다. 이를 통해 노드는 ROS 네임스페이스를 관리하고, ROS 리소스와의 연결을 유지한다. `NodeHandle`의 주요 기능은 ROS 시스템과의 연결을 관리하는 것이며, 이를 위해 `ros::init()`을 호출한 후 노드가 종료될 때까지 생명을 유지한다.

**NodeHandle의 네임스페이스 관리**

`NodeHandle`은 네임스페이스를 관리하는 기능을 제공한다. 이는 주로 두 가지 방식으로 사용된다. 첫째, NodeHandle 객체가 생성될 때 특정 네임스페이스를 명시적으로 지정할 수 있으며, 이는 해당 객체를 통해 생성된 모든 토픽, 서비스, 파라미터에 적용된다. 둘째, 부모 네임스페이스를 갖는 NodeHandle을 사용할 수 있으며, 이는 상위 네임스페이스로부터 네임스페이스를 상속받아 하위에 새로운 네임스페이스를 추가하는 방식으로 동작한다.

**NodeHandle의 리소스 생명주기 관리**

ROS1에서 `NodeHandle`은 ROS 리소스의 생명주기를 관리한다. 예를 들어, `NodeHandle`을 통해 생성된 모든 퍼블리셔, 서브스크라이버, 서비스는 `NodeHandle`이 소멸될 때 자동으로 정리된다. 이는 노드가 여러 리소스를 관리할 때 리소스 정리를 효율적으로 수행할 수 있게 한다. 그러나 `NodeHandle`의 생명주기와 노드의 생명주기가 직접 연결되므로, 노드 종료 시점까지 `NodeHandle`이 유지되어야 한다.

#### ROS2의 Node 개념

ROS2에서는 `NodeHandle` 개념이 사라지고, 대신 `Node` 객체 자체가 핵심 역할을 수행한다. 이는 ROS2의 주요 설계 철학 중 하나인 "구조의 단순화"와 "구성 요소 기반 설계"를 반영한 결과이다. ROS2의 `Node` 객체는 ROS1의 `NodeHandle`이 담당했던 기능을 대부분 흡수하여 직접 제공하며, 노드 자체의 생명주기 관리와 리소스 관리를 포함한다.

**Node 객체의 네임스페이스 관리**

ROS2의 `Node` 객체는 네임스페이스를 관리하는데, 이는 ROS1의 `NodeHandle`과 유사하지만 더 직관적이다. `Node`를 생성할 때 네임스페이스를 지정할 수 있으며, 이는 노드의 모든 인터페이스에 자동으로 적용된다. 또한, 네임스페이스는 노드의 이름과 결합되어 고유한 네임스페이스를 형성하며, 이는 각 노드의 독립성을 높이고, 시스템 구성 시의 유연성을 제공한다.

**리소스의 명시적 생명주기 관리**

ROS2에서는 `NodeHandle` 대신 `Node` 객체 자체가 리소스를 관리한다. 퍼블리셔, 서브스크라이버, 서비스 등의 ROS2 인터페이스는 `Node` 객체를 통해 직접 생성되고 관리되며, 이는 명시적인 생명주기 관리로 이어진다. `Node` 객체가 소멸될 때, 해당 객체를 통해 생성된 모든 리소스가 자동으로 정리된다. 이는 ROS1의 `NodeHandle`보다 더 명확하고, 리소스 관리가 용이해지는 장점이 있다.

#### 주요 차이점과 설계 철학

ROS1의 `NodeHandle`과 ROS2의 `Node`는 그 기능에서 일부 겹치지만, 두 시스템의 설계 철학과 목표는 다르다. ROS1에서는 `NodeHandle`이 중앙에서 모든 것을 관리하는 역할을 맡았지만, ROS2에서는 `Node` 객체 자체가 더 많은 책임을 갖고 있으며, 이는 ROS2의 모듈화 및 확장성을 강화한다.

또한, ROS2는 다중 스레드와 다중 노드 구성에서의 동시성을 보다 잘 지원하도록 설계되었다. 이러한 이유로, `Node` 객체는 동기화된 방식으로 동작하며, 이는 시스템 전반의 안정성을 높이는 데 기여한다. 이와 대조적으로, ROS1의 `NodeHandle`은 동시성 문제를 명시적으로 다루지 않으므로, 복잡한 시스템에서는 잠재적인 동시성 문제가 발생할 수 있었다.

***

관련 자료:

* ROS1 Documentation: <http://wiki.ros.org/roscpp/Overview/NodeHandles>
* ROS2 Documentation: <https://docs.ros.org/en/rolling/Concepts/About-ROS-2-Node.html>
* Programming Robots with ROS by Morgan Quigley, Brian Gerkey, William D. Smart
