659.6 TF2 핵심 모듈과 패키지 구성

1. TF2 패키지 생태계 개요

TF2는 단일 모놀리식 라이브러리가 아닌, 계층적으로 구성된 다수의 독립적인 패키지들로 이루어진 생태계이다. 각 패키지는 명확하게 정의된 역할을 담당하며, 패키지 간의 의존성은 하위 계층에서 상위 계층으로의 단방향 의존성만 허용된다. 이러한 모듈러 설계는 빌드 시간 단축, 선택적 의존성 관리, 그리고 확장성 향상에 기여한다.

ROS 2 Jazzy Jalisco 기준으로, TF2 관련 핵심 패키지는 다음과 같이 구성된다.

2. 코어 패키지

2.1 tf2 패키지

tf2 패키지는 TF2 라이브러리의 최하위 계층으로, 좌표 변환의 핵심 로직을 구현하는 순수 C++ 라이브러리이다. 이 패키지는 ROS2에 대한 의존성이 전혀 없으며, 순수 C++ 프로젝트에서도 독립적으로 사용할 수 있다.

2.1.1 주요 클래스

클래스역할
tf2::BufferCore변환 트리의 저장, 관리, 조회를 담당하는 핵심 클래스. 변환 데이터의 시간 기반 캐싱, 프레임 간 경로 탐색, 변환 합성 등을 수행한다
tf2::TimeCache단일 프레임 쌍에 대한 시간대별 변환 이력을 순서대로 저장하는 원형 버퍼(circular buffer) 구조
tf2::StaticCache정적 변환을 저장하는 캐시. 시간 인덱스 없이 단일 변환만 저장한다
tf2::TransformStorage개별 변환 데이터(타임스탬프, 회전 쿼터니언, 병진 벡터, 프레임 ID)를 저장하는 구조체

2.1.2 주요 예외 클래스

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

2.1.3 주요 유틸리티 함수

tf2 패키지는 좌표 변환에 필요한 핵심 유틸리티 함수를 제공한다.

  • tf2::doTransform(): 타입에 따른 좌표 변환을 수행하는 범용 함수 템플릿
  • tf2::convert(): 서로 다른 표현 형식 간의 변환
  • tf2::toMsg() / tf2::fromMsg(): ROS 메시지 타입과 내부 타입 간의 변환

2.2 tf2_msgs 패키지

tf2_msgs 패키지는 TF2 시스템에서 사용되는 ROS2 메시지 타입과 서비스 타입을 정의한다.

메시지/서비스용도
tf2_msgs/msg/TFMessage/tf/tf_static 토픽의 메시지 타입. geometry_msgs/TransformStamped 배열을 포함한다
tf2_msgs/srv/FrameGraph현재 변환 트리의 프레임 그래프를 YAML 형식으로 반환하는 서비스

3. ROS2 통합 패키지

3.1 tf2_ros 패키지

tf2_ros 패키지는 tf2 코어 라이브러리를 ROS2 통신 인프라와 연결하는 중간 계층이다. 이 패키지는 ROS2의 토픽 발행-구독, 서비스, 파라미터 시스템 등과의 통합을 제공한다.

3.1.1 C++ 클래스

클래스역할
tf2_ros::Buffertf2::BufferCore를 상속하며, ROS2 노드와의 인터페이스 제공. lookupTransform(), canTransform() 등의 공개 API 제공
tf2_ros::TransformListener/tf/tf_static 토픽을 구독하여 수신된 변환을 Buffer에 저장
tf2_ros::TransformBroadcaster동적 변환을 /tf 토픽으로 발행
tf2_ros::StaticTransformBroadcaster정적 변환을 /tf_static 토픽으로 발행
tf2_ros::MessageFilter수신 메시지의 좌표 변환 가용성을 확인한 후 콜백 호출
tf2_ros::CreateTimerInterface비동기 변환 대기를 위한 타이머 인터페이스

3.1.2 Python 클래스

클래스역할
tf2_ros.BufferC++ Buffer의 Python 바인딩
tf2_ros.TransformListenerC++ TransformListener의 Python 바인딩
tf2_ros.TransformBroadcasterC++ TransformBroadcaster의 Python 바인딩
tf2_ros.StaticTransformBroadcasterC++ StaticTransformBroadcaster의 Python 바인딩

3.1.3 실행 가능 노드

tf2_ros 패키지는 다음과 같은 실행 가능 노드를 포함한다.

노드기능
static_transform_publisher명령줄 인자 또는 런치 파일로부터 정적 변환을 발행하는 유틸리티 노드
tf2_echo두 프레임 간의 변환을 실시간으로 출력하는 디버깅 도구
tf2_monitor변환의 발행 빈도와 지연 시간을 모니터링하는 도구

3.2 tf2_ros_py 패키지

tf2_ros_py 패키지는 tf2_ros의 순수 Python 구현을 제공한다. 이 패키지는 tf2_ros의 Python 바인딩과 달리 C++ 라이브러리에 대한 의존성이 없어, Python 전용 환경에서의 사용에 적합하다.

4. 타입 변환 패키지

4.1 tf2_geometry_msgs 패키지

