# 사용자 정의 파라미터 적용 사례

#### 1. 사용자 정의 파라미터 개요

ROS2에서는 노드를 생성할 때 파라미터를 통해 다양한 설정을 동적으로 변경할 수 있다. 기본적인 파라미터 외에도 사용자 정의 파라미터를 추가하여 노드의 동작을 제어하거나 설정을 변경할 수 있다. 이러한 사용자 정의 파라미터는 개발자가 특정 로봇이나 시스템에 맞는 유연한 구성을 가능하게 한다.

#### 2. 사용자 정의 파라미터 선언

사용자 정의 파라미터를 선언할 때는 노드를 생성할 때 `declare_parameter` 함수를 사용하여 설정한다. 예를 들어, 로봇의 속도를 조정하는 파라미터를 선언하려면 다음과 같이 작성할 수 있다:

```cpp
this->declare_parameter<double>("robot_speed", 1.0);
```

여기서 `robot_speed`는 사용자 정의 파라미터의 이름이며, 기본값으로 `1.0`을 지정한다.

#### 3. 파라미터의 데이터 타입

파라미터는 다양한 데이터 타입을 가질 수 있으며, 아래와 같은 데이터 타입을 지원한다:

* 정수형 (integer)
* 부동 소수점 (float)
* 문자열 (string)
* 불리언 (boolean)
* 리스트 (array)

파라미터 타입을 명시하지 않으면 ROS2가 자동으로 타입을 추론하지만, 명시적으로 타입을 정의하는 것이 더 좋다. 예를 들어, 로봇의 이동 방향을 문자열로 선언하려면 다음과 같다:

```cpp
this->declare_parameter<std::string>("direction", "forward");
```

#### 4. 파라미터 가져오기

파라미터를 선언한 후에는 노드 내부에서 해당 파라미터 값을 가져와 사용할 수 있다. 파라미터 값을 가져오는 함수는 `get_parameter`이다. 아래 예시는 `robot_speed` 파라미터를 가져오는 코드이다:

```cpp
double robot_speed;
this->get_parameter("robot_speed", robot_speed);
```

이 코드를 통해 `robot_speed` 파라미터 값을 변수로 불러와 로봇의 동작을 제어할 수 있다.

#### 5. 사용자 정의 파라미터의 수학적 모델

사용자 정의 파라미터를 적용하는 사례로, 로봇의 속도를 조정하는 파라미터를 수학적 모델로 정의할 수 있다. 로봇이 일정한 시간 동안 이동하는 거리를 계산할 때, 파라미터로 정의된 속도와 시간을 이용할 수 있다.

로봇이 직선 경로에서 이동하는 거리는 다음과 같이 정의된다:

$$
d = \mathbf{v} \cdot t
$$

여기서:

* $d$는 이동 거리이다.
* $\mathbf{v}$는 속도 벡터로, 파라미터로 설정된다.
* $t$는 경과 시간이다.

따라서, 사용자 정의 파라미터로 설정한 `robot_speed`를 $\mathbf{v}$로 간주하고, 사용자가 입력한 시간이 $t$라면, 위 수식을 통해 로봇이 이동한 거리를 계산할 수 있다.

#### 6. 파라미터를 이용한 동적 제어

파라미터를 사용하면 노드 실행 중에도 동적으로 값을 변경하여 로봇의 동작을 실시간으로 제어할 수 있다. 예를 들어, 주행 중에 로봇의 속도를 변경하고 싶을 때, 파라미터 값을 업데이트하여 실시간으로 속도를 조정할 수 있다. 이를 위해 `set_parameter` 함수를 사용할 수 있다:

```cpp
this->set_parameter(rclcpp::Parameter("robot_speed", 2.0));
```

이를 통해 `robot_speed`가 1.0에서 2.0으로 변경되어 로봇의 속도가 즉시 조정된다.

#### 7. 사용자 정의 파라미터를 이용한 동적 파라미터 재설정

ROS2에서는 파라미터를 동적으로 재설정할 수 있는 기능을 제공한다. 이 기능은 `on_parameter_event` 콜백을 통해 실시간으로 파라미터가 변경될 때마다 대응할 수 있다. 예를 들어, 사용자가 로봇의 속도를 동적으로 변경할 경우 다음과 같은 방법으로 콜백을 구현할 수 있다:

```cpp
auto callback = [this](const rcl_interfaces::msg::ParameterEvent::SharedPtr event) -> void {
    for (auto & changed_parameter : event->changed_parameters) {
        if (changed_parameter.name == "robot_speed") {
            this->get_parameter("robot_speed", this->robot_speed_);
        }
    }
};

this->add_on_set_parameters_callback(callback);
```

