[Physical AI W2D1] 5/6 — 좌표계와 동차 변환 행렬 ②: 3D·TF·Quaternion·기구학

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

[Physical AI W2D1 · 5/6]

2D를 3D로 확장한다. 4×4 동차 변환 행렬이 곧 ROS 2 TF이고, 회전은 Quaternion으로 표현되며, 이 변환을 누적하면 순기구학(관절→끝단), 되돌리면 역기구학(목표→관절)이 된다. RViz TF 축의 정체를 마무리한다.

이 글에서 잡는 개념
1. 3D 회전 행렬(Roll·Pitch·Yaw)과 4×4 동차 변환 행렬
2. 4×4 행렬 = ROS 2 TF (translation + rotation + 시간)
3. Quaternion(x,y,z,w)과 yaw 변환, RPY와의 관계
4. 부모/자식 좌표계·좌표계 체인
5. 순기구학(관절→끝단)과 역기구학(목표→관절), 그리고 피지컬 AI 연결

(4편의 2D를 3D로 확장하고, RViz에서 본 TF 축이 곧 동차 변환 행렬임을 마무리합니다.)


1. 3D 회전 행렬 — Roll·Pitch·Yaw

3D 회전은 세 축에 대한 회전으로 표현합니다.

Roll (x축):              Pitch (y축):             Yaw (z축):
[ 1    0      0   ]      [  cosp  0  sinp ]       [ cosy  -siny  0 ]
[ 0  cosr  -sinr ]      [   0    1   0   ]       [ siny   cosy  0 ]
[ 0  sinr   cosr ]      [ -sinp  0  cosp ]       [  0      0    1 ]

조합(자주 쓰는 RPY 순서):

R = R_z(yaw) · R_y(pitch) · R_x(roll)

회전 순서에 따라 결과가 달라지므로 어떤 순서인지 명확히 해야 합니다. (Quaternion은 계산 안정·보간에 유리, 회전 행렬은 축이 어떻게 변하는지 이해에 유리.)


2. 3D 동차 변환 행렬 — 4×4

3D 점은 동차 좌표로 [x, y, z, 1]ᵀ. 동차 변환 행렬은 4×4입니다.

T =
[ r11  r12  r13  tx ]      간단히:   T = [ R  t ]
[ r21  r22  r23  ty ]                     [ 0  1 ]
[ r31  r32  r33  tz ]
[  0    0    0    1 ]
  • 왼쪽 위 3×3 = 회전 R, 오른쪽 3×1 = 이동 t, 마지막 행 [0 0 0 1] 고정.
  • 점 변환: p_A = T_A_B · p_B.

예시 — base_link → laser

LiDAR가 본체 앞 0.25m·위 0.15m, 방향 동일(회전 없음 → R=단위행렬):

T_base_laser =
[ 1  0  0  0.25 ]
[ 0  1  0  0.00 ]
[ 0  0  1  0.15 ]
[ 0  0  0  1.00 ]

LiDAR 기준 앞 1m 점 p_laser = [1, 0, 0, 1]ᵀ → base 기준:

p_base = T_base_laser · p_laser = [ 1.25, 0.00, 0.15, 1.00 ]ᵀ

→ LiDAR 기준 앞 1m가 본체 기준 x=1.25, z=0.15. (3편 Publisher의 static TF base_link→laser 값과 정확히 일치합니다!)


3. 4×4 동차 변환 행렬 = ROS 2 TF

ROS 2의 TF는 수학적으로 동차 변환 행렬과 같습니다. TF 트리

odom └── base_link └── laser

는 T_odom_base, T_base_laser 두 변환을 뜻하고, LiDAR 점을 odom까지:

p_odom = T_odom_base · T_base_laser · p_laser

다만 TF는 4×4 행렬을 직접 쓰게 하지 않고 메시지로 발행합니다.

parent frame (header.frame_id)
child frame  (child_frame_id)
translation: x, y, z
rotation:    x, y, z, w   (Quaternion)
timestamp

예 — base_link → laser:

