파라미터 서버 개념

ROS2에서 파라미터 서버는 노드 간에 파라미터를 저장하고 조회할 수 있는 중앙 저장소 역할을 한다. 각 노드는 파라미터를 등록하고 이를 통해 동작을 제어할 수 있으며, 다른 노드에서 이 파라미터를 읽거나 수정하여 시스템의 동작을 제어할 수 있다.

파라미터 서버는 노드가 시작될 때 파라미터를 정의하고, 파라미터가 동적으로 변경될 수 있는 구조를 제공한다. 이러한 구조는 복잡한 시스템에서 다수의 노드가 서로 간섭 없이 작동할 수 있도록 한다.

파라미터 정의

파라미터는 키-값 쌍으로 정의되며, 각 키에는 특정 값이 할당된다. 값은 다음과 같은 다양한 데이터 타입을 가질 수 있다: - 정수형 (Integer) - 실수형 (Float) - 불리언 (Boolean) - 문자열 (String) - 리스트 (Array)

파라미터는 노드의 실행 시간에 동적으로 변경될 수 있으며, 각 노드는 자신의 파라미터를 읽고 수정할 수 있다.

노드 간 상호작용

다중 노드 간 파라미터 서버를 통한 상호작용은 특정 노드가 설정한 파라미터를 다른 노드에서 읽거나 수정함으로써 이루어진다. 이는 노드 간 협력 또는 제어 시 매우 유용하게 사용된다.

예를 들어, 노드 A가 특정 파라미터 \texttt{param1}을 설정하고, 노드 B는 해당 파라미터를 읽어 자신의 동작을 결정할 수 있다.

파라미터 서버를 사용하여 파라미터를 가져오고 설정하는 기본적인 코드 예시는 다음과 같다.

# 파라미터 가져오기
param_value = self.get_parameter('param1').get_parameter_value().integer_value

# 파라미터 설정하기
self.set_parameters([rclpy.parameter.Parameter('param1', rclpy.Parameter.Type.INTEGER, 42)])

파라미터 동기화 문제

파라미터는 중앙 서버에 저장되지 않기 때문에, 각 노드 간의 파라미터 변경이 자동으로 동기화되지 않는다. 즉, 한 노드가 파라미터를 수정했을 때, 다른 노드가 해당 변경 사항을 즉시 인지하는 것이 아니라, 명시적으로 파라미터를 읽거나 업데이트하는 과정이 필요하다.

파라미터 변경 이벤트는 노드 간 상호작용을 원활하게 하기 위해 주기적으로 파라미터 값을 확인하거나, 이벤트 콜백을 통해 처리될 수 있다.

파라미터 이벤트 콜백

파라미터 서버는 파라미터가 변경될 때 이를 감지하여 특정 동작을 수행할 수 있는 콜백 시스템을 제공한다. 노드는 자신이 등록한 파라미터가 변경되었을 때 이를 감지하고 특정 작업을 수행할 수 있다. 이 방법은 파라미터 기반의 실시간 제어를 가능하게 한다.

# 파라미터 이벤트 콜백 설정
def parameter_callback(self, params):
    for param in params:
        if param.name == 'param1':
            self.get_logger().info(f'param1이 {param.value}로 변경되었다.')
    return rcl_interfaces.msg.SetParametersResult(successful=True)

self.add_on_set_parameters_callback(parameter_callback)

파라미터 이벤트 콜백을 통해 다중 노드 간에 실시간으로 상호작용할 수 있다. 파라미터가 변경될 때마다 특정 동작을 수행할 수 있으며, 이를 통해 노드 간의 협력이 보다 수월하게 이루어질 수 있다.

동적 파라미터 재구성

동적 파라미터 재구성은 노드 실행 중에 파라미터를 실시간으로 수정할 수 있는 기능을 의미한다. 이는 시스템의 동작을 중단하지 않고도 특정 동작을 수정하거나 제어할 수 있는 방법을 제공한다. 예를 들어, 로봇의 속도를 제어하는 파라미터를 실시간으로 수정할 수 있어, 로봇이 움직이는 동안에도 속도를 조절할 수 있다.

다음은 ROS2에서 동적 파라미터를 설정하고 수정하는 기본적인 예제이다.

# 파라미터 설정
self.declare_parameter('robot_speed', 1.0)

# 동적으로 파라미터 값을 수정
self.set_parameters([rclpy.parameter.Parameter('robot_speed', rclpy.Parameter.Type.DOUBLE, 2.5)])

다중 노드 간 파라미터 조율

복잡한 시스템에서 여러 노드가 파라미터를 공유하고 이를 통해 상호작용하는 경우, 파라미터 조율이 필요할 수 있다. 각 노드가 독립적으로 파라미터 값을 수정할 수 있기 때문에, 파라미터 값의 일관성을 유지하기 위한 조율 전략이 필요하다.

이를 위해 다음과 같은 방식을 사용할 수 있다: 1. 중앙 제어 노드: 특정 파라미터를 제어하는 중앙 노드를 두어, 다른 노드들이 이 중앙 노드를 통해서만 파라미터를 수정할 수 있도록 제한한다. 2. 파라미터 이벤트 모니터링: 각 노드가 주기적으로 파라미터 값을 읽어들이고, 다른 노드에서 수정된 파라미터 값을 인식하여 동작을 조정할 수 있도록 한다. 3. 파라미터 버전 관리: 파라미터 값에 버전을 부여하여, 최신 버전의 파라미터만 사용되도록 관리할 수 있다.