위 코드는 `robot_speed` 파라미터가 변경될 때마다 새로운 값을 가져와 내부 변수 `robot_speed_`를 업데이트한다. 이를 통해 로봇의 주행 속도를 실시간으로 제어할 수 있다.

#### 8. 사용자 정의 파라미터와 동적 재설정의 실제 적용 사례

로봇의 주행 속도를 동적으로 조정하는 시나리오를 예로 들어보겠다. 사용자가 GUI를 통해 로봇의 속도를 실시간으로 변경할 수 있는 환경을 제공하고자 할 때, 위의 동적 파라미터 재설정 기능을 활용할 수 있다. 이 경우, 사용자는 파라미터 서버를 통해 `robot_speed` 파라미터를 변경하고, 해당 값은 즉시 로봇의 움직임에 반영된다.

예를 들어, 로봇이 1초 동안 전진하는 상황에서, 사용자가 속도를 1.0에서 2.0으로 변경하면, 주행 거리도 실시간으로 조정된다:

* 처음 0.5초 동안 속도가 1.0일 때, 이동 거리는:

$$
d\_1 = \mathbf{v}\_1 \cdot t\_1 = 1.0 \cdot 0.5 = 0.5 , \text{m}
$$

* 속도가 2.0으로 변경된 후 나머지 0.5초 동안 이동한 거리는:

$$
d\_2 = \mathbf{v}\_2 \cdot t\_2 = 2.0 \cdot 0.5 = 1.0 , \text{m}
$$

따라서 1초 동안 로봇이 이동한 총 거리는:

$$
d = d\_1 + d\_2 = 0.5 + 1.0 = 1.5 , \text{m}
$$

이와 같은 방식으로 동적 파라미터 재설정은 로봇의 실시간 제어에 유용하게 활용된다.

#### 9. 사용자 정의 파라미터를 통한 다중 노드 상호작용

다수의 노드가 하나의 파라미터를 공유하는 경우도 있다. 예를 들어, 여러 로봇 노드가 같은 파라미터 서버에서 속도를 공유할 수 있다. 각 노드는 `robot_speed` 파라미터를 참조하여 동기화된 움직임을 유지하거나 각자의 파라미터를 동적으로 변경해도 된다.

이를 위해 각 노드는 동일한 파라미터 서버에 연결되고, 파라미터 변경 사항을 수신하여 행동을 동기화한다. 이러한 구조는 다음과 같이 간단히 표현할 수 있다:

