제어

제어 3 - 역기구학 수식 직접 풀기 + PID

2링크 로봇팔을 예로 들어, 목표 좌표를 관절각으로 바꾸는 방법과 실제 모터가 그 각을 따라가는 과정을 차근차근 살펴봅니다.

권민재

들어가며

이번 글의 목표는 로봇팔의 손을 원하는 좌표로 보내는 계산을, 식이 왜 필요한지부터 차근차근 확인해봅니다.

  1. FK — 관절각을 알 때 손의 위치를 구합니다.

  2. Closed-form — 목표 손 위치에서 관절각을 한 번에 구합니다.

  3. Jacobian — 목표를 향해 조금씩 움직일 관절 변화량을 구합니다.

  4. 의사역행렬과 DLS — 팔이 너무 펴진 자세에서도 변화량이 과해지지 않게 합니다.

  5. PID — 계산된 목표 관절각까지 실제 모터를 움직입니다.

전제는 2링크 평면 로봇팔입니다. 링크 길이는 L1,L2L_1, L_2, 어깨와 팔꿈치 관절각은 θ1,θ2\theta_1, \theta_2로 표기합니다. 실제 계산에서는 각도를 라디안으로 사용합니다.

어깨(θ₁) ── L₁ ── 팔꿈치(θ₂) ── L₂ ── 손(x, y)

0. 출발점 — 정기구학(FK) 세우기

먼저 답할 질문은 이것입니다.

“어깨와 팔꿈치를 이 각도로 놓으면, 손, EE은 어디에 있는가?”

이 질문에 답하는 식이 정기구학, 즉 FK입니다. 링크 1이 만드는 팔꿈치 위치에 링크 2가 더하는 위치를 합치면 손의 최종 위치가 됩니다.

x=L1cos⁡θ1+L2cos⁡(θ1+θ2)x = L_1\cos\theta_1 + L_2\cos(\theta_1+\theta_2)y=L1sin⁡θ1+L2sin⁡(θ1+θ2)y = L_1\sin\theta_1 + L_2\sin(\theta_1+\theta_2)

예를 들어 L1=L2=1L_1=L_2=1, θ1=0∘\theta_1=0^\circ, θ2=90∘\theta_2=90^\circ이면 손은 (1,1)(1,1)에 놓입니다. 뒤에서 나오는 Closed-form은 이 FK 식을 거꾸로 푼 것이고, Jacobian은 이 식을 조금 움직이는 경우로 미분한 것입니다.

1. Closed-form — 코사인 법칙으로 직접 풀기

이번에는 질문을 반대로 생각해봅니다.

“손을 (x,y)(x,y)에 두려면 관절은 몇 도여야 하는가?”

2링크 평면 팔은 코사인 법칙을 이용해 이 답을 한 번에 구할 수 있습니다. 먼저 어깨에서 목표점까지의 거리 제곱을 둡니다.

r2=x2+y2r^2=x^2+y^2
코사인 법칙: r² = L₁² + L₂² − 2·L₁·L₂·cosβ, β = π − θ₂ (원점·팔꿈치·말단이 이루는 삼각형)
목표점과 두 링크가 만드는 삼각형에 코사인 법칙을 적용합니다.

코사인 법칙으로 팔꿈치 각도의 코사인값을 구합니다.

c2=x2+y2−L12−L222L1L2=cos⁡θ2c_2=\frac{x^2+y^2-L_1^2-L_2^2}{2L_1L_2}=\cos\theta_2s2=±1−c22,θ2=atan2⁡(s2,c2)s_2=\pm\sqrt{1-c_2^2}, \qquad \theta_2=\operatorname{atan2}(s_2,c_2)

±\pm가 붙는 이유는 같은 목표점에도 팔꿈치를 위로 굽히는 자세와 아래로 굽히는 자세, 두 해가 있을 수 있기 때문입니다.

θ₂ = ±90°일 때 같은 점 (1,1)에 닿는 elbow-up과 elbow-down 두 해
목표점 하나에 서로 다른 두 자세가 대응할 수 있습니다.

팔꿈치 각도를 얻으면, 목표점을 향한 방향에서 링크 2가 차지하는 각을 빼 어깨 각도를 구합니다.

θ1=atan2⁡(y,x)−atan2⁡(L2s2, L1+L2c2)\theta_1=\operatorname{atan2}(y,x)-\operatorname{atan2}(L_2s_2,\,L_1+L_2c_2)
θ₁ = α − γ. α는 목표점 방향, γ는 링크 1과 목표점 사이의 각
어깨 각도는 목표 방향에서 링크 2 때문에 생기는 각을 뺀 값입니다.

1-3. 숫자로 확인 — 깔끔한 예시

L1=L2=1L_1=L_2=1, 목표점이 (1,1)(1,1)이라고 하겠습니다.

c2=12+12−12−122×1×1=0c_2=\frac{1^2+1^2-1^2-1^2}{2\times1\times1}=0

따라서 한 해에서는 θ2=90∘\theta_2=90^\circ이고,

