AEGLOSLAB 로봇공학 전서(全書)

제3부 동역학

3.4 매니퓰레이터 운동방정식: 질량행렬·코리올리·중력항의 성질

3.4.1 이 장에서 배우는 것 / 선수 지식 / 특히 중요한 독자

이 장은 직렬 매니퓰레이터의 운동방정식 $M(q)\ddot q+C(q,\dot q)\dot q+g(q)=\tau$를 구성하는 세 항이 가지는 수학적 성질과 그 사용처를 계산으로 확인한다. 질량행렬의 대칭·양의 정부호·유계·구조적 영(零), 코리올리 행렬의 크리스토펠 인수분해와 $\dot M-2C$의 반대칭 성질 및 인수분해의 비유일성, 중력항의 위치에너지 기울기 표현과 유계, 관성 파라미터에 대한 선형성, 말단 유효 질량·동적 조작성(충돌 안전과 연결되는 양), 감속기의 반사 관성을 다룬다. 항을 계산하는 알고리즘은 3.2(RNEA)·3.5(CRBA·ABA), 라그랑주 유도와 에너지 수지는 3.3, 강체 하나의 관성은 3.1, 라이브러리와 도함수는 3.6, 파라미터 식별은 3.7, 마찰은 3.8, 유연 관절은 3.9, 구속 동역학은 3.11, 부유 기저는 3.13에서 다룬다.

배우는 것:

  • 질량행렬 — 대칭·양의 정부호의 근거, 회전 관절에서의 상한(구성에서 유도)과 표본 하한, $M_{ij}$가 $q_1,\dots,q_{\min(i,j)}$에 무관하다는 구조적 영.
  • 코리올리 행렬 — 크리스토펠 기호, $\dot M=C+C^T$, 같은 $C\dot q$를 주는 다른 인수분해, 반대칭 성질이 에너지 항등식보다 강한 이유.
  • 중력항 — $g=\partial V/\partial q$, 정적 토크, 상한, 연직 제1축에서의 $g_1=0$.
  • 파라미터 선형성 — $\tau=Y(q,\dot q,\ddot q)\pi$, 수치 계수.
  • 작업공간 질량 — $\Lambda$·유효 질량 $m_u$·동적 조작성, 반사 관성 $N^2J_m$.

선수 지식: 1.1(고유분해·SVD), 2.8(자코비안), 3.1(공간 관성), 3.2(RNEA), 3.3(라그랑주 정식화).

특히 중요한 독자: 계산 토크·적응·임피던스 제어(12.5·12.12·12.9)를 구현하는 제어 엔지니어, 충돌 안전에서 말단 유효 질량을 평가하는 안전 엔지니어(26.9), 동역학 라이브러리가 낸 $M$·$C$·$g$를 검증하는 개발자.

출처 방침. 기준 시점은 2026-11-05이다. 직접 읽은 자료: Lynch·Park, Modern Robotics(사전 인쇄본 2017-05판) 8.1.2~8.1.3(크리스토펠 기호 식 8.17, 코리올리 행렬 식 8.19, 명제 8.1과 증명, 질량행렬·말단 유효 질량 식 8.20~8.21), 8.4(식 8.55~8.80), 8.5, 8.6(식 8.82~8.91), 8.9 도입부를 텍스트로 읽었다. MuJoCo 문서의 계산 개관(편향력 $c$는 가속도 0의 RNE로, 관절공간 관성 $M$은 CRB로 계산한다는 서술)을 읽었다. Pinocchio 4.1.0의 computeCoriolisMatrix·crba·computeGeneralizedGravity 독스트링은 한 줄 설명뿐이다. Svarny·Rozlivek·Rustler·Hoffmann(ICRA 2021)의 최종 원고(arXiv:2009.01036)에서 ISO/TS 15066의 유효 로봇 질량 근사($M/2+m_L$)와 Khatib의 방향 의존 유효 질량을 대비한 부분만 읽었다(규격 본문이 아니라 인용이다). 서지만 확인한 것(Crossref로 실재를 확인했고 본문은 읽지 못했다): Khatib(1995, 유효 질량 등 관성 성질)·Yoshikawa(1985, 동적 조작성)·Slotine·Li(1987, 적응 제어)·Gautier·Khalil(1990, 최소 관성 파라미터). ISO/TS 15066 본문과 이 서지들의 서술은 읽지 못했으므로 규격 내용은 단정하지 않는다 (확인 필요). 팔의 치수·질량·관성·감속비·회전자 관성·토크 한계는 모두 이 장이 정한 가정이며 어떤 제품의 제원도 아니다. 수치는 이 장의 순수 파이썬 계산과 라이브러리 대조(2026-11-05 실행)이다.

3.4.2 개념 — 세 항은 각각 무엇을 보증하는가

결론부터 적으면 다음과 같다. 질량행렬 $M(q)$는 운동에너지를 정하는 대칭 양의 정부호 행렬이어서 모든 자세에서 가역이고, 회전 관절만 있으면 자세에 대해 유계이다. 코리올리 행렬 $C(q,\dot q)$는 속도에 선형인 행렬이지만 인수분해가 하나로 정해지지 않으며, 크리스토펠 기호로 만든 $C$를 사용하면 $\dot M-2C$가 반대칭이 되어 에너지 수지와 수동성 기반 안정성 증명에 사용할 수 있다. 중력항 $g(q)$는 위치에너지의 기울기로 속도와 가속도에 무관하며 회전 관절이면 유계이다. 세 항은 모두 링크의 관성 파라미터에 선형이어서 파라미터 식별(3.7)과 적응 제어(12.12)의 기초가 된다. 이 성질들은 알고리즘(3.2·3.5)이 어떤 형태로 계산하든 같으므로, 라이브러리가 낸 값의 검증 기준이기도 하다.

M(q) q̈ + C(q,q̇) q̇ + g(q) = τ M(q) 질량행렬 대칭·양의 정부호 운동에너지의 2차 형식 회전 관절이면 유계 충돌 안전의 유효 질량 26.9 C(q,q̇) 코리올리 속도에 대해 2차 크리스토펠 인수분해면 Ṁ − 2C 반대칭 수동성 기반 안정 증명 12.2 g(q) 중력항 ∂V/∂q, 위치만의 함수 속도·가속도에 무관 회전 관절이면 유계 중력 보상·토크 사이징 4.10·5.2 공통: τ = Y(q,q̇,q̈) π — 관성 파라미터 π에 선형 (3.7, 12.12)
운동방정식의 세 항의 성질과 사용처. 위쪽 상자가 운동방정식, 가운데 세 상자가 질량행렬·코리올리 행렬·중력항의 성질, 그 아래 상자가 각 성질의 사용처(장 번호)이고 맨 아래 상자는 세 항에 공통인 관성 파라미터 선형성이다.

이 장의 계산 결과를 미리 적으면 다음과 같다. ① 2R 점질량 팔의 $M$·$\Lambda$가 Modern Robotics 그림 8.3·8.4의 인쇄값과 같고 닫힌 식과 $4.4\times10^{-16}$ 안에서 같다. ② 6R 예시 팔의 $M$이 임의 자세 2000개에서 모두 양의 정부호이고 고유값이 $2.7\times10^{-4}\sim4.2$ kg·m², 구성에서 유도한 상한이 $10.9$ kg·m²이며 $M_{ij}$의 구조적 영이 $2\times10^{-16}$ 안에서 확인된다. ③ 해석적 $\partial M/\partial q$가 중심 차분과 $1.8\times10^{-9}$ 안에서 같다. ④ 크리스토펠 $C$의 $\dot M-2C$는 반대칭($8.9\times10^{-16}$)이지만 같은 $C\dot q$를 주는 다른 인수분해 $\tilde C$는 아니며($13.7$), $\dot q^T(\dot M-2\tilde C)\dot q$는 $0$이어도 임의 $s$에 대한 $s^T(\dot M-2\tilde C)s$는 $7.8$이다. ⑤ 4차 룽게-쿠타가 에너지 오차를 시간 간격 $4,\,2,\,1$ ms에서 $5.0\times10^{-2},\,2.9\times10^{-3},\,1.5\times10^{-4}$ J로 줄인다. ⑥ $\tau=Y\pi$가 $10^{-15}$ N·m 안에서 성립하고 회귀 행렬의 수치 계수는 60개 중 36이다. ⑦ 말단 유효 질량이 방향에 따라 $0.2\sim8.0$ kg(직접 구동)·$3.5\sim19.5$ kg(감속기 포함)으로 달라진다. ⑧ Pinocchio·MuJoCo·Drake·RBDL·modern_robotics·Robotics Toolbox가 $M$·$g$·$C\dot q$·순동역학을 $10^{-13}$ 이하로 재현하고 Pinocchio의 코리올리 행렬은 이 장의 크리스토펠 $C$와 $1.3\times10^{-15}$ 안에서 같다.

3.4.3 원리

3.4.3.1 운동방정식의 형태

관절 좌표 $q\in\mathbb R^n$에 대해 직렬 매니퓰레이터의 운동방정식은 다음이다.

$$M(q)\ddot q+C(q,\dot q)\dot q+g(q)=\tau.$$

