AEGLOSLAB 로봇공학 전서(全書)

제2부 기구학

2.7 기구학 소프트웨어와 IK 솔버: KDL·TRAC-IK·IKFast·mink·cuRobo — 성공률·속도·충돌 회피 비교

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

이 장은 로봇 기구학을 계산하는 공개 소프트웨어를 풀이 방식으로 분류하고, 실행할 수 있는 도구를 같은 문제에서 측정해 비교한다. KDL의 뉴턴-랩슨 풀이기, 뉴턴과 SQP를 병행하는 TRAC-IK, 코드 생성기 IKFast와 부분 문제 분해 풀이기 IK-Geo, QP 기반 차분 IK 라이브러리 mink·Pink, GPU 병렬 라이브러리 cuRobo의 설계를 읽은 범위에서 정리하고, 실행 가능한 TRAC-IK·mink·Pink·SciPy·IK-Geo를 UR5와 Franka Research 3에서 성공률과 호출 시간으로 비교한다. 해석적·수치적 풀이의 원리는 2.5·2.6에서 다루었다.

배우는 것:

  • 풀이 방식의 분류 — 해석적(IKFast·IK-Geo), 뉴턴 계열(KDL), 하이브리드(TRAC-IK), QP 차분 IK(mink·Pink), GPU 병렬(cuRobo).
  • 성공의 정의와 측정 프로토콜 — 도달 가능한 목표, 허용치, 시드, 시간 제한이 결과를 정하는 방식.
  • 측정 결과 — 같은 URDF에서 TRAC-IK 99 % 이상, 차분 IK 반복 53~88 %, 해석적 풀이 호출 8 μs라는 측정과 그 해석.
  • 충돌 회피의 위치 — 소스와 README가 서술하는 충돌 처리, 그리고 이 장이 측정하지 않은 것.

선수 지식: 2.3(DH)·2.4(지수곱), 2.5(해석적 IK), 2.6(수치 IK). 표기는 BK-05와 A.2을 따른다.

특히 중요한 독자: 로봇 팔의 IK 라이브러리를 고르는 시스템 설계자, 도달성 점검·모션 계획에 IK를 사용하는 소프트웨어 개발자, 솔버 벤치마크를 설계하는 연구자.

출처 방침. 기준 시점은 2026-11-03이다. 직접 읽은 자료: ① traclabs/trac_ik의 README.md(master; 알고리즘 설명과 자체 보고한 벤치마크 표)와 trac_ik_lib/package.xml(v1.6.7, 라이선스 BSD), ② orocos/orocos_kinematics_dynamics의 chainiksolverpos_nr.hpp·chainiksolverpos_nr_jl.hpp·package.xml(LGPL-2.1-or-later), ③ kevinzakka/mink·stephane-caron/pink의 README.md와 LICENSE(둘 다 Apache 2.0), ④ rpiRobotics/ik-geo의 README.md·LICENSE(BSD 3조항)와 chenhaox/pytracik의 README.md, ⑤ NVlabs/curobo의 README.md(Apache 2.0), ⑥ rdiankov/openrave의 IKFast 소스(2.5과 같은 출처), ⑦ PyPI 메타데이터. 서지는 Crossref 응답으로 확인했다(Beeson·Ames 2015, Elias·Wen 2025). 실행한 것: pytracik 0.0.4(TRAC-IK 바인딩), mink 1.4.0(MuJoCo 3.17.0), Pink 4.4.0(Pinocchio 4.1.0), SciPy 1.18.1, ik-geo 1.0.3. 실행하지 못한 것: KDL 단독(PyKDL의 PyPI 휠이 Python 2.7·3.6용뿐), IKFast(코드 생성 도구), cuRobo(CUDA 컴파일러 nvcc가 없어 빌드하지 못했다). 이 장의 수치는 모두 이 장의 측정이며, README의 수치는 (공개 주장치)로 구분했다.

