1. 노드 시작 기본 개념

ROS2에서 노드는 독립적인 실행 단위로, 각각의 노드는 퍼블리셔, 서브스크라이버, 서비스, 액션 등의 역할을 담당한다. ROS2의 launch 파일은 노드 시작을 자동화하고, 여러 노드를 동시에 실행하거나 서로 다른 파라미터를 전달할 수 있는 편리한 방법을 제공한다.

노드 실행을 위한 launch 파일의 기본 구조는 다음과 같다:

<launch>
    <node
        name="노드_이름"
        pkg="패키지_이름"
        exec="실행파일_이름"
        output="screen">
    </node>
</launch>

2. 파라미터 전달

노드에 파라미터를 전달하기 위해서는 launch 파일에서 param 태그를 사용하여 노드 실행 시 필요한 파라미터를 정의할 수 있다. ROS2의 파라미터는 노드의 동작을 동적으로 설정하고 조정할 수 있는 중요한 수단이다.

2.1. 정적 파라미터 설정

정적 파라미터는 노드가 시작될 때 한 번 설정되며, 실행 중에는 변경되지 않는다. 이러한 파라미터는 launch 파일 내에서 param 태그로 정의할 수 있다. 예시:

<launch>
    <node
        name="노드_이름"
        pkg="패키지_이름"
        exec="실행파일_이름"
        output="screen">
        <param name="파라미터_이름" value="값" />
    </node>
</launch>

이 방식으로 설정된 파라미터는 노드가 실행되는 동안 유지되며, 프로그램이 종료될 때까지 동일한 값을 갖는다.

2.2. 동적 파라미터 전달

동적 파라미터는 노드 실행 중에도 변경될 수 있다. 이를 통해 런타임 중에도 노드의 동작을 조정할 수 있다. ROS2는 rclcpp::ParameterEvent를 사용하여 이러한 동적 파라미터 변경을 처리하며, 노드는 특정 이벤트가 발생할 때 파라미터를 업데이트할 수 있다.

노드의 동적 파라미터는 다음과 같이 설정할 수 있다:

<launch>
    <node
        name="노드_이름"
        pkg="패키지_이름"
        exec="실행파일_이름"
        output="screen">
        <param name="파라미터_이름" value="값" />
    </node>
</launch>

또한, 노드에서 동적으로 파라미터를 받아들이기 위해서는 set_parameters_callback 함수를 사용하여 파라미터 변경을 처리해야 한다.

this->set_parameters_callback([this](const std::vector<rclcpp::Parameter> & parameters) {
    for (const auto & parameter : parameters) {
        if (parameter.get_name() == "파라미터_이름") {
            // 파라미터 변경 처리 로직
        }
    }
});

2.3. 파라미터 파일 사용

파라미터를 파일로 관리할 수도 있다. ROS2는 YAML 파일 형식을 사용하여 여러 파라미터를 한꺼번에 정의하고, 이 파일을 launch 파일에서 불러와 사용할 수 있다. 예시 YAML 파일은 다음과 같다:

노드_이름:
    ros__parameters:
        파라미터_이름1: 값1
        파라미터_이름2: 값2

YAML 파일을 사용하는 launch 파일은 다음과 같다:

<launch>
    <node
        name="노드_이름"
        pkg="패키지_이름"
        exec="실행파일_이름"
        output="screen">
        <param file="파라미터파일.yaml" />
    </node>
</launch>

이 방식은 여러 노드가 동일한 파라미터 파일을 공유해야 할 때 유용하며, 각 노드의 파라미터 설정을 한 번에 관리할 수 있는 장점을 제공한다.

3. 런타임 파라미터 수정

실시간으로 파라미터를 수정하려면 ros2 param 명령을 사용하여 변경할 수 있다. 예를 들어, 실행 중인 노드의 특정 파라미터를 수정하려면 다음과 같은 명령을 입력한다:

ros2 param set /노드_이름 파라미터_이름 새_값

이 명령은 노드가 실행 중일 때 해당 파라미터 값을 즉시 변경하며, 노드에서 설정된 파라미터 콜백 함수를 통해 그에 맞는 처리를 수행할 수 있다.

4. launch 파일에서 파라미터 관련 동작 관리

