PINK Integration#
This page provides a high-level overview of the PINK integration to the Isaac Sim Motion Generation API. Detailed tutorials for each component are linked at the end of this page.
What is PINK?#
PINK (Python Inverse Kinematics) is an open-source differential inverse kinematics library built on Pinocchio and QP solvers. It formulates IK as a quadratic program (QP) where weighted tasks form the objective and safety constraints form inequalities.
This integration provides access to PINK’s solving capabilities within Isaac Sim:
Differential IK Controller: Reactive, closed-loop end-effector tracking via
PinkIKControllerWeighted Multi-Task IK: Combine frame tracking, posture regularization, velocity damping, and more
Safety Constraints: Joint position limits, velocity limits, and control barrier functions (self-collision, workspace bounds)
QP Solver Selection: Choose from multiple QP backends (
osqp,clarabel, etc.)
The integration is built around two main classes:
PinkRobot- encapsulates the Pinocchio model, data, and controlled joint namesPinkIKController- implements theBaseControllerinterface using PINK’ssolve_ik
Key Architectural Principles#
Reactive Differential IK#
PINK solves differential inverse kinematics: on each control step it computes a joint velocity that steers the robot
toward achieving all tasks at best. The velocity is integrated to produce target joint positions. This makes it a
reactive controller (like cuMotion’s RMPflow), not a motion planner. For trajectory planning, use the cuMotion
integration or compose PINK-solved waypoints with the Motion Generation API’s Path and Trajectory interfaces.
Extensible Task System#
PINK provides a rich set of task types that can be combined with configurable weights:
FrameTask- End-effector pose tracking (position and orientation)PostureTask- Joint-space regularization toward a preferred configurationDampingTask- Velocity minimization for smooth motionsRelativeFrameTask- Regulate the pose of one frame relative to anotherComTask- Center-of-mass position trackingJointCouplingTask- Coupled revolute joint constraintsLinearHolonomicTask- General linear equality constraints
The PinkIKController manages a FrameTask and optional PostureTask internally, and accepts
arbitrary additional tasks, limits, and barriers through its constructor.
Safety Barriers (Control Barrier Functions)#
PINK supports control barrier functions (CBFs) that enforce safety constraints as QP inequalities:
SelfCollisionBarrier- Minimum distance between collision pairs using the robot’s collision modelPositionBarrier- Workspace bounds on frame positionsBodySphericalBarrier- Minimum distance between two robot frames
Barriers are passed to PinkIKController via the extra_barriers parameter.
Coordinate Frame Conversion#
The integration provides utility functions to convert between Isaac Sim world-frame
coordinates (position + quaternion [w, x, y, z]) and Pinocchio’s SE3 rigid-body transforms.
The general workflow is:
Read a pose from Isaac Sim as
(position, quaternion)Convert to a Pinocchio
SE3usingisaac_sim_position_quaternion_to_se3()Use the
SE3with PINK tasks (e.g., set aFrameTasktarget)If needed, convert results back using
se3_to_isaac_sim_position_quaternion()
Integration with Motion Generation API#
The PINK integration is built on top of the Isaac Sim Motion Generation API, providing:
BaseController Implementation:
PinkIKControllerimplements theBaseControllerinterface, enabling composition withControllerContainer,ParallelController,SequentialController, andTrajectoryFollower
Note
PINK does not implement WorldInterface for external obstacle tracking. Its collision avoidance is
limited to self-collision and workspace barriers. For external obstacle-aware motion, use the cuMotion integration
or combine PINK with cuMotion’s CumotionWorldInterface.
Known Console Messages#
When using the osqp solver backend (the default), the Kit console will display messages like:
[Error] [omni.kit.app._impl] [py stderr]: ...SparseConversionWarning: Converted matrix 'P' of
your problem to scipy.sparse.csc_matrix to pass it to solver 'osqp'...
Despite the [Error] tag, this is not an error. It is a Python warning from the qpsolvers
library advising that dense matrices are being converted to sparse format before being passed to OSQP.
The conversion is handled automatically and has negligible performance impact for typical robot IK problem sizes.
Platform Support#
PINK and Pinocchio pip wheels are currently available for Linux x86_64 only.
Next Steps#
For detailed information on each component, see the following tutorials: