AEGLOSLAB 로봇공학 전서(全書)

제1부 수학적 기초

1.3 강체 운동과 좌표계·프레임 규약

1.3.1 이 장에서 배우는 것 / 선수 지식 / 특히 중요한 독자

이 장은 강체의 위치와 자세를 프레임으로 나타내는 방법과, 프레임 사이의 변환을 합성·역변환하는 규칙, 그리고 소프트웨어와 문헌 사이에서 갈리는 규약(좌표축 방향·회전 합성 순서·변환의 방향 표기)을 정리한다. 로봇 시스템의 통합 오류는 알고리즘보다 프레임 규약의 불일치에서 자주 생기며, ROS의 좌표 규약 문서 REP-103도 단위와 규약의 불일치를 통합 문제와 소프트웨어 결함의 흔한 원인으로 명시한다. 이 장의 규약이 제2부 이후 모든 기구학·동역학·추정 장의 표기 기준이다. 회전의 구체적 표현(오일러각·축-각·쿼터니언)은 1.4·1.5, 동차변환은 1.6가 다룬다. 다룰 질문은 네 가지다. 프레임과 자세 행렬은 무엇인가, 변환은 어떻게 합성·역변환되는가, 회전의 합성 순서는 어떻게 갈리는가, ROS와 항공·이 책의 규약은 어디서 다른가.

배우는 것:

  • 프레임과 자세 행렬 — 강체의 6자유도, $SO(3)$의 성질, 열이 축 벡터라는 해석.
  • 좌표 변환과 합성 — ${}^{A}p={}^{A}R_{B}\,{}^{B}p+{}^{A}p_{B}$, 인접 첨자 소거 규칙, 역변환, 프레임 트리의 조회.
  • 회전 합성 순서 — 현재 축(우곱)과 고정 축(좌곱)의 동치 관계.
  • 규약 — REP-103·REP-105가 정한 축 방향·광학 프레임·ENU/NED·요의 정의와 이 책의 규약.
  • 풀이 예제 — 프레임 트리(map→odom→base_link→카메라)의 변환 합성, 광학 프레임 좌표 변환, 방위각-요 변환.

선수 지식: 1.1의 행렬·직교 행렬. 표기는 BK-05와 A.2을 따른다.

특히 중요한 독자: 엔지니어·소프트웨어 개발자(프레임 오류의 예방), 연구자(문헌 사이 규약 번역), 인증·시스템 통합 독자(프레임 문서화).

출처 방침. 규약은 문서에서 직접 읽은 것만 단정한다. 직접 읽은 자료: ① REP-103 『Standard Units of Measure and Coordinate Conventions』(상태 Active, 작성 2010-10-07, 최근 이력 2014-12-31) 전문, ② REP-105 『Coordinate Frames for Mobile Platforms』(작성 2010-10-27)의 프레임 정의·관계·권한 절, ③ ROS 2 geometry_msgs의 TransformStamped.msg·Quaternion.msg(ros2/common_interfaces, 브랜치 rolling, 조회 2026-11-03). 두 REP는 ros-infrastructure/rep 저장소의 원문(rep-0103.rst, rep-0105.rst)을 읽었다. 읽지 못한 것: tf2 문서, ISO 9787·ISO 8855·SAE J670의 본문, OpenCV·OpenGL·게임 엔진의 좌표 규약 문서(해당 서술은 (확인 필요)). 수치는 모두 이 장의 순수 파이썬 구현으로 계산했다.

1.3.2 개념 — 규약이 문제가 되는 이유

프레임 오류는 컴파일되고 실행되며 틀린 값을 낸다. 같은 행렬이 능동 회전으로도 좌표 변환으로도 읽히고, 같은 회전 순서가 현재 축 기준으로도 고정 축 기준으로도 적히며, 같은 카메라가 앞 방향을 $x$로도 $z$로도 부른다. 이 장의 풀이 예제는 이 세 가지를 수치로 보인다.

오류의 유형증상이 장의 위치
회전 합성 순서90° 회전 두 번에서 120°의 자세 차이1.3.3.5, 1.3.5
광학 프레임과 본체 프레임의 혼동점의 좌표 부호·축이 뒤바뀜1.3.3.6, 1.3.5
방위각과 요의 정의북쪽 기준 시계방향 대 동쪽 기준 반시계방향1.3.3.6, 1.3.5
변환의 방향(부모→자식 대 좌표 변환)변환을 역으로 적용1.3.3.4
쿼터니언 성분 순서$w$의 위치가 맨 앞인지 맨 뒤인지1.3.3.6

1.3.3 원리

1.3.3.1 강체와 프레임

강체는 임의의 두 점 사이의 거리가 변하지 않는 물체이다. 공간에서 강체의 배치는 세 개의 위치와 세 개의 자세, 즉 6자유도로 정해진다(평면에서는 3자유도). 프레임은 원점과 오른손 정규직교 기저(세 단위 축)의 조합이며, 강체에 고정한 프레임이 그 강체의 배치를 대표한다. 점 $p$의 좌표 ${}^{A}p\in\mathbb R^3$는 프레임 $A$의 기저로 표현한 성분이다. 같은 점이 프레임마다 다른 좌표를 갖는다.

1.3.3.2 자세 행렬

프레임 $B$의 세 축 벡터를 프레임 $A$의 좌표로 적어 열로 쌓은 행렬이 ${}^{A}R_{B}$이다. 이 행렬은 특수 직교군

$$SO(3)=\{R\in\mathbb R^{3\times3}:\ R^\top R=I,\ \det R=+1\}$$

의 원소이다. $R^\top R=I$는 세 열이 정규직교임을, $\det R=+1$은 오른손 좌표계가 보존됨을 뜻한다($\det R=-1$은 반사로서 손 방향을 바꾼다). 역행렬은 전치이다: ${}^{B}R_{A}=({}^{A}R_{B})^\top$. 자유도가 3인 이유는 9개 원소에 6개의 직교 조건이 걸리기 때문이다.

1.3.3.3 좌표 변환과 능동·수동 해석

프레임 $B$의 원점이 $A$에서 ${}^{A}p_{B}$에 있고 자세가 ${}^{A}R_{B}$일 때, 같은 점의 두 좌표는

$$ {}^{A}p={}^{A}R_{B}\,{}^{B}p+{}^{A}p_{B} $$

로 이어진다(아래 그림). 같은 행렬 $R$은 두 가지로 읽힌다. 수동(좌표 변환) 해석은 점은 그대로 두고 좌표만 $B$에서 $A$로 바꾼다. 능동 해석은 한 프레임 안에서 벡터 $v$를 $Rv$로 회전시킨다. 이 책은 BK-05에 따라 회전을 능동·오른손으로 정의하고, 자세를 ${}^{A}R_{B}$(프레임 $B$를 $A$에서 본 것)로 적는다. 두 해석은 행렬이 같고 의미만 다르므로, 문헌의 $R$이 어느 쪽인지 확인하지 않으면 역으로 적용하게 된다.

x y A x y B p pA pB pAB
두 프레임 A와 B에서 본 같은 점 p. 프레임 B는 A에서 위치 pAB와 30° 회전으로 놓여 있고, pA와 pB는 같은 점의 두 좌표이다.

1.3.3.4 변환의 합성·역과 프레임 트리

위치와 자세를 묶은 변환 ${}^{A}T_{B}=({}^{A}R_{B},\,{}^{A}p_{B})$의 합성과 역은 다음과 같다(동차 행렬 표현은 1.6).

$$ {}^{A}T_{C}={}^{A}T_{B}\,{}^{B}T_{C}=\left({}^{A}R_{B}\,{}^{B}R_{C},\ {}^{A}R_{B}\,{}^{B}p_{C}+{}^{A}p_{B}\right),\qquad {}^{B}T_{A}=\left({}^{A}R_{B}^{\top},\ -{}^{A}R_{B}^{\top}\,{}^{A}p_{B}\right) $$

인접 첨자 소거가 기억 규칙이다: ${}^{A}T_{B}\,{}^{B}T_{C}$에서 안쪽의 $B$가 소거되어 ${}^{A}T_{C}$가 된다. 소거가 되지 않는 곱은 틀린 곱이다.

로봇 시스템은 프레임을 트리로 저장한다. REP-105는 모든 프레임이 하나의 부모를 갖는 트리 표현을 택했으며, 이동 플랫폼의 기본 프레임을 map→odom→base_link 순으로 둔다. odom은 연속이나 장기적으로 표류하고, map은 표류하지 않으나 위치추정 보정에 따라 불연속으로 바뀔 수 있다. 위치추정 모듈은 map→base_link를 직접 내보내지 않고, 오도메트리가 내는 odom→base_link를 받아 map→odom을 내보낸다(REP-105의 프레임 권한 절). 임의의 두 프레임 사이의 변환은 두 프레임에서 공통 조상까지 올라가며 변환을 합성해 얻는다.

