659.41 변환 보간 (Interpolation) 메커니즘
1. 개요
TF2의 변환 보간(interpolation)은 버퍼에 이산적으로(discretely) 저장된 변환 데이터로부터 임의의 시간에서의 변환을 연속적으로(continuously) 생성하는 메커니즘이다. 변환은 유한한 주파수로 발행되므로, 조회하려는 시간이 두 변환 사이에 위치할 경우 보간이 필수적이다. TF2는 병진(translation) 성분에 대해 선형 보간(Linear Interpolation, LERP)을, 회전(rotation) 성분에 대해 구면 선형 보간(Spherical Linear Interpolation, SLERP)을 자동으로 적용한다. 이 과정은 lookupTransform() 내부에서 투명하게(transparently) 수행되며, 사용자가 명시적으로 보간을 요청할 필요가 없다.
2. 보간의 필요성
2.1 이산적 변환 발행과 연속적 조회 요구
변환 발행 노드는 특정 주파수 f Hz로 변환을 발행한다. 예를 들어, 오도메트리 노드가 50 Hz로 odom → base_link 변환을 발행하면, 캐시에는 20 ms 간격으로 변환이 저장된다. 그러나 센서 데이터의 타임스탬프는 변환 발행 시간과 정확히 일치하지 않으므로, 두 변환 사이의 임의 시간에서의 변환이 필요하다.
t_n < t_{\text{query}} < t_{n+1}
여기서 t_n과 t_{n+1}은 캐시에 저장된 연속적인 두 변환의 시간이고, t_{\text{query}}는 조회 요청 시간이다.
2.2 보간 없이 발생하는 문제
보간을 수행하지 않고 가장 가까운 변환을 선택하는 최근접 이웃(nearest-neighbor) 방식을 사용하면, 다음과 같은 문제가 발생한다.
- 공간적 불연속: 변환의 급격한 전환이 발생하여, 변환된 데이터에 계단 현상(staircasing)이 나타난다.
- 시간적 지터(jitter): 변환 결과가 조회 시간에 따라 불규칙하게 변동한다.
- 정확도 저하: 변환 발행 주파수가 낮을수록 오차가 증가한다.
3. 보간 비율 (Interpolation Ratio)
보간의 핵심은 보간 비율 \alpha의 계산이다. 시간 t_n과 t_{n+1} 사이의 시간 t_{\text{query}}에 대하여:
\alpha = \frac{t_{\text{query}} - t_n}{t_{n+1} - t_n}
이 비율은 0 \leq \alpha \leq 1의 범위를 가지며, 다음과 같은 의미를 가진다.
| \alpha 값 | 의미 |
|---|---|
| \alpha = 0 | 정확히 t_n의 변환 |
| \alpha = 0.5 | 두 변환의 정중앙 |
| \alpha = 1 | 정확히 t_{n+1}의 변환 |
| 0 < \alpha < 1 | 두 변환 사이의 보간 |
4. 병진 성분의 보간: LERP
병진 벡터 \mathbf{p}에 대해서는 선형 보간(LERP)을 적용한다.
\mathbf{p}(\alpha) = (1 - \alpha) \cdot \mathbf{p}(t_n) + \alpha \cdot \mathbf{p}(t_{n+1})
각 성분별로 전개하면:
\begin{aligned} x(\alpha) &= (1 - \alpha) \cdot x_n + \alpha \cdot x_{n+1} \\ y(\alpha) &= (1 - \alpha) \cdot y_n + \alpha \cdot y_{n+1} \\ z(\alpha) &= (1 - \alpha) \cdot z_n + \alpha \cdot z_{n+1} \end{aligned}
LERP는 두 점을 연결하는 직선 위의 점을 생성한다. 로봇의 병진 운동이 등속 직선 운동에 가까운 경우, LERP는 매우 정확한 보간 결과를 제공한다. 변환 발행 주파수가 충분히 높으면(>20 Hz), 비등속 운동에서도 LERP의 오차는 무시할 수 있는 수준이다.
5. 회전 성분의 보간: SLERP
회전 성분은 쿼터니언(quaternion)으로 표현되며, 단순한 선형 보간 대신 구면 선형 보간(SLERP)을 적용한다.
5.1 SLERP의 필요성
쿼터니언에 LERP를 직접 적용하면 다음과 같은 문제가 발생한다.
- 정규화 위반: 보간된 쿼터니언이 단위 쿼터니언이 아니게 된다. 즉, \|\mathbf{q}\| \neq 1이 될 수 있다.
- 비등속 각속도: 보간된 회전의 각속도가 일정하지 않다. 시작과 끝에서는 느리고 중간에서는 빠르게 회전한다.
- 왜곡된 회전 경로: 4차원 쿼터니언 공간에서의 직선 경로는 3차원 회전 공간(SO(3))에서의 최단 경로가 아니다.
5.2 SLERP의 수학적 정의
두 단위 쿼터니언 \mathbf{q}_0와 \mathbf{q}_1 사이의 SLERP는 다음과 같이 정의된다.
\text{SLERP}(\mathbf{q}_0, \mathbf{q}_1, \alpha) = \frac{\sin((1-\alpha)\theta)}{\sin\theta} \mathbf{q}_0 + \frac{\sin(\alpha\theta)}{\sin\theta} \mathbf{q}_1
여기서 \theta는 두 쿼터니언 사이의 각도이며, 내적(dot product)으로 계산된다.
\theta = \cos^{-1}(\mathbf{q}_0 \cdot \mathbf{q}_1) = \cos^{-1}(x_0 x_1 + y_0 y_1 + z_0 z_1 + w_0 w_1)
5.3 SLERP의 특수 경우 처리
TF2 내부에서는 다음과 같은 특수 경우를 처리한다.
\theta \approx 0 (거의 동일한 회전): \sin\theta \approx 0이 되어 분모가 0에 가까워지는 수치적 불안정이 발생한다. 이 경우 NLERP(Normalized LERP)로 대체한다.
\text{NLERP}(\mathbf{q}_0, \mathbf{q}_1, \alpha) = \frac{(1 - \alpha) \mathbf{q}_0 + \alpha \mathbf{q}_1}{\|(1 - \alpha) \mathbf{q}_0 + \alpha \mathbf{q}_1\|}
\mathbf{q}_0 \cdot \mathbf{q}_1 < 0 (반대 반구): 쿼터니언은 \mathbf{q}와 -\mathbf{q}가 동일한 회전을 나타내므로, 내적이 음수인 경우 더 짧은 경로를 따르기 위해 한쪽 쿼터니언의 부호를 반전한다.
\text{if } \mathbf{q}_0 \cdot \mathbf{q}_1 < 0 \text{, then } \mathbf{q}_1 \leftarrow -\mathbf{q}_1
6. TF2 보간의 전체 알고리즘
TF2에서 보간을 수행하는 전체 절차를 의사 코드로 나타내면 다음과 같다.
function interpolateTransform(t_query, cache):
// 1. 조회 시간을 감싸는 두 변환 찾기
(T_n, T_{n+1}) = findBracketingTransforms(t_query, cache)
// 2. 보간 비율 계산
alpha = (t_query - t_n) / (t_{n+1} - t_n)
// 3. 병진 성분 LERP
translation = (1 - alpha) * T_n.translation + alpha * T_{n+1}.translation
// 4. 회전 성분 SLERP
rotation = slerp(T_n.rotation, T_{n+1}.rotation, alpha)
// 5. 보간된 변환 구성
return TransformStamped(translation, rotation, t_query)
7. 보간 정확도에 영향을 미치는 요인
7.1 변환 발행 주파수
변환 발행 주파수가 높을수록 보간 구간이 짧아지고, 보간 오차가 감소한다.
| 발행 주파수 | 보간 구간 | 최대 병진 오차 (1 m/s 시) | 최대 회전 오차 (1 rad/s 시) |
|---|---|---|---|
| 10 Hz | 100 ms | ≈ 50 mm | ≈ 2.87° |
| 50 Hz | 20 ms | ≈ 10 mm | ≈ 0.57° |
| 100 Hz | 10 ms | ≈ 5 mm | ≈ 0.29° |
| 500 Hz | 2 ms | ≈ 1 mm | ≈ 0.06° |
위 표의 오차는 등속 운동을 가정한 이상적 조건에서의 값이며, 가속 운동에서는 LERP/SLERP의 선형 근사로 인해 추가적인 오차가 발생한다.
7.2 운동의 비선형성
급격한 가속, 감속, 또는 방향 전환이 있는 경우, 선형 보간의 오차가 증가한다. 이러한 상황에서는 변환 발행 주파수를 높이거나, 고차 보간(cubic interpolation, spline interpolation) 방법의 적용을 고려할 수 있다. 다만, TF2의 현재 구현은 1차 보간(LERP/SLERP)만 지원한다.
7.3 정적 변환의 보간
정적 변환(static transform)은 시간에 독립적이므로 보간이 적용되지 않는다. 정적 변환은 캐시에 단일 항목으로 저장되며, 조회 시간에 관계없이 항상 동일한 값을 반환한다.
8. 보간과 외삽의 경계
보간(interpolation)은 두 데이터 사이의 값을 생성하는 것이고, 외삽(extrapolation)은 데이터 범위 밖의 값을 생성하는 것이다. TF2는 기본적으로 보간만 수행하며, 외삽은 제한적으로만 허용한다.
\begin{cases} \text{보간} & t_n \leq t_{\text{query}} \leq t_{n+1} \\ \text{외삽} & t_{\text{query}} < t_{\text{earliest}} \text{ 또는 } t_{\text{query}} > t_{\text{latest}} \end{cases}
외삽을 시도하면 tf2::ExtrapolationException이 발생한다. 이는 데이터 범위 밖에서의 예측이 신뢰할 수 없기 때문이다.
9. 변환 체인에서의 독립적 보간
변환 체인의 각 구간에서 보간이 독립적으로 수행된다. 예를 들어, map → odom → base_link 경로에서 조회 시간 t_{\text{query}}가 주어지면:
map → odom변환은 t_{\text{query}}에서 보간된다.odom → base_link변환은 동일한 t_{\text{query}}에서 보간된다.- 두 보간된 변환이 합성되어 최종 결과를 산출한다.
이 과정에서 각 구간의 발행 주파수가 서로 다르더라도, 각 구간에서 독립적으로 정확한 보간이 수행되므로 시간 동기화가 보장된다.
10. 보간과 성능
10.1 연산 비용
보간은 lookupTransform() 호출 시 자동으로 수행되며, 추가적인 연산 비용이 발생한다.
- LERP: 3회의 곱셈과 3회의 덧셈 (O(1))
- SLERP: 삼각 함수 연산 포함하여 약 20~30회의 부동 소수점 연산 (O(1))
이 연산 비용은 매우 낮으므로, 보간으로 인한 성능 저하는 실질적으로 무시할 수 있다.
10.2 캐시 탐색 비용
보간을 위해 조회 시간을 감싸는 두 변환을 캐시에서 찾아야 한다. TF2의 내부 캐시는 시간순으로 정렬된 원형 버퍼(circular buffer)로 구현되어 있어, 이진 탐색(binary search)을 통해 O(\log n)의 시간 복잡도로 탐색할 수 있다. 여기서 n은 캐시에 저장된 변환의 수이다.
11. 요약
TF2의 변환 보간은 이산적으로 발행되는 변환 데이터로부터 연속적인 시간 도메인의 변환을 자동으로 생성하는 핵심 메커니즘이다. 병진 성분에는 LERP를, 회전 성분에는 SLERP를 독립적으로 적용하며, 변환 체인의 각 구간에서 독립적으로 수행된다. 보간의 정확도는 변환 발행 주파수와 운동의 선형성에 의존하며, 연산 비용은 매우 낮아 실시간 성능에 영향을 미치지 않는다.
참고 문헌 및 출처
- Shoemake, K., “Animating Rotation with Quaternion Curves,” ACM SIGGRAPH Computer Graphics, Vol. 19, No. 3, pp. 245-254, 1985.
- Foote, T., “tf: The Transform Library,” Proceedings of IEEE Conference on Technologies for Practical Robot Applications (TePRA), 2013.
- ROS 2 공식 문서, “tf2_ros::Buffer API Reference,” https://docs.ros2.org/latest/api/tf2_ros/classtf2__ros_1_1Buffer.html (ROS 2 Humble Hawksbill)
- ROS 2 소스 코드, “tf2/buffer_core.cpp,” https://github.com/ros2/geometry2 (geometry2 리포지토리)
- Dam, E.B., Koch, M., Lillholm, M., “Quaternions, Interpolation and Animation,” Technical Report DIKU-TR-98/5, University of Copenhagen, 1998.