All notable changes to this project will be documented in this file.
get_subtree_joint_idsutility for retrieving all joints in the subtree rooted at a given body. Contribution from @maxstrobel.
compute_look_at_rotationinexamples/humanoid_apollo.pyno longer divides by zero when the look target coincides with the source, which previously produced NaNs in the IK solver (#135).
No public API changes — this is a drop-in upgrade.
- Native C extension (
_lie_ops_c) for SE3 operations in the IK hot path, with automatic fallback to pure Python.- 8 fused operations (
se3_log,se3_rminus,se3_inverse_multiply,se3_jlog,se3_adjoint, etc.) on raw double arrays, no intermediate Python objects. FrameTask,RelativeFrameTask, andConfigurationpass rawndarray[7]internally for end-to-end native path.- Disable with
MINK_DISABLE_NATIVE=1.
- 8 fused operations (
- Build backend switched to
scikit-build-core. C extension is optional for source installs without a compiler.
CollisionAvoidanceLimit: pre-allocated scratch buffers, inlined hot loop, removed per-pairContactdataclass. ~12x faster.Configuration.check_limits: vectorized using precomputed joint indices and numpy ops.
- Switch to
uv. - Deprecate Python 3.8 and 3.9.
- Associate loggers with the name "mink".
- Improve test coverage.
- Add more tests to
test_configuration_limit.pyandtest_velocity_limit.py. - Add support for equality constraints in
solve_ikandbuild_ikvia theconstraintsparameter. - Add
DofFreezingTaskto freeze specific degrees of freedom using equality constraints.
- Objects already in collision repel each other instead of locking together. Contribution from @mattrobotcontributor.
solve_iknow raises a new exception,NoSolutionFound, when the QP solver fails to find a solution.
- Fix
Configuration.get_inertia_matrixfor MuJoCo versions >= 3.3.4.
clampmethod for SO3 and SE3. Contribution from @adlarkin.
- Added
KineticEnergyRegularizationTask, which regularizes joint displacements based on kinetic energy (inertia-weighted damping).- New example: examples/kinetic_energy_reg.py.
- Add
Configuration.get_inertia_matrix(): returns the joint-space inertia matrix at the current configuration. - Add 3.8 and 3.13 to CI test matrix.
- Switch to
MjSpecfor model construction in examples and eliminatedm_controldependency. - Added single and dual Franka Emika Panda robot examples featuring motion planning, and bi-manual coordination. Contribution from @Debojit-D.
- Merged task and limit exceptions to base exceptions file.
- Improved the documentation for certain tasks.
- Update so3.py log function to use arctan2 instead of arccos for better numerical stability.
- Switch Lie algebra implementation to use mujoco functions.
- Rewrite some Lie algebra methods to use derivations with least operations.
- Relax tolerances on test_solve_ik.py test_single_task_convergence.
- Relax numpy version requirement.
- Added equality operators for SE3 and SO3.
- Added matrix Lie group interpolation.
- Remove quadprog dependency and switch to
daqpfor examples.
- Added support for Python 3.8.
- Added
EqualityConstraintTask, which is particularly useful for closed-chain mechanisms like 4-bar linkages or parallel robots. See biped_cassie.py for an implementation example. Contribution from @simeon-ned.
| Before | After |
|---|---|
![]() |
![]() |
Configuration.check_limitsnow logs joint limit violations todebugrather thanwarnwhensafety_break=False.- Added
utils.get_subtree_body_idsto get all bodies belonging to the subtree starting at a given body.- Example usage of this function can be found in the ALOHA example script where it is used to selectively apply gravity compensation torques to the left and right arm bodies.
- Add G1 and Apollo humanoid example with a tabletop manipulation focus.
- Improved ALOHA example script.
- Fixed a small bug in the exit criterion of the ALOHA example script.
- Updated Stretch example to work with MuJoCo >= 3.3.0.
- Changed
inftomujoco.mjMAXVALfor unbounded joint limits inConfigurationLimit.
- Fixed a bug in
ConfigurationLimitwhere the indices of the limited DoFs were storing the wrong values. - Changed
printstatement inConfiguration::check_limitstologging.warning.
- Examples:
- Mobile Kinova loaded from a module-oriented MJCF description: mobile_kinova.py (thanks @Zi-ang-Cao)
- Removes the nested class naming convention in tidybot.xml, allowing for seamless swapping of end-effectors.
- Mobile Kinova with LEAP hand: mobile_kinova_leap.py (thanks @Zi-ang-Cao)
- The example scripts also includes updated recommendations for controlling the mobile base, aiming to minimize unnecessary rotation.
- UFactory xArm7 with LEAP hand: xarm_leap.py
- Unitree H1: humanoid_h1.py
- Mobile Kinova loaded from a module-oriented MJCF description: mobile_kinova.py (thanks @Zi-ang-Cao)
- Relative frame task.
- More examples:
- Mobile manipulator: mobile_tidybot.py
- Bimanual manipulator: aloha.py
- Arm + dexterous hand: arm_hand_iiwa_allegro.py
- Posture task cost can now be a scalar or a vector. Vector costs are useful for specifying different costs for different dofs.
- Documentation.
- Damping task.
- Restrict numpy version to < 2.0.0 for compatibility with
osqpsolver inqpsolvers. - README touchup.
Initial release.