map odom base_link arm_base camera_link camera_optical lidar_link 불연속(위치추정 보정) 연속(오도메트리) 고정
ROS 프레임 트리의 예(REP-105의 map→odom→base_link에 팔과 라이다를 붙인 이 책의 예). 각 프레임의 부모는 하나이며, map→odom은 위치추정이 보정하고 odom→base_link는 오도메트리가 내보낸다.

ROS 2의 TransformStamped 메시지는 header.frame_id(부모)에서 child_frame_id로의 변환이며 "child_frame_id의 3차원 이동과 회전을 header.frame_id에서 본 값"을 담는다고 주석에 적는다. 부모에서 본 자식의 자세이므로 이 책의 표기로는 ${}^{\mathrm{parent}}T_{\mathrm{child}}$이다(자식 좌표를 부모 좌표로 옮기는 변환). 주석의 "from … to" 표현은 방향이 모호하게 읽히므로 이 해석은 tf2 문서로 확인하지 못했다 (확인 필요).

1.3.3.5 회전의 합성 순서 — 현재 축과 고정 축

회전을 세 번 이어서 가할 때 두 가지 해석이 있다. 회전 축을 현재(이동하는) 프레임의 축으로 잡으면 $R=R_1R_2R_3$(오른쪽에 곱한다)이고, 고정(처음 프레임의) 축으로 잡으면 같은 순서의 회전이 $R=R_3R_2R_1$(왼쪽에 곱한다)이다. 두 해석은 곱의 순서를 뒤집은 것과 같다. REP-103이 우선순위 목록에 올린 고정축 롤-피치-요는 $X$, $Y$, $Z$ 축으로 차례로 회전하므로 $R=R_z(\text{요})\,R_y(\text{피치})\,R_x(\text{롤})$이다. 오일러각은 24가지의 유효한 규약이 있어 REP-103이 권장하지 않는다. 순서가 틀리면 아래 예제처럼 같은 각도에서도 자세가 크게 달라진다.

1.3.3.6 규약의 갈림과 이 책의 규약

ROS 본체 x y z ROS 광학 x y z FRD(항공) x y z 앞 x · 왼쪽 y · 위 z 오른쪽 x · 아래 y · 앞 z 앞 x · 오른쪽 y · 아래 z
세 프레임 규약의 축 방향(앞·왼쪽·위를 기준으로 투영한 모식도). ROS 본체는 앞 x·왼쪽 y·위 z, ROS 광학은 오른쪽 x·아래 y·앞 z, 항공 FRD는 앞 x·오른쪽 y·아래 z이며 모두 오른손 좌표계이다.

REP-103이 정한 규약과 이 책의 규약은 다음과 같다.

항목REP-103(ROS)이 책의 규약비고
손 방향모든 시스템이 오른손오른손(BK-05)일치
본체 축$x$ 앞, $y$ 왼쪽, $z$ 위이 장에서 REP-103을 따름BK-05에 별도 규정 없음
지리 좌표ENU($x$ 동, $y$ 북, $z$ 위), 가까운 원점 사용 권장이 장에서 REP-103을 따름NED를 사용하는 장은 명시
광학 프레임접미사 _optical: $z$ 앞, $x$ 오른쪽, $y$ 아래카메라를 다루는 장이 정의를 명시비전 분야의 카메라 규약과 같다고 알려져 있다 (확인 필요)
항공(NED)접미사 _ned의 별도 프레임: $x$ 북, $y$ 동, $z$ 아래사용하는 장이 정의를 명시본체형 FRD는 앞·오른쪽·아래
회전 표현의 우선순위쿼터니언, 회전 행렬, 고정축 롤-피치-요, 오일러각 순회전은 능동·오른손, 쿼터니언은 해밀턴 규약(BK-05)1.4·1.5
요오른손 규칙, 반시계방향 증가, 지리 자세에서 동쪽이 0이 장에서 REP-103을 따름나침반 방위각(북 0, 시계방향)과 다름
쿼터니언 성분 순서메시 필드 순서 $x,y,z,w$ (Quaternion.msg)스칼라 선행 $(q_w,q_x,q_y,q_z)$(BK-05)변환 시 순서 주의
6차원 공분산$(x,y,z,\ \text{회전 } X,Y,Z)$ 순, 고정축BK-05에 규정 없음1.8에서 다룬다
단위SI, 각도는 라디안SI, 계산에 rad(BK-05)일치

