AEGLOSLAB 로봇공학 전서(全書)

제3부 동역학

3.7 동역학 파라미터 식별: 기저 파라미터·여기 궤적·물리적 타당성

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

이 장은 로봇의 동역학 모델에서 알려지지 않은 관성 파라미터(질량·질량 1차 모멘트·관성 텐서)를 관절 토크 측정에서 추정하는 동역학 파라미터 식별을 다룬다. 역동역학이 관성 파라미터에 대해 선형이라는 사실에서 회귀 행렬 $Y(q,\dot q,\ddot q)$가 나오고, $Y$의 열이 서로 종속이므로 추정 가능한 것은 파라미터 자체가 아니라 기저 파라미터라는 조합뿐이다. 이 장은 회귀 행렬의 구성, 기저 파라미터의 수치 계산(열 피벗 QR)과 닫힌 식 확인, 구동기 관성과 마찰 열을 더한 확장 모델, 최소제곱 해의 공분산, 유한 푸리에 급수 여기 궤적과 조건수 최적화, 추정값이 실제 강체에서 나올 수 있는지를 가르는 물리적 타당성(유사 관성 행렬 $J\succ0$)과 제약 포함 적합, 말단 부하(페이로드) 식별을 Franka Research 3의 기구 형상을 가진 7R 팔의 합성 자료에서 계산으로 확인한다. 회전 강체 동역학은 3.1, 재귀 역동역학은 3.2, 운동방정식의 구조는 3.4, 마찰 모델은 3.8, 유연 관절은 3.9, 부유기저 시스템의 식별은 3.13, 최소제곱과 조건수는 1.2, 비선형 최소제곱은 1.12, 반정부호 계획법은 1.17와 이어진다.

배우는 것:

  • 관성 파라미터의 선형성 — 링크마다 10개 파라미터 $\pi_i=(m,h,\bar I)$, 역동역학 $\tau=Y\pi$.
  • 기저 파라미터 — $Y$의 계수 $b$, 영공간(구조적 중복), 열 피벗 QR로 구한 $\beta=\pi_1+K\pi_2$, 평면 2R의 손 계산 확인.
  • 확장 모델 — 회전자 관성·점성·쿨롱 마찰·오프셋 열, 관절 1·2에서 회전자 관성과 링크 관성이 분리되지 않는 이유.
  • 최소제곱 식별 — 가중 최소제곱, 공분산 $\sigma^2(Y_b^\top Y_b)^{-1}$, 몬테카를로 검증.
  • 여기 궤적 — 유한 푸리에 급수, 조건수 기준 최적화, 정적 자세·관절별 운동이 실패하는 이유.
  • 물리적 타당성 — 유사 관성 행렬 $J(\pi)\succ0$, 최소 노름 해의 비타당성, 사전값 가중과 제약 포함 적합.
  • 부하 식별 — 말단 링크 열만 사용하는 10파라미터 추정과 질량·무게중심(CoM) 4파라미터 추정의 차이.

선수 지식: 1.1(QR·SVD), 1.2(최소제곱·조건수), 3.1(강체 동역학·공간 관성), 3.2(뉴턴-오일러 재귀), 3.4(운동방정식).

특히 중요한 독자: 계산 토크·중력 보상을 위해 로봇 모델을 보정하는 제어·시운전 엔지니어, 시뮬레이션 모델과 실물의 차이를 줄이려는 개발자(16.12), 협동로봇의 부하 설정을 구현하거나 검증하는 안전 담당자.

출처 방침. 기준 시점은 2026-11-05이다. 직접 읽은 자료: Modern Robotics(Lynch·Park, 사전 인쇄본 2017-05) 8.8절(URDF의 관성 요소)과 8.9절(구동·기어·마찰; 겉보기 관성 $G^2I_{\text{rotor}}$, 마찰 모델 도해, 기어헤드 마찰이 감속비와 함께 증가하는 경향, 유연성이 상태를 늘린다는 서술); Wensing·Kim·Slotine의 arXiv:1701.04395v3(물리적 일관성 조건 $J(\pi)\succ0$의 LMI 표현과 삼각 부등식 해석, 서론의 선행 연구 정리); Traversaro 외의 arXiv:1610.08703v1(전체 물리적 일관성 조건; 서론과 정의 위주로 읽었고 다양체 위 최적화는 상세 검토하지 않았다). 회귀 행렬·기저 파라미터·공분산·유사 관성 행렬의 식은 이 장이 정의에서 유도하고 Pinocchio 4.1.0·numpy·cvxpy와 같은 입력에서 비교해 확인했다. 서지만 확인한 것(본문은 읽지 못했다): An·Atkeson·Hollerbach 계열의 관성 파라미터 추정(1985 CDC, 1986 IJRR), Mayeda 외(1984, 1988; 기저 파라미터), Gautier·Khalil(1990, 최소 관성 파라미터 집합의 직접 계산), Gautier(1991, 기저 파라미터의 수치 계산; 1997, 동력 모델), Armstrong(1989, 여기 궤적), Swevers 외(1997, 최적 여기와 식별), Hollerbach·Khalil·Gautier(Springer Handbook of Robotics 모델 식별 장), Sousa·Cortesão(2014, LMI 기반 타당성), Gautier·Venture(2013, 양정부호 관성행렬 제약), Rucker·Wensing(2022, 관성의 매끄러운 매개화), Gaz 외(2019, Franka Emika Panda 식별). 이들의 내용은 제목과 서지에서 확인한 범위로만 서술하며 수치는 인용하지 않는다. 로봇의 질량·관성은 모두 이 장이 정한 예시이며 어떤 제품의 제원이 아니다. 수치는 모두 이 장의 순수 파이썬 합성 자료 계산이고 실물 측정이 아니다.

3.7.2 개념 — 모델 구조는 알고 파라미터만 모를 때

결론부터 적으면 다음과 같다. 링크 $i$의 동역학은 질량 $m_i$, 질량 1차 모멘트 $h_i=m_ic_i$, 링크 틀 원점 기준 관성 텐서 $\bar I_i$의 10개 값에 선형으로 의존하므로 관절 토크는 $\tau=Y(q,\dot q,\ddot q)\,\pi$로 나타낼 수 있고, 여러 시각의 $(q,\dot q,\ddot q,\tau)$를 쌓은 최소제곱으로 $\pi$를 구할 수 있다. 그러나 $Y$의 열은 구조적으로 종속이어서(첫 관절축 위의 질량, 다음 링크의 질량으로 옮겨 놓은 질량 등) 데이터가 아무리 좋아도 추정되는 것은 기저 파라미터라는 선형 조합뿐이다. 기저 파라미터를 잘 추정하려면 회귀 행렬의 조건이 좋아지도록 궤적을 설계해야 하고(여기 궤적), 기저 파라미터에서 표준 파라미터를 되돌릴 때 영공간 성분은 데이터가 정하지 못하므로 사전값이나 물리적 타당성 제약이 필요하다. 추정 결과가 음의 질량이나 삼각 부등식을 어기는 관성 텐서를 담고 있어도 토크 예측은 맞을 수 있으므로 토크 예측 오차만으로는 모델의 물리적 의미를 보증하지 못한다.

0 20 43 69 98 10−16 10−12 10−8 10−4 100 특이값 번호 k σk/σ1 FR3 7R FR3 7R + 구동기·마찰
관절 토크 회귀 행렬의 열 정규화 특이값 $\sigma_k/\sigma_1$ (Franka Research 3 형상 7R, 무작위 상태 300개). 파랑은 링크 파라미터 70열, 주황은 구동기·마찰 28열을 더한 98열이다. 세로선은 기저 파라미터 수 $b=43$과 $b=69$이며 그 뒤 특이값은 $10^{-16}$ 수준(수치 영)으로 떨어진다.