$\tau$는 관절 토크이다. 마찰 $\tau_f$(3.8)와 말단이 환경에 가하는 렌치 $F_{tip}$는 $\tau=M\ddot q+C\dot q+g+\tau_f+J^TF_{tip}$ 꼴로 더해진다(Modern Robotics 식 8.77은 $J^TF_{tip}$ 항을 포함한다). $C\dot q+g$를 한데 묶어 편향력 $h(q,\dot q)$로 적기도 한다. 세 항은 의존 방식이 다르다. $M\ddot q$는 가속도에 선형이고, $C\dot q$는 속도의 2차 형식이며, $g$는 속도와 가속도에 무관하다. 정지($\dot q=0$, $\ddot q=0$)에서는 $\tau=g(q)$이므로 중력항이 자세를 유지하는 정적 토크이다. 중력 가속도 벡터는 $\gamma=(0,0,-9.81)$ m/s²로 적어 중력항 $g(q)$와 구분한다. 이 책의 트위스트 순서는 $(\omega,v)$, 렌치는 $(m,f)$이다.

3.4.3.2 질량행렬 — 대칭·양의 정부호·유계

링크 $l$의 관성 파라미터를 $\pi_l=(m_l,\,h_l=m_lc_l,\,I_{O,l})$(질량, 질량 1차 모멘트, 링크 프레임 원점 기준 관성 텐서)로 두면 링크 $l$의 운동에너지는 원점 속도 $v_o$와 각속도 $\omega$에 대해 $\tfrac12m\lvert v_o\rvert^2+v_o\cdot(\omega\times h)+\tfrac12\omega^TI_O\omega$이다. 관절 $j$의 단위 속도가 링크 $l$에 주는 트위스트를 $S_{lj}=(\omega_j,\ \omega_j\times(p_l-p_j))$($j\le l$)로 두면 질량행렬은 다음이다(Modern Robotics 식 8.57의 $\sum J_{ib}^TG_iJ_{ib}$와 같은 합이며 이 장은 월드 좌표 트위스트로 적었다).

$$M_{ij}(q)=\sum_{l\ge\max(i,j)}S_{li}^{T}G_lS_{lj},\qquad K=\tfrac12\dot q^TM(q)\dot q .$$

대칭·양의 정부호. $M$은 이차 형식의 계수이므로 대칭이다. 링크의 공간 관성 $G_l$이 모두 양의 정부호(3.1의 물리적 타당성: 질량 양수·질량중심 관성 텐서 양의 정부호)이면 $M$은 모든 $q$에서 양의 정부호이다. $\dot q\ne0$이고 $j$를 속도가 0이 아닌 첫 관절로 두면 링크 $j$의 트위스트가 $S_{jj}\dot q_j\ne0$이므로 $K\ge\tfrac12\dot q_j^2S_{jj}^TG_jS_{jj}>0$이다. 그러므로 $M$은 가역이고 $\ddot q=M^{-1}(\tau-C\dot q-g)$가 모든 자세에서 정의된다. 점질량 링크처럼 $G_l$이 특이해도 $M$이 양의 정부호일 수 있으며(아래 2R 예), 이 장의 논증은 충분조건이다.

유계. 회전 관절만 있으면 $M$은 $q_i$의 $\sin$·$\cos$로만 이루어져 $2\pi$ 주기의 연속 함수이고 $q$는 콤팩트한 토러스에 있으므로 $m_{\min}I\preceq M(q)\preceq m_{\max}I$인 상수가 존재한다. 상한은 구성에서 엄밀하게 유도할 수 있다. 링크 $l$의 질량중심 속도는 $\sum_{j\le l}\omega_j\times(p_{cl}-p_j)\dot q_j$이고 $\lvert p_{cl}-p_j\rvert\le r_{jl}=\sum_{k=j+1}^{l}\lvert d_k\rvert+\lvert c_l\rvert$이므로 코시-슈바르츠 부등식으로 다음이 성립한다.

$$M(q)\preceq\bar m\,I,\qquad \bar m=\sum_{l=1}^{n}\Bigl[m_l\sum_{j\le l}r_{jl}^2+l\,\lambda_{\max}(I_{c,l})\Bigr].$$

하한은 구성에서 엄밀하게 얻지 못했고 표본 최솟값만 계산했다. 하한은 대체로 말단 링크의 관성모멘트로 정해진다($\lambda_{\min}\le M_{nn}$). 직선 이동(직동) 관절이 있으면 $M$이 그 관절 위치에도 의존하므로 유계성은 관절 한계 안에서만 성립한다. 조건수 $\lambda_{\max}/\lambda_{\min}$가 크면 같은 토크가 손목 방향에서 큰 가속도를 만들어 순동역학의 수치 적분이 강성(stiff)이 된다.

3.4.3.3 코리올리·원심 행렬 — 크리스토펠 인수분해와 반대칭 성질

운동에너지를 오일러-라그랑주 방정식에 넣으면 속도 2차 항이 크리스토펠 기호 $\Gamma_{ijk}$로 나온다(Modern Robotics 식 8.16~8.19).

$$\Gamma_{ijk}=\tfrac12\Bigl(\frac{\partial M_{ij}}{\partial q_k}+\frac{\partial M_{ik}}{\partial q_j}-\frac{\partial M_{jk}}{\partial q_i}\Bigr),\qquad C_{ij}(q,\dot q)=\sum_k\Gamma_{ijk}\dot q_k .$$

반대칭 성질. $\dot M_{ij}-2C_{ij}=\sum_k\bigl(\partial M_{kj}/\partial q_i-\partial M_{ik}/\partial q_j\bigr)\dot q_k$이고 $i$와 $j$를 바꾸면 부호가 바뀌므로 $\dot M-2C$는 반대칭이다(Modern Robotics 명제 8.1의 증명). 같은 말로 $\dot M=C+C^T$이며, $\Gamma_{ijk}+\Gamma_{jik}=\partial M_{ij}/\partial q_k$($M$의 대칭성)에서 바로 나온다.

인수분해는 유일하지 않다. 속도 2차 힘의 벡터 $C\dot q$는 운동방정식이 정하지만 행렬 $C$는 정하지 않는다. $K(q,\dot q)\dot q=0$인 임의 행렬 $K$에 대해 $C+K$도 같은 $C\dot q$를 준다. 이 장은 두 종류를 만들었다. 하나는 $\tilde C=\dot M-\tfrac12\bigl[\sum_k\partial M_{jk}/\partial q_i\,\dot q_k\bigr]_{ij}$로 $\tilde C\dot q=C\dot q$이지만 $\dot M-2\tilde C$가 반대칭이 아니다. 다른 하나는 $\dot q$에 직교하는 두 벡터 $u,w$로 $K=uw^T-wu^T$를 만들어 $C'=C+K$로 둔 것이며 $K$가 반대칭이고 $K\dot q=0$이므로 $\dot M-2C'$도 반대칭이다. 그러므로 크리스토펠 $C$는 반대칭 성질을 가지는 인수분해의 하나이며 유일한 것이 아니다.

사용처. 에너지 항등식 $\tfrac{d}{dt}(K+V)=\dot q^T\tau$는 $\dot q^T(\dot M-2C)\dot q=0$만 필요하며 $C\dot q$가 같은 모든 인수분해에서 성립한다(유도는 3.3). 반면 기준 속도 $\dot q_r\ne\dot q$를 사용하는 적응 제어의 리아푸노프 증명은 $s^T(\dot M-2C)s=0$($s\ne\dot q$)을 요구하므로 행렬의 반대칭 성질 자체가 필요하다 — 이 용도는 Slotine·Li(1987)로 알려져 있으나 원문을 읽지 못했다 (확인 필요)(12.2·12.12). 회전 관절이면 $\Gamma_{ijk}$가 $q$의 연속 주기 함수여서 유계이므로 $\lVert C(q,x)y\rVert\le k_c\lVert x\rVert\lVert y\rVert$인 상수 $k_c$가 존재한다.

3.4.3.4 중력항 — 위치에너지의 기울기

중력 위치에너지는 $V(q)=-\gamma\cdot\sum_l(m_lp_l+h_l)$($p_l$은 링크 원점, $h_l$은 월드 좌표의 $m_lc_l$)이고 중력항은 다음이다.

$$g(q)=\frac{\partial V}{\partial q},\qquad g_j=-\sum_{l\ge j}\gamma\cdot\bigl(m_l\,\omega_j\times(p_l-p_j)+\omega_j\times h_l\bigr).$$

$g$는 $q$만의 함수이고 보존력에서 나오므로 일을 하지 않는 힘이다. 회전 관절이면 $V$와 $g$가 유계이며 $\lVert g\rVert\le\bar g=9.81\sum_lm_l\bigl(\sum_{j\le l}r_{jl}^2\bigr)^{1/2}$이다. 제1축이 중력과 평행하면 $g_1=0$이다. 정적 토크 $g(q)$의 자세별 크기는 구동기 정격과 감속기 선정의 입력이다(5.2). 중력 보상은 기구(4.10)나 제어($\tau=g(q)$, 12.3·12.5)로 한다. $g$의 자코비안 $\partial g/\partial q$는 자세 강성의 중력 성분이다(2.12).

3.4.3.5 관성 파라미터에 대한 선형성

세 항이 모두 $(m_l,h_l,I_{O,l})$에 선형이므로(질량에 비례하는 항, 질량 1차 모멘트에 비례하는 항, 관성 텐서에 비례하는 항의 합) 다음이 성립한다.

