# 동적 파라미터 재설정과 실시간 응답성

#### 개요

ROS2의 파라미터 서버는 노드의 동작을 제어하기 위해 사용자가 동적으로 파라미터를 설정하고, 그에 따른 노드의 동작 변화를 실시간으로 확인할 수 있도록 지원한다. 이 과정에서 노드가 처리하는 데이터를 기반으로 동적 파라미터를 즉시 재설정할 수 있어야 하며, 시스템의 응답성이 중요한 요소로 작용한다.

#### 파라미터의 동적 재설정

동적 파라미터는 시스템 실행 중에도 파라미터 값을 변경하여 노드의 동작을 즉시 수정할 수 있는 기능이다. 이때 노드는 파라미터 변경 이벤트를 수신하면 해당 값을 반영하여 새롭게 설정된 동작을 수행해야 한다. ROS2에서는 이러한 동적 파라미터 재설정을 지원하기 위해 `rcl_interfaces::msg::SetParametersResult` 메시지와 콜백을 활용한다.

동적 파라미터 재설정은 주로 실시간 시스템에서 매우 중요하다. 예를 들어, 로봇의 센서 데이터 처리 속도나 통신 빈도와 같은 요소들은 시스템의 상황에 따라 실시간으로 조정될 수 있어야 한다. 따라서 ROS2에서의 파라미터 설정 및 재설정은 이러한 실시간 응답성을 고려하여 설계되어야 한다.

#### 실시간 응답성의 중요성

실시간 응답성은 시스템이 동적 파라미터 설정을 빠르게 반영하여 새로운 설정 값에 따라 즉각적으로 동작을 수행할 수 있는 능력을 의미한다. 이를 위해서는 파라미터의 변경이 즉시 반영될 수 있도록 시스템의 각 부분이 동기화되어야 한다.

시스템의 각 노드는 수신한 새로운 파라미터 값을 반영하기 위한 적절한 메커니즘을 가져야 하며, 이는 특정 상태에서의 동작 전환이나 계산 주기를 변경하는 등 다양한 방식으로 나타날 수 있다.

파라미터 재설정 시, 각 노드는 `parameter_event` 토픽을 구독하여 변경된 파라미터 이벤트를 수신할 수 있다. 파라미터 변경 이벤트가 발생하면, 해당 이벤트에 대한 콜백을 통해 새로운 파라미터 값을 적용하고, 시스템의 동작을 조정할 수 있다.

#### 실시간 시스템에서의 파라미터 변경 예제

다음은 실시간 응답성을 고려한 파라미터 설정과 변경 예제이다. 여기서는 로봇의 센서 데이터 처리 주기를 실시간으로 조정하는 상황을 다룰 수 있다. 센서 데이터 처리 주기는 로봇의 주행 속도나 주변 환경에 따라 동적으로 변경될 수 있다.

```cpp
#include "rclcpp/rclcpp.hpp"

class DynamicParamNode : public rclcpp::Node {
public:
  DynamicParamNode() : Node("dynamic_param_node") {
    this->declare_parameter<double>("sensor_rate", 10.0);
    auto callback = [this](const std::vector<rclcpp::Parameter> &params) {
      for (const auto &param : params) {
        if (param.get_name() == "sensor_rate") {
          double new_rate = param.as_double();
          RCLCPP_INFO(this->get_logger(), "New sensor rate: %f", new_rate);
          // 새로운 센서 주기에 맞춰 노드의 동작을 변경
        }
      }
      return rcl_interfaces::msg::SetParametersResult{true};
    };
    this->add_on_set_parameters_callback(callback);
  }
};
```

이 예제에서, `sensor_rate`라는 파라미터가 동적으로 변경될 때 노드는 해당 파라미터 값에 맞춰 주기를 조정한다. 주기 조정은 실시간으로 이루어지며, 시스템의 성능에 따라 빠르게 반영된다.

#### 실시간 응답성을 위한 파라미터 처리 과정

파라미터의 동적 재설정 및 실시간 반영은 여러 단계로 이루어진다. 이 과정은 아래와 같다:

1. **파라미터 선언**: 노드가 초기화될 때 기본 파라미터 값이 선언된다.
2. **파라미터 변경 이벤트 발생**: `parameter_event` 토픽을 통해 파라미터 변경이 발생하면 시스템은 이를 감지한다.
3. **파라미터 값 검증**: 노드에서 새로운 파라미터 값을 검증하고, 시스템의 동작에 영향을 주는 값인지를 판단한다.
4. **파라미터 적용**: 새로운 파라미터 값이 시스템에 적용되고, 이에 따라 노드의 동작이 즉시 조정된다.

