intermediate - tf2

Overview

tf2좌표 프레임(Coordinate Frame) 변환 라이브러리다. 여러 좌표계를 시간에 따라 추적하고, 두 프레임 사이에서 원하는 시점의 점·벡터 등을 변환할 수 있게 한다. 프레임 간 관계를 트리 구조로 유지하며 시간에 따라 버퍼링한다.

Properties of tf2 (특성)

로봇 시스템에는 world, base, gripper, head 등 시간에 따라 바뀌는 3D 좌표계가 많다. tf2는 이들을 추적해 다음 같은 질의를 가능하게 한다.

  • 5초 전 head 프레임이 world 프레임 기준으로 어디 있었는가?
  • 그리퍼 안 물체의 pose를 base 기준으로 하면?
  • base 프레임의 현재 pose를 map 프레임 기준으로 하면?

분산 시스템에서 동작한다. 한 로봇의 모든 좌표 프레임 정보가 시스템 내 어떤 컴퓨터의 ROS 2 노드에서든 접근 가능하다. 각 노드가 자체 변환 DB를 만들거나, 중앙 노드가 변환 정보를 모아 저장하는 방식 모두 가능하다.

Publishing transforms (변환 발행)

변환을 발행할 때는 보통 “한 프레임에서 다른 프레임으로의 변환”으로 생각한다. 데이터를 그 프레임에서 표현하는 것과 프레임 자체를 변환하는 것은 서로 역관계다. geometry_msgs/msg/Transform 메시지에 담는 값은 프레임 표현 쪽이다. 디버깅 시 발행한 변환은, 트리에서 어느 방향으로 조회하느냐에 따라 lookup 결과의 역이 될 수 있음을 염두에 두면 된다. tf2 라이브러리가 트리 탐색 방향에 맞춰 역변환을 처리해 준다.

Position (위치)

한 프레임에서 관측한 점을 다른 프레임으로 옮기려면 소스 프레임 → 타깃 프레임 변환을 적용한다. lookupTransform에서 소스frame_id A, 타깃frame_id B이면, “A에서 본 것을 B에서 본 좌표로” 변환하는 변환이 나온다. 가능하면 transform<T>(target_frame, ...) 를 쓰는 것이 좋다. 소스 frame_id는 데이터 타입에서 읽고, 결과의 타깃 frame_id를 채우며, 수식은 내부에서 처리된다.

예: 루트 프레임 A가 프레임 B보다 1m 아래면, A→B 변환은 양수(위로). 데이터를 B에서 A로 바꿀 때는 이 변환의 을 써야 한다(기준이 낮아지므로 높이에 더해짐). A에서 B로 변환하면 기준이 높아지므로 높이는 줄어든다.

Velocity (속도)

속도는 세 가지 정보로 표현한다. “움직이는 프레임 대 기준 프레임”의 속도를 관측 프레임에서 본 값이다. 예: 자동차 A의 운전자가 “지면 대비 전방 1m/s”를 A에서 관측하면 (1,0,0). 같은 속도를 지면(E)에서 보면 (0,1,0)처럼 다른 벡터가 될 수 있다. tf2 변환으로 두 표현이 동일한 속도임을 맞출 수 있다. 속도는 같은 관측 프레임에서만 더하거나 빼야 하고, 비교할 때는 먼저 같은 관측 프레임으로 변환해야 한다.

Tutorials (튜토리얼)

tf2 사용은 크게 변환 수신(리스너)변환 발행(브로드캐스터) 두 가지다.

  • 리스너: 시스템에서 발행되는 좌표 프레임을 수신·버퍼하고, 특정 프레임 간 변환을 조회한다. Writing a listener (Python / C++) 참고.
  • 브로드캐스터: 로봇의 한 부분에 해당하는 좌표 프레임의 상대 pose를 시스템에 발행한다. Writing a broadcaster (Python / C++) 참고.
  • 정적 브로드캐스터: 시간에 따라 변하지 않는 변환은 한 번만 발행하고 이력은 저장하지 않는다. 저장·조회 부담과 발행 오버헤드를 줄인다. Writing a static broadcaster (Python / C++) 참고.
  • 프레임 추가: Adding a frame (Python / C++)에서 고정/동적 프레임을 트리에 넣는 방법을 다룬다.
  • tf2와 시간: Using time, Traveling in time (C++)에서 과거/미래 시점 조회를 다룬다.

튜토리얼 목록은 공식 tf2 tutorials 페이지 참고.

Paper

tf2의 이론적 배경: “tf: The transform library”, TePRA 2013.


참고: Tf2 — ROS 2 Jazzy