[Physical AI W2D1] 4/6 — 좌표계와 동차 변환 행렬 ①: 좌표계·2D 변환·동차좌표

2026. 6. 20. 12:36·피지컬AI

[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_base
  • T_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
'피지컬AI' 카테고리의 다른 글
  • [Physical AI W2D1] 3/6 — RViz2 실습: GCP VM 헤드리스 GUI로 센서·TF 시각화
  • [Physical AI W2D1] 5/6 — 좌표계와 동차 변환 행렬 ②: 3D·TF·Quaternion·기구학
  • [Physical AI W2D1] 2/6 — RViz 개념 ②: TF·좌표계·URDF·센서 Display·디버깅
  • [Physical AI W2D1] 1/6 — RViz로 로봇을 눈으로 보다: 시각화 흐름·Fixed Frame·Display
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (342) N
      • 여러가지 (11) N
        • 알고리즘 & 자료구조 (73)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (39)
        • 파이썬 (31)
        • 자바 (3)
        • 스프링부트 (5)
      • 컴퓨터 구조와 운영체제 (3)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (21)
        • 도커 (2)
        • AWS (19)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (2) N
        • 정보처리기사 (0)
        • 정보보안기사 (1)
        • 네트워크관리사 (1) N
      • 재태크 (0)
        • 암호화폐 (0)
        • 기타 (0)
      • 피지컬AI (26)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Spring WebFlux
    TF
    Spring Boot
    WebFlux
    Redis
    피지컬ai
    AWS네트워크계층으로읽기
    rclpy
    moveit
    celery
    자바
    프로그래머스
    Python
    로봇팔
    SAA
    클라우드
    ROS2
    운동학
    동차변환행렬
    그리디
    java
    네트워크
    docker
    FastAPI
    취업리부트
    AWS
    EC2
    역운동학
    항해99
    완전탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
[Physical AI W2D1] 4/6 — 좌표계와 동차 변환 행렬 ①: 좌표계·2D 변환·동차좌표
상단으로

티스토리툴바