Releases: stephane-caron/pink
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
v3.0.0
This major release adds Control Barrier Functions developed by @domrachev03 and @simeon-ned 👍 Examples of what we can do with barriers include:
- Arm: UR5: with joints and end effector limits
- Humanoid: G1: G1 humanoid squatting via a CoM task
- Quadruped: Go2: Go 2 squatting with floating base position limits
- Dual Arms: Yumi: self-collision avoidance with spheres
- Dual Arms: Iiwa: whole-body self-collision avoidance
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:
ComTaskfor center-of-mass tracking (thanks to @simeon-ned) - Task:
LowAccelerationTaskfor 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
limitsargument tobuild_ikandsolve_ik - The
check_limitsmethod now includes an optionalsafety_breakargument to control whether execution should stop on exception. - The
solve_ikfunction now includes thesafety_breakthat is forwarded tocheck_limits.
- Add a
- 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
- Abstract Barrier
- 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:
ComTaskfor center-of-mass tracking (thanks to @simeon-ned) - Task:
LowAccelerationTaskfor smoother velocities.
Changed
- Breaking: remove
lm_dampingparameter 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
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
- Left: relative frame task (
stretch_relative_target.pyexample) - Right: frame task (
stretch_world_target.pyexample)
This release also brings a few quality-of-use improvements to configurations and costs.
Added
- Function
get_transformin 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