Skip to content

Releases: stephane-caron/pink

v4.2.0

20 Apr 09:48

Choose a tag to compare

This release adds the ManipulabilityTask contributed by @danielsanjosepro 👍

It also corrects the G1 humanoid example with a fix provided by @nmarticorena.

Added

  • Task: Add ManipulabilityTask to maximize manipulability of a manipulator (thanks to @danielsanjosepro)
  • examples: Add Panda manipulability comparison example
  • examples: Add planar 2-DOF manipulability example
  • examples: Visualize current and designed center-of-mass positions in Humanoid G1 example (thanks to @nmarticorena)

Fixed

  • examples: Fix numerical behavior of Humanoid G1 example (thanks to @nmarticorena)

v4.1.0

11 Mar 16:38

Choose a tag to compare

This release adds Viser visualization and an example using it to tune the tasks of a 7-DoF manipulator, contributed by @danielsanjosepro 👍

2026-02-15.17-48-35.mp4

Added

  • Task: Add orientation_cost property to the frame task (thanks to @danielsanjosepro)
  • Task: Add position_cost property to the frame task (thanks to @danielsanjosepro)
  • examples: Add an example of a panda arm tracking an interactive target in Viser visualizer (thanks to @danielsanjosepro)
  • visualization: Add start_viser_visualizer function for the Viser visualizer (thanks to @danielsanjosepro)

Changed

  • Bump minimum Python version to 3.10

v4.0.0

29 Jan 16:15

Choose a tag to compare

This release adds the FloatingBaseVelocityLimit contributed by @Soontosh 👍

Its breaking change is an update to the Limits API: limits now work on full configuration instances (rather than configuration vectors).

Added

  • limits: Allow floating base velocity limits with FloatingBaseVelocityLimit to plug into configurations to automatically clamp base twists (thanks to @Soontosh)

Changed

  • Breaking: Limit.compute_qp_inequalities functions now take a full configuration as argument rather than a configuration vector

Fixed

  • CICD: Update CoM unit test that has started failing on macOS runners

v3.5.0

02 Dec 21:15

Choose a tag to compare

This release fixes the acceleration limit, thanks to @bwingo47 for pointing out the former issue 👍 It also annotates example so that we can uv run them directly.

Added

  • examples: Add example with a sparse QP solver, suppressing matrix conversion warnings
  • examples: Add uv script dependencies to all examples

Changed

  • CICD: Update Pylint configuration

Fixed

  • Correct changelog version comparison links
  • Limit: Fix braking-limit formula in acceleration limit
  • docs: Fix typos in the acceleration limit documentation

v3.4.0

29 Jul 09:07
627d588

Choose a tag to compare

This release adds the JointVelocityTask whose aim is to track a reference joint-velocity vector via $\arg\min_v \Vert v_{ref} - v \Vert^2$. This task can be used, for instance, if a reference velocity is computed by other means (optimal control, reinforcement-learned policy, ...), and the differential IK acts as a constraint-enforcing filter. An example illustrates this with a Unitree Z1 tracking a trajectory that would violate joint limits:

arm_z1_cropped.mp4