tf2_geometry_msgsgeometry_msgs 패키지에 정의된 메시지 타입에 대한 좌표 변환 함수를 제공한다. 이 패키지는 가장 빈번하게 사용되는 TF2 확장 패키지이다.

4.1.1 지원 메시지 타입

메시지 타입변환 함수
geometry_msgs::msg::PointStampedtf2::doTransform()
geometry_msgs::msg::PoseStampedtf2::doTransform()
geometry_msgs::msg::PoseWithCovarianceStampedtf2::doTransform()
geometry_msgs::msg::Vector3Stampedtf2::doTransform()
geometry_msgs::msg::WrenchStampedtf2::doTransform()
geometry_msgs::msg::QuaternionStampedtf2::doTransform()
geometry_msgs::msg::TransformStampedtf2::doTransform()

4.2 tf2_sensor_msgs 패키지

tf2_sensor_msgs는 센서 데이터 메시지에 대한 좌표 변환을 제공한다.

메시지 타입설명
sensor_msgs::msg::PointCloud23차원 포인트 클라우드의 좌표 프레임 변환

4.3 tf2_eigen 패키지

tf2_eigen은 Eigen 선형대수 라이브러리의 데이터 타입과 TF2 변환 시스템 간의 인터페이스를 제공한다.

Eigen 타입변환 방향
Eigen::Vector3dROS 메시지 ↔ Eigen
Eigen::Affine3dROS 메시지 ↔ Eigen
Eigen::Isometry3dROS 메시지 ↔ Eigen
Eigen::QuaterniondROS 메시지 ↔ Eigen
Eigen::Matrix3dROS 메시지 ↔ Eigen

4.4 tf2_kdl 패키지

tf2_kdl은 Orocos KDL(Kinematics and Dynamics Library)의 데이터 타입과 TF2 변환 시스템 간의 인터페이스를 제공한다.

KDL 타입변환 방향
KDL::VectorROS 메시지 ↔ KDL
KDL::FrameROS 메시지 ↔ KDL
KDL::RotationROS 메시지 ↔ KDL
KDL::TwistROS 메시지 ↔ KDL
KDL::WrenchROS 메시지 ↔ KDL

4.5 tf2_bullet 패키지

tf2_bullet은 Bullet Physics 라이브러리의 데이터 타입과의 변환 인터페이스를 제공한다. Bullet Physics의 btVector3, btQuaternion, btTransform 등의 타입에 대한 tf2::doTransform() 함수를 구현한다.

5. 유틸리티 및 도구 패키지

5.1 tf2_tools 패키지

tf2_tools는 TF2 변환 트리의 시각화 및 분석을 위한 도구를 제공한다.

도구기능
view_frames현재 활성화된 변환 트리를 PDF 파일로 생성하는 Python 스크립트

6. 패키지 의존성 구조

TF2 패키지들의 의존성 구조는 다음과 같은 계층적 관계를 따른다.

tf2_geometry_msgs, tf2_sensor_msgs, tf2_eigen, tf2_kdl, tf2_bullet
        │                    │             │          │          │
        └────────────────────┴─────────────┴──────────┴──────────┘
                                      │
                                  tf2_ros
                                      │
                              ┌───────┴───────┐
                              │               │
                             tf2          tf2_msgs

이 의존성 구조에서 상위 계층의 패키지는 하위 계층의 변경에 영향을 받지만, 하위 계층은 상위 계층에 대한 의존성이 없다. 이러한 설계는 tf2 코어 라이브러리의 안정성을 보장하면서도, 새로운 타입 변환 패키지를 자유롭게 추가할 수 있는 확장성을 제공한다.

7. 설치 및 빌드

ROS 2 Jazzy Jalisco에서 TF2 관련 패키지는 다음 명령으로 설치할 수 있다.

# 기본 TF2 패키지 설치
sudo apt install ros-jazzy-tf2 ros-jazzy-tf2-ros ros-jazzy-tf2-msgs

# 타입 변환 패키지 설치
sudo apt install ros-jazzy-tf2-geometry-msgs ros-jazzy-tf2-sensor-msgs
sudo apt install ros-jazzy-tf2-eigen ros-jazzy-tf2-kdl

# 도구 패키지 설치
sudo apt install ros-jazzy-tf2-tools

colcon 빌드 시스템을 사용하여 소스에서 빌드하는 경우, package.xml에 필요한 TF2 패키지를 의존성으로 선언해야 한다.

<depend>tf2</depend>
<depend>tf2_ros</depend>
<depend>tf2_geometry_msgs</depend>

참고 문헌 및 출처:

  • Open Robotics, “tf2 — ROS 2 Documentation,” ROS 2 Jazzy Jalisco, 2024. https://docs.ros.org/en/jazzy/Concepts/About-Tf2.html
  • Open Robotics, “tf2 API Reference,” ROS 2 Jazzy Jalisco, 2024.
  • Open Robotics, “tf2_ros API Reference,” ROS 2 Jazzy Jalisco, 2024.
  • Open Robotics, “tf2_geometry_msgs API Reference,” ROS 2 Jazzy Jalisco, 2024.