이 장의 계산 결과를 미리 적으면 다음과 같다. ① 파라미터 70개의 7R 팔에서 기저 파라미터는 43개이고 열이 0인 표준 파라미터 11개가 포함되며, 정규화 특이값이 $0.562$에서 $3.1\times10^{-16}$으로 끊기고 Pinocchio 회귀 행렬의 numpy 랭크와 일치한다. 구동기 열 28개를 더하면 기저 69개이고 회전자 관성 $I_{a,1}$·$I_{a,2}$는 링크 관성 $I_{zz,1}$·$I_{zz,2}$와 열이 같다. ② 평면 2R의 닫힌 식 $\beta_1=I_{zz,1}+m_2l_1^2$, $\beta_2=h_{x,1}+m_2l_1$이 수치 열 전개 계수 $0.1600$·$0.4000$과 같다. ③ 정적 자세 40개는 랭크 12, 관절 하나씩 사인 운동은 랭크 38로 기저 43개를 식별하지 못하고, 무작위 푸리에 궤적은 조건수 $11.3$, 최적화한 푸리에 궤적은 $8.3$이며 검증 토크 오차 RMS가 $0.0463$에서 $0.0444$ N·m가 된다. ④ 공분산 예측식의 표준편차와 몬테카를로(잡음 300회)의 비는 $0.88\sim1.08$(평균 $1.018$)이다. ⑤ 제약 없는 추정은 링크 7개 중 $5.7\sim7.0$개가 물리적으로 비타당하고 $J\succ0$ 제약은 모두 해소하며, 이 장의 로그 장벽 뉴턴법과 cvxpy SDP의 최적값이 같다. ⑥ 부하 2 kg의 식별에서 질량 오차 $0.003$ kg, CoM 오차 $1.2$ mm이고 부하 관성을 무시하면 토크 예측 오차가 $0.0605$ N·m로 커진다.

3.7.3 원리

3.7.3.1 관성 파라미터와 선형성

링크 $i$의 틀 $\{i\}$(관절 $i$의 틀) 원점 기준 공간 관성(3.1)은 다음처럼 파라미터 $\pi_i$에 선형이다.

$$G(\pi_i)=\begin{bmatrix}\bar I_i & [h_i]_\times\\ -[h_i]_\times & m_i\mathbf 1\end{bmatrix},\qquad \pi_i=(m_i,\ h_i^\top,\ I_{xx},I_{xy},I_{xz},I_{yy},I_{yz},I_{zz})\in\mathbb R^{10}.$$

여기서 $\bar I_i$는 틀 원점 기준 회전 관성, $h_i=m_ic_i$이다. 무게중심 기준 관성 $I_C$와는 평행축 정리 $\bar I=I_C+m(c^\top c\,\mathbf 1-cc^\top)$로 이어진다. URDF의 inertial 요소가 질량·CoM 틀의 위치·CoM 기준 관성 6개 값을 주므로(Lynch·Park 8.8절) 이 변환으로 $\pi_i$가 된다. 트위스트 $(\omega,v)$에서 링크의 힘 $F_i=G\dot V_i-[\mathrm{ad}_{V_i}]^\top GV_i$ (3.1의 뉴턴-오일러 식)는 $G$에 선형이므로 $F_i=W_i(V_i,\dot V_i)\,\pi_i$이고, $6\times10$ 행렬 $W_i$는 운동학 양 $(V_i,\dot V_i)$만의 함수이다. 따라서 관성 파라미터는 운동에 곱해지는 계수로 나타난다. 이 구조는 로봇 동역학의 식별에서 고전적으로 이용되어 왔다(Atkeson·An·Hollerbach 1986의 제목은 "Estimation of Inertial Parameters of Manipulator Loads and Links"이며 본문은 읽지 못했다).

3.7.3.2 회귀 행렬

관절 $j$의 토크는 $\tau_j=A_j^\top F_j$이고 $F_j$는 자식 링크의 렌치를 틀 $j$로 옮겨 합한 것이다(3.2). 틀 $i\ge j$에 표현한 관절 $j$의 나사 축을 $s_j^{(i)}=\mathrm{Ad}_{T_{i,j}}A_j$로 두면 다음이 된다.

$$\tau_j=\sum_{i\ge j}\bigl(s_j^{(i)}\bigr)^{\!\top}W_i\,\pi_i\quad\Longrightarrow\quad \tau=Y(q,\dot q,\ddot q)\,\pi,\qquad Y\in\mathbb R^{n\times10n}.$$

$Y$는 순기구학을 한 번 순환하며 $(V_i,\dot V_i)$와 $s_j^{(i)}$를 구하면 만들어지고 비용은 RNEA와 같은 차수이다(링크 쌍 $n(n+1)/2$개의 $6\times10$ 곱이 추가된다). 중력은 기저의 가속도 $\dot V_0=(0,-g)$로 들어가므로 별도의 열이 없다. 시각 $t_1,\dots,t_N$의 $Y$를 세로로 쌓은 $\mathcal Y\in\mathbb R^{nN\times10n}$와 토크 측정 $\mathcal T$로 $\mathcal T=\mathcal Y\pi+\varepsilon$을 얻는다. $Y$가 정확한 $q,\dot q,\ddot q$를 요구하므로 가속도를 엔코더에서 얻는 실제 시스템에서는 미분과 저역 통과 필터(1.25)가 오차의 주된 원천이 된다. 가속도 측정을 피하려 동력(에너지) 보존 형태를 사용하는 방식(Gautier 1997, 서지만 확인)도 있다.

3.7.3.3 기저 파라미터

결론부터 적으면 다음과 같다. $Y$가 열 종속이면 $Y\nu=0$인 영공간 벡터 $\nu$가 있고 $\pi$와 $\pi+\nu$는 어떤 데이터로도 구분되지 않는다. 데이터로 구분되는 것은 $\operatorname{rank}Y=b$개의 선형 조합이다. 열을 재배열해 $Y=[Y_1\ Y_2]$, $Y_1$이 기저 열(독립 열 $b$개)이고 $Y_2=Y_1K^\top$라면 $Y\pi=Y_1(\pi_1+K\pi_2)$이므로 기저 파라미터는 다음이다.

$$\beta=\pi_1+K\pi_2\in\mathbb R^b,\qquad \tau=Y_1\beta.$$

구조적 중복에는 세 가지가 있다. ① 열이 0인 파라미터: 관절축 위의 점에 놓인 질량이나 운동해도 위치에너지·운동에너지가 변하지 않는 성분(이 장의 7R에서는 $m_1,h_1,\bar I_1$의 $I_{zz,1}$을 제외한 9개와 $m_2$, $h_{z,2}$, 모두 11개). ② 한 링크의 질량을 다음 링크 틀 원점의 점질량으로 옮겨 놓은 것과 같은 재그룹화: 평면 2R에서 링크 2의 질량 $m_2$는 링크 1 틀의 점 $(l_1,0)$에 놓인 점질량과 같아서 열 전개 $Y_{m_2}=l_1^2Y_{I_{zz,1}}+l_1Y_{h_{x,1}}$이 성립하고, 기저 파라미터는 $\beta=(I_{zz,1}+m_2l_1^2,\ h_{x,1}+m_2l_1,\ h_{y,1},\ I_{zz,2},\ h_{x,2},\ h_{y,2})$의 6개이다. ③ 평면 운동에서 나타나지 않는 방향의 관성($I_{xx}$, $I_{yy}$, $I_{xz}$ 등). Gautier·Khalil(1990)이 직렬 로봇의 최소 관성 파라미터 집합을 닫힌 식 규칙으로 직접 구한 것으로 알려져 있다(제목으로 확인, 본문은 읽지 못했다).

일반 형상에는 닫힌 식 대신 수치 방법을 사용한다. 무작위 상태 $(q,\dot q,\ddot q)$ 여러 개로 쌓은 $\mathcal Y$의 열을 노름 1로 정규화하고 열 피벗 하우스홀더 QR을 적용하면 $R$의 대각이 끊기는 위치가 $b$이고 $K^\top=R_{11}^{-1}R_{12}$이다(Gautier 1991의 수치 계산 계열로 알려져 있다, 본문은 읽지 못했다). 정규화로 가장 큰 열의 $10^{-10}$배 아래인 열은 수치 잡음 열로 간주해 0으로 둔다. 이 처리가 없으면 부동소수 잡음 열(이 장의 $h_{z,2}$는 노름 $5\times10^{-15}$)이 독립 열로 오인되어 $b$가 1 커진다. 이 장에서도 처음 계산이 $b=44$로 나왔다가 Pinocchio 회귀 행렬의 numpy 랭크 43과 비교하여 잡음 열 때문임을 확인하고 고쳤다. 여기 궤적이 나쁘면 데이터의 랭크가 $b$보다 작아지고(정적 자세에서는 중력 항만 남아 12) 이것은 구조적 중복이 아니라 실험 설계의 결함이다.