parent: base_link, child: laser
translation: (0.25, 0.0, 0.15)
rotation: (0, 0, 0, 1)   # 회전 없음

이건 위의 T_base_laser 4×4와 정확히 대응됩니다. 즉 TF = 동차 변환 행렬 + 시간 정보.

💡 Translation·Rotation 둘 다 — Translation만 맞고 Rotation이 틀리면 센서 위치는 맞아도 방향이 틀어지고, 반대면 방향은 맞아도 위치가 틀립니다. 항상 함께 확인.

 


4. Quaternion — ROS 2의 회전 표현

Quaternion은 3D 회전을 네 값 (x, y, z, w)로 표현합니다. ROS 2의 Pose·Odometry·TF는 회전을 Quaternion으로 씁니다.

회전 없음(단위 회전): x=0, y=0, z=0, w=1

2D 이동 로봇은 z축 회전(yaw)이 핵심이고, yaw → Quaternion 변환은:

x = 0
y = 0
z = sin(yaw / 2)
w = cos(yaw / 2)

예: yaw = 90° → yaw/2 = 45° → z = sin45° ≈ 0.707, w = cos45° ≈ 0.707.

3편 Publisher 코드의 rotation.z = math.sin(yaw/2), rotation.w = math.cos(yaw/2)가 바로 이것이었습니다.

Quaternion은 직관적이진 않지만 3D 회전 계산에서 안정적(짐벌락 없음, 보간 유리)이라 로봇팔·드론·카메라 자세에 자주 쓰입니다.


5. Roll·Pitch·Yaw와 Quaternion — 세 가지 회전 표현

표현 장점 주 사용
Roll·Pitch·Yaw 사람이 이해하기 쉬움 방향 설명, 설정값
회전 행렬 좌표축 변환 이해 쉬움 수학 계산, 동차 변환 행렬
Quaternion 3D 회전 계산 안정적 ROS 2 Pose·Odometry·TF
Roll → x축 회전,  Pitch → y축 회전,  Yaw → z축 회전

이동 로봇은 바닥 위 좌우 회전이라 yaw가 가장 중요합니다. 이론은 회전 행렬로 의미를 잡고, ROS 2 실습은 Quaternion으로 메시지를 구성하는 흐름을 이해하면 됩니다.


6. 부모·자식 좌표계와 좌표계 체인

TF는 좌표계 관계를 부모(parent)·자식(child) 으로 표현합니다.

base_link → laser     # header.frame_id: base_link, child_frame_id: laser

"laser가 base_link 기준 어디에 있는지"를 뜻합니다. 하나의 자식은 보통 하나의 부모를 가져, 전체가 트리가 됩니다.

odom └── base_link ├── laser ├── camera_link └── imu_link

⚠️ 부모/자식을 거꾸로 설정하면(예: laser를 부모로) "로봇이 센서 기준으로 움직이는" 잘못된 구조가 됩니다.

좌표계 체인 — 두 좌표계가 직접 연결돼 있지 않아도 중간을 거쳐 변환합니다.

p_odom = T_odom_base · T_base_laser · p_laser     # odom ← base ← laser

체인이 끊기면(중간 frame 미발행, 이름 불일치) RViz는 No transform — 2편의 디버깅이 여기 연결됩니다.


7. 순기구학 — 관절각에서 끝단으로

순기구학(Forward Kinematics) 은 관절 값이 주어졌을 때 로봇 끝단(엔드이펙터) 위치·자세를 계산합니다. 2링크 평면 로봇팔이라면:

T_base_link1 = 회전 θ1 + 이동 L1
T_link1_link2 = 회전 θ2 + 이동 L2
T_base_ee = T_base_link1 · T_link1_link2

링크가 많아져도 동차 변환 행렬을 누적하면 됩니다.

T_base_ee = T_base_1 · T_1_2 · T_2_3 · … · T_n_ee

물체를 집고, 용접선을 따라가고, 카메라를 옮기려면 끝단 위치를 정확히 계산해야 합니다 — 그 기본이 순기구학, 핵심 도구가 동차 변환 행렬입니다.