θ1=atan2⁡(1,1)−atan2⁡(1,1)=0∘\theta_1=\operatorname{atan2}(1,1)-\operatorname{atan2}(1,1)=0^\circ

가 됩니다. 즉 어깨는 0∘0^\circ, 팔꿈치는 90∘90^\circ입니다. FK 식에 다시 넣으면 손이 정확히 (1,1)(1,1)로 돌아옵니다.

Closed-form은 빠르고 정확합니다. 다만 링크 수가 많아지거나 관절 제한, 장애물 회피 같은 조건이 늘어나면 식을 직접 만들기 어려워집니다.

2. Jacobian — 미분으로 만드는 일반 해법

이번에는 정답을 한 번에 구하지 않고 목표를 향해 조금씩 다가가 보겠습니다.

“손을 아주 조금 오른쪽이나 위쪽으로 옮기려면, 어느 관절을 얼마나 돌려야 하는가?”

Jacobian JJ는 현재 자세에서의 작은 움직임 변환표입니다.

Δx=JΔq\Delta x=J\Delta q
  • Δx\Delta x: 손이 움직여야 할 작은 거리

  • Δq\Delta q: 관절이 움직여야 할 작은 각도

  • JJ: 현재 자세에서 관절 움직임을 손 움직임으로 바꾸는 표

FK 식을 θ1,θ2\theta_1,\theta_2에 대해 미분하면 다음 행렬이 나옵니다.

J=[−L1sin⁡θ1−L2sin⁡(θ1+θ2)−L2sin⁡(θ1+θ2)L1cos⁡θ1+L2cos⁡(θ1+θ2)L2cos⁡(θ1+θ2)]J=\begin{bmatrix}-L_1\sin\theta_1-L_2\sin(\theta_1+\theta_2) & -L_2\sin(\theta_1+\theta_2)\\ L_1\cos\theta_1+L_2\cos(\theta_1+\theta_2) & L_2\cos(\theta_1+\theta_2)\end{bmatrix}
자코비안 J의 두 열은 각 관절이 말단을 움직이는 방향과 크기
첫 번째 열은 어깨, 두 번째 열은 팔꿈치를 조금 돌렸을 때 손의 움직임입니다.

2-2. 거꾸로 풀기 — 역행렬과 행렬식

손의 목표 방향 Δx\Delta x를 알고 있을 때 관절 변화량 Δq\Delta q를 구하려면 변환을 거꾸로 풀어야 합니다.

Δq=J−1Δx\Delta q=J^{-1}\Delta x

단, 역행렬은 존재할 때만 쓸 수 있습니다. 2링크 팔에서는 행렬식이

det⁡J=L1L2sin⁡θ2\det J=L_1L_2\sin\theta_2

입니다. 이 값이 0에 가까우면 팔이 펴지거나 접힌 특이점에 가까워졌다는 신호입니다.

2-3. 정사각이 아니거나 특이점일 때 — 의사역행렬과 DLS

역행렬을 쓸 수 없거나 불안정할 때는 의사역행렬을 사용합니다.

Δq=J+Δx\Delta q=J^+\Delta x

의사역행렬은 가능한 한 목표에 가깝게 가면서 관절 움직임도 작은 답을 고릅니다. 하지만 특이점에 아주 가까우면 이 방법도 큰 관절 변화량을 만들 수 있습니다. 이때는 DLS로 계산식을 완화합니다.

Δq=JT(JJT+λ2I)−1Δx\Delta q=J^{\mathsf T}(JJ^{\mathsf T}+\lambda^2I)^{-1}\Delta x

λ\lambda는 댐핑의 세기입니다. 작으면 목표를 더 정확히 따르고, 크면 관절 변화는 부드러워지지만 목표를 향한 한 걸음은 작아집니다.

3. 행렬이 한 스텝마다 어떻게 굴러가나 — 숫자로

이제 실제 숫자를 넣어 보겠습니다. L1=L2=1L_1=L_2=1, 시작 자세는 q0=(30∘,60∘)q_0=(30^\circ,60^\circ), 목표 손 위치는 (1.0,1.4)(1.0,1.4), 한 번에 적용할 비율은 α=0.5\alpha=0.5입니다.

FK로 구한 현재 손 위치는 EE=(0.866,1.500)EE=(0.866,1.500)이고, 목표까지의 오차는 다음과 같습니다.

Δx=[1.0−0.8661.4−1.500]=[0.134−0.100]\Delta x=\begin{bmatrix}1.0-0.866\\1.4-1.500\end{bmatrix}=\begin{bmatrix}0.134\\-0.100\end{bmatrix}

즉 손은 조금 오른쪽, 조금 아래로 가야 합니다. 이 자세의 Jacobian은

J=[−1.5−10.8660]J=\begin{bmatrix}-1.5 & -1\\0.866 & 0\end{bmatrix}

이고, 이를 거꾸로 풀면 Δq=(−0.1155, 0.0392)\Delta q=(-0.1155,\,0.0392) rad가 나옵니다. 절반만 적용하면 어깨는 약 3.31∘3.31^\circ 줄고 팔꿈치는 약 1.12∘1.12^\circ 늘어납니다.

