1. 파라미터 서버 개념

파라미터 서버는 ROS2 노드 간 파라미터 값을 저장하고 관리하는 기능을 제공하여, 여러 노드가 동일한 파라미터를 공유할 수 있도록 돕는다. 이때, 각 노드는 파라미터 서버를 통해 설정된 파라미터 값을 불러오거나, 다른 노드와 실시간으로 파라미터를 공유하게 된다. 파라미터는 일반적으로 노드의 동작 방식을 조정하기 위해 사용되며, 동적 파라미터 재구성 기능을 통해 노드의 실행 중에도 파라미터를 변경할 수 있다.

2. 파라미터의 기본 구조

파라미터는 ROS2에서 다양한 타입으로 설정될 수 있다. 대표적인 파라미터 타입으로는 다음과 같은 것들이 있다: - bool: 참/거짓 값 - int: 정수 값 - double: 실수 값 - string: 문자열 값 - array: 배열 값

각 노드는 파라미터 서버에서 설정된 값을 사용하여 동작을 조정할 수 있으며, 파라미터 값은 노드 간에 공유되거나, 여러 노드에서 같은 파라미터 값을 참조할 수 있다.

3. 노드 간 파라미터 공유 방식

ROS2에서 노드 간 파라미터를 공유하는 방식에는 다음과 같은 메커니즘이 존재한다:

3.1. 글로벌 파라미터

글로벌 파라미터는 여러 노드가 동일한 파라미터 값을 공유하는 경우에 사용된다. 이 파라미터는 특정 노드에 종속되지 않으며, 모든 노드가 접근 가능한 네임스페이스에서 선언된다.

import rclpy
from rclpy.node import Node

class MyNode(Node):
    def __init__(self):
        super().__init__('my_node')
        self.declare_parameter('global_param', 'default_value')

def main(args=None):
    rclpy.init(args=args)
    node = MyNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

위 코드에서는 'global_param'이라는 이름의 파라미터를 선언하고, 기본값으로 'default_value'를 설정하였다. 이 파라미터는 다른 노드에서도 동일한 이름으로 접근할 수 있다.

3.2. 네임스페이스를 통한 파라미터 분리

파라미터는 네임스페이스를 사용하여 논리적으로 그룹화할 수 있다. 이를 통해 서로 다른 노드가 동일한 이름의 파라미터를 가질 수 있지만, 서로 다른 네임스페이스에 속하기 때문에 값이 겹치지 않는다.

self.declare_parameter('namespace1.param_name', 'value1')
self.declare_parameter('namespace2.param_name', 'value2')

위 코드는 'namespace1''namespace2'라는 네임스페이스를 사용하여 파라미터를 분리한 예시이다. 같은 이름의 파라미터라도 네임스페이스에 따라 다르게 관리된다.

3.3. 파라미터 공유 메커니즘

파라미터는 노드 간에 직접적으로 공유되기보다는, 파라미터 서버를 통해 값을 읽어오고 설정하는 방식으로 공유된다. 각 노드는 필요할 때 파라미터 서버로부터 값을 불러와 사용할 수 있으며, 이를 통해 파라미터 값의 일관성을 유지할 수 있다.

param_value = self.get_parameter('global_param').get_parameter_value().string_value

이 코드는 노드에서 'global_param'이라는 파라미터 값을 읽어오는 예시이다.

4. 파라미터 업데이트 및 실시간 동기화

노드 간 파라미터를 공유할 때, 특정 노드에서 파라미터를 업데이트하면, 다른 노드에서 실시간으로 이 변화를 반영할 수 있어야 한다. 이를 위해 ROS2는 동적 파라미터 재구성 기능을 제공한다.

4.1. 동적 파라미터 재구성

동적 파라미터 재구성은 노드가 실행 중일 때, 파라미터 값을 변경할 수 있는 기능을 제공한다. 이를 통해, 특정 노드에서 파라미터를 수정하면, 다른 노드도 즉시 이 변화를 인식하고 동작을 조정할 수 있다.

def parameter_callback(self, params):
    for param in params:
        if param.name == 'global_param' and param.type_ == Parameter.Type.STRING:
            self.get_logger().info(f'Parameter {param.name} updated to {param.value}')
    return SetParametersResult(successful=True)

위 코드에서는 파라미터가 변경될 때 호출되는 콜백 함수의 예시이다. 파라미터가 'global_param'일 경우, 해당 파라미터 값이 변경되었음을 로그로 출력한다.

4.2. 파라미터 이벤트 처리

파라미터 변경 이벤트는 ROS2의 파라미터 서버를 통해 각 노드에 전달된다. 노드는 파라미터 변경 이벤트를 수신하고, 변경된 파라미터에 맞춰 동작을 재조정할 수 있다. 파라미터 이벤트는 on_parameter_event 메소드를 통해 처리된다.

self.add_on_set_parameters_callback(self.parameter_callback)

위 코드는 파라미터 변경 이벤트를 처리하기 위해 콜백 함수를 등록하는 예시이다.

4.3. 파라미터 동기화

