{"library":"pin-pink","title":"Inverse Kinematics for Articulated Robot Models (pink)","description":"Pink (pin-pink) is a Python library for inverse kinematics (IK) of articulated robot models, built upon the Pinocchio robotics framework. It provides a flexible task-based IK solver, allowing users to define various objectives (e.g., end-effector tracking, joint limits, velocity control) that are resolved using a quadratic program (QP). The current version is 4.1.0, and it maintains an active development cycle with several releases per year.","language":"python","status":"active","last_verified":"Mon May 18","install":{"commands":["pip install pin-pink"],"cli":null},"imports":["from pink import solve_ik","from pink.tasks import FrameTask","from pink.tasks import JointVelocityTask","from pink.tasks import RollingTask","from pink.tasks import RelativeFrameTask","from pink.exceptions import PinkError","from pink.exceptions import NoSolutionFound","from pink.limits import FloatingBaseVelocityLimit","from pink.limits import JointLimit"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import numpy as np\nimport pinocchio as pin\nfrom pink import solve_ik\nfrom pink.tasks import FrameTask\n\n# 1. Load a sample robot model from Pinocchio\nmodel = pin.buildSampleModelManipulator()\nrobot = pin.RobotWrapper(model)\n\n# 2. Initial configuration (q0 is usually the home configuration)\nq = robot.q0\n\n# 3. Define tasks\n# Target an end-effector frame (e.g., the last frame in the model)\ntip_name = robot.model.frames[-1].name\ntip_id = robot.model.getFrameId(tip_name)\n\n# Get initial end-effector pose\nrobot.data = robot.model.createData()\npin.framesForwardKinematics(robot.model, robot.data, q)\ninitial_tip_pose = robot.data.oMf[tip_id].copy()\n\n# Define a target pose: move the tip 10cm upwards from its initial position\ntarget_pose = initial_tip_pose.copy()\ntarget_pose.translation += np.array([0.0, 0.0, 0.1])\n\n# Create a FrameTask to track the target pose\ntask = FrameTask(\n    tip_name,\n    lm_damping=1e-6 # Levenberg-Marquardt damping for stability\n)\ntask.set_target(target_pose)\n\ntasks = [task]\n\n# 4. Solve IK iteratively\ndt = 0.001  # Integration timestep\nnum_iterations = 500\nsolution_found = False\n\nprint(f\"Starting IK for {tip_name} to reach target position: {target_pose.translation}\")\n\nfor i in range(num_iterations):\n    try:\n        # Solve for joint velocities to achieve tasks\n        velocity = solve_ik(robot.model, robot.data, q, tasks, dt)\n    except Exception as e:\n        # print(f\"IK failed at iteration {i}: {e}\")\n        break\n\n    # Integrate joint velocities to update configuration\n    q = pin.integrate(robot.model, q, velocity * dt)\n\n    # Update forward kinematics for error calculation\n    pin.framesForwardKinematics(robot.model, robot.data, q)\n    current_tip_pose = robot.data.oMf[tip_id]\n\n    # Calculate position error\n    error = np.linalg.norm(current_tip_pose.translation - target_pose.translation)\n\n    if error < 1e-4: # Tolerance for reaching target\n        solution_found = True\n        # print(f\"Target reached in {i+1} iterations. Final error: {error:.6f}\")\n        break\n\nassert np.linalg.norm(current_tip_pose.translation - target_pose.translation) < 1e-3, \\\n    \"IK did not converge to target position within tolerance.\"\nprint(\"IK Quickstart Example: Success!\")","lang":"python","description":"This example demonstrates how to use `pin-pink` to perform inverse kinematics for a simple manipulator robot. It loads a sample robot model, defines an end-effector tracking task to move it to a target position, and then iteratively solves for joint velocities to reach that target.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-18","installed_version":"4.0.0","pypi_latest":"4.2.0","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":50,"avg_install_s":13.4,"avg_import_s":0.94,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pin-pink","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pin-pink","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":13.2,"import_time_s":null,"mem_mb":null,"disk_size":"602M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pin-pink","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pin-pink","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":13.2,"import_time_s":null,"mem_mb":null,"disk_size":"616M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pin-pink","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pin-pink","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":12.7,"import_time_s":null,"mem_mb":null,"disk_size":"602M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pin-pink","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pin-pink","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"broken","install_time_s":12.7,"import_time_s":null,"mem_mb":null,"disk_size":"601M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pin-pink","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pin-pink","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":15.4,"import_time_s":0.94,"mem_mb":19.6,"disk_size":"610M"}]}}