659.5 TF1에서 TF2로의 발전 과정과 주요 변경 사항

1. TF1의 개요와 한계

TF1(tf)은 2008년 Willow Garage에서 ROS1과 함께 개발된 최초의 좌표 변환 라이브러리이다. Tully Foote가 설계한 TF1은 분산 로봇 시스템에서의 좌표 프레임 관리라는 핵심 문제를 효과적으로 해결하였으며, ROS 생태계의 성장과 함께 사실상 표준 좌표 변환 도구로 자리매김하였다 (Foote, 2013).

그러나 TF1은 수년간의 실사용 경험을 통해 다음과 같은 구조적 한계가 드러났다.

1.1 모놀리식 설계

TF1은 좌표 변환 로직, ROS 통신, 데이터 타입 변환이 단일 라이브러리(tf)에 모두 포함된 모놀리식(monolithic) 구조였다. 이로 인해 다음과 같은 문제가 발생하였다.

  • ROS 의존성: 좌표 변환의 핵심 로직이 ROS 통신 계층과 밀접하게 결합되어, ROS 환경 외부에서는 사용이 불가능하였다.
  • 타입 확장의 어려움: 새로운 데이터 타입에 대한 좌표 변환을 추가하려면 tf 라이브러리 자체를 수정해야 하였으며, 이는 유지보수와 확장에 심각한 제약을 가하였다.
  • 순환 의존성: tfgeometry_msgs, sensor_msgs 등 다수의 메시지 패키지에 직접 의존하면서, 빌드 시스템에서 순환 의존성(circular dependency) 문제가 빈번하게 발생하였다.

1.2 성능 문제

TF1에서는 변환 조회 시 매번 문자열 기반의 프레임 이름 비교를 수행하였으며, 변환 트리의 탐색 알고리즘이 최적화되지 않아 프레임 수가 증가할수록 성능이 저하되었다. 또한 정적 변환과 동적 변환의 구분이 없어, 시간에 따라 변하지 않는 고정 변환도 주기적으로 재발행해야 하는 비효율이 존재하였다.

1.3 스레드 안전성 부족

TF1의 초기 버전에서는 멀티스레드 환경에서의 동시 접근에 대한 안전성이 충분히 보장되지 않았으며, 이는 고빈도 제어 루프와 다수의 콜백이 동시에 실행되는 복잡한 로봇 시스템에서 경합 조건(race condition)과 같은 문제를 야기하였다.

2. TF2의 설계 동기

TF2는 TF1의 한계를 극복하기 위해 2012년부터 재설계가 시작되었다. TF2의 설계는 다음과 같은 원칙에 기초한다.

  1. 관심사의 분리(Separation of Concerns): 핵심 변환 로직, ROS 통합 계층, 타입 변환 계층을 명확하게 분리한다.
  2. 미들웨어 독립성: 핵심 변환 로직을 ROS에 대한 의존성 없이 구현하여, 독립적인 C++ 라이브러리로 사용할 수 있도록 한다.
  3. 확장 가능한 타입 시스템: 새로운 데이터 타입에 대한 좌표 변환을 외부 패키지를 통해 추가할 수 있는 플러그인 아키텍처를 도입한다.
  4. 정적 변환의 분리: 시간에 따라 변하지 않는 정적 변환을 별도의 메커니즘으로 관리하여 네트워크 효율성을 향상시킨다.

3. TF1에서 TF2로의 주요 변경 사항

3.1 패키지 구조의 분리

TF1의 단일 tf 패키지가 TF2에서는 다수의 독립적인 패키지로 분리되었다.

TF1TF2역할
tf (전체)tf2코어 변환 로직 (ROS 비의존)
tf (전체)tf2_rosROS 통합 계층
tf (전체)tf2_geometry_msgsgeometry_msgs 타입 변환
tf (전체)tf2_sensor_msgssensor_msgs 타입 변환
tf (전체)tf2_eigenEigen 라이브러리 연동
tf (전체)tf2_kdlKDL 라이브러리 연동
tf (전체)tf2_bulletBullet Physics 연동

3.2 정적 변환의 도입

TF2에서는 정적 변환(Static Transform)이 독립적인 개념으로 도입되었다. 이는 TF2의 가장 중요한 아키텍처 변경 중 하나이다.

특성TF1TF2
정적 변환 토픽없음 (/tf에 통합)/tf_static 전용 토픽
정적 변환 발행 빈도주기적 재발행 필요한 번만 발행 (Latched)
정적 변환 QoS해당 없음transient_local durability
정적 변환 발행 클래스TransformBroadcasterStaticTransformBroadcaster (전용)

