- 들어가며 — "로봇 하려면 수학 뭐부터 해야 하나요"
- 선형대수 — 여섯 갈래 중 유일하게 미룰 수 없는 것
- 삼각법과 회전 표현 — 함수 하나가 절반입니다
- 미적분과 다변수 — 자코비안은 편미분 표입니다
- 미분방정식과 제어이론 — 게인을 손으로 만지기 전에
- 확률과 추정 — 센서가 거짓말할 때
- 최적화 — 역기구학도 궤적 계획도 결국 이것입니다
- 순서로 정리하기 — 무엇을 언제, 무엇을 나중에
- 마치며 — 같은 도구가 계속 다시 나옵니다
들어가며 — "로봇 하려면 수학 뭐부터 해야 하나요"
이 질문에 대한 흔한 답이 두 가지 있습니다. 하나는 "선형대수랑 미적분이요"라는 답인데 너무 넓어서 어디서 멈춰야 할지 알 수 없습니다. 다른 하나는 대학원 커리큘럼을 그대로 옮겨 준 목록인데, 그것을 다 끝내고 로봇을 시작한 사람은 거의 없습니다.
문제는 목록이 아니라 순서와 깊이입니다. 로봇 팔을 만들다 보면 수학이 필요해지는 순간이 있는데, 그 순간마다 필요한 깊이가 전혀 다릅니다. 회전행렬을 곱하는 데는 학부 1학년 첫 달이면 충분하고, 특이점 근처에서 관절 속도가 왜 발산하는지 이해하려면 특이값 분해까지 가야 하며, 그 사이의 격차가 몇 학기입니다. 그런데 이 두 가지를 하나의 목록으로 주면 첫 줄에서 멈춥니다.
그래서 이 글은 여섯 갈래를 순서대로 정리하되, 각 갈래마다 세 가지를 함께 적었습니다.
- 로봇 팔의 어느 부분에서 정확히 쓰이는가
- 어느 수준까지면 충분한가
- 무엇을 나중으로 미뤄도 되는가
세 번째가 가장 중요합니다. 대부분의 사람이 멈추는 지점이 바로 "이건 안 배우고 넘어가도 되나"에서 확신이 없어질 때이기 때문입니다. 미뤄도 되는 것을 명시적으로 표시해 두면 진도가 나갑니다.
이 글은 로봇 팔의 구조에서 순기구학과 역기구학을 지나 제어 루프까지 온 시리즈의 마지막 글입니다. 앞의 네 글에서 계산은 이미 다 했으니, 이 글은 그 계산들의 아래에 무엇이 깔려 있었는지를 되짚습니다.
선형대수 — 여섯 갈래 중 유일하게 미룰 수 없는 것
로봇공학에서 선형대수는 도구가 아니라 언어입니다. 다른 다섯 갈래는 필요해질 때 배워도 되지만 이건 아닙니다. 회전행렬을 이해하지 못하면 순기구학 첫 줄을 못 읽습니다.
어디에 쓰이는가. 회전행렬, 동차변환행렬, 자코비안, 관성행렬이 전부 행렬입니다. 링크마다 좌표계를 붙이고 그 사이를 오가는 일은 전부 기저 변환입니다. 특이점은 자코비안의 랭크가 떨어지는 현상이고, 조작성은 특이값으로 정의되며, 여유자유도 로봇의 널스페이스는 말 그대로 영공간입니다.
깊이별로 나누면 이렇습니다.
첫째, 행렬 곱과 벡터. 즉시 필요합니다. 3×3과 4×4 행렬을 손으로 곱할 수 있고, 곱셈 순서가 바뀌면 결과가 달라진다는 것을 몸으로 알면 됩니다. T01 · T12와 T12 · T01이 다르다는 사실 하나가 좌표계 부호 실수의 절반을 막아 줍니다.
둘째, 기저 변환. 이것도 즉시 필요합니다. 그리고 이 개념 하나만 제대로 잡으면 순기구학은 사실상 끝납니다.
회전행렬을 "돌리는 연산"으로만 보면 외워야 할 것이 늘어납니다. 그 대신 열을 읽으세요. 회전행렬의 첫 번째 열은 회전된 좌표계의 x축이 원래 좌표계에서 어느 방향을 가리키는지이고, 두 번째 열은 y축, 세 번째 열은 z축입니다.
R = [ x̂' ŷ' ẑ' ] ← 새 좌표계의 세 축을 열로 나란히 적은 것
따라서 R · p_local 은
"p_local 의 성분들을 새 축 방향으로 가중합한다"는 뜻이 됩니다.
이렇게 보면 회전행렬의 성질들이 외울 것이 아니라 당연한 것이 됩니다. 열들이 서로 직교하고 길이가 1이라는 것은 좌표축이 직교하고 단위 길이라는 뜻이고, 그래서 역행렬이 전치와 같습니다. 축을 표로 적어 놓은 것이니 거꾸로 읽으면 역변환입니다.
셋째, 랭크와 영공간. 순기구학까지는 없어도 되고, 역기구학에 들어가면 필요합니다.
자코비안이 6×6인데 랭크가 5로 떨어지면 손끝이 갈 수 있는 방향이 6차원에서 5차원으로 줄어듭니다. 잃어버린 그 한 방향이 특이점에서 못 가는 방향입니다. 반대로 관절이 7개인 팔에서 자코비안은 6×7이고, 영공간이 1차원 남습니다. 그 영공간 안에서 관절을 움직이면 손끝은 가만히 있고 팔꿈치만 돕니다. 여유자유도가 이런 구조입니다.
넷째, 특이값 분해. 역기구학을 수치적으로 풀기 시작하면 필요합니다. 그리고 이 도구가 자코비안 분석의 주력입니다.
SVD는 행렬을 세 단계로 쪼갭니다.
J = U · Σ · Vᵀ
V : 관절공간에서 "어느 조합으로 움직일 것인가"의 주축
Σ : 그 조합이 손끝 속도로 얼마나 증폭되는가 (특이값, 대각)
U : 작업공간에서 "그 결과가 어느 방향인가"의 주축
왜 자코비안에 하필 SVD인지는 특이값의 의미를 보면 분명해집니다. 특이값 하나하나가 방향별 속도 전달비입니다. 큰 특이값에 해당하는 방향은 관절을 조금만 돌려도 손끝이 많이 가고, 작은 특이값 방향은 관절을 많이 돌려야 손끝이 조금 갑니다.
그러면 특이점이 무엇인지도 자동으로 나옵니다. 가장 작은 특이값이 0으로 가는 지점입니다. 그 방향으로 손끝을 움직이려면 관절 속도가 무한대여야 합니다. 최소 특이값은 그래서 "특이점까지 얼마나 남았는가"를 재는 자연스러운 척도이고, 최대와 최소의 비율인 조건수는 팔의 자세가 얼마나 균형 잡혀 있는지를 하나의 숫자로 알려 줍니다.
직접 확인해 보는 것이 설명을 읽는 것보다 빠릅니다. 위팔 0.20미터, 아래팔 0.15미터짜리 2링크 평면 팔의 자코비안을 팔꿈치 각도를 바꿔 가며 분해해 보겠습니다.
import numpy as np
L1, L2 = 0.20, 0.15
def jacobian(t1, t2):
"""2링크 평면 팔의 해석적 자코비안. 각 열이 관절 하나의 기여입니다."""
s1, c1 = np.sin(t1), np.cos(t1)
s12, c12 = np.sin(t1 + t2), np.cos(t1 + t2)
return np.array([
[-L1 * s1 - L2 * s12, -L2 * s12],
[ L1 * c1 + L2 * c12, L2 * c12],
])
def fk(t1, t2):
return np.array([L1 * np.cos(t1) + L2 * np.cos(t1 + t2),
L1 * np.sin(t1) + L2 * np.sin(t1 + t2)])
print(" 팔꿈치각 σ_max σ_min 조건수")
for deg in [90, 45, 20, 10, 5, 1, 0.1]:
J = jacobian(np.radians(30), np.radians(deg))
sv = np.linalg.svd(J, compute_uv=False)
print(f" {deg:6.1f}도 {sv[0]:.6f} {sv[1]:.6f} {sv[0] / sv[1]:12.1f}")
실행 결과입니다.
팔꿈치각 σ_max σ_min 조건수
90.0도 0.269451 0.111337 2.4
45.0도 0.351840 0.060292 5.8
20.0도 0.375011 0.027361 13.7
10.0도 0.379341 0.013733 27.6
5.0도 0.380427 0.006873 55.4
1.0도 0.380774 0.001375 276.9
0.1도 0.380789 0.000138 2769.3
팔꿈치가 펴질수록 최소 특이값이 0을 향해 내려가고 조건수가 폭발합니다. 10도에서 1도로, 다시 0.1도로 줄이면 조건수가 27.6, 276.9, 2769.3으로 정확히 10배씩 커집니다. 최소 특이값이 각도에 거의 비례해서 줄어들기 때문입니다. 팔을 완전히 편 자세가 특이점이라는 역기구학 글의 서술이 이 표 안에 숫자로 들어 있습니다.
그리고 감쇠 최소자승이 왜 통하는지도 여기서 설명됩니다. 의사역행렬은 특이값을 그대로 뒤집어서 1/σ를 쓰기 때문에 σ가 0에 가까우면 발산합니다. 감쇠를 넣으면 σ / (σ² + λ²) 형태가 되어, σ가 커질 때는 1/σ와 거의 같고 σ가 0에 가까울 때는 부드럽게 0으로 내려갑니다. 특이점에서 무한대가 아니라 "그 방향은 포기한다"가 되는 것입니다. SVD 없이 이걸 설명하려면 훨씬 어려워집니다.
어느 수준까지면 충분한가. 손으로 3×3 행렬 곱과 전치를 할 수 있고, 회전행렬의 열이 축이라는 것을 알고, 랭크와 영공간의 의미를 말로 설명할 수 있고, SVD의 세 조각이 각각 무엇인지 알면 됩니다. 계산은 numpy.linalg.svd가 해 줍니다. 특이값만 필요하면 compute_uv를 거짓으로 주면 U와 Vᵀ를 계산하지 않아 더 빠릅니다. 위 코드에서 그렇게 쓴 이유입니다.
무엇을 미뤄도 되는가. 추상 벡터공간의 공리, 조르당 표준형, 행렬식의 여인수 전개, 그람-슈미트 직교화의 손계산, 텐서 표기법입니다. 이것들은 로봇 팔에서 쓸 일이 사실상 없거나, 필요해질 때 그 자리에서 배워도 늦지 않습니다.
삼각법과 회전 표현 — 함수 하나가 절반입니다
이 갈래는 분량은 적은데 실수는 많이 나옵니다.
어디에 쓰이는가. 2링크와 3링크 팔의 역기구학 해석해가 코사인 법칙으로 풀립니다. 회전 표현은 손끝의 자세를 무엇으로 저장하고 어떻게 보간할지의 문제입니다.
먼저 함수 하나부터 짚습니다. atan2입니다.
import numpy as np
# atan2(y, x) 는 부호를 각각 보므로 사분면을 구별합니다.
print(np.degrees(np.arctan2( 1.0, 1.0))) # 45.0
print(np.degrees(np.arctan2( 1.0, -1.0))) # 135.0
print(np.degrees(np.arctan2(-1.0, -1.0))) # -135.0
# 반면 비율 하나만 넘기면 1사분면과 3사분면이 구별되지 않습니다.
print(np.degrees(np.arctan(1.0 / 1.0))) # 45.0
print(np.degrees(np.arctan(-1.0 / -1.0))) # 45.0 ← 실제로는 -135도
로봇 팔 코드에서 어깨 각도가 갑자기 180도 뒤집히는 버그는 대부분 여기서 나옵니다. 각도를 구할 때는 나눈 값 하나를 넘기지 말고 y와 x를 따로 넘기세요. 이 습관 하나가 부호 디버깅 시간의 상당 부분을 없애 줍니다.
asin과 acos에도 같은 함정이 있습니다. 정의역이 잘려 있어서, 반올림 오차로 입력이 1을 아주 조금 넘으면 NaN이 나옵니다. 코사인 법칙으로 팔꿈치 각도를 구하는 코드에서 목표가 정확히 팔 길이만큼 떨어져 있을 때 이 일이 실제로 일어납니다. 입력을 잘라 주는 한 줄이 필요합니다.
cos_t2 = np.clip(cos_t2, -1.0, 1.0) # 이 한 줄이 없으면 경계에서 NaN
회전 표현은 네 가지가 있고 각각 다른 곳에 씁니다.
| 표현 | 숫자 개수 | 강점 | 약점 | 주로 쓰는 곳 |
|---|---|---|---|---|
| 회전행렬 | 9 | 좌표 변환에 바로 곱함 | 저장이 크고 수치 드리프트 | 계산 내부 |
| 오일러각 | 3 | 사람이 읽고 씀 | 짐벌락, 순서 규약이 열두 가지 | 사용자 입력, 로그 |
| 축-각 | 4 | 물리적 의미가 직관적 | 합성이 번거로움 | 회전 명령 표현 |
| 쿼터니언 | 4 | 특이점 없음, 보간이 값쌈 | 사람이 못 읽음 | 자세 저장과 보간 |
실무에서 이 표가 뜻하는 바는 단순합니다. 사람이 만지는 경계에서는 오일러각, 내부 계산에서는 회전행렬 또는 쿼터니언입니다. 그리고 그 사이 변환을 한 군데로 모아 두면 부호 실수가 줄어듭니다.
오일러각의 순서 규약은 특히 조심할 부분입니다. 같은 세 숫자가 규약에 따라 다른 회전을 뜻합니다. 라이브러리 두 개를 섞어 쓸 때 자세가 이상해지면 규약을 먼저 확인하세요.
어느 수준까지면 충분한가. atan2를 반사적으로 쓰고, 코사인 법칙으로 삼각형을 풀 수 있고, 쿼터니언에 대해서는 "곱하면 회전 합성이고, 정규화를 유지해야 하고, 보간은 slerp를 쓴다" 정도를 알면 됩니다. 쿼터니언 대수를 유도할 필요는 없습니다.
무엇을 미뤄도 되는가. 사원수의 대수적 구성, 리 군과 리 대수, 지수사상과 로그사상, 스크류 이론입니다. 이것들은 나중에 아주 유용해지고 특히 최적화 기반 제어에서 코드를 깔끔하게 만들어 주지만, 첫 팔을 움직이는 데는 필요 없습니다. 시리얼 팔 하나를 끝까지 만들어 본 뒤에 보면 훨씬 잘 읽힙니다.
미적분과 다변수 — 자코비안은 편미분 표입니다
어디에 쓰이는가. 자코비안이 전부입니다. 그리고 자코비안은 로봇 팔에서 세 번 등장합니다. 속도 관계에서, 힘 관계에서, 그리고 확장 칼만 필터의 선형화에서 등장합니다.
자코비안이라는 이름이 위압적이지만 실체는 단순합니다. 출력 각각을 입력 각각으로 편미분한 값을 격자로 모은 것입니다.
손끝 위치가 (x, y) 이고 관절이 (θ1, θ2) 라면
J = [ ∂x/∂θ1 ∂x/∂θ2 ]
[ ∂y/∂θ1 ∂y/∂θ2 ]
j 번째 열 = "θj 만 1 rad/s 로 돌릴 때 손끝이 가는 방향과 크기"
열을 그렇게 읽는 습관을 들이면 자코비안이 손에 잡힙니다. 팔을 쭉 편 자세에서 두 열이 거의 같은 방향을 가리키게 되고, 그래서 두 열로 만들 수 있는 방향의 폭이 좁아지고, 그것이 앞 절의 최소 특이값이 0으로 가는 현상입니다. 같은 사실을 편미분으로도 SVD로도 볼 수 있습니다.
실무 요령이 하나 있습니다. 해석적 자코비안을 유도했으면 반드시 수치미분으로 검산하세요. 부호 하나 틀린 자코비안은 IK를 엉뚱한 방향으로 수렴시키고, 그 증상은 "느리게 수렴한다" 정도로만 보여서 원인을 찾기 어렵습니다.
def numeric_jacobian(f, q, eps=1e-6):
"""중심차분으로 자코비안을 근사합니다. 해석해 검산용입니다."""
q = np.asarray(q, dtype=float)
base = f(*q)
J = np.zeros((len(base), len(q)))
for j in range(len(q)):
dq = np.zeros_like(q)
dq[j] = eps
J[:, j] = (f(*(q + dq)) - f(*(q - dq))) / (2 * eps)
return J
q = np.radians([30.0, 40.0])
Ja = jacobian(*q)
Jn = numeric_jacobian(fk, q)
print("해석적 자코비안:\n", np.round(Ja, 8))
print("수치 자코비안 :\n", np.round(Jn, 8))
print("최대 오차 :", np.max(np.abs(Ja - Jn)))
실행 결과입니다.
해석적 자코비안:
[[-0.24095389 -0.14095389]
[ 0.2245081 0.05130302]]
수치 자코비안 :
[[-0.24095389 -0.14095389]
[ 0.2245081 0.05130302]]
최대 오차 : 2.6600312230673495e-11
오차가 1e-9 수준이면 유도가 맞은 것이고, 1e-2 수준이면 어딘가 틀린 것입니다. 중간값이 나오면 대개 부호가 아니라 단위(도와 라디안)를 섞은 경우입니다.
연쇄법칙도 여기서 정체가 드러납니다. 링크가 여섯 개인 팔에서 손끝 위치는 여섯 각도의 합성 함수이고, 자코비안을 구하는 일은 그 합성을 미분하는 일입니다. 프레임을 곱해 나간 것과 같은 구조로 미분이 이어집니다.
어느 수준까지면 충분한가. 편미분을 계산할 수 있고, 연쇄법칙을 쓸 수 있고, 그래디언트가 가장 가파른 방향이라는 것을 알고, 수치미분으로 검산할 수 있으면 됩니다. 해석적 자코비안을 손으로 유도하는 것은 2링크와 3링크까지만 해 보면 감이 옵니다. 6링크는 라이브러리에 맡기세요.
무엇을 미뤄도 되는가. 미분기하학, 다양체 위의 미적분, 변분법, 텐서 미적분입니다. 그리고 적분은 의외로 별로 안 씁니다. 로봇 팔에서 적분이 나오는 곳은 PID의 I항과 궤적의 누적 정도인데, 둘 다 이산 합으로 구현되므로 해석적 적분 기법은 쓸 일이 없습니다.
미분방정식과 제어이론 — 게인을 손으로 만지기 전에
어디에 쓰이는가. 팔이 왜 튀는지, PID의 세 항이 왜 그런 역할을 하는지, 제어 주기가 왜 안정성을 갉아먹는지가 전부 이 갈래입니다.
로봇 팔의 운동방정식은 이렇게 생겼습니다.
M(q)·q̈ + C(q, q̇)·q̇ + g(q) = τ
M(q) 관성행렬 — 자세에 따라 변합니다
C(q, q̇) 코리올리·원심력 — 속도의 제곱에 비례합니다
g(q) 중력 항 — 자세에만 의존합니다
τ 관절 토크 — 우리가 만드는 것
이 식을 풀 필요는 없습니다. 다만 읽을 수는 있어야 합니다. 세 가지가 보입니다. 첫째, 관성이 상수가 아니라 자세의 함수입니다. 그래서 팔을 접었을 때 잘 맞춘 게인이 폈을 때 안 맞습니다. 둘째, 속도의 제곱에 비례하는 항이 있어서 빠르게 움직일수록 비선형성이 커집니다. 셋째, 중력 항은 속도와 무관하게 항상 있습니다. 그래서 중력 보상을 피드포워드로 미리 빼 주면 피드백이 할 일이 크게 줄어듭니다.
제어이론에서 실제로 손에 붙여야 할 것은 2차 시스템 하나입니다.
표준형: ẍ + 2ζωn·ẋ + ωn²·x = ωn²·u
ωn 고유진동수 — 얼마나 빠른가
ζ 감쇠비 — 어떻게 도착하는가
ζ < 1 과소감쇠, 넘어갔다 돌아옵니다 (오버슈트)
ζ = 1 임계감쇠, 넘어가지 않으면서 가장 빠릅니다
ζ > 1 과감쇠, 느리게 스며듭니다
PD 제어기를 붙인 관절 하나가 정확히 이 형태가 됩니다. P 게인이 ωn²에, D 게인이 2ζωn에 대응합니다. 그러면 게인 튜닝의 의미가 달라집니다. 숫자 두 개를 감으로 만지는 것이 아니라, "얼마나 빠르게(ωn) 어떤 방식으로(ζ) 도착할 것인가"를 정하고 그것을 게인으로 환산하는 일이 됩니다.
이 대응을 알면 흔한 증상들이 바로 진단됩니다. 오버슈트가 크면 ζ가 작은 것이고 D를 올리면 됩니다. 느린데 오버슈트도 없으면 ωn이 작은 것이고 P와 D를 함께 올려야 합니다. P만 올리면 빨라지는 대신 ζ가 떨어져서 오버슈트가 생깁니다. 이 관계가 제어 루프 글에서 게인을 만지던 작업의 배경입니다.
지연 문제도 여기서 나옵니다. 제어 주기가 길거나 센서 필터가 지연을 만들면 피드백이 과거의 오차에 반응하게 되고, 그것은 위상이 뒤로 밀린다는 뜻입니다. 위상 여유가 줄어들면 게인을 조금만 올려도 발진합니다. "샘플링을 두 배 빠르게 했더니 게인을 더 올릴 수 있게 됐다"는 경험이 이 이론의 직접적인 결과입니다.
어느 수준까지면 충분한가. 2차 시스템 표준형을 보고 ζ와 ωn을 읽을 수 있고, 그것이 PD 게인과 어떻게 대응하는지 알고, 지연이 위상 여유를 깎는다는 사실을 알면 충분합니다. 라플라스 변환은 "미분이 곱셈이 된다"는 것과 극점의 위치가 응답을 정한다는 개념 정도면 됩니다.
무엇을 미뤄도 되는가. 상태공간 최적제어(LQR), 강건제어, 리아푸노프 안정성 증명, 나이퀴스트 판별법의 엄밀한 적용, 적응제어입니다. 이것들은 로봇 팔을 상품으로 만들 때 필요해지지만, 팔을 처음 움직이는 단계에서는 PD와 중력 보상으로 충분히 멀리 갈 수 있습니다.
확률과 추정 — 센서가 거짓말할 때
어디에 쓰이는가. 엔코더는 양자화되어 있고, IMU는 드리프트하고, 비전은 조명에 따라 흔들립니다. 여러 센서의 값이 서로 다를 때 무엇을 믿을지 정하는 것이 이 갈래입니다.
이 갈래는 앞의 넷보다 늦게 필요해집니다. 위치 제어만 하는 팔은 엔코더 하나만 쓰고 그 값을 그냥 믿어도 대체로 굴러갑니다. 확률이 필요해지는 시점은 대개 센서가 둘 이상이 될 때입니다. 팔에 카메라를 붙이거나, IMU를 더하거나, 힘 센서를 넣을 때입니다.
핵심 개념은 세 가지입니다.
첫째, 불확실성을 숫자로 적는 법. 측정값 하나가 아니라 "평균과 분산"의 쌍으로 다룹니다. 다차원이면 공분산 행렬이 되고, 그 행렬은 불확실성이 어느 방향으로 얼마나 퍼져 있는지를 나타내는 타원입니다. 여기서 선형대수가 다시 나옵니다. 공분산 행렬의 고유벡터가 타원의 축이고 고윳값이 축의 길이입니다.
둘째, 불확실성의 전파. 부정확한 관절 각도로 순기구학을 계산하면 손끝 위치도 부정확합니다. 얼마나 부정확한가는 자코비안으로 계산됩니다.
관절 각도의 공분산이 Σq 일 때, 손끝 위치의 공분산은
Σx ≈ J · Σq · Jᵀ
자코비안이 또 나왔습니다. 이것이 이 글에서 자코비안을 세 번 만난다고 한 이유입니다. 그리고 이 식은 실무적으로 중요한 사실을 말해 줍니다. 특이점 근처에서는 자코비안이 특정 방향으로 크게 증폭하므로, 같은 엔코더 오차가 손끝에서 훨씬 큰 오차가 됩니다. 특이점은 속도만의 문제가 아니라 정밀도의 문제이기도 합니다.
셋째, 칼만 필터. 이름은 무섭지만 1차원에서는 한 줄로 설명됩니다. 예측값과 측정값이 각각 불확실성을 갖고 있을 때, 둘을 정밀도(분산의 역수)로 가중평균하는 것입니다.
예측: x̂ = 5.0, 분산 = 4.0 (정밀도 0.25)
측정: z = 6.0, 분산 = 1.0 (정밀도 1.00)
가중치 = 1.00 / (0.25 + 1.00) = 0.8 ← 이것이 칼만 이득
갱신값 = 5.0 + 0.8 × (6.0 - 5.0) = 5.8
갱신 분산 = 1 / (0.25 + 1.00) = 0.8 ← 둘 중 어느 것보다도 작습니다
측정이 더 정확하니 그쪽으로 더 갔고, 두 정보를 합쳤으니 불확실성이 줄었습니다. 이게 전부입니다. 다차원 칼만 필터는 이 계산을 행렬로 옮긴 것이고, 확장 칼만 필터는 비선형 모델을 매 스텝 자코비안으로 선형화한 뒤 같은 계산을 하는 것입니다.
어느 수준까지면 충분한가. 가우시안의 평균과 분산, 공분산 행렬이 타원이라는 감각, 위의 1차원 칼만 갱신을 손으로 계산할 수 있는 정도면 됩니다. 실제 구현은 라이브러리를 쓰되 튜닝 파라미터인 프로세스 잡음과 측정 잡음이 무엇을 뜻하는지는 알아야 합니다.
무엇을 미뤄도 되는가. 파티클 필터, 팩터 그래프와 그래프 SLAM, 베이지안 추론의 이론적 기초, 정보 필터, 무향 칼만 필터입니다. 그리고 로봇 팔만 다룬다면 SLAM 전체를 미뤄도 됩니다. SLAM은 이동 로봇의 문제이고, 고정된 베이스를 가진 팔에서는 등장하지 않습니다.
최적화 — 역기구학도 궤적 계획도 결국 이것입니다
어디에 쓰이는가. 이 갈래의 요점은 앞에서 따로따로 배운 것들이 같은 틀 안으로 들어온다는 사실입니다.
수치적 역기구학은 최소자승 문제입니다. 목표 위치와 현재 위치의 차이를 최소화하는 관절 각도를 찾습니다. 감쇠 최소자승은 거기에 관절 속도 크기에 대한 벌점을 더한 것, 즉 정규화된 최소자승입니다. 머신러닝에서 릿지 회귀라고 부르는 것과 같은 구조입니다.
보통 최소자승: minimize ‖J·Δq - Δx‖²
감쇠 최소자승: minimize ‖J·Δq - Δx‖² + λ²·‖Δq‖²
└── 이 항이 발산을 막습니다
궤적 계획도 최적화입니다. 최소 저크 궤적은 저크의 제곱 적분을 최소화한 결과이고, 시간 최적 궤적은 토크와 속도 한계 아래에서 시간을 최소화한 결과입니다. 제어 루프 글에서 5차 다항식을 유도한 것도, 경계 조건 여섯 개를 만족하는 함수 중에서 매끄러운 것을 고른다는 점에서 같은 종류의 문제입니다.
요즘 팔 제어의 표준 형태는 속도 수준 역기구학을 이차계획법(QP)으로 푸는 것입니다. 목적은 손끝을 목표 속도로 움직이는 것이고, 제약으로 관절 각도 한계, 관절 속도 한계, 충돌 회피를 부등식으로 넣습니다. 한 번에 한 가지씩 처리하던 것들을 하나의 문제로 묶는 방식입니다.
여기서 알아야 할 개념은 세 가지입니다.
볼록과 비볼록의 차이. 볼록 문제는 국소해가 곧 전역해라서 어디서 출발해도 같은 곳에 도착합니다. 최소자승과 QP가 여기 속합니다. 반면 위치 수준 역기구학은 비볼록이라 초기값에 따라 다른 해로 갑니다. 팔꿈치가 위로 꺾인 해와 아래로 꺾인 해가 둘 다 정답인 상황이 그것입니다. 비볼록 문제에서 초기값은 알고리즘의 일부입니다. 직전 자세를 초기값으로 쓰는 이유가 여기 있습니다.
정규화의 의미. 벌점 항의 계수를 올리면 해가 작아지고 안정적이 되지만 목표 추종은 나빠집니다. 감쇠 최소자승의 감쇠 계수를 조정하는 것이 정확히 이 저울질이고, 특이점 근처에서만 감쇠를 키우는 기법은 저울의 위치를 상황에 따라 바꾸는 것입니다.
제약이 있는 문제와 없는 문제. 관절 한계를 벌점으로 넣는 것과 부등식 제약으로 넣는 것은 다릅니다. 벌점은 한계를 조금 넘는 해를 허용하고, 제약은 허용하지 않습니다. 실제 하드웨어에서 관절 한계를 넘으면 물리적으로 부딪히므로 제약 쪽이 맞습니다.
어느 수준까지면 충분한가. 최소자승 문제를 정규방정식으로 쓸 수 있고, 정규화 항이 무엇을 하는지 알고, 볼록성과 초기값 의존성의 관계를 알고, 그래디언트 하강이 어떻게 도는지 알면 됩니다. QP 솔버는 라이브러리를 씁니다.
무엇을 미뤄도 되는가. 내부점법의 구현, 쌍대성 이론과 KKT 조건의 유도, 순차 이차계획법(SQP)의 세부, 궤적 최적화의 직접법과 간접법 비교입니다. 이것들은 자기 솔버를 만들거나 논문을 쓸 때 필요합니다. 팔을 움직이는 데는 솔버를 호출할 줄 알면 됩니다.
순서로 정리하기 — 무엇을 언제, 무엇을 나중에
여섯 갈래를 하나의 표로 접으면 이렇습니다. 왼쪽으로 갈수록 먼저 필요하고, 오른쪽 열이 이 글에서 가장 중요한 부분입니다.
| 갈래 | 언제 필요해지나 | 로봇 팔의 어디에 | 이 정도면 충분 | 나중으로 미뤄도 되는 것 |
|---|---|---|---|---|
| 행렬 곱, 기저 변환 | 첫날 | 회전행렬, 동차변환 | 3×3 손계산, 열이 축이라는 이해 | 추상 벡터공간, 조르당 표준형 |
삼각법, atan2 | 첫 주 | 2링크 IK 해석해 | 코사인 법칙, 사분면 구별 | 리 군, 지수사상, 스크류 이론 |
| 회전 표현 | 3차원에 들어갈 때 | 자세 저장과 보간 | 네 표현의 용도 구분, slerp | 사원수 대수의 구성 |
| 편미분, 자코비안 | 속도를 다룰 때 | 속도·힘 관계, 수치 IK | 편미분과 연쇄법칙, 수치 검산 | 미분기하, 변분법 |
| 랭크, 영공간, SVD | 특이점을 만날 때 | 특이점, 조작성, 여유자유도 | 특이값이 방향별 전달비라는 이해 | 수치 SVD 알고리즘 구현 |
| 2차 시스템, 감쇠비 | 게인을 만질 때 | PID 튜닝, 지연과 안정성 | ζ와 ωn이 게인에 대응하는 관계 | LQR, 강건제어, 리아푸노프 증명 |
| 최소자승, 정규화 | 수치 IK를 쓸 때 | DLS, 궤적 최적화 | 정규방정식, 벌점의 역할 | 내부점법, KKT 유도, SQP |
| 가우시안, 공분산 | 센서가 둘 이상일 때 | 오차 전파, 필터링 | 1차원 칼만 손계산 | 파티클 필터, 팩터 그래프 |
교재를 하나만 고른다면 케빈 린치와 프랭크 박의 Modern Robotics: Mechanics, Planning, and Control을 권합니다. 프리프린트 PDF와 영상 강의, 그리고 파이썬·MATLAB·Mathematica 구현이 모두 공개되어 있어서 표의 어느 줄에서 막히든 해당 장을 찾아 들어갈 수 있습니다. 다만 이 책은 스크류 이론을 앞세우는 구성이라 위 표의 "미뤄도 되는 것"을 먼저 만나게 됩니다. 처음 읽을 때는 그 부분을 건너뛰고 필요한 장만 골라 보셔도 됩니다.
가장 흔한 실수는 이 표를 위에서 아래로 다 끝낸 다음에 로봇을 시작하려는 것입니다. 반대로 하는 편이 훨씬 빠릅니다. 첫 두 줄만 들고 2링크 팔을 움직여 보고, 특이점에서 팔이 미쳐 날뛰는 것을 직접 본 다음에 다섯 번째 줄을 읽으면 그날 이해됩니다. 필요가 생긴 뒤에 배우는 것과 필요를 상상하며 배우는 것은 흡수율이 다릅니다.
그리고 미뤄도 되는 것 열을 다시 보시기 바랍니다. 저 오른쪽 열의 항목들은 하나같이 학부 커리큘럼의 상당 부분을 차지합니다. 리 군, LQR, KKT 조건, 파티클 필터. 이것들이 필요 없다는 뜻이 아니라, 이것들 없이도 동작하는 팔을 만들 수 있다는 뜻입니다. 그리고 동작하는 팔을 한 번 만들어 본 사람이 저 목록을 읽으면 각 항목이 어느 문제를 푸는지 보이기 때문에 훨씬 빨리 배웁니다.
미루면 안 되는 것도 분명히 말씀드립니다. 첫 두 줄입니다. 행렬 곱과 기저 변환, 그리고 atan2. 이 셋을 건너뛰면 그 뒤의 모든 것이 외우기가 됩니다.
마치며 — 같은 도구가 계속 다시 나옵니다
이 글을 쓰면서 다시 확인한 것이 하나 있습니다. 여섯 갈래로 나눠 놓았지만 실제로는 몇 개의 도구가 계속 다시 나온다는 사실입니다.
자코비안은 속도 관계에서 처음 나오고, 힘 관계에서 다시 나오고, 오차 전파에서 또 나오고, 확장 칼만 필터의 선형화에서 다시 나옵니다. SVD는 특이점을 설명하고, 조작성을 정의하고, 감쇠 최소자승이 왜 통하는지를 설명하고, 공분산 타원의 축을 알려 줍니다. 최소자승은 역기구학이고 궤적 계획이고 필터링입니다.
그래서 학습 전략도 정해집니다. 넓게 훑기보다 자주 나오는 도구를 깊게 파는 편이 낫습니다. 자코비안 하나를 네 가지 맥락에서 이해하면 그 네 곳을 따로 배우는 것보다 적게 걸리고 오래 남습니다.
그리고 이 글의 목록에서 가장 값이 큰 부분은 앞이 아니라 뒤, 미뤄도 되는 것들입니다. 배울 것을 정하는 일보다 안 배울 것을 정하는 일이 진도를 냅니다. 수학이 부족해서 로봇을 못 시작한 사람보다, 다 배우고 시작하려다 못 시작한 사람이 훨씬 많습니다.
한 줄로 줄이면 이렇습니다 — 행렬 곱과 atan2만 들고 시작해도 팔은 움직입니다. 나머지는 팔이 이상하게 움직일 때 배우면 됩니다.
현재 단락 (1/187)
이 질문에 대한 흔한 답이 두 가지 있습니다. 하나는 "선형대수랑 미적분이요"라는 답인데 너무 넓어서 어디서 멈춰야 할지 알 수 없습니다. 다른 하나는 대학원 커리큘럼을 그대로 옮...