3.7.3.4 구동기와 마찰을 포함한 확장 모델

관절 토크 센서가 없고 모터 전류에서 토크를 구하는 경우 측정되는 것은 모터 쪽 토크이고 전류-토크 상수 $k_t$와 효율이 필요하다(Lynch·Park 8.9.1절: $I_{\text{com}}=\tau_{\text{motor}}/(\eta k_t)$). 구동기와 마찰을 더한 모델은 다음이다.

$$\tau_j=\bigl(Y\pi\bigr)_j+I_{a,j}\ddot q_j+F_{v,j}\dot q_j+F_{c,j}\operatorname{sgn}(\dot q_j)+F_{o,j}.$$

$I_{a,j}$는 감속비 $G$를 반영한 회전자의 겉보기 관성 $G^2I_{\text{rotor}}$이고(Lynch·Park 8.9.2절), $F_v$는 점성, $F_c$는 쿨롱 마찰, $F_o$는 오프셋이다. 마찰은 파라미터에 대해 선형인 쿨롱·점성 모델만 이 구조에 들어간다. 스트리벡 효과와 LuGre 모델은 파라미터에 대해 비선형이므로 3.8에서 다룬다. 열 28개를 더하면 7R의 기저 파라미터는 69개가 된다($43+28-2$). 감소하는 2는 $I_{a,1}$의 열이 $I_{zz,1}$의 열과, $I_{a,2}$의 열이 $I_{zz,2}$의 열과 같기 때문이다. 관절 1에는 앞선 축이 없고 관절 2의 축은 관절 1의 축과 직교하므로 링크 $j$의 $z$축 각속도 성분이 $\dot q_j$ 하나뿐이다. 그러면 $I_{zz,j}$가 운동에너지에 $\tfrac12I_{zz,j}\dot q_j^2$로만 들어가 토크 열이 $\ddot q_j$ 하나뿐이고 회전자 관성 열과 같아진다. 관절 3 이후에서는 앞 관절이 링크의 $z$축 각속도에 기여하므로 두 열이 다르다. 따라서 첫 두 관절의 회전자 관성은 링크 관성과 분리해 식별할 수 없고 합 $I_{zz,j}+I_{a,j}$만 식별된다.

3.7.3.5 최소제곱 식별과 공분산

토크 잡음이 관절 $j$마다 독립 가우스 $N(0,\sigma_j^2)$이면 최대 가능도 해는 가중 최소제곱 $\hat\beta=\arg\min\sum_k\lVert\Sigma^{-1/2}(\tau_k-Y_{b,k}\beta)\rVert^2$이고 공분산은 다음이다.

$$\operatorname{Cov}(\hat\beta)=\bigl(Y_b^\top\Sigma^{-1}Y_b\bigr)^{-1},\qquad \sigma_j\equiv\sigma\ \Rightarrow\ \operatorname{Cov}(\hat\beta)=\sigma^2(Y_b^\top Y_b)^{-1}.$$

기저 열 $Y_b$의 랭크가 $b$이면 해는 유일하다. 이 식은 어떤 파라미터가 어떤 궤적에서 잘 추정되는지의 사전 예측을 준다. 한 파라미터의 표준편차는 $\sigma\sqrt{[(Y_b^\top Y_b)^{-1}]_{kk}}$이고, 열 $k$의 노름이 클수록(토크에 크게 기여하는 파라미터일수록) 작다. 파라미터의 단위가 달라(kg, kg·m, kg·m²) 서로 비교할 수 없으므로 표준편차에 열의 RMS를 곱한 토크 환산 값(N·m)으로 비교한다. 랭크 부족일 때의 최소 노름 해는 SVD $R=USV^\top$에서 $\hat\pi=VS^{+}U^\top Q^\top y$이며 특이값이 $10^{-9}\sigma_1$보다 작은 성분을 버린다.

3.7.3.6 여기 궤적

$Y_b$의 조건이 나쁘면 파라미터 오차가 $\sigma/\sigma_{\min}$에 비례해 커진다. 궤적을 $q_j(t)=q_{0,j}+\sum_{k=1}^{L}\bigl[\tfrac{a_{jk}}{k\omega_f}\sin(k\omega_ft)-\tfrac{b_{jk}}{k\omega_f}\cos(k\omega_ft)\bigr]$의 유한 푸리에 급수로 두면 속도·가속도가 해석적으로 나오고 주기 신호이므로 여러 주기를 평균해 잡음을 줄일 수 있다. 계수 $a,b$를 관절 한계·속도·가속도 제약 아래에서 $Y_b$의 조건수(또는 정보 행렬의 행렬식)를 줄이도록 최적화하는 방법이 Swevers 외(1997)와 Armstrong(1989) 등에서 연구된 것으로 알려져 있다(본문은 읽지 못했다). 이 장은 열을 정규화한 $Y_b$의 조건수 $\kappa=\sigma_{\max}/\sigma_{\min}$를 목적으로 하는 (1+1) 진화 전략(성공 시 보폭 확대, 실패 시 축소)과 제약을 만족하는 최대 배율 적용(fit_scale)을 사용했다. 이 방법은 Swevers 외의 알고리즘을 재현한 것이 아니다. 관절 하나씩 움직이는 시험은 관절 간 결합 항(코리올리·원심 항과 관성 결합)의 열을 만들지 못해 랭크가 부족하다.

3.7.3.7 물리적 타당성

결론부터 적으면 다음과 같다. 10개 파라미터가 실제 강체의 질량 분포에서 나올 수 있다는 필요충분조건은 유사 관성 행렬 $J(\pi)$가 양정부호인 것이고, $J$가 $\pi$에 선형이므로 이 조건은 선형 행렬 부등식(LMI)이다. 제약 없는 최소제곱의 해는 영공간 성분이 임의라서 이 조건을 어기는 일이 흔하다. 유사 관성 행렬은 다음이다.

$$J(\pi)=\begin{bmatrix}\Sigma & h\\ h^\top & m\end{bmatrix},\qquad \Sigma=\tfrac12\operatorname{tr}(\bar I)\,\mathbf 1-\bar I\ \ (\text{원점 기준 2차 모멘트 }\textstyle\int xx^\top\rho\,dV).$$

Wensing 외(2017, arXiv v3)는 $J(\pi)\succ0$이 질량 $m>0$, 무게중심 기준 관성 $I_C\succ0$, 그리고 $I_C$의 주관성 모멘트 $J_1,J_2,J_3$가 삼각 부등식 $J_1+J_2\ge J_3$ 등을 만족하는 것과 동치라고 보였다(정리 3; 삼각 부등식을 포함한 필요충분조건은 Traversaro 외가 제시한 것으로 서술되어 있다). 6×6 공간 관성 $G(\pi)\succ0$(운동에너지가 양수)만 요구하는 약한 조건(Sousa·Cortesão가 LMI로 정식화한 반일관성)은 삼각 부등식을 보장하지 못한다고 같은 논문이 서술한다. 각 링크에서 $m>0$이고 $I_C\succ0$이면 질량행렬이 모든 $q$에서 양정부호라는 결과를 같은 논문 3절이 다른 문헌을 인용해 서술한다. 제약 포함 최소제곱은 $J(\pi_i)\succ0$ ($i=1\ldots n$) 아래에서 이차 목적을 최소화하는 볼록 문제(SDP)이다.

영공간 성분은 데이터가 정하지 못하므로 목적에 사전값(설계 CAD 값) $\pi_0$를 가중해 더한다.