2.7.2 개념 — 기구학 소프트웨어가 하는 일

기구학 소프트웨어는 로봇 기술(URDF·MJCF·DH 표)을 읽어 순기구학과 자코비안을 계산하고, 목표 자세에서 관절값을 구하는 역기구학 풀이기를 제공한다. 풀이기는 네 가지로 갈린다. 풀이 방식(해석적·뉴턴·최적화·QP), 해의 수(모든 해 대 하나), 제약의 지원(관절 한계·충돌), 실행 환경(CPU·GPU, 언어)이다. 이 차이가 성공률과 시간, 쓰임새를 정한다.

결론부터 적으면 다음과 같다. 이 장의 측정에서 TRAC-IK는 목표 1,000개에서 99.4~99.9 %를 호출당 0.3~0.6 ms에 풀었다. 차분 IK 도구는 같은 문제에서 반복 100회 상한으로 53~88 %(mink 53~80 %, Pink 61~88 %), SciPy의 경계 있는 최소제곱은 42~88 %였다. 해석적 풀이기 IK-Geo는 UR5 자체 모델에서 호출당 8 μs에 해 집합을 모두 냈다. 이 비교는 풀이기의 설계 용도가 다르다는 점(전역 풀이, 연속 추종, 모든 해)을 감안해 읽어야 한다.

2.7.3 원리

2.7.3.1 풀이 방식의 분류

해석적 닫힌 형식 IKFast·IK-Geo UR 전용 풀이 뉴턴 계열 유사역행렬 반복 KDL NR(·JL) RTB·MR 하이브리드 뉴턴·재시작 + SQP 병행 TRAC-IK QP 차분 IK 제약 QP mink·Pink 충돌 예제(mink) GPU 병렬(cuRobo): IK·충돌 검사·궤적 최적화를 GPU에서 병렬로
IK 소프트웨어의 풀이 방식 분류. 해석적(IKFast·IK-Geo), 뉴턴 계열(KDL), 하이브리드(TRAC-IK), QP 차분 IK(mink·Pink), GPU 병렬(cuRobo)이다. 설명은 소스·README를 읽은 범위이다.
  • 해석적. 구조를 이용한 닫힌 형식(2.5). IKFast는 사슬에서 닫힌 형식의 C++를 생성하고, IK-Geo는 부분 문제 분해로 6R의 운동학 족(세 축이 교차하거나 평행한 구조)을 닫힌 형식으로 풀며 일반 6R은 1차원·2차원 탐색으로 푼다고 README가 서술한다. UR 전용 풀이도 있다(2.5).
  • 뉴턴 계열. KDL의 ChainIkSolverPos_NR은 뉴턴-랩슨 반복으로 일반 KDL::Chain의 IK를 계산하며 반복 횟수 기본 100, 허용 오차 기본 $10^{-6}$이다. ChainIkSolverPos_NR_JL은 관절 한계를 반영한다.
  • 하이브리드. TRAC-IK는 두 구현을 동시에 실행한다. 하나는 KDL의 뉴턴 기반 수렴에 관절 한계로 생기는 지역 극소를 감지해 무작위로 점프하는 확장이고, 다른 하나는 준뉴턴법을 사용하는 SQP 비선형 최적화이다. 둘 중 하나가 수렴하면 즉시 반환하는 것이 기본이다(README).
  • QP 차분 IK. mink(MuJoCo 기반)와 Pink(Pinocchio 기반)는 과제(목표 자세)·한계(부등식)·구속(등식)을 받아 매 단계의 속도를 QP로 푼다. Pink의 README는 문제를 $\min_v \sum\lVert J_e(q)v+\alpha e(q)\rVert^2_{W_e}$, $v_{\min}\le v\le v_{\max}$로 사용한다.
  • GPU 병렬. cuRobo는 CUDA로 가속한 모션 생성 라이브러리로 순·역기구학, 충돌 검사, 궤적 최적화를 GPU에서 병렬로 계산한다(README). 이 장은 실행하지 못했다.

