mink 0.0.9__tar.gz → 0.0.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mink-0.0.9 → mink-0.0.11}/PKG-INFO +7 -7
- {mink-0.0.9 → mink-0.0.11}/README.md +5 -5
- {mink-0.0.9 → mink-0.0.11}/mink/__init__.py +17 -1
- {mink-0.0.9 → mink-0.0.11}/mink/configuration.py +15 -0
- {mink-0.0.9 → mink-0.0.11}/mink/exceptions.py +40 -0
- {mink-0.0.9 → mink-0.0.11}/mink/lie/so3.py +12 -9
- {mink-0.0.9 → mink-0.0.11}/mink/limits/__init__.py +0 -2
- {mink-0.0.9 → mink-0.0.11}/mink/limits/configuration_limit.py +3 -3
- {mink-0.0.9 → mink-0.0.11}/mink/limits/velocity_limit.py +1 -1
- {mink-0.0.9 → mink-0.0.11}/mink/solve_ik.py +10 -6
- {mink-0.0.9 → mink-0.0.11}/mink/tasks/__init__.py +4 -15
- {mink-0.0.9 → mink-0.0.11}/mink/tasks/com_task.py +61 -6
- mink-0.0.11/mink/tasks/damping_task.py +66 -0
- {mink-0.0.9 → mink-0.0.11}/mink/tasks/equality_constraint_task.py +58 -22
- {mink-0.0.9 → mink-0.0.11}/mink/tasks/frame_task.py +21 -2
- mink-0.0.11/mink/tasks/kinetic_energy_regularization_task.py +74 -0
- {mink-0.0.9 → mink-0.0.11}/mink/tasks/posture_task.py +24 -11
- {mink-0.0.9 → mink-0.0.11}/mink/tasks/relative_frame_task.py +1 -1
- {mink-0.0.9 → mink-0.0.11}/mink/tasks/task.py +23 -5
- {mink-0.0.9 → mink-0.0.11}/pyproject.toml +4 -2
- mink-0.0.9/mink/limits/exceptions.py +0 -7
- mink-0.0.9/mink/tasks/damping_task.py +0 -20
- mink-0.0.9/mink/tasks/exceptions.py +0 -31
- {mink-0.0.9 → mink-0.0.11}/LICENSE +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/.gitignore +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/@plugins_snapshot.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/__future__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/__future__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_ast.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_ast.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_codecs.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_codecs.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_collections_abc.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_collections_abc.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_ctypes.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_ctypes.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_thread.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_thread.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_typeshed/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_typeshed/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_warnings.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/_warnings.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/abc.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/abc.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/array.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/array.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/ast.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/ast.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/builtins.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/builtins.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/codecs.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/codecs.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/collections/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/collections/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/collections/abc.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/collections/abc.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/contextlib.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/contextlib.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/ctypes/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/ctypes/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/dataclasses.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/dataclasses.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/datetime.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/datetime.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/charset.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/charset.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/contentmanager.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/contentmanager.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/errors.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/errors.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/header.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/header.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/message.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/message.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/policy.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/email/policy.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/enum.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/enum.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/genericpath.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/genericpath.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/abc.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/abc.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/machinery.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/machinery.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/metadata/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/metadata/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/metadata/_meta.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/metadata/_meta.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/readers.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/readers.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/resources/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/resources/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/resources/abc.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/importlib/resources/abc.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/io.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/io.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/logging/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/logging/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/math.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/math.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/mink/limits/limit.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/mink/limits/limit.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/mmap.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/mmap.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_pytesttester.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_pytesttester.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_array_like.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_array_like.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_callable.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_callable.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_char_codes.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_char_codes.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_nbit.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_nbit.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_scalars.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_scalars.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_shape.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_shape.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_ufunc.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_typing/_ufunc.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_utils/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_utils/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_utils/_convertions.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/_utils/_convertions.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/_asarray.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/_asarray.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/_internal.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/_internal.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/_type_aliases.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/_type_aliases.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/_ufunc_config.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/_ufunc_config.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/arrayprint.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/arrayprint.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/defchararray.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/defchararray.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/einsumfunc.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/einsumfunc.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/fromnumeric.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/fromnumeric.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/function_base.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/function_base.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/multiarray.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/multiarray.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/numeric.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/numeric.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/numerictypes.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/numerictypes.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/records.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/records.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/shape_base.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/shape_base.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/umath.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/core/umath.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/ctypeslib.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/ctypeslib.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/dtypes.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/dtypes.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/exceptions.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/exceptions.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/fft/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/fft/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/fft/_pocketfft.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/fft/_pocketfft.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/fft/helper.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/fft/helper.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/_version.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/_version.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/arraypad.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/arraypad.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/arraysetops.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/arraysetops.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/arrayterator.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/arrayterator.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/format.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/format.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/function_base.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/function_base.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/histograms.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/histograms.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/index_tricks.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/index_tricks.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/mixins.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/mixins.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/nanfunctions.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/nanfunctions.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/npyio.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/npyio.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/polynomial.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/polynomial.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/scimath.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/scimath.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/shape_base.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/shape_base.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/stride_tricks.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/stride_tricks.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/twodim_base.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/twodim_base.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/type_check.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/type_check.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/ufunclike.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/ufunclike.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/utils.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/lib/utils.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/linalg/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/linalg/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/linalg/linalg.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/linalg/linalg.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/ma/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/ma/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/ma/core.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/ma/core.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/ma/extras.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/ma/extras.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/ma/mrecords.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/ma/mrecords.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/matrixlib/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/matrixlib/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/_polybase.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/_polybase.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/hermite.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/hermite.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/laguerre.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/laguerre.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/legendre.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/legendre.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/polynomial.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/polynomial.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/polyutils.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/polynomial/polyutils.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/_generator.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/_generator.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/_mt19937.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/_mt19937.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/_pcg64.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/_pcg64.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/_philox.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/_philox.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/_sfc64.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/_sfc64.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/bit_generator.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/bit_generator.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/mtrand.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/random/mtrand.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/testing/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/testing/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/testing/_private/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/testing/_private/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/testing/_private/utils.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/testing/_private/utils.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/typing/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/typing/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/version.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/numpy/version.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/os/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/os/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/os/path.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/os/path.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/pathlib.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/pathlib.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/posixpath.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/posixpath.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/re.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/re.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/sre_compile.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/sre_compile.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/sre_constants.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/sre_constants.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/sre_parse.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/sre_parse.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/string.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/string.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/subprocess.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/subprocess.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/sys/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/sys/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/sys/_monitoring.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/sys/_monitoring.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/textwrap.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/textwrap.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/threading.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/threading.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/time.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/time.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/types.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/types.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/typing.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/typing.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/typing_extensions.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/typing_extensions.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/__init__.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/__init__.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/_log.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/_log.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/async_case.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/async_case.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/case.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/case.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/loader.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/loader.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/main.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/main.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/result.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/result.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/runner.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/runner.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/signals.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/signals.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/suite.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/unittest/suite.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/warnings.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/warnings.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/zipfile.data.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/3.12/zipfile.meta.json +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/.mypy_cache/CACHEDIR.TAG +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/constants.py +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/contrib/__init__.py +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/contrib/keyboard_teleop/KEYBOARD.md +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/contrib/keyboard_teleop/__init__.py +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/contrib/keyboard_teleop/keycodes.py +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/contrib/keyboard_teleop/teleop_mocap.py +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/lie/__init__.py +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/lie/base.py +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/lie/se3.py +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/lie/utils.py +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/limits/collision_avoidance_limit.py +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/limits/limit.py +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/py.typed +0 -0
- {mink-0.0.9 → mink-0.0.11}/mink/utils.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: mink
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.11
|
4
4
|
Summary: mink: MuJoCo inverse kinematics.
|
5
5
|
Keywords: inverse,kinematics,mujoco
|
6
6
|
Author-email: Kevin Zakka <zakka@berkeley.edu>
|
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.9
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.10
|
17
17
|
Classifier: Programming Language :: Python :: 3.11
|
18
18
|
Classifier: Programming Language :: Python :: 3.12
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
19
20
|
Classifier: Topic :: Scientific/Engineering
|
20
21
|
License-File: LICENSE
|
21
22
|
Requires-Dist: mujoco >= 3.1.6
|
@@ -27,7 +28,6 @@ Requires-Dist: black ; extra == "dev"
|
|
27
28
|
Requires-Dist: mink[test] ; extra == "dev"
|
28
29
|
Requires-Dist: mypy ; extra == "dev"
|
29
30
|
Requires-Dist: ruff ; extra == "dev"
|
30
|
-
Requires-Dist: dm_control >= 1.0.20 ; extra == "examples"
|
31
31
|
Requires-Dist: loop-rate-limiters >= 0.1.0 ; extra == "examples"
|
32
32
|
Requires-Dist: qpsolvers[daqp] >= 4.3.1 ; extra == "examples"
|
33
33
|
Requires-Dist: osqp >=0.6.2,<1 ; extra == "examples"
|
@@ -66,14 +66,14 @@ For usage and API reference, see the [documentation](https://kevinzakka.github.i
|
|
66
66
|
If you use mink in your research, please cite it as follows:
|
67
67
|
|
68
68
|
```bibtex
|
69
|
-
@software{
|
69
|
+
@software{Zakka_Mink_Python_inverse_2025,
|
70
70
|
author = {Zakka, Kevin},
|
71
|
-
license = {Apache-2.0},
|
72
|
-
month = jul,
|
73
71
|
title = {{Mink: Python inverse kinematics based on MuJoCo}},
|
72
|
+
year = {2025},
|
73
|
+
month = may,
|
74
|
+
version = {0.0.11},
|
74
75
|
url = {https://github.com/kevinzakka/mink},
|
75
|
-
|
76
|
-
year = {2024}
|
76
|
+
license = {Apache-2.0}
|
77
77
|
}
|
78
78
|
```
|
79
79
|
|
@@ -19,14 +19,14 @@ For usage and API reference, see the [documentation](https://kevinzakka.github.i
|
|
19
19
|
If you use mink in your research, please cite it as follows:
|
20
20
|
|
21
21
|
```bibtex
|
22
|
-
@software{
|
22
|
+
@software{Zakka_Mink_Python_inverse_2025,
|
23
23
|
author = {Zakka, Kevin},
|
24
|
-
license = {Apache-2.0},
|
25
|
-
month = jul,
|
26
24
|
title = {{Mink: Python inverse kinematics based on MuJoCo}},
|
25
|
+
year = {2025},
|
26
|
+
month = may,
|
27
|
+
version = {0.0.11},
|
27
28
|
url = {https://github.com/kevinzakka/mink},
|
28
|
-
|
29
|
-
year = {2024}
|
29
|
+
license = {Apache-2.0}
|
30
30
|
}
|
31
31
|
```
|
32
32
|
|
@@ -9,11 +9,19 @@ from .constants import (
|
|
9
9
|
SUPPORTED_FRAMES,
|
10
10
|
)
|
11
11
|
from .exceptions import (
|
12
|
+
IntegrationTimestepNotSet,
|
13
|
+
InvalidConstraint,
|
14
|
+
InvalidDamping,
|
12
15
|
InvalidFrame,
|
16
|
+
InvalidGain,
|
13
17
|
InvalidKeyframe,
|
14
18
|
InvalidMocapBody,
|
19
|
+
InvalidTarget,
|
20
|
+
LimitDefinitionError,
|
15
21
|
MinkError,
|
16
22
|
NotWithinConfigurationLimits,
|
23
|
+
TargetNotSet,
|
24
|
+
TaskDefinitionError,
|
17
25
|
UnsupportedFrame,
|
18
26
|
)
|
19
27
|
from .lie import SE3, SO3, MatrixLieGroup
|
@@ -30,10 +38,10 @@ from .tasks import (
|
|
30
38
|
DampingTask,
|
31
39
|
EqualityConstraintTask,
|
32
40
|
FrameTask,
|
41
|
+
KineticEnergyRegularizationTask,
|
33
42
|
Objective,
|
34
43
|
PostureTask,
|
35
44
|
RelativeFrameTask,
|
36
|
-
TargetNotSet,
|
37
45
|
Task,
|
38
46
|
)
|
39
47
|
from .utils import (
|
@@ -55,6 +63,7 @@ __all__ = (
|
|
55
63
|
"RelativeFrameTask",
|
56
64
|
"PostureTask",
|
57
65
|
"Task",
|
66
|
+
"KineticEnergyRegularizationTask",
|
58
67
|
"EqualityConstraintTask",
|
59
68
|
"Objective",
|
60
69
|
"ConfigurationLimit",
|
@@ -72,6 +81,13 @@ __all__ = (
|
|
72
81
|
"NotWithinConfigurationLimits",
|
73
82
|
"TargetNotSet",
|
74
83
|
"InvalidMocapBody",
|
84
|
+
"InvalidConstraint",
|
85
|
+
"InvalidDamping",
|
86
|
+
"InvalidGain",
|
87
|
+
"InvalidTarget",
|
88
|
+
"LimitDefinitionError",
|
89
|
+
"TaskDefinitionError",
|
90
|
+
"IntegrationTimestepNotSet",
|
75
91
|
"SUPPORTED_FRAMES",
|
76
92
|
"FRAME_TO_ENUM",
|
77
93
|
"FRAME_TO_JAC_FUNC",
|
@@ -237,6 +237,21 @@ class Configuration:
|
|
237
237
|
mujoco.mj_integratePos(self.model, self.data.qpos, velocity, dt)
|
238
238
|
self.update()
|
239
239
|
|
240
|
+
def get_inertia_matrix(self) -> np.ndarray:
|
241
|
+
r"""Return the joint-space inertia matrix at the current configuration.
|
242
|
+
|
243
|
+
Returns:
|
244
|
+
The joint-space inertia matrix :math:`M(\mathbf{q})`.
|
245
|
+
"""
|
246
|
+
# Run the composite rigid body inertia (CRB) algorithm to populate the joint
|
247
|
+
# space inertia matrix data.qM.
|
248
|
+
mujoco.mj_crb(self.model, self.data)
|
249
|
+
# data.qM is stored in a custom sparse format and can be converted to dense
|
250
|
+
# format using mujoco.mj_fullM.
|
251
|
+
M = np.empty((self.nv, self.nv), dtype=np.float64)
|
252
|
+
mujoco.mj_fullM(self.model, M, self.data.qM)
|
253
|
+
return M
|
254
|
+
|
240
255
|
# Aliases.
|
241
256
|
|
242
257
|
@property
|
@@ -96,3 +96,43 @@ class NotWithinConfigurationLimits(MinkError):
|
|
96
96
|
f"{lower} <= {value} <= {upper}"
|
97
97
|
)
|
98
98
|
super().__init__(message)
|
99
|
+
|
100
|
+
|
101
|
+
class TaskDefinitionError(MinkError):
|
102
|
+
"""Exception raised when a task definition is ill-formed."""
|
103
|
+
|
104
|
+
|
105
|
+
class IntegrationTimestepNotSet(MinkError):
|
106
|
+
"""Exception raised when the integration timestep is not set."""
|
107
|
+
|
108
|
+
def __init__(self, cls_name: str):
|
109
|
+
message = f"No integration timestep set for {cls_name}"
|
110
|
+
super().__init__(message)
|
111
|
+
|
112
|
+
|
113
|
+
class TargetNotSet(MinkError):
|
114
|
+
"""Exception raised when attempting to use a task with an unset target."""
|
115
|
+
|
116
|
+
def __init__(self, cls_name: str):
|
117
|
+
message = f"No target set for {cls_name}"
|
118
|
+
super().__init__(message)
|
119
|
+
|
120
|
+
|
121
|
+
class InvalidTarget(MinkError):
|
122
|
+
"""Exception raised when the target is invalid."""
|
123
|
+
|
124
|
+
|
125
|
+
class InvalidGain(MinkError):
|
126
|
+
"""Exception raised when the gain is outside the valid range."""
|
127
|
+
|
128
|
+
|
129
|
+
class InvalidDamping(MinkError):
|
130
|
+
"""Exception raised when the damping is outside the valid range."""
|
131
|
+
|
132
|
+
|
133
|
+
class InvalidConstraint(MinkError):
|
134
|
+
"""Exception raised when a constraint is invalid."""
|
135
|
+
|
136
|
+
|
137
|
+
class LimitDefinitionError(MinkError):
|
138
|
+
"""Exception raised when a limit definition is ill-formed."""
|
@@ -85,6 +85,7 @@ class SO3(MatrixLieGroup):
|
|
85
85
|
assert matrix.shape == (SO3.matrix_dim, SO3.matrix_dim)
|
86
86
|
wxyz = np.empty(SO3.parameters_dim, dtype=np.float64)
|
87
87
|
mujoco.mju_mat2Quat(wxyz, matrix.ravel())
|
88
|
+
# NOTE mju_mat2Quat normalizes the quaternion.
|
88
89
|
return SO3(wxyz=wxyz)
|
89
90
|
|
90
91
|
@classmethod
|
@@ -163,20 +164,22 @@ class SO3(MatrixLieGroup):
|
|
163
164
|
def exp(cls, tangent: np.ndarray) -> SO3:
|
164
165
|
axis = np.array(tangent)
|
165
166
|
theta = mujoco.mju_normalize3(axis)
|
166
|
-
wxyz = np.
|
167
|
+
wxyz = np.empty(4, dtype=np.float64)
|
168
|
+
# NOTE mju_axisAngle2Quat does not normalize the quaternion but is guaranteed
|
169
|
+
# to return a unit quaternion when axis is a unit vector. In our case,
|
170
|
+
# mju_normalize3 ensures that axis is a unit vector.
|
167
171
|
mujoco.mju_axisAngle2Quat(wxyz, axis, theta)
|
168
172
|
return SO3(wxyz=wxyz)
|
169
173
|
|
170
174
|
# Eq. 133.
|
171
175
|
def log(self) -> np.ndarray:
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
return theta * axis
|
176
|
+
q = np.array(self.wxyz)
|
177
|
+
q *= np.sign(q[0])
|
178
|
+
w, v = q[0], q[1:]
|
179
|
+
norm = mujoco.mju_normalize3(v)
|
180
|
+
if norm < get_epsilon(v.dtype):
|
181
|
+
return np.zeros_like(v)
|
182
|
+
return 2 * np.arctan2(norm, w) * v
|
180
183
|
|
181
184
|
# Eq. 139.
|
182
185
|
def adjoint(self) -> np.ndarray:
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
from .collision_avoidance_limit import CollisionAvoidanceLimit
|
4
4
|
from .configuration_limit import ConfigurationLimit
|
5
|
-
from .exceptions import LimitDefinitionError
|
6
5
|
from .limit import Constraint, Limit
|
7
6
|
from .velocity_limit import VelocityLimit
|
8
7
|
|
@@ -12,5 +11,4 @@ __all__ = (
|
|
12
11
|
"Constraint",
|
13
12
|
"Limit",
|
14
13
|
"VelocityLimit",
|
15
|
-
"LimitDefinitionError",
|
16
14
|
)
|
@@ -7,7 +7,7 @@ import numpy as np
|
|
7
7
|
|
8
8
|
from ..configuration import Configuration
|
9
9
|
from ..constants import dof_width, qpos_width
|
10
|
-
from
|
10
|
+
from ..exceptions import LimitDefinitionError
|
11
11
|
from .limit import Constraint, Limit
|
12
12
|
|
13
13
|
|
@@ -98,7 +98,7 @@ class ConfigurationLimit(Limit):
|
|
98
98
|
return Constraint()
|
99
99
|
|
100
100
|
# Upper.
|
101
|
-
delta_q_max = np.
|
101
|
+
delta_q_max = np.empty((self.model.nv,))
|
102
102
|
mujoco.mj_differentiatePos(
|
103
103
|
m=self.model,
|
104
104
|
qvel=delta_q_max,
|
@@ -108,7 +108,7 @@ class ConfigurationLimit(Limit):
|
|
108
108
|
)
|
109
109
|
|
110
110
|
# Lower.
|
111
|
-
delta_q_min = np.
|
111
|
+
delta_q_min = np.empty((self.model.nv,))
|
112
112
|
mujoco.mj_differentiatePos(
|
113
113
|
m=self.model,
|
114
114
|
qvel=delta_q_min,
|
@@ -7,11 +7,11 @@ import qpsolvers
|
|
7
7
|
|
8
8
|
from .configuration import Configuration
|
9
9
|
from .limits import ConfigurationLimit, Limit
|
10
|
-
from .tasks import
|
10
|
+
from .tasks import BaseTask, Objective
|
11
11
|
|
12
12
|
|
13
13
|
def _compute_qp_objective(
|
14
|
-
configuration: Configuration, tasks: Sequence[
|
14
|
+
configuration: Configuration, tasks: Sequence[BaseTask], damping: float
|
15
15
|
) -> Objective:
|
16
16
|
H = np.eye(configuration.model.nv) * damping
|
17
17
|
c = np.zeros(configuration.model.nv)
|
@@ -42,7 +42,7 @@ def _compute_qp_inequalities(
|
|
42
42
|
|
43
43
|
def build_ik(
|
44
44
|
configuration: Configuration,
|
45
|
-
tasks: Sequence[
|
45
|
+
tasks: Sequence[BaseTask],
|
46
46
|
dt: float,
|
47
47
|
damping: float = 1e-12,
|
48
48
|
limits: Optional[Sequence[Limit]] = None,
|
@@ -53,7 +53,9 @@ def build_ik(
|
|
53
53
|
configuration: Robot configuration.
|
54
54
|
tasks: List of kinematic tasks.
|
55
55
|
dt: Integration timestep in [s].
|
56
|
-
damping: Levenberg-Marquardt damping.
|
56
|
+
damping: Levenberg-Marquardt damping. Higher values improve numerical
|
57
|
+
stability but slow down task convergence. This value applies to all
|
58
|
+
dofs, including floating-base coordinates.
|
57
59
|
limits: List of limits to enforce. Set to empty list to disable. If None,
|
58
60
|
defaults to a configuration limit.
|
59
61
|
|
@@ -67,7 +69,7 @@ def build_ik(
|
|
67
69
|
|
68
70
|
def solve_ik(
|
69
71
|
configuration: Configuration,
|
70
|
-
tasks: Sequence[
|
72
|
+
tasks: Sequence[BaseTask],
|
71
73
|
dt: float,
|
72
74
|
solver: str,
|
73
75
|
damping: float = 1e-12,
|
@@ -85,7 +87,9 @@ def solve_ik(
|
|
85
87
|
tasks: List of kinematic tasks.
|
86
88
|
dt: Integration timestep in [s].
|
87
89
|
solver: Backend quadratic programming (QP) solver.
|
88
|
-
damping: Levenberg-Marquardt damping.
|
90
|
+
damping: Levenberg-Marquardt damping applied to all tasks. Higher values
|
91
|
+
improve numerical stability but slow down task convergence. This
|
92
|
+
value applies to all dofs, including floating-base coordinates.
|
89
93
|
safety_break: If True, stop execution and raise an exception if
|
90
94
|
the current configuration is outside limits. If False, print a
|
91
95
|
warning and continue execution.
|
@@ -3,20 +3,14 @@
|
|
3
3
|
from .com_task import ComTask
|
4
4
|
from .damping_task import DampingTask
|
5
5
|
from .equality_constraint_task import EqualityConstraintTask
|
6
|
-
from .exceptions import (
|
7
|
-
InvalidConstraint,
|
8
|
-
InvalidDamping,
|
9
|
-
InvalidGain,
|
10
|
-
InvalidTarget,
|
11
|
-
TargetNotSet,
|
12
|
-
TaskDefinitionError,
|
13
|
-
)
|
14
6
|
from .frame_task import FrameTask
|
7
|
+
from .kinetic_energy_regularization_task import KineticEnergyRegularizationTask
|
15
8
|
from .posture_task import PostureTask
|
16
9
|
from .relative_frame_task import RelativeFrameTask
|
17
|
-
from .task import Objective, Task
|
10
|
+
from .task import BaseTask, Objective, Task
|
18
11
|
|
19
12
|
__all__ = (
|
13
|
+
"BaseTask",
|
20
14
|
"ComTask",
|
21
15
|
"FrameTask",
|
22
16
|
"Objective",
|
@@ -24,11 +18,6 @@ __all__ = (
|
|
24
18
|
"PostureTask",
|
25
19
|
"RelativeFrameTask",
|
26
20
|
"Task",
|
27
|
-
"TargetNotSet",
|
28
|
-
"InvalidTarget",
|
29
|
-
"TaskDefinitionError",
|
30
|
-
"InvalidConstraint",
|
31
|
-
"InvalidGain",
|
32
|
-
"InvalidDamping",
|
33
21
|
"EqualityConstraintTask",
|
22
|
+
"KineticEnergyRegularizationTask",
|
34
23
|
)
|
@@ -9,7 +9,7 @@ import numpy as np
|
|
9
9
|
import numpy.typing as npt
|
10
10
|
|
11
11
|
from ..configuration import Configuration
|
12
|
-
from
|
12
|
+
from ..exceptions import InvalidTarget, TargetNotSet, TaskDefinitionError
|
13
13
|
from .task import Task
|
14
14
|
|
15
15
|
|
@@ -18,6 +18,20 @@ class ComTask(Task):
|
|
18
18
|
|
19
19
|
Attributes:
|
20
20
|
target_com: Target position of the CoM.
|
21
|
+
|
22
|
+
Example:
|
23
|
+
|
24
|
+
.. code-block:: python
|
25
|
+
|
26
|
+
com_task = ComTask(model, cost=1.0)
|
27
|
+
|
28
|
+
# Update the target CoM directly.
|
29
|
+
com_desired = np.zeros(3)
|
30
|
+
com_task.set_target(com_desired)
|
31
|
+
|
32
|
+
# Or from a keyframe defined in the model.
|
33
|
+
configuration.update_from_keyframe("home")
|
34
|
+
com_task.set_target_from_configuration(configuration)
|
21
35
|
"""
|
22
36
|
|
23
37
|
k: int = 3
|
@@ -69,7 +83,21 @@ class ComTask(Task):
|
|
69
83
|
self.set_target(configuration.data.subtree_com[1])
|
70
84
|
|
71
85
|
def compute_error(self, configuration: Configuration) -> np.ndarray:
|
72
|
-
"""Compute the CoM task error.
|
86
|
+
r"""Compute the CoM task error.
|
87
|
+
|
88
|
+
The center of mass :math:`c(q)` for a collection of bodies :math:`\mathcal{B}`
|
89
|
+
is the mass-weighted average of their individual centers of mass. After running
|
90
|
+
forward kinematics, in particular after calling ``mj_comPos``, MuJoCo stores
|
91
|
+
the CoM of each subtree in ``data.subtree_com``. This task uses the CoM of the
|
92
|
+
subtree starting from body 1, which is the entire robot excluding the world
|
93
|
+
body (body 0).
|
94
|
+
|
95
|
+
The task error :math:`e(q)` is the difference between the current CoM
|
96
|
+
:math:`c(q)` and the target CoM :math:`c^*`:
|
97
|
+
|
98
|
+
.. math::
|
99
|
+
|
100
|
+
e(q) = c(q) - c^*
|
73
101
|
|
74
102
|
Args:
|
75
103
|
configuration: Robot configuration :math:`q`.
|
@@ -79,19 +107,46 @@ class ComTask(Task):
|
|
79
107
|
"""
|
80
108
|
if self.target_com is None:
|
81
109
|
raise TargetNotSet(self.__class__.__name__)
|
110
|
+
# Note: body 0 is the world body, so we start from body 1 (the robot).
|
111
|
+
# TODO(kevin): Don't hardcode subtree index.
|
82
112
|
return configuration.data.subtree_com[1] - self.target_com
|
83
113
|
|
84
114
|
def compute_jacobian(self, configuration: Configuration) -> np.ndarray:
|
85
|
-
"""Compute the CoM task
|
115
|
+
r"""Compute the Jacobian of the CoM task error :math:`e(q)`.
|
116
|
+
|
117
|
+
The Jacobian is the derivative of this error with respect to the
|
118
|
+
generalized coordinates :math:`q`. Since the target :math:`c^*` is
|
119
|
+
constant, the Jacobian of the error simplifies to the Jacobian of the
|
120
|
+
CoM position :math:`c(q)`:
|
121
|
+
|
122
|
+
.. math::
|
123
|
+
|
124
|
+
J(q) = \frac{\partial e(q)}{\partial q} = \frac{\partial c(q)}{\partial q}
|
125
|
+
|
126
|
+
MuJoCo's ``mj_jacSubtreeCom`` function computes this Jacobian using the
|
127
|
+
formula:
|
128
|
+
|
129
|
+
.. math::
|
130
|
+
|
131
|
+
\frac{\partial c(q)}{\partial q} =
|
132
|
+
\frac{1}{M} \sum_{i \in \mathcal{B}} m_i \frac{\partial p_i(q)}{\partial q}
|
133
|
+
= \frac{1}{M} \sum_{i \in \mathcal{B}} m_i J_i(q)
|
134
|
+
|
135
|
+
where :math:`M = \sum_{i \in \mathcal{B}} m_i` is the total mass of the subtree,
|
136
|
+
:math:`m_i` is the mass of body :math:`i`, :math:`p_i(q)` is the position
|
137
|
+
of the origin of body frame :math:`i` in the world frame, :math:`J_i(q) =
|
138
|
+
\frac{\partial p_i(q)}{\partial q}` is the Jacobian mapping joint velocities to
|
139
|
+
the linear velocity of the origin of body frame :math:`i`, and the sum is over
|
140
|
+
all bodies :math:`\mathcal{B}` in the specified subtree (body 1 and its
|
141
|
+
descendants).
|
86
142
|
|
87
143
|
Args:
|
88
144
|
configuration: Robot configuration :math:`q`.
|
89
145
|
|
90
146
|
Returns:
|
91
|
-
|
147
|
+
Jacobian of the center-of-mass task error :math:`J(q)`.
|
92
148
|
"""
|
93
|
-
|
94
|
-
raise TargetNotSet(self.__class__.__name__)
|
149
|
+
# NOTE: We don't need a target CoM to compute this Jacobian.
|
95
150
|
jac = np.empty((self.k, configuration.nv))
|
96
151
|
mujoco.mj_jacSubtreeCom(configuration.model, configuration.data, jac, 1)
|
97
152
|
return jac
|
@@ -0,0 +1,66 @@
|
|
1
|
+
"""Damping task implementation."""
|
2
|
+
|
3
|
+
import mujoco
|
4
|
+
import numpy as np
|
5
|
+
import numpy.typing as npt
|
6
|
+
|
7
|
+
from ..configuration import Configuration
|
8
|
+
from .posture_task import PostureTask
|
9
|
+
|
10
|
+
|
11
|
+
class DampingTask(PostureTask):
|
12
|
+
r"""L2-regularization on joint velocities (a.k.a. *velocity damping*).
|
13
|
+
|
14
|
+
This low-priority task adds a Tikhonov/Levenberg-Marquardt term to the
|
15
|
+
quadratic program, making the Hessian strictly positive-definite and
|
16
|
+
selecting the **minimum-norm joint velocity** in any redundant or
|
17
|
+
near-singular situation. Formally it contributes:
|
18
|
+
|
19
|
+
.. math::
|
20
|
+
\frac{1}{2}\,\Delta \mathbf{q}^\top \Lambda\,\Delta \mathbf{q},
|
21
|
+
|
22
|
+
where :math:`\Delta \mathbf{q}\in\mathbb{R}^{n_v}` is the vector of joint
|
23
|
+
displacements and :math:`\Lambda = \mathrm{diag}(\lambda_1, \ldots, \lambda_{n_v})`
|
24
|
+
is a diagonal matrix of per-DoF weights provided by ``cost``. A larger
|
25
|
+
:math:`\lambda_i` reduces motion in DoF :math:`i`; with no other active
|
26
|
+
tasks the robot remains at rest.
|
27
|
+
|
28
|
+
This task does not favor a particular posture—only small instantaneous
|
29
|
+
motion. If you need a posture bias, use an explicit :class:`~.PostureTask`.
|
30
|
+
|
31
|
+
.. note::
|
32
|
+
|
33
|
+
Floating-base coordinates are not affected by this task.
|
34
|
+
|
35
|
+
Example:
|
36
|
+
|
37
|
+
.. code-block:: python
|
38
|
+
|
39
|
+
# Uniform damping across all degrees of freedom.
|
40
|
+
damping_task = DampingTask(model, cost=1.0)
|
41
|
+
|
42
|
+
# Custom damping.
|
43
|
+
cost = np.zeros(model.nv)
|
44
|
+
cost[:3] = 1.0 # High damping for the first 3 joints.
|
45
|
+
cost[3:] = 0.1 # Lower damping for the remaining joints.
|
46
|
+
damping_task = DampingTask(model, cost)
|
47
|
+
"""
|
48
|
+
|
49
|
+
def __init__(self, model: mujoco.MjModel, cost: npt.ArrayLike):
|
50
|
+
super().__init__(model, cost, gain=0.0, lm_damping=0.0)
|
51
|
+
|
52
|
+
def compute_error(self, configuration: Configuration) -> np.ndarray:
|
53
|
+
r"""Compute the damping task error.
|
54
|
+
|
55
|
+
The damping task does not chase a reference; its desired joint velocity
|
56
|
+
is identically **zero**, so the error vector is always
|
57
|
+
|
58
|
+
.. math:: e = \mathbf 0 \in \mathbb R^{n_v}.
|
59
|
+
|
60
|
+
Args:
|
61
|
+
configuration: Robot configuration :math:`q`.
|
62
|
+
|
63
|
+
Returns:
|
64
|
+
Zero vector of length :math:`n_v`.
|
65
|
+
"""
|
66
|
+
return np.zeros(configuration.nv)
|
@@ -10,7 +10,7 @@ import numpy as np
|
|
10
10
|
import numpy.typing as npt
|
11
11
|
|
12
12
|
from ..configuration import Configuration
|
13
|
-
from
|
13
|
+
from ..exceptions import InvalidConstraint, TaskDefinitionError
|
14
14
|
from .task import Task
|
15
15
|
|
16
16
|
|
@@ -24,20 +24,54 @@ def _get_constraint_dim(constraint: int) -> int:
|
|
24
24
|
}[constraint]
|
25
25
|
|
26
26
|
|
27
|
+
def _sparse2dense_fallback(
|
28
|
+
res: np.ndarray,
|
29
|
+
mat: np.ndarray,
|
30
|
+
rownnz: np.ndarray,
|
31
|
+
rowadr: np.ndarray,
|
32
|
+
colind: np.ndarray,
|
33
|
+
) -> None:
|
34
|
+
"""Fallback implementation of mujoco.mju_sparse2dense for Python 3.8.
|
35
|
+
|
36
|
+
This is a fallback implementation of mujoco.mju_sparse2dense for Python 3.8.
|
37
|
+
It is used when the version of MuJoCo is less than 3.2.5. This is because
|
38
|
+
mujoco.mju_sparse2dense was added Oct 23, 2024 which corresponds to 3.2.5+ and
|
39
|
+
Python 3.8 was dropped in 3.2.4.
|
40
|
+
"""
|
41
|
+
# Ref: https://github.com/google-deepmind/mujoco/blob/178fb49c2b2ff48f59653515ab09b9cafca31b7a/src/engine/engine_util_sparse.c#L135
|
42
|
+
for r in range(res.shape[0]):
|
43
|
+
for i in range(rownnz[r]):
|
44
|
+
res[r, colind[rowadr[r] + i]] = mat[rowadr[r] + i]
|
45
|
+
|
46
|
+
|
27
47
|
def _get_dense_constraint_jacobian(
|
28
48
|
model: mujoco.MjModel, data: mujoco.MjData
|
29
49
|
) -> np.ndarray:
|
30
50
|
"""Return the dense constraint Jacobian for a model."""
|
31
|
-
|
32
|
-
|
33
|
-
mujoco.
|
34
|
-
efc_J,
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
51
|
+
|
52
|
+
def _sparse2dense(data: mujoco.MjData) -> np.ndarray:
|
53
|
+
if mujoco.__version__ < "3.2.5":
|
54
|
+
efc_J = np.zeros((data.nefc, model.nv)) # Important to zero out here.
|
55
|
+
_sparse2dense_fallback(
|
56
|
+
efc_J,
|
57
|
+
data.efc_J,
|
58
|
+
data.efc_J_rownnz,
|
59
|
+
data.efc_J_rowadr,
|
60
|
+
data.efc_J_colind,
|
61
|
+
)
|
62
|
+
else:
|
63
|
+
efc_J = np.empty((data.nefc, model.nv))
|
64
|
+
mujoco.mju_sparse2dense(
|
65
|
+
efc_J,
|
66
|
+
data.efc_J,
|
67
|
+
data.efc_J_rownnz,
|
68
|
+
data.efc_J_rowadr,
|
69
|
+
data.efc_J_colind,
|
70
|
+
)
|
40
71
|
return efc_J
|
72
|
+
|
73
|
+
if mujoco.mj_isSparse(model):
|
74
|
+
return _sparse2dense(data)
|
41
75
|
return data.efc_J.reshape((data.nefc, model.nv)).copy()
|
42
76
|
|
43
77
|
|
@@ -53,9 +87,18 @@ class EqualityConstraintTask(Task):
|
|
53
87
|
* ``mjEQ_JOINT``: Couple the values of two scalar joints.
|
54
88
|
* ``mjEQ_TENDON``: Couple the values of two tendons.
|
55
89
|
|
56
|
-
This task can regulate all equality constraints in
|
90
|
+
This task can regulate all equality constraints in the model or a specific subset
|
57
91
|
identified by name or ID.
|
58
92
|
|
93
|
+
.. note::
|
94
|
+
|
95
|
+
MuJoCo computes the constraint residual and its Jacobian and stores them in
|
96
|
+
``data.efc_pos`` and ``data.efc_J`` (potentially in sparse format), respectively.
|
97
|
+
The :func:`compute_error` and :func:`compute_jacobian` methods simply extract the
|
98
|
+
rows corresponding to the active equality constraints specified for this task
|
99
|
+
from ``data.efc_pos`` and ``data.efc_J``. More information on MuJoCo's constraint
|
100
|
+
model can be found in [MuJoCoEqualityConstraints]_.
|
101
|
+
|
59
102
|
Attributes:
|
60
103
|
equalities: ID or name of the equality constraints to regulate. If not provided,
|
61
104
|
the task will regulate all equality constraints in the model.
|
@@ -126,32 +169,25 @@ class EqualityConstraintTask(Task):
|
|
126
169
|
self.cost = np.repeat(self._cost, repeats)
|
127
170
|
|
128
171
|
def compute_error(self, configuration: Configuration) -> np.ndarray:
|
129
|
-
"""Compute the
|
172
|
+
"""Compute the task error (constraint residual) :math:`e(q) = r(q)`.
|
130
173
|
|
131
174
|
Args:
|
132
175
|
configuration: Robot configuration :math:`q`.
|
133
176
|
|
134
177
|
Returns:
|
135
|
-
|
136
|
-
error vector is ``(neq_active * constraint_dim,)``, where ``neq_active``
|
137
|
-
is the number of active equality constraints, and ``constraint_dim``
|
138
|
-
depends on the type of equality constraint.
|
178
|
+
Task error vector :math:`e(q)` for the active equality constraints.
|
139
179
|
"""
|
140
180
|
self._update_active_constraints(configuration)
|
141
181
|
return configuration.data.efc_pos[self._mask]
|
142
182
|
|
143
183
|
def compute_jacobian(self, configuration: Configuration) -> np.ndarray:
|
144
|
-
"""Compute the task Jacobian
|
184
|
+
"""Compute the task Jacobian (constraint Jacobian) :math:`J(q) = J_r(q)`.
|
145
185
|
|
146
186
|
Args:
|
147
187
|
configuration: Robot configuration :math:`q`.
|
148
188
|
|
149
189
|
Returns:
|
150
|
-
|
151
|
-
is ``(neq_active * constraint_dim, nv)``, where ``neq_active`` is the
|
152
|
-
number of active equality constraints, ``constraint_dim`` depends on the
|
153
|
-
type of equality constraint, and ``nv`` is the dimension of the tangent
|
154
|
-
space.
|
190
|
+
Task jacobian :math:`J(q)` for the active equality constraints.
|
155
191
|
"""
|
156
192
|
self._update_active_constraints(configuration)
|
157
193
|
efc_J = _get_dense_constraint_jacobian(configuration.model, configuration.data)
|