4.3 TF2 트리 설계

4.3.1 트리는 하나의 부모를 갖는다

TF2는 시간에 따라 변하는 프레임 관계를 버퍼에 저장한다. 각 child frame은 한 시점에 하나의 parent를 가져야 한다. 같은 camera_link를 두 Node가 서로 다른 부모로 broadcast하면 트리가 흔들리거나 조회 결과가 불안정해진다.

  • 고정 마운트: StaticTransformBroadcaster
  • 관절에 따라 변함: robot_state_publisher 또는 동적 broadcaster
  • 월드 localization: localization/SLAM Node

code/ros2_jazzy/sensor_pipeline/sensor_pipeline/static_camera_tf.py는 tool0 -> camera_link -> camera_optical_frame의 고정 변환을 방송한다. 실제 값은 캘리브레이션 결과로 교체한다.

4.3.2 timestamp가 있는 조회

“최신 transform”으로 모든 과거 이미지를 변환하면 움직이는 로봇에서 공간 오차가 생긴다. 이미지 header timestamp에 해당하는 transform을 조회한다.

transform = tf_buffer.lookup_transform(
    "base_link",
    image.header.frame_id,
    image.header.stamp,
    timeout=Duration(seconds=0.05),
)

필요한 transform이 아직 버퍼에 없으면 기다리거나 해당 표본을 누락 처리한다. 미래 extrapolation 오류를 피하려고 timestamp를 0으로 바꾸면 데이터는 흐르지만 의미가 틀릴 수 있다.

4.3.3 TF 진단

ros2 run tf2_tools view_frames
ros2 run tf2_ros tf2_echo base_link camera_optical_frame

예상 출력 예시

At time 1710000000.033
Translation: [0.083, -0.012, 0.115]
Rotation (xyzw): [0.500, -0.500, 0.500, -0.500]

숫자만 보지 말고 RViz의 axes와 알려진 물체의 projection으로 방향을 검증한다.

이 장의 예제 코드·설정 파일 (12)

이 장의 자가 점검·가상실습