659.111 변환 발행 주파수 최적화 (Transform Publishing Frequency Optimization)

659.111 변환 발행 주파수 최적화 (Transform Publishing Frequency Optimization)

1. 발행 주파수의 정의와 시스템적 의의

TF2 좌표 변환 시스템에서 변환 발행 주파수(transform publishing frequency)란 특정 좌표 프레임 간의 변환 정보가 /tf 토픽으로 전송되는 단위 시간당 메시지 수를 의미한다. 발행 주파수는 헤르츠(Hz) 단위로 표현하며, 이는 변환 데이터의 시간적 해상도(temporal resolution)를 직접적으로 결정하는 핵심 파라미터이다.

변환 발행 주파수는 로봇 시스템의 성능에 다중적 영향을 미친다. 주파수가 지나치게 높으면 네트워크 대역폭의 과도한 소모, CPU 연산 부하의 증가, 그리고 tf2::Buffer 내부의 캐시 메모리 사용량 증대를 초래한다. 반대로 주파수가 지나치게 낮으면 변환 보간(interpolation)의 정확도가 저하되고, 변환 외삽(extrapolation) 허용 범위를 초과하여 ExtrapolationException이 발생하는 원인이 된다. 따라서 시스템의 정확도 요구 사항과 가용 자원 간의 균형을 이루는 최적 발행 주파수의 결정은 TF2 기반 로봇 소프트웨어 설계에서 필수적인 공학적 과제이다.

2. 발행 주파수 결정의 이론적 기초

2.1 나이퀴스트-섀넌 표본화 정리의 적용

변환 발행 주파수의 하한은 나이퀴스트-섀넌 표본화 정리(Nyquist-Shannon sampling theorem)로부터 도출할 수 있다. 좌표 프레임 간의 상대적 운동이 최대 주파수 f_{\max}의 대역 제한 신호(band-limited signal)로 모형화될 수 있다면, 에일리어싱(aliasing) 없이 원래의 운동을 복원하기 위한 최소 발행 주파수 f_p는 다음 부등식을 만족하여야 한다.

f_p \geq 2 f_{\max}

여기서 f_{\max}는 해당 변환이 포함하는 운동 성분의 최고 주파수이다. 예를 들어, 6자유도 산업용 매니퓰레이터의 관절이 최대 5 Hz의 주기적 운동을 수행한다면, 해당 관절 변환의 발행 주파수는 최소 10 Hz 이상이어야 한다.

그러나 실제 로봇 시스템에서는 변환 조회 시점과 발행 시점 간의 비동기적 시간 차이, 네트워크 지터(jitter), 그리고 보간 알고리즘의 수치적 오차를 고려하여 나이퀴스트 주파수의 2배에서 5배 사이의 오버샘플링(oversampling)을 적용하는 것이 일반적이다.

f_p \approx (4 \sim 10) \cdot f_{\max}

2.2 변환 소비자 조회 주파수와의 관계

변환의 소비자(consumer) 노드가 lookupTransform()을 호출하는 주파수를 f_c라 하면, 발행 주파수 f_p는 최소한 f_c 이상이어야 보간에 의한 변환 계산이 가능하다. f_p < f_c인 경우, 동일한 두 변환 샘플 사이에서 다수의 조회가 발생하므로 보간 결과의 다양성이 감소하고, 극단적으로 f_p \ll f_c이면 외삽이 빈번하게 발생하여 시스템의 안정성이 저하된다.

이상적인 발행 주파수는 다음과 같이 정의할 수 있다.

f_p \geq \max(2 f_{\max}, \, f_c)

즉, 운동의 대역폭과 소비자 조회 주파수 중 더 큰 값에 의해 발행 주파수의 하한이 결정된다.

2.3 변환 변화율에 따른 분류

좌표 프레임 간 변환의 동적 특성은 발행 주파수 설정의 핵심 기준이 된다. 변환의 변화율(rate of change)은 병진 속도 \|\dot{\mathbf{t}}\|와 각속도 \|\boldsymbol{\omega}\|로 정량화할 수 있으며, 이에 따라 변환을 다음과 같이 분류한다.

분류변화율 특성대표적 변환권장 발행 주파수
정적 변환|\dot{\mathbf{t}}| = 0, |\boldsymbol{\omega}| = 0센서 장착 프레임/tf_static 사용 (1회 발행)
준정적 변환|\dot{\mathbf{t}}| \approx 0, |\boldsymbol{\omega}| \approx 0mapodom1–10 Hz
저동적 변환저속 병진 또는 회전odombase_link20–50 Hz
고동적 변환고속 관절 운동매니퓰레이터 관절50–500 Hz

