659.12 정적 변환 (Static Transform)의 정의와 특성
1. 정적 변환의 정의
정적 변환(static transform)은 시간에 따라 변하지 않는 고정된 좌표 프레임 간의 공간적 관계를 정의하는 변환이다. 수학적으로, 정적 변환 {}^{P}T_{C}는 시간 t에 대한 의존성이 없는 상수 변환이다.
\frac{d}{dt} {}^{P}T_{C} = 0, \quad \forall t
즉, 부모 프레임 \{P\}에서 관측한 자식 프레임 \{C\}의 위치와 방향이 시스템의 전체 동작 기간 동안 일정하다.
2. 정적 변환의 물리적 의미
정적 변환은 물리적으로 강체 결합(rigid coupling)된 두 구성 요소 간의 고정된 공간적 관계를 나타낸다. 대표적인 예시는 다음과 같다.
2.1 센서 장착 위치
로봇 본체에 볼트나 브래킷으로 고정된 센서의 장착 위치와 방향은 정적 변환으로 표현된다. 센서가 로봇 본체에 물리적으로 고정되어 있으므로, 센서 프레임과 base_link 프레임 간의 상대적 위치와 방향은 시간에 따라 변하지 않는다.
| 변환 | 설명 |
|---|---|
base_link → laser_frame | LiDAR 센서의 장착 위치 |
base_link → camera_link | 카메라의 장착 위치 |
base_link → imu_link | IMU 센서의 장착 위치 |
camera_link → camera_optical_frame | 카메라 본체와 광학 프레임 간의 관계 |
2.2 로봇 구조의 고정 요소
로봇의 기계적 구조 중 관절이 없는 고정된 부분의 프레임 관계도 정적 변환이다.
| 변환 | 설명 |
|---|---|
base_link → base_footprint | 로봇 본체와 지면 투영 간의 관계 |
arm_base_link → shoulder_link (고정 부분) | 매니퓰레이터의 고정 기저 오프셋 |
3. TF2에서의 정적 변환 관리
3.1 /tf_static 토픽
정적 변환은 /tf_static 토픽을 통해 발행된다. 이 토픽은 동적 변환이 발행되는 /tf 토픽과 분리되어 있으며, 다음과 같은 특수한 QoS(Quality of Service) 설정을 사용한다.
| QoS 설정 | 값 | 설명 |
|---|---|---|
| Reliability | RELIABLE | 메시지 전달 보장 |
| Durability | TRANSIENT_LOCAL | 늦게 참여하는 구독자에게도 전달 |
| History | KEEP_ALL | 모든 정적 변환 유지 |
TRANSIENT_LOCAL durability 설정은 정적 변환의 핵심적인 특성이다. 이 설정에 의해, 정적 변환을 발행한 후에 나중에 시작된 노드(TransformListener)도 이전에 발행된 모든 정적 변환을 자동으로 수신할 수 있다. 이는 시스템 시작 순서에 대한 의존성을 제거하여 시스템의 견고성을 향상시킨다.
3.2 StaticTransformBroadcaster
정적 변환은 tf2_ros::StaticTransformBroadcaster 클래스를 통해 발행한다. 이 클래스는 동적 변환을 발행하는 TransformBroadcaster와 별도로 제공되며, /tf_static 토픽에 대한 발행자(publisher)를 내부적으로 관리한다.
// C++ 예시
auto static_broadcaster = std::make_shared<tf2_ros::StaticTransformBroadcaster>(node);
geometry_msgs::msg::TransformStamped static_transform;
static_transform.header.stamp = node->get_clock()->now();
static_transform.header.frame_id = "base_link";
static_transform.child_frame_id = "laser_frame";
static_transform.transform.translation.x = 0.3;
static_transform.transform.translation.y = 0.0;
static_transform.transform.translation.z = 0.1;
static_transform.transform.rotation.w = 1.0;
static_broadcaster->sendTransform(static_transform);
3.3 StaticCache에서의 저장
BufferCore 내부에서 정적 변환은 StaticCache에 저장된다. StaticCache는 시간 인덱스를 사용하지 않고 단일 변환만을 저장하는 간소화된 캐시 구조이다. 정적 변환을 조회할 때, 요청된 시간에 관계없이 항상 동일한 변환이 반환된다.
4. 정적 변환의 특성
4.1 시간 독립성
정적 변환은 조회 시간에 무관하게 항상 동일한 값을 반환한다. lookupTransform()에 어떤 시간을 지정하든, 정적 변환으로 정의된 프레임 쌍의 변환은 일정하다.
4.2 발행 효율성
정적 변환은 한 번만 발행하면 되므로, 주기적인 재발행이 필요한 동적 변환에 비해 네트워크 대역폭을 크게 절감할 수 있다. 예를 들어, 10개의 센서를 탑재한 로봇에서 센서 장착 위치를 동적 변환으로 10Hz 주기로 발행하면 초당 100개의 메시지가 필요하지만, 정적 변환으로 발행하면 시스템 시작 시 단 10개의 메시지만 필요하다.
4.3 메모리 효율성
정적 변환은 StaticCache에 단일 항목으로 저장되므로, 시간대별 이력을 유지하는 동적 변환의 TimeCache에 비해 메모리 사용량이 매우 적다.
4.4 캐시 기간 무관
정적 변환은 BufferCore의 캐시 기간(cache duration) 설정에 영향을 받지 않는다. 동적 변환은 캐시 기간이 초과되면 삭제되지만, 정적 변환은 BufferCore가 존재하는 한 영구적으로 유지된다.
5. static_transform_publisher 유틸리티
ROS2에서는 런치 파일이나 명령줄에서 직접 정적 변환을 발행할 수 있는 static_transform_publisher 노드를 제공한다.
# 명령줄 사용 (쿼터니언 지정)
ros2 run tf2_ros static_transform_publisher \
--x 0.3 --y 0.0 --z 0.1 \
--qx 0.0 --qy 0.0 --qz 0.0 --qw 1.0 \
--frame-id base_link --child-frame-id laser_frame
# 명령줄 사용 (오일러 각 지정)
ros2 run tf2_ros static_transform_publisher \
--x 0.3 --y 0.0 --z 0.1 \
--roll 0.0 --pitch 0.0 --yaw 0.0 \
--frame-id base_link --child-frame-id laser_frame
런치 파일에서의 사용 예시:
from launch_ros.actions import Node
static_tf_node = Node(
package='tf2_ros',
executable='static_transform_publisher',
arguments=[
'--x', '0.3', '--y', '0.0', '--z', '0.1',
'--qx', '0.0', '--qy', '0.0', '--qz', '0.0', '--qw', '1.0',
'--frame-id', 'base_link', '--child-frame-id', 'laser_frame'
]
)
6. 정적 변환의 정확성과 캘리브레이션
정적 변환의 값은 센서의 물리적 장착 위치와 방향에 의해 결정된다. 이 값의 정확성은 로봇 시스템의 전체 성능에 직접적인 영향을 미친다. 부정확한 정적 변환은 센서 융합의 오차, 네비게이션 경로의 왜곡, 매니퓰레이션의 위치 오차 등을 야기한다.
정적 변환의 정확도를 확보하기 위해 다음과 같은 방법을 사용한다.
- CAD 데이터 활용: 로봇의 3D 설계 데이터(CAD)에서 센서 장착 위치를 추출한다.
- 물리적 측정: 측정 도구를 사용하여 센서 위치를 직접 측정한다.
- 외적 캘리브레이션(Extrinsic Calibration): 카메라-LiDAR 캘리브레이션, 카메라-IMU 캘리브레이션 등의 자동화된 캘리브레이션 절차를 적용한다.
참고 문헌 및 출처:
- Open Robotics, “tf2 — ROS 2 Documentation,” ROS 2 Jazzy Jalisco, 2024.
- Open Robotics, “tf2_ros — static_transform_publisher,” ROS 2 Jazzy Jalisco, 2024.
- Foote, T., “tf: The transform library,” 2013 IEEE Conference on Technologies for Practical Robot Applications (TePRA), pp. 1-6, 2013.