$$\min_{\pi}\ \frac1{\sigma^2}\lVert\mathcal T-\mathcal Y\pi\rVert^2+\frac{\kappa}{\sigma^2}(\pi-\pi_0)^\top\Lambda(\pi-\pi_0)\quad\text{s.t.}\quad J(\pi_i)\succ0,$$

여기서 $\Lambda$는 파라미터 척도 $(1\,\mathrm{kg},\ 0.1\,\mathrm{kg\,m},\ 0.05\,\mathrm{kg\,m^2})$의 역제곱 대각이다. 이 장은 이 문제를 로그 장벽 $-\mu\sum_i\ln\det J(\pi_i)$를 더한 뉴턴법($\mu$를 $1\to10^{-9}$로 10배씩 감소)으로 풀었다. 이 식별은 Traversaro 외가 사용한 다양체 최적화나 Rucker·Wensing(2022)의 매끄러운 매개화(서지만 확인)와 다른 방법이며 최적해가 같은 볼록 문제를 푼다는 점에서 cvxpy의 SDP 풀이기와 비교할 수 있다.

3.7.3.8 말단 부하(페이로드) 식별

말단 링크 $n$에 부하(그리퍼·공구·가공물)가 붙으면 링크 $n$의 파라미터가 $\pi_n\to\pi_n+\pi_L$로 바뀐다. 로봇 본체의 파라미터를 알고 있다면 $\tau_{\text{측정}}-Y\pi_{\text{본체}}=Y_n\pi_L$이므로 말단 링크의 열 10개만 사용해 부하를 식별한다. 이때는 본체 파라미터가 기지이므로 기저 파라미터로 묶이지 않고 10개 모두 원리적으로 식별 가능하다(이 장의 계산에서 $Y_n$의 정규화 특이값 10개가 모두 $0.4$ 이상). 그러나 부하의 관성 텐서는 질량·CoM에 비해 토크 기여가 작아 잡음에 민감하다. 협동로봇 컨트롤러가 요구하는 부하 설정은 대개 질량과 CoM 위치(와 경우에 따라 관성)이다 (제품별 확인 필요). 질량과 CoM만 식별하되 부하 관성을 점질량의 관성 $\bar I_{pt}=\lvert h\rvert^2/m\,\mathbf 1-hh^\top/m$으로 근사하는 고정점 반복(식별값으로 $\bar I_{pt}$를 계산해 측정에서 빼고 $(m,h)$를 다시 적합)이 이 장의 세 번째 방법이다.

3.7.4 알고리즘

회귀 행렬 Y(q, dq, ddq):
    V, dV ← (0), (0, −g)                       (기저)
    for i = 1..n:  T_i ← 링크 i의 T_{i-1,i}(q_i)
        V ← Ad(T_i^{-1}) V + A dq_i
        dV ← Ad(T_i^{-1}) dV + ad_V(A) dq_i + A ddq_i
        W_i[:, k] ← wrench(e_k, V, dV)          (k = 1..10, 단위 파라미터)
    for j = 1..n:  s ← A
        for i = j..n:  (i > j이면 s ← Ad(T_i^{-1}) s)
            Y[j, 10(i−1)+k] ← sᵀ W_i[:, k]
기저 파라미터(자료: 무작위 상태 표본 N개):
    𝒴 ← 표본의 Y를 쌓은 행렬;  열 정규화(작은 열은 0)
    (perm, R) ← 열 피벗 QR(𝒴);  b ← 허용 이상의 대각 개수
    K ← R11⁻¹ R12;  β = π_perm[:b] + K π_perm[b:]
식별(자료: 여기 궤적 표본 𝒴_b, 토크 y):
    QR로 𝒴_b β = y 를 풀고, 공분산 σ²(𝒴_bᵀ𝒴_b)⁻¹ 를 R⁻¹R⁻ᵀ 로 계산
여기 궤적 최적화:
    계수 c ← 무작위, 목적 κ(c) ← cond(𝒴_b(c));  반복: c' ← c + 보폭·잡음, 제약 배율, 개선이면 수락·보폭×1.3, 아니면 ×0.93
물리적 타당성 적합(H, π*, 시작점 π_0):
    μ ← 1;  while μ > 1e-9:  뉴턴 단계(기울기 2H(π−π*) − μ∇ln det, 헤시안 2H + μ∇²) ·실행 가능 역추적;  μ ← μ/10

3.7.5 풀이 예제 — 기저 파라미터, 여기 궤적, 공분산, 물리적 타당성, 부하

결론부터 적으면 앞 절의 ①~⑥이다. 입력은 모두 예시 가정이며 어떤 제품의 제원이 아니다.

구현. regressor(회귀 행렬)·norm_cols·qr_pivot·base_params(기저 파라미터)·pseudo_inertia가 아래 코드이다. QR 최소제곱, 푸리에 궤적, 로그 장벽 적합(phys_fit), 몬테카를로, 그림은 스크립트에 있다. 아래 코드는 1.1의 solve_lu와 2.4의 FR3 수정 DH 표를 사용한다.

항목값
입력 1로봇: Franka Research 3의 수정 DH 형상 7R(2.4 표, 중력 $(0,0,-9.81)$ m/s²), 평면 2R은 두 축이 $z$ 방향이고 $l_1=0.4$ m, 중력 $(0,-9.81,0)$
입력 2참 파라미터(예시 가정): 링크 질량 $(3.0,3.0,2.5,2.5,2.0,1.5,0.8)$ kg, 균일 직육면체(각 변 $0.06\sim0.16$ m, 주축 임의 회전), CoM 편심 각 축 $\pm0.08$ m (시드 100). 모든 링크가 $J\succ0$ (최소 고유값 $0.0008\sim0.0028$)
입력 3측정: 관절 토크에 독립 가우스 잡음 $\sigma=0.2$ N·m, $q,\dot q,\ddot q$는 정확하다고 가정. 한 주기 $T_f=10$ s, 표본 200개(20 Hz), 데이터 행 $nN=1400$
입력 4궤적 제약: 관절 한계는 2.6의 FR3 표(중심 기준 $85\,\%$ 반폭), $\lvert\dot q\rvert\le1.5$ rad/s, $\lvert\ddot q\rvert\le6$ rad/s²(가정). 푸리에 조화 $L=4$
입력 5기저 파라미터: 무작위 상태 300개(관절 한계·속도·가속도 한도 안의 균등 추첨), 정규화 열 허용 $10^{-9}$
입력 6비교 궤적: 정적 자세 40개, 관절 하나씩 사인 운동(관절당 28표본), 무작위 푸리에(시드 11), 최적화 푸리에(시드 21, 평가 400회, 목적은 표본 40개). 검증 궤적: 별도 시드의 무작위 푸리에 3개(표본 100개)
입력 7공분산: 잡음 300회(시드 7100). 궤적 비교: 잡음 100회(시드 7000)
입력 8물리적 타당성: 사전값은 질량 $\pm15\,\%$·CoM $\pm15$ mm·CoM 관성 $\pm15\,\%$를 가우스로 흔든 물리적으로 타당한 값(시드 8100), 사전 가중 $\kappa=10^{-4}$·$1$, 잡음 3회(시드 8000~8002)
입력 9부하: $m=2$ kg, CoM $(10,-20,150)$ mm(링크 7 틀), 균일 직육면체 $0.10\times0.10\times0.08$ m. 잡음 100회(시드 9100)
입력 10라이브러리 대조: Pinocchio 4.1.0, numpy 2.5.4, SciPy 1.18.1, cvxpy 1.9.3(Clarabel)
from math import sin, cos, sqrt, pi, copysign
from operator import mul

FR3 = rb47.FR3              # 수정 DH (th0, d, a, al)
GRAV = (0.0, 0.0, -9.81)