$$\tau=Y(q,\dot q,\ddot q)\,\pi,\qquad \pi=(\pi_1,\dots,\pi_n)\in\mathbb R^{10n},\quad Y\in\mathbb R^{n\times10n}.$$

선형이지 아핀이 아니다. 중력항도 $\pi$에 비례하기 때문이다. $Y$는 $\pi$의 각 단위 벡터로 역동역학을 평가하면 열마다 얻는다. 모든 파라미터가 독립적으로 식별되지는 않는다. 어떤 열은 항상 0이고 어떤 열은 다른 열의 조합이어서 $Y$의 계수가 $10n$보다 작으며, 독립인 조합이 기저 파라미터이다(Gautier·Khalil(1990)이 최소 관성 파라미터의 직접 계산을 다룬다는 것은 서지로만 확인했다). 이 장은 예시 팔에서 수치 계수만 계산한다. 기저 파라미터의 구성, 여기 궤적, 물리적 타당성 조건은 3.7의 주제이다.

3.4.3.6 순환 좌표와 구조적 영(零)

관절 $k$를 돌리면 관절 $k$ 이후의 모든 링크와 축이 같은 강체 운동을 한다. $i,j\ge k$이면 트위스트 $S_{li}$, $S_{lj}$와 월드 좌표 관성 $G_l$이 모두 같은 강체 변환을 받고 $k=i$일 때 $S_{li}$는 자기 축 둘레의 회전에 불변이므로 $S_{li}^TG_lS_{lj}$가 변하지 않는다. 따라서 다음이 성립한다.

$$\frac{\partial M_{ij}}{\partial q_k}=0\quad(k\le\min(i,j)).$$

두 결과가 따른다. 첫째 $M_{nn}$은 상수(말단 링크의 축 둘레 관성모멘트)이고 $M$은 $q_1$에 의존하지 않는다. 둘째 제1축이 중력과 평행하면 $\partial V/\partial q_1=0$이므로 $q_1$이 순환 좌표이고 일반화 운동량 $p_1=(M\dot q)_1$이 $\tau_1=0$인 운동에서 보존된다($\dot p_1=\partial L/\partial q_1=0$). 이 구조는 $M$의 계산량을 줄이고 모델 검증의 점검 항목이 된다.

3.4.3.7 작업공간 질량 — 유효 질량과 동적 조작성

말단 트위스트가 $V=J\dot q$이고 $J$가 가역이면 운동에너지가 좌표에 무관하다는 조건에서 $\Lambda(q)=J^{-T}MJ^{-1}$이다(Modern Robotics 식 8.20~8.21·8.90). 선속도만 보는 위치 질량은 $J_v$($3\times n$, 여유자유도 팔 포함)에 대해 다음이다.

$$A=J_vM^{-1}J_v^T,\qquad \Lambda_v=A^{-1},\qquad m_u=\frac{1}{u^TAu}\quad(\lVert u\rVert=1).$$

정지($\dot q=0$)에서 말단에 힘 $F=fu$를 가하면 말단 가속도가 $a=AF$이므로 $u$ 방향 성분이 $a\cdot u=f/m_u$이다. $m_u$가 말단을 $u$ 방향으로 밀 때 느끼는 겉보기 질량(유효 질량)이며 주축 값은 $\Lambda_v$의 고유값이다(작업공간 제어에서의 사용은 12.6). $m_u\ne u^T\Lambda_vu$에 유의한다. 6자유도 $\Lambda_6$의 선속도 블록은 $\Lambda_v$가 아니다. 블록의 역행렬과 역행렬의 블록이 다르기 때문이다(3.4.5의 ⑦, 작업공간 질량의 검사).

유효 질량은 충돌 안전의 입력이다. 인간-로봇 충돌의 2체 모델은 환산 질량 $\mu=(1/m_R+1/m_H)^{-1}$를 사용하고 $m_R$이 로봇 유효 질량이다. ISO/TS 15066은 $m_R$을 이동 부분 질량의 절반과 유효 부하의 합($M/2+m_L$)으로 정적으로 근사하는 것으로 인용되며, Khatib의 유효 질량은 자세와 충돌 방향에 의존한다(Svarny 외, 2021 — 규격 본문은 읽지 못했다 (확인 필요)). 이 장의 예시 팔에서 두 값을 비교한다(3.4.5).

동적 조작성은 관절 토크 한계 $T=\mathrm{diag}(\tau_{\max,i})$ 안의 토크로 정지 상태에서 낼 수 있는 말단 가속도의 집합 $\{a=J_vM^{-1}Tu_\tau:\lVert u_\tau\rVert\le1\}$이며 반축이 $J_vM^{-1}T$의 특이값이다(Yoshikawa(1985)가 제안한 동적 조작성이 이와 같은 정의인지는 원문을 읽지 못해 확인하지 않았다 (확인 필요)). 중력과 속도 항은 제외한다. 운동학적 조작성(2.9)이 속도 타원체인 데 비해 질량행렬이 가속도 타원체를 정한다.

3.4.3.8 반사 관성과 감속비

구동기가 감속비 $N_i$의 감속기를 거쳐 관절 $i$를 구동하면 회전자 각속도가 $N_i\dot q_i$이므로 회전자 운동에너지 $\tfrac12J_{m,i}N_i^2\dot q_i^2$가 $M_{ii}$에 $N_i^2J_{m,i}$를 더한다.

$$M_{\rm total}(q)=M(q)+\mathrm{diag}\bigl(N_i^2J_{m,i}\bigr).$$

이 장은 회전자 축이 관절 축과 같고 회전자의 질량중심이 축 위에 있으며 회전자의 자이로 결합이 없다고 가정했다(이 가정이 깨지는 경우와 감속기·구동기 유연성은 3.9). 두 결과가 따른다. 첫째 $M_{\rm total}\succeq\min_i(N_i^2J_{m,i})\,I$이므로 하한이 엄밀하게 생긴다. 둘째 $N$이 크면 대각 성분이 $q$에 덜 의존하고 결합이 상대적으로 작아진다. 감속기 선정은 5.10·5.11, 관절 모듈 통합은 7.2, 구동기 사이징은 5.2에서 다룬다.

3.4.4 알고리즘

질량행렬(arm, q):     링크 l마다 월드 (m, h = R h_l, I = R I_O R^T)와 S_lj = (w_j, w_j × (p_l − p_j)) 를 만들고
                      M_ij += form(S_li, S_lj; m, h, I)      (j ≤ l, i ≤ l)
∂M/∂q_k (해석적):     k ≤ l 인 링크에 대해 dS_lj, dh = w_k × h, dI = [w_k]x I − I [w_k]x 를 곱의 법칙으로 넣는다
                      (dw_j = w_k × w_j (k<j),  dp_x = w_k × (p_x − p_k) (k ≤ x))
중력항(arm, q):       g_j = −Σ_{l ≥ j} γ·(m_l w_j × (p_l − p_j) + w_j × h_l)
코리올리(arm, q, q'): C_ij = Σ_k ½(∂M_ij/∂q_k + ∂M_ik/∂q_j − ∂M_jk/∂q_i) q'_k ;  C~_ij = (Ṁ)_ij − ½ Σ_k ∂M_jk/∂q_i q'_k
역동역학:             τ = M q'' + C q' + g          순동역학: q'' = M^-1 (τ − C q' − g)
유효 질량(q, u):      A = J_v M^-1 J_v^T ;  m_u = 1/(u^T A u) ;  반사 관성이 있으면 M_ii += N_i² J_m,i

3.4.5 풀이 예제 — 2R 대조, 6R 팔의 성질, 에너지 수지, 선형성, 유효 질량, 반사 관성

결론부터 적으면 다음과 같다. ① 2R 점질량 팔의 $M$·$\Lambda$가 Modern Robotics의 인쇄값과 같다. ② 6R 팔의 $M$이 2000개 자세에서 모두 양의 정부호이고 구성에서 유도한 상한 안에 있다. ③ 해석적 $\partial M/\partial q$·$g$가 중심 차분과 $10^{-9}$ 안에서 같다. ④ 크리스토펠 $C$만 반대칭 성질을 가지고 다른 인수분해들은 $C\dot q$만 같다. ⑤ 4차 룽게-쿠타의 에너지 오차가 4차 수렴하고 일량-에너지 수지가 $4\times10^{-8}$ J 안에서 닫힌다. ⑥ $Y\pi=\tau$가 성립하고 수치 계수는 36이다. ⑦ 유효 질량이 방향·자세·감속기에 따라 크게 달라지고 ISO/TS 15066으로 인용되는 정적 근사 $M/2$와 일치하지 않는다. ⑧ 반사 관성이 질량행렬의 변동과 결합을 줄인다. ⑨ 중력 토크는 펼침 자세에서 가장 크다. ⑩ 6개 라이브러리가 $10^{-13}$ 이하로 일치한다.

구현. kin·link_terms·form·mass_matrix(해석적 도함수 포함)·gravity·potential·coriolis·inverse_dynamics·forward_dynamics·tool_jacobian·eff_mass_matrix. 아래 코드는 1.1의 matmul·solve_lu를 사용한다. 에너지 적분(rk4)·표본 추출·표·그림은 스크립트에 있다.