8. 역기구학 — 목표에서 관절각으로

역기구학(Inverse Kinematics) 은 반대 문제 — 목표 끝단 위치가 주어졌을 때 필요한 관절각을 계산합니다.

순기구학:  관절각  →  끝단 위치
역기구학:  끝단 목표  →  관절각

역기구학은 더 어렵습니다(해가 여러 개거나, 도달 불가능하거나, 관절 제한·충돌 고려). 그래도 좌표 변환이 핵심입니다 — 카메라가 인식한 물체 p_camera를 먼저 로봇팔 base 기준으로 변환해야 합니다.

p_base = T_base_camera · p_camera

이 변환 뒤에야 역기구학이 목표를 계산할 수 있습니다. 좌표 변환이 비전 인식과 실제 조작을 잇는 것이죠.


9. 피지컬 AI에서 좌표 변환

피지컬 AI는 인식 → 판단 → 행동의 시스템입니다(입문 ①편의 순환 고리). 여기서 좌표 변환이 인식과 행동을 연결합니다.

카메라가 물체를 인식해도, 로봇이 집으려면 여러 좌표 변환이 필요합니다.

이미지 좌표 → 카메라 좌표 → 로봇 기준 → 로봇팔 기준 → 엔드이펙터 목표 자세

자율주행도 마찬가지:

LiDAR 기준 장애물 → 로봇 기준 → 지도 기준 → 경로 계획

핵심: 좌표계가 틀리면 AI가 올바르게 인식해도 로봇은 엉뚱한 곳으로 움직입니다. 그래서 피지컬 AI는 AI 모델뿐 아니라 좌표계·변환 행렬·TF 구조를 함께 이해해야 합니다.


5편 정리

  • 3D 회전 = Roll·Pitch·Yaw 행렬 조합, 동차 변환은 4×4 [R t; 0 1].
  • 4×4 동차 변환 = ROS 2 TF(translation+rotation+시간). base_link→laser 예시가 3편 코드와 일치.
  • 회전은 Quaternion(z=sin(yaw/2), w=cos(yaw/2)). RPY(사람)·회전행렬(수학)·Quaternion(ROS) 세 표현.
  • 부모/자식 트리 + 좌표계 체인(끊기면 No transform).
  • 순기구학(관절→끝단, 동차변환 누적) ↔ 역기구학(목표→관절, 좌표변환 필요).
  • 피지컬 AI = 좌표 변환이 인식과 행동을 연결.

다음 편 예고

이론을 마쳤으니, 6편에서 직접 계산합니다 — Colab/Python으로 2D·3D 동차 변환과 역변환, 좌표계 체인을 코드로 풀고, TF Publisher 노드를 만들어 tf2_echo와 RViz로 좌표축을 확인합니다. 손으로 굳히는 마지막 편입니다.

📚 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] 6/6 — 좌표 변환 실습: Python 변환 + TF Publisher + RViz  (0) 2026.06.20
[Physical AI W2D1] 3/6 — RViz2 실습: GCP VM 헤드리스 GUI로 센서·TF 시각화  (0) 2026.06.20
[Physical AI W2D1] 4/6 — 좌표계와 동차 변환 행렬 ①: 좌표계·2D 변환·동차좌표  (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
'피지컬AI' 카테고리의 다른 글
  • [Physical AI W2D1] 6/6 — 좌표 변환 실습: Python 변환 + TF Publisher + RViz
  • [Physical AI W2D1] 3/6 — RViz2 실습: GCP VM 헤드리스 GUI로 센서·TF 시각화
  • [Physical AI W2D1] 4/6 — 좌표계와 동차 변환 행렬 ①: 좌표계·2D 변환·동차좌표
  • [Physical AI W2D1] 2/6 — RViz 개념 ②: TF·좌표계·URDF·센서 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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
[Physical AI W2D1] 5/6 — 좌표계와 동차 변환 행렬 ②: 3D·TF·Quaternion·기구학
상단으로

티스토리툴바