제2부 기구학
2.1 기구 구조와 자유도: 관절 종류·그뤼블러 공식·모빌리티
2.1.1 이 장에서 배우는 것 / 선수 지식 / 특히 중요한 독자
이 장은 로봇 기구가 가지는 자유도를 세는 방법을 다룬다. 관절의 종류와 수, 링크의 수, 폐루프의 수가 자유도를 정하는 방식을 그뤼블러(Grübler) 공식으로 계산하고, 이 공식이 틀리는 기구(베넷 링크·사루스 링크·평행사변형 링크)를 스크루 행렬의 계수로 판정하는 데까지 이어 간다. 자유도는 이후 모든 장의 입력이다. 순기구학·역기구학은 변수의 개수를 자유도로 잡고(2.3~2.6), 자코비안의 크기와 특이점은 자유도에 따라 달라지며(2.8·2.9), 병렬 기구의 해석은 폐루프의 자유도 계산에서 시작한다(2.13·2.14).
배우는 것:
- 관절의 분류 — 회전·직선·나사·원통·유니버설·구면·평면 관절의 자유도 $f$와 구속 $c=m-f$, 소프트웨어(URDF·SDF·MJCF·Pinocchio)의 관절 이름.
- 그뤼블러 공식 — $M=m(N-1-J)+\sum f_i$의 유도, 독립 루프 수 $L=J-N+1$과의 관계, 평면($m=3$)과 공간($m=6$).
- 공식이 틀리는 경우 — 구속이 독립이 아닌 과구속 기구, 말단에는 나타나지 않는 유휴 자유도.
- 모빌리티의 판정 — 링크 트위스트와 관절 속도로 이루어진 선형 계통의 영공간 차원(순간 모빌리티), 경로 추적(유한 모빌리티), 베넷 조건.
- 병렬 기구의 자유도 — 스튜어트-고프 플랫폼, 델타 로봇, 평면 3-RPR에서 전체 모빌리티와 이동 플랫폼의 자유도를 구분하는 방법.
선수 지식: 1.1(행렬의 계수·특이값 분해), 1.10(트위스트·스크루 축). 표기는 BK-05와 A.2을 따른다: 트위스트 $(\omega,v)$, 관절 스크루 $S=(\omega,v)$.
특히 중요한 독자: 새 기구를 설계하거나 병렬 기구·폐루프를 포함한 로봇 모델을 만드는 기구 설계자, 기구학·동역학 라이브러리에서 모델의 자유도와 구속을 확인하는 소프트웨어 개발자, 로봇 사양서의 "축 수"를 읽는 비전문가.
출처 방침. 기준 시점은 2026-11-03이다. 직접 읽은 자료: ① Lynch·Park, Modern Robotics(Cambridge University Press, 2017; 사전 인쇄본 2017-05-03판, 2장 "Configuration Space"의 정의 2.1, 표 2.1, 명제 2.2, 예 2.3~2.8), ②
ros/urdfdom_headers의include/urdf_model/joint.h(master)의 관절 형식 열거, ③gazebosim/sdformat의sdf/1.12/joint.sdf(main), ④ MuJoCo 문서 원본(doc/XMLreference.rst·doc/computation/index.rst, main)의 관절 형식과 등식 구속 절, ⑤ Pinocchio 4.1.0의 관절 모델(실행). 서지는 Crossref 응답으로 확인했다(Gogu 2005, Baker 1980, Müller 2016). 읽지 못한 것: 위 논문 세 편의 본문과 Bennett(1903)·Sarrus·Bricard·Grübler·Kutzbach·Chebychev의 원 논문(Crossref에서 원 서지를 찾지 못했거나 본문을 열람하지 못했다 — 인명·연도는(확인 필요)). 이 장의 수치는 모두 순수 파이썬 계산이며 NumPy·Pinocchio 대조는 2.1.5에 있다.
2.1.2 개념 — 링크·관절·구속
기구(mechanism)는 링크(link)와 관절(joint)로 이루어진다. 링크는 강체로 간주하는 부품이고, 관절은 정확히 두 링크를 이어 그 사이의 상대 운동을 제한하는 요소이다(Modern Robotics는 세 링크 이상을 한꺼번에 잇는 관절을 허용하지 않는다). 지반(ground)도 링크 하나로 센다. 관절이 이은 링크의 연결 관계가 나무 모양이면 개방 사슬(직렬 기구), 닫힌 고리가 하나라도 있으면 폐쇄 사슬(폐루프 기구)이다. 지반과 말단 사이에 사슬이 여러 개 있는 폐루프 기구를 병렬 기구라 한다.
자유도(degrees of freedom)의 정의는 Modern Robotics의 정의 2.1을 따른다. 로봇의 모든 점의 위치를 정하는 데 필요한 실수 좌표의 최소 개수가 자유도이고, 그 개수가 구성 공간(C-space)의 차원이다. 공간의 강체 하나는 6자유도(평면에서는 3자유도)이며, 관절은 이 자유도를 줄이는 구속으로 볼 수도 있고 허용하는 운동으로 볼 수도 있다. 회전 관절은 상대 운동 한 개를 허용하고 다섯 개를 구속한다.
결론부터 적으면 다음과 같다. 직렬 팔은 관절 수가 자유도이다. 폐루프가 있으면 관절의 수만으로는 자유도가 정해지지 않으며, 링크의 수와 관절의 수로 세는 그뤼블러 공식이 대부분의 기구에서 맞지만 구속이 독립이 아닌 기구에서는 틀린다. 이 장은 자유도를 세는 이 공식과, 공식이 틀릴 때 사용하는 선형대수의 판정을 구분해 다룬다. 용어는 다음과 같이 구분한다(이 장의 정의이며 문헌에 따라 혼용된다).
- 자유도·모빌리티(mobility). 기구의 구성 공간의 국소 차원. 이 장은 둘을 같은 뜻으로 사용한다.
- 순간 모빌리티. 한 형상에서 구속식을 선형화한 계통의 해 공간의 차원(속도 수준). 계산은 쉬우나 그 형상에서만 정의된다.
- 유한 모빌리티. 형상이 실제로 연속적으로 움직일 수 있는 방향의 차원. 순간 모빌리티는 유한 모빌리티 이상이다.
2.1.3 원리
2.1.3.1 관절의 분류와 구속
관절은 두 링크의 상대 운동이 몇 개의 독립 방향으로 허용되는지($f$)로 분류한다. 공간에서 $f+c=6$이고 평면에서 $f+c=3$이다. 표 1은 이 장이 다루는 일곱 종류이다. 원통·유니버설·구면 관절의 자유도는 Modern Robotics의 표 2.1과 같다. 평면 관절 E는 Modern Robotics의 표에 없고 이 장이 덧붙인 것이며, 평면 접촉에서 허용되는 두 병진과 법선 둘레의 회전 한 개를 가진다.
| 관절 | 기호 | 자유도 $f$ | 공간 구속 $c$ | URDF | SDF 1.12 | MJCF | Pinocchio 4.1.0 |
|---|---|---|---|---|---|---|---|
| 회전(revolute) | R | 1 | 5 | revolute·continuous | revolute·continuous | hinge | JointModelRX·RY·RZ |
| 직선(prismatic) | P | 1 | 5 | prismatic | prismatic | slide | JointModelPX·PY·PZ |
| 나사(helical) | H | 1 | 5 | — | screw | — | JointModelHX·HY·HZ |
| 원통(cylindrical) | C | 2 | 4 | — | — | — | — |
| 유니버설(universal) | U | 2 | 4 | — | universal | — | JointModelUniversal |
| 구면(spherical) | S | 3 | 3 | — | ball | ball | JointModelSpherical |
| 평면(planar) | E | 3 | 3 | planar | — | — | JointModelPlanar |
표의 소프트웨어 이름은 위 소스에서 직접 읽은 것이다. 빈칸 "—"은 그 형식에 같은 이름의 관절이 없다는 뜻이며 다른 관절의 조합으로 만들 수 있다. 같은 소스에서 읽은 나머지 형식은 다음과 같다. URDF는 fixed(자유도 0)와 floating(6자유도)을 가진다. SDF는 revolute2(회전 관절 둘의 직렬), gearbox, fixed를 가진다. MJCF는 free(병진 3과 회전 3, 회전은 단위 쿼터니언)를 가진다. Pinocchio에는 이름이 Cylindrical인 관절 모델이 없다(dir(pinocchio)로 확인).
소프트웨어 관절 모델의 구성 벡터 차원 $n_q$와 속도 차원 $n_v$는 다를 수 있다. Pinocchio에서 JointModelSpherical은 $(n_q,n_v)=(4,3)$(쿼터니언), JointModelPlanar는 $(4,3)$, JointModelFreeFlyer는 $(7,6)$이다. 자유도는 $n_v$에 해당한다. 모빌리티를 셀 때 $n_q$가 아니라 $n_v$(또는 관절 스크루의 수)를 센다.
2.1.3.2 그뤼블러 공식
자유도의 개수는 구속을 세어 구한다. 지반을 뺀 링크 $N-1$개는 각각 $m$자유도를 가지고, 관절 $i$는 $c_i=m-f_i$개의 구속을 부과한다. 구속이 서로 독립이면 다음이 성립한다(Modern Robotics의 명제 2.2).
$$M=m(N-1)-\sum_{i=1}^{J}c_i=m(N-1-J)+\sum_{i=1}^{J}f_i.$$
여기서 $N$은 지반을 포함한 링크의 수, $J$는 관절의 수, $f_i$는 관절 $i$의 자유도이며 $m=3$(평면) 또는 $m=6$(공간)이다. 독립 루프 수 $L=J-N+1$로 나타내면 $M=\sum f_i-mL$이 된다. 직렬 팔은 $J=N-1$이므로 $L=0$이고 $M=\sum f_i$이다. 닫힌 고리 하나가 생길 때마다 $m$개의 구속이 늘어난다.
공식의 해석에서 두 가지를 구분해야 한다. 첫째, Modern Robotics는 이 공식이 "모든 관절 구속이 독립일 때만 성립하며, 독립이 아니면 자유도의 하한을 준다"고 적는다. 둘째, 공식은 작동기의 수를 세지 않는다. 자유도 $M$은 기구의 성질이고 작동기 수는 설계 선택이다(병렬 기구에서는 2.13·2.14).
2.1.3.3 공식이 틀리는 경우
공식이 틀리는 원인은 두 가지이다.
- 과구속(독립이 아닌 구속). 관절의 구속이 중복되어 공식이 과소 계산한다. Modern Robotics의 평행사변형 링크(예 2.6)는 $N=5$, $J=6$, 모든 $f_i=1$이므로 $3(5-1-6)+6=0$이지만, 평행한 세 막대 중 하나는 운동에 영향을 주지 않아 실제로 1자유도로 움직인다. 공간에서는 베넷 링크(관절 4개가 모두 회전, $N=4$)가 $6(4-1-4)+4=-2$를 주지만 특수한 치수를 가지면 1자유도로 움직이며, 사루스 링크도 $6(6-1-6)+6=0$이지만 1자유도이다(이 장의 계산은 2.1.5).
- 유휴 자유도(idle freedom). 공식은 맞게 세지만 그중 일부가 말단에 드러나지 않는다. Modern Robotics의 델타 로봇(예 2.7)은 $N=17$, $J=21$(회전 9, 구면 12)이므로 $M=15$이지만 이동 플랫폼은 병진 3자유도만 가지고 나머지 12자유도는 평행사변형 막대 12개의 비틀림이다. 스튜어트-고프 플랫폼은 유니버설 관절이 있는 UPS 다리 6개에서 $M=6$이며, 유니버설 관절을 구면 관절로 바꾸면 $M=12$로 늘어난다(다리의 비틀림 6개가 추가된다).
유휴 자유도는 오류가 아니다. 전체 모빌리티 $M$과 이동 플랫폼이 가지는 자유도는 다르며 이 장은 두 값을 모두 계산한다.
2.1.3.4 스크루 행렬의 영공간으로 모빌리티를 구하기
개수를 세지 않고 구속의 독립성을 직접 판정하려면 선형 계통을 세운다. 지반을 제외한 링크 $k$의 트위스트를 $V_k\in\mathbb R^6$, 관절 $j$가 링크 $a$(부모)와 $b$(자식)를 잇고 허용하는 상대 운동의 스크루를 $S_{j,1},\dots,S_{j,f_j}$(공간 좌표, 1.10)라 하면 관절의 운동학적 관계는 다음과 같다.
$$V_b-V_a=\sum_{k=1}^{f_j}S_{j,k}\,\dot q_{j,k},\qquad V_{\mathrm{ground}}=0.$$
이를 관절마다 6개씩 모아 미지수 $(V_1,\dots,V_{N-1},\dot q)$에 대한 동차 선형 계통 $A\,u=0$을 만든다. 미지수의 수는 $6(N-1)+\sum f_j$이다. 지반에서 출발하는 경로가 모든 링크의 $V_k$를 $\dot q$로 정하므로, 해 공간의 차원이 곧 순간 모빌리티이다.
$$M_{\mathrm{inst}}=\dim\ker A=6(N-1)+\sum_j f_j-\operatorname{rank}A.$$
단일 루프의 관절 스크루 $S_1,\dots,S_n$으로는 $M_{\mathrm{inst}}=n-\operatorname{rank}[S_1\ \cdots\ S_n]$으로 줄어든다. 여기서 $\operatorname{rank}$는 1.1의 행렬 계수이며, 관절 스크루 가운데 몇 개가 선형 종속인지를 센다. 이동 플랫폼(링크 $e$)이 가지는 자유도는 $\ker A$를 링크 $e$의 6성분에 사영한 차원과 같고, 링크 $e$의 열을 제거한 행렬 $A'$로 $6-(\operatorname{rank}A-\operatorname{rank}A')$로 구한다.
계수는 부동소수점으로 판정한다. 이 장은 완전 피벗 가우스 소거의 피벗 크기를 허용치 $10^{-9}$와 비교하고, 채택한 피벗의 최솟값과 버린 피벗의 최댓값을 함께 보고하여 판정의 여유를 보인다.
2.1.3.5 유한 모빌리티와 베넷 조건
순간 모빌리티가 1이라는 것은 형상이 실제로 움직일 수 있다는 뜻이 아니다. 구속식의 1차 근사(속도 수준)만 보기 때문이다. 유한 모빌리티는 조립 형상에서 출발해 구속식을 만족시키며 형상을 따라가 보아야 확인된다. 이 장은 한 관절 변수를 매개변수로 고정하고 나머지를 닫힘 방정식의 가우스-뉴턴 반복으로 푼 뒤 직전 해를 다음 시작점으로 사용하는 경로 추적을 한다.
닫힘 방정식은 지수곱 공식으로 나타낸다. 조립 형상의 관절 스크루 $S_i$(공간 좌표)에 대해 루프는 $T(\theta)=e^{[S_1]\theta_1}\cdots e^{[S_n]\theta_n}=I$를 만족해야 하며, 형상 $\theta$에서 $T(\theta+\delta)\approx\exp\bigl([\sum_i S_i(\theta)\delta_i]\bigr)T(\theta)$이므로 잔차 $r=\log T(\theta)$에 대해 $\sum_i S_i(\theta)\delta_i=-r$을 최소제곱으로 푼다. 형상 $\theta$의 스크루는 $S_i(\theta)=\mathrm{Ad}_{e^{[S_1]\theta_1}\cdots e^{[S_{i-1}]\theta_{i-1}}}S_i$이다(2.4에서 지수곱 공식을 자세히 다룬다).
베넷 링크는 회전 관절 네 개가 이루는 공간 사절 링크로, 마주 보는 링크의 길이와 비틀림각이 같고($a_{12}=a_{34}=a$, $a_{23}=a_{41}=b$, $\alpha_{12}=\alpha_{34}=\alpha$, $\alpha_{23}=\alpha_{41}=\beta$) 관절 축 사이의 이동 거리(오프셋)가 모두 0이며, 다음 조건을 만족하는 특수한 경우이다.
$$\frac{a}{\sin\alpha}=\frac{b}{\sin\beta}.$$
이 조건은 이 장이 직접 유도하지 않았고 문헌의 일반 지식으로 적었다(원 논문의 서지는 확인하지 못했다 (확인 필요)). 대신 이 조건을 만족하는 치수와 한 형상을 사용해 계산으로 확인한다. 표준 DH 관례(2.3)에서 조립한 형상이 $\theta_1+\theta_3\equiv0$, $\theta_2+\theta_4\equiv0 \pmod{2\pi}$이고 $\sin\frac{\theta_1}{2}\sin\frac{\theta_2}{2}=K\cos\frac{\theta_1}{2}\cos\frac{\theta_2}{2}$, $K=\sin\frac{\beta+\alpha}{2}/\sin\frac{\beta-\alpha}{2}$를 만족함을 2.1.5의 경로 추적에서 확인한다.
2.1.3.6 병렬 기구의 자유도와 특이 형상
병렬 기구의 모빌리티는 같은 선형 계통으로 구한다. 이 장은 지반과 이동 플랫폼 사이의 다리마다 링크를 두고 관절 스크루를 조립 형상의 일반 위치에서 계산한다. 계수는 형상에 따라 달라질 수 있다. 일반 형상에서의 값이 모빌리티이고, 특이 형상에서는 순간 모빌리티가 늘어난다. 평행사변형 사절 링크를 한 직선 위에 접으면 네 회전축이 모두 같은 평면의 평행선이 되어 스크루 행렬의 계수가 3에서 2로 낮아지고 순간 모빌리티가 1에서 2로 늘어난다. 이 형상은 두 가지 운동(평행사변형·역평행사변형)이 갈라지는 분기점이므로 유한 모빌리티는 각 가지에서 1이다. 사루스 링크도 두 다리를 완전히 편 형상에서 계수가 5에서 4로 낮아진다.
작동기를 잠갔을 때 이동 플랫폼이 움직이는 특이 형상(작동기 특이점)은 모빌리티가 아니라 자코비안의 성질이며 2.9·2.14에서 다룬다.
2.1.4 알고리즘
모빌리티 판정은 개수 세기에서 시작해 필요한 경우에만 선형대수로 넘어간다.
- 링크와 관절을 나열한다. 지반을 링크 0으로 두고 관절마다 부모·자식 링크와 허용하는 운동의 스크루(회전은 $(u,-u\times q)$, 직선은 $(0,u)$)를 적는다. 한 관절이 여러 자유도를 가지면 스크루를 그 수만큼 둔다.
- 그뤼블러 공식 $M=m(N-1-J)+\sum f_i$로 개수를 센다. 결과가 0 이하이거나 모델이 움직이는데 0 이하가 나오면 과구속을 의심한다.
- 조립 형상(구속식을 만족하는 형상)의 일반 위치에서 계통 $A$를 만들고 계수를 구한다. 영공간 차원이 순간 모빌리티이고, 이동 플랫폼의 열을 제거한 행렬의 계수와 비교해 말단의 자유도를 구한다.
- 필요하면 한 관절을 매개변수로 고정하고 닫힘 방정식을 풀어 경로를 추적하여 유한 모빌리티를 확인한다. 추적하는 동안 스크루 행렬의 계수가 변하지 않는지 본다.
- 서로 다른 일반 형상에서 3~4단계를 반복한다. 형상에 따라 값이 늘어나는 곳이 특이 형상이다.
2.1.5 풀이 예제 — 모빌리티 12개와 유한 모빌리티·라이브러리 확인
평면 6종(사절 링크, 평행사변형 링크의 펼친 배치와 접힌 배치, 슬라이더-크랭크, 막대 3개의 평행사변형, 오절 링크), 3-RPR 병렬 기구, 사루스 링크, 베넷 링크, 스튜어트-고프 플랫폼(UPS·SPS), 델타 로봇의 모빌리티를 계산하고, 베넷 링크와 사루스 링크의 유한 모빌리티를 경로 추적으로 확인한다. 결론부터 적으면 다음과 같다. ① 12개 기구 가운데 8개에서 그뤼블러 공식과 영공간 차원이 일치하고, 4개(평행사변형 접힘·막대 3개 평행사변형·사루스·베넷)에서 공식이 영공간 차원보다 작다. ② 베넷 링크는 $\theta_1$을 한 바퀴 돌리는 동안 스크루 행렬의 계수가 3으로 유지되어 닫힘 잔차가 $10^{-14}$ 이하이다. ③ 베넷 조건을 $\Delta\beta=0.1^\circ$만 어겨도 닫힘 잔차의 최솟값이 $10^{-3}$으로 올라 조립할 수 없다. ④ 델타 로봇의 15자유도 중 이동 플랫폼은 병진 3자유도이다.
구현. rev·pris(관절 스크루)·system(선형 계통)·rank(완전 피벗 소거)·mobility·grubler. 경로 추적의 poe·screws_at·residual·newton_free와 각 기구의 형상은 스크립트에 있다. 1.1의 svd·solve_lu와 1.7의 exp_se3·log_se3를 사용한다.
| 항목 | 값 |
|---|---|
| 입력 1 | 평면 기구: 사절 링크 $A=(0,0)$, $D=(4,0)$, 크랭크 2(60°), 결합 3.5, 종동 3. 평행사변형 접지 3·크랭크 1(60°), 접힌 배치 $(0,0),(1,0),(4,0),(3,0)$. 슬라이더-크랭크 크랭크 2(50°)·연결봉 4. 막대 3개: 길이 2, 방향 60°, 접지점 간격 1.5. 오절: 접지 3, 크랭크 1.5(70°), 중간 링크 1.6. 3-RPR: 접지점 $(0,0),(4,0),(2,3.4)$, 플랫폼 점 3개를 12° 회전 |
| 입력 2 | 사루스: 다리마다 마디 길이 1, 높이 1.6, 다리 A의 축은 $x$, 다리 B의 축은 $y$ 방향 |
| 입력 3 | 베넷: $a=1.5$, $b=1$, $\alpha=50^\circ$, $\beta=\arcsin(b\sin\alpha/a)=30.71^\circ$, 오프셋 0, $\theta_1=40^\circ$에서 조립(여러 시작점의 가우스-뉴턴) |
| 입력 4 | 스튜어트-고프: 접지 반지름 1.0(각 0·12·120·132·240·252°), 플랫폼 반지름 0.7(각 25·50·145·170·265·290°), 중심 $(0.05,-0.03,1.2)$, 롤·피치·요 $(3,-2,7)^\circ$, 유니버설 관절의 축은 다리와 35° 어긋난 일반 위치 |
| 입력 5 | 델타(Modern Robotics 예 2.7의 구성): 접지 반지름 0.2, 위팔 0.3(수평에서 25° 아래), 막대 0.7, 플랫폼 반지름 0.05, 평행사변형 폭 0.1 |
| 허용치 | 계수 판정 $10^{-9}$, 닫힘 $10^{-14}$ |
import math
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 rev(u, q):
"""회전 관절: 축 방향 u, 축 위의 점 q -> 스크루 (w, v)"""
return list(u) + [-x for x in cross(u, q)]
def pris(u):
"""직선 관절: 이동 방향 u"""
return [0.0, 0.0, 0.0] + list(u)
def system(N, joints):
"""joints = [(부모, 자식, [스크루...])]. 미지수는 링크
트위스트 V_1..V_{N-1}(6개씩, 지반 V_0=0)과 관절 속도.
관절마다 V_자식 - V_부모 - sum(S_k qd_k) = 0 (6개 식)"""
nc = 6 * (N - 1) + sum(len(j[2]) for j in joints)
A, c = [], 6 * (N - 1)
for a, b, scr in joints:
for i in range(6):
row = [0.0] * nc
if b:
row[6 * (b - 1) + i] = 1.0
if a:
row[6 * (a - 1) + i] = -1.0
for k, S in enumerate(scr):
row[c + k] = -S[i]
A.append(row)
c += len(scr)
return A
def rank(A, tol=1e-9):
"""완전 피벗 소거. (계수, 채택 최소, 기각 최대)"""
A = [r[:] for r in A]
m, n, r, lo = len(A), len(A[0]), 0, 1e300
while r < min(m, n):
rr, cc = range(r, m), range(r, n)
v, i, j = max((abs(A[p][q]), p, q)
for p in rr for q in cc)
if v <= tol:
break
lo = min(lo, v)
A[r], A[i] = A[i], A[r]
for row in A:
row[r], row[j] = row[j], row[r]
for i in range(r + 1, m):
f = A[i][r] / A[r][r]
A[i] = [x - f * y for x, y in zip(A[i], A[r])]
r += 1
return r, lo, (v if r < min(m, n) else 0.0)
def mobility(N, joints, e):
"""(영공간 차원, 링크 e 트위스트의 차원)"""
A = system(N, joints)
r = rank(A)[0]
Ap = [row[:6 * (e - 1)] + row[6 * e:] for row in A]
return len(A[0]) - r, 6 - (r - rank(Ap)[0])
def grubler(m, N, f):
"""dof = m (N - 1 - J) + sum f_i"""
return m * (N - 1 - len(f)) + sum(f)
① 모빌리티. 표의 "그뤼블러 $M$"은 공식 값이고 "영공간 차원"은 $A$의 영공간 차원이다. 평면 기구는 $m=3$으로 센 값이다. "링크 1의 자유도"는 이동 플랫폼(링크 1)의 트위스트가 차지하는 차원이다.
| 기구 | $m$ | $N$ | $J$ | $\sum f_i$ | 그뤼블러 $M$ | 영공간 차원 | 링크 1의 자유도 |
|---|---|---|---|---|---|---|---|
| 평면 사절 링크 | 3 | 4 | 4 | 4 | 1 | 1 | — |
| 평행사변형 사절 링크(펼침) | 3 | 4 | 4 | 4 | 1 | 1 | — |
| 평행사변형 사절 링크(접힘) | 3 | 4 | 4 | 4 | 1 | 2 | — |
| 슬라이더-크랭크 | 3 | 4 | 4 | 4 | 1 | 1 | — |
| 막대 3개의 평행사변형 | 3 | 5 | 6 | 6 | 0 | 1 | — |
| 평면 오절 링크 | 3 | 5 | 5 | 5 | 2 | 2 | — |
| 평면 3-RPR 병렬 | 3 | 8 | 9 | 9 | 3 | 3 | 3 |
| 사루스 링크 | 6 | 6 | 6 | 6 | 0 | 1 | — |
| 베넷 4R | 6 | 4 | 4 | 4 | -2 | 1 | — |
| 스튜어트-고프(6-UPS) | 6 | 14 | 18 | 36 | 6 | 6 | 6 |
| 스튜어트-고프(6-SPS) | 6 | 14 | 18 | 42 | 12 | 12 | 6 |
| 델타 로봇 | 6 | 17 | 21 | 45 | 15 | 15 | 3 |
평면 사절 링크·슬라이더-크랭크·오절 링크는 공식과 영공간 차원이 일치한다. 막대 3개의 평행사변형은 공식 0이지만 영공간 차원 1이어서 Modern Robotics의 예 2.6과 같다. 사루스 링크(0 대 1)와 베넷 링크($-2$ 대 1)도 같은 방향으로 공식이 모자란다. 접힌 평행사변형은 공식이 1이고 이 형상에서 영공간 차원이 2로 늘어난다(일반 형상에서는 1). 스튜어트-고프 플랫폼은 UPS에서 6이고 SPS에서 12이며 두 경우 모두 플랫폼의 자유도는 6이다. 델타 로봇은 Modern Robotics의 예 2.7과 같이 15이고 플랫폼은 3이다.
델타 로봇의 이동 플랫폼이 병진만 하는지는 선형 계통에 조건을 추가해 확인한다.
| 델타 로봇에 추가한 조건 | 영공간 차원 |
|---|---|
| 없음 | 15 |
| 이동 플랫폼의 각속도 $\omega=0$ | 15 |
| 이동 플랫폼의 병진 속도 $v=0$ | 12 |
플랫폼의 각속도를 0으로 강제해도 영공간 차원이 15로 그대로이므로 각속도는 항상 0이다. 병진 속도를 0으로 강제하면 12로 줄어 병진 3자유도가 확인된다. 나머지 12개는 플랫폼이 정지한 채로 움직일 수 있는 내부 운동(막대 비틀림)이다.
② 유한 모빌리티. 베넷 링크는 $\theta_1$을 5° 간격으로 한 바퀴(두 방향) 추적하고, 사루스 링크는 $\theta_1=0\sim1.5$ rad를 0.1 rad 간격으로 추적했다. 추적한 형상마다 스크루 행렬의 특이값을 계산했다.
| 항목 | 베넷 4R | 사루스 링크 |
|---|---|---|
| 추적한 형상 수 | 146($\theta_1$ 한 바퀴, 5° 간격 두 방향) | 16($\theta_1=0$~1.5 rad, 0.1 rad 간격) |
| 닫힘 잔차 최대 | 9.9e-15 | 8.8e-15 |
| 스크루 행렬의 가장 작은 특이값 최대 | 3.5e-15 | 9.1e-31 |
| 그다음 특이값 최소 | 0.658 | 0.029 |
| 소거 계수(모든 형상에서 같음) | 3 | 5 |
| 베넷 관계식 위반 최대 | 1.1e-14 | — |
| $\theta_1+\theta_3$, $\theta_2+\theta_4$의 $2\pi$ 법 위반 최대 | 1.4e-14 | — |
| 다리를 완전히 편 배치의 소거 계수 | — | 4(잔차 3e-16) |
베넷 링크는 모든 형상에서 스크루 행렬의 계수가 3이고(가장 작은 특이값 $\le3.5\times10^{-15}$, 그다음 특이값 $\ge0.658$) 닫힘 잔차가 $10^{-14}$ 이하이다. 따라서 이 치수의 베넷 링크는 순간적으로만이 아니라 한 바퀴 이상 유한 운동을 한다. 앞의 베넷 관계식과 $\theta_1+\theta_3$, $\theta_2+\theta_4$의 합 조건은 $10^{-14}$ 안에서 성립했다. 사루스 링크는 $\theta_1=0\sim1.5$ rad에서 계수가 5로 유지되었고, 다리 A의 세 관절 변수가 $(\theta_1,\theta_2,\theta_3)=(t,-2t,t)$ 관계를 보였다(관측한 관계이며 이 장은 유도하지 않았다). 다리를 완전히 편 형상($\theta_1=\arctan0.75$)에서는 계수가 4로 낮아져 순간 모빌리티가 2이다. 추적한 경로는 이 형상을 지나 계속된다(그 형상에서 두 번째 운동 가지가 있는지는 이 계산으로 판정하지 않았다).
접힌 평행사변형 사절 링크는 이 형상에서 순간 모빌리티가 2이다. 같은 링크에서 $\theta_1$을 접힌 형상에서 조금 벗어난 값으로 고정하고 닫힘 방정식을 200개 시작점에서 풀면 서로 다른 해가 다음과 같이 나온다.
접힌 사절 링크 $\theta_1=0.2$ rad에서 서로 다른 닫힘 해의 수: 2
$\theta_1=0.2,\ 0.02,\ 0.002$ rad로 줄이면 두 해 모두 접힌 형상 $(\theta_2,\theta_3,\theta_4)=(0,0,0)$으로 수렴했다. 접힌 형상은 두 운동 가지의 교점이다.
③ 베넷 조건의 위반. $\beta$를 조건에서 $\Delta\beta$만큼 벗어나게 한 뒤 $\theta_1=40^\circ$에서 $\theta_2,\theta_3,\theta_4$를 60개 시작점으로 찾은 닫힘 잔차의 최솟값이다.
| 베넷 조건 위반 $\Delta\beta$ (°) | 0 | 0.1 | 0.5 | 1 | 2 | 5 |
|---|---|---|---|---|---|---|
| 닫힘 잔차의 최솟값(시작점 60개) | 1.8e-16 | 1.0e-03 | 5.0e-03 | 1.0e-02 | 2.0e-02 | 4.8e-02 |
조건이 성립하면($\Delta\beta=0$) 잔차가 $10^{-16}$까지 내려가고, 위반하면 $\Delta\beta$에 거의 비례해 $10^{-3}\sim10^{-2}$ 이상으로 올라간다. 닫힘이 불가능하므로 이 치수는 강체로는 조립할 수 없고, 베넷 링크가 1자유도로 움직이는 것은 치수의 특수성에 달려 있다. $\Delta\beta=0.1^\circ$의 치수 오차에서도 잔차가 $10^{-3}$ 수준이므로, 과구속 기구에서는 제작 오차를 링크의 탄성 변형이나 관절 간극이 흡수해야 한다 (추정, 이 장은 변형·간극을 모델링하지 않았다).
④ 라이브러리 대조(실행 2026-11-03). NumPy 2.5.4와 Pinocchio 4.1.0을 격리 가상환경에서 호출했다. 스크립트는 robotics/fig-src/2.1-libcheck.py, 출력은 robotics/fig-src/data/2.1-libcheck-output.txt에 있다. 12개 기구의 구조 행렬(최대 126×141)에 대해 numpy.linalg.matrix_rank는 이 장의 완전 피벗 소거와 같은 계수를 모두에서 냈다. 채택된 특이값의 최솟값은 델타 로봇의 $1.54\times10^{-2}$이고 버려진 특이값의 최댓값은 $3.35\times10^{-16}$(3-RPR)이어서 두 값의 비가 약 $4.6\times10^{13}$이어서 판정 여유가 크다. Pinocchio의 관절 모델은 JointModelRX·PX·HX가 $(n_q,n_v)=(1,1)$, JointModelUniversal이 $(2,2)$, JointModelSpherical이 $(4,3)$, JointModelSphericalZYX가 $(3,3)$, JointModelPlanar가 $(4,3)$, JointModelTranslation이 $(3,3)$, JointModelFreeFlyer가 $(7,6)$이며, Cylindrical이라는 이름의 관절 모델은 없다. Pinocchio는 기구학 트리를 기본 구조로 하므로 닫힌 루프의 모빌리티를 직접 계산하지 않았다. MuJoCo는 설치하지 않고 문서만 읽었으며, 문서는 트리로 표현할 수 없는 "루프 관절"을 등식 구속으로 만들 수 있으나 권장하지 않는다고 적는다(connect 구속 한 개는 트리 밖의 구면 관절이고 같은 두 물체에 두 개를 두면 트리 밖의 회전 관절이 된다).
한계. 수치는 합성 입력(고정 형상)이다. 모빌리티는 표에 적은 일반 형상에서 계산했고 다른 형상에서는 달라질 수 있다(특히 대칭 배치의 스튜어트-고프 플랫폼). 경로 추적은 한 가지 가지만 따라가며 다른 가지의 존재를 배제하지 않는다. 계수 판정은 피벗 허용치 $10^{-9}$에 의존한다(판정 여유는 위 대조에서 비 $4.6\times10^{13}$). 베넷 관계식은 이 장의 DH 관례에서 확인한 것이며 다른 관례에서는 식의 모양이 다르다. 접힌 평행사변형의 두 가지는 해의 개수(2)와 수렴 방향만 확인했고 접촉(분기) 구조의 완전한 위상 분석은 하지 않았다.
견해: 새 기구는 먼저 그뤼블러 공식으로 개수를 세고, 결과가 0 이하인데 움직이는 기구(모델이 움직이거나 도면상 1자유도로 의도한 경우)이거나 평행 막대처럼 같은 역할의 링크가 겹칠 때에는 반드시 스크루 행렬의 계수를 한 곳이 아니라 서로 다른 일반 형상 여러 곳에서 구해 확인하는 것을 기본으로 둔다고 본다. 근거는 이 장의 12개 기구 가운데 4개에서 공식이 영공간 차원과 어긋났다는 점이다. 허용 오차를 포함한 형상의 모델링에서는 이 판단이 달라질 수 있다.
2.1.6 설계 트레이드오프 — 모빌리티 판정 방식
공개 문헌에서 확인되는 방식은 세 가지이다.
- ① 개수 세기(그뤼블러 공식). 링크·관절 수만 필요하고 계산이 즉시 끝난다.
- ② 스크루 행렬의 계수(순간 모빌리티). 한 형상의 관절 스크루만으로 과구속과 유휴 자유도를 구분한다. 형상은 구속식을 만족해야 한다.
- ③ 경로 추적과 고차 해석(유한 모빌리티). 형상이 실제로 움직이는지, 특이 형상에서 몇 가지로 갈라지는지를 확인한다. 고차 해석은 Müller의 연구 계열이 다룬다(본문 미확인).
| 방식 | 필요한 입력 | 얻는 것 | 한계 | 알맞은 경우 |
|---|---|---|---|---|
| ① 그뤼블러 공식 | $N$, $J$, $f_i$ | 자유도의 추정(구속이 독립이면 정확) | 과구속 기구에서 하한, 유휴 자유도를 구분하지 못함 | 설계 초기의 개수 점검 |
| ② 스크루 행렬의 계수 | 조립 형상의 관절 스크루 | 순간 모빌리티, 플랫폼의 자유도 | 한 형상의 값, 특이 형상에서 증가, 허용치 선택 | 모델 검증, 과구속 판정 |
| ③ 경로 추적 | 조립 형상과 닫힘 방정식 | 유한 모빌리티, 분기 | 초기값·계산량, 한 가지만 추적 | 과구속 기구의 최종 확인 |
견해: 로봇 모델을 만드는 소프트웨어 팀은 ②를 모델 검증 시험으로 자동화하고(모델의 자유도가 설계 의도와 같은지, 서로 다른 형상 여러 곳에서 계수가 같은지) ①은 설계 문서의 점검으로 두는 것이 낫다고 본다. 근거는 ②가 형상만 있으면 선형대수 한 번으로 끝나고 이 장의 12개 기구에서 판정 여유가 컸다는 점이다.
2.1.7 응용 축 비교
| 응용 축 | 자유도 계산이 맡는 일 | 요구 | 관련 장 |
|---|---|---|---|
| 산업·제조 | 6축·7축 직렬 팔의 축 배치, SCARA·델타·직교 로봇의 자유도, 병렬 기구의 플랫폼 자유도 | 사양의 축 수 일치, 특이점 회피 | 7.3, 28.3 |
| 물류·이동 | 이동 매니퓰레이터의 팔 자유도와 이동체 구속의 구분 | 구속의 종류(비홀로노믹)를 구분 | 2.15 |
| 도로 주행 | 해당하는 고유 요구 없음 | — | — |
| 서비스 | 가정용 팔의 7자유도 여유, 손가락 관절 | 자유도 대 작동기 수 | 2.11, 7.3 |
| 의료·헬스케어 | 원격 운동 중심(RCM) 기구의 평행사변형·구면 링크 | 과구속 기구의 정밀 제작 | 7.7, 32.14 |
| 휴머노이드·범용 | 어깨·손목의 구면 관절을 직렬 회전 3개로 대체, 다리·몸통의 자유도 배치 | 자유도 배치, 짐벌 특이 | 7.3, 7.15, 7.18 |
| 필드 | 해당하는 고유 요구 없음(이동·휴머노이드 행과 같음) | — | — |
| 국방·안보 | 원리 수준에서 해당하는 고유 요구 없음 | — | — |
이 표는 이 책의 정리이며 응용별 요구는 장마다 다르다.
2.1.8 관련 규격·프로토콜
| 문서 | 발행 | 무엇을 정하나 | 상세 장 |
|---|---|---|---|
| ISO 8373:2021 | ISO/TC 299 | 로봇 용어(매니퓰레이터·로봇의 정의). 관절·축·자유도 용어의 조항은 이 장이 확인하지 않았다 (확인 필요) | 0.3, 27.2 |
URDF joint.h | ros/urdfdom_headers(master) | 관절 형식 UNKNOWN·REVOLUTE·CONTINUOUS·PRISMATIC·FLOATING·PLANAR·FIXED | 4.15, 15.8, 27.9 |
SDFormat 1.12 joint.sdf | gazebosim/sdformat(main) | continuous·revolute·gearbox·revolute2·prismatic·ball·screw·universal·fixed | 27.9 |
MJCF joint | google-deepmind/mujoco(main) | free·ball·slide·hinge, 폐루프는 equality 구속(connect·weld 등) | 3.6, 27.9 |
| Pinocchio 4.1.0 관절 모델 | stack-of-tasks/pinocchio | RX·PX·HX·Universal·Spherical·Planar·FreeFlyer 등과 $(n_q,n_v)$ | 3.6 |
| 수학 표기·기호표 | 이 책 | 트위스트 $(\omega,v)$, 관절 스크루 | A.2 |
2.1.9 관련 규제·인증 요구와의 연결
자유도 계산을 직접 규정하는 법령·인증 요건은 확인하지 못했다. 로봇 사양서의 "축 수"와 안전 기능의 축별 속도·위치 제한은 축·관절의 정의에 의존하며, 정의는 로봇 용어 규격(0.3·27.2)을 따른다(해당 조항은 확인하지 못했다 (확인 필요)). 산업 로봇의 안전 요건은 27.10이 다룬다.
2.1.10 한계·유의점·미해결
- 구속의 종류. 이 장의 구속은 강체·무마찰·무간극의 홀로노믹 구속이다. 바퀴의 구름 조건 같은 비홀로노믹 구속은 모빌리티의 의미가 달라진다(2.15·12.22).
- 일반 형상의 선택. 계수는 일반 형상에서 구한다. 대칭 배치는 비일반 형상일 수 있으므로 서로 다른 형상에서 값이 같은지 확인한다.
- 허용치. 계수 판정은 허용치에 의존한다. 채택한 최소 피벗과 버린 최대 피벗을 함께 보고하여 여유를 보인다.
- 순간 모빌리티와 유한 모빌리티. 순간 모빌리티는 유한 모빌리티 이상이다. 이 장은 베넷·사루스에서 경로 추적으로 유한 운동을 확인했으나 일반 기구에서의 판정 조건은 다루지 않았다(Müller 2016의 국소 해석은 본문을 읽지 못했다).
- 작동기와 입력의 선택. 모빌리티와 작동기 수는 다르다. 병렬 기구에서 어느 관절을 작동기로 할지는 2.13·2.14에서 다룬다.
- 정확 구속. 과구속 기구는 제작 오차에 민감하다. 정확 구속과 키네마틱 커플링은 4.6에서 다룬다.
- 무한 자유도. 연속체 로봇은 유한 개의 관절로 세지 않는다(2.16).
- 소프트웨어 모델. URDF·SDF에서 폐루프를 표현하는 방식은 이 장이 소스로 확인하지 않았다.
2.1.11 체크포인트·연구 질문·출처
체크포인트:
- 6R 직렬 팔과 평면 사절 링크의 자유도를 그뤼블러 공식으로 구하라. 둘의 $N$, $J$, $f_i$는 무엇인가?
- 평면 사절 링크를 공간 기구($m=6$)로 세면 왜 $-2$가 나오는가? 스크루 행렬의 계수로 어떻게 바로잡는가?
- 델타 로봇의 $M=15$ 중 플랫폼에 나타나는 자유도는 몇이며, 어떤 계산으로 확인했는가?
- 베넷 링크가 1자유도로 움직이는 조건과, 조건을 어기면 무슨 일이 생기는가?
연구 질문:
- 임의의 기구에서 순간 모빌리티와 유한 모빌리티가 같아지는 조건을 허용치를 포함한 수치 판정으로 다룰 수 있는가(Müller의 고차 해석과 수치 계수의 연결)?
- 폐루프를 포함한 모델(URDF·SDF·MJCF)의 자유도를 자동 점검하는 도구의 표준 형식은 무엇이어야 하는가?
1차 출처(조회 2026-11-03).
- K. M. Lynch, F. C. Park, Modern Robotics: Mechanics, Planning, and Control, Cambridge University Press, 2017(ISBN 9781107156302). 사전 인쇄본 2017-05-03판 2장을 읽었다.
- G. Gogu, "Mobility of mechanisms: a critical review," Mechanism and Machine Theory 40(9), 1068–1097, 2005, doi:10.1016/j.mechmachtheory.2004.12.014 — 서지만 확인.
- E. Baker, "An analysis of the Bricard linkages," Mechanism and Machine Theory 15(4), 267–286, 1980, doi:10.1016/0094-114x(80)90021-x — 서지만 확인.
- A. Müller, "Local kinematic analysis of closed-loop linkages—mobility, singularities, and shakiness," Journal of Mechanisms and Robotics 8(4), 2016, doi:10.1115/1.4032778 — 서지만 확인.
ros/urdfdom_headersinclude/urdf_model/joint.h,gazebosim/sdformatsdf/1.12/joint.sdf, MuJoCo 문서doc/XMLreference.rst·doc/computation/index.rst(GitHub, 조회 2026-11-03), Pinocchio 4.1.0(PyPI 휠 실행).
다음 장. 2.2는 직교·원통·구면·SCARA·다관절·병렬 형상의 매니퓰레이터를 작업공간과 자유도 배치로 비교한다. 이 장의 자유도 계산이 각 형상에 어떻게 적용되는지 이어서 다룬다.