파라미터의 개념

ROS2에서는 노드가 실행 중일 때 특정 값을 동적으로 변경할 수 있도록 파라미터라는 개념을 도입하였다. 파라미터는 노드의 동작에 영향을 미치는 값으로, 시스템의 다양한 환경 설정 및 동작을 조절하는데 사용된다. 노드마다 고유의 파라미터가 설정될 수 있으며, 이를 통해 시스템의 유연한 구성이 가능한다.

파라미터 설정 방법

파라미터는 노드 내에서 정의되고, 노드의 생명주기 동안 변경될 수 있다. 파라미터는 주로 다음과 같은 데이터 타입을 지원한다: - int: 정수형 파라미터 - double: 실수형 파라미터 - bool: 논리형 파라미터 - string: 문자열 파라미터 - array: 배열 형태의 파라미터

파라미터를 정의하는 코드는 rclcpp::Node 클래스를 통해 설정할 수 있다. 아래는 기본적인 파라미터 설정 예시이다:

this->declare_parameter<int>("param_name", default_value);

위 코드는 param_name이라는 이름의 파라미터를 선언하고, default_value로 초기화한다. 이후 이 파라미터는 동적으로 변경이 가능하며, 노드 실행 중에 접근할 수 있다.

동적 재구성

동적 재구성(Dynamic Reconfigure)은 노드 실행 중에 파라미터 값을 변경할 수 있는 기능을 제공한다. 이를 통해 시스템을 재시작하지 않고도, 설정을 변경하고 시스템의 동작을 조정할 수 있다.

파라미터 값 접근

파라미터에 접근하고 값을 변경하는 방법은 get_parameterset_parameter 함수를 사용한다.

int param_value;
this->get_parameter("param_name", param_value);

위 코드는 param_name 파라미터의 현재 값을 읽어와 param_value에 저장하는 예시이다. 값을 설정하는 방법은 다음과 같다:

this->set_parameter(rclcpp::Parameter("param_name", new_value));

위 코드는 param_name 파라미터의 값을 new_value로 변경한다.

파라미터 이벤트와 콜백 처리

동적 재구성의 핵심은 파라미터 변경 이벤트에 대한 콜백 처리이다. ROS2에서는 파라미터 변경 시 이를 감지하고 처리할 수 있는 콜백 함수를 제공한다.

파라미터 변경 콜백을 등록하는 방법은 다음과 같다:

this->add_on_set_parameters_callback(
  [this](const std::vector<rclcpp::Parameter> & parameters) {
    for (const auto & param : parameters) {
      if (param.get_name() == "param_name") {
        // 새로운 값에 따른 로직 처리
      }
    }
    return rcl_interfaces::msg::SetParametersResult();
  });

이 코드는 특정 파라미터가 변경되었을 때의 처리를 위한 콜백 함수이다. 사용자가 노드의 파라미터를 변경하면, 이 콜백 함수가 호출되어 새로운 파라미터 값을 기반으로 동작을 조정할 수 있다.

파라미터 동기화 및 다중 노드 처리

여러 노드 간의 파라미터 동기화는 ROS2의 파라미터 서버를 통해 이루어진다. 각 노드가 파라미터 변경 사항을 수신하고 이를 반영할 수 있도록 동기화 메커니즘을 제공하며, 다중 노드 간의 협업 시 유용하다.

파라미터 서버와 파라미터 동기화

파라미터 서버는 ROS2 시스템에서 각 노드가 사용하는 파라미터를 저장하고 관리하는 중앙 역할을 한다. 이를 통해 여러 노드 간 파라미터 값을 공유하거나 동기화할 수 있다. 파라미터 서버는 ROS2의 네임스페이스 구조를 기반으로 작동하며, 각 노드는 고유한 네임스페이스를 통해 파라미터에 접근하거나 수정할 수 있다.

파라미터의 네임스페이스

각 파라미터는 고유한 네임스페이스를 갖는다. 예를 들어, /robot/controller/gain이라는 파라미터는 /robot이라는 네임스페이스 하에 controller라는 하위 네임스페이스를 갖는다. 이를 통해 복잡한 로봇 시스템에서도 파라미터를 체계적으로 관리할 수 있다.

파라미터 네임스페이스는 주로 대규모 시스템에서 사용된다. 예를 들어, 동일한 파라미터 이름을 가진 여러 노드가 있을 경우, 각 노드가 해당 파라미터를 충돌 없이 사용할 수 있도록 네임스페이스를 이용하여 구분할 수 있다.

파라미터 동기화

파라미터 동기화는 여러 노드가 동일한 파라미터 값을 사용할 때 유용하다. 예를 들어, 로봇의 컨트롤러와 센서 시스템이 동일한 gain 값을 공유해야 한다고 가정하면, 파라미터 서버에서 gain 값을 설정하고 각 노드는 이를 자동으로 동기화하여 사용할 수 있다.

다음과 같은 과정을 통해 파라미터 동기화가 이루어진다:

  1. 파라미터 등록: 각 노드는 파라미터 서버에 자신이 사용하는 파라미터를 등록한다.
  2. 파라미터 변경 감지: 파라미터가 변경되면 해당 정보를 수신한 노드가 변경 사항을 반영한다.
  3. 파라미터 업데이트: 모든 관련 노드가 변경된 파라미터 값을 사용하여 동작을 조정한다.

이 과정은 ROS2의 네임스페이스와 파라미터 서버를 통해 투명하게 처리된다.

파라미터 변경 이벤트 처리

파라미터 변경 이벤트는 노드의 중요한 상태나 설정 값이 변경될 때 발생한다. ROS2는 이를 효과적으로 처리할 수 있는 메커니즘을 제공한다. 예를 들어, 로봇의 속도 제어를 위한 파라미터가 변경되면, 해당 변경 사항을 감지하고 실시간으로 제어 시스템에 반영할 수 있다.

파라미터 변경 이벤트를 처리하는 방식은 다음과 같다:

  1. 파라미터 변경 콜백을 설정한다.
  2. 파라미터 변경 요청이 들어오면 콜백이 호출된다.
  3. 변경된 파라미터 값을 기반으로 시스템 동작을 즉시 조정한다.

이러한 콜백 메커니즘은 특히 실시간 시스템에서 유용하며, 동적 파라미터 변경이 필요한 상황에서 중요한 역할을 한다.

동적 파라미터 재설정

ROS2에서는 실행 중인 노드의 파라미터를 재설정하는 기능을 지원한다. 이 기능은 시스템의 동작 환경이 변경되거나 실시간으로 파라미터를 조정해야 할 때 매우 유용하다. 동적 파라미터 재설정은 주로 다음과 같은 상황에서 사용된다:

동적 파라미터 재설정은 다음과 같이 구현할 수 있다:

  1. 노드에서 set_parameter를 호출하여 파라미터 값을 변경한다.
  2. 변경된 파라미터 값을 노드의 상태에 반영한다.
  3. 시스템의 동작을 즉시 조정하여 변경된 파라미터 값에 맞게 동작을 수행한다.

파라미터 재설정은 노드의 라이프사이클에 큰 영향을 주지 않으며, 시스템을 중단하지 않고도 즉시 반영될 수 있다.