# launch 파일 작성

ROS2에서 **launch 파일**은 노드 및 설정을 정의하고, 여러 노드를 동시에 시작하는 데 유용하다. ROS2 Humble부터는 `launch` 파일이 **Python**으로 작성되며, 이 파일에서 노드 실행, 파라미터 설정, 환경 변수 설정 등을 관리할 수 있다.

#### 기본 구조

ROS2의 `launch` 파일은 Python 스크립트 형태로 작성되며, `launch` 라이브러리를 사용해 노드를 정의하고 실행한다.

1. **라이브러리 가져오기**

   ROS2 `launch` 파일을 작성하려면 먼저 `launch`와 `launch_ros` 라이브러리를 가져온다.

   ```python
   from launch import LaunchDescription
   from launch.actions import DeclareLaunchArgument, ExecuteProcess
   from launch_ros.actions import Node
   ```
2. **LaunchDescription 정의**

   `LaunchDescription` 객체는 모든 노드와 설정을 포함하며, 이 객체를 통해 실행할 노드와 관련 설정을 정의한다.

#### 간단한 launch 파일 예제

아래는 로봇 시뮬레이션 노드와 `gz` 명령어로 가제보를 실행하는 예제이다.

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

def generate_launch_description():
    # ROS2 노드 정의
    robot_node = Node(
        package='my_robot_package',
        executable='robot_controller',
        name='robot_controller',
        output='screen'
    )

    # Gazebo 시뮬레이션 실행
    gazebo = ExecuteProcess(
        cmd=['gz', 'sim', '-v', '4', 'worlds/simple_world.sdf'],
        output='screen'
    )

    # LaunchDescription 객체에 노드와 시뮬레이션 프로세스 추가
    return LaunchDescription([
        robot_node,
        gazebo,
    ])
```

위 예제에서는 두 가지 주요 요소를 포함한다.

* **Node**: ROS2 노드를 정의하는데, `my_robot_package` 패키지에서 `robot_controller` 실행 파일을 실행한다.
* **ExecuteProcess**: `gz` 명령어로 가제보 시뮬레이션을 실행하며, `simple_world.sdf` 파일을 로드한다.

#### 매개변수 및 환경 변수 설정

노드를 실행할 때 매개변수와 환경 변수를 설정하여 유연하게 제어할 수 있다.

**매개변수 파일 설정**

매개변수를 YAML 파일로 정의하고, `Node`에 `parameters` 속성을 사용하여 매개변수 파일을 로드할 수 있다.

```python
robot_node = Node(
    package='my_robot_package',
    executable='robot_controller',
    name='robot_controller',
    parameters=['config/robot_params.yaml'],
    output='screen'
)
```

**환경 변수 설정**

ROS2 노드에서 환경 변수를 설정하려면 `env` 속성을 사용한다.

```python
robot_node = Node(
    package='my_robot_package',
    executable='robot_controller',
    name='robot_controller',
    output='screen',
    env={'GAZEBO_MODEL_PATH': '/path/to/models'}
)
```

#### Launch 파일 실행 방법

작성한 `launch` 파일을 실행하려면 다음 명령어를 사용한다.

```bash
ros2 launch my_launch_file.launch.py
```

이렇게 하면 정의된 노드와 가제보 시뮬레이션이 함께 실행된다.

### XML로 launch 파일 작성

ROS2에서 `launch` 파일은 기본적으로 Python으로 작성되는 것이 일반적이지만, XML로도 `launch` 파일을 작성할 수 있다. XML 형식의 `launch` 파일은 ROS1과 유사하지만, ROS2에서 XML 형식의 `launch` 파일을 사용할 때는 일부 구문이 다를 수 있다.

#### 기본 구조

XML 형식의 `launch` 파일은 `<launch>` 태그 안에 노드와 관련 설정을 포함하여 구성된다.

#### 간단한 XML launch 파일 예제

아래는 `my_robot_package`라는 패키지의 `robot_controller`라는 노드를 실행하는 XML 형식의 `launch` 파일 예제이다.

```xml
<launch>
    <!-- 노드 실행 -->
    <node pkg="my_robot_package" exec="robot_controller" name="robot_controller" output="screen">
        <!-- 매개변수 설정 -->
        <param name="use_sim_time" value="true"/>
    </node>
</launch>
```

위 파일은 ROS2에서 `my_robot_package` 패키지의 `robot_controller`라는 노드를 실행하고, 매개변수 `use_sim_time`을 `true`로 설정한다.

#### 가제보 (gz)와 함께 사용하는 XML launch 파일 예제

ROS2 Humble에서는 Gazebo가 `gz`로 변경되었기 때문에 `gz` 명령어를 사용하여 시뮬레이션을 실행할 수 있다. 아래는 `gz`와 함께 사용하는 XML `launch` 파일 예제이다.

```xml
<launch>
    <!-- Gazebo (gz) 시뮬레이션 실행 -->
    <execute cmd="gz sim -v 4 worlds/simple_world.sdf" output="screen"/>
    
    <!-- 로봇 제어 노드 실행 -->
    <node pkg="my_robot_package" exec="robot_controller" name="robot_controller" output="screen">
        <param name="use_sim_time" value="true"/>
    </node>
</launch>
```

위 예제에서는 `gz sim` 명령어를 사용해 Gazebo 시뮬레이션을 실행하고, `robot_controller` 노드를 함께 실행한다.

#### XML launch 파일에서 환경 변수 설정

환경 변수를 설정하여 노드가 특정 환경을 인식하도록 할 수 있다. `<env>` 태그를 사용하여 환경 변수를 지정한다.

```xml
<launch>
    <node pkg="my_robot_package" exec="robot_controller" name="robot_controller" output="screen">
        <env name="GAZEBO_MODEL_PATH" value="/path/to/models"/>
    </node>
</launch>
```

위 예제에서는 `GAZEBO_MODEL_PATH`라는 환경 변수를 설정하여 가제보 모델 파일의 경로를 지정한다.

#### XML launch 파일에서 Include 사용

다른 `launch` 파일을 포함할 때는 `<include>` 태그를 사용하여 구성할 수 있다. 예를 들어, 추가적인 노드 실행 설정을 포함하는 별도의 `launch` 파일이 있을 때 이를 포함하여 사용한다.

```xml
<launch>
    <!-- 다른 launch 파일 포함 -->
    <include file="$(find another_package)/launch/another_launch_file.launch.xml"/>

    <node pkg="my_robot_package" exec="robot_controller" name="robot_controller" output="screen">
        <param name="use_sim_time" value="true"/>
    </node>
</launch>
```

위 예제는 `another_package`의 `another_launch_file.launch.xml`을 포함하고, `robot_controller` 노드를 추가로 실행한다.

#### XML launch 파일 실행

XML 형식의 `launch` 파일을 실행하려면 다음과 같은 명령어를 사용한다.

```bash
ros2 launch my_launch_file.launch.xml
```

이 XML `launch` 파일을 사용하여 ROS2 노드와 `gz` 시뮬레이션을 함께 관리할 수 있다.