launch 파일에서 파라미터의 유효성 검증이나 조건부 실행 등의 동작을 추가로 설정할 수 있다. 예를 들어, 특정 조건에 따라 노드를 실행할지 말지를 결정하는 구조를 launch 파일에 추가할 수 있다. 이는 복잡한 시스템을 구성할 때 매우 유용하며, 시스템의 유연성을 높여준다.

5. 파라미터와 런치 파일에서의 조건부 실행

파라미터를 이용하여 특정 조건에 따라 노드의 실행을 제어할 수 있다. launch 파일에서는 다양한 조건문을 활용해 파라미터 값에 따라 노드를 실행하거나 특정 동작을 수행하도록 설정할 수 있다.

5.1. 조건부 실행 예제

다음은 파라미터 값을 기준으로 노드의 실행 여부를 결정하는 간단한 예제다:

<launch>
    <arg name="use_node" default_value="true" />
    <node
        if="$(arg use_node)"
        name="노드_이름"
        pkg="패키지_이름"
        exec="실행파일_이름"
        output="screen">
    </node>
</launch>

위 예제에서는 use_node라는 인자를 통해 노드의 실행 여부를 제어할 수 있다. launch 파일을 실행할 때, use_node 인자의 값을 true 또는 false로 설정하여 해당 노드를 실행할지 말지를 결정할 수 있다.

5.2. 파라미터 값에 따른 실행 조건

특정 파라미터 값에 따라 실행 조건을 다르게 설정할 수 있다. 예를 들어, launch 파일에서 파라미터 값을 기준으로 노드의 실행 여부를 제어하는 방식은 다음과 같다:

<launch>
    <node
        name="노드_이름"
        pkg="패키지_이름"
        exec="실행파일_이름"
        output="screen">
        <param name="파라미터_이름" value="1" />
        <node_if value="$(eval 파라미터_이름 == 1)">
            <!-- 파라미터 값이 1일 때만 실행 -->
        </node_if>
    </node>
</launch>

이 예제는 노드의 파라미터가 특정 값일 때만 실행하는 조건부 논리를 적용한다. 이를 통해 노드의 실행을 더 세밀하게 제어할 수 있으며, 복잡한 시스템에서도 유용하다.

6. 파라미터 설정을 위한 런치 옵션 활용

ROS2에서는 파라미터를 launch 파일에 인자로 전달하여 다양한 설정을 미리 정의할 수 있다. 예를 들어, 특정 값에 따라 다른 파라미터를 적용하거나, 파라미터를 사용자 정의 인자로 설정하여 launch 파일을 더욱 유연하게 만들 수 있다.

6.1. 런치 파일 인자 설정 예시

다음은 launch 파일에서 인자를 통해 파라미터 값을 설정하는 예시다:

<launch>
    <arg name="파라미터_이름" default_value="5" />
    <node
        name="노드_이름"
        pkg="패키지_이름"
        exec="실행파일_이름"
        output="screen">
        <param name="파라미터_이름" value="$(arg 파라미터_이름)" />
    </node>
</launch>

이 예제에서는 파라미터_이름이라는 인자를 통해 노드가 시작될 때 파라미터 값을 지정할 수 있다. launch 파일 실행 시 인자의 값을 전달하여, 노드가 사용하는 파라미터 값을 동적으로 설정할 수 있게 된다.

7. 파라미터 유효성 검증

launch 파일에서 파라미터를 설정할 때, 입력된 파라미터가 유효한 값인지 검증하는 것이 필요할 수 있다. 이를 위해 launch 파일 내에서 파라미터의 값 범위를 지정하거나, 특정 값에 대한 예외 처리를 설정할 수 있다.

7.1. 파라미터 유효성 검증 예시

파라미터의 값이 지정된 범위를 벗어났을 때 노드를 실행하지 않도록 설정할 수 있다:

<launch>
    <arg name="파라미터_이름" default_value="5" />
    <node
        name="노드_이름"
        pkg="패키지_이름"
        exec="실행파일_이름"
        output="screen">
        <param name="파라미터_이름" value="$(arg 파라미터_이름)" />
        <node_if value="$(eval 파라미터_이름 >= 1 and 파라미터_이름 <= 10)">
            <!-- 파라미터 값이 1과 10 사이일 때만 실행 -->
        </node_if>
    </node>
</launch>

이 구조는 파라미터가 유효한 값일 때에만 노드를 실행할 수 있게 해주며, 잘못된 값이 입력되었을 때 시스템이 오작동하지 않도록 예방할 수 있다.