항목값
입력 12R 점질량 팔: $L_1=L_2=1$, 점질량 $m_1=m_2=1$이 링크 끝, $\theta_2=90^\circ,\,150^\circ$ 및 100점. 수평면이라 중력 토크는 0
입력 26R 예시 팔(UR 계열의 어깨·팔꿈치·손목 구성을 본뜬 임의 제원, 아래 표): 모든 프레임이 $q=0$에서 베이스와 같은 자세, 링크는 균일 원기둥(링크 3은 $y$축 둘레 $0.26$ rad 기울여 관성 곱 $I_{xz}$ 생성), 말단점은 링크 6 프레임의 $(0,\,0.08,\,0)$ m. 중력 $\gamma=(0,0,-9.81)$
입력 3질량행렬 성질: $q_i\sim U(-\pi,\pi)$ 2000개(시드 662). 도함수·$g$: 40개(시드 663), 중심 차분 $h=10^{-6}$
입력 4코리올리: $q\sim U(-\pi,\pi)$, $\dot q\sim U(-2,2)$ 300개(시드 664)
입력 5에너지: $q_0=(0.3,-0.8,1.2,-0.4,0.5,0.2)$, $\dot q_0=(0.8,-0.5,0.6,0.9,-0.7,0.4)$, $\tau=0$, 2 s. 4차 룽게-쿠타 4·2·1 ms, 오일러 1 ms. PD: $K_P=(30,40,20,2,1,0.2)$, $K_D=(6,8,4,0.3,0.15,0.03)$, 목표 $(0,-1,1,0,0,0)$
입력 6선형성: 임의 $q,\dot q,\ddot q$ 1점과 $\pi'\sim U(-1,1)^{60}$, 계수는 40점(시드 666, 라이브러리 대조는 시드 5)
입력 7유효 질량: 세 자세 접힘 $(0.4,-1.6,2.5,-0.9,0.6,0.3)$·중간 $(0.4,-0.9,1.4,-0.5,0.6,0.3)$·펼침 $(0.4,-0.35,0.3,0.1,0.6,0.3)$ rad. 감속기 포함: $N=100$, $J_m=3\times10^{-5}$ kg·m²(가정). 토크 한계 $(150,150,80,30,30,10)$ N·m(가정)
입력 8반사 관성: $N=1,10,50,100$, 자세 400개(시드 668)
입력 9라이브러리 대조: URDF·MJCF·modern_robotics 입력으로 옮긴 같은 팔, 임의 자세·속도·가속도·토크 200개(시드 661)
관절 $i$축 $a_i$원점 $d_i$ (m)질량 $m_i$ (kg)질량중심 $c_i$ (m)$I_{xx}$ · $I_{yy}$ · $I_{zz}$ ($10^{-3}$ kg·m²)$I_{xz}$ ($10^{-3}$ kg·m²)
1z$(0,\ 0,\ 0.09)$3.7$(0,\ 0,\ 0)$7.770 · 7.770 · 6.6600.000
2y$(0,\ 0.13,\ 0)$8.4$(0.21,\ 0,\ 0)$15.120 · 131.040 · 131.0400.000
3y$(0.42,\ -0.12,\ 0)$2.3$(0.195,\ 0,\ 0)$4.178 · 30.317 · 28.4676.953
4y$(0.39,\ 0,\ 0)$1.2$(0.045,\ 0.05,\ 0)$0.960 · 1.290 · 1.2900.000
5z$(0.09,\ 0.11,\ 0)$1.2$(0,\ 0,\ -0.045)$1.290 · 1.290 · 0.9600.000
6y$(0,\ 0,\ -0.09)$0.35$(0,\ 0.02,\ 0)$0.187 · 0.280 · 0.1870.000
from math import sin, cos, sqrt, pi

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 vadd(a, b):
    return [x + y for x, y in zip(a, b)]
def vsub(a, b):
    return [x - y for x, y in zip(a, b)]
def vsc(s, a):
    return [s * x for x in a]
def mv(A, x):
    return [dot(r, x) for r in A]
def solve(A, b):
    return solve_lu(A, b)[0]
def skew(w):
    return [[0, -w[2], w[1]], [w[2], 0, -w[0]],
            [-w[1], w[0], 0]]
def rodrigues(a, q):
    K = skew(a)
    K2 = matmul(K, K)
    return [[(i == j) + sin(q) * K[i][j]
             + (1 - cos(q)) * K2[i][j] for j in range(3)]
            for i in range(3)]

def kin(arm, q):
    """월드 좌표의 축 w[l], 원점 p[l], 자세 R[l].
    모든 프레임은 q=0에서 베이스와 같은 자세이다."""
    I3 = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    R, p, w = [I3], [[0, 0, 0]], []
    for l, (d, a) in enumerate(zip(arm['d'], arm['a'])):
        w.append(mv(R[-1], a))
        p.append(vadd(p[-1], mv(R[-1], d)))
        R.append(matmul(R[-1], rodrigues(a, q[l])))
    return R[1:], p[1:], w

def link_terms(arm, q):
    """링크별 (m, 월드 h = m c, 월드 I_O)"""
    R, p, w = kin(arm, q)
    T = []
    for l, (m, h, IO) in enumerate(arm['P']):
        Rt = [list(r) for r in zip(*R[l])]
        T.append((m, mv(R[l], h),
                  matmul(matmul(R[l], IO), Rt)))
    return T, p, w

def form(a, b, m, h, I):
    """트위스트 a=(각속도, 점속도), b에 대한 운동에너지의
    쌍일차 형식 (m, h, I는 월드 좌표, 링크 원점 기준)"""
    return (m * dot(a[1], b[1]) + dot(a[0], mv(I, b[0]))
            + dot(a[1], cross(b[0], h))
            + dot(b[1], cross(a[0], h)))

def mass_matrix(arm, q, deriv=False):
    """M(q) = Σ_l S_l^T G_l S_l.  deriv=True이면 해석적
    ∂M/∂q_k (dM[k])도 반환한다."""
    n = len(q)
    T, p, w = link_terms(arm, q)
    M = [[0.0] * n for _ in range(n)]
    dM = [[[0.0] * n for _ in range(n)] for _ in range(n)]
    for l, (m, h, I) in enumerate(T):
        S = [(w[j], cross(w[j], vsub(p[l], p[j])))
             for j in range(l + 1)]
        for i in range(l + 1):
            for j in range(l + 1):
                M[i][j] += form(S[i], S[j], m, h, I)
        for k in range(l + 1 if deriv else 0):
            # q_k의 회전이 먼쪽의 모든 것을 w_k 둘레로 돌린다
            rot = lambda x: cross(w[k], x)
            dp = lambda x: rot(vsub(p[x], p[k])) if k <= x \
                else [0, 0, 0]
            dS = []
            for j in range(l + 1):
                dw = rot(w[j]) if k < j else [0, 0, 0]
                r = vsub(p[l], p[j])
                dv = vadd(cross(dw, r),
                          cross(w[j], vsub(dp(l), dp(j))))
                dS.append((dw, dv))
            Sk = skew(w[k])
            dI = [[x - y for x, y in zip(r1, r2)] for r1, r2
                  in zip(matmul(Sk, I), matmul(I, Sk))]
            for i in range(l + 1):
                for j in range(l + 1):
                    dM[k][i][j] += (
                        form(dS[i], S[j], m, h, I)
                        + form(S[i], dS[j], m, h, I)
                        + form(S[i], S[j], 0, rot(h), dI))
    return (M, dM) if deriv else M

def gravity(arm, q, gam=(0.0, 0.0, -9.81)):
    """g(q) = ∂V/∂q,  V = −γ·Σ_l (m p_l + h_l)"""
    T, p, w = link_terms(arm, q)
    g = [0.0] * len(q)
    for l, (m, h, I) in enumerate(T):
        for j in range(l + 1):
            dpl = cross(w[j], vsub(p[l], p[j]))
            f = vadd(vsc(m, dpl), cross(w[j], h))
            g[j] -= dot(gam, f)
    return g

def potential(arm, q, gam=(0.0, 0.0, -9.81)):
    T, p, w = link_terms(arm, q)
    return -sum(dot(gam, vadd(vsc(m, p[l]), h))
                for l, (m, h, I) in enumerate(T))

def coriolis(arm, q, qd):
    """크리스토펠 C와 비크리스토펠 C~ (C~ q' = C q').
    Γ_ijk = (∂m_ij/∂q_k + ∂m_ik/∂q_j − ∂m_jk/∂q_i) / 2"""
    n = len(q)
    M, d = mass_matrix(arm, q, True)
    rg = range(n)
    C = [[sum(0.5 * (d[k][i][j] + d[j][i][k] - d[i][j][k])
              * qd[k] for k in rg) for j in rg] for i in rg]
    Md = [[sum(d[k][i][j] * qd[k] for k in rg) for j in rg]
          for i in rg]
    Ct = [[Md[i][j] - 0.5 * sum(d[i][j][k] * qd[k]
                                for k in rg) for j in rg]
          for i in rg]
    return M, C, Md, Ct

def inverse_dynamics(arm, q, qd, qdd):
    M, C, Md, Ct = coriolis(arm, q, qd)
    g, n = gravity(arm, q), len(q)
    return [dot(M[i], qdd) + dot(C[i], qd) + g[i]
            for i in range(n)]