2.7.3.2 성공의 정의와 측정 프로토콜

TRAC-IK의 README가 자체 보고한 벤치마크의 프로토콜은 다음과 같다. 도달 가능한 관절 구성 10,000개를 무작위로 만들고, 6차원 자세 IK를 위치·자세 오차 $10^{-5}$로 요구하며, 최대 풀이 시간 5 ms, 시드는 관절 한계의 중간 자세이다. 시간에는 실패한 시행도 포함된다. 이 프로토콜의 요점은 도달 가능성이 보장된 목표(관절각에서 순기구학으로 만든 자세)를 사용한다는 것이다. 이 장은 같은 구조를 따른다.

  • 목표: 관절 한계 안의 임의 관절각 1,000개를 순기구학으로 보낸 자세(시드 50).
  • 시드: ① 관절 한계의 중간 자세(UR5는 $0$, FR3는 구간 중점), ② 한계 안의 임의 시드.
  • 성공: 위치 오차 $<10^{-4}$ m, 자세 오차 $<10^{-4}$ rad이고 관절 한계 안(2.6와 같은 판정).
  • 시간: 파이썬에서 호출 한 번의 벽시계 시간. 성공·실패를 모두 포함한다. 첫 호출은 예열로 제외했다.

2.7.3.3 충돌 회피

TRAC-IK의 README는 KDL과 TRAC-IK 모두 해가 자기 충돌을 일으키는지 판정하는 데 메시 정보를 사용하지 않으며, 해는 링크 거리와 관절 범위만 다루고 부피에 따른 자기 충돌은 판정하지 않는다고 적는다. mink의 README는 UR5e 충돌 회피 예제를 갤러리에 싣는다(그림 설명만 읽었으며 충돌 처리 방식은 확인하지 못했다 (확인 필요)). cuRobo는 충돌 검사를 GPU 병렬로 포함한다고 서술한다. 이 장은 충돌 회피를 측정하지 않았다. 충돌 검사의 알고리즘은 11.2에서 다룬다.

2.7.3.4 시간의 의미

호출 시간은 풀이기의 계산 시간에 파이썬 바인딩의 호출 오버헤드와 이 장의 반복 루프(차분 IK의 파이썬 반복)가 더해진 값이다. TRAC-IK는 컴파일된 C++에서 병렬 스레드를 돌리고 시간 제한 5 ms 안에 반환하며, mink·Pink는 반복마다 파이썬에서 QP를 만들어 푼다. 같은 알고리즘이어도 구현 언어와 반복 수에 따라 시간이 크게 달라지므로 시간 비교는 "이 설정에서의 값"으로 읽는다.

2.7.4 알고리즘

측정 절차는 다음과 같다.

  1. 로봇의 수정 DH 표(2.3·2.4)에서 URDF를 만든다(2.3.3.5의 환산, 관절 axis는 $z$). UR5는 한계 $\pm2\pi$, Franka Research 3은 공식 문서의 한계(2.6)로 둔다.
  2. 한계 안의 임의 관절각 $q_0$로 목표 $T_g=\mathrm{FK}(q_0)$를 만든다.
  3. 풀이기마다 같은 목표·시드로 호출해 해 $q$를 얻는다. 차분 IK는 매 반복마다 속도를 구해 적분하고 오차가 $10^{-5}$ 미만이면 멈춘다(최대 100회).
  4. 해의 순기구학 오차와 관절 한계를 이 장의 판정으로 확인해 성공을 센다.
  5. 호출 시간을 기록한다(성공·실패 포함).

2.7.5 풀이 예제 — 같은 URDF에서 성공률과 호출 시간

