[Physical AI W2D1 · 4/6]
같은 점도 base_link 기준이냐 map 기준이냐에 따라 값이 달라진다. 좌표계가 필요한 이유부터 2D 회전·이동, 그리고 회전과 이동을 하나의 행렬로 묶는 동차 변환 행렬까지 — RViz에서 본 TF 축의 수학적 정체를 잡는다.
이 글에서 잡는 개념
- 왜 좌표계가 필요한가 (frame_id의 수학적 뿌리)
- 전역(map·odom) vs 지역(base_link·laser·camera_link) 좌표계
- 2D 위치·자세(x, y, θ), 회전 행렬, 이동
- 동차 좌표와 2D 동차 변환 행렬 — 회전+이동을 하나의 행렬로
- 표기법T_A_B, 행렬 곱셈 순서, 역변환
(3편까지 RViz로 좌표축(TF)을 눈으로 봤습니다. 이제 그 축과 변환의 수학을 잡습니다. 운동학(Week2)의 핵심입니다.)
1. 왜 좌표계가 필요한가
로봇의 위치·방향·센서 데이터·경로·목표점은 모두 공간 안에서 의미를 가집니다. 그런데 공간상의 위치를 말하려면 반드시 기준이 필요합니다. "앞에 있다"는 말은 누구 기준이냐에 따라 달라지죠.
로봇 앞 장애물 하나도 기준에 따라 값이 완전히 달라집니다.
로봇 기준: 앞으로 2m, 왼쪽 0.5m
지도 기준: x = 4.2m, y = 1.8m
LiDAR 기준: 각도 15도, 거리 2.1m
그래서 ROS 2 메시지의 header.frame_id 가 중요합니다(2편). 값만으로는 공간적 의미를 알 수 없고, 어느 좌표계 기준인지 알아야 합니다.
x = 1.0, y = 0.0
→ base_link 기준이면: 로봇 앞 1m
→ map 기준이면: 지도 원점에서 x로 1m
같은 숫자라도 좌표계가 다르면 의미가 완전히 다릅니다. 좌표계는 단순 수학이 아니라 센서 데이터를 올바르게 해석하는 기본 구조입니다.
2. 전역 좌표계 vs 지역 좌표계
| 구분 | 의미 | 예 |
|---|---|---|
| 전역 좌표계 | 전체 공간 기준(로봇이 어디 있든 동일) | map, world |
| 지역 좌표계 | 특정 물체·센서 기준 | base_link, laser, camera_link |
- 전역: 지도 안 어디에 있는지, 목표가 어디인지(전체 위치 표현에 유리).
- 지역: 로봇 앞에 장애물이 있는지, 센서가 본체 어디에 붙었는지(상대 위치에 유리).
이동 로봇의 전형적 좌표계 트리(2·3편의 그 트리):
map
└── odom
└── base_link
├── laser
└── camera_link
3. 2D 위치와 자세
2D 평면에서 점은 (x, y)로 표현합니다.
p = (2, 1) # 원점에서 x로 2, y로 1
그런데 로봇은 위치만이 아니라 방향도 가집니다. 그래서 2D 이동 로봇의 자세는:
pose = (x, y, θ)
θ는 로봇이 바라보는 방향. 이 (x, y, θ) 표현이 Odometry·경로 계획·위치 추정·TF의 기본입니다.
4. 2D 회전 — 회전 행렬
회전은 원점은 그대로 두고 축의 방향을 돌립니다. 각도 θ만큼 회전하는 회전 행렬:
R(θ) =
[ cosθ -sinθ ]
[ sinθ cosθ ]
점 p를 θ만큼 회전한 결과:
[ x' ] [ cosθ -sinθ ] [ x ]
[ y' ] = [ sinθ cosθ ] [ y ]
로봇이 방향을 바꾸면 로봇 기준 축도 함께 회전합니다. 그래서 로봇 기준으로 측정한 점을 지도 기준으로 바꾸려면 회전 변환이 필요합니다.
5. 2D 이동 — 평행이동
이동은 원점이 다른 위치로 옮겨지는 것. x·y 이동량 t = (tx, ty):
[ x' ] [ x ] [ tx ]
[ y' ] = [ y ] + [ ty ]
예: (1, 2)를 x로 3, y로 1 이동 → (4, 3).
센서 장착 위치도 이동 변환입니다 — LiDAR가 본체 앞 0.25m면 base_link → laser는 tx=0.25, ty=0.0.
6. 회전과 이동을 함께 — 동차 좌표
로봇에서 좌표계 관계는 회전과 이동을 동시에 가집니다(예: 카메라가 앞쪽에 + 아래로 기울어짐). 일반 좌표로는 회전은 곱(Rp), 이동은 덧셈(+t)이라 따로 다뤄야 합니다.
p' = Rp + t ← 회전(곱) + 이동(덧셈), 따로
이걸 하나의 행렬 곱으로 합치려고, 점에 1을 추가합니다. 이게 동차 좌표(homogeneous coordinates) 입니다.
일반: p = [x, y]ᵀ 동차: p = [x, y, 1]ᵀ
동차 좌표를 쓰면:
p' = T·p ← 회전+이동을 한 번에!
T가 동차 변환 행렬입니다. 좌표계 변환을 여러 번 연결할 때 행렬 곱만으로 전체를 계산할 수 있어 로봇공학에서 핵심입니다.
7. 2D 동차 변환 행렬
2D 동차 변환 행렬의 구조 — 회전 성분 + 이동 성분 + 고정 행 [0 0 1]:
T =
[ cosθ -sinθ tx ]
[ sinθ cosθ ty ]
[ 0 0 1 ]
| 항목 | 의미 |
|---|---|
cosθ, sinθ |
회전 성분 |
tx, ty |
x·y 이동량 |
[0 0 1] |
동차 좌표 계산용 고정 행 |
점에 적용:
[ x' ] [ cosθ -sinθ tx ] [ x ]
[ y' ] = [ sinθ cosθ ty ] [ y ]
[ 1 ] [ 0 0 1 ] [ 1 ]
직접 계산해보기 — 90도 회전한 로봇
로봇(base_link)이 odom 기준 x=2.0, y=1.0, θ=90°에 있다고 합시다. cos90°=0, sin90°=1이므로:
T =
[ 0 -1 2 ]
[ 1 0 1 ]
[ 0 0 1 ]
로봇 기준 앞쪽 1m 점 p_base = [1, 0, 1]ᵀ를 odom 기준으로:
p_odom = T · p_base
[ x' ] [ 0 -1 2 ] [ 1 ] [ 2 ]
[ y' ] = [ 1 0 1 ] [ 0 ] = [ 2 ]
[ 1 ] [ 0 0 1 ] [ 1 ] [ 1 ]
→ odom 기준 (2, 2). 로봇이 90도 돌았으니 "로봇의 앞쪽"이 odom의 y 방향이 된 것이죠. (회전 안 했다면 x로 갔을 겁니다.) 이게 좌표 변환의 핵심 직관입니다.
8. 점 변환 vs 좌표계 변환 + 표기법
반드시 구분할 두 가지:
- 점 변환: 한 점의 좌표를 다른 기준으로 표현 (예: 장애물 위치
base_link → odom) - 좌표계 변환: 두 좌표계 사이의 위치·방향 관계 (예:
odom → base_link관계 자체)
ROS 2 TF가 발행하는 Transform은 좌표계 관계이고, 그걸 이용해 점을 변환합니다.
표기법 — 기준을 명확히 하려고 T_A_B를 씁니다.
T_A_B = B 기준 좌표를 A 기준으로 변환하는 행렬
p_A = T_A_B · p_B
예:
T_odom_base→base_link점을odom기준으로:p_odom = T_odom_base · p_baseT_base_laser→laser점을base_link기준으로:p_base = T_base_laser · p_laser
9. 행렬 곱셈 순서 — 체인
행렬 곱은 순서를 바꾸면 결과가 다릅니다(AB ≠ BA). 회전 후 이동 ≠ 이동 후 회전.
여러 좌표계를 연결할 땐 중간 좌표계 이름이 이어지는지 확인합니다. LiDAR 점을 odom까지:
p_odom = T_odom_base · T_base_laser · p_laser
odom ← base_link ← laser ← 중간 base가 맞물림 ✓
적용 순서는 오른쪽에서 왼쪽: ① p_laser에 T_base_laser → ② 결과에 T_odom_base → ③ p_odom.
잘못된 순서: T_base_laser · T_odom_base ← 좌표계 연결이 안 맞음 ✗
⚠️ 로봇 좌표 변환 오류는 대부분 ① 곱셈 순서 ② frame 이름 혼동 ③ 부모/자식 방향 혼동에서 나옵니다.
10. 역변환
반대 방향 변환이 필요할 때 역행렬을 씁니다.
T_odom_base: p_odom = T_odom_base · p_base
역변환: p_base = T_base_odom · p_odom
T_base_odom = inverse(T_odom_base)
역변환은 이동을 되돌리고, 회전을 되돌리고, 기준 좌표계를 반대로 바꿉니다.
대표 용도 — 지도 기준 목표점을 로봇 기준으로:
지도 기준 목표점 p_map → 로봇 기준 p_base
p_base = T_base_map · p_map (T_base_map = inverse(T_map_base))
로봇이 "그 목표가 내 기준 어느 방향인지" 알아야 제어할 수 있으니, 역변환은 매우 자주 쓰입니다(6편에서 코드로).
4편 정리
- 좌표계가 필요한 이유 = 같은 점도 기준에 따라 값이 다름(
frame_id의 뿌리). - 전역(
map/odom) vs 지역(base_link/laser/camera_link). - 2D: 위치
(x,y), 자세(x,y,θ), 회전R(θ), 이동t. - 동차 좌표(끝에 1 추가) → 회전+이동을 한 행렬 곱
p'=T·p로. - 2D 동차 변환 행렬 = 회전 2×2 + 이동 +
[0 0 1]. 90도 예시: 앞 1m →odom (2,2). - 표기
T_A_B(B→A), 곱셈 순서(체인 odom←base←laser), 역변환(반대 방향).
다음 편 예고
5편에서는 3D로 확장합니다 — 3D 회전 행렬과 4×4 동차 변환 행렬, 그리고 ROS 2 TF와의 관계, 회전을 표현하는 Quaternion과 Roll·Pitch·Yaw, 좌표계 체인이 끊기는 경우, 순기구학·역기구학까지. RViz의 TF 축이 곧 동차 변환 행렬임을 마무리합니다.
📚 Week2 Day1 전체 목차 (총 6편)
- 1/6 RViz로 로봇을 눈으로 보다 — 시각화 흐름·Fixed Frame·Display
- 2/6 RViz 개념 ② — TF·좌표계·URDF·센서 Display·디버깅
- 3/6 RViz2 실습 — GCP VM 헤드리스 GUI + Publisher + 시각화
- 4/6 좌표계와 동차 변환 행렬 ① — 좌표계·2D 변환·동차좌표 — 이번 글
- 5/6 좌표계와 동차 변환 행렬 ② — 3D·TF·Quaternion·기구학
- 6/6 좌표 변환 실습 — Python 변환 + TF Publisher + RViz
'피지컬AI' 카테고리의 다른 글
| [Physical AI W2D1] 3/6 — RViz2 실습: GCP VM 헤드리스 GUI로 센서·TF 시각화 (0) | 2026.06.20 |
|---|---|
| [Physical AI W2D1] 5/6 — 좌표계와 동차 변환 행렬 ②: 3D·TF·Quaternion·기구학 (0) | 2026.06.20 |
| [Physical AI W2D1] 2/6 — RViz 개념 ②: TF·좌표계·URDF·센서 Display·디버깅 (0) | 2026.06.20 |
| [Physical AI W2D1] 1/6 — RViz로 로봇을 눈으로 보다: 시각화 흐름·Fixed Frame·Display (0) | 2026.06.20 |
| [Physical AI W1D2] 6/6 — ROS 2 패키지 빌드 마스터: Python·C++·colcon (0) | 2026.06.14 |