pink-kinematics/pink
Python inverse kinematics using Pinocchio and QP solvers
Pink – Pinocchio 기반 Python 역운동학
무엇인가요 – Pink은 아티큘레이티드 로봇(팔, 히ュ먼로이드, 4족 보행 로봇, 바퀴 기반 로봇 등)의 미분 역운동학(IK)을 계산할 수 있는 Python 라이브러리입니다. 고수준의 작업 사양(예: "발을 이 지점에 놓기", "몸통을 수직으로 유지하기")을 2차 계획 문제로 변환하여 관절 제한과 선택적 속도 제한을 준수하는 관절 공간 속도를 산출합니다.
왜 중요한가요 – 역운동학은 로봇 제어의 핵심 요소입니다. Pink은 깔끔한 작업 중심 API, 자동적 자코비안 처리, 빠른 QP 솔버(기본값 quadprog)를 제공합니다. 신뢰성 있는 Pinocchio 강체 역학 엔진을 재사용하므로, 저수준 수학을 직접 작성하지 않고도 정확한 운동학을 얻을 수 있습니다.
빠른 시작
# 권장: conda (컴파일된 Pinocchio 바인딩 제공)
conda install -c conda-forge pink
# 또는 PyPI를 통해
pip install pin-pink
import pink
from pink.tasks import FrameTask, PostureTask
from pink.limits import FloatingBaseVelocityLimit
from robot_descriptions.loaders.pinocchio import load_robot_description
import numpy as np, time
# 로봇 모델(URDF) 로드 – 여기서는 "upkie" 히ュ먼로이드
robot = load_robot_description("upkie_description")
conf = pink.Configuration(robot.model, robot.data, robot.q0)
# 작업 정의 (위치/자세 비용은 선택 사항)
tasks = {
"base": FrameTask("base", position_cost=1.0, orientation_cost=1.0),
"left_contact": FrameTask("left_contact", position_cost=[0.1,0,0.1]),
"right_contact": FrameTask("right_contact", position_cost=[0.1,0,0.1]),
"posture": PostureTask(cost=1e-3),
}
# 타겟 포즈 설정 (예시 값)
tasks["posture"].set_target([
1.0, 0.0, 0.0, 0.0, # 부유 기반 쿼터니언
0.0, 0.0, 0.0, # 부유 기반 위치
0.0, 0.2, 0.0, 0.0, -0.2, 0.0 # 관절 각도
])
# 현재 로봇 자세에서 프레임 작업 초기화
for name, task in tasks.items():
if isinstance(task, FrameTask):
task.set_target(conf.get_transform_frame_to_world(name))
# 선택 사항: 부유 기반 휠 제한
fb_limit = FloatingBaseVelocityLimit(
conf.model,
base_frame="base_link",
max_linear_velocity=[0.3, 0.3, 0.2],
max_angular_velocity=[1.0, 1.0, 1.0],
)
conf.model.floating_base_velocity_limit = fb_limit
# 단순한 미분-IK 루프 실행
dt = 6e-3
for _ in np.arange(0.0, 2.0, dt):
vel = pink.solve_ik(conf, tasks.values(), dt, solver="quadprog")
conf.integrate_inplace(vel, dt)
time.sleep(dt)
이 루프는 속도 출력을 통합하여 제한을 준수하면서 정의된 작업 타겟으로 로봇을 이동시킵니다.
핵심 개념
| 개념 | Pink의 구현 방식 |
|---|---|
| 작업 정의 | 각 작업은 잔차 함수 $e(q)$와 자코비안 $J_e(q)$를 제공합니다. 비용(가중치)은 잔차를 정규화된 2차 목적 함수로 변환합니다. |
| 가중치가 있는 다중 작업 IK | 모든 작업 비용을 합산하며, 충돌은 부여한 상대적 가중치에 의해 해결됩니다(예: 발 위치에 높은 비용, 자세에 낮은 비용). |
| 2차 계획 | 속도 제약이 있는 문제 $\min_v \sum |J_e v + \alpha e|^2_{W_e}$는 QP 솔버(quadprog 기본값)에 전달됩니다. |
| 속도 제한 | 관절별 제한은 Pinocchio 모델에서 가져오며, 부유 기반 제한은 FloatingBaseVelocityLimit로 연결할 수 있습니다. |
| 미분(1차) 접근법 | Pink은 한 시간 단계 내에서 잔차를 줄일 수 있는 관절 공간 속도 $v$를 계산합니다. 이 단계를 반복하면 국소 최적 구성으로 수렴합니다. |
Pink로 할 수 있는 일
- 전신 제어 – 히ュ먼로이드(예: Draco 3, Upkie) – 균형, 발 위치, 몸통 방향 조절.
- 팔 조작 – UR5, Panda, 듀얼 암 설정, 선택적 엔드 에펙터 장벽 제약 포함.
- 다리 보행 – 4족 보행 로봇 Go2의 스쿼트, 바퀴 기반 이족 보행 로봇 Upkie의 미끄럼 없는 굴림.
- 충돌 회피 – 장벽 함수 통합(예: barriers 예제 참조)을 통해 팔다리가 자가 충돌하지 않도록 함.
- 사용자 정의 로봇 –
robot_descriptions를 통해 임의의 URDF를 로드하고 즉시 작업을 정의 가능. - 빠른 프로토타이핑 – 고수준 API로 연구자들은 저수준 자코비안 코드를 다루지 않고도 새로운 작업 정식화나 비용 스케줄을 실험할 수 있음.
문서 및 커뮤니티
- API 참조 – https://pink-kinematics.github.io/pink/
- 예제 – 팔, 듀얼 암, 히ュ먼로이드, 모바일 베이스, 사용자 정의 URDF 로드를 포함하는 풍부한
examples/폴더. - 토론 – FAQ 및 설계 토론은 GitHub의 Discussions 탭에 존재(예: 글로벌 IK vs. 미분 IK).
- 기여 – 가이드라인은
CONTRIBUTING.md에 있으며, 로봇 공학 경험 있는 누구나 버그 보고 및 PR을 환영합니다.
라이선스 및 인용
- 라이선스: Apache-2.0 (허용성 높고 상용 이용에 적합).
- 인용: 바로 복사 가능한 BibTeX 항목 제공; 기여한 경우 이름을 추가하세요.
결론 – Pink은 Pinocchio 호환 로봇 모델에 대해 수학적으로 타당하고 사용하기 쉬운 다중 작업 역운동학을 해결할 수 있는 Python 개발자용 도구를 제공하며, 연구, 시뮬레이션, 프로토타입 제어 코드에 유용합니다.
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트