REP-103은 이 규약을 따르지 않는 소프트웨어를 금지하지 않고, 다른 규약을 고를 때는 근거와 문서화가 충분해야 한다고 규정한다. 비전 라이브러리·그래픽 엔진·차량 표준(ISO 8855·SAE J670)의 좌표 규약은 이 장이 문서를 읽지 못해 서술하지 않았다 (확인 필요). 로봇 표준의 좌표계 정의는 ISO 9787(27.5)이 다룬다.

1.3.4 알고리즘

변환의 합성·역·조회

합성:   (R1, p1) · (R2, p2) = (R1 R2,  R1 p2 + p1)
역:     (R, p)⁻¹ = (Rᵀ, −Rᵀ p)
조회(a, b):                    # 프레임 트리에서 T_a_b
    c ← a와 b의 공통 조상
    Ta ← a에서 c까지 올라가며 부모←자식 변환을 왼쪽부터 곱함 (T_c_a)
    Tb ← b에서 c까지 올라가며 같은 방식으로 곱함           (T_c_b)
    반환 T_a_b = (Ta)⁻¹ · Tb

조회의 비용은 두 프레임의 깊이의 합에 비례한다. 자식 프레임의 부모가 둘 이상이면 트리가 아니므로 합성이 모호해진다. 구현은 1.3.5의 코드에 있다. 프레임 이름 두 개를 변수 이름에 넣고(T_map_base) 인접한 이름이 소거되도록 곱하면 합성 순서 오류를 곱 형태에서 볼 수 있다.

1.3.5 풀이 예제 — 프레임 트리의 합성과 규약 변환

프레임 트리의 변환을 합성·역변환하고, 회전 합성 순서·광학 프레임·방위각-요 변환의 결과를 계산한다. 결론부터 적으면 다음과 같다. ① 같은 두 회전(90°, 90°)을 현재 축과 고정 축으로 합성하면 자세가 120° 다르다. ② 트리 조회는 공통 조상을 거친 경로와 map을 거친 경로에서 $10^{-16}$ 안에서 같고 변환과 그 역의 곱이 단위 변환이다. ③ 본체 프레임에서 앞 2 m·왼쪽 0.5 m·위 0.3 m인 점은 광학 프레임에서 $(-0.5,\ -0.3,\ +2.0)$이다. ④ 방위각 $b$의 요는 $90^\circ-b$이다.

구현. 3×3 행렬 곱, 변환 $(R,p)$의 합성·역, 공통 조상 조회(lookup). 파이썬 표준 라이브러리만 사용

항목값
입력 1$R_z(90^\circ)$와 $R_x(90^\circ)$의 두 합성 순서
입력 2트리(가정): map→odom(1.2, −0.4, 0 m, 요 5°)·odom→base_link(10.0, 2.0 m, 요 30°)·base_link→arm_base(0.20, 0, 0.35 m)·arm_base→camera_link(0.40, 0, 0.50 m, 요 10°, 피치 20°)·camera_link→camera_optical(광학 회전)·base_link→lidar_link(0.10, 0, 0.55 m)
입력 3광학 회전 $R=\begin{bmatrix}0&0&1\\-1&0&0\\0&-1&0\end{bmatrix}$ (열이 광학 축 $x,y,z$를 본체 프레임으로 적은 것)
입력 4점: 본체 프레임에서 앞 2.0, 왼쪽 0.5, 위 0.3 m. 방위각 0°, 45°, 90°, 180°, 270°
import math

def rz(a):
    c, s = math.cos(a), math.sin(a)
    return [[c, -s, 0.0], [s, c, 0.0], [0.0, 0.0, 1.0]]

def ry(a):
    c, s = math.cos(a), math.sin(a)
    return [[c, 0.0, s], [0.0, 1.0, 0.0], [-s, 0.0, c]]

def rx(a):
    c, s = math.cos(a), math.sin(a)
    return [[1.0, 0.0, 0.0], [0.0, c, -s], [0.0, s, c]]