def forward_dynamics(arm, q, qd, tau):
    M, C, Md, Ct = coriolis(arm, q, qd)
    g, n = gravity(arm, q), len(q)
    b = [tau[i] - g[i] - dot(C[i], qd) for i in range(n)]
    return solve(M, b)

① 2R 점질량 팔 — 인쇄값 대조.

자세$(M_{11},\ M_{12},\ M_{22})$ 이 장MR 그림 8.3 인쇄값$(\Lambda_{11},\ \Lambda_{12},\ \Lambda_{22})$ 이 장MR 그림 8.4 인쇄값$\Lambda^{-1}$ 이 장MR 인쇄값
$\theta_2=90^\circ$(3.000, 1.000, 1.000)(3, 1, 1)(1.000, 0.000, 2.000)(1, 0, 2)(1.000, 0.000, 0.500)(1, 0, 0.5)
$\theta_2=150^\circ$(1.268, 0.134, 1.000)(1.27, 0.13, 1)(4.000, -1.732, 2.000)(4, −1.73, 2)(0.400, 0.346, 0.800)(0.4, 0.35, 0.8)
닫힌 식 $M_{11}=3+2\cos\theta_2,\ M_{12}=1+\cos\theta_2,\ M_{22}=1$과 최대 차이 ($\theta_2$ 100점)4.4e-16

$M$이 Modern Robotics 그림 8.3의 $(3,1,1)$, $(1.27,0.13,1)$과, $\Lambda$가 그림 8.4의 $(1,0,2)$, $(4,-1.73,2)$와 같다. 그림 8.4의 $\Lambda^{-1}=(0.4,\,0.35,\,0.8)$도 같다(이 장은 $\Lambda^{-1}_{12}=0.3464$를 반올림한 값). $\theta_2=90^\circ$에서 $x$ 방향 힘은 링크 2만, $y$ 방향 힘은 두 질량을 모두 느낀다는 그림 8.4 캡션의 설명과 $\Lambda=\mathrm{diag}(1,2)$가 일치한다.

② 질량행렬의 성질.

6R 팔의 질량행렬 $M(q)$·중력항 $g(q)$ (무작위 $q$ 표본 2000개)값
대칭성 $\max\lvert M_{ij}-M_{ji}\rvert$4.4e-16
최소 고유값이 양수인 표본 수2000 / 2000
최소 고유값의 표본 최솟값 · 최대 고유값의 표본 최댓값2.716e-04 · 4.243 kg·m²
조건수 $\lambda_{\max}/\lambda_{\min}$의 표본 최댓값1.554e+04
구성에서 유도한 상한 $\bar m$ (모든 $q$에서 $M\preceq\bar m I$) · 표본 최대 고유값과의 비10.868 kg·m² · 0.39
$\max\lvert\partial M_{ij}/\partial q_k\rvert$, $k\le\min(i,j)$ (50점)2.1e-16
$M_{66}$의 표본 최대 · 최소 차 (값 0.280$\times10^{-3}$ kg·m²)8.7e-19
$\max\lvert g_1\rvert$ (제1축이 연직)0.0e+00
$\lVert g(q)\rVert$의 표본 최댓값 · 구성에서 유도한 상한 $\bar g$56.79 · 98.02 N·m
해석적 $\partial M/\partial q_k$ 대 $M$의 중심 차분 (40점, $h=10^{-6}$)1.8e-09
해석적 $g(q)$ 대 위치에너지 $V$의 중심 차분9.3e-09

2000개 자세에서 $M$은 모두 양의 정부호이고 대칭 오차는 기계 정밀도이다. 최소 고유값 $2.7\times10^{-4}$ kg·m²는 말단 링크의 축 둘레 관성모멘트 $M_{66}=2.8\times10^{-4}$ kg·m²보다 작고(최소 고유값은 대각 성분 이하) 조건수는 $1.6\times10^{4}$까지 간다. $M_{66}$은 상수이고 $\partial M_{ij}/\partial q_k$가 $k\le\min(i,j)$에서 $2\times10^{-16}$ 이하이다(3.4.3.6). 표본 최대 고유값은 구성에서 유도한 상한 $\bar m=10.87$의 $39\,\%$이므로 상한이 성립하되 보수적이다. $g_1=0$이고 $\lVert g\rVert$의 표본 최댓값 $56.8$ N·m가 상한 $\bar g=98.0$ N·m 아래에 있다.

③ 해석적 도함수. (위 표의 마지막 두 행)

$\partial M/\partial q_k$의 해석식(곱의 법칙으로 회전 불변성을 적용한 식)과 중력항이 중심 차분과 $10^{-9}$ 안에서 같다. 중심 차분 자체의 오차 한계($h=10^{-6}$에서 반올림 오차 $\epsilon/h\approx10^{-10}$과 절단 오차 $h^2$)가 이 값이다.

④ 코리올리 행렬의 인수분해.

항목 (표본 300개, $\max\lvert\dot M\rvert=6.85$)크리스토펠 $C$비크리스토펠 $\tilde C$
$\max\lvert(\dot M-2C)+(\dot M-2C)^T\rvert$8.9e-1613.71
$\max\lvert\dot q^T(\dot M-2C)\dot q\rvert$4.2e-156.4e-15
$\max\lvert s^T(\dot M-2C)s\rvert$ (임의 $s\ne\dot q$)8.1e-167.80
$\max\lvert\dot M-C-C^T\rvert$4.4e-16
$\max\lvert(C-\tilde C)\dot q\rvert$1.2e-15
$C'=C+K$ ($K$ 반대칭, $K\dot q=0$): $\max\lvert(\dot M-2C')+(\dot M-2C')^T\rvert$1.8e-15
$C'=C+K$: $\max\lvert K\rvert$ ($C'$가 $C$와 다른 정도) · $\max\lvert K\dot q\rvert$1.71 kg·m² · 1.1e-15 N·m
$\max\lVert C\rVert_F/\lVert\dot q\rVert$1.70 kg·m²

크리스토펠 $C$에서 $\dot M-2C$가 반대칭이고 $\dot M=C+C^T$이다. 비크리스토펠 $\tilde C$는 $C\dot q$는 같으나($1.2\times10^{-15}$) $\dot M-2\tilde C$가 반대칭이 아니다. 두 행렬 모두 $\dot q^T(\dot M-2C)\dot q$는 $10^{-15}$ 수준의 0이지만 임의 $s$에 대해서는 크리스토펠 $C$만 0이다($8.1\times10^{-16}$ 대 $7.8$). 따라서 에너지 항등식은 인수분해에 무관하게 성립하고 $s\ne\dot q$를 사용하는 증명은 크리스토펠 선택에 의존한다. $K\dot q=0$인 반대칭 $K$를 더한 $C'$도 반대칭 성질을 가지며($1.8\times10^{-15}$) $C$와 크게 다르다($\max\lvert K\rvert=1.71$ kg·m²) — 반대칭 성질을 가지는 인수분해도 유일하지 않다. $\lVert C\rVert_F/\lVert\dot q\rVert\le1.70$ kg·m²(표본)로 $k_c$의 표본 하한을 얻는다.

⑤ 에너지 수지.

적분 (τ=0, 2 s, $E_0=36.88$ J, $K_0=1.05$ J)시간 간격$\max\lvert E(t)-E_0\rvert$$t=2$ s의 $E-E_0$
4차 룽게-쿠타4 ms5.03e-02 J-4.80e-02 J
4차 룽게-쿠타2 ms2.89e-03 J-2.55e-03 J
4차 룽게-쿠타1 ms1.50e-04 J-8.53e-05 J
오일러 갱신 (MR 8.5)1 ms2.92 J1.50 J
0.0 0.5 1.0 1.5 2.0 10−8 10−6 10−4 10−2 100 시간 t (s) 에너지 오차 (J) 오일러 갱신, 1 ms 4차 룽게-쿠타, 4 ms 4차 룽게-쿠타, 2 ms 4차 룽게-쿠타, 1 ms
$\tau=0$ 자유 운동(2 s)의 에너지 오차(로그 축). 오일러 갱신(1 ms)은 $1$ J 안팎이고 4차 룽게-쿠타는 시간 간격 4·2·1 ms에서 최대 $5.0\times10^{-2}$·$2.9\times10^{-3}$·$1.5\times10^{-4}$ J이다. 손목 각속도가 $110$ rad/s에 이르는 $1.5$ s 부근에서 오차가 증가한다. $10^{-9}$ J 미만의 값은 $10^{-9}$ J로 표시했다.

시간 간격을 절반으로 줄일 때 4차 룽게-쿠타의 최대 오차 비가 $17.4$, $19.3$으로 4차 수렴($16$)에 가깝다. 오일러 갱신은 같은 1 ms에서 $2.92$ J로 룽게-쿠타의 $2\times10^{4}$배이다. $\tau=0$ 자유 운동은 손목 관성이 작아 거칠다. 시간 간격 2 ms의 궤적에서 관절 4의 각속도가 $t=1.51$ s에 $110.6$ rad/s에 이르고(에너지 오차 그림에서 오차가 $1.5$ s 부근에서 증가한다) 협동로봇의 정상 운전 영역이 아니다. 이 시험은 모델과 적분기의 일관성 시험이지 운전 조건의 시뮬레이션이 아니다.