정적 변환의 분리는 네트워크 대역폭 절감과 시스템 효율성 향상에 크게 기여하였다. 예를 들어, 10개의 센서가 장착된 로봇에서 각 센서의 장착 위치를 10Hz로 발행하던 TF1 방식(초당 100개의 메시지)이 TF2에서는 시스템 시작 시 10개의 메시지만 발행하면 충분하다.

3.3 API의 현대화

TF2는 ROS2의 현대적인 C++ 및 Python API와 일관된 인터페이스를 제공한다.

기능TF1 APITF2 API
변환 조회tf::TransformListener::lookupTransform()tf2_ros::Buffer::lookupTransform()
변환 가용성 확인tf::TransformListener::canTransform()tf2_ros::Buffer::canTransform()
변환 대기tf::TransformListener::waitForTransform()tf2_ros::Buffer::canTransform() (timeout 파라미터)
데이터 변환tf::Transformer::transformPoint()tf2::doTransform() (범용 템플릿)

특히, TF2에서는 변환 리스너(listener)와 변환 버퍼(buffer)가 분리되어, TransformListener는 토픽 구독과 데이터 수신만 담당하고, Buffer가 변환 데이터의 저장과 조회를 담당하는 구조로 변경되었다.

3.4 확장 가능한 타입 변환 메커니즘

TF1에서는 transformPoint(), transformPose(), transformVector() 등 데이터 타입별로 별도의 변환 함수가 구현되어 있었다. TF2에서는 이를 tf2::doTransform() 단일 함수로 통합하고, C++ 함수 오버로딩과 템플릿 특수화를 통해 다양한 데이터 타입을 지원하는 확장 가능한 구조로 변경하였다.

이러한 구조에서 새로운 데이터 타입에 대한 좌표 변환은 별도의 패키지에서 tf2::doTransform() 함수를 오버로딩하여 구현할 수 있으며, tf2 코어 라이브러리의 수정 없이 확장이 가능하다.

3.5 시간 표현의 변경

ROS2로의 전환과 함께, 시간 표현 방식도 변경되었다.

특성TF1 (ROS1)TF2 (ROS2)
시간 타입ros::Timerclcpp::Time / builtin_interfaces::msg::Time
시간 해상도나노초나노초
시간 원점 표현ros::Time(0)tf2::TimePointZero
시간 체계ROS_TIMEROS_TIME, SYSTEM_TIME, STEADY_TIME

3.6 예외 체계의 정비

TF2에서는 오류 상황에 대한 예외 체계가 체계적으로 정비되었다.

예외 클래스발생 조건
tf2::LookupException요청한 프레임이 변환 트리에 존재하지 않을 때
tf2::ConnectivityException두 프레임이 동일한 변환 트리에 연결되어 있지 않을 때
tf2::ExtrapolationException요청한 시간이 캐시된 변환의 시간 범위를 벗어날 때
tf2::InvalidArgumentException잘못된 인자가 전달되었을 때
tf2::TimeoutException변환 대기 시간이 초과되었을 때

4. TF1에서 TF2로의 마이그레이션

ROS1에서 ROS2로의 마이그레이션 과정에서 TF1 코드를 TF2로 전환하는 것은 필수적인 작업이다. 주요 마이그레이션 포인트는 다음과 같다.

  1. 헤더 변경: tf/transform_listener.htf2_ros/transform_listener.h
  2. 클래스 변경: tf::TransformListenertf2_ros::TransformListener + tf2_ros::Buffer
  3. 네임스페이스 변경: tf::tf2:: 또는 tf2_ros::
  4. 고정 변환 코드 분리: 주기적으로 발행하던 고정 변환을 StaticTransformBroadcaster로 전환
  5. 시간 타입 변경: ros::Timerclcpp::Time

ROS1의 호환성을 위해 tf2 패키지 위에 TF1 호환 계층(tf)이 제공되었으나, ROS2에서는 TF2만이 공식적으로 지원된다.


참고 문헌 및 출처:

  • Foote, T., “tf: The transform library,” 2013 IEEE Conference on Technologies for Practical Robot Applications (TePRA), pp. 1-6, 2013.
  • Open Robotics, “Migrating from tf to tf2,” ROS Wiki, 2019. https://wiki.ros.org/tf2/Migration
  • Open Robotics, “tf2 — ROS 2 Documentation,” ROS 2 Jazzy Jalisco, 2024.
  • Open Robotics, “tf2 Design,” ROS Wiki, 2014. https://wiki.ros.org/tf2/Design