8. 파라미터 파일을 통한 복잡한 설정 관리

ROS2에서는 복잡한 시스템 구성을 관리하기 위해 파라미터 파일을 사용하여 다양한 설정을 중앙에서 관리할 수 있다. 파라미터 파일은 YAML 형식으로 작성되며, 여러 노드에 공통적인 설정이나 각각의 노드에 필요한 고유한 설정을 명확하게 구분할 수 있다.

8.1. YAML 파라미터 파일의 구조

파라미터 파일은 노드 이름을 키로 하여 해당 노드가 사용할 파라미터들을 정의한다. 기본 구조는 다음과 같다:

노드_이름:
  ros__parameters:
    파라미터_이름1: 값1
    파라미터_이름2: 값2

이 예시는 특정 노드가 두 개의 파라미터를 사용할 수 있도록 설정한 YAML 파일이다. 각 파라미터는 ros__parameters 섹션 아래에 위치하며, 해당 노드의 설정을 관리한다.

8.2. 파라미터 파일의 활용

launch 파일에서 이 YAML 파일을 불러와 노드에 파라미터를 적용하는 방법은 다음과 같다:

<launch>
    <node
        name="노드_이름"
        pkg="패키지_이름"
        exec="실행파일_이름"
        output="screen">
        <param file="path/to/파라미터파일.yaml" />
    </node>
</launch>

이렇게 하면, 노드가 시작될 때 path/to/파라미터파일.yaml 경로에 있는 YAML 파일을 참조하여 파라미터가 자동으로 설정된다. 이를 통해 복잡한 시스템에서도 중앙 관리 방식으로 파라미터 설정을 용이하게 할 수 있다.

8.3. 다중 노드 파라미터 관리

YAML 파일은 하나 이상의 노드에 대한 설정을 한꺼번에 관리할 수 있다. 예를 들어, 여러 노드가 존재할 때 각 노드의 파라미터를 다음과 같이 정의할 수 있다:

노드_이름1:
  ros__parameters:
    파라미터_이름1: 값1
    파라미터_이름2: 값2

노드_이름2:
  ros__parameters:
    파라미터_이름1: 값3
    파라미터_이름2: 값4

이 방식은 여러 노드가 같은 파라미터를 공유하거나, 노드마다 다른 파라미터를 적용해야 할 때 유용하다. launch 파일에서 이 YAML 파일을 불러와서 노드에 필요한 파라미터를 한 번에 설정할 수 있다.

9. 동적 파라미터 재구성

ROS2는 런타임 중에도 파라미터 값을 동적으로 재구성할 수 있는 기능을 제공한다. 이는 시스템이 동작 중일 때 환경 변화나 요구 사항에 맞춰 파라미터를 수정하여 노드의 동작을 조정하는 데 유용하다.

9.1. 동적 파라미터 변경

노드가 실행 중일 때, ros2 param 명령어를 사용하여 파라미터를 수정할 수 있다. 예를 들어, 노드의 특정 파라미터를 실시간으로 변경하려면 다음과 같은 명령어를 사용할 수 있다:

ros2 param set /노드_이름 파라미터_이름 새_값

이 명령어는 노드가 실행되는 동안 파라미터_이름의 값을 새_값으로 즉시 변경한다. 이를 통해 시스템의 동작을 실시간으로 조정할 수 있으며, 이 과정은 ROS2 노드가 설정한 파라미터 콜백을 통해 처리된다.

9.2. 파라미터 변경 이벤트 처리

파라미터 변경 이벤트는 노드 내부에서 콜백 함수로 처리된다. 이를 위해 set_parameters_callback 함수를 사용하여 파라미터 변경 시 발생하는 이벤트를 처리할 수 있다. 다음은 파라미터 이벤트 처리의 예시다:

this->set_parameters_callback([this](const std::vector<rclcpp::Parameter> & parameters) {
    for (const auto & parameter : parameters) {
        if (parameter.get_name() == "파라미터_이름") {
            // 파라미터 변경에 대한 처리 로직
        }
    }
});

이 코드는 파라미터가 변경될 때마다 해당 이벤트를 감지하고, 노드의 동작을 수정하는 데 사용된다. 특히 실시간 시스템에서는 파라미터 변경을 통해 노드의 동작을 즉각적으로 조정할 수 있어 매우 유용하다.