학습 목표
- 좌표값과 물리적 위치를 구분하고 모든 공간 정보에 Frame과 시간이 필요한 이유를 설명할 수 있다.
- REP-103의 오른손 좌표계, 본체 축과 카메라 광학 축 규약을 적용할 수 있다.
- REP-105의
map → odom → base_link관계와 각 변환의 책임을 설명할 수 있다. - 회전행렬과 동차변환행렬로 Point와 Vector를 올바른 순서로 변환할 수 있다.
- Euler Angle과 Quaternion의 차이, Gimbal Lock과 정규화 문제를 설명할 수 있다.
- ROS 2 TF2에서 시각이 맞는 변환을 조회하고 흔한 오류를 진단할 수 있다.
1. 좌표 세 개만으로는 위치를 알 수 없다
(3, 0, 0)이라는 숫자는 그 자체로 물리적 위치가 아닙니다. 어느 원점에서, 어느 축 방향으로, 어떤 단위를 사용했는지 알아야 합니다. LiDAR가 “앞 3 m”에서 장애물을 보았더라도 LiDAR가 뒤를 향해 장착되어 있다면 Robot 본체 기준으로는 뒤쪽일 수 있습니다.
공간 데이터를 해석하려면 최소한 다음 정보가 필요합니다.
- 좌표값:
(x, y, z)또는 위치와 자세 - 기준 Frame: 예를 들어
laser_frame,base_link,odom,map - 측정 시각: Frame 사이 관계가 언제의 값인지
- 단위와 축 규약: m, rad와 오른손 좌표계
ROS 2의 Header.frame_id와 Header.stamp가 중요한 이유입니다. Frame이 없는 Point는 “어디를 기준으로 한 값인지” 알 수 없고, Timestamp가 없는 Point는 움직이는 Robot에서 “언제의 자세를 사용해야 하는지” 알 수 없습니다.
2. Coordinate Frame과 Transform
Coordinate Frame은 원점과 서로 직교하는 축의 방향을 정의합니다. 같은 물리적 Point도 Frame이 달라지면 숫자가 달라집니다.
Transform은 두 Frame의 관계입니다. 다음 두 요소로 구성됩니다.
- Translation: 두 원점이 얼마나 떨어져 있는가
- Rotation: 두 Frame의 축 방향이 어떻게 다른가
이 강의에서는 표기를 명확하게 하기 위해 다음 약속을 사용합니다.
ᵃT_b : b Frame의 좌표를 a Frame의 좌표로 바꾸는 Transform
ᵃp : Point p를 a Frame에서 표현한 좌표
ᵃp = ᵃT_b · ᵇp
base_to_laser 같은 이름은 사람마다 반대 뜻으로 해석할 수 있습니다. 수식, 변수명 또는 주석에 “어느 Frame의 좌표를 어느 Frame으로 바꾸는지”를 명시해야 합니다.
3. REP-103 본체 축 — X 전방, Y 왼쪽, Z 위
ROS의 기본 축 규약은 REP-103에 정의되어 있습니다. Robot 본체에 고정된 Frame은 일반적으로 다음 방향을 사용합니다.
+X: 전방+Y: 왼쪽+Z: 위
오른손 엄지를 +X, 검지를 +Y로 향하면 중지가 +Z를 가리키는 오른손 좌표계입니다. 각 축 주위의 양의 회전도 오른손 법칙을 따릅니다.
- Roll: X축 주위 회전
- Pitch: Y축 주위 회전
- Yaw: Z축 주위 회전
위에서 내려다볼 때 양의 Yaw는 반시계 방향입니다. 그래서 일반적인 이동 Robot에서 Twist.angular.z > 0이면 왼쪽으로 회전합니다.
도해에서는 X를 빨강, Y를 초록, Z를 파랑으로 통일했습니다. RViz의 축 표시도 같은 색 관례를 사용합니다.
4. 단위와 지리 좌표 규약
REP-103은 SI 단위를 기본으로 합니다.
| 물리량 | 기본 단위 |
|---|---|
| 길이 | m |
| 질량 | kg |
| 시간 | s |
| 각도 | rad |
| 선속도 | m/s |
| 각속도 | rad/s |
각도는 내부 계산과 Message에서 rad를 사용하고 UI에서만 degree로 바꾸는 것이 안전합니다.
실외 지리 좌표는 일반적으로 ENU를 사용합니다.
- X: East
- Y: North
- Z: Up
항공 분야에서 흔한 NED는 X North, Y East, Z Down이므로 ENU와 축 순서·부호가 다릅니다. PX4 같은 외부 System과 연결할 때 경계에서 명시적으로 변환해야 합니다.
5. 카메라 Optical Frame은 축이 다르다
Camera의 일반 장착 Frame인 camera_link는 Robot 본체와 같은 X 전방, Y 왼쪽, Z 위 규약을 따를 수 있습니다. 하지만 영상과 Camera Model에 사용하는 Optical Frame은 다음 규약을 사용합니다.
+Z: 렌즈가 바라보는 전방, 광축+X: 영상 오른쪽+Y: 영상 아래
이름에는 보통 _optical 접미사를 사용합니다. camera_link와 camera_optical_frame 사이의 고정 Rotation을 빠뜨리면 Point Cloud가 옆으로 눕거나 Depth Point가 엉뚱한 방향에 나타납니다.
이미지의 Pixel 좌표 (u, v)는 3차원 Metric 좌표 (x, y, z)와도 다릅니다. Camera Intrinsic Parameter와 Depth가 있어야 Pixel을 3차원 Ray 또는 Point로 바꿀 수 있습니다.
6. Frame의 원점은 설계 결정이다
base_link의 원점을 반드시 Wheel 축 중심에 두어야 한다는 절대 규칙은 없습니다. Robot Model과 Package의 가정을 고려해 일관되게 정해야 합니다.
이동 Robot에서는 다음 Frame을 자주 사용합니다.
base_link: Robot 본체에 고정된 3차원 Framebase_footprint:base_link를 지면에 투영한 Roll·Pitch가 없는 Framelaser_frame,imu_link,camera_link: Sensor 장착 위치
2D Navigation은 지면상의 위치와 Yaw를 주로 사용하므로 base_footprint가 유용합니다. 반면 경사나 3차원 자세까지 표현할 때는 base_link가 필요합니다.
원점을 바꾸면 Robot의 물리적 위치가 바뀌는 것이 아니라 같은 Robot Pose를 나타내는 좌표값이 달라집니다.
7. REP-105 — map, odom, base_link
대표적인 이동 Robot TF Tree는 다음과 같습니다.
map
장기적으로 고정된 전역 Frame입니다. 지도 기반 Localization이 Robot의 위치를 보정하면 map 기준 Pose는 불연속적으로 바뀔 수 있습니다.
odom
짧은 시간에 연속적이고 부드러운 Local Frame입니다. Wheel Odometry와 IMU 적분으로 얻지만 시간이 지나면서 Drift할 수 있습니다. odom 기준 Pose는 연속적이어야 합니다.
base_link
Robot 본체에 고정되어 함께 움직이는 Frame입니다.
전형적인 관계는 다음과 같습니다.
map → odom → base_footprint → base_link → sensor frames
System에 따라 base_footprint는 생략할 수 있습니다.
8. 누가 어떤 Transform을 발행하는가
TF Tree의 각 Child Frame은 부모가 하나여야 하며 같은 Edge는 한 발행자가 책임져야 합니다.
| Transform | 대표 발행 주체 | 성질 |
|---|---|---|
map → odom |
AMCL 또는 SLAM | 전역 보정, 바뀔 수 있음 |
odom → base_link |
Odometry 또는 State Estimator | 연속, Drift 가능 |
base_link → sensor |
URDF와 robot_state_publisher |
고정 또는 Joint 상태 기반 |
| 고정 장착 Transform | URDF 또는 Static Broadcaster | 시간에 따라 변하지 않음 |
동일 Transform을 URDF와 별도 Static Broadcaster에서 동시에 발행하지 않아야 합니다. 서로 다른 값이 번갈아 들어오면 RViz에서 Robot과 Sensor가 떨리거나 Point Cloud가 튈 수 있습니다.
9. Point, Vector, Pose는 변환법이 다르다
Point는 위치이므로 Rotation과 Translation의 영향을 모두 받습니다.
ᵃp = ᵃR_b · ᵇp + ᵃt_b
방향 Vector는 원점과 관계없으므로 Translation의 영향을 받지 않습니다.
ᵃv = ᵃR_b · ᵇv
Pose는 위치뿐 아니라 자세도 함께 변환해야 합니다. 속도, 가속도, Force·Torque와 Covariance도 단순히 Point처럼 처리하면 안 됩니다. 각 데이터 Type에 맞는 tf2 변환 함수를 사용하는 이유입니다.
동차 좌표에서는 Point 끝에 1, 방향 Vector 끝에 0을 붙이면 이 차이가 자연스럽게 표현됩니다.
Point [x, y, z, 1]ᵀ → Translation 적용
Vector [x, y, z, 0]ᵀ → Translation 무시
10. Rotation Matrix
3차원 Rotation은 3×3 Matrix로 표현할 수 있습니다. Z축 주위 Yaw θ의 Rotation Matrix는 다음과 같습니다.
Rz(θ) = [ cosθ -sinθ 0 ]
[ sinθ cosθ 0 ]
[ 0 0 1 ]
올바른 Rotation Matrix는 다음 성질을 가집니다.
RᵀR = I
det(R) = +1
R⁻¹ = Rᵀ
det(R)=-1이면 Mirror Reflection이 포함된 것으로 순수한 Rotation이 아닙니다. 축 하나의 부호를 임의로 뒤집으면 오른손 좌표계가 왼손 좌표계로 바뀔 수 있습니다.
11. Homogeneous Transform
Rotation과 Translation을 한 번에 다루기 위해 4×4 Homogeneous Transform을 사용합니다.
ᵃT_b = [ ᵃR_b ᵃt_b ]
[ 0 0 0 1 ]
Point 변환은 다음과 같습니다.
[ᵃp] [ᵃR_b ᵃt_b] [ᵇp]
[ 1] = [0 0 0 1 ] [ 1]
변환을 합성할 때는 Frame 이름이 연결되는 순서로 곱합니다.
ᵐᵃᵖT_laser = ᵐᵃᵖT_odom · ᵒᵈᵒᵐT_base · ᵇᵃˢᵉT_laser
행렬 곱은 교환법칙이 없으므로 순서를 바꾸면 다른 결과가 됩니다.
12. 역변환
ᵃT_b가 b 좌표를 a 좌표로 바꾼다면 역변환 ᵇT_a는 a 좌표를 b 좌표로 되돌립니다.
ᵇT_a = (ᵃT_b)⁻¹
= [ Rᵀ -Rᵀt ]
[ 0 1 ]
Translation에 단순히 음수만 붙이면 안 됩니다. 먼저 Rotation의 역을 적용한 좌표계에서 Translation을 표현해야 하므로 -Rᵀt가 됩니다.
검증할 때는 다음 두 결과가 Identity에 가까운지 확인합니다.
T · T⁻¹ ≈ I
T⁻¹ · T ≈ I
Floating-point 계산에서는 정확한 등호보다 허용 오차를 사용합니다.
13. Active Rotation과 Passive Transform
Rotation 설명이 혼란스러운 가장 큰 이유는 두 관점이 섞이기 때문입니다.
- Active Rotation: 고정된 Frame 안에서 Vector 자체를 회전
- Passive Transform: 물리적 Vector는 그대로 두고 표현 기준 Frame을 변경
두 계산에는 서로 역인 Matrix가 나타날 수 있습니다. “Robot을 90° 돌린다”와 “Robot Frame의 좌표를 Map Frame으로 표현한다”는 같은 문장이 아닙니다.
코드와 문서에는 다음을 분명히 적습니다.
- 무엇이 움직이는가: 물체인가, 표현 Frame인가
- Matrix가 어떤 좌표를 입력받는가
- 결과가 어느 Frame에서 표현되는가
14. Euler Angle과 회전 순서
Roll·Pitch·Yaw는 사람이 이해하기 쉽지만 Rotation 순서에 따라 결과가 달라집니다. XYZ, ZYX, Intrinsic, Extrinsic Rotation은 서로 같은 말이 아닙니다.
또한 특정 자세에서 두 회전축이 겹치는 Gimbal Lock이 발생할 수 있습니다. 흔히 사용하는 표현에서는 Pitch가 ±90° 부근일 때 Roll과 Yaw를 독립적으로 구분하기 어려워집니다.
Gimbal Lock은 물리적 Robot이 자유도 하나를 잃는 현상이 아니라 Euler Angle 표현이 특이해지는 현상입니다. Rotation 자체는 여전히 유효할 수 있습니다.
15. Quaternion
Quaternion은 (x, y, z, w) 네 값으로 Rotation을 표현합니다. ROS Message도 이 순서를 사용합니다.
장점은 다음과 같습니다.
- Gimbal Lock 없이 3차원 Rotation 표현
- Rotation 합성과 역변환이 효율적
- SLERP를 이용한 부드러운 자세 보간
- Rotation Matrix보다 적은 네 값 사용
Unit Quaternion이어야 하므로 다음 조건을 만족해야 합니다.
x² + y² + z² + w² = 1
Rotation이 없는 Identity Quaternion은 (0, 0, 0, 1)입니다. (0, 0, 0, 0)은 유효한 Rotation이 아닙니다.
Quaternion q와 -q는 같은 물리적 Rotation을 나타냅니다. 두 Quaternion의 성분을 단순 비교하면 같은 자세를 다르다고 판단할 수 있으므로 각도 차이나 절댓값을 취한 내적을 사용하는 것이 좋습니다.
16. TF2는 공간뿐 아니라 시간을 다룬다
움직이는 Robot에서 Transform은 시간에 따라 변합니다. 1초 전의 odom → base_link로 지금 측정한 LiDAR Point를 변환하면 공간적으로 틀린 결과가 나옵니다.
TF2 Buffer는 시간별 Transform을 저장하고 요청한 Timestamp에 맞는 Transform을 찾거나 보간합니다.
Sensor 측정 시각: t_sensor
필요한 변환: target_frame ← source_frame at t_sensor
최신 Transform을 무조건 사용하는 것보다 Sensor Message의 header.stamp에 맞춰 조회해야 합니다. Transform이 아직 Buffer에 도착하지 않았거나 너무 오래되어 Cache에서 사라지면 Extrapolation Error가 발생합니다.
System Clock이 서로 맞지 않거나 Simulation Time 설정이 섞여 있어도 같은 오류가 생길 수 있습니다.
17. Static Transform과 Dynamic Transform
Static Transform은 Sensor 장착 위치처럼 운전 중 변하지 않는 관계입니다. /tf_static에 Latched 방식으로 전달되며 한 번 받은 Node가 계속 사용할 수 있습니다.
Dynamic Transform은 Wheel Odometry나 Joint Motion처럼 시간에 따라 바뀝니다. /tf에 적절한 주기로 발행하며 정확한 Timestamp가 필요합니다.
Robot Arm의 Camera가 움직이는 Joint 위에 달려 있다면 base_link → camera_link는 고정이 아닙니다. URDF와 Joint State를 이용해 robot_state_publisher가 시간에 따른 Transform을 계산해야 합니다.
18. TF Tree 진단 순서
Point Cloud가 어긋나거나 “Transform을 찾을 수 없다”는 오류가 나오면 다음 순서로 확인합니다.
- Message의
frame_id철자와 선행/사용 여부를 확인한다. view_frames로 Tree가 연결되어 있고 Cycle이 없는지 확인한다.- Parent·Child 방향과 동일 Edge의 중복 발행자를 확인한다.
tf2_echo로 Translation, Rotation과 갱신 주기를 확인한다.- Message Timestamp와 TF Buffer 시간 범위를 비교한다.
- Static Transform이 실제 장착 위치·방향·단위와 맞는지 실측한다.
- RViz의 Fixed Frame을
map,odom,base_link로 바꿔 증상이 어디서 시작되는지 본다.
대표 명령은 다음과 같습니다.
ros2 run tf2_tools view_frames
ros2 run tf2_ros tf2_echo base_link laser_frame
ros2 topic echo /tf --once
ros2 topic echo /tf_static --once
19. 실전 코드 — Transform Chain 계산
아래 코드는 laser_frame의 Point를 base_link와 map으로 변환하고 역변환으로 원래 값을 검증합니다. 표기 target_from_source는 Source 좌표를 Target 좌표로 바꾸는 Matrix라는 뜻입니다.
from __future__ import annotations
import math
Mat4 = list[list[float]]
Point3 = tuple[float, float, float]
def transform_2d(x: float, y: float, z: float, yaw_deg: float) -> Mat4:
"""Source 좌표를 Target 좌표로 바꾸는 Z축 회전+이동 Matrix."""
yaw = math.radians(yaw_deg)
c, s = math.cos(yaw), math.sin(yaw)
return [
[c, -s, 0.0, x],
[s, c, 0.0, y],
[0.0, 0.0, 1.0, z],
[0.0, 0.0, 0.0, 1.0],
]
def matmul(a: Mat4, b: Mat4) -> Mat4:
return [
[sum(a[i][k] * b[k][j] for k in range(4)) for j in range(4)]
for i in range(4)
]
def apply_to_point(t: Mat4, point: Point3) -> Point3:
homogeneous = [*point, 1.0]
result = [sum(t[i][k] * homogeneous[k] for k in range(4)) for i in range(4)]
return tuple(round(value, 6) for value in result[:3]) # type: ignore[return-value]
def inverse_rigid(t: Mat4) -> Mat4:
rotation_transpose = [[t[j][i] for j in range(3)] for i in range(3)]
translation = [t[0][3], t[1][3], t[2][3]]
inverse_translation = [
-sum(rotation_transpose[i][k] * translation[k] for k in range(3))
for i in range(3)
]
return [
[*rotation_transpose[0], inverse_translation[0]],
[*rotation_transpose[1], inverse_translation[1]],
[*rotation_transpose[2], inverse_translation[2]],
[0.0, 0.0, 0.0, 1.0],
]
def main() -> None:
# laser 좌표를 base 좌표로: Sensor는 앞 0.20 m, 위 0.15 m에 정방향 장착
base_from_laser = transform_2d(0.20, 0.0, 0.15, 0.0)
# base 좌표를 map 좌표로: Robot은 (3, 1)에 있고 yaw=45°
map_from_base = transform_2d(3.0, 1.0, 0.0, 45.0)
map_from_laser = matmul(map_from_base, base_from_laser)
point_laser = (3.0, 0.0, 0.0)
point_base = apply_to_point(base_from_laser, point_laser)
point_map = apply_to_point(map_from_laser, point_laser)
point_back = apply_to_point(inverse_rigid(map_from_laser), point_map)
print("laser:", point_laser)
print("base :", point_base)
print("map :", point_map)
print("back :", point_back)
assert all(abs(a - b) < 1e-6 for a, b in zip(point_laser, point_back))
if __name__ == "__main__":
main()
Matrix 순서를 바꾸어 결과가 어떻게 달라지는지 확인해 보세요. 또한 apply_to_point의 마지막 값을 0.0으로 바꾸면 Translation을 받지 않는 방향 Vector 변환이 됩니다.
20. 현장에서 자주 발생하는 실수
| 증상 | 가능한 원인 | 확인 방법 |
|---|---|---|
| Point Cloud가 90° 누움 | Optical Frame Rotation 누락 | camera_link → optical 확인 |
| Robot이 반대로 회전 | Yaw 부호 또는 왼손 축 사용 | REP-103과 Encoder 부호 확인 |
| Sensor가 Robot에서 떨어져 보임 | mm를 m로 입력 | Static Translation 단위 확인 |
| RViz에서 Robot이 떨림 | 동일 TF 중복 발행 | 발행 Node와 /tf 확인 |
| 과거·미래 Extrapolation | Timestamp·Clock 불일치 | Message와 TF 시각 비교 |
| map에서 Pose가 순간 이동 | Localization 보정 | odom에서 연속인지 비교 |
| Quaternion 오류 | (0,0,0,0) 또는 비정규화 |
Norm과 w=1 Identity 확인 |
| 변환 후 위치가 전혀 다름 | Matrix 순서·방향 반대 | Frame 첨자와 역변환 시험 |
21. 이 장의 핵심 정리
- 좌표값에는 반드시 기준 Frame, Timestamp, 단위와 축 규약이 필요하다.
- ROS 본체 축은 X 전방, Y 왼쪽, Z 위인 오른손 좌표계다.
- Camera Optical Frame은 Z 전방, X 오른쪽, Y 아래다.
map은 전역 일관성,odom은 연속성,base_link는 Robot 본체를 담당한다.- Point에는 Rotation과 Translation, 방향 Vector에는 Rotation만 적용한다.
ᵃT_b는 b 좌표를 a 좌표로 바꾸며 Transform Chain의 곱셈 순서가 중요하다.- Quaternion은 Unit Length여야 하고
(0,0,0,1)이 Identity Rotation이다. - TF2는 Frame Tree뿐 아니라 측정 시각에 맞는 Transform도 관리한다.
- 같은 TF Edge는 한 발행자가 책임지고 Static과 Dynamic Transform을 구분한다.
- Coordinate Frame좌표 Frame
- 공간의 위치와 방향을 숫자로 표현하기 위한 원점과 축 방향의 기준입니다.
- Transform좌표 변환
- 두 Frame 사이의 Translation과 Rotation 관계 또는 한 Frame의 좌표를 다른 Frame 좌표로 바꾸는 연산입니다.
- Translation평행이동
- 두 좌표 Frame의 원점이 얼마나 떨어져 있는지를 나타내는 위치 변화입니다.
- Rotation Matrix회전행렬
- 좌표축이나 Vector의 3차원 Rotation을 표현하는 직교 3×3 Matrix입니다.
- Homogeneous Transform동차변환행렬
- Rotation과 Translation을 하나의 4×4 Matrix로 표현하여 합성과 역변환을 쉽게 하는 방법입니다.
- Right-handed Coordinate System오른손 좌표계
- 오른손의 X축과 Y축 방향으로부터 Z축과 양의 회전 방향이 정해지는 좌표계입니다.
- REP-103ROS 단위·좌표 규약
- ROS의 SI 단위, 오른손 좌표계, 본체·광학·지리 좌표 방향을 정의하는 표준 권고안입니다.
- REP-105이동 Robot Frame 규약
- map, odom과 base_link 등 이동 Robot의 대표 Frame 의미와 관계를 정의하는 권고안입니다.
- Optical Frame카메라 광학 Frame
- Z축이 렌즈 전방, X축이 영상 오른쪽, Y축이 영상 아래를 향하는 Camera 좌표계입니다.
- base_linkRobot 본체 Frame
- Robot의 본체에 고정되어 Robot과 함께 이동하고 회전하는 기준 Frame입니다.
- base_footprint지면 투영 Frame
- Robot 본체를 지면에 투영하여 2D 위치와 Yaw를 표현하기 편하게 만든 Frame입니다.
- map Frame지도 Frame
- 장기적으로 Drift하지 않는 전역 기준이지만 Localization 보정 때 Pose가 바뀔 수 있는 Frame입니다.
- odom FrameOdometry Frame
- 짧은 시간에 연속적이고 부드럽지만 적분 오차로 장기 Drift할 수 있는 Local Frame입니다.
- TF2시간 기반 좌표 변환 Library
- ROS 2에서 Frame Tree와 시간별 Transform을 저장하고 조회·보간하는 Library입니다.
- Static Transform정적 좌표 변환
- 고정 장착 Sensor처럼 운전 중 위치와 자세가 변하지 않는 Frame 사이 관계입니다.
- Dynamic Transform동적 좌표 변환
- Odometry나 Joint처럼 시간에 따라 위치 또는 자세가 바뀌는 Frame 사이 관계입니다.
- Euler Angles오일러각
- 정해진 Rotation 순서의 Roll, Pitch와 Yaw 세 각도로 3차원 자세를 표현하는 방법입니다.
- Gimbal Lock짐벌락
- Euler Angle의 특정 자세에서 두 Rotation 축이 겹쳐 표현의 자유도 하나를 구분할 수 없게 되는 현상입니다.
- Quaternion쿼터니언
- Gimbal Lock 없이 3차원 Rotation을 표현하는 네 성분의 수학적 표현으로 Unit Length를 유지해야 합니다.
- Extrapolation Error시간 범위 밖 변환 오류
- 요청한 시각의 Transform이 TF Buffer의 과거·미래 저장 범위 밖에 있어 조회할 수 없는 오류입니다.
연습 문제
- 좌표
(3, 0, 0)만으로 물리적 위치를 결정할 수 없는 이유를 설명하세요. - REP-103 본체 Frame의 X·Y·Z 양의 방향을 쓰세요.
angular.z > 0일 때 일반적인 이동 Robot이 좌회전하는 이유를 설명하세요.camera_link와camera_optical_frame의 축 규약 차이를 설명하세요.- ENU와 NED의 축 방향 차이를 쓰고 변환이 필요한 이유를 설명하세요.
map과odomFrame의 연속성과 장기 정확성을 비교하세요.base_footprint를 사용하는 이유를 설명하세요.- 같은 TF Edge를 두 Node가 발행하면 어떤 문제가 생길 수 있나요?
- Point와 방향 Vector가 Translation에 다르게 반응하는 이유를 설명하세요.
- 올바른 Rotation Matrix가 만족해야 할 성질 두 가지를 쓰세요.
ᵃT_b와ᵇT_a의 관계와 역변환 Translation이-Rᵀt인 이유를 설명하세요.- Active Rotation과 Passive Transform의 차이를 설명하세요.
- Gimbal Lock이 Robot의 물리적 자유도 손실과 다른 이유는 무엇인가요?
- Identity Quaternion과 잘못된 Zero Quaternion 값을 각각 쓰세요.
- TF2에서 Extrapolation Error가 발생하는 원인과 점검 항목을 세 가지 쓰세요.
참고 자료
- ROS Enhancement Proposal REP-103, Standard Units of Measure and Coordinate Conventions
- ROS Enhancement Proposal REP-105, Coordinate Frames for Mobile Platforms
- ROS 2 Documentation,
tf2Tutorials - ROS 2 Documentation,
geometry_msgsandsensor_msgs - John J. Craig, Introduction to Robotics: Mechanics and Control
- Kevin M. Lynch and Frank C. Park, Modern Robotics
COMMUNITY
강의 댓글
질문과 학습 경험을 함께 나눠보세요.댓글을 불러오는 중입니다.