# ROS2의 Launch 시스템: ROS1과의 비교

#### ROS1과 ROS2의 런치 시스템 개요

ROS1과 ROS2 모두 분산 시스템에서 노드(node)를 실행하고 관리하기 위한 런치(launch) 도구를 제공한다. ROS1에서는 주로 `roslaunch`가 사용되며, ROS2에서는 `ros2 launch` 명령어가 사용된다. 두 시스템의 런치 도구는 기본적인 목적은 같지만, 여러 가지 중요한 차이점이 존재한다. 이 차이점은 ROS2가 ROS1의 한계를 극복하고 현대적인 로봇 시스템의 요구사항을 충족하기 위해 설계되었음을 반영한다.

#### 런치 파일의 정의와 형식

**ROS1의 런치 파일**

ROS1의 런치 파일은 XML 형식으로 작성되며, 로봇 애플리케이션에서 여러 노드를 동시에 실행하기 위한 설정을 정의한다. 이러한 XML 기반의 파일은 상대적으로 직관적이지만, 복잡한 로직을 구현하기에는 한계가 있다. 예를 들어, 조건부 실행이나 반복 루프를 사용하는 것은 매우 제한적이다. 대신 이러한 기능은 대부분 별도의 스크립트를 통해 구현해야 하였다.

**ROS2의 런치 파일**

ROS2에서는 런치 파일이 Python을 기반으로 작성된다. Python 기반의 런치 파일은 XML보다 훨씬 유연하고 강력한 기능을 제공한다. 예를 들어, 복잡한 조건부 로직, 반복문, 변수 할당 등을 런치 파일 내에서 직접 구현할 수 있다. 이러한 기능은 런치 파일의 재사용성을 높이고, 복잡한 시스템에서의 노드 관리와 실행을 보다 유연하게 한다.

#### 런치 파일의 구성 요소 및 기능 비교

**ROS1 런치 파일의 주요 요소**

ROS1의 런치 파일에는 주로 노드 실행(`<node>`), 파라미터 설정(`set param`), 외부 파일 포함(`include`), 그룹 설정(`<group>`) 등의 요소가 포함된다. 이들은 시스템 내에서 노드를 실행하고, 파라미터를 설정하며, 필요에 따라 다른 런치 파일을 포함하는 등의 역할을 한다. 하지만 이러한 요소들은 고정된 형식으로 사용되며, 상황에 따라 동적으로 변화시키기에는 한계가 있다.

**ROS2 런치 파일의 주요 요소**

ROS2의 런치 파일은 ROS1에서 제공하는 모든 기능을 포함하면서도, Python의 특성을 활용하여 보다 동적인 구성이 가능한다. 주요 요소로는 `Node`, `Parameter`, `IncludeLaunchDescription`, `LaunchConfiguration` 등이 있다. 특히 `LaunchConfiguration`은 런치 시점에 설정할 수 있는 변수를 정의하고, 이 변수를 기반으로 런치 파일의 동작을 결정할 수 있다. 또한, 조건부 실행을 위해 `IfCondition`, `UnlessCondition` 등을 사용하여 런치 파일 내에서 논리적인 분기 처리가 가능한다.

#### 파라미터 처리와 런치 시나리오 비교

**ROS1의 파라미터 처리**

ROS1에서는 런치 파일을 통해 파라미터 서버에 파라미터를 설정하고, 노드가 이를 참조하는 방식으로 동작한다. 파라미터는 주로 런치 파일 내에서 정적으로 정의되며, 런치 파일 간의 파라미터 전달은 복잡하게 처리된다.

**ROS2의 파라미터 처리**

ROS2에서는 파라미터를 런치 파일 내에서 동적으로 정의하고 전달하는 것이 가능하며, 각 노드에 파라미터를 직접적으로 전달하는 방식이 채택되었다. 이러한 방식은 파라미터 관리의 유연성을 높이며, 노드 간의 파라미터 전달 및 관리가 더욱 직관적이고 효율적으로 이루어진다.

#### 네임스페이스 및 스코핑 기능의 차이

**ROS1의 네임스페이스**

ROS1에서는 네임스페이스를 사용하여 노드나 토픽의 이름을 그룹화할 수 있다. 이는 `<group>` 태그와 `ns` 속성을 통해 설정되며, 네임스페이스는 고정된 문자열로 정의된다. 런치 파일 간의 네임스페이스 충돌을 방지하기 위해 신중하게 네임스페이스를 설계해야 하였다.

**ROS2의 네임스페이스**

ROS2의 네임스페이스 기능은 ROS1과 유사하지만, 런치 파일 내에서 동적으로 설정할 수 있다. 예를 들어, `LaunchConfiguration`을 사용하여 네임스페이스를 런치 시점에 정의할 수 있으며, 이를 통해 런치 파일의 재사용성과 유연성을 높일 수 있다. 또한, `PushRosNamespace`와 같은 유틸리티를 통해 런치 파일 내에서 네임스페이스를 보다 쉽게 관리할 수 있다.

#### 런치 파일 재사용성 및 확장성

**ROS1에서의 재사용성**

ROS1에서는 런치 파일의 재사용성을 위해 `<include>` 태그를 사용하여 다른 런치 파일을 포함할 수 있다. 그러나 포함된 런치 파일의 파라미터나 설정을 변경하는 것은 제한적이었다. 복잡한 시스템에서는 중복된 코드가 많아지기 쉬웠다.

**ROS2에서의 재사용성**

ROS2에서는 런치 파일의 재사용성을 극대화하기 위해 `IncludeLaunchDescription`을 사용하여 다른 런치 파일을 포함하고, 이를 Python 스크립트 내에서 동적으로 설정할 수 있다. 런치 파일 간의 변수 전달, 조건부 설정, 반복문 등을 통해 코드를 효율적으로 관리할 수 있으며, 재사용성을 크게 향상시킬 수 있다.

#### 멀티 노드 런치의 유연성 비교

**ROS1의 멀티 노드 런치**

ROS1에서 멀티 노드를 런치하는 과정은 정적으로 설정된 런치 파일을 통해 이루어진다. 각 노드는 고정된 파라미터와 설정에 따라 실행되며, 런치 후에 이를 변경하기는 어렵다.

**ROS2의 멀티 노드 런치**

ROS2에서는 멀티 노드 런치가 더욱 유연해졌다. 각 노드를 개별적으로 제어하고, 런치 시점에 파라미터나 설정을 동적으로 변경할 수 있다. 이는 복잡한 시스템에서 노드 간의 상호작용을 더 효율적으로 관리할 수 있게 하며, 시스템의 확장성과 유연성을 높인다.

***

관련 자료:

* ROS 2 Documentation: <https://docs.ros.org/en/foxy/index.html>
* ROS 1 Wiki: <http://wiki.ros.org/roslaunch>
* ROS 2 launch system, ROSCon 2019, <https://vimeo.com/395157339>
