659.8 변환 트리의 방향성과 규칙
1. 변환 트리에서의 방향성 개념
TF2의 변환 트리에서 방향성(directionality)은 좌표 변환의 의미를 정확하게 해석하기 위한 핵심 개념이다. 변환 트리의 각 엣지는 부모 프레임(parent frame)에서 자식 프레임(child frame)으로의 방향을 가지며, 이 방향은 변환 데이터의 발행과 조회에서 일관되게 적용되어야 한다.
2. TransformStamped 메시지의 방향성 규약
TF2에서 변환의 방향성은 geometry_msgs/TransformStamped 메시지의 두 프레임 ID 필드로 정의된다.
| 필드 | 역할 | 트리에서의 위치 |
|---|---|---|
header.frame_id | 부모 프레임 (parent frame) | 트리의 상위 노드 |
child_frame_id | 자식 프레임 (child frame) | 트리의 하위 노드 |
TransformStamped 메시지에 포함된 변환 (R, t)는 다음과 같은 의미를 가진다.
{}^{\text{parent}}T_{\text{child}} = \begin{bmatrix} R & t \\ 0^T & 1 \end{bmatrix}
이 변환은 자식 프레임의 원점과 방향이 부모 프레임에서 어떻게 관측되는지를 기술한다. 즉, 변환의 병진 벡터 t는 부모 프레임에서 관측한 자식 프레임 원점의 좌표이며, 회전 R은 부모 프레임에서 자식 프레임으로의 회전을 나타낸다.
3. 방향성 규칙의 세부 사항
3.1 규칙 1: 변환은 부모에서 자식 방향으로 발행한다
변환을 발행할 때, header.frame_id에는 부모 프레임을, child_frame_id에는 자식 프레임을 지정해야 한다. 이 규칙은 TF2의 트리 구조를 올바르게 구성하기 위한 필수 조건이다.
// 올바른 발행 방향
transform.header.frame_id = "base_link"; // 부모 프레임
transform.child_frame_id = "laser_frame"; // 자식 프레임
3.2 규칙 2: 점 변환은 자식에서 부모 방향으로 수행된다
변환 {}^{\text{parent}}T_{\text{child}}를 사용하여 자식 프레임에서 표현된 점 {}^{\text{child}}p를 부모 프레임의 좌표 {}^{\text{parent}}p로 변환한다.
{}^{\text{parent}}p = {}^{\text{parent}}T_{\text{child}} \cdot {}^{\text{child}}p
이 관계는 변환의 발행 방향과 점 변환의 방향이 반대임을 의미한다. 변환은 부모에서 자식 방향으로 저장되지만, 점 변환은 자식에서 부모 방향으로 수행된다.
3.3 규칙 3: lookupTransform()의 방향 규약
lookupTransform() 함수의 반환값은 소스 프레임(source frame)에서 타겟 프레임(target frame)으로 점을 변환하는 변환이다.
// target_frame에서 source_frame을 관측하는 변환을 반환
auto transform = buffer.lookupTransform(
"target_frame", // 변환 후 좌표를 표현할 프레임
"source_frame", // 원래 데이터가 표현된 프레임
time);
반환된 변환을 적용하면, source_frame에서 표현된 데이터가 target_frame에서의 좌표로 변환된다.
{}^{\text{target}}p = {}^{\text{target}}T_{\text{source}} \cdot {}^{\text{source}}p
3.4 규칙 4: 역방향 변환의 자동 처리
TF2는 트리 구조의 엣지 방향에 관계없이, 임의의 두 프레임 간의 변환을 자동으로 계산한다. 이를 위해, 트리에서 자식에서 부모 방향으로의 변환이 필요한 경우 저장된 변환의 역행렬을 자동으로 계산한다.
{}^{\text{child}}T_{\text{parent}} = \left({}^{\text{parent}}T_{\text{child}}\right)^{-1} = \begin{bmatrix} R^T & -R^T t \\ 0^T & 1 \end{bmatrix}
따라서 사용자는 변환 트리에 저장된 엣지의 방향을 직접 추적할 필요 없이, 원하는 소스 프레임과 타겟 프레임만 지정하면 된다.
4. 방향성 규약의 직관적 이해
4.1 “프레임 A에서 프레임 B로의 변환“의 의미
TF2에서 “프레임 A에서 프레임 B로의 변환“이라는 표현은 두 가지 관점에서 해석할 수 있다.
| 관점 | 의미 |
|---|---|
| 좌표 변환 관점 | 프레임 B에서 표현된 좌표를 프레임 A에서의 좌표로 변환 |
| 프레임 기술 관점 | 프레임 A에서 관측한 프레임 B의 위치와 방향 |
두 관점은 수학적으로 동일한 변환 행렬 {}^{A}T_{B}를 나타내며, TF2에서 lookupTransform("A", "B", time)으로 조회할 수 있다.
4.2 예시: base_link → laser_frame 변환
로봇 본체(base_link) 전방 0.3m, 상부 0.1m 지점에 LiDAR가 장착되어 있고, LiDAR의 방향이 로봇과 동일한 경우:
변환: base_link → laser_frame
병진: t = (0.3, 0.0, 0.1) (base_link에서 관측한 laser_frame의 위치)
회전: q = (0, 0, 0, 1) (회전 없음, 방향 동일)
이 변환을 TransformStamped로 발행할 때:
header.frame_id = "base_link" (부모 프레임)
child_frame_id = "laser_frame" (자식 프레임)
transform.translation = {x: 0.3, y: 0.0, z: 0.1}
transform.rotation = {x: 0, y: 0, z: 0, w: 1}
LiDAR로 측정된 점 {}^{\text{laser}}p = (5.0, 0.0, 0.0)을 base_link 좌표로 변환하면:
{}^{\text{base\_link}}p = {}^{\text{base\_link}}T_{\text{laser}} \cdot {}^{\text{laser}}p = (5.3, 0.0, 0.1)
5. 방향성 관련 일반적 오류
5.1 오류 1: 부모와 자식 프레임의 역전
header.frame_id와 child_frame_id를 반대로 설정하면, 변환 트리의 방향이 역전되어 물리적 현실과 맞지 않는 변환이 생성된다. 이 오류는 시스템이 정상적으로 작동하는 것처럼 보이면서도 모든 좌표 변환 결과가 잘못되는 미묘한 문제를 야기하므로, 주의 깊은 확인이 필요하다.
5.2 오류 2: 변환 의미의 혼동
변환 {}^{A}T_{B}가 “A에서 B로의 변환“인지 “B에서 A로의 변환“인지에 대한 혼동이 발생할 수 있다. TF2의 규약에서 {}^{A}T_{B}는 프레임 A에서 관측한 프레임 B의 위치와 방향을 나타내며, 이를 사용하여 프레임 B에서 표현된 점을 프레임 A로 변환한다.
5.3 오류 3: lookupTransform()의 인자 순서 혼동
lookupTransform(target, source, time)에서 첫 번째 인자가 타겟 프레임(변환 결과를 표현할 프레임)이고, 두 번째 인자가 소스 프레임(원래 데이터가 표현된 프레임)이다. 이 순서를 혼동하면 역변환이 반환되어, 기대와 반대 방향의 변환이 적용된다.
6. 방향성 규칙의 검증
변환의 방향성이 올바르게 설정되었는지 검증하기 위해서는 다음과 같은 방법을 사용할 수 있다.
tf2_echo도구: 두 프레임 간의 변환을 실시간으로 출력하여, 병진 벡터와 회전이 물리적 현실과 일치하는지 확인한다.view_frames도구: 변환 트리를 시각화하여, 부모-자식 관계의 방향이 올바른지 확인한다.- RViz2 시각화: RViz2에서 TF 플러그인을 활성화하여, 각 프레임의 축 방향과 위치가 기대와 일치하는지 시각적으로 확인한다.
참고 문헌 및 출처:
- Foote, T., “tf: The transform library,” 2013 IEEE Conference on Technologies for Practical Robot Applications (TePRA), pp. 1-6, 2013.
- Open Robotics, “tf2 — ROS 2 Documentation,” ROS 2 Jazzy Jalisco, 2024.
- Craig, J.J., Introduction to Robotics: Mechanics and Control, 4th ed., Pearson, 2018.