# ROS 2에서의 네임스페이스 (Namespace in ROS 2)

***

#### 네임스페이스의 개념

네임스페이스(namespace)는 ROS 2에서의 자원(리소스) 분리와 관리를 위한 중요한 개념이다. ROS 2는 분산된 시스템에서 여러 Node가 상호작용하며 동작하는 것을 기본으로 하고 있으며, 이때 각 Node와 관련된 자원들이 고유하게 관리될 수 있도록 네임스페이스를 도입한다. 네임스페이스는 간단히 말해 이름 충돌을 방지하고, 자원의 구조화를 가능하게 하는 방법이다. 이를 통해 여러 Node나 토픽(topic)이 동일한 이름을 가지더라도 다른 네임스페이스에 속하게 하여 충돌 없이 사용할 수 있다.

ROS 2의 네임스페이스는 리눅스의 파일 시스템에서 디렉터리 구조와 유사하게 설계되었다. 예를 들어, `/namespace1/topicA`와 `/namespace2/topicA`는 각각 다른 네임스페이스에 속해 동일한 `topicA`라는 이름을 가지지만, 서로 독립적으로 동작할 수 있다.

#### 네임스페이스의 구성 및 구문

네임스페이스는 ROS 2의 여러 요소와 관련된다. 가장 기본적인 구성 요소로는 Node, 토픽, 서비스 등이 있으며, 각각의 요소는 네임스페이스에 속할 수 있다. 네임스페이스는 슬래시(`/`)를 사용하여 계층적으로 구성된다. 예를 들어, `robot1/sensor/temperature`라는 토픽은 `robot1`이라는 최상위 네임스페이스 아래에 있으며, 그 하위에 `sensor` 네임스페이스가 있고, 마지막으로 `temperature`라는 토픽이 위치하게 된다.

네임스페이스를 지정하는 방법은 여러 가지가 있다. 가장 일반적인 방법은 Node를 시작할 때 네임스페이스를 설정하는 것이다. 예를 들어, `ros2 run` 명령어를 사용할 때 `--ros-args -r __ns:=/namespace_name` 플래그를 추가함으로써 네임스페이스를 지정할 수 있다.

```bash
ros2 run my_package my_node --ros-args -r __ns:=/my_namespace
```

위의 명령어는 `my_node`를 `/my_namespace`라는 네임스페이스 하에 시작하게 한다. 또한, 런치 파일(launch file)을 통해 네임스페이스를 정의할 수도 있으며, 이 방법은 더 복잡한 시스템에서 유용하게 사용된다.

#### 네임스페이스의 상속 및 계층 구조

네임스페이스는 상속과 계층 구조를 갖는다. 상속이란, 하위 Node 또는 리소스가 상위 네임스페이스를 이어받는 것을 의미한다. 예를 들어, 네임스페이스 `/robot1/sensor` 아래에 있는 모든 토픽이나 서비스는 기본적으로 `/robot1/sensor` 네임스페이스를 상속받아 생성된다.

네임스페이스는 계층적으로 설계될 수 있으며, 이러한 계층 구조는 큰 시스템을 모듈화하여 관리하기 쉽게 만들어준다. 예를 들어, 로봇 시스템에서 `robot1`이라는 네임스페이스를 만들고, 그 하위에 `sensor`, `actuator` 등의 네임스페이스를 두어 센서와 액추에이터 관련 자원을 구분하여 관리할 수 있다. 이러한 계층적 구조는 로봇의 구성 요소가 많을수록 더욱 중요해지며, 각각의 요소가 독립적으로 개발되고 테스트될 수 있도록 도와준다.

또한, 네임스페이스를 사용하여 동적 환경에서 Node를 효과적으로 관리할 수 있다. 예를 들어, 여러 대의 로봇이 동일한 네임스페이스 구조를 가지지만 서로 다른 루트 네임스페이스(예: `robot1`, `robot2`)를 가짐으로써, 동일한 소프트웨어 아키텍처를 다수의 로봇에 적용할 수 있다.

#### 런치 파일에서의 네임스페이스 활용

ROS 2의 런치 파일에서는 네임스페이스를 보다 체계적으로 활용할 수 있다. 런치 파일은 여러 Node와 그 구성 요소들을 한 번에 시작할 수 있는 강력한 도구인데, 여기서 네임스페이스를 사용하면 특정 그룹의 Node나 리소스를 쉽게 관리할 수 있다.

런치 파일에서 네임스페이스를 설정하는 방법은 다음과 같다:

```python
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='my_package',
            executable='my_node',
            namespace='my_namespace',
            name='my_node_name',
            output='screen',
        ),
    ])
```

위의 예시에서는 `my_namespace`라는 네임스페이스 하에 `my_node`라는 Node를 시작한다. 이 방법은 여러 Node를 포함하는 복잡한 시스템에서 네임스페이스를 체계적으로 관리할 수 있도록 돕는다.

#### 네임스페이스와 Node 간의 관계

네임스페이스는 Node와 긴밀하게 연관되어 있다. 각 Node는 고유한 네임스페이스를 가질 수 있으며, 이는 Node 간의 자원 충돌을 방지하는 데 중요한 역할을 한다. 또한, Node가 네임스페이스 내에서 생성되는 모든 자원(토픽, 서비스, 액션 등)은 해당 네임스페이스를 자동으로 상속받는다. 이는 네임스페이스가 없는 경우에 비해 시스템을 더 구조적으로 만들고, 복잡한 시스템에서의 유지보수를 용이하게 한다.

Node는 자신만의 네임스페이스를 가질 수도 있지만, 런치 파일이나 명령줄 옵션을 통해 상위 네임스페이스를 상속받을 수도 있다. 예를 들어, 여러 Node가 동일한 로봇에 속한다면, 이들 모두 `robot1`이라는 네임스페이스를 공유할 수 있다. 이 경우, 모든 토픽과 서비스는 기본적으로 `/robot1` 네임스페이스 하에 생성된다.

***

관련 자료:

* Open Robotics, ROS 2 Documentation.
* Morgan Quigley, Brian Gerkey, William D. Smart, Programming Robots with ROS: A Practical Introduction to the Robot Operating System.