{% @mermaid/diagram content="graph LR
A\[파라미터 서버] --> B\[노드 1]
A --> C\[노드 2]
A --> D\[노드 3]" %}

여기서, 파라미터 서버에서 변경된 값이 각 노드로 전달되어 모든 노드가 실시간으로 반응할 수 있다. 이를 통해 다중 로봇 간의 협력 작업이나 동기화가 가능해진다.

#### 10. 실제 사례: 경로 계획에서의 사용자 정의 파라미터

다음은 경로 계획 알고리즘에서 사용자 정의 파라미터를 사용하는 사례이다. 로봇이 미리 설정된 경로를 따라 이동할 때, 특정 장애물이나 조건에 따라 속도나 경로를 동적으로 조정할 수 있다. 이를 위해 경로 계획 노드에서 `max_speed`와 같은 사용자 정의 파라미터를 사용하여 로봇의 속도를 제어할 수 있다.

경로 계획에서 로봇의 속도는 다음과 같은 방정식으로 표현될 수 있다:

$$
\mathbf{v}*{\text{planned}} = \min(\mathbf{v}*{\text{max}}, \mathbf{v}\_{\text{desired}})
$$

여기서:

* $\mathbf{v}\_{\text{planned}}$는 계획된 속도이다.
* $\mathbf{v}\_{\text{max}}$는 파라미터로 설정된 최대 속도이다.
* $\mathbf{v}\_{\text{desired}}$는 현재 상황에 따른 원하는 속도이다.

이를 통해 경로 계획 알고리즘이 실시간으로 장애물과 환경을 고려하면서 동적으로 속도를 조정할 수 있다.

#### 11. 사용자 정의 파라미터 적용의 고급 사례: 로봇 팔 제어

로봇 팔 제어에서도 사용자 정의 파라미터는 매우 유용하게 활용될 수 있다. 예를 들어, 로봇 팔의 각 조인트를 제어하는 데 필요한 파라미터로 각 조인트의 회전 속도 및 가속도를 정의할 수 있다. 이를 통해 동적 작업이나 복잡한 동작을 효율적으로 제어할 수 있다.

각 조인트 $i$의 속도와 가속도는 사용자 정의 파라미터를 통해 제어되며, 수학적으로는 다음과 같이 표현할 수 있다:

$$
\mathbf{\theta}\_i(t) = \mathbf{\theta}\_i(0) + \mathbf{\dot{\theta}}\_i \cdot t + \frac{1}{2} \mathbf{\ddot{\theta}}\_i \cdot t^2
$$

여기서:

* $\mathbf{\theta}\_i(t)$는 시간 $t$에서 조인트 $i$의 각도이다.
* $\mathbf{\theta}\_i(0)$는 초기 각도이다.
* $\mathbf{\dot{\theta}}\_i$는 파라미터로 설정된 조인트 $i$의 속도이다.
* $\mathbf{\ddot{\theta}}\_i$는 파라미터로 설정된 조인트 $i$의 가속도이다.

이 수식을 기반으로 로봇 팔의 동작을 시간에 따라 제어할 수 있으며, 동적 파라미터를 활용하면 작업 중에도 실시간으로 속도나 가속도를 변경할 수 있다.

#### 12. 사용자 정의 파라미터와 실시간 제어

실시간 제어 환경에서 사용자 정의 파라미터의 효용은 더욱 커진다. 특히 실시간으로 노드가 동작 중일 때 파라미터를 수정하면 즉각적으로 동작에 반영되므로, 시스템의 성능을 최적화하거나 환경에 따라 로봇의 행동을 적응시킬 수 있다.

예를 들어, 로봇이 장애물을 회피할 때, 로봇의 회피 경로와 속도를 사용자 정의 파라미터로 설정하여 경로 계획을 최적화할 수 있다. 만약 로봇이 좁은 공간을 통과해야 한다면 속도를 줄여 안전하게 이동할 수 있도록 실시간으로 파라미터를 변경할 수 있다.

이를 수식으로 표현하면, 회피 속도는 다음과 같은 관계식을 따른다:

$$
\mathbf{v}*{\text{avoidance}} = f(\mathbf{v}*{\text{current}}, \mathbf{d}\_{\text{obstacle}})
$$

여기서:

* $\mathbf{v}\_{\text{avoidance}}$는 회피 경로에서의 속도이다.
* $\mathbf{v}\_{\text{current}}$는 현재 로봇의 속도이다.
* $\mathbf{d}\_{\text{obstacle}}$는 장애물과의 거리이다.

이처럼 사용자 정의 파라미터는 로봇이 환경에 따라 최적의 경로와 속도를 실시간으로 조정할 수 있도록 도와준다.

#### 13. 동적 파라미터 업데이트와 QoS 설정

ROS2에서는 QoS(품질 서비스) 정책을 통해 파라미터 업데이트의 신뢰성이나 성능을 제어할 수 있다. 파라미터가 매우 자주 변경되거나 실시간성이 요구되는 경우, 적절한 QoS 정책을 설정하여 파라미터 업데이트의 신뢰성과 성능을 향상시킬 수 있다.

예를 들어, 실시간 로봇 제어에서 파라미터 업데이트가 중요한 역할을 한다면, QoS 정책을 다음과 같이 설정할 수 있다:

```cpp
rclcpp::QoS qos_profile(rclcpp::KeepLast(10));
qos_profile.reliability(RMW_QOS_POLICY_RELIABILITY_RELIABLE);
qos_profile.durability(RMW_QOS_POLICY_DURABILITY_VOLATILE);
```

이와 같이 QoS 정책을 설정하면 파라미터 업데이트가 더욱 안정적이며, 실시간성을 보장할 수 있다.

#### 14. 다중 사용자 정의 파라미터 적용 사례: 복합 시스템

다중 사용자 정의 파라미터를 적용한 복합 시스템을 구성할 때는 각 파라미터가 시스템의 여러 부분에서 상호작용할 수 있다. 예를 들어, 자율 주행 자동차에서는 속도, 방향, 회전 반경 등의 다양한 파라미터를 제어하여 복잡한 주행 경로를 계산하고 실행할 수 있다.

이를 수식으로 표현하면, 전체 주행 경로의 상태는 다음과 같이 다중 파라미터로 구성된 벡터로 나타낼 수 있다:

$$
\mathbf{x}(t) = \begin{bmatrix} \mathbf{v}(t) \ \mathbf{\theta}(t) \ \mathbf{r}(t) \end{bmatrix}
$$

여기서:

* $\mathbf{x}(t)$는 시간 $t$에서의 상태 벡터이다.
* $\mathbf{v}(t)$는 속도이다.
* $\mathbf{\theta}(t)$는 방향 각도이다.
* $\mathbf{r}(t)$는 회전 반경이다.

다중 파라미터를 사용하면 복잡한 경로 계획이나 주행 시스템에서 각 요소를 독립적으로 제어하면서도 상호작용을 고려할 수 있다.
