이 문서는 Achilles가 만든 평면상의 한 붓 경로를, Rabbit의 2 pulley animator가 어떻게 따라갈 수 있는지 수학적으로 정리한 메모다.
핵심 질문은 하나다.
평면 경로 P(t) = (x(t), y(t))를 좌/우 모터 명령으로 어떻게 바꿀 것인가?이 문서는 구현체보다 먼저, 구조를 단순하게 이해하는 데 목적이 있다.
L = (xL, yL)R = (xR, yR)P = (x, y)lLlRrLrRthetaLthetaR여기서 Achilles는 P(t)를 만든다.
Rabbit은 이 P(t)를 받아서 lL(t), lR(t)와 thetaL(t), thetaR(t)로 바꾼다.
두 줄 길이는 그냥 pulley 중심과 헤드 위치 사이의 거리다.
lL(x, y) = sqrt((x - xL)^2 + (y - yL)^2)lR(x, y) = sqrt((x - xR)^2 + (y - yR)^2)즉 Rabbit의 가장 기본적인 forward model은 거리 함수 두 개다.
한 줄 요약:
XY 위치 -> 두 줄 길이
줄이 pulley에 감기거나 풀릴 때, 줄 길이 변화는 각도 변화로 바뀐다.
초기 길이를 lL0, lR0, 초기 각도를 thetaL0, thetaR0라고 두면:
thetaL = thetaL0 + (lL - lL0) / rLthetaR = thetaR0 + (lR - lR0) / rR즉 Rabbit에서 실제 모터 제어에 필요한 것은:
lL(t), lR(t)thetaL(t), thetaR(t)이다.
Achilles가 만든 경로를:
P(t) = (x(t), y(t))라고 두면, Rabbit은 단순히 이 함수를 거리 함수에 대입한다.
lL(t) = lL(x(t), y(t))lR(t) = lR(x(t), y(t))다시 말해:
평면 경로를 만든다좌/우 줄 길이 경로로 바꾼다모터 각도 경로로 바꾼다한 줄 요약:
Achilles = XY planner
Rabbit = XY -> cable lengths -> motor angles converter
시간에 따라 움직인다고 하면, 헤드 속도는:
vx = dx/dtvy = dy/dt줄 길이 속도는 다음처럼 된다.
dlL/dt = ((x - xL) * vx + (y - yL) * vy) / lLdlR/dt = ((x - xR) * vx + (y - yR) * vy) / lR행렬로 쓰면:
[ dlL/dt ] [ (x-xL)/lL (y-yL)/lL ] [ vx ]
[ dlR/dt ] = [ (x-xR)/lR (y-yR)/lR ] [ vy ]
이 행렬이 XY velocity -> cable velocity 변환의 Jacobian이다.
모터 속도는 pulley 반지름으로 나누면 된다.
dthetaL/dt = (1 / rL) * dlL/dtdthetaR/dt = (1 / rR) * dlR/dt이 식은 매우 중요하다.
나중에 Rabbit이:
을 감지할 때 바로 이 식을 쓴다.
반대로 lL, lR에서 현재 헤드 위치를 추정할 수도 있다.
가장 단순한 경우 pulley가 같은 높이에 있고:
L = (0, 0)R = (W, 0)이면:
x = (W^2 + lL^2 - lR^2) / (2W)y = sqrt(lL^2 - x^2)가 된다.
이때 실제 시스템에서는 보통 pulley 아래쪽 해를 선택한다.
즉 두 줄 길이만 알아도 헤드의 평면 위치를 복원할 수 있다.
Rabbit은 단순 plotter가 아니라, gravity의 영향을 받는 시스템이다.
즉 이상적인 수학 모델은 헤드가 점 P(t)를 정확히 지난다고 가정하지만, 실제 기구는:
이런 현상이 생긴다.
따라서 Rabbit의 물리 모델은 보통 두 층으로 나뉜다.
P(t)lL(t), lR(t)thetaL(t), thetaR(t)즉 실제 Rabbit 애니메이터에서 보이는 출렁임은, 위의 이상 기하 위에 얹힌 2차 모델이다.
이 모델이 있으면 Achilles와 Rabbit의 역할을 깔끔하게 나눌 수 있다.
XY 경로를 그릴 것인가XY 경로를 pulley 시스템이 실제로 따라갈 수 있는가즉 Achilles가 무엇을 그릴까를 정하고,
Rabbit이 그걸 pulley가 어떻게 그릴까를 정한다.
나중엔 Rabbit을 의식해서 Achilles의 경로 선택에도 비용을 줄 수 있다.
예를 들어:
cost = geometricCost + lambda * motorCost여기서:
geometricCostsmoothness
motorCost
|dlL/dt| + |dlR/dt||dthetaL/dt| + |dthetaR/dt||d²theta/dt²|같은 항목을 둘 수 있다.
즉 장기적으로는 Achilles와 Rabbit이 완전히 분리되기보다, Rabbit의 물리 비용이 Achilles의 경로 선택에 다시 피드백될 수 있다.
이 문서의 핵심은 한 문장으로 요약할 수 있다.
Achilles의 한 붓 경로는 Rabbit에서 두 줄 길이 함수로 바뀌고, 그것이 다시 두 모터 각도 함수로 바뀐다.
이 구조만 붙잡고 있으면:
를 같은 수학 위에서 이야기할 수 있다.