def mm(A, B):
    Bt = list(zip(*B))
    return [[sum(a * b for a, b in zip(r, c)) for c in Bt]
            for r in A]

def mv(A, v):
    return [sum(a * b for a, b in zip(r, v)) for r in A]

def rpy(r, p, y):
    """고정축 롤-피치-요(REP-103): R = Rz(y) Ry(p) Rx(r)"""
    return mm(rz(y), mm(ry(p), rx(r)))

def compose(T1, T2):
    """(R1, p1)(R2, p2) = (R1 R2, R1 p2 + p1)"""
    (R1, p1), (R2, p2) = T1, T2
    return mm(R1, R2), [a + b for a, b in zip(mv(R1, p2), p1)]

def inv(T):
    R, p = T
    Rt = [list(r) for r in zip(*R)]
    return Rt, [-x for x in mv(Rt, p)]

def ident():
    return rz(0.0), [0.0, 0.0, 0.0]

def ups(tree, f):
    """f에서 뿌리까지의 프레임 목록(tree[자식] = (부모, T))"""
    out = [f]
    while f in tree:
        f = tree[f][0]
        out.append(f)
    return out

def climb(tree, f, stop):
    """T_stop_f: f에서 stop까지 올라가며 합성한다"""
    T = ident()
    while f != stop:
        parent, Tpf = tree[f]
        T = compose(Tpf, T)
        f = parent
    return T

def lookup(tree, a, b):
    """T_a_b와 공통 조상: 공통 조상까지만 올라간다"""
    ub = ups(tree, b)
    c = next(f for f in ups(tree, a) if f in ub)
    Ta, Tb = climb(tree, a, c), climb(tree, b, c)
    return compose(inv(Ta), Tb), c

① 회전 합성 순서. $(1,0,0)^\top$의 상은 다음과 같다.

순서회전 행렬$(1,0,0)^\top$의 상
현재 축: $R_z(90^\circ)$ 다음 $R_x(90^\circ)$(+0, +0, +1) ; (+1, +0, +0) ; (+0, +1, +0)$(+0, +1, +0)$
고정 축: $R_z(90^\circ)$ 다음 $R_x(90^\circ)$(+0, −1, +0) ; (+0, +0, −1) ; (+1, +0, +0)$(+0, +0, +1)$

두 결과 사이의 회전각 120.0°

② 트리 조회. 합성의 일관성과 광학 프레임까지의 변환은 다음과 같다.

점검값
변환과 그 역의 곱 − 단위 변환, 최대 오차(map·camera_optical)1.8e-15
공통 조상(라이다→카메라 조회)base_link
lidar_link←camera_optical의 두 경로(공통 조상 경유·map 경유) 차이2.2e-16
$R^\top R-I$ (합성 후 직교성)2.2e-16
변환(부모 ← 자식)평행이동 $p$ (m)광축의 수평 방위(°)광축의 고도(°)
base_link ← camera_optical(0.600, 0.000, 0.850)10.0−20.0
lidar_link ← camera_optical(0.500, 0.000, 0.300)10.0−20.0
map ← camera_optical(11.479, 2.808, 0.850)45.0−20.0

map에서 본 카메라 광축의 방위는 $5^\circ+30^\circ+10^\circ=45^\circ$이고 고도는 피치에 의한 $-20^\circ$(아래쪽)이다. base_link와 lidar_link는 같은 방향으로 놓여 두 프레임에서 본 카메라 광축이 같고 평행이동만 다르다.

③ 본체·광학 프레임과 방위각.

항목본체 프레임광학 프레임
같은 점의 좌표(본체: 앞 2.0·왼쪽 0.5·위 0.3 m)$(2.0, 0.5, 0.3)$$(-0.5, -0.3, +2.0)$
$\det R_{\mathrm{body}}^{\mathrm{opt}}$—+1
나침반 방위각 (°)REP-103 요 (°)단위 방향 차이
0906.1e-17
45451.1e-16
9006.1e-17
180-906.1e-17
270-1806.1e-17
규약$x$$y$$z$$x\times y\cdot z$
ROS 본체(REP-103)앞왼쪽위+1
ROS 광학(_optical)오른쪽아래앞+1
NED 보조 프레임(_ned) 본체형 FRD앞오른쪽아래+1