보존량 검사 (4차 룽게-쿠타)값
PD 토크 구동(1 ms, 2 s): 일량 $W=\int\dot q^T\tau\,dt$ · 에너지 변화 $E(2)-E_0$-41.4871 J · -41.4871 J
PD 토크 구동: $\max\lvert E-E_0-W\rvert$ (전 구간)4.3e-08 J
자유 운동(τ=0, 2 ms, 2 s): 일반화 운동량 $p_1=(M\dot q)_1$의 초깃값2.0561 kg·m²/s
자유 운동: $\max\lvert p_1(t)-p_1(0)\rvert$4.6e-05 kg·m²/s

PD 토크로 구동하면 일량 $W=\int\dot q^T\tau\,dt$가 에너지 변화와 $4.3\times10^{-8}$ J 안에서 같다($-41.4871$ J, 감쇠로 소산). $\dot E=\dot q^T\tau$는 $\dot M-2C$의 반대칭 성질(3.3)에서 나온 항등식이며 이 장은 그 수치 확인만 한다. 제1축이 연직인 이 팔의 자유 운동에서는 $p_1=(M\dot q)_1$이 2 s 동안 $4.6\times10^{-5}$ kg·m²/s($2.2\times10^{-5}$ 상대) 안에서 일정하다. 이 오차는 적분 오차로 추정하며 시간 간격과의 관계는 확인하지 않았다.

⑥ 관성 파라미터에 대한 선형성.