(In the example, joint limits don't prevent self-collisions when the arm is folded on itself.)

Added

  • Task: JointVelocityTask for tracking a reference joint-velocity trajectory

Fixed

  • Save problem instance in NoSolutionFound exception

Removed

  • Remove unused attribute of SelfCollisionBarrier

v3.3.0

15 May 10:53

Choose a tag to compare

This version adds (1) a constraints argument to solve_ik, to enforce tasks as QP equality constraints rather than in the objective function, and (2) the omniwheel task, which is like a rolling task but allows lateral motion.

Note that, internally, exceptions have been grouped into the pink.exceptions submodule. We don't count this as an API-breaking change, although strictly speaking it is 😊, as the expected way to handle Pink exceptions is to catch PinkError.

Thanks to @jorisv for contributing to this release 👍

Added

  • CICD: Unit test fixture for the rolling task
  • CICD: Unit test fixture for the omniwheel task
  • Introduce constraints to enforce tasks as QP equality constraints
  • Task: Add missing task __repr__ functions
  • Task: Omniwheel task, like a rolling task but allowing lateral motion

Changed

  • CICD: Switch to Pixi for code coverage, documentation, linting and testing
  • Move pink.barriers.exceptions to pink.exceptions
  • Move pink.tasks.exceptions to pink.exceptions
  • Task: Make __repr__ of base class abstract to ensure tasks define their own
  • docs: Refactor Tasks page and update references
  • examples: Update installation hints when example dependencies are missing

Fixed

  • CICD: Improve Pixi configuration (thanks to @jorisv)
  • Task: Fix damping task when the robot model has a mobile root joint
  • Task: Report LM damping in CoM task representation

v3.2.0

22 Apr 12:11

Choose a tag to compare

This release introduces the NoSolutionFound exception (previously an AssertionError), and makes a stricter check that the QP solver reports successfully converging to a solution. It is still possible to catch cases where the solver converged (but not to a solution) as follows:

try:
    velocity = solve_ik(configuration, tasks, dt, solver=solver)
except NoSolutionFound as exn:
    if exn.results.x is not None:  # QP solver converged but not to a solution
        velocity = exn.results.x
    raise exn

This release also removes an unrequired dependency on quadprog. This solver is still great for IK, but we cannot distribute it with Pink (permissive license: Apache-2.0) as it is licensed under the GPL-2.0. Feel free to install and use it on your own!

Thanks to @ashwinvkNV and @peterd-NV for helping address this licensing issue 👍

Added

  • Add NoSolutionFound exception
  • Add open keyword argument to start_meshcat_visualizer
  • examples: Detail that quadprog works best on Stretch examples
  • examples: Installation instruction for loop-rate-limiters
  • examples: Switch to DAQP solvers in examples where it works well
  • examples: Switch to ProxQP on JVRC-1 example
  • examples: Switch to ProxQP on one-dof configuration limit example

Changed

  • CICD: Switch from tox to Anaconda environments
  • CICD: Update QP solvers used in unit tests
  • CICD: Update checkout action to v4
  • Raise custom NoSolutionFound rather than AssertionError in solve_ik
  • Update supported Python versions

Fixed

  • CICD: Update unit test for self-collision barrier

Removed

  • Remove dependency on quadprog (thanks to @peterd-NV)

v3.1.0

28 Oct 14:04

Choose a tag to compare

This release adds the RollingTask for rolling without slipping. Here is an example:

upkie_rolling_without_slipping.mp4

Added

  • Example: Upkie rolling without slipping on a horizontal floor
  • Task: RollingTask for rolling without slipping on a plane

Changed

  • Rename "end-effector to target" example to "inverse kinematics UR10"
  • Update icon of documentation website

Fixed

  • Update documentation Sphinx and theme versions
  • Fix Jacobian of SelfCollisionBarrier for floating-base robots

v3.0.0

30 Jul 11:18

Choose a tag to compare

This major release adds Control Barrier Functions developed by @domrachev03 and @simeon-ned 👍 Examples of what we can do with barriers include:

Screencast.from.06-25-2024.01.20.45.PM.webm

Another API-breaking change to the library is that limits are now optional and can be extended (for instance with the new acceleration limit) or disabled. New limits and tasks include:

  • Limit: AccelerationLimit
  • Task: ComTask for center-of-mass tracking (thanks to @simeon-ned)
  • Task: LowAccelerationTask for smoother velocities.

Check out the full changelog below for other changes and fixes. May the Motion be with you!

Added

  • Breaking: Updated the logic for handling the joint limits:
    • Add a limits argument to build_ik and solve_ik
    • The check_limits method now includes an optional safety_break argument to control whether execution should stop on exception.
    • The solve_ik function now includes the safety_break that is forwarded to check_limits.
  • Control Barrier Functions, namely: (thanks to @domrachev03 and @simeon-ned)
    • Abstract Barrier Barrier
    • Frame Position Barrier PositionBarrier
    • Body Spherical Barrier BodySphericalBarrier
    • Whole-body Self-Collision Avoidance Barrier SelfCollisionBarrier
  • Example: UR5 manipulator and GO2 quadruped robot with PositionBarrier
  • Example: YUMI two-armed manipulator with BodySphericalBarrier
  • Example: G1 humanoid squatting through regulating CoM.
  • Limit: AccelerationLimit
  • Task: ComTask for center-of-mass tracking (thanks to @simeon-ned)
  • Task: LowAccelerationTask for smoother velocities.

Changed

  • Breaking: remove lm_damping parameter from DampingTask where it wasn't used
  • CICD: Update ruff to 0.4.3
  • Configuration accepts list of Control Barrier Functions
  • DampingTask: Simplify implementation
  • Update to Pinocchio 3 with 2.7 backward compatibility

Fixed

  • PostureTask: Match implementation and documentation formula
  • Fix broken documentation links

Removed

  • CICD: Disable macOS checks until upstream PyPI package is fixed

v2.1.0

02 Apr 10:06

Choose a tag to compare

This release adds the RelativeFrameTask developed with @ymontmarin 👍 This new task is a generalization of the frame task that accepts targets with respect to any robot frame. For example:

stretch_examples.mp4

This release also brings a few quality-of-use improvements to configurations and costs.

Added

  • Function get_transform in the Configuration class
  • Task: relative frame task, where target is w.r.t another robot frame

Changed

  • Configuration: update function now accepts a configuration vector argument
  • Costs: setting cost in relative frame task now accepts plain float