세 규약은 모두 $(x\times y)\cdot z=+1$로 오른손이다. 광학 프레임의 $x$(오른쪽)는 본체 프레임의 $-y$이므로 점의 왼쪽 0.5 m가 광학 프레임에서 $x=-0.5$가 된다. 방위각 0°(북)은 요 90°, 90°(동)은 요 0°이며 단위 방향 벡터의 차이가 $10^{-16}$ 안에서 0이다.

한계. 변환 값은 가정이며 실제 로봇의 보정값이 아니다. 구현은 정적 변환만 다루고 시간 보간(tf의 시간 조회)·불확실성 전파(1.8)는 포함하지 않는다. 수치 확인은 회전 행렬 표현에 한정되어 쿼터니언·오일러각 변환(1.4·1.5)은 다루지 않았다.

견해: 이 책은 변환을 ${}^{A}T_{B}$처럼 두 프레임 이름을 모두 적어 다루고, 합성은 안쪽 이름이 소거되는 곱으로만 작성하는 것을 기본으로 둔다고 본다. 근거는 위 예제에서 합성 순서의 오류가 120°의 자세 차이로 나타나고, 이름을 소거하는 규칙이 이 오류를 곱을 적는 단계에서 막는다는 점이다. 변환의 방향 표기(부모←자식)는 소프트웨어 문서와 코드에서 한 가지로 통일하고 문서화한다.

1.3.6 설계 트레이드오프 — 프레임 표기와 관례의 선택

자료에서 확인되는 표기 방식은 세 가지다.

  • ① 두 프레임 첨자 표기. ${}^{A}T_{B}$ 또는 변수명 T_a_b. 인접 이름 소거로 합성 순서를 점검할 수 있다. 이 책의 방식이다.
  • ② 부모-자식 명명(ROS). TransformStamped의 frame_id·child_frame_id. 트리 저장과 통신에 적합하나 변환의 방향이 문서마다 다르게 읽힌다.
  • ③ 단일 첨자 또는 방향 생략. T_ab의 방향을 규칙으로 정한다. 짧으나 방향 규약을 모르면 역으로 읽힌다.
방식장점한계알맞은 경우
① 두 프레임 첨자합성 점검, 문헌 대응변수명이 길다기구학·추정의 구현·문서
② 부모-자식(ROS)트리·통신에 맞음방향 모호로봇 소프트웨어 통신
③ 단일 첨자간결방향 규약 의존짧은 수식(규약을 명시한 경우)

견해: 한 프로젝트 안에서는 한 방식을 정하고 문서 첫머리에 프레임 방향과 회전 규약을 적는 것이 방식의 선택보다 중요하다고 본다. 근거는 이 장에서 확인한 오류가 모두 규약이 암묵적일 때 생긴다는 점(합성 순서·광학 프레임·방위각)과, REP-103도 다른 규약을 고를 때 근거와 문서화를 요구한다는 점이다.

1.3.7 응용 축 비교

여덟 응용 축이 프레임 규약에 거는 요구의 경향은 다음과 같다(이 책의 정리).

응용 축주로 사용되는 프레임규약의 쟁점관련 장
산업·제조세계·기저·도구·사용자 프레임제조사별 정의, 공구 중심점27.5
물류·이동map·odom·base_link연속·불연속 프레임, 다층 지도15.8
도로 주행차량·센서·지도 프레임차량 표준(ISO 8855·SAE)과 ROS의 축 차이 (확인 필요)15.8
서비스본체·센서 프레임광학 프레임, 다중 센서 보정15.8
의료·헬스케어영상·환자·추적기 프레임정합 변환, 좌표계 정의의 문서화1.6
휴머노이드·범용부유 기저·관절 프레임부유 기저의 자세 표현1.4, 1.5
필드ENU·NED·ECEF방위각과 요, 지리 원점15.8
국방·안보지리·플랫폼 프레임항법 규약(NED)15.8

1.3.8 관련 규격·프로토콜

문서발행무엇을 정하나상세 장
REP-103ROS(Informational, Active, 작성 2010-10-07)단위·손 방향·축 방향·광학 접미사·ENU/NED·회전 표현의 우선순위·공분산 순서15.8
REP-105ROS(Active, 작성 2010-10-27)base_link·odom·map·earth의 의미와 트리 관계15.8
geometry_msgs의 TransformStamped·QuaternionROS 2(ros2/common_interfaces)변환 메시지의 필드(부모·자식·이동·회전), 쿼터니언 $x,y,z,w$15.8
ISO 9787ISO로봇의 좌표계와 운동 명칭27.5
ISO 8373ISO로봇 용어(기저·도구 좌표계 등)0.3

