Repository navigation
Releases: pink-kinematics/pink
Release list
v4.4.0
This release allows custom boundaries in velocity limits, allowing bounds on joints that can't have a limit from their URDF model (such as continuous joints).
Added
- Limit: Allow custom boundaries in
VelocityLimit - docs: Document assumption that we start from a feasible configuration
v4.3.0
This release fixes a braking-distance bug in the AccelerationLimit and updates the list of revolute-joint shortnames supported by the ManipulabilityTask. It also adds Python 3.13 and 3.14 to the list of supported versions.
Added
- CICD: Regression test on shortnames of continuous joints
- Support for Python 3.13
- Support for Python 3.14
- examples: Add an example with the JVRC-1 humanoid backbending via a CoM task
Changed
- Add
xacrodocto project dependencies - CICD: Switch UR3, UR5 and UR10 to their official descriptions
- Transfer copyright notices to
NOTICEfile - examples: Switch UR3, UR5 and UR10 to their official descriptions
Fixed
- Add
typing_extensionsto project dependencies - Limit: Fix
AccelerationLimitbraking-distance term for joints without a configuration limit, such as continuous joints - Task: Update list of revolute-joint shortnames supported by the
ManipulabilityTask
v4.2.0
This release adds the ManipulabilityTask contributed by @danielsanjosepro 👍
It also corrects the G1 humanoid example with a fix provided by @nmarticorena.
Added
- Task: Add
ManipulabilityTaskto 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
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_costproperty to the frame task (thanks to @danielsanjosepro) - Task: Add
position_costproperty 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_visualizerfunction for the Viser visualizer (thanks to @danielsanjosepro)
Changed
- Bump minimum Python version to 3.10
v4.0.0
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
FloatingBaseVelocityLimitto plug into configurations to automatically clamp base twists (thanks to @Soontosh)
Changed
- Breaking:
Limit.compute_qp_inequalitiesfunctions 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
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
This release adds the JointVelocityTask whose aim is to track a reference joint-velocity vector via
arm_z1_cropped.mp4
(In the example, joint limits don't prevent self-collisions when the arm is folded on itself.)
Added
- Task:
JointVelocityTaskfor tracking a reference joint-velocity trajectory
Fixed
- Save problem instance in
NoSolutionFoundexception
Removed
- Remove unused attribute of
SelfCollisionBarrier
v3.3.0
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
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 exnThis 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
NoSolutionFoundexception - Add
openkeyword argument tostart_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
NoSolutionFoundrather thanAssertionErrorinsolve_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
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:
RollingTaskfor 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
SelfCollisionBarrierfor floating-base robots