제3부 동역학
3.1 강체 동역학 기초: 관성 텐서·뉴턴-오일러 방정식·공간 관성
3.1.1 이 장에서 배우는 것 / 선수 지식 / 특히 중요한 독자
이 장은 로봇 링크 하나를 이루는 강체 한 개의 동역학을 정리한다. 질량 중심과 관성 텐서의 정의, 기준점·축을 바꿀 때의 변환(평행축 정리·회전·복합체), 관성 매개변수가 물리적으로 가능하기 위한 조건, 뉴턴 방정식과 오일러 방정식, 토크 없는 회전의 보존량과 축 안정성, 트위스트·렌치로 합친 공간 관성 행렬과 식 $F=G\dot V-\mathrm{ad}_V^{T}GV$를 계산으로 확인한다. 링크 여러 개를 관절로 잇는 재귀 알고리즘은 3.2, 에너지에서 같은 식을 얻는 라그랑주 정식화는 3.3, 운동방정식의 질량행렬·코리올리·중력항의 성질은 3.4, 합성 강체·관절체 알고리즘과 공간 벡터 대수는 3.5, 동역학 라이브러리는 3.6, 관성 매개변수 식별은 3.7, CAD에서 관성을 뽑아 모델로 만드는 과정은 4.15으로 이어진다.
배우는 것:
- 관성 텐서 — 점질량 합·적분 정의, 대칭·양의 정부호, 주축과 주관성 모멘트, 표준 형상의 닫힌 식, 삼각형 메시의 부호 있는 사면체 분해.
- 기준점·축의 변경 — 평행축(슈타이너) 정리, 회전 변환, 복합체의 합산.
- 물리적 타당성 — 10개 관성 매개변수, 삼각형 부등식, 유사 관성 행렬.
- 뉴턴-오일러 방정식 — 점질량 합에서의 유도, 오일러 방정식, 세계 프레임·물체 프레임 형태의 동등성.
- 토크 없는 회전 — 에너지·각운동량 보존, 최소·중간·최대 축의 안정성과 선형화 성장률.
- 공간 관성 — $6\times6$ 행렬 $G$, 운동량·에너지, 프레임 변환, URDF·MJCF 입력과의 대응.
선수 지식: 1.1(선형대수 I: 고유분해), 1.6(동차변환과 SE(3)), 1.7(리군·리대수 I), 1.10(스크루 이론: 트위스트·렌치·수반 표현), 1.18(ODE 적분기).
특히 중요한 독자: 로봇 모델(URDF·MJCF)의 관성 값을 작성하거나 검증하는 엔지니어, 동역학 코드를 구현하는 개발자, 부하(페이로드) 설정이 제어 성능에 미치는 영향을 따지는 시스템 통합자.
출처 방침. 기준 시점은 2026-11-05이다. 직접 읽은 자료: Lynch·Park, Modern Robotics(사전 인쇄본 2017-05판)의 8.1절(라그랑주 정식화), 8.2절(단일 강체: 고전 정식화·트위스트-렌치 정식화·다른 프레임), 8.3절(뉴턴-오일러 역동역학), 8.4절 앞부분(운동 에너지와 질량행렬), 8.8절(URDF의 관성)을 텍스트로 읽었다. ROS wiki의 URDF
<link>요소 문서(<inertial>항)와 MuJoCo 문서(계산 개관의 변수 표, XML 참조의inertial항)를 읽었다. 이 장의 식은 이 자료의 서술을 따르되 점질량 직접 합과 라이브러리 비교로 다시 확인했다. 서지만 확인한 것(Crossref로 실재를 확인했고 본문은 읽지 못했다): Featherstone(2008, Rigid Body Dynamics Algorithms), Mirtich(1996, 다면체 질량 특성), Wensing·Kim·Slotine(2018, 물리적으로 일관된 관성 매개변수), Ashbaugh·Chicone·Cushman(1991, 테니스 라켓 정리), Carpentier 외(2019, Pinocchio), Todorov 외(2012, MuJoCo). 확인하지 못한 것: ISO 80000-4(역학의 양과 단위; iso.org 접근이 막혀 존재·정의를 확인하지 못했다), SDF 사양의inertial요소. 관성 값·치수는 모두 이 장이 정한 예시이며 어떤 제품의 제원이 아니다. 수치는 모두 이 장의 순수 파이썬 계산이다.
3.1.2 개념 — 강체 하나의 동역학을 정하는 열 개의 수
결론부터 적으면 다음과 같다. 강체의 병진·회전 동역학은 질량 하나, 질량 중심의 위치 세 성분, 대칭 $3\times3$ 관성 텐서의 여섯 성분, 합해서 열 개의 매개변수로 정해진다. 힘과 가속도의 관계는 병진에서 $f=ma$이고 회전에서 $\tau=I\dot\omega+\omega\times I\omega$이다. 둘째 항(자이로 항)은 각속도가 관성 텐서의 주축과 어긋나 있을 때 생기며 토크가 없어도 각속도 방향이 변하게 한다. 이 장의 첫째 함의는 관성 텐서가 기준점과 축에 따라 달라지므로 어느 프레임에서 적었는지를 항상 밝혀야 한다는 것이다. 둘째 함의는 열 개의 매개변수가 임의의 값이 아니라 양의 질량 분포로 실현 가능해야 한다는 것이며 삼각형 부등식으로 검사할 수 있다. 셋째 함의는 트위스트 $V=(\omega,v)$와 렌치 $F=(m,f)$를 사용하면 병진과 회전이 하나의 $6\times6$ 행렬 $G$와 식 $F=G\dot V-\mathrm{ad}_V^{T}GV$로 합쳐지고, 기준 프레임을 바꾸는 일이 $G\mapsto\mathrm{Ad}^{T}G\,\mathrm{Ad}$ 하나로 정리된다는 것이다. 링크마다 이 식을 적용하고 관절의 구속을 더하면 로봇 전체의 역동역학(3.2)이 된다.
이 장의 계산 결과를 미리 적으면 다음과 같다. ① 직육면체 메시(삼각형 12개)의 관성이 닫힌 식과 $3.5\times10^{-18}$ kg·m² 안에서 같고, 원기둥을 정$n$각기둥으로 근사하면 $n=8\to256$에서 질량 오차가 $9.97\times10^{-2}\to1.00\times10^{-4}$로 $n^{-2}$을 따라 줄어든다. ② 평행축 정리·회전·복합체·공간 관성의 프레임 변환·운동량·운동 에너지·뉴턴-오일러 렌치가 점질량 직접 합과 $1.1\times10^{-13}$ 이하에서 일치한다(300회). ③ 점질량 물체 2000개의 관성이 모두 삼각형 부등식을 만족하고, 임의의 양의 정부호 대각 관성은 $65.0\,\%$만 만족한다. ④ 토크 없는 회전에서 최소·최대 축은 진동수 $5.5470$·$6.9282$ rad/s로 진동하고 중간 축은 성장률 $4.8093$ s$^{-1}$로 발산하며(닫힌 식 $4.8038$) 에너지·각운동량이 $10^{-11}$ 이하로 보존된다. ⑤ Pinocchio·modern_robotics·MuJoCo(자유 강체)·trimesh·numpy와 $5.5\times10^{-14}$ 이하에서 같고, MuJoCo 메시는 정점이 단정밀도라서 $1.4\times10^{-7}$, 이 장의 RK4와 SciPy DOP853의 $\omega$ 차이는 $6.0\times10^{-8}$이다.
3.1.3 원리
3.1.3.1 질량 중심과 관성 텐서
강체를 점질량 $m_i$ 위치 $p_i$의 모임으로 보면 총질량은 $m=\sum_i m_i$, 질량 중심은 $c=\frac1m\sum_i m_ip_i$이다. 연속체에서는 합이 밀도 $\rho$의 부피 적분이 된다. 기준점 $O$에서 본 상대 위치를 $r_i=p_i-O$로 두면 $O$ 기준 관성 텐서는 다음이다.
$$I_O=\sum_i m_i\left(\lVert r_i\rVert^{2}E-r_ir_i^{T}\right)=-\sum_i m_i[r_i]_\times^{2},\qquad I_{xx}=\sum_i m_i(y_i^{2}+z_i^{2}),\quad I_{xy}=-\sum_i m_ix_iy_i.$$
$E$는 $3\times3$ 단위행렬이다. $I_O$는 대칭이고 반정부호이며(물체가 한 직선 위에 있으면 그 직선 방향의 모멘트가 0), 회전 운동 에너지가 $K=\frac12\omega^{T}I\omega$, 기준점에 대한 각운동량이 $h=I\omega$이다. 고유분해 $I=Q\,\mathrm{diag}(\lambda_1,\lambda_2,\lambda_3)Q^{T}$의 고유벡터가 주축, 고윳값 $\lambda_i$가 주관성 모멘트이다. 한 주축은 질량 중심을 지나는 모든 축 가운데 모멘트가 최대이고 다른 한 주축은 최소이다. 균일 밀도 표준 형상의 질량 중심 기준 관성은 다음과 같다(Modern Robotics 그림 8.5의 식과 같고 이 장이 Pinocchio와 대조했다).
| 형상 (질량 $m$) | $I_{xx}$ | $I_{yy}$ | $I_{zz}$ |
|---|---|---|---|
| 직육면체 ($x,y,z$ 방향 변 $a,b,c$) | $m(b^{2}+c^{2})/12$ | $m(a^{2}+c^{2})/12$ | $m(a^{2}+b^{2})/12$ |
| 원기둥 (반지름 $r$, 높이 $h$, 축 $z$) | $m(3r^{2}+h^{2})/12$ | $m(3r^{2}+h^{2})/12$ | $mr^{2}/2$ |
| 구 (반지름 $r$) | $2mr^{2}/5$ | $2mr^{2}/5$ | $2mr^{2}/5$ |
| 타원체 (반축 $a,b,c$) | $m(b^{2}+c^{2})/5$ | $m(a^{2}+c^{2})/5$ | $m(a^{2}+b^{2})/5$ |
형상이 표준형이 아니면 닫힌 삼각형 메시(바깥 법선)에서 계산한다. 각 삼각형 $(a,b,c)$와 원점이 이루는 사면체의 부호 있는 부피는 $v=a\cdot(b\times c)/6$이고 그 부피 적분은 다음이다.
$$\int x\,dV=v\,\frac{a+b+c}{4},\qquad \int xx^{T}dV=\frac{v}{20}\left(aa^{T}+bb^{T}+cc^{T}+(a+b+c)(a+b+c)^{T}\right).$$
모든 삼각형의 합이 메시의 부피·질량 중심·이차 모멘트 $C$이고 $I_O=\rho(\mathrm{tr}(C)E-C)$, $I_c=I_O-m(\lVert c\rVert^{2}E-cc^{T})$이다. 부호 있는 부피를 합하므로 원점이 물체 밖에 있어도 맞고, 법선 방향이 안쪽이면 부피가 음수가 되어 오류를 알 수 있다. 다면체 질량 특성의 정확한 계산은 Mirtich(1996)의 주제이며 이 장은 그 논문을 읽지 않았고 위 식은 이 장이 사면체 적분에서 직접 유도해 사용했다.
3.1.3.2 기준점·축의 변경
기준점을 질량 중심에서 $d$만큼 옮기면 평행축(슈타이너) 정리가 적용된다. 프레임의 축을 회전시키면 텐서의 성분이 바뀐다. 프레임 $b$의 축을 프레임 $a$에서 본 자세가 ${}^{a}R_{b}$이면 다음이다.
$$I_d=I_c+m\left(\lVert d\rVert^{2}E-dd^{T}\right),\qquad {}^{a}I={}^{a}R_{b}\;{}^{b}I\;{}^{a}R_{b}^{T}.$$
복합체(여러 강체의 결합)는 모든 성분 관성을 같은 기준점·같은 축으로 옮긴 뒤 더한다. 대각화는 회전 변환의 특수한 경우이며 $R$을 고유벡터 행렬로 두면 대각 텐서가 된다. 이 장은 세 관계를 점질량 직접 합과 비교해 확인했다(표 ②). 질량 중심에서 먼 기준점에서는 $m\lVert d\rVert^{2}$ 항이 $I_c$보다 클 수 있으므로, 관절 원점 기준 관성은 질량 중심 기준 값보다 흔히 훨씬 크다.
3.1.3.3 열 개의 관성 매개변수와 물리적 타당성
기준점 $O$에서 강체의 관성 매개변수는 $\pi=(m,\ mc_x,\ mc_y,\ mc_z,\ I_{xx},\ I_{yy},\ I_{zz},\ I_{xy},\ I_{xz},\ I_{yz})$의 열 개이다. 공간 관성 $G$의 모든 성분이 $\pi$에 대해 선형이므로 식별(3.7)은 이 열 개에 대한 선형 회귀로 정리된다. 열 개의 값이 모두 임의로 가능한 것은 아니다. 질량 중심 기준 관성은 반정부호이고, 주관성 모멘트는 삼각형 부등식 $\lambda_i+\lambda_j\ge\lambda_k$를 만족해야 한다. 이유는 다음과 같다. 주축 좌표에서 이차 모멘트 $\Sigma_c=\int\rho\,xx^{T}dV$는 $\Sigma_c=\frac12\mathrm{tr}(I_c)E-I_c$이고 대각 성분이 $(\lambda_j+\lambda_k-\lambda_i)/2$이며, 양의 밀도의 이차 모멘트는 반정부호이므로 이 값이 0 이상이다. 역도 성립한다. 삼각형 부등식을 만족하는 $\lambda$에 대해 $s_i=(\lambda_j+\lambda_k-\lambda_i)/2\ge0$으로 두고 각 축 위 $\pm d$ 지점에 질량 $s_i/(2d^{2})$를 놓으면 질량 중심이 원점이고 주관성 모멘트가 $\lambda$인 점질량 6개가 만들어진다. 따라서 주관성 모멘트에 대해서는 삼각형 부등식이 필요충분조건이다. 질량 중심 위치까지 포함한 열 개 전체의 조건은 유사 관성 행렬이다.
$$J=\int\rho\begin{bmatrix}x\\1\end{bmatrix}\begin{bmatrix}x\\1\end{bmatrix}^{T}dV=\begin{bmatrix}\Sigma_O&mc\\mc^{T}&m\end{bmatrix}\succeq0,\qquad \Sigma_O=\tfrac12\mathrm{tr}(I_O)E-I_O.$$
$J\succeq0$이 필요조건임은 위 정의에서 곧바로 나온다. 충분조건인지, 즉 반정부호인 모든 $J$가 양의 밀도 분포로 실현되는지는 이 장이 증명하지 않았다. 유사 관성 행렬을 관성 식별의 제약으로 사용하는 방법은 Wensing·Kim·Slotine(2018)에 있으며 이 장은 그 본문을 읽지 못해 서지만 확인했다 (확인 필요). 주의할 점은 양의 정부호인 관성 텐서가 모두 물리적으로 가능하지 않다는 것이다. $\mathrm{diag}(1,1,3)$은 양의 정부호이지만 $1+1<3$이어서 어떤 강체의 관성도 아니다. 이 장의 시험에서 $U(0.1,1)$에서 뽑은 대각 관성의 $35\,\%$가 이 조건을 어겼다(표 ③).
3.1.3.4 뉴턴 방정식과 오일러 방정식
질량 중심에 고정한 프레임 $\{b\}$에서 강체의 트위스트가 $V_b=(\omega_b,v_b)$일 때 점질량 $m_i$의 위치 $r_i$는 물체에 고정이므로 속도 $\dot p_i=v_b+\omega_b\times r_i$, 가속도 $\ddot p_i=\dot v_b+\dot\omega_b\times r_i+\omega_b\times(v_b+\omega_b\times r_i)$(성분은 물체 프레임)이다. $m_i\ddot p_i$를 모두 더하고 $\sum m_ir_i=0$을 사용하면 병진은 뉴턴 방정식, 회전은 오일러 방정식이 된다.
$$f_b=m\left(\dot v_b+\omega_b\times v_b\right),\qquad m_b=I_b\dot\omega_b+\omega_b\times I_b\omega_b.$$
$\omega_b\times v_b$는 각속도가 0이 아닐 때 물체 프레임 성분이 일정한 선속도가 관성 프레임에서는 변한다는 사실에서 나온다. 주축 좌표에서 오일러 방정식은 $I_x\dot\omega_x+(I_z-I_y)\omega_y\omega_z=m_x$ 꼴 세 식이다. 자이로 항 $\omega\times I\omega$는 $\omega$가 주축 방향이거나 $I$가 단위행렬의 배수일 때만 0이다. 세계 프레임에서는 같은 식이 $\tau_w=\frac{d}{dt}(I_w\omega_w)$이고 $I_w=R\,I_b\,R^{T}$이다. $\dot I_w=[\omega_w]I_w-I_w[\omega_w]$이므로 전개하면 $\tau_w=I_w\dot\omega_w+\omega_w\times I_w\omega_w$가 되어 물체 프레임 식에 $R$을 곱한 것과 같다. 물체 프레임 식은 $I_b$가 상수여서 상태 방정식에 사용하기 편하고, 세계 프레임 식은 $I_w$가 자세에 따라 변한다. 두 식의 동등성을 표 ②에서 확인했다.
3.1.3.5 토크 없는 회전 — 보존량과 축 안정성
외부 토크가 없으면 $\dot\omega=-I^{-1}(\omega\times I\omega)$이고 두 양이 보존된다. 하나는 에너지 $E=\frac12\omega^{T}I\omega$이고 다른 하나는 각운동량의 크기 $\lVert I\omega\rVert$(관성 프레임의 각운동량 벡터 $R\,I\omega$가 상수이므로)이다. 두 보존량이 물체 프레임 각운동량 $I\omega$를 구면과 에너지 타원체의 교선 위에 묶는다. 주축 $k$ 둘레의 회전 $\omega=(0,0,\Omega)$ 근처의 교란 $\delta\omega$를 선형화하면 $I_1\delta\dot\omega_1=(I_2-I_3)\Omega\,\delta\omega_2$, $I_2\delta\dot\omega_2=(I_3-I_1)\Omega\,\delta\omega_1$이고 이로부터 다음이 나온다(축 3을 예로 적었고 다른 축도 순환 치환으로 같다).
$$\delta\ddot\omega_1=-\Omega_k^{2}\,\delta\omega_1,\qquad \Omega_k^{2}=\Omega^{2}\,\frac{(I_k-I_a)(I_k-I_b)}{I_aI_b}.$$
$k$가 최소 또는 최대 관성 축이면 $(I_k-I_a)(I_k-I_b)>0$이어서 교란이 진동수 $\Omega_k$로 진동하고(안정), 중간 축이면 부호가 음이어서 교란이 성장률 $\sqrt{-\Omega_k^{2}}$로 지수 증가한다(불안정). 이는 각속도가 크게 뒤집히는 현상으로 나타나며 테니스 라켓 정리로 알려져 있다. 이 현상을 엄밀하게 해석한 문헌으로 Ashbaugh·Chicone·Cushman(1991, 제목 "The twisting tennis racket")의 서지를 확인했으나 본문은 읽지 못했고, 위 선형화는 이 장이 직접 유도했다. 선형화는 안정축의 비선형 안정성(진폭이 클 때)을 보장하지 않는다.
3.1.3.6 공간 관성과 트위스트-렌치 정식화
프레임 원점 $O$에서 본 트위스트 $V=(\omega,v)$($v$는 물체에 고정된 $O$ 점의 속도)와 렌치 $F=(m_O,f)$($m_O$는 $O$ 둘레 모멘트)를 사용한다. 질량 중심이 $O$에서 $c$만큼 떨어져 있을 때 선운동량은 $p=m(v+\omega\times c)$이고 $O$ 기준 각운동량은 $h_O=I_O\omega+mc\times v$이므로 운동량은 선형 관계 $P=(h_O,p)=GV$이다. 공간 관성 행렬은 다음이다.
$$G=\begin{bmatrix}I_O&m[c]_\times\\-m[c]_\times&mE\end{bmatrix},\qquad I_O=I_c-m[c]_\times^{2}.$$
$O$가 질량 중심이면 $c=0$이고 $G=\mathrm{diag}(I_c,\,mE)$이다. $G$는 대칭이며 $m>0$이고 $I_c$가 양의 정부호이면 양의 정부호이다. 운동 에너지는 $K=\frac12V^{T}GV$이다. 강체의 운동방정식은 다음이다.
$$F=G\dot V-\mathrm{ad}_V^{T}(GV),\qquad \mathrm{ad}_V=\begin{bmatrix}[\omega]_\times&0\\ [v]_\times&[\omega]_\times\end{bmatrix}.$$
둘째 항을 풀면 $-\mathrm{ad}_V^{T}P=(\omega\times h_O+v\times p,\ \omega\times p)$이므로 모멘트 식에는 각운동량의 회전 효과 $\omega\times h_O$와 선속도·선운동량의 교차항 $v\times p$가, 힘 식에는 $\omega\times p$가 더해진다. $O$가 질량 중심이면 이 식이 정확히 위의 뉴턴·오일러 방정식이다. 프레임 $a$의 $b$에 대한 자세가 $T_{ba}$이고 $V_b=\mathrm{Ad}_{T_{ba}}V_a$일 때 운동 에너지가 프레임에 무관해야 하므로 다음이 성립한다.
$$G_a=\mathrm{Ad}_{T_{ba}}^{T}\,G_b\,\mathrm{Ad}_{T_{ba}},\qquad F_a=\mathrm{Ad}_{T_{ba}}^{T}F_b.$$
$b$가 질량 중심 프레임이고 $a$가 $p$만큼 평행 이동한 프레임($T_{ba}=(E,p)$)이면 $(1,1)$ 블록이 $I_c+m(\lVert p\rVert^{2}E-pp^{T})$이 되어 평행축 정리를 포함한다. 운동방정식의 형태가 프레임에 무관하다는 것이 이 정식화의 이점이며(Modern Robotics 8.2.3), 이 장은 질량 중심이 아닌 원점에서도 식이 성립함을 점질량 직접 합으로 확인했다. 한 강체가 아니라 링크 사슬에 적용하려면 이 식을 링크마다 적용하고 관절의 이웃 연결을 더한다(3.2).
3.1.3.7 모델 파일의 관성 입력
URDF의 <inertial>은 mass, origin, inertia로 이루어진다. ROS wiki는 origin이 링크 프레임 $L$에서 본 질량 중심 프레임 $C$의 위치와 자세(xyz·rpy)이고, inertia의 $ixx,\dots,iyz$가 질량 중심 $C_o$ 기준 $C$ 프레임 축 성분이라고 적고 있다. $C$ 축이 주축과 일치할 필요는 없다. 같은 문서는 URDF가 "음의 상호 관성 곱 규약"을 가정한다고 적고 있으며, 이 장은 Pinocchio의 buildModelFromXML이 ixy·ixz·iyz를 관성 행렬의 해당 원소 그대로 읽음을 확인했다. 즉 $I_{xy}=-\int\rho xy\,dV$이고 $\int\rho xy\,dV$를 ixy에 적으면 부호가 틀린다. MuJoCo의 inertial 요소는 pos·quat(질량 중심 프레임), mass, diaginertia(주관성) 또는 fullinertia($I_{xx},I_{yy},I_{zz},I_{xy},I_{xz},I_{yz}$ 순서)를 받으며 이 장은 fullinertia의 값이 행렬 원소로 읽힘을 mj_inverse 결과로 확인했다. 링크 프레임 $L$ 기준 공간 관성은 $G_L=\mathrm{Ad}_{T_{CL}}^{T}\,\mathrm{diag}(I_C,\ mE)\,\mathrm{Ad}_{T_{CL}}$이며 $T_{LC}=(R_{\mathrm{rpy}},\ \mathrm{xyz})$이다. 동역학 코드가 URDF의 링크 프레임이나 관절 프레임에서 $G$를 구성할 때 필요한 것이 이 변환이다.
3.1.4 알고리즘
점질량 합 (m_i, p_i): m ← Σ m_i; c ← Σ m_i p_i / m; I_c ← −Σ m_i [p_i − c]²
메시 합 (V, F, ρ): 삼각형마다 v ← a·(b×c)/6; C ← C + v/20 (aaᵀ+bbᵀ+ccᵀ+ssᵀ), s=a+b+c;
I_O ← ρ(tr(C)E − C); c ← Σ v·s/4 / Σ v; I_c ← I_O − m(|c|²E − ccᵀ)
기준점 변경: I_d ← I_c + m(|d|²E − ddᵀ); 회전 ᵃI ← R · ᵇI · Rᵀ
공간 관성(m, c, I_c): G ← [[I_c − m[c]², m[c]], [−m[c], mE]]
프레임 변환(R, p): G_a ← Adᵀ G_b Ad, Ad ← [[R, 0], [[p]R, R]]
단일 강체 렌치: F ← G V̇ − adᵀ(G V)
토크 없는 회전: ω̇ ← −I⁻¹(ω × Iω), RK4; 보존량 E = ½ωᵀIω, |Iω|
3.1.5 풀이 예제 — 관성 계산, 변환, 공간 관성, 토크 없는 회전
결론부터 적으면 다음과 같다. ① 메시 분해가 직육면체에서 정확하고 원기둥에서 $n^{-2}$으로 수렴한다. ② 평행축·회전·복합체·프레임 변환·운동량·에너지·뉴턴-오일러 식이 점질량 직접 합과 일치한다. ③ 주관성 모멘트의 삼각형 부등식이 필요충분이고 임의의 양의 정부호 관성의 $35\,\%$가 위반한다. ④ 그리퍼가 쥔 2 kg 직육면체의 플랜지 기준 관성과 지지 렌치가 계산된다. ⑤ 토크 없는 회전의 성장률·진동수가 닫힌 식과 같고 RK4 보존량 오차가 간격 절반마다 $21\sim26$분의 1로 줄어든다. ⑥ 라이브러리와 $5.5\times10^{-14}$ 이하에서 일치한다(MuJoCo 메시 $1.4\times10^{-7}$과 DOP853 대비 $6.0\times10^{-8}$은 아래 원인을 적었다).
구현. point_mass_props·box_I·cyl_I·steiner·rot_I·mesh_props·jacobi_eig·spatial_inertia·adjoint·ad·frame_change·newton_euler·euler_rates·rk4. 점질량 직접 합(direct_ne)·메시 생성·확률 시험·도해는 스크립트에 있다.
| 항목 | 값 |
|---|---|
| 입력 1 | 점질량 물체: 질량 $U(0.1,1)$ kg, 위치 $N(c_0,\,0.1^{2})$ m, $c_0=(0.05,-0.03,0.08)$ m, 60개. 임의 기준점·회전·운동 300회(시드 63) |
| 입력 2 | 메시: 직육면체 $0.30\times0.20\times0.10$ m(2 kg)·원기둥 $r=50$ mm, $h=100$ mm의 정$n$각기둥 $n=8\sim256$(밀도 균일) |
| 입력 3 | 물리적 타당성: 점질량 4·8·30개 물체 2000개(위치 표준편차 20·100 mm), 임의 대각 관성 $\lambda_i\sim U(0.1,1)$ 20000개, 구성 시험 2000개 |
| 입력 4 | 토크 없는 회전: 직육면체 $0.30\times0.20\times0.10$ m, 2 kg, $\Omega=10$ rad/s, 다른 두 성분 $10^{-3}\Omega$, RK4 $h=1$ ms·6 s. 보존량 시험은 $h=0.04\sim0.005$ s, 10 s |
| 입력 5 | 부하: 위 직육면체, 상자 축이 플랜지 프레임 $z$축 둘레로 $30^\circ$ 회전, 질량 중심 $(0.02,-0.01,0.12)$ m, 플랜지 $z$축이 위쪽 |
| 입력 6 | 라이브러리 대조: 점질량 40개 물체 100·60개, 메시 3개(밀도 700 kg/m³), DOP853 rtol $10^{-13}$ |
from math import atan2, cos, sin
def dot(a, b):
return sum(x * y for x, y in zip(a, b))
def cross(a, b):
return [a[1] * b[2] - a[2] * b[1],
a[2] * b[0] - a[0] * b[2],
a[0] * b[1] - a[1] * b[0]]
def hat(w):
return [[0, -w[2], w[1]],
[w[2], 0, -w[0]],
[-w[1], w[0], 0]]
def mm(A, B):
return [[sum(a * b for a, b in zip(r, c))
for c in zip(*B)] for r in A]
def mv(A, x):
return [sum(a * b for a, b in zip(r, x)) for r in A]
def tr(A):
return [list(r) for r in zip(*A)]
def ident(n, s=1.0):
return [[s if i == j else 0.0 for j in range(n)]
for i in range(n)]
def point_mass_props(ms, ps):
"""점질량 -> (질량 m, 질량 중심 c, 중심 기준 관성 I_c)"""
m = sum(ms)
c = [sum(a * p[k] for a, p in zip(ms, ps)) / m
for k in range(3)]
I = [[0.0] * 3 for _ in range(3)]
for a, p in zip(ms, ps):
r = [p[k] - c[k] for k in range(3)]
for i in range(3):
for j in range(3):
I[i][j] += a * ((dot(r, r) if i == j else 0.0)
- r[i] * r[j])
return m, c, I
def box_I(m, a, b, c):
return [[m * (b * b + c * c) / 12, 0, 0],
[0, m * (a * a + c * c) / 12, 0],
[0, 0, m * (a * a + b * b) / 12]]
def cyl_I(m, r, h):
t = m * (3 * r * r + h * h) / 12
return [[t, 0, 0], [0, t, 0], [0, 0, m * r * r / 2]]
def steiner(I, m, d):
"""I + m(d.d E - d d^T): 기준점을 d만큼 옮긴 관성"""
return [[I[i][j] + m * ((dot(d, d) if i == j else 0.0)
- d[i] * d[j])
for j in range(3)] for i in range(3)]
def rot_I(R, I):
"""프레임 b의 축을 a에서 본 R에 대해 I_a = R I_b R^T"""
return mm(mm(R, I), tr(R))
def mesh_props(V, F, rho=1.0):
"""닫힌 삼각형 메시(바깥 법선) -> (m, c, I_c)"""
vol, cm = 0.0, [0.0] * 3
C = [[0.0] * 3 for _ in range(3)]
for i, j, k in F:
a, b, c = V[i], V[j], V[k]
v = dot(a, cross(b, c)) / 6 # 원점-삼각형 사면체
s = [a[t] + b[t] + c[t] for t in range(3)]
vol += v
for t in range(3):
cm[t] += v * s[t] / 4
for p in range(3):
for q in range(3):
C[p][q] += v / 20 * (a[p] * a[q] + b[p] * b[q]
+ c[p] * c[q]
+ s[p] * s[q])
cc = [x / vol for x in cm]
t = C[0][0] + C[1][1] + C[2][2]
Io = [[rho * ((t if p == q else 0.0) - C[p][q])
for q in range(3)] for p in range(3)]
return rho * vol, cc, steiner(Io, -rho * vol, cc)
def jacobi_eig(A, sweeps=60):
"""대칭 3x3 -> (고윳값, 열이 고유벡터인 행렬)"""
A = [r[:] for r in A]
Q = ident(3)
for _ in range(sweeps):
off = sum(A[i][j] ** 2 for i in range(3)
for j in range(i))
if off < 1e-300:
break
for p, q in ((0, 1), (0, 2), (1, 2)):
if abs(A[p][q]) < 1e-300:
continue
th = 0.5 * atan2(2 * A[p][q], A[q][q] - A[p][p])
c, s = cos(th), sin(th)
G = ident(3)
G[p][p] = G[q][q] = c
G[p][q], G[q][p] = s, -s
A = mm(mm(tr(G), A), G)
Q = mm(Q, G)
return [A[i][i] for i in range(3)], Q
def spatial_inertia(m, c, Ic):
"""프레임 원점 O 기준 6x6 G, 성분 순서 (w, v)"""
Io, C = steiner(Ic, m, c), hat(c)
G = [[0.0] * 6 for _ in range(6)]
for i in range(3):
for j in range(3):
G[i][j] = Io[i][j]
G[i][3 + j] = m * C[i][j]
G[3 + i][j] = -m * C[i][j]
G[3 + i][3 + i] = m
return G
def adjoint(R, p):
pR = mm(hat(p), R)
return ([R[i] + [0.0] * 3 for i in range(3)]
+ [pR[i] + R[i] for i in range(3)])
def ad(V):
W, X = hat(V[:3]), hat(V[3:])
return ([W[i] + [0.0] * 3 for i in range(3)]
+ [X[i] + W[i] for i in range(3)])
def frame_change(G, R, p):
"""프레임 a의 b에서 자세 T_ba=(R,p): G_a=Ad^T G_b Ad"""
A = adjoint(R, p)
return mm(mm(tr(A), G), A)
def newton_euler(G, V, Vd):
"""F = G Vd - ad_V^T (G V), V=(w, v), F=(m, f)"""
q = mv(tr(ad(V)), mv(G, V))
return [a - b for a, b in zip(mv(G, Vd), q)]
def inv3(A):
c = [cross(A[1], A[2]), cross(A[2], A[0]),
cross(A[0], A[1])]
d = dot(A[0], c[0])
return [[c[j][i] / d for j in range(3)] for i in range(3)]
def euler_rates(I, w, tau):
"""물체 프레임: w' = I^-1 (tau - w x I w)"""
g = cross(w, mv(I, w))
return mv(inv3(I), [t - x for t, x in zip(tau, g)])
def rk4(f, x, h):
k1 = f(x)
k2 = f([a + h / 2 * b for a, b in zip(x, k1)])
k3 = f([a + h / 2 * b for a, b in zip(x, k2)])
k4 = f([a + h * b for a, b in zip(x, k3)])
return [a + h / 6 * (b + 2 * c + 2 * d + e)
for a, b, c, d, e in zip(x, k1, k2, k3, k4)]
① 관성 텐서의 닫힌 식과 메시 분해.
| 대상 | 질량 상대 오차 | $I_{zz}/(mr^2)$ 상대 오차 | $I_{xx}/(mr^2)$ 상대 오차 | $\lvert I_{xy}\rvert$ (kg·m²) |
|---|---|---|---|---|
| 직육면체 0.30×0.20×0.10 m, 12개 삼각형 (닫힌 식 대비 $\max\lvert\Delta I\rvert$ = 3.5e-18 kg·m²) | 2.2e-16 | — | — | — |
| 원기둥 $r=50$ mm, $h=100$ mm, 정$n$각기둥 $n=8$ | -9.97e-02 | 9.76e-02 | 4.18e-02 | -2e-23 |
| 원기둥 $r=50$ mm, $h=100$ mm, 정$n$각기둥 $n=16$ | -2.55e-02 | 2.54e-02 | 1.09e-02 | -3e-23 |
| 원기둥 $r=50$ mm, $h=100$ mm, 정$n$각기둥 $n=32$ | -6.41e-03 | 6.40e-03 | 2.74e-03 | 3e-23 |
| 원기둥 $r=50$ mm, $h=100$ mm, 정$n$각기둥 $n=64$ | -1.61e-03 | 1.61e-03 | 6.88e-04 | 3e-23 |
| 원기둥 $r=50$ mm, $h=100$ mm, 정$n$각기둥 $n=128$ | -4.02e-04 | 4.02e-04 | 1.72e-04 | -3e-23 |
| 원기둥 $r=50$ mm, $h=100$ mm, 정$n$각기둥 $n=256$ | -1.00e-04 | 1.00e-04 | 4.30e-05 | 2e-24 |
직육면체는 평면 면 12개가 정확한 다면체이므로 기계 정밀도로 일치한다. 원기둥은 정$n$각기둥으로 근사한 모형이어서 곡면을 평면으로 대치하는 오차가 남고, $n$을 2배로 하면 오차가 약 $1/4$로 줄어 $n^{-2}$ 수렴이다(아래 도해). 질량 오차는 정$n$각형과 원의 면적비로 정해지는 닫힌 식 $1-\frac{n}{2\pi}\sin\frac{2\pi}{n}$($n=8$에서 $9.97\times10^{-2}$)와 같다. 상호 관성 곱은 대칭 때문에 0이며 $10^{-23}$은 반올림 오차이다. $I_{xx}/(mr^{2})$의 오차는 $I_{zz}/(mr^{2})$보다 작다($n=256$에서 $4.30\times10^{-5}$ 대 $1.00\times10^{-4}$). 이 단면에서 $n=64$ 근사의 질량·모멘트 오차는 $0.2\,\%$ 이하이다. 실제 CAD 메시의 오차는 곡면의 분할 방식과 내부 공동에 따라 이 값과 다르다.
② 변환·운동량·뉴턴-오일러 항등식.
| 항등식 (점질량 60개 물체, 임의 기준점·회전·운동 300회) | 최대 절대 오차 |
|---|---|
| 평행축 정리 $I_d=I_c+m(d^{T}d\,E-dd^{T})$ 대 점질량 직접 합 | 8.9e-15 |
| 회전 $I_a=R\,I_b\,R^{T}$ 대 회전한 점질량 직접 합 | 1.0e-15 |
| 복합체: $G_1+G_2$ 대 합집합 직접 계산 (공간 관성, 기준 프레임 공통) | 7.1e-15 |
| $G_a=\mathrm{Ad}_{T_{ba}}^{T}\,G_b\,\mathrm{Ad}_{T_{ba}}$ 대 새 프레임 성분의 점질량 직접 합 | 4.3e-14 |
| 공간 운동량 $G\,V$ 대 점질량 운동량 합 | 4.3e-14 |
| 운동 에너지 $\tfrac12V^{T}GV$ 대 $\sum\tfrac12m_i\lvert\dot p_i\rvert^{2}$ | 8.5e-14 |
| 렌치 $G\dot V-\mathrm{ad}_V^{T}GV$ 대 $\sum(r_i\times m_ia_i,\ m_ia_i)$ | 1.1e-13 |
| 세계 프레임 오일러 방정식 대 $R$ 곱한 물체 프레임 방정식 | 3.3e-15 |
모든 항등식이 $1.1\times10^{-13}$ 이하에서 일치한다. 점질량 직접 합은 $G$를 사용하지 않으므로 $G$·$\mathrm{ad}$·$\mathrm{Ad}$의 부호와 순서 규약이 맞음을 독립적으로 확인한다. 이 시험은 $V=(\omega,v)$, $F=(m,f)$, $G$의 블록 부호를 이 장의 식대로 둔 것이 정확함을 보이며, 성분 순서를 바꾼 라이브러리와는 순서 변환 행렬로 맞췄다(표 ⑥).
③ 물리적 타당성.
| 물리적 타당성 검사 | 결과 |
|---|---|
| 점질량 물체 2000개: 주관성 모멘트 최솟값 대 최댓값 비 $\min\lambda/\max\lambda$의 최솟값 | 1.601e-02 |
| 같은 물체: 삼각형 부등식 여유 $(\lambda_1+\lambda_2+\lambda_3-2\lambda_{\max})/\mathrm{tr}\,I$의 최솟값 | 7.446e-10 |
| 같은 물체: $\Sigma=\tfrac12\mathrm{tr}(I)E-I$의 최소 고윳값$/\mathrm{tr}\,I$의 최솟값 | 3.723e-10 |
| 양의 정부호 대각 관성 $\mathrm{diag}(\lambda_i)$, $\lambda_i\sim U(0.1,1)$ 임의 20000개 중 삼각형 부등식을 만족하는 비율 | 0.650 |
| 삼각형 부등식을 만족하는 임의 $(\lambda_1,\lambda_2,\lambda_3)$ 2000개를 축마다 $\pm d$ 점질량 6개로 구성해 계산한 $I_c$ 대 $\mathrm{diag}(\lambda)$의 최대 차이 | 3.3e-16 |
점질량으로 만든 물체 2000개는 모두 삼각형 부등식을 만족하며 여유의 최솟값은 $7.4\times10^{-10}$이다. 최솟값을 보인 물체는 점 4개짜리였으며, 점이 거의 한 평면에 놓이면 평면 물체의 수직축 정리 $I_{zz}=I_{xx}+I_{yy}$에 가까워져 여유가 0으로 향한다. 반면 양의 정부호이기만 한 임의의 대각 관성은 $65.0\,\%$만 만족한다. 모델의 관성 값이 임의의 추정으로 만들어졌다면 이 시험의 분포에서는 약 3분의 1이 어떤 질량 분포로도 실현되지 않는다. 같은 표의 $\Sigma$ 고윳값 행은 삼각형 부등식 여유의 정확히 절반($3.723\times10^{-10}$ 대 $7.446\times10^{-10}$)이며 이는 $\Sigma$의 고윳값이 $(\lambda_j+\lambda_k-\lambda_i)/2$라는 위 항등식의 확인이다. 구성 시험은 삼각형 부등식을 만족하는 주관성 모멘트가 점질량 6개로 실현됨을 $3.3\times10^{-16}$에서 보인다.
④ 부하 예: 그리퍼 플랜지에서 본 직육면체.
| 항목 | 값 |
|---|---|
| 입력: 상자 주축 관성 $\mathrm{diag}(I_x,I_y,I_z)$ (kg·m²) | 0.00833, 0.01667, 0.02167 |
| 입력: 상자 축의 플랜지 프레임 대비 회전 · 질량 중심 $c$ (m) · 질량 | $z$축 30° · $(0.02, -0.01, 0.12)$ · 2 kg |
| $I_c$ (질량 중심, 플랜지 축 성분) 대각 · $I_{xy}$ (kg·m²) | 0.01042, 0.01458, 0.02167 · -0.00361 |
| $I_O$ (플랜지 원점 기준) 대각 · $I_{xy}$ · $I_{xz}$ · $I_{yz}$ (kg·m²) | 0.03942, 0.04418, 0.02267 · -0.00321 · -0.00480 · 0.00240 |
| $m\,c$ (kg·m) | 0.0400, -0.0200, 0.2400 |
| 정지 상태에서 중력을 지지하는 플랜지 렌치 $(m_O,\ f)$ (N·m, N) | $m_O$ = (-0.1962, -0.3924, 0.0000) · $f$ = (0.0000, 0.0000, 19.6200) |
| $\dot\omega=(3,-2,4)$ rad/s², $\omega=0$일 때 모멘트 크기 (N·m) | 0.1551 |
| $\omega=(0,2,1)$ rad/s, $\dot\omega=0$일 때 자이로 모멘트 크기 (N·m) · 위 모멘트 대비 비 | 0.0437 · 0.282 |
질량 중심이 $0.12$ m 떨어져 있어 $I_O$의 $I_{xx}$가 $I_c$의 약 $3.8$배($0.03942$ 대 $0.01042$)이다. 정지 상태의 지지 렌치는 $f=19.62$ N이고 모멘트 $m_O=m\,c\times(\text{가속도})$의 크기는 $0.439$ N·m이다. 각가속도 $5.39$ rad/s²($\dot\omega=(3,-2,4)$)에서 모멘트가 $0.1551$ N·m이고, $\omega=(0,2,1)$ rad/s의 자이로 모멘트는 $0.0437$ N·m이다. 후자가 전자의 $28\,\%$이다. 두 값은 서로 다른 운동 조건(각가속도 $5.39$ rad/s², 각속도 $2.24$ rad/s)에서 계산한 것이어서 비는 이 조건에서만 의미가 있으며, 각속도 $2$ rad/s 수준에서도 자이로 모멘트가 각가속도 $5$ rad/s²의 관성 모멘트와 같은 자릿수이므로 부하 모델에서 자이로 항을 생략할 수 없다. 이 값은 입력 5의 부하 하나에 대한 것이며 로봇의 다른 링크에는 해당하지 않는다.
⑤ 토크 없는 회전.
| 회전 축 ($I_x,I_y,I_z$ = 0.00833, 0.01667, 0.02167 kg·m², $\Omega=10$ rad/s, 교란 $10^{-3}\Omega$) | $\omega_{th}^2$ (닫힌 식) | 교란 진폭 최댓값 (6 s) | 측정 진동수·성장률 | 닫힌 식 | 에너지·운동량 상대 오차 ($h=1$ ms) |
|---|---|---|---|---|---|
| 최소 관성 축 | 30.77 | 0.0018 $\Omega$ | 진동수 5.5470 rad/s | 5.5470 | 7.3e-15 · 3.7e-15 |
| 중간 관성 축 | -23.08 | 1.1094 $\Omega$ | 성장률 4.8093 1/s | 4.8038 | 2.9e-12 · 1.5e-12 |
| 최대 관성 축 | 48.00 | 0.0015 $\Omega$ | 진동수 6.9282 rad/s | 6.9282 | 8.2e-15 · 4.0e-15 |
세 축의 닫힌 식과 모의가 일치한다. 최소 축($5.5470$ rad/s)과 최대 축($6.9282$ rad/s)은 진동수가 닫힌 식과 소수점 넷째 자리까지 같고 교란 진폭이 $0.0018\,\Omega$ 이하로 유지된다. 중간 축은 $10^{-3}\Omega$의 교란이 약 $2$ s에 최대 $1.11\,\Omega$까지 성장하여 각속도 부호가 반전된다(위 도해). 성장률은 $4.8093$ s$^{-1}$로 닫힌 식 $4.8038$보다 $0.11\,\%$ 크며, 선형 구간(진폭 $0.05\sim0.2$ rad/s)으로 한정한 적합의 한계와 비선형 항 때문으로 본다. 에너지와 운동량 크기가 모두 $10^{-11}$ 이하로 보존된다.
| RK4 간격 $h$ (s), 중간 축 회전 10 s | 에너지 상대 오차 | 운동량 크기 상대 오차 |
|---|---|---|
| 0.04 | 3.24e-05 | 1.62e-05 |
| 0.02 | 1.25e-06 | 6.24e-07 |
| 0.01 | 5.29e-08 | 2.65e-08 |
| 0.005 | 2.52e-09 | 1.26e-09 |
RK4 간격을 절반으로 줄이면 오차가 $25.9$·$23.6$·$21.0$분의 1로 줄어든다. 4차 방법의 점근 비 $16$보다 큰 값이며 이 간격은 아직 점근 영역에 이르지 못했음을 뜻한다. 에너지와 운동량 크기의 오차는 같은 비로 줄어들며, RK4는 이 두 양을 보존하도록 설계된 적분기가 아니므로 오차가 간격에 따라 줄어들 뿐 사라지지 않는다. 장시간 적분에서 보존량을 정확히 유지해야 하면 리군 적분기·심플렉틱 방법(1.18)을 사용한다.
⑥ 라이브러리 대조(실행 2026-11-05). Pinocchio 4.1.0의 Inertia.FromBox·FromCylinder·FromSphere·FromEllipsoid·Inertia(m, c, I)·matrix()·SE3.act·vxiv·vtiv를 표준 형상·공간 관성·프레임 변환·자이로 항·에너지와, modern_robotics의 Adjoint·ad를 프레임 변환과 렌치 식과, MuJoCo 3.17.0의 mj_inverse를 질량 중심 밖 원점의 자유 강체 렌치와, 같은 MuJoCo의 mesh inertia="exact"와 trimesh 5.2.0의 mass_properties를 메시 분해와, SciPy 1.18.1의 solve_ivp(DOP853)를 토크 없는 회전과, numpy 2.5.4의 eigvalsh를 야코비 고윳값과 같은 입력에서 비교했다. 스크립트는 robotics/fig-src/3.1-libcheck.py, 출력은 robotics/fig-src/data/3.1-libcheck-output.txt에 있다.
| 비교 | 결과 |
|---|---|
표준 형상(직육면체·원기둥·구·타원체) 닫힌 식 대 Pinocchio Inertia.FromBox·FromCylinder·FromSphere·FromEllipsoid: 최대 차이 (kg·m²) | 4.3e-19 |
공간 관성 $G$ 대 Pinocchio Inertia.matrix()(성분 순서 변환, 100개): 최대 차이 | 1.1e-16 |
프레임 변환 $\mathrm{Ad}^{T}G\,\mathrm{Ad}$ 대 Pinocchio SE3.act(Inertia)(100개): 최대 차이 | 2.1e-14 |
자이로 항 $-\mathrm{ad}_V^{T}GV$ 대 Pinocchio Inertia.vxiv·운동 에너지 대 vtiv(100개): 최대 차이 | 2.8e-14 |
뉴턴-오일러 $G\dot V-\mathrm{ad}_V^{T}GV$ 대 Pinocchio I*a + I.vxiv(v)(100개): 최대 차이 | 5.5e-14 |
같은 식 대 modern_robotics Adjoint·ad로 조립한 $\mathrm{Ad}^{T}G\,\mathrm{Ad}$와 $G\dot V-\mathrm{ad}^{T}GV$(각 100개): 최대 차이 | 2.8e-14 |
자유 강체 뉴턴-오일러(원점이 질량 중심 밖) 대 MuJoCo mj_inverse의 qfrc_inverse(60개, 선형은 세계, 각은 물체 성분): 최대 차이 | 4.3e-14 |
MuJoCo가 fullinertia에서 읽은 주관성 모멘트 대 이 장의 $I_c$ 고윳값(60개): 최대 차이 | 1.3e-15 |
메시 분해 대 MuJoCo mesh inertia="exact"(직육면체·$n=64$·$n=8$ 정각기둥): 질량·주관성·질량 중심 상대 차이 | 1.4e-07 |
메시 분해 대 trimesh mass_properties(같은 3개): 질량·관성·질량 중심 상대 차이 | 1.4e-15 |
주관성 모멘트: 이 장의 야코비 고유값 대 numpy eigvalsh(200개): 최대 차이 | 3.6e-16 |
토크 없는 중간 축 회전 6 s: 이 장의 RK4($h=1$ ms) 대 SciPy DOP853(rtol $10^{-13}$)의 $\omega$: 최대 차이 | 6.0e-08 |
| 같은 DOP853 해에서 세계 프레임 각운동량 $R\,I\omega$의 상대 변화 (6 s) | 8.0e-14 |
URDF ixy·ixz·iyz: Pinocchio buildModelFromXML이 읽은 관성 행렬 원소와의 차이 | 0.0e+00 |
대부분이 $10^{-13}$ 이하에서 같다. 이상 징후는 두 가지이다. 첫째, MuJoCo 메시의 질량·관성이 이 장과 $1.4\times10^{-7}$ 차이로 어긋나는데 원인은 MuJoCo가 메시 정점을 단정밀도(float32)로 저장하기 때문이며(mesh_vert의 자료형을 직접 확인했다) 같은 메시를 trimesh에 넣으면 $1.4\times10^{-15}$로 일치한다. 둘째, 이 장의 RK4($h=1$ ms)와 DOP853의 차이 $6.0\times10^{-8}$은 중간 축 근방의 지수 성장(성장률 $4.8$ s$^{-1}$, 6 s 동안 $e^{28.8}\approx3\times10^{12}$)이 반올림·절단 오차를 키운 결과로 추정하며 rtol을 낮춰 원인을 가르지는 않았다 (확인 필요). Pinocchio는 성분 순서가 (선형, 각)이고 이 장은 (각, 선형)이므로 비교 시 순서 변환 행렬을 곱했다.
한계. 균일 밀도 강체와 점질량 합의 정확한 관성·병진·회전 운동만 다룬다. 탄성·유체(부가 질량)·가변 질량·내부 자유도는 다루지 않았다. 유사 관성 행렬의 충분조건과 식별 문제는 3.7의 몫이며 이 장은 확인하지 않았다. 메시 분해는 닫힌(수밀) 메시를 가정하며 구멍이나 겹침이 있으면 결과를 신뢰할 수 없다. 오일러 방정식의 시간 적분은 자세 $R$ 없이 $\omega$만 적분했으므로 세계 프레임 자세 적분의 정확도는 이 장이 확인하지 않았다(SciPy 결과에서 세계 프레임 각운동량 보존만 확인했다).
견해: 로봇 모델의 링크 관성은 CAD 질량 특성을 기본값으로 두고(4.15) 가동 전에 삼각형 부등식과 $J\succeq0$로 물리적 타당성을 검사하며, 부하·공구처럼 CAD 값을 믿기 어려운 부분만 식별(3.7)로 보정하는 것이 맞다고 본다. 근거는 이 장의 시험에서 무작위 대각 관성의 $35\,\%$가 삼각형 부등식을 어겨 이 검사가 계산 한 번으로 오류를 걸러낸다는 점, 그리고 수평 방향 질량 중심 오차 $\Delta c$가 정지 상태 지지 모멘트에 $m g\,\Delta c$의 오차를 직접 만든다는 점($m=2$ kg에서 1 cm당 $0.196$ N·m)이다. 실제 입력 오류가 이 무작위 분포를 따르는지, CAD 값의 정확도와 식별 비용은 이 장이 확인하지 않았다.
3.1.6 설계 트레이드오프 — 관성 매개변수를 얻는 방법
링크·부하의 관성 값은 다음 방법 중에서 고른다.
- ① 기본 형상 근사. 직육면체·원기둥으로 대체하고 닫힌 식을 사용한다. 설계 초기에 빠르고 조립 전에도 가능하나 내부 구조·배선·모터 배치를 반영하지 못한다.
- ② CAD 질량 특성·메시 적분. 부품마다 재료 밀도를 지정한 CAD 모델에서 질량 중심·관성을 얻는다(4.15). 형상이 정확하나 재료 밀도·미모델링 부품(케이블·체결구)의 오차가 남는다.
- ③ 실험 식별. 여기 궤적으로 토크를 측정해 열 개 매개변수를 회귀한다(3.7). 실제 조립체 전체를 반영하나 여기 궤적 설계와 물리적 타당성 제약이 필요하다.
| 방법 | 입력 | 장점 | 한계 |
|---|---|---|---|
| ① 기본 형상 | 치수·질량 | 계산 한 줄, 조립 전 사용 | 내부 질량 분포 무시, 형상 오차 |
| ② CAD·메시 | 형상·재료 밀도 | 형상 반영, 자동화 | 밀도·미모델링 부품 오차, 수밀 메시 필요 |
| ③ 식별 | 토크·운동 데이터 | 조립체 전체 반영 | 여기 궤적·타당성 제약 필요, 측정 잡음 |
견해: 설계 단계는 ②를 기본으로 두고 ①을 계산 검산용으로, 가동 후 부하 변경은 ③으로 보정하는 순서가 합리적이라고 본다. 근거는 이 장에서 ①의 원기둥 근사가 $n=64$에서 $0.2\,\%$ 이하 오차이고 ②의 메시 합이 닫힌 식·trimesh·MuJoCo와 일치하나 어느 방법도 식별 데이터와 비교하지 않았다는 점이다. 방법 사이의 정확도·비용 비교는 이 장이 수행하지 않았다.
3.1.7 응용 축 비교
| 응용 축 | 강체 동역학이 맡는 일 | 요구 | 관련 장 |
|---|---|---|---|
| 산업·제조 | 링크·공구·부하의 관성 모델이 계산 토크와 가감속 한계의 입력 | 부하 관성·질량 중심 입력의 정확도 | 12.5, 5.2 |
| 물류·이동 | 모바일 매니퓰레이터에서 팔 자세에 따라 변하는 질량 중심과 관성 | 이동 중 반력과 전도 한계 | 7.24 |
| 도로 주행 | 해당하는 고유 요구 없음 | — | — |
| 서비스 | 해당하는 고유 요구 없음 | — | — |
| 의료·헬스케어 | 원리 수준에서 해당하는 고유 요구를 확인하지 못했다 | — | — |
| 휴머노이드·범용 | 몸통·다리 링크의 질량 중심·관성이 균형·보행 제어의 입력 | 전신 질량 분포 모델의 정확도 | 3.13, 7.18 |
| 필드 | 대형·장대 팔의 큰 관성과 하중 변화 | 하중 변동에 대한 모델 갱신 | 7.6 |
| 국방·안보 | 원리 수준에서 해당하는 고유 요구 없음 | — | — |
이 표는 이 책의 정리이며 장별 요구는 다르다. 응용별 성능 수치는 이 장이 확인하지 않았다.
3.1.8 관련 규격·프로토콜
| 문서 | 발행 | 무엇을 정하나 | 상세 장 |
|---|---|---|---|
URDF <link>·<inertial> | ROS wiki | 질량 중심 프레임(origin), 질량, 질량 중심 기준 관성 6성분, 음의 상호 관성 곱 규약 | 27.9, 15.8 |
MJCF inertial | MuJoCo 3.17.0 문서 | pos·quat·mass·diaginertia·fullinertia | 27.9 |
SDF <inertial> | SDF 사양 | 같은 개념의 관성 요소 — 이 장은 읽지 못했다 (확인 필요) | 27.9 |
Pinocchio Inertia | Pinocchio 4.1.0 | 공간 관성 $(m,c,I)$의 표현·프레임 작용 | 3.6 |
| ISO 80000-4 | ISO | 역학의 양과 단위(관성 모멘트 정의 포함 여부) — iso.org 접근이 막혀 확인하지 못했다 (확인 필요) | A.3 |
3.1.9 관련 규제·인증 요구와의 연결
링크·강체의 관성 모델 자체를 규정하는 법령·인증 요건은 확인하지 못했다. 협동로봇의 충돌 시 힘·압력 한계(26.9)와 안전 기능의 힘·토크 감시는 로봇과 부하의 질량·관성 설정에 의존할 수 있고, 그 모델의 정확도 요구를 규정한 규격 조항은 이 장이 확인하지 않았다 (확인 필요). 부하 설정의 오류가 충돌 힘 추정과 보호 정지 임계에 미치는 영향은 3.4(유효 질량)과 9.27(운동량 관측기)에서 이어진다.
3.1.10 한계·유의점·미해결
- 강체 가정. 탄성 변형·유체 부가 질량·가변 질량·내부 자유도를 다루지 않았다(유연 요소는 3.9). 유사 관성 행렬의 충분조건. $J\succeq0$이 필요조건임은 이 장이 보였으나 충분조건 여부와 식별에서의 사용은 확인하지 않았다
(확인 필요). - 적용 조건. 메시 분해는 수밀 메시와 균일 밀도를 가정한다(내부 공동·이종 재료는 부품 분할이 필요하다). 토크 없는 회전은 $\omega$만 RK4로 적분했고 자세 $R$의 장시간 리군 적분의 정확도는 다루지 않았다(1.18).
- 좌표·부호 규약. 이 책의 $(\omega,v)$ 순서는 Lynch·Park 규약이고 Pinocchio는 (선형, 각) 순서여서 코드를 옮길 때 순서 변환이 필요하다. URDF·MJCF의 상호 관성 곱 부호와 질량 중심 프레임 자세를 CAD 내보내기 도구가 틀릴 수 있다.
3.1.11 체크포인트·연구 질문·출처
체크포인트:
- 점질량 합에서 $I_O=-\sum m_i[r_i]^{2}$와 오일러 방정식 $m_b=I_b\dot\omega_b+\omega_b\times I_b\omega_b$를 유도하라.
- 평행축 정리를 $G_a=\mathrm{Ad}^{T}G_c\mathrm{Ad}$의 $(1,1)$ 블록에서 유도하고 $(1,2)$ 블록 $-m[c]$가 어디서 나오는지 설명하라.
- 주관성 모멘트의 삼각형 부등식이 필요충분임을 $\Sigma_c=\frac12\mathrm{tr}(I_c)E-I_c$와 점질량 6개의 구성으로 보여라.
- 토크 없는 회전에서 $\Omega_k^{2}=\Omega^{2}(I_k-I_a)(I_k-I_b)/(I_aI_b)$를 유도하고 최소·중간·최대 축의 안정성을 판정하라.
- 세계 프레임 식 $\tau_w=\frac{d}{dt}(I_w\omega_w)$가 물체 프레임 오일러 방정식과 같음을 $\dot I_w=[\omega_w]I_w-I_w[\omega_w]$로 보여라.
- URDF
<inertial>의origin·inertia에서 링크 프레임 기준 $G_L$을 구하라.
연구 질문:
- 유사 관성 행렬의 반정부호 조건이 충분조건이 되는 밀도 분포의 족은 무엇이며 식별에서 이 제약이 실제 부하 식별 오차를 얼마나 줄이는가(이 장은 시험하지 않았다)?
- 장시간 토크 없는 회전에서 자세 $R$까지 포함해 보존량을 유지하는 적분기의 오차와 비용은 RK4와 어떻게 비교되는가?
1차 출처(조회 2026-11-05).
- K. M. Lynch, F. C. Park, Modern Robotics: Mechanics, Planning, and Control, Cambridge University Press, 2017 — 8.1~8.3절·8.4절 앞부분·8.8절을 사전 인쇄본(2017-05판) 텍스트로 읽었다.
- ROS wiki, "urdf/XML/link" —
<inertial>항을 읽었다. MuJoCo 문서(XML 참조의inertial·fullinertia, 계산 개관의 변수 표)를 읽었다. - R. Featherstone, Rigid Body Dynamics Algorithms, Springer, 2008, doi:10.1007/978-1-4899-7560-7 — 서지만 확인.
- B. Mirtich, "Fast and accurate computation of polyhedral mass properties," Journal of Graphics Tools 1(2), 31–50, 1996, doi:10.1080/10867651.1996.10487458 — 서지만 확인.
- P. M. Wensing, S. Kim, J.-J. E. Slotine, "Linear matrix inequalities for physically consistent inertial parameter identification," IEEE Robotics and Automation Letters 3(1), 60–67, 2018, doi:10.1109/lra.2017.2729659 — 서지만 확인.
- S. Ashbaugh, C. C. Chicone, R. H. Cushman, "The twisting tennis racket," J. Dynamics and Differential Equations 3(1), 67–85, 1991, doi:10.1007/bf01049489 — 서지만 확인.
- J. Carpentier 외, "The Pinocchio C++ library," IEEE/SICE Int. Symp. on System Integration, 614–619, 2019, doi:10.1109/sii.2019.8700380 — 서지만 확인. E. Todorov, T. Erez, Y. Tassa, "MuJoCo," IROS, 5026–5033, 2012, doi:10.1109/iros.2012.6386109 — 서지만 확인.
- Pinocchio 4.1.0, MuJoCo 3.17.0, modern_robotics, trimesh 5.2.0, SciPy 1.18.1(
integrate.solve_ivp), numpy 2.5.4(linalg.eigvalsh).
다음 장. 3.2는 뉴턴-오일러 재귀 알고리즘(RNEA)을 다룬다. 이 장의 단일 강체 식을 링크 사슬에 적용해 관절 속도·가속도를 밑동에서 끝으로, 렌치를 끝에서 밑동으로 전파하는 $O(n)$ 역동역학을 구성한다.