3. 발행 주파수와 시스템 자원 소모의 상관관계

3.1 네트워크 대역폭 소모 분석

단일 TransformStamped 메시지의 직렬화(serialization) 크기는 CDR(Common Data Representation) 형식 기준으로 약 136바이트이다. 이를 tf2_msgs/TFMessage로 래핑하면 헤더를 포함하여 단일 변환당 약 160–180바이트의 페이로드가 생성된다. 따라서 N개의 동적 변환을 주파수 f_p로 발행할 때 초당 네트워크 대역폭 사용량 B는 근사적으로 다음과 같다.

B \approx N \cdot f_p \cdot S_{\text{msg}} \quad [\text{bytes/s}]

여기서 S_{\text{msg}}는 단일 변환 메시지의 평균 크기이다. 예를 들어, 7자유도 매니퓰레이터(N = 7)를 100 Hz(f_p = 100)로 발행하면 초당 약 7 \times 100 \times 170 = 119{,}000 바이트(약 116 KB/s)의 대역폭이 소모된다. 다중 로봇 환경에서 로봇 수가 M대로 증가하면 총 대역폭은 M \cdot B로 선형적으로 증가하므로, 네트워크 포화 방지를 위한 주파수 제한이 필수적이다.

3.2 CPU 연산 부하

변환 발행 측에서는 각 발행 주기마다 센서 데이터 또는 운동학적 계산(forward kinematics)으로부터 변환 값을 갱신하고, 메시지를 직렬화하여 DDS(Data Distribution Service) 계층으로 전달하는 연산이 수행된다. 수신 측에서는 TransformListener가 수신된 변환을 tf2::Buffer의 내부 자료 구조에 삽입하고 시간 순서를 유지하는 정렬 연산을 수행한다. 발행 주파수가 증가할수록 이러한 연산의 호출 빈도가 비례적으로 증가하여 CPU 점유율이 상승한다.

3.3 Buffer 메모리 사용량

tf2::Buffer는 설정된 캐시 기간(cache duration) T_{\text{cache}} 동안 수신된 모든 변환을 시간순으로 저장한다. 주파수 f_p로 발행되는 단일 변환 채널이 T_{\text{cache}} 동안 저장하는 샘플 수는 f_p \cdot T_{\text{cache}}이며, 전체 시스템에서 N개의 동적 변환 채널이 존재할 때 총 저장 샘플 수는 다음과 같다.

S_{\text{total}} = N \cdot f_p \cdot T_{\text{cache}}

캐시 기간의 기본값이 10초이고 N = 30, f_p = 100 Hz이면, S_{\text{total}} = 30{,}000개의 TransformStamped 인스턴스가 메모리에 상주하게 된다. 각 인스턴스의 메모리 점유량은 내부 표현 방식에 따라 다르나, 타임스탬프와 변환 데이터를 포함하여 약 100–200바이트 수준이므로 총 메모리 사용량은 수 메가바이트에 달할 수 있다.

4. 최적 발행 주파수 결정 전략

4.1 변환 유형별 분리 전략

모든 변환을 동일한 주파수로 발행하는 것은 비효율적이다. 변환을 동적 특성에 따라 분류하고, 각 분류별로 독립적인 발행 주파수를 할당하여야 한다.

정적 변환의 분리: 센서 장착 위치, 로봇 링크 간의 고정 오프셋 등 시간에 따라 변하지 않는 변환은 반드시 StaticTransformBroadcaster를 통해 /tf_static 토픽으로 발행하여야 한다. /tf_staticTRANSIENT_LOCAL QoS 내구성(durability) 정책을 사용하므로 발행이 1회만 이루어져도 이후 구독자에게 지속적으로 전달되며, 주기적 재발행이 불필요하다.

동적 변환의 계층별 주파수 할당: robot_state_publisherpublish_frequency 파라미터는 해당 노드가 관리하는 모든 동적 변환에 단일 주파수를 적용한다. 그러나 관절별로 상이한 동적 특성을 가지는 경우, 별도의 TransformBroadcaster 노드를 구성하여 고속 관절과 저속 관절의 변환을 서로 다른 주파수로 발행하는 것이 바람직하다.

4.2 robot_state_publisher의 발행 주파수 설정