def dot(a, b):
    return sum(map(mul, 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 frames(q, dh):
    """링크별 T_{i-1,i} = (R, p): Rx(al)Tx(a)Tz(d)Rz(th0+q)"""
    out = []
    for (t0, d, a, al), x in zip(dh, q):
        ca, sa = cos(al), sin(al)
        c, s = cos(t0 + x), sin(t0 + x)
        R = ((c, -s, 0.0), (ca * s, ca * c, -sa),
             (sa * s, sa * c, ca))
        out.append((R, (a, -d * sa, d * ca)))
    return out

def to_child(T, V):
    """부모 틀의 트위스트 (w, v)를 자식 틀로 옮긴다"""
    R, p = T
    u = tuple(a - b for a, b in zip(V[3:], cross(p, V[:3])))
    return tuple(sum(R[k][i] * x[k] for k in range(3))
                 for x in (V[:3], u) for i in range(3))

def wrench(pi_, V, dV):
    """F = G dV - ad_V^T G V.  pi_ = (m, h, Ixx, Ixy, Ixz,
    Iyy, Iyz, Izz): 링크 틀 원점 기준, h = m c"""
    m, h = pi_[0], pi_[1:4]
    I = ((pi_[4], pi_[5], pi_[6]), (pi_[5], pi_[7], pi_[8]),
         (pi_[6], pi_[8], pi_[9]))
    w, v, dw, dv = V[:3], V[3:], dV[:3], dV[3:]
    L = tuple(dot(r, w) + x for r, x in zip(I, cross(h, v)))
    P = tuple(m * a - b for a, b in zip(v, cross(h, w)))
    M = tuple(dot(r, dw) + x + y + z for r, x, y, z in zip(
        I, cross(h, dv), cross(w, L), cross(v, P)))
    f = tuple(m * a - b + c for a, b, c in zip(
        dv, cross(h, dw), cross(w, P)))
    return M + f

UNIT = [tuple(float(i == k) for i in range(10))
        for k in range(10)]

def forward(q, dq, ddq, dh, g=GRAV):
    """링크별 (T, V, dV). A = (0,0,1,0,0,0):
    V = Ad V' + A dq,  dV = Ad dV' + ad_V(A) dq + A ddq"""
    V, dV = (0.0,) * 6, (0.0, 0.0, 0.0) + tuple(-x for x in g)
    out = []
    for T, b, c in zip(frames(q, dh), dq, ddq):
        V, dV = to_child(T, V), to_child(T, dV)
        V = V[:2] + (V[2] + b,) + V[3:]
        z = cross(V[:3], (0, 0, 1)) + cross(V[3:], (0, 0, 1))
        dV = tuple(x + y * b for x, y in zip(dV, z))
        dV = dV[:2] + (dV[2] + c,) + dV[3:]
        out.append((T, V, dV))
    return out

def regressor(q, dq, ddq, dh=FR3, g=GRAV):
    """tau = Y pi 의 Y (n x 10n). 행 j의 블록 i >= j는
    (관절 j의 나사 축을 틀 i로 옮긴 s)^T (링크 i의 6x10)"""
    n = len(q)
    kin = forward(q, dq, ddq, dh, g)
    W = [[wrench(u, V, dV) for u in UNIT] for _, V, dV in kin]
    Y = [[0.0] * (10 * n) for _ in range(n)]
    for j in range(n):
        s = (0.0, 0.0, 1.0, 0.0, 0.0, 0.0)
        for i in range(j, n):
            if i > j:
                s = to_child(kin[i][0], s)
            for k in range(10):
                Y[j][10 * i + k] = dot(s, W[i][k])
    return Y

def norm_cols(rows):
    """열을 노름 1로 정규화. 최대 열의 1e-10배 미만은 수치
    잡음이므로 0 열로 본다. (정규화 열, 노름 목록)"""
    cols = [list(c) for c in zip(*rows)]
    nr = [sqrt(dot(c, c)) for c in cols]
    z = [x < 1e-10 * max(nr) for x in nr]
    nr = [1.0 if f else x for x, f in zip(nr, z)]
    return [[0.0 if f else x / s for x in c]
            for c, s, f in zip(cols, nr, z)], nr

def qr_pivot(cols, tol=1e-9):
    """열 피벗 하우스홀더 QR. (순서 perm, R의 r개 행)"""
    n, C = len(cols), [c[:] for c in cols]
    perm, R = list(range(n)), []
    for k in range(min(n, len(C[0]))):
        nr = [dot(c[k:], c[k:]) for c in C[k:]]
        j = k + nr.index(max(nr))
        C[k], C[j] = C[j], C[k]
        perm[k], perm[j] = perm[j], perm[k]
        for row in R:
            row[k], row[j] = row[j], row[k]
        nk = sqrt(nr[j - k])
        top = nk if k == 0 else top
        if nk < tol * top:
            break
        v = C[k][k:]
        v[0] += copysign(nk, v[0])
        b = 2 / dot(v, v)
        for c in C[k + 1:]:
            d = b * dot(v, c[k:])
            c[k:] = [x - d * y for x, y in zip(c[k:], v)]
        R.append([0.0] * k + [-copysign(nk, C[k][k])]
                 + [c[k] for c in C[k + 1:]])
    return perm, R

def base_params(rows):
    """표본 행 목록 -> (기저 열 idx, 종속 열 dep, K):
    Y_dep = Y_idx K^T,  pi_b = pi_idx + K pi_dep"""
    cols, nrm = norm_cols(rows)
    perm, R = qr_pivot(cols)
    r = len(R)
    idx, dep = perm[:r], perm[r:]
    R11 = [row[:r] for row in R]
    Ks = [rb19.solve_lu(R11, [row[r + j] for row in R])[0]
          for j in range(len(dep))]
    K = [[Ks[j][i] * nrm[dep[j]] / nrm[idx[i]]
          for i in range(r)] for j in range(len(dep))]
    return idx, dep, K

def pseudo_inertia(p):
    """J = [[S, h], [h^T, m]],  S = tr(I)/2 - I (원점 기준 2차
    모멘트). J가 양정부호이면 밀도 분포로 실현 가능하다"""
    I = [[p[4], p[5], p[6]], [p[5], p[7], p[8]],
         [p[6], p[8], p[9]]]
    t = (I[0][0] + I[1][1] + I[2][2]) / 2
    J = [[t * (i == j) - I[i][j] for j in range(3)]
         + [p[1 + i]] for i in range(3)]
    return J + [[p[1], p[2], p[3], p[0]]]
모델열 수 (표준 $10n$, 구동기 포함 $14n$)기저 파라미터 $b$영공간 차원정규화 특이값 $\sigma_b$ → $\sigma_{b+1}$
평면 2R206140.642 → 1.4e-16
FR3 앞 3축3015150.690 → 2.4e-16
FR3 7R7043270.562 → 3.1e-16
FR3 7R + 구동기·마찰9869290.336 → 3.4e-16
FR3 7R, 정적 자세만(속도·가속도 0)701258—

기저 파라미터 수는 평면 2R이 6, FR3 앞 3축이 15, 7R이 43이고 정규화 특이값이 $\sigma_b\sim0.3\text{–}0.7$에서 $\sigma_{b+1}\sim10^{-16}$으로 끊긴다. 정적 자세(속도·가속도 0)에서는 중력 항만 남아 랭크가 12이다. 열이 0인 표준 파라미터는 m1, hx1, hy1, hz1, Ixx1, Ixy1, Ixz1, Iyy1, Iyz1, m2, hz2의 11개이다. 첫 관절축이 중력 방향이어서 링크 1에서 식별되는 것은 $I_{zz,1}$ 하나이다.

닫힌 식 검증값
평면 2R: $\nu_1=\Delta m_1$ 의 $Y\nu_1$ 최대 절댓값 · $\nu_2$(링크 2 질량을 링크 1로 이전)의 $Y\nu_2$ 최대 절댓값0.0e+00 · 1.4e-15
평면 2R: $m_2$ 열을 $I_{zz,1}$·$h_{x,1}$·$h_{y,1}$·$I_{zz,2}$·$h_{x,2}$·$h_{y,2}$ 열로 전개한 계수 (손 계산: $l_1^2=0.16$, $l_1=0.4$)0.1600 · 0.4000 · 6e-18 · 8e-18 · 1e-18 · 3e-18 (잔차 5e-15)
FR3 7R: 회전자 관성 열 $I_{a,j}$ 와 $I_{zz,j}$ 열의 최대 차이, $j=1\ldots7$0.0e+00 · 4.4e-16 · 10.2 · 11.3 · 11.4 · 15.7 · 15.9

닫힌 식 검증에서 평면 2R의 영공간 벡터 두 개(축 위 질량 $\Delta m_1$, 링크 2의 질량을 링크 1로 이전하는 벡터)는 모든 표본에서 $Y\nu=0$이다. $m_2$ 열을 기저 열로 전개한 계수가 손 계산 $l_1^2=0.16$, $l_1=0.4$와 같다. 7R에서 $I_{a,j}$ 열과 $I_{zz,j}$ 열의 차이는 $j=1,2$에서 0이고 $j\ge3$에서는 $10$ 이상이다.

0 100 200 300 400 0 10 20 30 40 평가 횟수 조건수 κ (열 정규화) 무작위 30개 중앙값 무작위 30개 최솟값 최적화(최선값)
여기 궤적의 조건수 최적화 이력. 파랑은 (1+1) 진화 전략이 찾은 최선값(표본 40개, 열 정규화 $Y_b$의 $\kappa$), 점선은 무작위 푸리에 궤적 30개의 중앙값과 최솟값이다. 평가 400회에서 $34.5$가 $8.29$로 내려간다.
여기 궤적 (표본 행 수 $M$, 기저 열 43개)랭크조건수 $\kappa$ (열 정규화)최소 특이값파라미터 오차 토크 환산 RMS (N·m)검증 궤적 토크 오차 RMS (N·m)
정적 자세 40개 ($M=280$)12$\infty$ (랭크 부족)0—0.7603
관절 하나씩 사인 ($M=1372$)38$\infty$ (랭크 부족)0—1.4686
무작위 푸리에 ($M=1400$)4311.30.1910.01130.0463
최적화 푸리에 ($M=1400$)438.30.2420.01040.0444

정적 자세와 관절별 운동은 랭크가 부족해 최소 노름 해의 검증 토크 오차가 $0.76$, $1.47$ N·m로 크다(식별되지 않은 속도·가속도 결합 항이 0으로 남는다). 무작위 푸리에는 조건수 $11.3$으로 이미 식별 가능하고, 최적화는 $11.3\to8.3$, 검증 오차는 $0.0463\to0.0444$ N·m, 파라미터 오차 토크 환산 RMS는 $0.0113\to0.0104$ N·m로 약 $4\sim8\,\%$ 줄였다. 최적화의 이득은 구조적 랭크 확보에 비해 작다.

0.005 0.01 0.02 0.005 0.01 0.02 이론 표준편차 (N·m) 몬테카를로 (N·m) 일치선 기저 파라미터 43개
기저 파라미터 43개의 이론 표준편차 $\sigma\sqrt{[(Y_b^\top Y_b)^{-1}]_{kk}}$ (가로)와 잡음 300회 몬테카를로 표준편차(세로), 열의 RMS를 곱한 토크 환산값(N·m). 점이 일치선 위에 놓이며 비는 $0.88\sim1.08$이다.
항목 (무작위 푸리에, 잡음 $\sigma=0.2$ N·m)값
몬테카를로 표준편차 대 이론 $\sigma\sqrt{(Y_b^\top Y_b)^{-1}_{kk}}$ 의 비 (잡음 300회, 기저 43개): 최솟값 · 평균 · 최댓값0.88 · 1.018 · 1.08
몬테카를로 평균의 참값 대비 편의: $\lvert\bar{\hat\beta}_k-\beta_k\rvert/(\sigma_k/\sqrt{300})$ 의 최댓값2.94
무작위 푸리에 30개(표본 40개)의 조건수: 최솟값 · 중앙값 · 최댓값13.1 · 24.7 · 50.4
최적화 시작 → 400회 평가 후 (표본 40개)34.5 → 8.29

공분산 예측식의 표준편차는 몬테카를로 표준편차와 최대 $12\,\%$ 안에서 같고(300회의 표본 표준편차 자체의 상대 오차 $1/\sqrt{2\cdot299}\approx4\,\%$), 평균의 편의는 표준 오차의 $2.94$배 이하이다. 최적화는 시작 조건수 $34.5$에서 $8.29$까지 내려가며, 무작위 푸리에 30개의 중앙값 $24.7$·최솟값 $13.1$(표본 40개)보다 낮다.

추정기 (표준 파라미터 70개, 잡음 3회 평균)비타당 링크 수 (7개 중)검증 토크 오차 RMS (N·m)질량 오차 RMS (kg)CoM 위치 오차 평균 (mm)
설계(CAD) 사전값 그대로00.8110.30327.9
① 최소 노름 최소제곱7.00.04961.766질량 0인 링크가 있어 정의되지 않음
② 사전값 가중 최소제곱, $\kappa=10^{-4}$ (제약 없음)6.70.04960.33230.1
③ 같은 목적 + 물리적 타당성 제약 $J\succ0$, $\kappa=10^{-4}$0.00.03440.82777.6
② 사전값 가중 최소제곱, $\kappa=1$ (제약 없음)5.70.02870.33330.2
③ 같은 목적 + 물리적 타당성 제약 $J\succ0$, $\kappa=1$0.00.02420.32225.6

최소 노름 해와 제약 없는 사전값 가중 해는 링크 7개 중 5.7~7.0개가 비타당이었다(유사 관성 행렬의 최소 고유값이 음수). 최소 노름 해는 열이 0인 파라미터를 0으로 두므로 링크 1·2의 질량이 0이다. 제약 포함 적합은 모든 링크를 타당하게 만들고 검증 토크 오차를 줄였다($\kappa=1$: $0.0287\to0.0242$ N·m, $\kappa=10^{-4}$: $0.0496\to0.0344$). 그러나 사전 가중이 약하면($\kappa=10^{-4}$) 제약이 영공간 성분을 경계(퇴화한 질량 분포)로 밀어 CoM 오차가 $77.6$ mm로 사전값($27.9$ mm)보다 나빠졌다. 사전 가중이 강하면($\kappa=1$) $25.6$ mm로 사전값과 비슷하다. 데이터가 영공간을 정하지 못하므로 표준 파라미터의 개별 오차는 사전값 수준에서 개선되지 않는다.

부하 식별 (참값 $m=2$ kg, $c=(10,-20,150)$ mm, 검증에서 부하 토크 RMS 4.60 N·m)질량 오차 (kg)CoM 오차 (mm)검증 토크 오차 RMS (N·m)
무작위 푸리에: $(m,h)$ 4개만, 부하 관성 무시0.00951.510.0605
무작위 푸리에: 10개 전부0.00311.230.0169
무작위 푸리에: $(m,h)$ + 점질량 관성 보정 반복0.00301.220.0117
최적화 푸리에: $(m,h)$ 4개만, 부하 관성 무시0.00752.570.0582
최적화 푸리에: 10개 전부0.00301.260.0160
최적화 푸리에: $(m,h)$ + 점질량 관성 보정 반복0.00281.140.0106

부하 식별에서 질량·CoM만 선형으로 적합하고 부하 관성을 무시하면 검증 토크 오차가 $0.0605$ N·m이고, 10개를 모두 적합하면 $0.0169$, 점질량 관성 보정 반복은 $0.0117$ N·m이다(부하 토크 자체의 RMS는 $4.60$ N·m). 참 부하의 관성 $I_C$가 점질량 근사와 달라 남는 오차가 있다.

라이브러리 대조. 같은 입력에서 Pinocchio·numpy·cvxpy와 비교한 결과는 다음이다.

비교결과
역동역학 τ: 이 장의 RNEA 대 pin.rnea(FR3 형상 7R, 상태 200개) 최대 차이 (N·m)1.6e-14
회귀 행렬 $Y$: 이 장 대 pin.computeJointTorqueRegressor(열 순서 맞춤, 상태 50개) 최대 차이1.2e-14
$Y\pi$ 대 이 장의 RNEA (같은 상태 50개) 최대 차이 (N·m)2.1e-14
기저 파라미터 수 $b$ (이 장의 피벗 QR · numpy SVD 상대 허용 $10^{-9}$ · matrix_rank 기본 허용): 평면 2R 6 · 6 · 6; FR3 앞 3축 15 · 15 · 15; FR3 7R 43 · 43 · 43; FR3 7R + 구동기·마찰 69 · 69 · 69모두 일치
최소제곱 해(정규화 열, 기저 파라미터 43개): 이 장의 하우스홀더 QR 대 numpy.linalg.lstsq 최대 차이2.6e-13
이론 표준편차 $\sigma\sqrt{(Y^\top Y)^{-1}_{kk}}$: 이 장 대 numpy 역행렬 최대 상대 차이1.8e-15
몬테카를로 표준편차 대 이론 (잡음 300회): 비의 최솟값 · 평균 · 최댓값0.88 · 1.018 · 1.08
랭크 부족(표준 파라미터 70개) 최소 노름 해: 이 장 대 lstsq(rcond $10^{-9}$) 최대 차이2.1e-13
유사 관성 행렬 $J$의 최소 고유값: 이 장의 순환 야코비 대 numpy.linalg.eigvalsh 최대 차이8.9e-16
물리적 타당성 적합, 사전 가중 $\kappa=0.0001$: 목적값(초과 $\chi^2$) 이 장의 로그 장벽 뉴턴법 · cvxpy SDP10.64 · 10.64
같은 적합의 검증 토크 오차 RMS (N·m): 이 장 · SDP0.0340 · 0.0340
물리적 타당성 적합, 사전 가중 $\kappa=1$: 목적값(초과 $\chi^2$) 이 장의 로그 장벽 뉴턴법 · cvxpy SDP10.50 · 10.50
같은 적합의 검증 토크 오차 RMS (N·m): 이 장 · SDP0.0275 · 0.0275
부하 식별(10개 파라미터) 최소제곱: 이 장 대 numpy.linalg.lstsq 최대 차이1.1e-15

모든 항목이 일치한다. 이 장의 첫 구현은 기저 파라미터를 44개로 보고했는데, numpy의 랭크가 43이어서 확인하자 노름 $5\times10^{-15}$의 잡음 열 $h_{z,2}$를 독립 열로 센 것이었다(열 정규화 전에 작은 열을 0으로 만드는 처리 추가). 물리적 타당성 적합에서 처음 사용한 촐레스키 인수 매개화의 LM은 cvxpy 최적값 $10.64$를 $21.33$으로 내고 멈춰(경계에서 인수가 퇴화하는 정류점) 로그 장벽 뉴턴법으로 바꾸었다.

한계. 합성 자료이고 잡음은 토크의 백색 가우스 하나, 관절 위치·속도·가속도는 정확하며 마찰·유연성·센서 편향·시간 동기 오차가 없다. 실제 식별 오차는 이 값보다 크다. 마찰과 가속도 추정 오차가 지배적인 경우가 많고 기어 마찰은 속도·온도·적재에 따라 변한다(3.8). 파라미터의 참값을 아는 것은 합성 자료이기 때문이며 실물에서는 검증 궤적의 토크 예측과 다른 방법(분해 측정 등)으로만 확인할 수 있다. 팔은 형상 하나(FR3 형상)와 질량 분포 하나(시드 100)만 시험했다.

견해: 매니퓰레이터의 동역학 모델은 설계 CAD 값을 사전으로 두고(4.15), 조건수를 줄인 푸리에 여기 궤적으로 기저 파라미터를 식별한 뒤, 사전값 가중과 물리적 타당성 제약(LMI)을 포함한 가중 최소제곱으로 표준 파라미터를 복원하는 순서를 기본으로 둔다고 본다. 근거는 이 장에서 ① 정적 자세·관절별 운동은 랭크가 12·38로 식별이 되지 않았고, ② 푸리에 궤적의 최적화는 조건수를 $11.3\to8.3$으로 줄였지만 검증 오차 개선은 약 $4\,\%$에 그쳤으며, ③ 제약 없는 해는 링크의 $81\sim100\,\%$가 비타당인 반면 제약은 모두 해소하고 검증 오차도 줄였다는 점이다. 단 표준 파라미터의 개별 값은 데이터가 정하지 못하므로(CoM 오차가 사전값과 같은 수준) 개별 질량·관성을 설계 판단에 쓰려면 분해 측정이 필요하다. 이 장은 마찰과 가속도 추정 오차가 있는 실측 자료를 사용하지 않았다.

3.7.6 설계 트레이드오프 — 식별 방식의 선택

모델 파라미터를 얻는 방식은 다음 중에서 고른다.

  • ① 설계 CAD·분해 측정. 링크를 분해해 질량·CoM·관성을 직접 구한다(4.15). 개별 파라미터가 물리적이고 타당하나 케이블·윤활유·조립 오차를 포함하지 못한다.
  • ② 전신 회귀(기저 파라미터 최소제곱). 조립된 로봇을 여기해 토크로 식별한다. 케이블·마찰 효과를 포함한 유효 모델이 되지만 기저 조합만 정해지고 타당성이 보장되지 않는다.
  • ③ 사전값·타당성 제약을 포함한 식별. ①을 사전으로 ②의 데이터를 반영하고 $J\succ0$을 강제한다. SDP나 장벽법 풀이가 필요하고 사전값 가중치를 정해야 한다.
방식입력장점한계
① CAD·분해 측정CAD, 저울·진자물리적, 시운전 전 가능케이블·윤활·조립 미반영
② 기저 최소제곱여기 궤적의 토크조립된 상태의 유효 모델영공간, 비타당 가능, 마찰 의존
③ 제약·사전 포함①의 사전 + ②의 데이터타당, 검증 오차 개선풀이기, 가중치 선택, 개별 값은 사전 의존

견해: 제어 목적(중력 보상·계산 토크)에는 ②로 충분하고 ③은 시뮬레이터 모델 갱신·질량행렬 양정부호가 필요한 적응 제어·학습 정책의 시뮬레이션 동역학에 사용하는 것이 낫다고 본다. 근거는 이 장에서 기저 최소제곱의 검증 토크 오차가 $0.0463$ N·m로 예측식 $\sigma\sqrt{b/M}\approx0.035$ N·m에 가까웠던 반면 비타당 링크가 다수여서 질량행렬의 양정부호를 보증할 수 없었다는 점이다. 이 장은 두 방식을 실물에서 비교하지 않았다.

3.7.7 응용 축 비교

응용 축식별이 맡는 일요구관련 장
산업·제조공구·가공물 부하 설정, 출하 시 모델 확인, 중력 보상부하 질량·CoM 정확도, 짧은 식별 시간42.10, 28.4
물류·이동이동 매니퓰레이터의 적재물 질량·CoM 추정(원리 수준)가변 부하, 차체 운동과의 결합7.24
도로 주행해당하는 고유 요구 없음——
서비스교체 공구·집은 물체의 부하 추정(원리 수준)짧은 식별 시간, 사용자 안전31.1
의료·헬스케어수술 기구 교체 시 부하 변화에 따른 중력 보상(원리 수준)높은 보상 정확도32.1
휴머노이드·범용부유기저 전신 모델의 관성 식별, 시뮬레이션 모델 갱신타당한 관성, 접촉 불가 구간의 식별3.13, 16.12
필드가변 부하(굴착·집게) 모델 갱신(원리 수준)큰 부하 변화, 마찰·유압 특성7.6, 5.19
국방·안보원리 수준에서 해당하는 고유 요구 없음——

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

3.7.8 관련 규격·프로토콜

문서발행무엇을 정하나상세 장
URDF inertial 요소ROS 문서링크 질량·CoM 틀·CoM 기준 관성 6개 값(Lynch·Park 8.8절에서 읽음)27.9, 4.15
computeJointTorqueRegressor·rnea·Inertia.toDynamicParametersPinocchio 4.1.0회귀 행렬, 역동역학, 동역학 파라미터 순서 $(m,h,I_{xx},I_{xy},I_{yy},I_{xz},I_{yz},I_{zz})$3.6
linalg.lstsq·svd·eigvalshnumpy 2.5.4최소제곱·랭크·고유값1.2
반정부호 계획(Clarabel)cvxpy 1.9.3LMI 제약 최소제곱의 풀이1.17
ISO 9283ISO로봇 성능(위치 정확도·반복 정밀도)의 시험27.3

동역학 파라미터 식별의 절차를 규정한 국제 표준은 확인하지 못했다 (확인 필요). ISO 9283의 본문은 읽지 못했다.

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

동역학 파라미터 식별 자체를 규정한 법령·인증은 확인하지 못했다. 협동로봇은 속도·힘 제한 기능이 질량·부하 설정이 맞는다는 전제에 의존하는 것으로 알려져 있으나 어느 조항이 부하 정확도를 요구하는지는 확인하지 못했다 (확인 필요). 안전 기능 설계는 26.7, 충돌 안전은 26.9, 산업 로봇 안전 표준은 27.10, 협동로봇 적용 인증은 41.9에서 다룬다. 부하 설정 오류가 중력 보상 오차와 충돌 검출 임계 오판(9.27)으로 이어질 수 있다는 점은 이 장의 계산에서 부하 토크가 $4.6$ N·m RMS였다는 크기로만 확인하며 규정의 조항은 확인하지 않았다.

3.7.10 한계·유의점·미해결

  • 합성 자료. 실제 토크 측정의 편향·비선형 마찰·히스테리시스·열 변화를 다루지 않았다.
  • 가속도. 정확한 $\ddot q$를 가정했다. 미분과 필터의 영향은 계산하지 않았다.
  • 강체 가정. 유연 관절·링크(3.9)가 있으면 모델이 틀리고 식별값이 편향된다.
  • 파라미터 비선형 마찰. 쿨롱·점성 외의 마찰(스트리벡·LuGre)은 다루지 않았다(3.8).
  • 여기 궤적 최적화. 단일 시드의 (1+1) 진화 전략이며 전역 최적이 아니다. 접촉·자기 충돌·토크 한계 제약은 넣지 않았다.
  • 타당성 제약. 경계(퇴화)에 놓이는 해가 흔하다. 사전 가중치 선택의 기준을 이 장은 정하지 못했다.
  • 부유기저. 기저가 고정되지 않은 시스템의 식별은 3.13의 주제이다.

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

체크포인트:

  1. 링크의 렌치 $F=G\dot V-[\mathrm{ad}_V]^\top GV$가 $\pi=(m,h,\bar I)$에 선형임을 보이고 $6\times10$ 행렬 $W$를 구하라.
  2. 평면 2R의 기저 파라미터 6개를 손으로 유도하고 영공간 벡터 두 개가 $Y\nu=0$을 만족함을 확인하라.
  3. 관절 1과 관절 2에서 $I_a$ 열이 $I_{zz}$ 열과 같아지는 이유를 운동에너지 $\tfrac12I_{zz,j}\dot q_j^2$로 설명하라.
  4. 공분산 $\sigma^2(Y_b^\top Y_b)^{-1}$를 유도하고 몬테카를로로 검증하라.
  5. 유사 관성 행렬 $J(\pi)\succ0$이 $m>0$, $I_C\succ0$, 삼각 부등식과 동치인 이유(Wensing 외 정리 3)를 두 번째 모멘트의 공분산 해석으로 설명하라.
  6. 정적 자세만으로 식별할 수 있는 기저 파라미터의 수가 왜 12인지 중력 항에서 설명하라.

연구 질문:

  • 마찰과 가속도 추정 오차를 함께 모델링한 식별에서 기저 파라미터의 추정 가능 정도(영공간 근처 방향의 민감도)는 어떻게 변하는가(이 장은 시험하지 않았다)?
  • 사전값 가중 $\kappa$를 데이터로부터 선택하는 규칙(교차 검증·경험 베이즈)은 물리적 타당성 제약과 어떻게 결합되는가?
  • 부하 변화가 잦은 협동로봇에서 짧은 궤적(수 초)으로 질량·CoM·관성의 신뢰 구간을 어떻게 보증할 수 있는가?

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

  • K. M. Lynch, F. C. Park, Modern Robotics: Mechanics, Planning, and Control, Cambridge University Press, 2017, 사전 인쇄본(2017-05) 8.8·8.9절 — 직접 읽음.
  • P. M. Wensing, S. Kim, J.-J. E. Slotine, "Linear Matrix Inequalities for Physically Consistent Inertial Parameter Identification: A Statistical Perspective on the Mass Distribution," IEEE Robotics and Automation Letters 3(1), 60–67, 2018, doi:10.1109/lra.2017.2729659; arXiv:1701.04395v3 — 직접 읽음.
  • S. Traversaro, S. Brossette, A. Escande, F. Nori, "Identification of fully physical consistent inertial parameters using optimization on manifolds," IROS 2016, 5446–5451, doi:10.1109/iros.2016.7759801; arXiv:1610.08703v1 — 서론·정의 위주로 읽음.
  • C. G. Atkeson, C. H. An, J. M. Hollerbach, "Estimation of inertial parameters of manipulator loads and links," International Journal of Robotics Research 5(3), 101–119, 1986, doi:10.1177/027836498600500306 — 서지만 확인.
  • H. Mayeda, K. Osuka, A. Kangawa, "A new identification method for serial manipulator arms," IFAC Proceedings Volumes 17, 2429–2434, 1984, doi:10.1016/s1474-6670(17)61346-6 — 서지만 확인.
  • 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 — 서지만 확인.
  • M. Gautier, "Numerical calculation of the base inertial parameters of robots," Journal of Robotic Systems 8(4), 485–506, 1991, doi:10.1002/rob.4620080405 — 서지만 확인.
  • B. Armstrong, "On finding exciting trajectories for identification experiments involving systems with nonlinear dynamics," International Journal of Robotics Research 8(6), 28–48, 1989, doi:10.1177/027836498900800603 — 서지만 확인.
  • J. Swevers, C. Ganseman, D. B. Tükel, J. de Schutter, H. Van Brussel, "Optimal robot excitation and identification," IEEE Transactions on Robotics and Automation 13(5), 730–740, 1997, doi:10.1109/70.631234 — 서지만 확인.
  • J. Hollerbach, W. Khalil, M. Gautier, "Model identification," in Springer Handbook of Robotics, Springer, 2008, 321–344, doi:10.1007/978-3-540-30301-5_15 — 서지만 확인.
  • M. Gautier, "Dynamic identification of robots with power model," Proc. IEEE ICRA 1997, 1922–1927, doi:10.1109/robot.1997.619069 — 서지만 확인.
  • C. D. Sousa, R. Cortesão, "Physical feasibility of robot base inertial parameter identification: A linear matrix inequality approach," International Journal of Robotics Research 33(6), 931–944, 2014, doi:10.1177/0278364913514870 — 서지만 확인.
  • M. Gautier, G. Venture, "Identification of standard dynamic parameters of robots with positive definite inertia matrix," IEEE/RSJ IROS 2013, 5815–5820, doi:10.1109/iros.2013.6697198 — 서지만 확인.
  • C. Rucker, P. M. Wensing, "Smooth parameterization of rigid-body inertia," IEEE Robotics and Automation Letters 7(2), 2771–2778, 2022, doi:10.1109/lra.2022.3144517 — 서지만 확인.
  • C. Gaz, M. Cognetti, A. Oliva, P. Robuffo Giordano, A. De Luca, "Dynamic identification of the Franka Emika Panda robot with retrieval of feasible parameters using penalty-based optimization," IEEE Robotics and Automation Letters 4(4), 4147–4154, 2019, doi:10.1109/lra.2019.2931248 — 서지만 확인.
  • Pinocchio 4.1.0(rnea, computeJointTorqueRegressor, Inertia.toDynamicParameters), numpy 2.5.4, SciPy 1.18.1, cvxpy 1.9.3(Clarabel).

다음 장. 3.8은 마찰을 다룬다. 이 장의 확장 모델이 선형으로 취급한 쿨롱·점성 항을 스트리벡 효과·LuGre 모델과 관절 마찰의 측정으로 확장한다.