파라미터 동기화는 여러 노드에서 파라미터 값을 일관되게 유지하기 위한 핵심 기능이다. 예를 들어, 하나의 노드에서 파라미터 값을 수정하면, 다른 노드들도 이를 감지하고 동일한 값을 사용할 수 있어야 한다. 이를 위해 ROS2는 파라미터 이벤트를 통해 실시간으로 파라미터 변화를 모든 관련 노드에 전달할 수 있다.

4.4. 파라미터 값의 실시간 반영

파라미터가 변경되었을 때 실시간으로 다른 노드에 반영하는 방법은 ROS2에서 제공하는 파라미터 변경 이벤트 시스템을 통해 구현된다. 이를 활용하면, 특정 노드에서 파라미터 값이 변경되었을 때, 다른 노드들도 해당 파라미터 값을 즉시 불러와 업데이트할 수 있다.

파라미터가 변경될 때마다 모든 노드가 즉각적으로 변경된 값을 사용할 수 있도록 하는 메커니즘을 구현하기 위해서는 add_on_set_parameters_callback 함수를 이용하여 파라미터 변경을 감지하는 콜백 함수를 등록하고, 이를 통해 파라미터 값이 수정될 때 즉시 처리하도록 할 수 있다.

4.5. 파라미터 값 전파

파라미터 값의 전파는 여러 노드에서 동일한 파라미터 값을 공유하는 경우 중요한 역할을 한다. 이를 구현하기 위해 각 노드는 파라미터 서버에 접근하여 현재 파라미터 값을 주기적으로 확인하거나, 파라미터 이벤트를 구독하여 변경된 값을 실시간으로 업데이트할 수 있다.

# 파라미터 변경 콜백 함수 등록
self.add_on_set_parameters_callback(self.parameter_callback)

# 파라미터 값 확인 및 업데이트
self.set_parameters([Parameter('shared_param', Parameter.Type.STRING, 'new_value')])

위 코드에서는 노드 간에 파라미터가 변경될 때 이를 실시간으로 처리하는 방법을 보여준다. 'shared_param'이라는 파라미터가 변경되었을 때, 이를 즉시 반영하여 다른 노드에서도 동일한 값이 사용되도록 한다.

5. 네임스페이스와 파라미터 공유

파라미터를 여러 노드에서 공유할 때 네임스페이스를 활용하면, 각기 다른 노드가 동일한 이름의 파라미터를 가질 수 있다. 네임스페이스는 파라미터 값이 충돌하지 않도록 하며, 노드의 논리적 그룹화에 도움을 준다.

5.1. 네임스페이스 기반 파라미터 공유

네임스페이스를 사용하여 여러 노드가 동일한 이름의 파라미터를 가질 수 있도록 설정할 수 있다. 이렇게 하면 노드 간 파라미터 값이 충돌하지 않으며, 각 노드가 자신의 네임스페이스 내에서 파라미터를 관리할 수 있다.

self.declare_parameter('namespace1.shared_param', 'value1')
self.declare_parameter('namespace2.shared_param', 'value2')

위 코드에서는 'namespace1''namespace2'라는 네임스페이스를 사용하여 각각 다른 값을 가진 파라미터를 선언하였다. 이를 통해 서로 다른 노드에서 같은 이름의 파라미터를 사용하더라도 값이 충돌하지 않는다.

5.2. 네임스페이스를 통한 파라미터 그룹화

네임스페이스는 파라미터를 논리적으로 그룹화할 때 유용하다. 예를 들어, 동일한 기능을 수행하는 여러 노드가 있을 때, 각각의 노드는 자신의 네임스페이스 내에서 파라미터를 선언하고 관리할 수 있다.

다이어그램을 사용하여 파라미터가 네임스페이스를 통해 어떻게 관리되는지 시각화할 수 있다.

graph TD; A[Global Parameter Server] --> B[Namespace 1 - Node 1]; A --> C[Namespace 2 - Node 2]; B --> D[Param 1: value1]; C --> E[Param 1: value2];

위 다이어그램에서는 네임스페이스를 통해 동일한 파라미터 이름을 가진 두 노드가 각각 다른 값을 공유하는 구조를 보여준다.

6. 파라미터 이벤트의 활용

파라미터 이벤트는 파라미터 값이 변경될 때마다 해당 이벤트를 통해 노드 간에 파라미터 값을 동기화하는 기능을 제공한다. 이를 통해 특정 노드에서 파라미터 값이 수정되면, 다른 노드들도 실시간으로 이 변화를 반영할 수 있다.

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

파라미터 변경 이벤트는 ROS2에서 제공하는 기본 메커니즘으로, 노드 간의 파라미터 값을 일관되게 유지하는 데 사용된다. 각 노드는 파라미터 변경 이벤트를 수신하고, 해당 이벤트를 처리하여 파라미터 값을 업데이트할 수 있다.

def parameter_callback(self, params):
    for param in params:
        if param.name == 'shared_param':
            self.get_logger().info(f'Parameter {param.name} updated to {param.value}')
    return SetParametersResult(successful=True)

이 코드는 파라미터가 변경되었을 때 호출되는 콜백 함수의 예시이다. 'shared_param'이라는 파라미터가 변경되면, 해당 변경 사항을 로그로 출력하고, 성공적으로 파라미터 값을 설정하였음을 반환한다.