파라미터 통신을 위한 QoS 설정

파라미터 간의 통신에서 QoS(품질 서비스, Quality of Service) 정책을 설정하는 것은 중요하다. QoS는 ROS2 네트워크에서 노드 간의 통신 신뢰성, 대기 시간, 데이터 손실 가능성 등을 제어할 수 있는 기능이다. 이를 통해 파라미터 값이 실시간으로 전달되고, 데이터 손실 없이 전달되도록 보장할 수 있다.

QoS 정책 설정은 다음과 같이 할 수 있다.

from rclpy.qos import QoSProfile

# QoS 설정
qos_profile = QoSProfile(depth=10)
self.create_publisher(String, 'parameter_topic', qos_profile)

노드 간의 파라미터 전달 방법

ROS2에서 파라미터를 노드 간에 전달하는 주요 방법은 토픽서비스이다.

다음은 토픽을 통한 파라미터 전달 예제이다.

# 파라미터 퍼블리시
parameter_pub = self.create_publisher(String, 'parameter_topic', 10)
msg = String()
msg.data = str(self.get_parameter('robot_speed').get_parameter_value().double_value)
parameter_pub.publish(msg)

파라미터 서버에서의 파라미터 요청 및 응답

파라미터 서버에서 노드가 특정 파라미터 값을 요청하고, 응답을 통해 해당 값을 반환받는 방식은 서비스(Services)를 통해 구현할 수 있다. 서비스는 요청-응답 모델로 작동하며, 노드 간 상호작용에서 중요한 역할을 한다. 노드는 다른 노드의 파라미터 서버에 요청을 보내고, 파라미터 값을 조회하거나 수정할 수 있다.

다음은 ROS2에서 서비스 요청을 통해 파라미터를 조회하는 예제이다.

from rclpy.node import Node
from example_interfaces.srv import GetParameters

class ParameterClientNode(Node):
    def __init__(self):
        super().__init__('parameter_client_node')
        self.cli = self.create_client(GetParameters, 'get_parameters_service')
        while not self.cli.wait_for_service(timeout_sec=1.0):
            self.get_logger().info('서비스 대기 중...')
        self.req = GetParameters.Request()

    def send_request(self):
        self.req.names = ['robot_speed']
        self.future = self.cli.call_async(self.req)

이와 같이, 서비스 클라이언트는 다른 노드로부터 특정 파라미터 값을 요청할 수 있으며, 응답을 기다린다. 이는 노드 간에 필요한 파라미터 값을 실시간으로 공유하는 데 유용하다.

파라미터 서버와 네임스페이스

ROS2에서 파라미터는 네임스페이스와 함께 사용될 수 있다. 네임스페이스는 여러 노드 간의 파라미터 충돌을 방지하는 데 중요한 역할을 하며, 각 노드는 고유한 네임스페이스 내에서 독립적으로 동작할 수 있다.

파라미터와 네임스페이스의 상호작용을 위한 기본 예제는 다음과 같다.

# 네임스페이스에서 파라미터 설정
self.declare_parameter('robot_speed', 1.0, namespace='robot_namespace')

# 네임스페이스 내 파라미터 값 조회
param_value = self.get_parameter('robot_namespace.robot_speed').get_parameter_value().double_value

네임스페이스는 특히 다중 로봇 시스템에서 유용하게 사용된다. 예를 들어, 여러 대의 로봇이 동일한 파라미터 이름을 사용하더라도 네임스페이스를 통해 각각의 로봇이 고유한 파라미터 값을 가질 수 있다.

파라미터 동기화 및 버전 관리

노드 간의 파라미터 동기화는 복잡한 시스템에서 중요하다. 파라미터 값이 여러 노드에서 실시간으로 변동될 수 있기 때문에, 파라미터 값의 일관성을 유지하기 위한 동기화 메커니즘이 필요하다. 이를 위해 파라미터 서버에서 파라미터 값을 읽어들이는 주기를 조절하거나, 파라미터 값을 변경할 때 이벤트 기반으로 다른 노드에 알리는 방법을 사용할 수 있다.

버전 관리는 파라미터가 자주 변경되는 상황에서 매우 유용한데, 파라미터 값을 변경할 때마다 버전을 업데이트하여 최신 버전의 파라미터만을 사용할 수 있도록 관리할 수 있다.

다중 노드 간 파라미터 상호작용을 위한 고려 사항

다이어그램을 활용하여 파라미터 상호작용 흐름을 시각적으로 표현할 수 있다.

graph TD A[노드 A] -->|파라미터 요청| B[파라미터 서버] B -->|파라미터 응답| A A -->|파라미터 변경| B B -->|변경 이벤트 전파| C[노드 B] C -->|변경된 파라미터 반영| D[시스템 동작]

위 다이어그램은 노드 A가 파라미터 서버에 요청을 보내고, 서버가 응답한 후 파라미터 값을 변경하는 흐름을 나타낸다. 변경된 파라미터 값은 이벤트를 통해 노드 B에 전달되며, 시스템이 해당 파라미터 값에 따라 동작을 수정하게 된다.