파라미터 선형성값
$\max\lvert Y\pi-\tau\rvert$ (물리적 $\pi$)1.8e-15 N·m
$\max\lvert Y\pi'-\tau(\pi')\rvert$ (임의 $\pi'\in[-1,1]^{60}$)4.0e-15 N·m
회귀 행렬 $Y$ (240×60, 자세 40점)의 열 가운데 항상 0인 열9
수치 계수 (특이값 $>10^{-9}\sigma_1$, 열 노름 정규화)36

$\tau=Y\pi$가 물리적 $\pi$와 임의 $\pi'$ 모두에서 $10^{-15}$ N·m 안에서 성립하여 선형성이 확인된다. 회귀 행렬 $Y$의 60열 중 9열이 40자세 모두에서 0이다. 이 9열은 링크 1의 $m_1$·$h_1$(3개)과 $I_{zz}$를 제외한 관성 성분 5개이다(링크 1은 자기 원점을 움직이지 않는 연직축 둘레 회전만 하므로 $I_{zz}$만 나타난다; 열 번호로 직접 확인했다). 수치 계수는 36이다. 이 값은 40자세·임계값 $10^{-9}\sigma_1$에서의 계산이고 numpy svd와 Pinocchio의 회귀 행렬도 36을 준다(3.4.5의 ⑩).

⑦ 말단 유효 질량과 동적 조작성.

자세 (말단점 $x,y,z$ m)방향직접 구동 $m_u$ (kg)감속기 포함 $m_u$ (kg)
접힘 $(0.18,\ 0.28,\ 0.11)$$x$ · $y$ · $z$0.57 · 0.27 · 6.004.48 · 10.10 · 7.98
최소 · 최대0.20 · 7.993.48 · 19.53
중간 $(0.52,\ 0.42,\ 0.14)$$x$ · $y$ · $z$0.55 · 0.27 · 3.985.69 · 6.15 · 4.97
최소 · 최대0.20 · 4.024.05 · 9.27
펼침 $(0.69,\ 0.49,\ 0.16)$$x$ · $y$ · $z$0.53 · 0.28 · 3.299.43 · 6.66 · 4.65
최소 · 최대0.19 · 3.644.62 · 16.34
0 45 90 135 180 0 1 2 3 수평면 방향 φ (°) 유효 질량 mu (kg) 접힘 중간 펼침
말단 유효 질량 $m_u$(직접 구동)의 수평면 방향 의존. 방향은 $u=(\cos(\varphi+q_1),\ \sin(\varphi+q_1),\ 0)$($q_1=0.4$ rad)이다. 세 자세 모두 $\varphi\approx33^\circ$에서 최소($0.20$ kg), $\varphi\approx124^\circ$에서 최대(접힘 $3.11$·중간 $2.92$·펼침 $2.64$ kg)이다. 곡선은 계산값이며 연직 방향 값은 본문의 유효 질량 표에 있다.
작업공간 질량의 검사값
순동역학으로 잰 $m_x$ ($\tau=g+J^TF$, $F=10$ N, $a=J\ddot q$) 대 $1/(u^TAu)$, 3자세 최대 상대 차이2.1e-16
중간 자세, $J^{-T}MJ^{-1}$ 대 $(JM^{-1}J^T)^{-1}$ (6×6) 최대 차이1.3e-14
중간 자세, $\Lambda_6$의 선속도 블록 대 $\Lambda_v=(J_vM^{-1}J_v^T)^{-1}$ 최대 차이4.24 kg

유효 질량이 방향에 따라 $30$배 이상 달라진다(접힘 자세 직접 구동 $0.20\sim7.99$ kg). 세 자세에서 최소값은 $0.19\sim0.20$ kg으로 거의 같다(방향은 분석하지 않았다). 수평면 안의 최소값은 $\varphi\approx33^\circ$, 최대값은 $\varphi\approx124^\circ$에 있고(유효 질량 그림에서 읽은 값; 최대 $3.11$·$2.92$·$2.64$ kg) 연직($z$) 방향 값과 가장 큰 값은 접힘에서 펼침으로 갈수록 줄어든다. 이 팔의 이동 질량 합은 $17.15$ kg이므로 정적 근사 $M/2=8.58$ kg는 직접 구동 모델의 최대값($3.6\sim8.0$ kg)보다 크고 최소값 $0.2$ kg의 40배 이상이다. 감속기를 포함하면 $m_u$가 $3.5\sim19.5$ kg이 되어 일부 방향에서 $8.58$ kg을 넘는다. 이 비교는 이 장의 가정 $N=100$, $J_m=3\times10^{-5}$ kg·m²에 의존하며 ISO/TS 15066의 실제 계산 절차를 재현한 것이 아니다. 순동역학으로 잰 값($\tau=g+J^TF$로 $F=10$ N을 가하고 $a=J\ddot q$)이 $1/(u^TAu)$와 $2\times10^{-16}$ 안에서 같다.

자세운동학 반축 $\sigma(J_v)$ (m/rad)동적 반축 $\sigma(J_vM^{-1}T)$ 직접 구동 (m/s²)감속기 포함 (m/s²)
접힘0.55 · 0.32 · 0.201840 · 124 · 4966.80 · 35.53 · 27.34
중간0.77 · 0.68 · 0.271829 · 140 · 4242.90 · 37.71 · 31.28
펼침0.93 · 0.85 · 0.151822 · 179 · 5634.02 · 28.01 · 22.62

운동학 반축($J_v$의 특이값, m/rad)은 자세에 따라 $0.15\sim0.93$인데 동적 반축은 직접 구동 모델에서 $42\sim1840$ m/s²로 한 축이 지배적이다. 관절 6의 관성($2.8\times10^{-4}$ kg·m²)이 작아 $10$ N·m가 말단에 $10\times0.08/2.8\times10^{-4}\approx2860$ m/s² 수준의 가속도를 만들기 때문이다. 회전자 관성을 반영하면 $22\sim67$ m/s²로 내려간다. 동적 조작성은 구동기 관성을 포함해야 의미가 있다.

⑧ 반사 관성.

감속비 $N$반사 관성 $N^2J_m$ (kg·m²)$\max M_{ii}/\min M_{ii}$ ($i=1,\ldots,6$, 표본 400개)결합 지표 평균 · 최댓값
13e-0518.29 · 5.43 · 1.86 · 1.11 · 1.00 · 1.000.372 · 0.591
100.00318.04 · 5.41 · 1.86 · 1.10 · 1.00 · 1.000.371 · 0.590
500.07513.59 · 4.98 · 1.72 · 1.03 · 1.00 · 1.000.352 · 0.575
1000.37.94 · 4.05 · 1.49 · 1.01 · 1.00 · 1.000.302 · 0.527

$N$이 커지면 $M_{11}$의 최대·최소비가 $18.3$에서 $7.9$로 줄고 결합 지표(비대각 성분의 프로베니우스 노름 대 대각 성분의 노름, 평균)가 $0.37$에서 $0.30$으로 준다. 손목 관절은 회전자 관성이 지배하여 비가 $1.0$이다. 모든 관절에 같은 $J_m$을 둔 단순한 가정이므로 감소 폭은 정량적 결론이 아니다.

⑨ 자세별 중력 토크.

자세중력 토크 $g_1,\ldots,g_6$ (N·m)$\lVert g\rVert$ (N·m)
접힘0.00 · -10.02 · -11.13 · -1.86 · 0.00 · 0.0015.10
중간0.00 · -38.64 · -14.95 · -1.86 · 0.00 · 0.0041.48
펼침0.00 · -52.52 · -16.72 · -1.82 · 0.00 · 0.0055.15

중력 토크는 펼침 자세에서 $\lVert g\rVert=55.2$ N·m(어깨 $52.5$ N·m)로 가장 크고 접힘 자세에서 $15.1$ N·m이다. 제1축이 연직이므로 $g_1=0$이고 손목 관절 5·6은 $g_5\approx g_6\approx0$이다.

⑩ 라이브러리 대조(실행 2026-11-05). 같은 6R 팔을 URDF(Pinocchio·Drake)·MJCF(MuJoCo)·같은 숫자의 텍스트 입력(RBDL C++ 하니스)·공간 나사축과 질량중심 프레임(modern_robotics)·Link 객체(Robotics Toolbox)로 옮겨 같은 자세·속도·가속도·토크에서 비교했다. Pinocchio 4.1.0의 crba·computeCoriolisMatrix·computeGeneralizedGravity·aba·computeJointTorqueRegressor·armature, MuJoCo 3.17.0의 mj_fullM·qfrc_bias·mj_forward·mj_jacSite·armature, modern_robotics 1.1.1의 MassMatrix·VelQuadraticForces·GravityForces·ForwardDynamics, Robotics Toolbox 1.5.0의 inertia·gravload·rne·coriolis, Drake 1.58.0 MultibodyPlant, RBDL 2.6.0, numpy의 eigvalsh·svd를 사용했다. 스크립트는 robotics/fig-src/3.4-libcheck.py(Pinocchio·MuJoCo·modern_robotics·Robotics Toolbox·numpy), 3.4-libcheck-drake.py, 3.4-libcheck-rbdl.py(3.5-libcheck-rbdl.cc를 호출)이고 출력은 robotics/fig-src/data/3.4-libcheck-output.txt에 있다.

비교결과
질량행렬 $M$: Pinocchio crba · MuJoCo mj_fullM · modern_robotics MassMatrix (임의 6R 자세 200개) · Robotics Toolbox inertia (30개) 대 이 장3.1e-15 · 4.4e-15 · 2.7e-15 · 2.2e-15
중력항 $g$: Pinocchio computeGeneralizedGravity · modern_robotics GravityForces · Robotics Toolbox gravload 대 이 장2.1e-14 · 2.1e-14 · 1.8e-14
$C\dot q$: modern_robotics VelQuadraticForces · Robotics Toolbox rne(중력 0) 대 이 장, $C\dot q+g$: MuJoCo qfrc_bias 대 이 장4.4e-15 · 6.2e-15 · 2.8e-14
코리올리 행렬 $C$ 전체: Pinocchio computeCoriolisMatrix 대 이 장의 크리스토펠 $C$ · 그 $C$로 만든 $\dot M-2C$의 반대칭 오차1.3e-15 · 5.3e-15
Robotics Toolbox 1.5.0 coriolis 호출 (Link 객체로 만든 Robot, 같은 자세)ValueError로 실패 (트레이스백: coriolis 안의 rne에서 links.index(joint.parent))
순동역학 $\ddot q$: Pinocchio aba · MuJoCo mj_forward · modern_robotics ForwardDynamics 대 이 장 (임의 $\tau$, $\max\lvert\ddot q\rvert$ 대비 상대)1.9e-15 · 1.1e-13 · 1.8e-15
$M$의 고유값: numpy eigvalsh 대 이 장의 SVD (상대)1.8e-15
반사 관성 $N^2J_m=0.3$ kg·m²: Pinocchio armature(crba) · MuJoCo armature(mj_fullM) 대 $M+N^2J_mI$3.1e-15 · 4.4e-15
유효 질량 행렬 $JM^{-1}J^T$ 3자세×직접·감속기: Pinocchio 프레임 자코비안 · MuJoCo mj_jacSite 대 이 장 (상대)1.3e-15 · 3.7e-14
회귀 행렬 $Y$ (240×60)의 수치 계수: numpy svd · Pinocchio computeJointTorqueRegressor 대 이 장의 36, Pinocchio $Y_{pin}\pi_{pin}$ 대 rnea 최대 차이36 · 36 대 36, 2.2e-15
RBDL 2.6.0 (200개): CompositeRigidBodyAlgorithm 대 이 장의 $M$ · InverseDynamics 대 $\tau$ · NonlinearEffects 대 $C\dot q+g$2.2e-15 · 2.1e-14 · 2.1e-14
RBDL ForwardDynamics(ABA) · ForwardDynamicsLagrangian 대 이 장의 순동역학 $\ddot q$ (상대)1.4e-15 · 1.6e-15
Drake 1.58.0 MultibodyPlant (200개): CalcMassMatrix 대 이 장의 $M$ · CalcBiasTerm 대 $C\dot q$ · $-$CalcGravityGeneralizedForces 대 $g$3.1e-15 · 3.6e-15 · 2.1e-14
Drake CalcInverseDynamics(중력 포함 외력) 대 이 장의 $\tau$ · $M^{-1}(\tau+\tau_g-C\dot q)$ 대 순동역학 $\ddot q$ (상대)2.8e-14 · 1.3e-15

모든 항목이 $1.1\times10^{-13}$ 이하(질량행렬은 $4.4\times10^{-15}$ 이하)에서 같다. 이상 징후 둘을 기록한다. 첫째, Pinocchio의 computeCoriolisMatrix가 이 장의 크리스토펠 $C$와 행렬 전체로 같고 그 $C$의 $\dot M-2C$가 반대칭이다. MuJoCo(qfrc_bias)·modern_robotics·Robotics Toolbox(rne)·Drake(CalcBiasTerm)·RBDL(NonlinearEffects)은 행렬 $C$가 아니라 $C\dot q$ 또는 $C\dot q+g$만 준다. 둘째, Robotics Toolbox 1.5.0의 coriolis는 Link 객체로 만든 Robot에서 ValueError로 실패했다(원인은 소스를 읽지 않았다). 같은 양을 rne(중력 0)로 얻어 대조했다. RBDL은 PyPI의 pyrbdl 0.0.2 파이썬 연결이 InverseDynamics 호출에서 Eigen 단언으로 중단되어(1자유도 진자에서도 재현) 사용하지 못했고, 같은 배포본에 포함된 RBDL 2.6.0 소스를 g++로 빌드해 C++로 호출했다. 이 장은 라이브러리의 속도·내부 구현은 비교하지 않았다(3.5·3.6).

한계. 강체 6R 사슬 하나, 마찰·탄성·백래시·케이블 관성이 없는 모델이며 반사 관성은 대각 가산 근사이다. 상한은 구성에서 엄밀하게 유도했지만 하한과 수치 계수·유효 질량·동적 조작성의 수치는 이 팔·표본·가정에 한정한다. 직동 관절·분기 트리·부유 기저(3.13)는 시험하지 않았다.

견해: 구현과 시뮬레이션에서는 $C\dot q$만 필요한 RNEA 계열(3.2)을 사용하고, 반대칭 성질이 필요한 증명·관측기·적응 법칙에서만 크리스토펠 $C$를 계산하며, 협동 운전의 충돌 평가에서는 정적 근사 $M/2+m_L$ 대신 방향 의존 유효 질량 $m_u$(구동기 반사 관성 포함)를 계산하는 것을 기본으로 둔다고 본다. 근거는 이 장에서 ① 인수분해가 달라도 $C\dot q$는 $10^{-15}$ 수준으로 같고 반대칭 성질은 크리스토펠 선택에만 있으며, ② 같은 팔의 $m_u$가 $0.2\sim19.5$ kg으로 방향·자세·감속기에 따라 크게 달라 한 값의 근사로는 이 범위를 덮지 못했다는 점이다. 이 비교는 가정한 $N$·$J_m$에 의존하고 규격의 계산 절차를 재현하지 않았으므로 규격 적합성 판단에는 사용하지 않는다.

3.4.6 설계 트레이드오프 — 코리올리 항과 모델 충실도의 표현

운동방정식의 속도 2차 항을 표현하는 방식은 다음 중에서 고른다.

  • ① $C\dot q$만 계산(RNEA·바이어스 힘). 역동역학·순동역학·시뮬레이션에 충분하고 비용이 $O(n)$이다(3.2). 행렬 $C$를 주지 않는다.
  • ② 크리스토펠 $C$ 행렬. 반대칭 성질을 요구하는 안정성 증명·적응 법칙·일부 관측기에 필요하다. $\partial M/\partial q$가 필요하며 이 장의 구현은 해석적 도함수의 $n^3$개 성분을 사용한다. 효율적 알고리즘은 3.6.
  • ③ 근사·학습 모델. 속도 항을 생략하거나 학습한 잔차로 대체한다. 계산이 가볍지만 성질(반대칭·유계)이 보증되지 않는다.
방식얻는 것이 장에서 확인한 것한계
① $C\dot q$토크·가속도6개 라이브러리가 $C\dot q$ 또는 $C\dot q+g$를 $3\times10^{-14}$ 이하로 재현$\dot M-2C$ 성질을 직접 사용하지 못한다
② 크리스토펠 $C$반대칭 $\dot M-2C$$s^T(\dot M-2C)s$ $10^{-15}$$\partial M/\partial q$ 비용, 라이브러리별 지원 차이(Pinocchio 지원, Robotics Toolbox 1.5.0 호출 실패)
③ 근사낮은 비용확인하지 않았다성질 미보증 — 안정성 증명에 사용할 수 없다

견해: 새 제어기를 구현할 때는 ①을 기본으로 두고 ②는 증명에 필요한 경우에만 사용한다고 본다. 근거는 이 장의 계산에서 $C\dot q$는 인수분해와 라이브러리에 무관하게 같고($3\times10^{-14}$ 이하) 행렬 $C$는 라이브러리마다 제공 여부와 인수분해가 다를 수 있다는 점이다. 비용·정확도의 정량 비교는 이 장이 하지 않았다.

3.4.7 응용 축 비교

응용 축운동방정식의 성질이 맡는 일요구관련 장
산업·제조계산 토크·중력 보상·궤적 시간 최적화의 모델정확한 $M$·$g$, 부하(페이로드) 변화에 따른 파라미터 갱신12.5·3.7
물류·이동이동 플랫폼 위 팔의 부유 기저 동역학(운동방정식의 확장)기저 운동과의 결합3.13
도로 주행해당하는 고유 요구 없음——
서비스접촉·핸드 가이딩에서 낮은 유효 질량반사 관성 포함 유효 질량12.9·12.6
의료·헬스케어수술·재활 로봇의 중력 보상과 낮은 겉보기 관성정밀한 $g(q)$, 낮은 마찰4.10·12.9
휴머노이드·범용전신 동역학(부유 기저)의 팔·다리 항$M$·$C$·$g$의 실시간 계산3.13·12.7
필드대하중 팔(유압 포함)의 큰 중력 토크와 부하 변동파라미터 식별·적응3.7·12.12
국방·안보원리 수준에서 해당하는 고유 요구 없음——

이 표는 이 책의 정리이며 장별 요구는 다르다. 응용별 성능 수치는 이 장이 확인하지 않았다.

3.4.8 관련 규격·프로토콜

문서발행무엇을 정하나상세 장
ISO/TS 15066:2016ISO협동 운전의 접촉 모델·힘·압력 한계(유효 로봇 질량의 정적 근사는 2차 출처로만 확인, 본문 미확인) (확인 필요)27.10
ISO 10218-1·-2(2025 개정)ISO산업 로봇 안전(이 장의 운동방정식을 직접 규정하는 조항은 확인하지 못했다) (확인 필요)27.10
URDF <inertial>오픈 소스(ROS)링크 질량·질량중심·관성 텐서 입력(이 장의 대조에서 Pinocchio·Drake가 같은 값으로 읽었다)27.9·4.15
MJCF <inertial>·armatureMuJoCo관성(fullinertia)과 반사 관성(armature: 이 장의 대조에서 $M$의 대각에 더해짐을 확인)27.9
Pinocchio·MuJoCo·Drake·RBDL·modern_robotics·Robotics Toolbox각 프로젝트$M$·$C$·$g$·역동역학·순동역학 함수3.6
수학 표기·기호표이 책운동방정식 표기A.2

규격의 조항 번호와 계산식은 본문을 읽지 못해 적지 않았다.

3.4.9 관련 규제·인증 요구와의 연결

운동방정식 자체를 규정하는 법령·인증 요건은 확인하지 못했다. 간접 연결은 협동로봇의 충돌 안전이다. 접촉 모델이 로봇의 유효 질량을 입력으로 사용하므로 질량행렬과 반사 관성이 속도·힘 제한의 설정에 들어간다(26.9·27.10·28.4). 적합성 입증은 실측(힘·압력 측정)이며(41.9) 모델 값은 설계 단계의 사전 검토에 사용된다. 속도·힘 제한 안전 기능(26.7)의 설정값이 모델의 정확도에 의존한다는 점을 이 장은 계산으로 보였을 뿐 규정의 조항을 확인하지 않았다 (확인 필요).

3.4.10 한계·유의점·미해결

  • 모델 범위. 강체 6R 사슬 하나이며 마찰(3.8)·구동기 유연성(3.9)·백래시·회전자 자이로 결합을 포함하지 않는다. 반사 관성은 $N^2J_m$ 대각 가산 근사이다.
  • 유계성의 증명 범위. 상한은 회전 관절에서 구성으로 유도했다. 하한은 표본이고, 직동 관절은 관절 한계 안에서만 성립한다.
  • 표본 의존. 수치 계수 36은 40자세·임계값 $10^{-9}$에서의 값이고 이 팔의 구조(평행축 포함)에 의존한다. 기저 파라미터의 구성은 다루지 않았다(3.7).
  • 동적 조작성의 정의. 이 장의 정의이며 원 논문과 같은지 확인하지 못했다. 토크 한계·$J_m$·$N$은 가정이다.
  • 규격 비교. ISO/TS 15066의 유효 질량 계산은 2차 출처(Svarny 외)로만 확인했고 이 장의 비교는 규격 적합성 판단이 아니다.
  • 에너지 시험의 궤적. $\tau=0$ 자유 운동은 손목이 $110$ rad/s에 이르는 비현실적 구간을 포함한다.
  • 라이브러리. 6개 라이브러리 대조는 URDF 한 파일·200점이다. Robotics Toolbox 1.5.0 coriolis 실패의 원인과 pyrbdl 0.0.2 중단의 원인은 확인하지 않았다.

3.4.11 체크포인트·연구 질문·출처

체크포인트:

  1. 질량행렬이 양의 정부호인 이유를 운동에너지와 링크 공간 관성의 양의 정부호로 설명하고 점질량 링크의 경우를 논하라.
  2. 크리스토펠 기호의 대칭성에서 $\dot M=C+C^T$를 유도하라.
  3. $C'=C+uw^T-wu^T$($u,w\perp\dot q$)가 $C\dot q$를 바꾸지 않고 $\dot M-2C'$를 반대칭으로 유지함을 보여라.
  4. 에너지 항등식과 $s^T(\dot M-2C)s=0$이 요구하는 조건의 차이를 설명하라.
  5. $M_{ij}$가 $q_k$($k\le\min(i,j)$)에 무관한 이유를 강체 변환 불변성으로 설명하고 $M_{nn}$이 상수임을 확인하라.
  6. 유효 질량 $m_u=1/(u^TJ_vM^{-1}J_v^Tu)$를 유도하고 $m_u\ne u^T\Lambda_vu$인 예를 만들어라.
  7. 반사 관성 $N^2J_m$이 $M$의 하한을 주는 이유와 이 근사가 깨지는 조건을 논하라.

연구 질문:

  • 정적 근사 $M/2+m_L$과 방향 의존 유효 질량 $m_u$의 차이가 충돌 평가에서 허용 속도에 주는 영향을 실측(힘·압력 측정)으로 어떻게 검증하는가(이 장은 모델 값만 계산했다)?
  • 구동기 회전자 관성과 감속기 유연성을 포함한 유효 질량은 자세·방향에 따라 어떻게 달라지며 3.9의 유연 관절 모델로 어떻게 확장되는가?
  • 직동 관절·분기 트리·부유 기저에서 $M$의 유계성과 반대칭 성질은 어떻게 달라지는가(3.13)?

1차 출처(조회 2026-11-05).

  • K. M. Lynch, F. C. Park, Modern Robotics: Mechanics, Planning, and Control, Cambridge University Press, 2017 — 사전 인쇄본(2017-05) 8.1.2~8.1.3, 8.4~8.6, 8.9 도입부를 읽었다.
  • P. Svarny, J. Rozlivek, L. Rustler, M. Hoffmann, "3D Collision-Force-Map for Safe Human-Robot Collaboration," 2021 IEEE International Conference on Robotics and Automation (ICRA), 3829–3835, doi:10.1109/ICRA48506.2021.9561845(arXiv:2009.01036) — TS 15066의 유효 질량 근사와 Khatib의 유효 질량을 대비한 부분만 읽었다.
  • O. Khatib, "Inertial properties in robotic manipulation: An object-level framework," The International Journal of Robotics Research 14(1), 19–36, 1995, doi:10.1177/027836499501400103 — 서지만 확인.
  • T. Yoshikawa, "Dynamic manipulability of robot manipulators," Proceedings 1985 IEEE International Conference on Robotics and Automation 2, 1033–1038, doi:10.1109/ROBOT.1985.1087277 — 서지만 확인.
  • J.-J. E. Slotine, W. Li, "On the adaptive control of robot manipulators," The International Journal of Robotics Research 6(3), 49–59, 1987, doi:10.1177/027836498700600303 — 서지만 확인.
  • M. Gautier, W. Khalil, "Direct calculation of minimum set of inertial parameters of serial robots," IEEE Transactions on Robotics and Automation 6(3), 368–373, 1990, doi:10.1109/70.56655 — 서지만 확인.
  • ISO/TS 15066:2016, Robots and robotic devices — Collaborative robots — 제목은 Svarny 외의 참고문헌으로 확인했다. 본문은 읽지 못했다.
  • MuJoCo 문서 "Computation"(mujoco.readthedocs.io) — 계산 개관을 읽었다.
  • Pinocchio 4.1.0, MuJoCo 3.17.0, Drake 1.58.0(PyPI drake), RBDL 2.6.0(PyPI pyrbdl 0.0.2 소스 배포본에 포함), modern_robotics 1.1.1, Robotics Toolbox for Python 1.5.0, numpy 2.5.4, SciPy 1.18.1.

다음 장. 3.5은 이 장의 세 항을 효율적으로 계산하는 알고리즘, 즉 질량행렬을 만드는 CRBA, 선형 시간 순동역학 ABA, 이를 간결하게 적는 공간 벡터 대수를 다룬다.