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 PinkIKController

  • Weighted 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 names

  • PinkIKController - implements the BaseController interface using PINK’s solve_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 configuration

  • DampingTask - Velocity minimization for smooth motions

  • RelativeFrameTask - Regulate the pose of one frame relative to another

  • ComTask - Center-of-mass position tracking

  • JointCouplingTask - Coupled revolute joint constraints

  • LinearHolonomicTask - 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 model

  • PositionBarrier - Workspace bounds on frame positions

  • BodySphericalBarrier - 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 SE3 using isaac_sim_position_quaternion_to_se3()

  • Use the SE3 with PINK tasks (e.g., set a FrameTask target)

  • 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: PinkIKController implements the BaseController interface, enabling composition with ControllerContainer, ParallelController, SequentialController, and TrajectoryFollower

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:

Tutorials#