자코비안 IK 반복: α = 0.5에서 매 스텝 오차가 줄어 목표 (1.0, 1.4)로 수렴
새 자세에서는 손 위치와 Jacobian을 다시 계산합니다.
현재 손 위치 계산
→ 목표와의 오차 계산
→ 현재 자세의 J 계산
→ Δq 계산
→ 관절각 갱신
→ 반복

이 과정을 반복하면 오차는 약 0.167→0.084→0.042→0.0210.167 \rightarrow 0.084 \rightarrow 0.042 \rightarrow 0.021처럼 줄어듭니다. Jacobian IK는 “정답을 한 번에 맞히기”보다 현재 위치에서 가장 좋은 작은 움직임을 계속 고르는 방법에 가깝습니다.

4. 특이점에서 무슨 일이 — 숫자로 본 pinv vs DLS

팔이 완전히 펴지거나 접히면 sin⁡θ2=0\sin\theta_2=0이어서 det⁡J=0\det J=0이 됩니다. 이 자세에서는 팔 바깥쪽 방향으로 손을 더 움직이기 어렵고, 계산은 작은 손 이동을 위해 관절을 지나치게 많이 돌리려 할 수 있습니다.

특이점에서 두 Jacobian 열이 거의 평행해지고 det J가 0에 가까워지는 모습
특이점 근처에서는 두 관절의 움직임이 비슷해져, 원하는 방향을 만들기 어려워집니다.

예를 들어 거의 펴진 자세에서는 의사역행렬이 작은 손 이동에 (32.8∘,−65.7∘)(32.8^\circ,-65.7^\circ)처럼 큰 관절 변화를 제안할 수 있습니다. 같은 조건에서 λ=0.1\lambda=0.1인 DLS는 (4.3∘,−8.7∘)(4.3^\circ,-8.7^\circ)처럼 더 작은 한 걸음을 제안합니다.

즉 DLS는 특이점 근처에서 “목표를 향해 가되, 너무 큰 걸음은 걷지 말자”라고 계산하는 댐핑 방법입니다.

5. PID — 목표 관절각을 실제로 추종하기

Closed-form은 목표 관절각을 한 번에 구하고, Jacobian IK는 관절 변화량을 반복해 목표 자세에 가까워집니다. 그러나 실제 로봇에서는 모터가 그 목표 각도까지 움직여야 합니다. 그 일을 PID가 담당합니다.

e(t)=θ∗−θ(t)e(t)=\theta^\ast-\theta(t)u(t)=Kpe(t)+Ki∫0te(τ)dτ+Kdde(t)dtu(t)=K_pe(t)+K_i\int_0^te(\tau)d\tau+K_d\frac{de(t)}{dt}
  • P: 아직 얼마나 모자라는지 보고 밀어 줍니다.

  • I: 오래 남아 있던 작은 오차까지 모아 없앱니다.

  • D: 목표를 지나치지 않도록 브레이크를 겁니다.

error = target_angle - current_angle
integral += error * dt
derivative = (error - previous_error) / dt

motor_command = Kp * error + Ki * integral + Kd * derivative

전체 흐름은 목표 손 위치 → Closed-form 또는 반복형 Jacobian IK → 목표 관절각 → PID → 실제 모터입니다. Jacobian IK에서는 매 반복의 Δq\Delta q가 누적되어 목표 관절각에 가까워집니다.

마무리

  • FK는 관절각에서 손 위치를 구합니다.

  • Closed-form은 목표 위치에서 관절각을 한 번에 구합니다.

  • Jacobian은 손의 작은 오차를 관절의 작은 변화량으로 바꿉니다.

  • DLS는 특이점 근처에서 관절 변화량을 완화합니다.

  • PID는 목표 관절각을 실제 모터가 따라가게 합니다.

Closed-form은 빠르게 정답을 구하는 공식이고, Jacobian은 목표로 조금씩 다가가는 지도이며, DLS는 특이점 근처의 댐핑 장치이고, PID는 실제 모터를 움직이는 운전 방법이다.

실습 과제 — 브라우저 시뮬레이터

위에서 유도한 식을 그대로 코드로 옮겨, 2링크 로봇팔이 목표를 따라가게 만들어 봅니다. 설치 없이 브라우저에서 바로 실행됩니다. 학생이 채우는 ik_step(q, target) 함수 한 번의 호출이 3장의 한 스텝입니다.

  • 목표 — 스켈레톤의 ik_step(q, target)를 채워 자코비안 IK를 구현하고, 팔이 목표 좌표에 수렴하게 만들기

  • 비교 — 특이점 근처에서 pseudoinverse와 DLS의 차이를 “특이점 예제”로 확인하기

  • 응용 — Pick & Place 모드에서 집기 → 옮기기 → 놓기를 수행하기

  • 제출물 — 완성 코드, 실행 결과(영상 또는 스크린샷), 특이점에서 pinv와 DLS를 비교한 1–2쪽 보고서

▶ 시뮬레이터 열기 — 첫 로딩만 인터넷이 필요하며 몇 초 걸릴 수 있습니다.