#### 수학적 모델

실시간 응답성을 평가하기 위해, 시스템의 처리 주기(즉, 센서 데이터 처리 주기)를 수학적으로 모델링할 수 있다. 처리 주기 $\mathbf{T}$는 시간에 따라 변화하는 값으로, 파라미터 재설정 시 새로운 주기 $\mathbf{T'}$로 업데이트된다.

$$
\mathbf{T'} = \mathbf{T} + \Delta t
$$

여기서 $\Delta t$는 파라미터 재설정에 따라 변경된 주기 차이이다. 실시간 시스템에서는 $\Delta t$의 크기가 작을수록 시스템의 응답성이 우수하다고 판단할 수 있다.

#### 실시간 응답성을 위한 시스템 구성

실시간 시스템에서의 파라미터 변경은 단순히 값의 변동뿐만 아니라, 그에 따른 시스템 전체의 동기화가 중요하다. 따라서 시스템은 각 노드 간의 파라미터 공유와 변경 이벤트에 대한 실시간 대응 메커니즘을 포함해야 한다.

파라미터 변경 이벤트는 주로 아래의 방식으로 처리된다:

{% @mermaid/diagram content="graph LR
A\[파라미터 변경 이벤트 발생] --> B{새로운 파라미터 값 검증}
B -->|유효한 값| C\[파라미터 적용 및 노드 동작 변경]
B -->|유효하지 않은 값| D\[이전 파라미터 유지]
C --> E\[노드 동작 조정 및 실시간 반영]
D --> E" %}

이 구조는 각 노드가 파라미터 변경 이벤트에 따라 실시간으로 새로운 파라미터 값을 검증하고, 적절히 반영하여 시스템의 동작을 실시간으로 조정할 수 있는 프로세스를 나타낸다.

#### 실시간 응답성을 위한 최적화 전략

실시간 시스템에서는 파라미터 변경에 따른 즉각적인 응답을 보장하기 위해 몇 가지 최적화 전략을 적용할 수 있다. 이러한 전략들은 파라미터 변경 이벤트가 발생한 이후 시스템의 대기 시간을 최소화하고, 새롭게 설정된 값이 신속하게 적용될 수 있도록 설계된다.

**1. 비동기 파라미터 처리**

비동기 처리 방식은 파라미터 변경 요청이 들어왔을 때, 시스템이 즉시 다른 작업을 중단하지 않고, 비동기적으로 파라미터를 처리하는 방식이다. 이렇게 하면, 시스템의 다른 작업이 지연되지 않으면서도 파라미터 변경 요청에 빠르게 대응할 수 있다. 특히, 멀티스레드 환경에서 이 방식은 매우 유용하다.

예를 들어, 센서 데이터 처리 주기를 실시간으로 조정해야 하는 로봇의 경우, 비동기 방식으로 파라미터 변경을 처리하여 센서 데이터가 중단되지 않도록 할 수 있다.

**2. QoS 정책 활용**

ROS2의 QoS(Quality of Service) 정책은 시스템의 신뢰성과 응답성을 높이기 위해 설계된 기능이다. QoS는 주로 메시지 전달에서 사용되지만, 파라미터 변경 처리에서도 중요한 역할을 할 수 있다. 특히, 파라미터 변경 이벤트가 일관되게 전달되도록 QoS 설정을 통해 신뢰성을 보장할 수 있다.

QoS 설정을 통해 파라미터 변경이 중단되지 않고 전달되며, 이로 인해 실시간 응답성을 유지할 수 있다. 예를 들어, "best effort" QoS 정책을 사용하여 파라미터 변경 이벤트를 전달하는 대신, "reliable" QoS 정책을 사용하면 파라미터 이벤트가 반드시 전달되도록 보장할 수 있다.

**3. 파라미터의 미리 선언된 범위 설정**

실시간 시스템에서 파라미터의 변경은 항상 유효한 값으로 이루어져야 한다. 따라서 미리 파라미터의 범위를 선언해 두면, 시스템은 유효하지 않은 값이 입력될 경우 이를 거부하고, 빠르게 원래의 상태로 복귀할 수 있다. 이를 통해 파라미터 값 검증에 소요되는 시간을 줄이고, 실시간 응답성을 더욱 향상시킬 수 있다.

이를 수학적으로 모델링하면, 파라미터 값 $\mathbf{P}$의 유효 범위를 $\mathbf{P}*{min} \leq \mathbf{P} \leq \mathbf{P}*{max}$로 제한할 수 있다.

$$
\mathbf{P}*{min} \leq \mathbf{P} \leq \mathbf{P}*{max}
$$

이 범위 내에서 파라미터 변경 요청이 들어오면 시스템은 즉시 해당 값을 반영하며, 범위 밖의 값에 대해서는 오류를 반환한다.

**4. 파라미터 변경 이벤트 처리 주기 조정**

실시간 응답성을 확보하기 위해 파라미터 변경 이벤트의 처리 주기를 최적화할 필요가 있다. 지나치게 빈번한 파라미터 변경 요청은 시스템의 성능에 부정적인 영향을 미칠 수 있으므로, 적절한 처리 주기를 설정하여 변경 이벤트를 처리하는 것이 중요하다.

처리 주기 $\mathbf{T}\_{proc}$는 다음과 같이 설정할 수 있다.

$$
\mathbf{T}*{proc} = \frac{1}{f*{param}}
$$

여기서 $f\_{param}$은 파라미터 변경 이벤트의 빈도를 나타내며, $T\_{proc}$는 해당 이벤트를 처리하는 주기를 의미한다. 이를 적절히 조정함으로써, 실시간 응답성을 유지하면서도 시스템의 부하를 최소화할 수 있다.

#### 실시간 파라미터 재설정 사례

실시간 파라미터 재설정의 구체적인 예로, 로봇의 움직임을 제어하는 노드에서 속도 파라미터를 실시간으로 변경하는 경우를 생각해 볼 수 있다. 아래 코드에서는 속도 파라미터 `velocity`가 실시간으로 변경되고, 그에 따라 로봇의 속도 제어가 즉각적으로 반영되는 것을 보여준다.

```cpp
#include "rclcpp/rclcpp.hpp"

class VelocityControllerNode : public rclcpp::Node {
public:
  VelocityControllerNode() : Node("velocity_controller") {
    this->declare_parameter<double>("velocity", 0.0);
    timer_ = this->create_wall_timer(
      500ms, std::bind(&VelocityControllerNode::control_loop, this)
    );
    
    auto callback = [this](const std::vector<rclcpp::Parameter> &params) {
      for (const auto &param : params) {
        if (param.get_name() == "velocity") {
          velocity_ = param.as_double();
          RCLCPP_INFO(this->get_logger(), "Velocity updated to: %f", velocity_);
        }
      }
      return rcl_interfaces::msg::SetParametersResult{true};
    };
    this->add_on_set_parameters_callback(callback);
  }

private:
  void control_loop() {
    // 현재 설정된 속도에 맞춰 로봇 제어
    RCLCPP_INFO(this->get_logger(), "Current velocity: %f", velocity_);
  }

  double velocity_;
  rclcpp::TimerBase::SharedPtr timer_;
};
```

위 예제에서는 `velocity` 파라미터가 실시간으로 업데이트되며, 로봇의 속도 제어 루프에서 이를 반영한다. 파라미터 변경이 즉시 반영되고, 로봇의 속도 제어가 실시간으로 변경될 수 있다.

#### 동적 파라미터 변경과 실시간 응답성의 상호작용

동적 파라미터 변경과 실시간 응답성은 상호작용을 통해 시스템의 유연성을 높인다. 이를 효과적으로 구현하기 위해서는 각 노드가 파라미터 변경 이벤트를 수신할 때마다 빠르게 검증하고 반영하는 과정이 필요하다. 이를 통해 시스템 전체의 성능을 향상시키고, 실시간 응답성을 보장할 수 있다.

ROS2에서의 실시간 파라미터 변경은 주로 다음과 같은 시나리오에서 자주 사용된다:

* **로봇의 센서 주기 변경**: 로봇이 이동하는 동안 주변 환경에 따라 센서 데이터의 주기를 동적으로 변경하여 처리 속도를 최적화할 수 있다.
* **제어 파라미터 수정**: 로봇의 모터 속도, 회전 속도 등 제어 파라미터를 실시간으로 수정하여 주행 성능을 조정할 수 있다.
* **네트워크 통신 설정 변경**: 네트워크 상태에 따라 통신 빈도나 QoS 설정을 동적으로 변경하여 안정적인 통신을 유지할 수 있다.

이와 같은 파라미터의 동적 변경은 실시간 시스템에서 매우 중요한 역할을 하며, 시스템의 성능과 효율성을 높이는 데 기여한다.
