ROS2에서 파라미터 서버는 노드 간에 파라미터를 관리하고 공유하는 중요한 역할을 한다. 파라미터 변경 이벤트를 처리하기 위해서는 노드가 파라미터 변경 사항을 감지하고 적절한 동작을 수행할 수 있어야 한다. ROS2에서는 이를 위해 콜백 메커니즘을 제공한다.

파라미터 이벤트 콜백

ROS2 노드에서 파라미터 변경을 감지하는 방법 중 하나는 파라미터 이벤트 콜백 함수를 설정하는 것이다. 이 콜백 함수는 파라미터가 변경될 때마다 호출되며, 노드는 이 콜백에서 원하는 동작을 수행할 수 있다.

콜백을 설정할 때 중요한 요소는 다음과 같다: - 콜백 함수는 변경된 파라미터의 이름과 그 값을 인자로 받는다. - 콜백 내부에서 필요한 검증과 처리를 수행해야 한다.

다음과 같이 콜백을 설정할 수 있다:

auto callback = [this](const rcl_interfaces::msg::ParameterEvent::SharedPtr event) -> void {
    for (auto & changed_parameter : event->changed_parameters) {
        if (changed_parameter.name == "target_velocity") {
            // 변경된 파라미터를 처리하는 로직
            target_velocity_ = changed_parameter.value.double_value;
        }
    }
};

파라미터 이벤트 콜백의 등록

이벤트 콜백을 설정하고 나면, 이를 노드에 등록해야 한다. ROS2는 add_on_set_parameters_callback 메서드를 통해 이를 처리할 수 있게 해 준다. 예를 들어, 특정 파라미터가 변경될 때만 동작하는 콜백을 등록할 수 있다.

this->add_on_set_parameters_callback(callback);

콜백이 등록되면 파라미터 변경 시 해당 콜백이 호출되어 필요한 동작을 수행하게 된다.

파라미터 유효성 검사

파라미터를 변경할 때는 그 값이 유효한지 확인해야 한다. 이를 위해 파라미터 변경 요청을 받았을 때 변경된 값을 미리 검증하는 메커니즘을 추가할 수 있다. 다음은 파라미터의 유효성을 검사하는 코드 예시이다:

rcl_interfaces::msg::SetParametersResult callback(const std::vector<rclcpp::Parameter> & parameters) {
    rcl_interfaces::msg::SetParametersResult result;
    result.successful = true;

    for (const auto & param : parameters) {
        if (param.get_name() == "target_velocity") {
            if (param.as_double() < 0.0) {
                result.successful = false;
                result.reason = "target_velocity must be greater than 0";
            }
        }
    }
    return result;
}

이 코드는 파라미터가 음수가 되는 것을 방지하며, 유효하지 않은 값이 설정되려 할 때 이를 차단한다.

파라미터 변경 이벤트와 QoS 설정

파라미터 이벤트는 노드 간의 통신에 의존하며, 이를 효과적으로 처리하기 위해 ROS2에서는 QoS (Quality of Service)를 설정할 수 있다. 파라미터 이벤트는 기본적으로 DDS (Data Distribution Service)를 통해 전달되며, 이를 처리하는 노드의 QoS 프로파일을 적절하게 설정해야 안정적인 통신이 가능한다.

특히 파라미터 변경 이벤트가 빈번하게 발생하는 시스템에서는 적절한 QoS 설정을 통해 네트워크 트래픽을 최적화하고, 파라미터 변경에 대한 이벤트 전달의 신뢰성을 보장할 수 있다. 다음은 파라미터 이벤트에 대해 QoS 설정을 적용하는 예시이다:

rclcpp::QoS qos_profile = rclcpp::QoS(rclcpp::KeepLast(10)).reliable().durability_volatile();
parameter_subscription_ = this->create_subscription<rcl_interfaces::msg::ParameterEvent>(
    "/parameter_events", qos_profile,
    std::bind(&MyNode::parameter_callback, this, std::placeholders::_1)
);

위 코드에서는 KeepLast(10)이라는 설정을 통해 최근 10개의 파라미터 변경 이벤트만 저장하고, 네트워크의 신뢰성 (reliable)과 내구성 (volatile)을 설정하여 트래픽을 관리한다.

파라미터 변경 시 동적 재구성

파라미터가 변경되었을 때 이를 동적으로 적용하는 것은 ROS2 시스템에서 매우 중요하다. 특히 실시간 시스템에서는 파라미터가 변경될 때 노드를 재시작하지 않고도 설정을 반영할 수 있어야 한다. 파라미터 콜백에서 바로 변경된 파라미터를 적용하는 방법을 사용할 수 있다.

파라미터 변경에 따른 동작을 즉각적으로 반영하기 위해서는 콜백 함수 내에서 변경된 값을 실시간으로 노드에 적용해야 한다. 예를 들어, 이동 속도와 같은 중요한 파라미터가 변경될 경우 이를 바로 로봇의 제어 시스템에 반영할 수 있다:

void parameter_callback(const rcl_interfaces::msg::ParameterEvent::SharedPtr event) {
    for (const auto & changed_param : event->changed_parameters) {
        if (changed_param.name == "target_velocity") {
            this->target_velocity_ = changed_param.value.double_value;
            // 로봇의 제어 시스템에 속도 업데이트 적용
            this->update_velocity(this->target_velocity_);
        }
    }
}

이와 같이 파라미터 변경 이벤트는 시스템의 동작을 동적으로 제어할 수 있도록 설정하는 중요한 기능이다.

파라미터 변경 이벤트의 성능 고려사항

파라미터 변경 이벤트 처리 시 성능도 중요한 요소 중 하나이다. 빈번하게 파라미터가 변경되거나 많은 노드에서 파라미터 변경을 동시에 요청할 경우, 시스템의 응답성과 처리 속도에 영향을 미칠 수 있다. 이를 방지하기 위해 다음과 같은 성능 최적화 방안을 고려할 수 있다:

  1. 변경 사항 필터링: 파라미터가 자주 변경될 때마다 모든 파라미터를 처리하는 대신, 실제로 시스템에 영향을 미치는 중요한 파라미터만 선택적으로 처리하는 방법을 사용할 수 있다.
  2. 비동기 처리: 파라미터 변경 이벤트를 비동기로 처리함으로써 시스템의 메인 스레드에서 부하를 줄이고, 동시에 여러 파라미터를 효율적으로 처리할 수 있다.