ISO 9787·ISO 8373의 본문은 이 장이 읽지 않았고 번호와 장 연결만 둔다 (확인 필요: 조항).

1.3.9 관련 규제·인증 요구와의 연결

직접 적용되는 규제는 없다. 안전 영역·속도 감시처럼 위치에 의존하는 안전 기능은 기준 프레임이 틀리면 설정한 영역이 실제 위치와 어긋나므로 프레임 규약의 문서화가 안전 기능의 검증 항목이 된다. 산업 로봇의 안전 표준은 27.10, 안전 관련 소프트웨어의 개발 요구는 26.20이 다룬다.

1.3.10 한계·유의점·미해결

  • 문서의 범위. ROS 문서(REP-103·105)와 메시 정의에 근거한 서술이며 다른 생태계(비전·그래픽·차량)의 규약은 확인하지 않았다.
  • 방향 표기의 모호성. TransformStamped의 "from … to" 표현이 좌표 변환과 자세 중 어느 것으로 읽히는지는 tf2 문서로 확인하지 않았다 (확인 필요).
  • 시간·불확실성. 시간에 따라 변하는 프레임(tf의 시간 보간)과 변환의 불확실성은 다루지 않았다(1.8).
  • 보정값. 예제의 변환은 가정이며 실제 장착 오차와 보정은 2.17이 다룬다.

1.3.11 체크포인트·연구 질문

체크포인트:

  1. 강체의 6자유도와 $SO(3)$의 정의, $\det R=+1$의 의미를 설명할 수 있는가.
  2. ${}^{A}p={}^{A}R_{B}\,{}^{B}p+{}^{A}p_{B}$의 두 해석(능동·수동)의 차이를 말할 수 있는가.
  3. 변환의 합성과 역을 식으로 적고 인접 첨자 소거로 합성 순서를 점검할 수 있는가.
  4. 현재 축·고정 축 회전 합성의 곱 순서와 롤-피치-요의 행렬 분해를 쓸 수 있는가.
  5. REP-105의 map·odom·base_link의 성질과 프레임 권한(어느 모듈이 어느 변환을 내보내는가)을 설명할 수 있는가.
  6. ROS 본체·광학·FRD 규약의 축 방향과 방위각-요 변환을 쓸 수 있는가.
  7. 예제의 표에서 90° 두 번의 합성 순서가 120° 차이를 만드는 이유를 설명할 수 있는가.

연구 질문(47.12에 수록한다):

  • TransformStamped의 방향 규약은 tf2 문서와 구현에서 어떻게 정의되는가(좌표 변환 대 자세).
  • 비전 라이브러리·그래픽 엔진·차량 표준의 좌표 규약은 REP-103과 어떻게 대응되는가.
  • 프레임 규약 오류가 통합 시험에서 발견되는 비율과 유형은 무엇인가.

1차 출처

  • REP-103 「Standard Units of Measure and Coordinate Conventions」(T. Foote, M. Purvis), ROS Enhancement Proposals, 작성 2010-10-07, ros-infrastructure/rep의 rep-0103.rst(조회 2026-11-03).
  • REP-105 「Coordinate Frames for Mobile Platforms」(W. Meeussen), 작성 2010-10-27, rep-0105.rst(조회 2026-11-03).
  • ROS 2 common_interfaces의 geometry_msgs/msg/TransformStamped.msg·Quaternion.msg(브랜치 rolling, 조회 2026-11-03).
  • K. M. Lynch, F. C. Park, 『Modern Robotics: Mechanics, Planning, and Control』, Cambridge University Press, 2017 (확인 필요: 장 번호).
  • R. M. Murray, Z. Li, S. S. Sastry, 『A Mathematical Introduction to Robotic Manipulation』, CRC Press, 1994 (확인 필요: 장 번호).
  • 읽지 못한 것: tf2 문서, ISO 9787·ISO 8373·ISO 8855·SAE J670의 본문 (확인 필요).

다음 장. 1.4는 회전의 표현 I로, 회전 행렬·오일러각·짐벌락을 다룬다. 이 장의 프레임 규약 위에서 오일러각의 24가지 관례, 롤-피치-요의 행렬 분해, 짐벌락(자유도 상실)의 원인과 수치 거동을 정리한다.