robot_state_publisher 노드는 publish_frequency 파라미터를 통해 변환 발행 주파수를 설정한다. 기본값은 20 Hz이며, 다음과 같이 런치 파일에서 변경할 수 있다.

from launch_ros.actions import Node

robot_state_publisher_node = Node(
    package='robot_state_publisher',
    executable='robot_state_publisher',
    parameters=[{
        'robot_description': robot_description,
        'publish_frequency': 50.0,  # Hz
    }],
)

publish_frequency의 값은 joint_states 토픽의 수신 주파수와 독립적으로 동작한다. robot_state_publisher는 타이머 기반으로 지정된 주파수에 맞추어 가장 최근의 관절 상태를 기반으로 순운동학(forward kinematics)을 계산하고 변환을 발행한다. 따라서 joint_states의 발행 주파수가 publish_frequency보다 낮을 경우, 동일한 관절 상태로부터 중복된 변환이 발행되어 불필요한 자원 소모가 발생한다. 이를 방지하기 위해 publish_frequencyjoint_states의 발행 주파수 이하로 설정하는 것이 원칙이다.

4.3 사용자 정의 발행 노드에서의 주파수 제어

사용자가 직접 TransformBroadcaster를 사용하여 변환을 발행하는 경우, 타이머 콜백의 주기를 통해 발행 주파수를 제어한다.

#include <rclcpp/rclcpp.hpp>
#include <tf2_ros/transform_broadcaster.h>

class OptimizedTFPublisher : public rclcpp::Node
{
public:
    OptimizedTFPublisher()
    : Node("optimized_tf_publisher")
    {
        tf_broadcaster_ = std::make_unique<tf2_ros::TransformBroadcaster>(*this);
        
        // 발행 주파수 파라미터 선언 (기본값 30 Hz)
        this->declare_parameter("publish_rate", 30.0);
        double rate = this->get_parameter("publish_rate").as_double();
        
        auto period = std::chrono::duration<double>(1.0 / rate);
        timer_ = this->create_wall_timer(
            std::chrono::duration_cast<std::chrono::nanoseconds>(period),
            std::bind(&OptimizedTFPublisher::publishTransform, this));
    }

private:
    void publishTransform()
    {
        geometry_msgs::msg::TransformStamped t;
        t.header.stamp = this->get_clock()->now();
        t.header.frame_id = "odom";
        t.child_frame_id = "base_link";
        // 변환 값 계산 및 설정
        tf_broadcaster_->sendTransform(t);
    }

    std::unique_ptr<tf2_ros::TransformBroadcaster> tf_broadcaster_;
    rclcpp::TimerBase::SharedPtr timer_;
};

발행 주파수를 런타임에 동적으로 변경하려면 파라미터 콜백을 등록하여 타이머 주기를 재설정하는 방식을 적용할 수 있다.

5. 발행 주파수 모니터링과 진단

5.1 tf2_monitor를 이용한 실시간 주파수 측정

tf2_monitor/tf 토픽에서 수신되는 각 변환 채널의 발행 주파수, 평균 지연 시간(delay), 최대 지연 시간을 실시간으로 측정하여 보고하는 진단 도구이다.

ros2 run tf2_ros tf2_monitor

출력 결과에는 각 프레임 쌍(parent → child)에 대해 평균 발행 주파수(Average rate), 최대 지연(Max delay), 평균 지연(Average delay)이 표시된다. 이를 통해 기대 주파수 대비 실제 발행 주파수의 편차를 파악하고, 주파수 저하의 원인(CPU 과부하, 네트워크 병목 등)을 진단할 수 있다.

5.2 ros2 topic hz를 이용한 토픽 수준 주파수 측정

/tf 토픽 전체의 메시지 수신 빈도는 다음 명령으로 측정할 수 있다.

ros2 topic hz /tf

이 값은 개별 변환 채널의 주파수가 아닌, 모든 동적 변환 메시지의 합산 빈도를 나타낸다. 개별 채널의 주파수를 확인하려면 tf2_monitor를 사용하여야 한다.

5.3 진단 기반 경고 시스템 구현

ROS2 진단 시스템(diagnostic_updater)을 활용하여 변환 발행 주파수가 기대 범위를 벗어날 때 자동으로 경고를 발생시키는 메커니즘을 구현할 수 있다. 이를 통해 실시간 시스템 운영 중 주파수 이상을 조기에 탐지하고 대응할 수 있다.