UR5와 Franka Research 3의 URDF를 수정 DH 표에서 만들어 TRAC-IK·mink·Pink·SciPy를 같은 목표·시드에서 측정하고, IK-Geo를 자체 UR5 모델에서 따로 측정했다. 결론부터 적으면 다음과 같다. ① TRAC-IK는 네 조건 모두 99.4~99.9 %이고 평균 0.34~0.59 ms이다. ② Pink는 중앙 시드에서 86.4 %(UR5)·88.2 %(FR3), 임의 시드에서 67.2 %·61.4 %이고 평균 2.6~6.8 ms이다. ③ mink는 53.4~79.6 %이고 평균 4.1~8.4 ms이다. ④ SciPy의 경계 있는 최소제곱은 42.1~88.3 %이고 평균 18~96 ms이다. ⑤ 모든 방법에서 중앙 시드가 임의 시드보다 성공률이 같거나 높았다. ⑥ IK-Geo는 UR5 모델에서 1,000개 자세 모두에서 원래 관절각을 포함한 해 집합을 평균 7.16개로 냈고 호출당 8.2 μs이다.

구현. 하네스 pose_err·bench와 풀이기별 어댑터(make_solvers)는 스크립트에 있다. 측정은 격리 가상환경(Python 3.12)에서 2.7-bench.py로 수행했고 결과는 robotics/fig-src/data/2.7-bench.json에 저장했다.

항목값
입력 1UR5(UR 문서의 표준 DH 표를 수정 DH로 환산, 2.3)와 Franka Research 3(Craig 관례 DH 표의 7관절, 플랜지는 제외하고 링크 7 좌표계가 목표, 2.4). URDF의 관절 axis는 $z$, 한계는 UR5 $\pm2\pi$, FR3 공식 표(2.6)
입력 2목표: 한계 안의 임의 관절각 1,000개의 순기구학(시드 50). 시드: 한계 중간 자세, 또는 한계 안의 임의 시드 1,000개(시드 51)
입력 3TRAC-IK: pytracik 0.0.4, solver_type='Speed', 제한 시간 5 ms, 허용 $10^{-5}$
입력 4mink 1.4.0: FrameTask(위치·자세 비용 1, LM 감쇠 $10^{-3}$)와 ConfigurationLimit, DAQP, $dt=1$, 감쇠 $10^{-6}$, 반복 100회
입력 5Pink 4.4.0: FrameTask(같은 설정), quadprog, $dt=1$, 감쇠 $10^{-6}$, 반복 100회
입력 6SciPy 1.18.1 least_squares(trf, 관절 경계, 최대 함수 평가 100회), 잔차는 위치 차와 회전 벡터
입력 7IK-Geo: ik-geo 1.0.3의 내장 Robot.ur5()(자체 DH 값)에서 임의 관절각 1,000개의 순기구학으로 만든 자세
def pose_err(T, Tg):
    """위치 오차(m)와 자세 오차(rad)"""
    dp = float(np.linalg.norm(T[:3, 3] - Tg[:3, 3]))
    c = (np.trace(Tg[:3, :3] @ T[:3, :3].T) - 1) / 2
    return dp, math.acos(max(-1.0, min(1.0, c)))

