# ROS2에서의 Launch 시스템

ROS2 (Robot Operating System 2)의 Launch 시스템은 복잡한 로봇 시스템에서 다양한 노드를 일관되게 실행하고 관리하는 중요한 도구이다. Launch 시스템은 ROS2의 핵심 구성 요소로, 여러 노드 및 프로세스를 일관되게 설정, 시작, 모니터링, 종료할 수 있도록 설계되었다. 아래에서는 ROS2의 Launch 시스템에 대한 상세한 설명을 제공한다.

#### Launch 시스템의 개요

ROS2의 Launch 시스템은 ROS1에서 사용되었던 roslaunch의 발전된 버전이다. ROS2의 Launch 시스템은 노드의 생명 주기를 제어하고, 로봇 시스템의 초기화 및 실행에 필요한 모든 설정을 중앙에서 관리할 수 있도록 지원한다. 이 시스템은 XML과 Python 기반의 스크립트 언어를 통해 정의할 수 있으며, 사용자 정의가 매우 용이한다.

Launch 파일은 하나 이상의 노드, 파라미터, 환경 변수, 액션, 이벤트 핸들러 등을 정의하는 데 사용된다. 이러한 파일은 로봇 시스템의 복잡한 실행 환경을 명확하고 체계적으로 정의하는 데 필수적이다.

#### Launch 파일의 구조

Launch 파일은 ROS2에서 실행될 노드와 그에 수반되는 다양한 설정을 포함하는 스크립트이다. 이 파일은 Python 언어를 사용하여 작성되며, XML 형식도 사용할 수 있지만, Python 형식이 더 유연하고 기능이 풍부하여 널리 사용된다.

Launch 파일의 주요 구성 요소는 다음과 같다.

* **Node:** 노드는 실행될 각 ROS2 프로세스를 정의한다. 노드의 이름, 패키지, 실행 파일, 파라미터 등을 지정할 수 있다.
* **Parameter:** 각 노드에 전달될 설정 파라미터를 정의한다. 파라미터는 시스템의 동작을 변경할 수 있는 중요한 요소로, launch 파일에서 중앙 집중식으로 관리된다.
* **Environment Variable:** 환경 변수를 정의하여 실행 환경을 제어할 수 있다. 이는 노드가 실행되는 환경을 커스터마이즈하는 데 사용된다.
* **Action:** 액션은 비동기 작업을 처리하기 위해 사용되며, 특정 이벤트에 따라 노드의 상태를 변경하거나 특정 작업을 수행하는 데 사용된다.
* **Event Handler:** 이벤트 핸들러는 특정 이벤트(예: 노드의 종료, 실패 등)가 발생할 때 실행될 작업을 정의한다. 이를 통해 시스템의 안정성을 높이고 예외 상황에 적절히 대응할 수 있다.

#### Launch API

ROS2의 Launch API는 Python을 통해 Launch 파일을 프로그래밍 방식으로 생성하고 제어할 수 있는 기능을 제공한다. 이 API를 사용하면 복잡한 조건문, 반복문, 변수 사용 등을 통해 동적이고 유연한 Launch 파일을 작성할 수 있다.

* **launch.LaunchDescription:** 전체 Launch 파일을 나타내며, 여러 노드 및 액션을 포함할 수 있다.
* **launch.actions.Node:** 특정 노드를 정의하고 실행하는 데 사용된다.
* **launch.actions.DeclareLaunchArgument:** Launch 파일 내에서 인자를 선언하고, 실행 시 이 인자들을 사용자로부터 받을 수 있도록 설정한다.
* **launch.conditions:** 특정 조건이 만족될 때에만 특정 노드를 실행하거나 액션을 수행하도록 제어할 수 있다. 예를 들어, 특정 파라미터 값에 따라 다른 노드를 실행할 수 있다.
* **launch.substitutions:** 실행 중에 동적으로 값이 결정되는 변수를 정의할 수 있다. 예를 들어, 노드 이름에 타임스탬프를 추가하는 등의 작업이 가능한다.

#### Launch 시스템에서의 생명주기 관리

ROS2는 노드의 생명주기(Lifecycle)를 관리할 수 있는 기능을 제공한다. Launch 시스템을 사용하면 이러한 생명주기 관리가 더욱 체계적으로 이루어질 수 있다. 생명주기 관리란 노드의 상태를 초기화, 활성화, 비활성화, 종료 등의 단계로 구분하고, 각 단계에서의 동작을 명확히 정의하는 것을 의미한다.

* **LifecycleNode:** ROS2의 특정 노드는 생명주기 관리가 가능하도록 특별히 설계되었으며, Launch 시스템에서 이를 제어할 수 있다.
* **State Transitions:** 노드의 상태 전환을 명시적으로 트리거하거나, 특정 이벤트 발생 시 자동으로 전환되도록 설정할 수 있다.
* **Launch 이벤트와 상태 전환:** Launch 시스템을 통해 특정 조건에서 노드의 상태 전환을 유도할 수 있다. 예를 들어, 모든 의존 노드가 활성화된 후에 특정 노드를 활성화하는 등의 제어가 가능한다.

#### Launch 시스템의 확장성과 모듈화

ROS2의 Launch 시스템은 확장성과 모듈화를 염두에 두고 설계되었다. 이는 복잡한 로봇 시스템을 계층적으로 관리하고, 재사용 가능한 Launch 파일을 작성하는 데 매우 유용하다.

* **IncludeLaunchDescription:** 다른 Launch 파일을 포함하여, 재사용 가능한 서브 런치 파일을 구성할 수 있다. 이는 복잡한 시스템을 모듈화하고 관리하는 데 유용하다.
* **GroupAction:** 특정 노드나 액션 그룹을 정의하고, 공통의 환경 변수나 파라미터를 공유하도록 설정할 수 있다.
* **PushRosNamespace:** 노드들을 특정 네임스페이스 안에서 그룹화하여 충돌을 피하고, 시스템의 구조를 명확히 할 수 있다.

***

관련 자료:

* ROS2 Documentation: Launch (<https://docs.ros.org/en/rolling/Overview/Launch.html>)
* ROS2 Design: Launch System (<https://design.ros2.org/articles/roslaunch.html>)
* ROS2 Tutorials (<https://docs.ros.org/en/foxy/Tutorials.html>)