#include <diagnostic_updater/diagnostic_updater.hpp>
#include <diagnostic_updater/publisher.hpp>

// 발행 주파수 진단 설정
diagnostic_updater::Updater updater(this);
double min_freq = 25.0;  // 최소 허용 주파수
double max_freq = 35.0;  // 최대 허용 주파수
diagnostic_updater::FrequencyStatusParam freq_param(&min_freq, &max_freq);

6. 다중 로봇 환경에서의 주파수 최적화

다중 로봇 시스템에서는 각 로봇이 독립적으로 변환을 발행하므로, 전체 시스템의 /tf 토픽 트래픽은 로봇 수에 비례하여 증가한다. M대의 로봇이 각각 N개의 동적 변환을 주파수 f_p로 발행할 때, 네트워크상의 총 변환 메시지 빈도는 다음과 같다.

F_{\text{total}} = M \cdot N \cdot f_p

이러한 트래픽 폭증을 완화하기 위한 전략으로는 다음이 있다.

로봇별 네임스페이스 분리: 각 로봇의 /tf 토픽을 네임스페이스로 분리(예: /robot_1/tf, /robot_2/tf)하여, 특정 로봇의 변환만을 선택적으로 구독할 수 있게 한다. 이 경우 각 구독자 노드의 수신 부하는 단일 로봇 수준으로 제한된다.

변환 발행 주파수의 차등 적용: 중앙 관제 시스템이 모든 로봇의 위치를 모니터링하는 경우, 각 로봇의 mapbase_link 변환은 1–5 Hz 수준의 저주파로 발행하고, 개별 로봇의 내부 관절 변환은 해당 로봇의 로컬 네트워크 내에서만 고주파로 발행하는 계층적 전략을 채택할 수 있다.

DDS 도메인 분리: 동일 네트워크상의 로봇 그룹을 DDS 도메인 ID로 분리하여, 도메인 간 변환 트래픽의 격리를 달성한다.

7. 적응적 발행 주파수 조절 기법

고정 주파수 발행 방식은 로봇의 운동 상태가 시간에 따라 크게 변하는 경우 비효율적이다. 로봇이 정지 상태일 때도 고주파로 변환을 발행하면 불필요한 자원이 소모되며, 반대로 급격한 운동 중에 저주파로 발행하면 변환 정확도가 저하된다.

적응적 주파수 조절(adaptive rate control)은 변환의 시간적 변화량을 실시간으로 추정하고, 이에 비례하여 발행 주파수를 동적으로 조정하는 기법이다. 구현 원리는 다음과 같다.

  1. 현재 시각의 변환 \mathbf{T}(t)와 이전 발행 시각의 변환 \mathbf{T}(t - \Delta t) 간의 차이를 병진 성분과 회전 성분으로 분리하여 계산한다.
  2. 병진 변화량 \delta_t = \|\mathbf{t}(t) - \mathbf{t}(t - \Delta t)\|와 회전 변화량 \delta_r = \arccos\left(\frac{\text{tr}(\mathbf{R}(t)^\top \mathbf{R}(t-\Delta t)) - 1}{2}\right)를 산출한다.
  3. 변화량이 설정된 임계값 이상이면 발행 주파수를 증가시키고, 임계값 미만이면 감소시킨다.

이 기법은 정밀 제어가 요구되는 매니퓰레이터 시스템이나, 이동과 정지를 반복하는 모바일 로봇에서 대역폭 효율성을 크게 향상시킬 수 있다. 다만, 적응적 주파수 조절은 TF2의 보간 메커니즘이 비균일 시간 간격의 샘플에 대해서도 정확하게 동작한다는 전제 하에서만 유효하며, TF2의 선형 보간(LERP) 및 구면 선형 보간(SLERP) 알고리즘은 이 조건을 만족한다.


참고 문헌 및 출처

  • ROS2 geometry2 리포지터리, tf2_ros 패키지, https://github.com/ros2/geometry2
  • Foote, T. (2013). “tf: The transform library.” IEEE International Conference on Technologies for Practical Robot Applications (TePRA), pp. 1–6.
  • REP 105 – Coordinate Frames for Mobile Platforms, https://www.ros.org/reps/rep-0105.html
  • REP 103 – Standard Units of Measure and Coordinate Conventions, https://www.ros.org/reps/rep-0103.html
  • Open Robotics. robot_state_publisher 패키지 문서, https://github.com/ros/robot_state_publisher

버전: 1.0