def bench(solve, fk, targets, seeds, lo, hi, tol=1e-4):
    """solve(Tg, seed) -> q 또는 None. 반환: 성공률,
    평균·중앙값 시간(ms). 성공: 위치·자세 오차 < tol, 한계 안"""
    ok, ts = 0, []
    for (q0, Tg), s in zip(targets, seeds):
        t0 = time.perf_counter()
        q = solve(Tg, s)
        ts.append(time.perf_counter() - t0)
        if q is not None:
            dp, da = pose_err(fk(q), Tg)
            inl = all(l - 1e-9 <= x <= h + 1e-9
                      for x, l, h in zip(q, lo, hi))
            ok += int(dp < tol and da < tol and inl)
    ts.sort()
    n = len(ts)
    return ok / n, 1e3 * sum(ts) / n, 1e3 * ts[n // 2]

① 성공률과 호출 시간. 칸의 값은 성공률 · 평균 호출 시간이다(목표 1,000개, 성공은 위치·자세 오차 $<10^{-4}$이고 한계 안).

풀이기UR5 중앙 시드UR5 임의 시드FR3 중앙 시드FR3 임의 시드
TRAC-IK(Speed, 5 ms)99.9 % · 0.34 ms99.8 % · 0.38 ms99.7 % · 0.49 ms99.4 % · 0.59 ms
mink + DAQP(반복 100회)69.1 % · 5.61 ms55.3 % · 6.50 ms79.6 % · 4.12 ms53.4 % · 8.37 ms
Pink + quadprog(반복 100회)86.4 % · 3.29 ms67.2 % · 6.41 ms88.2 % · 2.62 ms61.4 % · 6.79 ms
SciPy least_squares(trf, 경계)88.3 % · 17.76 ms61.6 % · 23.67 ms77.5 % · 59.64 ms42.1 % · 96.28 ms
0 20 40 60 80 100 TRAC-IK 99.9 99.8 99.7 99.4 mink 69.1 55.3 79.6 53.4 Pink 86.4 67.2 88.2 61.4 SciPy 88.3 61.6 77.5 42.1 성공률 (%) UR5 중앙 시드 UR5 임의 시드 FR3 중앙 시드 FR3 임의 시드
같은 목표 1,000개·같은 시드에서 풀이기별 성공률(위치·자세 오차 $<10^{-4}$이고 관절 한계 안). 중앙 시드는 한계의 중간 자세, 임의 시드는 한계 안의 임의 구성이다.
0.1 1 10 100 1000 0 25 50 75 100 호출 한 번의 평균 시간 (ms) 성공률 (%) TRAC-IK mink Pink SciPy
호출 한 번의 평균 시간(로그 눈금)과 성공률의 평면. 풀이기마다 네 조건(UR5·FR3 × 중앙·임의 시드)의 점이다. 시간은 파이썬 바인딩과 반복 루프를 포함한 값이다.

TRAC-IK는 모든 조건에서 99 % 이상으로, 시드가 임의여도 성공률이 거의 줄지 않는다. 뉴턴 단계의 지역 극소에서 무작위 점프와 SQP가 빠져나오기 때문이다(README의 설명). 반면 mink·Pink·SciPy는 한 번의 시작점에서 반복하는 구조이므로 임의 시드에서 성공률이 크게 떨어졌다(UR5: Pink 86.4→67.2 %, mink 69.1→55.3 %, SciPy 88.3→61.6 %). 이 측정에서 가장 큰 차이는 알고리즘 구성(재시작·SQP 병행 대 단일 시작)이다. mink·Pink는 연속 추종에 사용하도록 만들어졌고 이 장은 독립 목표에 단일 시작·100회 상한으로 쓴 것이므로 설계 용도의 평가가 아니다. 이 설정에서 감쇠·$dt$·반복 수를 조정하지 않았고 조정하면 값이 달라진다.

② 자체 보고 값과의 비교. TRAC-IK의 README(v1.5.1, 목표 10,000개, 오차 $10^{-5}$, 시간 제한 5 ms, 중간 자세 시드, (공개 주장치))는 다음 값을 적는다.

로봇KDLKDL-RR(관절 한계 처리를 고친 변형)TRAC-IK
UR5(6자유도)16.52 % · 4.21 ms88.58 % · 0.74 ms99.17 % · 0.37 ms
Franka Emika Panda(7자유도)62.02 % · 2.11 ms93.21 % · 0.79 ms99.88 % · 0.37 ms

이 장의 TRAC-IK(UR5 중앙 시드 99.9 %, 0.34 ms; FR3 99.7 %, 0.49 ms)는 README와 같은 범위이다. 다만 판정 허용치(이 장 $10^{-4}$), 로봇 모델(Panda 대 FR3), 바인딩 버전(pytracik 0.0.4)이 다르므로 직접 비교하지 않는다. README의 KDL 열(UR5 16.5 %)은 KDL의 뉴턴 단일 시작이 관절 한계와 특이점 근처에서 약하다는 서술과 맞고, 이 장은 KDL을 실행하지 못해 재현하지 못했다.

③ 해석적 풀이기. IK-Geo는 UR5 자체 모델에서 해석적으로 모든 해를 구한다.

항목값
시험한 자세 수1000
정확한 해 집합에 원래 관절각이 있는 비율100.0 %
호출 한 번의 평균 시간 / 중앙값8.2 μs / 8.2 μs
정확한 해의 평균 개수7.16

호출당 8.2 μs로 TRAC-IK(0.34 ms)보다 약 40배 빠르고, 모든 해를 한꺼번에 낸다. 정확한 해의 평균이 7.16개인 것은 일부 자세에서 해가 8개보다 적기 때문이다(2.5의 분기). 이 모델은 IK-Geo 내장 UR5이므로 위 URDF의 UR5와 기준 좌표와 치수가 조금 다르다(내장 UR5의 순기구학은 이 장의 DH 곱과 기준 좌표의 방향이 다르고 치수가 $10^{-4}$ m 이하로 다르다). 해석적 풀이기는 구조가 맞는 로봇에만 쓸 수 있다.

④ 실행하지 못한 것. KDL 단독은 PyKDL의 PyPI 휠이 Python 2.7·3.6용뿐이어서 실행하지 않았고, IKFast는 코드 생성 도구이므로 이 장은 소스와 문서만 읽었다. cuRobo는 이 기계에 GPU(NVIDIA GeForce RTX 4060 Ti)가 있으나 CUDA 컴파일러 nvcc가 없어 빌드하지 않았다. cuRobo의 README는 v2에서 공개 API가 바뀌었으며 v1은 v0.7.8 태그에 고정하라고 적는다.

한계. 측정은 목표 1,000개·시드 50의 한 번의 실행이다(성공률 50 %에서 95 % 신뢰 구간은 약 $\pm3$ %p, 99 %에서는 약 $\pm0.6$ %p). 시간은 이 기계(다른 작업이 함께 도는 공유 환경)와 파이썬 바인딩 오버헤드를 포함한다. 충돌·여유자유도의 보조 과제·모든 해 수집·속도 한계는 측정하지 않았다. 성공은 도달 가능한 목표에 한정한다(도달 불가능 목표의 거동은 보지 않았다). 풀이기 설정은 기본에 가깝게 두었고 최적 조정을 하지 않았다.

견해: 독립 목표의 IK(도달성 점검, 모션 계획의 목표 구성)에는 재시작·SQP를 갖춘 풀이기(TRAC-IK류)를 기본으로 두고, 연속 추종·우선순위 제어에는 QP 차분 IK(mink·Pink류)를, 구조가 맞는 산업 로봇에는 해석적 풀이기를 우선 검토하는 것을 기본으로 둔다고 본다. 근거는 이 장의 측정에서 TRAC-IK가 임의 시드에서도 99 % 이상이었고 단일 시작 반복은 53~88 %였으며 해석적 풀이기가 호출당 8 μs로 가장 빨랐다는 점이다. 충돌 회피나 여러 과제의 우선순위가 지배하는 응용에서는 이 판단이 달라질 수 있다.

2.7.6 설계 트레이드오프 — IK 소프트웨어의 선택

공개 문헌에서 확인되는 선택지는 다섯 가지이다.

  • ① 해석적 풀이기(IKFast·IK-Geo·UR 전용). 가장 빠르고 모든 해를 낸다.
  • ② 뉴턴 계열(KDL). 단순하고 널리 사용되지만 관절 한계와 지역 극소에 약하다.
  • ③ 하이브리드(TRAC-IK). 재시작과 SQP로 성공률이 높다.
  • ④ QP 차분 IK(mink·Pink). 한계·우선순위·충돌을 제약으로 다루는 연속 추종용이다.
  • ⑤ GPU 병렬(cuRobo). 대량 시드·충돌 검사를 GPU로 처리한다(이 장은 실행하지 못했다).
방식구조 제한해한계·충돌이 장의 측정알맞은 경우
① 해석적있음(구면 손목·평행 축 등)모두해 선택은 후처리IK-Geo 8.2 μs구조가 맞는 산업·협동로봇
② 뉴턴(KDL)없음하나한계는 _JL 변형, 충돌 없음미실행(README 16.5 %, UR5)단순한 도달성, 해 근처 추종
③ TRAC-IK없음하나(선택 모드)한계 처리, 충돌 없음99.4~99.9 %, 0.34~0.59 ms독립 목표 IK, MoveIt
④ mink·Pink없음하나(경로)한계·구속, 충돌은 mink 예제만 확인 (확인 필요)53~88 %(단일 시작)연속 추종·전신 제어
⑤ cuRobo없음다수 시드GPU 충돌 검사미실행대량 IK·충돌 포함 모션 생성

견해: 라이브러리를 고를 때는 성공률 하나가 아니라 "독립 목표인가 연속 추종인가", "충돌을 IK 안에서 다룰 것인가", "구조가 해석적 풀이에 맞는가"를 먼저 정하는 것이 낫다고 본다. 근거는 이 장에서 같은 문제에서 풀이기별 성공률이 53~99 %로 갈렸으나 그 차이가 설계 용도(재시작 대 단일 시작)에서 비롯된다는 점이다.

2.7.7 응용 축 비교

응용 축IK 소프트웨어가 맡는 일요구관련 장
산업·제조오프라인 프로그래밍의 도달성·사이클 타임 점검, 제어기의 해석적 IK모든 해 중 선택, 정확도28.2, 2.10
물류·이동이동 매니퓰레이터·피킹의 대량 IK처리량, 충돌28.9
도로 주행해당하는 고유 요구 없음——
서비스7축 팔의 IK와 모션 계획(MoveIt류)성공률, 충돌15.8, 2.11
의료·헬스케어도구 추종, RCM 제약정밀도, 안전32.14
휴머노이드·범용전신 QP IK(과제 우선순위)실시간 QP2.11
필드해당하는 고유 요구 없음(이동·휴머노이드 행과 같음)——
국방·안보원리 수준에서 해당하는 고유 요구 없음——

이 표는 이 책의 정리이며 장별 요구는 다르다.

2.7.8 관련 규격·프로토콜

소프트웨어저장소·버전라이선스무엇을 하나
KDLorocos/orocos_kinematics_dynamicsLGPL-2.1-or-later(package.xml)기구학·동역학 라이브러리, ChainIkSolverPos_NR(뉴턴-랩슨, 반복 100·허용 $10^{-6}$ 기본)
TRAC-IKtraclabs/trac_ik, trac_ik_lib 1.6.7BSD(package.xml)KDL 위의 뉴턴·SQP 병행 IK, 풀이 유형 Speed·Distance·Manip1·Manip2
pytracikPyPI 0.0.4MIT(README 배지)ROS 없이 사용하는 TRAC-IK 파이썬 바인딩
IKFastrdiankov/openraveikfast.py LGPL 3, ikfast.h Apache 2.0닫힌 형식 IK의 C++ 코드 생성(2.5)
IK-GeorpiRobotics/ik-geo, ik-geo 1.0.3BSD 3조항부분 문제 분해 해석적 IK, 일반 6R은 탐색
minkkevinzakka/mink 1.4.0Apache 2.0MuJoCo 기반 QP 차분 IK
Pinkstephane-caron/pink, pin-pink 4.4.0Apache 2.0Pinocchio 기반 QP 차분 IK
cuRoboNVlabs/curoboApache 2.0CUDA 가속 IK·충돌 검사·궤적 최적화(실행하지 못함)

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

IK 소프트웨어의 선택을 규정하는 법령·인증 요건은 확인하지 못했다. 소프트웨어의 라이선스(LGPL·GPL·Apache·BSD)는 제품 배포 조건에 영향을 주므로 법무 검토 대상이며(27.9·26.20 참고), 안전 관련 소프트웨어의 품질 표준은 26.20이 다룬다. 이 장은 해당 조항을 확인하지 않았다 (확인 필요).

2.7.10 한계·유의점·미해결

  • 측정의 범위. 목표 1,000개·한 번의 실행·두 로봇이다. 다른 로봇이나 허용치에서는 순위가 달라질 수 있다.
  • 설계 용도. mink·Pink는 연속 추종용이며 단일 시작 독립 IK로는 불리하다. 재시작과 조정을 더하면 달라진다.
  • 시간. 파이썬 바인딩과 반복 루프를 포함한 값이며 컴파일된 호출은 더 빠르다.
  • 미실행. KDL 단독·IKFast·cuRobo는 실행하지 못했다. README의 수치는 (공개 주장치)이다.
  • 충돌과 우선순위. 충돌 회피와 여러 과제의 우선순위는 측정하지 않았다.
  • 재현 환경. 라이브러리 버전이 바뀌면 결과가 달라질 수 있다(pytracik 0.0.4는 관절 한계 밖 성공 결과를 고친 버전이라고 README가 적는다).

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

체크포인트:

  1. TRAC-IK가 KDL의 뉴턴 단일 시작보다 성공률이 높은 이유를 README의 두 구현으로 설명하라.
  2. 이 장의 성공 판정에 관절 한계를 포함한 이유와, 한계를 빼면 어떤 풀이기의 성공률이 부풀려지는지 설명하라.
  3. 차분 IK 도구를 독립 목표 IK에 사용할 때 성공률을 올리려면 무엇을 바꾸어야 하는가(재시작, 감쇠, $dt$, 반복 수)?
  4. 해석적 풀이기가 호출당 8 μs인데 TRAC-IK가 0.3 ms인 이유와, 해석적 풀이기를 쓸 수 없는 경우는 무엇인가?

연구 질문:

  • 충돌 회피를 포함한 IK에서 풀이기별 성공률·시간을 공정하게 비교하는 표준 벤치마크는 무엇이어야 하는가?
  • 재시작이 있는 QP 차분 IK와 TRAC-IK의 성공률·시간 곡선은 같은 시간 예산에서 어떻게 다른가?

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

  • P. Beeson, B. Ames, "TRAC-IK: An open-source library for improved solving of generic inverse kinematics," Proc. IEEE-RAS Humanoids, 928–935, 2015, doi:10.1109/humanoids.2015.7363472 — 서지만 확인. 알고리즘과 자체 보고 값은 traclabs/trac_ik의 README에서 읽었다.
  • A. Elias, J. T. Wen, "IK-Geo: Unified robot inverse kinematics using subproblem decomposition," Mechanism and Machine Theory 209, 105971, 2025, doi:10.1016/j.mechmachtheory.2025.105971 — 서지만 확인.
  • orocos/orocos_kinematics_dynamics, traclabs/trac_ik, chenhaox/pytracik, kevinzakka/mink, stephane-caron/pink, rpiRobotics/ik-geo, NVlabs/curobo, rdiankov/openrave(GitHub, 소스·README·LICENSE).
  • pytracik 0.0.4, mink 1.4.0, pin-pink 4.4.0, ik-geo 1.0.3(PyPI, 실행), MuJoCo 3.17.0, Pinocchio 4.1.0, SciPy 1.18.1.

다음 장. 2.8은 미분 기구학을 다룬다. 이 장의 IK 풀이기가 공통으로 사용하는 자코비안(기하·해석, 물체·공간 좌표)을 정의하고 시간미분(가속도 수준)까지 이어서 다룬다.