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::Buffer | tf2::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.Buffer | C++ Buffer의 Python 바인딩 |
tf2_ros.TransformListener | C++ TransformListener의 Python 바인딩 |
tf2_ros.TransformBroadcaster | C++ TransformBroadcaster의 Python 바인딩 |
tf2_ros.StaticTransformBroadcaster | C++ 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_msgs는 geometry_msgs 패키지에 정의된 메시지 타입에 대한 좌표 변환 함수를 제공한다. 이 패키지는 가장 빈번하게 사용되는 TF2 확장 패키지이다.
4.1.1 지원 메시지 타입
| 메시지 타입 | 변환 함수 |
|---|---|
geometry_msgs::msg::PointStamped | tf2::doTransform() |
geometry_msgs::msg::PoseStamped | tf2::doTransform() |
geometry_msgs::msg::PoseWithCovarianceStamped | tf2::doTransform() |
geometry_msgs::msg::Vector3Stamped | tf2::doTransform() |
geometry_msgs::msg::WrenchStamped | tf2::doTransform() |
geometry_msgs::msg::QuaternionStamped | tf2::doTransform() |
geometry_msgs::msg::TransformStamped | tf2::doTransform() |
4.2 tf2_sensor_msgs 패키지
tf2_sensor_msgs는 센서 데이터 메시지에 대한 좌표 변환을 제공한다.
| 메시지 타입 | 설명 |
|---|---|
sensor_msgs::msg::PointCloud2 | 3차원 포인트 클라우드의 좌표 프레임 변환 |
4.3 tf2_eigen 패키지
tf2_eigen은 Eigen 선형대수 라이브러리의 데이터 타입과 TF2 변환 시스템 간의 인터페이스를 제공한다.
| Eigen 타입 | 변환 방향 |
|---|---|
Eigen::Vector3d | ROS 메시지 ↔ Eigen |
Eigen::Affine3d | ROS 메시지 ↔ Eigen |
Eigen::Isometry3d | ROS 메시지 ↔ Eigen |
Eigen::Quaterniond | ROS 메시지 ↔ Eigen |
Eigen::Matrix3d | ROS 메시지 ↔ Eigen |
4.4 tf2_kdl 패키지
tf2_kdl은 Orocos KDL(Kinematics and Dynamics Library)의 데이터 타입과 TF2 변환 시스템 간의 인터페이스를 제공한다.
| KDL 타입 | 변환 방향 |
|---|---|
KDL::Vector | ROS 메시지 ↔ KDL |
KDL::Frame | ROS 메시지 ↔ KDL |
KDL::Rotation | ROS 메시지 ↔ KDL |
KDL::Twist | ROS 메시지 ↔ KDL |
KDL::Wrench | ROS 메시지 ↔ 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.