mink 0.0.1__tar.gz → 0.0.3__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.1 → mink-0.0.3}/PKG-INFO +37 -9
- {mink-0.0.1 → mink-0.0.3}/README.md +26 -3
- {mink-0.0.1 → mink-0.0.3}/mink/__init__.py +12 -3
- {mink-0.0.1 → mink-0.0.3}/mink/configuration.py +67 -30
- {mink-0.0.1 → mink-0.0.3}/mink/lie/__init__.py +1 -2
- {mink-0.0.1 → mink-0.0.3}/mink/lie/base.py +2 -2
- {mink-0.0.1 → mink-0.0.3}/mink/lie/so3.py +2 -0
- {mink-0.0.1 → mink-0.0.3}/mink/lie/utils.py +2 -10
- {mink-0.0.1 → mink-0.0.3}/mink/limits/collision_avoidance_limit.py +46 -63
- {mink-0.0.1 → mink-0.0.3}/mink/limits/configuration_limit.py +23 -30
- mink-0.0.3/mink/limits/limit.py +59 -0
- {mink-0.0.1 → mink-0.0.3}/mink/limits/velocity_limit.py +30 -23
- {mink-0.0.1 → mink-0.0.3}/mink/solve_ik.py +2 -2
- {mink-0.0.1 → mink-0.0.3}/mink/tasks/__init__.py +4 -0
- {mink-0.0.1 → mink-0.0.3}/mink/tasks/com_task.py +24 -9
- mink-0.0.3/mink/tasks/damping_task.py +20 -0
- {mink-0.0.1 → mink-0.0.3}/mink/tasks/frame_task.py +45 -13
- {mink-0.0.1 → mink-0.0.3}/mink/tasks/posture_task.py +53 -14
- mink-0.0.3/mink/tasks/relative_frame_task.py +142 -0
- {mink-0.0.1 → mink-0.0.3}/mink/tasks/task.py +61 -28
- {mink-0.0.1 → mink-0.0.3}/mink/utils.py +15 -7
- {mink-0.0.1 → mink-0.0.3}/pyproject.toml +26 -7
- mink-0.0.1/mink/lie/tests/__init__.py +0 -0
- mink-0.0.1/mink/lie/tests/test_axioms.py +0 -51
- mink-0.0.1/mink/lie/tests/test_operations.py +0 -77
- mink-0.0.1/mink/lie/tests/utils.py +0 -20
- mink-0.0.1/mink/limits/limit.py +0 -41
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/.gitignore +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/@plugins_snapshot.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/__future__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/__future__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_ast.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_ast.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_codecs.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_codecs.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_collections_abc.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_collections_abc.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_ctypes.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_ctypes.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_thread.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_thread.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_typeshed/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_typeshed/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_warnings.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/_warnings.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/abc.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/abc.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/array.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/array.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/ast.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/ast.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/builtins.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/builtins.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/codecs.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/codecs.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/abc.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/abc.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/contextlib.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/contextlib.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/ctypes/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/ctypes/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/dataclasses.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/dataclasses.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/datetime.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/datetime.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/charset.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/charset.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/contentmanager.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/contentmanager.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/errors.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/errors.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/header.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/header.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/message.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/message.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/policy.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/email/policy.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/enum.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/enum.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/genericpath.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/genericpath.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/abc.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/abc.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/machinery.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/machinery.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/_meta.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/_meta.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/readers.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/readers.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/abc.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/abc.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/io.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/io.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/logging/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/logging/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/math.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/math.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/mink/limits/limit.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/mink/limits/limit.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/mmap.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/mmap.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_pytesttester.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_pytesttester.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_array_like.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_array_like.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_callable.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_callable.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_char_codes.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_char_codes.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nbit.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nbit.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_scalars.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_scalars.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_shape.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_shape.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_ufunc.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_ufunc.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/_convertions.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/_convertions.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_asarray.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_asarray.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_internal.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_internal.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_type_aliases.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_type_aliases.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_ufunc_config.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_ufunc_config.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/arrayprint.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/arrayprint.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/defchararray.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/defchararray.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/einsumfunc.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/einsumfunc.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/fromnumeric.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/fromnumeric.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/function_base.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/function_base.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/multiarray.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/multiarray.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numeric.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numeric.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numerictypes.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numerictypes.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/records.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/records.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/shape_base.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/shape_base.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/umath.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/umath.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ctypeslib.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ctypeslib.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/dtypes.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/dtypes.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/exceptions.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/exceptions.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/_pocketfft.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/_pocketfft.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/helper.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/helper.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/_version.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/_version.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraypad.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraypad.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraysetops.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraysetops.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arrayterator.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arrayterator.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/format.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/format.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/function_base.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/function_base.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/histograms.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/histograms.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/index_tricks.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/index_tricks.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/mixins.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/mixins.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/nanfunctions.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/nanfunctions.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/npyio.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/npyio.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/polynomial.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/polynomial.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/scimath.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/scimath.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/shape_base.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/shape_base.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/stride_tricks.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/stride_tricks.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/twodim_base.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/twodim_base.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/type_check.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/type_check.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/ufunclike.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/ufunclike.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/utils.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/utils.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/linalg.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/linalg.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/core.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/core.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/extras.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/extras.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/mrecords.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/mrecords.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/_polybase.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/_polybase.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/laguerre.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/laguerre.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/legendre.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/legendre.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polynomial.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polynomial.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polyutils.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polyutils.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_generator.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_generator.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_mt19937.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_mt19937.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_pcg64.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_pcg64.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_philox.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_philox.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_sfc64.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_sfc64.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/bit_generator.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/bit_generator.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/mtrand.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/mtrand.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/utils.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/utils.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/typing/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/typing/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/version.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/version.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/os/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/os/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/os/path.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/os/path.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/pathlib.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/pathlib.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/posixpath.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/posixpath.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/re.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/re.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_compile.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_compile.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_constants.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_constants.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_parse.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_parse.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/string.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/string.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/subprocess.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/subprocess.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/_monitoring.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/_monitoring.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/textwrap.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/textwrap.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/threading.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/threading.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/time.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/time.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/types.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/types.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/typing.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/typing.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/typing_extensions.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/typing_extensions.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/__init__.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/__init__.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/_log.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/_log.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/async_case.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/async_case.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/case.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/case.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/loader.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/loader.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/main.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/main.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/result.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/result.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/runner.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/runner.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/signals.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/signals.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/suite.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/suite.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/warnings.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/warnings.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/zipfile.data.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/3.12/zipfile.meta.json +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/.mypy_cache/CACHEDIR.TAG +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/constants.py +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/exceptions.py +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/lie/se3.py +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/limits/__init__.py +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/limits/exceptions.py +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/py.typed +0 -0
- {mink-0.0.1 → mink-0.0.3}/mink/tasks/exceptions.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: mink
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.3
|
4
4
|
Summary: mink: MuJoCo inverse kinematics.
|
5
5
|
Keywords: inverse,kinematics,mujoco
|
6
6
|
Author-email: Kevin Zakka <zakka@berkeley.edu>
|
@@ -11,26 +11,31 @@ Classifier: Framework :: Robot Framework :: Library
|
|
11
11
|
Classifier: Intended Audience :: Developers
|
12
12
|
Classifier: Intended Audience :: Science/Research
|
13
13
|
Classifier: License :: OSI Approved :: Apache Software License
|
14
|
+
Classifier: Programming Language :: Python :: 3.9
|
14
15
|
Classifier: Programming Language :: Python :: 3.10
|
15
16
|
Classifier: Programming Language :: Python :: 3.11
|
16
17
|
Classifier: Programming Language :: Python :: 3.12
|
17
18
|
Classifier: Topic :: Scientific/Engineering
|
18
19
|
Requires-Dist: mujoco >= 3.1.6
|
19
|
-
Requires-Dist: qpsolvers >= 4.3.1
|
20
|
-
Requires-Dist: quadprog >= 0.1.11
|
20
|
+
Requires-Dist: qpsolvers[quadprog] >= 4.3.1
|
21
21
|
Requires-Dist: typing_extensions
|
22
|
-
Requires-Dist:
|
23
|
-
Requires-Dist:
|
22
|
+
Requires-Dist: numpy < 2.0.0
|
23
|
+
Requires-Dist: mink[examples,dev] ; extra == "all"
|
24
24
|
Requires-Dist: black ; extra == "dev"
|
25
25
|
Requires-Dist: mink[test] ; extra == "dev"
|
26
|
-
Requires-Dist:
|
26
|
+
Requires-Dist: mypy ; extra == "dev"
|
27
|
+
Requires-Dist: ruff ; extra == "dev"
|
27
28
|
Requires-Dist: dm_control >= 1.0.20 ; extra == "examples"
|
29
|
+
Requires-Dist: loop-rate-limiters >= 0.1.0 ; extra == "examples"
|
30
|
+
Requires-Dist: qpsolvers[quadprog,osqp] >= 4.3.1 ; extra == "examples"
|
28
31
|
Requires-Dist: absl-py ; extra == "test"
|
32
|
+
Requires-Dist: coveralls ; extra == "test"
|
29
33
|
Requires-Dist: pytest ; extra == "test"
|
30
34
|
Requires-Dist: robot_descriptions >= 1.9.0 ; extra == "test"
|
31
35
|
Project-URL: Changelog, https://github.com/kevinzakka/mink/blob/main/CHANGELOG.md
|
32
36
|
Project-URL: Source, https://github.com/kevinzakka/mink
|
33
37
|
Project-URL: Tracker, https://github.com/kevinzakka/mink/issues
|
38
|
+
Provides-Extra: all
|
34
39
|
Provides-Extra: dev
|
35
40
|
Provides-Extra: examples
|
36
41
|
Provides-Extra: test
|
@@ -38,21 +43,44 @@ Provides-Extra: test
|
|
38
43
|
# mink
|
39
44
|
|
40
45
|
[](https://github.com/kevinzakka/mink/actions)
|
46
|
+
[](https://coveralls.io/github/kevinzakka/mink?branch=main)
|
47
|
+
[](https://pypi.org/project/mink/)
|
48
|
+

|
41
49
|
|
42
50
|
mink is a library for differential inverse kinematics in Python, based on the [MuJoCo](https://github.com/google-deepmind/mujoco) physics engine.
|
43
51
|
|
52
|
+
Features include:
|
53
|
+
|
54
|
+
* Task specification in configuration or operational space;
|
55
|
+
* Limits on joint positions and velocities;
|
56
|
+
* Collision avoidance between any geom pair;
|
57
|
+
* Lie group interface for rigid body transformations.
|
58
|
+
|
59
|
+
For usage and API reference, see the [documentation](https://kevinzakka.github.io/mink/).
|
60
|
+
|
44
61
|
## Installation
|
45
62
|
|
63
|
+
You can install `mink` using `pip`:
|
64
|
+
|
46
65
|
```bash
|
47
|
-
pip install
|
66
|
+
pip install mink
|
67
|
+
```
|
68
|
+
|
69
|
+
To include the example dependencies:
|
70
|
+
|
71
|
+
```bash
|
72
|
+
pip install "mink[examples]"
|
48
73
|
```
|
49
74
|
|
50
75
|
## Examples
|
51
76
|
|
77
|
+
mink works with a variety of robots, including:
|
78
|
+
|
52
79
|
* Arms: [UR5e](https://github.com/kevinzakka/mink/blob/main/examples/arm_ur5e_actuators.py), [iiwa14](https://github.com/kevinzakka/mink/blob/main/examples/arm_iiwa.py), [bimanual iiwa14](https://github.com/kevinzakka/mink/blob/main/examples/dual_iiwa.py)
|
53
80
|
* Humanoids: [Unitree G1](https://github.com/kevinzakka/mink/blob/main/examples/humanoid_g1.py)
|
54
81
|
* Quadrupeds: [Unitree Go1](https://github.com/kevinzakka/mink/blob/main/examples/quadruped_go1.py), [Boston Dynamics Spot](https://github.com/kevinzakka/mink/blob/main/examples/quadruped_spot.py)
|
55
|
-
* Hands: [Shadow Hand]()
|
82
|
+
* Hands: [Shadow Hand](https://github.com/kevinzakka/mink/blob/main/examples/hand_shadow.py), [Allegro Hand](https://github.com/kevinzakka/mink/blob/main/examples/arm_hand_iiwa_allegro.py)
|
83
|
+
* Mobile manipulators: [Stanford TidyBot](https://github.com/kevinzakka/mink/blob/main/examples/mobile_tidybot.py), [Hello Robot Stretch](https://github.com/kevinzakka/mink/blob/main/examples/mobile_stretch.py)
|
56
84
|
|
57
85
|
Check out the [examples](https://github.com/kevinzakka/mink/blob/main/examples/) directory for more code.
|
58
86
|
|
@@ -62,7 +90,7 @@ Install the library, use it and report any bugs in the [issue tracker](https://g
|
|
62
90
|
|
63
91
|
## Acknowledgements
|
64
92
|
|
65
|
-
mink is a direct port of [
|
93
|
+
mink is a direct port of [Pink](https://github.com/stephane-caron/pink) which uses [Pinocchio](https://github.com/stack-of-tasks/pinocchio) under the hood. Stéphane Caron, the author of Pink, is a role model for open-source software in robotics. This library would not have been possible without his work and assistance throughout this project.
|
66
94
|
|
67
95
|
mink also heavily adapts code from the following libraries:
|
68
96
|
|
@@ -1,21 +1,44 @@
|
|
1
1
|
# mink
|
2
2
|
|
3
3
|
[](https://github.com/kevinzakka/mink/actions)
|
4
|
+
[](https://coveralls.io/github/kevinzakka/mink?branch=main)
|
5
|
+
[](https://pypi.org/project/mink/)
|
6
|
+

|
4
7
|
|
5
8
|
mink is a library for differential inverse kinematics in Python, based on the [MuJoCo](https://github.com/google-deepmind/mujoco) physics engine.
|
6
9
|
|
10
|
+
Features include:
|
11
|
+
|
12
|
+
* Task specification in configuration or operational space;
|
13
|
+
* Limits on joint positions and velocities;
|
14
|
+
* Collision avoidance between any geom pair;
|
15
|
+
* Lie group interface for rigid body transformations.
|
16
|
+
|
17
|
+
For usage and API reference, see the [documentation](https://kevinzakka.github.io/mink/).
|
18
|
+
|
7
19
|
## Installation
|
8
20
|
|
21
|
+
You can install `mink` using `pip`:
|
22
|
+
|
9
23
|
```bash
|
10
|
-
pip install
|
24
|
+
pip install mink
|
25
|
+
```
|
26
|
+
|
27
|
+
To include the example dependencies:
|
28
|
+
|
29
|
+
```bash
|
30
|
+
pip install "mink[examples]"
|
11
31
|
```
|
12
32
|
|
13
33
|
## Examples
|
14
34
|
|
35
|
+
mink works with a variety of robots, including:
|
36
|
+
|
15
37
|
* Arms: [UR5e](https://github.com/kevinzakka/mink/blob/main/examples/arm_ur5e_actuators.py), [iiwa14](https://github.com/kevinzakka/mink/blob/main/examples/arm_iiwa.py), [bimanual iiwa14](https://github.com/kevinzakka/mink/blob/main/examples/dual_iiwa.py)
|
16
38
|
* Humanoids: [Unitree G1](https://github.com/kevinzakka/mink/blob/main/examples/humanoid_g1.py)
|
17
39
|
* Quadrupeds: [Unitree Go1](https://github.com/kevinzakka/mink/blob/main/examples/quadruped_go1.py), [Boston Dynamics Spot](https://github.com/kevinzakka/mink/blob/main/examples/quadruped_spot.py)
|
18
|
-
* Hands: [Shadow Hand]()
|
40
|
+
* Hands: [Shadow Hand](https://github.com/kevinzakka/mink/blob/main/examples/hand_shadow.py), [Allegro Hand](https://github.com/kevinzakka/mink/blob/main/examples/arm_hand_iiwa_allegro.py)
|
41
|
+
* Mobile manipulators: [Stanford TidyBot](https://github.com/kevinzakka/mink/blob/main/examples/mobile_tidybot.py), [Hello Robot Stretch](https://github.com/kevinzakka/mink/blob/main/examples/mobile_stretch.py)
|
19
42
|
|
20
43
|
Check out the [examples](https://github.com/kevinzakka/mink/blob/main/examples/) directory for more code.
|
21
44
|
|
@@ -25,7 +48,7 @@ Install the library, use it and report any bugs in the [issue tracker](https://g
|
|
25
48
|
|
26
49
|
## Acknowledgements
|
27
50
|
|
28
|
-
mink is a direct port of [
|
51
|
+
mink is a direct port of [Pink](https://github.com/stephane-caron/pink) which uses [Pinocchio](https://github.com/stack-of-tasks/pinocchio) under the hood. Stéphane Caron, the author of Pink, is a role model for open-source software in robotics. This library would not have been possible without his work and assistance throughout this project.
|
29
52
|
|
30
53
|
mink also heavily adapts code from the following libraries:
|
31
54
|
|
@@ -25,7 +25,16 @@ from .limits import (
|
|
25
25
|
VelocityLimit,
|
26
26
|
)
|
27
27
|
from .solve_ik import build_ik, solve_ik
|
28
|
-
from .tasks import
|
28
|
+
from .tasks import (
|
29
|
+
ComTask,
|
30
|
+
DampingTask,
|
31
|
+
FrameTask,
|
32
|
+
Objective,
|
33
|
+
PostureTask,
|
34
|
+
RelativeFrameTask,
|
35
|
+
TargetNotSet,
|
36
|
+
Task,
|
37
|
+
)
|
29
38
|
from .utils import (
|
30
39
|
custom_configuration_vector,
|
31
40
|
get_body_geom_ids,
|
@@ -34,14 +43,14 @@ from .utils import (
|
|
34
43
|
move_mocap_to_frame,
|
35
44
|
)
|
36
45
|
|
37
|
-
__version__ = "0.0.1"
|
38
|
-
|
39
46
|
__all__ = (
|
40
47
|
"ComTask",
|
41
48
|
"Configuration",
|
42
49
|
"build_ik",
|
43
50
|
"solve_ik",
|
51
|
+
"DampingTask",
|
44
52
|
"FrameTask",
|
53
|
+
"RelativeFrameTask",
|
45
54
|
"PostureTask",
|
46
55
|
"Task",
|
47
56
|
"Objective",
|
@@ -1,3 +1,12 @@
|
|
1
|
+
"""Configuration space of a robot model.
|
2
|
+
|
3
|
+
The :class:`Configuration` class encapsulates a MuJoCo
|
4
|
+
`model <https://mujoco.readthedocs.io/en/latest/APIreference/APItypes.html#mjmodel>`__
|
5
|
+
and `data <https://mujoco.readthedocs.io/en/latest/APIreference/APItypes.html#mjdata>`__,
|
6
|
+
offering easy access to frame transforms and frame Jacobians. A frame refers to a coordinate
|
7
|
+
system that can be attached to various parts of the robot, such as a body, geom, or site.
|
8
|
+
"""
|
9
|
+
|
1
10
|
from typing import Optional
|
2
11
|
|
3
12
|
import mujoco
|
@@ -9,14 +18,19 @@ from .lie import SE3, SO3
|
|
9
18
|
|
10
19
|
|
11
20
|
class Configuration:
|
12
|
-
"""
|
13
|
-
|
21
|
+
"""Encapsulates a model and data for convenient access to kinematic quantities.
|
22
|
+
|
23
|
+
This class provides methods to access and update the kinematic quantities of a robot
|
24
|
+
model, such as frame transforms and Jacobians. It performs forward kinematics at every
|
25
|
+
time step, ensuring up-to-date information about the robot's state.
|
14
26
|
|
15
|
-
|
16
|
-
called, namely:
|
27
|
+
Key functionalities include:
|
17
28
|
|
18
|
-
|
19
|
-
|
29
|
+
* Running forward kinematics to update the state.
|
30
|
+
* Checking configuration limits.
|
31
|
+
* Computing Jacobians for different frames.
|
32
|
+
* Retrieving frame transforms relative to the world frame.
|
33
|
+
* Integrating velocities to update configurations.
|
20
34
|
"""
|
21
35
|
|
22
36
|
def __init__(
|
@@ -27,9 +41,9 @@ class Configuration:
|
|
27
41
|
"""Constructor.
|
28
42
|
|
29
43
|
Args:
|
30
|
-
model:
|
31
|
-
q:
|
32
|
-
is initialized to the
|
44
|
+
model: Mujoco model.
|
45
|
+
q: Configuration to initialize from. If None, the configuration
|
46
|
+
is initialized to the default configuration `qpos0`.
|
33
47
|
"""
|
34
48
|
self.model = model
|
35
49
|
self.data = mujoco.MjData(model)
|
@@ -38,15 +52,13 @@ class Configuration:
|
|
38
52
|
def update(self, q: Optional[np.ndarray] = None) -> None:
|
39
53
|
"""Run forward kinematics.
|
40
54
|
|
41
|
-
|
42
|
-
|
43
|
-
updated Jacobians.
|
44
|
-
|
45
|
-
Args:`
|
46
|
-
q: Optional configuration vector to override internal data.qpos with.
|
55
|
+
Args:
|
56
|
+
q: Optional configuration vector to override internal `data.qpos` with.
|
47
57
|
"""
|
48
58
|
if q is not None:
|
49
59
|
self.data.qpos = q
|
60
|
+
# The minimal function call required to get updated frame transforms is
|
61
|
+
# mj_kinematics. An extra call to mj_comPos is required for updated Jacobians.
|
50
62
|
mujoco.mj_kinematics(self.model, self.data)
|
51
63
|
mujoco.mj_comPos(self.model, self.data)
|
52
64
|
|
@@ -55,9 +67,6 @@ class Configuration:
|
|
55
67
|
|
56
68
|
Args:
|
57
69
|
key_name: The name of the keyframe.
|
58
|
-
|
59
|
-
Raises:
|
60
|
-
ValueError: if no key named `key` was found in the model.
|
61
70
|
"""
|
62
71
|
key_id = mujoco.mj_name2id(self.model, mujoco.mjtObj.mjOBJ_KEY, key_name)
|
63
72
|
if key_id == -1:
|
@@ -95,24 +104,27 @@ class Configuration:
|
|
95
104
|
)
|
96
105
|
else:
|
97
106
|
print(
|
98
|
-
f"Value {qval} at index {jnt} is
|
99
|
-
f"[{qmin}, {qmax}]"
|
107
|
+
f"Value {qval:.2f} at index {jnt} is outside of its limits: "
|
108
|
+
f"[{qmin:.2f}, {qmax:.2f}]"
|
100
109
|
)
|
101
110
|
|
102
111
|
def get_frame_jacobian(self, frame_name: str, frame_type: str) -> np.ndarray:
|
103
|
-
"""Compute the Jacobian matrix of a frame velocity.
|
112
|
+
r"""Compute the Jacobian matrix of a frame velocity.
|
113
|
+
|
114
|
+
Denoting our frame by :math:`B` and the world frame by :math:`W`, the
|
115
|
+
Jacobian matrix :math:`{}_B J_{WB}` is related to the body velocity
|
116
|
+
:math:`{}_B v_{WB}` by:
|
104
117
|
|
105
|
-
|
106
|
-
is related to the body velocity B_v_WB by:
|
118
|
+
.. math::
|
107
119
|
|
108
|
-
|
120
|
+
{}_B v_{WB} = {}_B J_{WB} \dot{q}
|
109
121
|
|
110
122
|
Args:
|
111
123
|
frame_name: Name of the frame in the MJCF.
|
112
124
|
frame_type: Type of frame. Can be a geom, a body or a site.
|
113
125
|
|
114
126
|
Returns:
|
115
|
-
Jacobian
|
127
|
+
Jacobian :math:`{}_B J_{WB}` of the frame.
|
116
128
|
"""
|
117
129
|
if frame_type not in consts.SUPPORTED_FRAMES:
|
118
130
|
raise exceptions.UnsupportedFrame(frame_type, consts.SUPPORTED_FRAMES)
|
@@ -142,9 +154,7 @@ class Configuration:
|
|
142
154
|
return jac
|
143
155
|
|
144
156
|
def get_transform_frame_to_world(self, frame_name: str, frame_type: str) -> SE3:
|
145
|
-
"""Get the pose of a frame
|
146
|
-
|
147
|
-
Denoting our frame by B and the world frame by W, this function returns T_WB.
|
157
|
+
"""Get the pose of a frame at the current configuration.
|
148
158
|
|
149
159
|
Args:
|
150
160
|
frame_name: Name of the frame in the MJCF.
|
@@ -173,11 +183,38 @@ class Configuration:
|
|
173
183
|
translation=xpos,
|
174
184
|
)
|
175
185
|
|
186
|
+
def get_transform(
|
187
|
+
self,
|
188
|
+
source_name: str,
|
189
|
+
source_type: str,
|
190
|
+
dest_name: str,
|
191
|
+
dest_type: str,
|
192
|
+
) -> SE3:
|
193
|
+
"""Get the pose of a frame with respect to another frame at the current
|
194
|
+
configuration.
|
195
|
+
|
196
|
+
Args:
|
197
|
+
source_name: Name of the frame in the MJCF.
|
198
|
+
source_type: Source type of frame. Can be a geom, a body or a site.
|
199
|
+
dest_name: Name of the frame to get the pose in.
|
200
|
+
dest_type: Dest type of frame. Can be a geom, a body or a site.
|
201
|
+
|
202
|
+
Returns:
|
203
|
+
The pose of `source_name` in `dest_name`.
|
204
|
+
"""
|
205
|
+
transform_source_to_world = self.get_transform_frame_to_world(
|
206
|
+
source_name, source_type
|
207
|
+
)
|
208
|
+
transform_dest_to_world = self.get_transform_frame_to_world(
|
209
|
+
dest_name, dest_type
|
210
|
+
)
|
211
|
+
return transform_dest_to_world.inverse() @ transform_source_to_world
|
212
|
+
|
176
213
|
def integrate(self, velocity: np.ndarray, dt: float) -> np.ndarray:
|
177
214
|
"""Integrate a velocity starting from the current configuration.
|
178
215
|
|
179
216
|
Args:
|
180
|
-
velocity: The velocity.
|
217
|
+
velocity: The velocity in tangent space.
|
181
218
|
dt: Integration duration in [s].
|
182
219
|
|
183
220
|
Returns:
|
@@ -191,7 +228,7 @@ class Configuration:
|
|
191
228
|
"""Integrate a velocity and update the current configuration inplace.
|
192
229
|
|
193
230
|
Args:
|
194
|
-
velocity: The velocity.
|
231
|
+
velocity: The velocity in tangent space.
|
195
232
|
dt: Integration duration in [s].
|
196
233
|
"""
|
197
234
|
mujoco.mj_integratePos(self.model, self.data.qpos, velocity, dt)
|
@@ -1,13 +1,12 @@
|
|
1
1
|
from .base import MatrixLieGroup
|
2
2
|
from .se3 import SE3
|
3
3
|
from .so3 import SO3
|
4
|
-
from .utils import get_epsilon,
|
4
|
+
from .utils import get_epsilon, skew
|
5
5
|
|
6
6
|
__all__ = (
|
7
7
|
"SE3",
|
8
8
|
"SO3",
|
9
9
|
"MatrixLieGroup",
|
10
10
|
"get_epsilon",
|
11
|
-
"mat2quat",
|
12
11
|
"skew",
|
13
12
|
)
|
@@ -10,8 +10,8 @@ class MatrixLieGroup(abc.ABC):
|
|
10
10
|
|
11
11
|
Attributes:
|
12
12
|
matrix_dim: Dimension of square matrix output.
|
13
|
-
parameters_dim
|
14
|
-
tangent_dim
|
13
|
+
parameters_dim: Dimension of underlying parameters.
|
14
|
+
tangent_dim: Dimension of tangent space.
|
15
15
|
space_dim: Dimension of coordinates that can be transformed.
|
16
16
|
"""
|
17
17
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
import mujoco
|
2
1
|
import numpy as np
|
3
2
|
|
4
3
|
|
@@ -17,13 +16,6 @@ def skew(x: np.ndarray) -> np.ndarray:
|
|
17
16
|
[0.0, -wz, wy],
|
18
17
|
[wz, 0.0, -wx],
|
19
18
|
[-wy, wx, 0.0],
|
20
|
-
]
|
19
|
+
],
|
20
|
+
dtype=x.dtype,
|
21
21
|
)
|
22
|
-
|
23
|
-
|
24
|
-
def mat2quat(mat: np.ndarray):
|
25
|
-
"""Convert a MuJoCo matrix (9,) to a quaternion (4,)."""
|
26
|
-
assert mat.shape == (9,)
|
27
|
-
quat = np.empty(4, dtype=np.float64)
|
28
|
-
mujoco.mju_mat2Quat(quat, mat)
|
29
|
-
return quat
|
@@ -1,32 +1,4 @@
|
|
1
|
-
"""Collision avoidance limit.
|
2
|
-
|
3
|
-
Derivation
|
4
|
-
==========
|
5
|
-
|
6
|
-
p1, p2: closest points between g1 and g2
|
7
|
-
d: distance between g1 and g2 (d = ||p1 - p2||)
|
8
|
-
n: normal vector from g1 to g2 (n = (p2 - p1) / ||p2 - p1||)
|
9
|
-
|
10
|
-
The relative velocity constraint between g1 and g2 is given by:
|
11
|
-
|
12
|
-
n^T [J2(p2) - J1(p1)] dq <= -k * (d - d_min) / dt
|
13
|
-
V_n <= -k * (d - d_min)
|
14
|
-
|
15
|
-
where [J2(p2) - J1(p1)] dq denotes the relative velocity between g1 and g2, and
|
16
|
-
n^T [J2(p2) - J1(p1)] dq projects this velocity onto the direction connecting the
|
17
|
-
closest points p1 and p2.
|
18
|
-
|
19
|
-
We have three cases for the distance d:
|
20
|
-
|
21
|
-
1. V_n <= R_b if dist_c < dist_m
|
22
|
-
2. V_n <= -k * (dist_c - dist_m) / dt + R_b if dist_m <= d <= dist_d
|
23
|
-
3. V_n <= inf otherwise
|
24
|
-
|
25
|
-
where:
|
26
|
-
- dist_c: current normal distance between g1 and g2
|
27
|
-
- dist_m: minimum allowed distance between g1 and g2
|
28
|
-
- dist_d: collision detection distance
|
29
|
-
"""
|
1
|
+
"""Collision avoidance limit."""
|
30
2
|
|
31
3
|
import itertools
|
32
4
|
from dataclasses import dataclass
|
@@ -63,6 +35,22 @@ class Contact:
|
|
63
35
|
return self.dist == self.distmax and not self.fromto.any()
|
64
36
|
|
65
37
|
|
38
|
+
def compute_contact_normal_jacobian(
|
39
|
+
model: mujoco.MjModel,
|
40
|
+
data: mujoco.MjData,
|
41
|
+
contact: Contact,
|
42
|
+
) -> np.ndarray:
|
43
|
+
geom1_body = model.geom_bodyid[contact.geom1]
|
44
|
+
geom2_body = model.geom_bodyid[contact.geom2]
|
45
|
+
geom1_contact_pos = contact.fromto[:3]
|
46
|
+
geom2_contact_pos = contact.fromto[3:]
|
47
|
+
jac2 = np.empty((3, model.nv))
|
48
|
+
mujoco.mj_jac(model, data, jac2, None, geom2_contact_pos, geom2_body)
|
49
|
+
jac1 = np.empty((3, model.nv))
|
50
|
+
mujoco.mj_jac(model, data, jac1, None, geom1_contact_pos, geom1_body)
|
51
|
+
return contact.normal @ (jac2 - jac1)
|
52
|
+
|
53
|
+
|
66
54
|
def _is_welded_together(model: mujoco.MjModel, geom_id1: int, geom_id2: int) -> bool:
|
67
55
|
"""Returns true if the geoms are part of the same body, or if their bodies are
|
68
56
|
welded together."""
|
@@ -107,7 +95,31 @@ def _is_pass_contype_conaffinity_check(
|
|
107
95
|
|
108
96
|
|
109
97
|
class CollisionAvoidanceLimit(Limit):
|
110
|
-
"""Normal velocity limit between geom pairs.
|
98
|
+
"""Normal velocity limit between geom pairs.
|
99
|
+
|
100
|
+
Attributes:
|
101
|
+
model: MuJoCo model.
|
102
|
+
geom_pairs: Set of collision pairs in which to perform active collision
|
103
|
+
avoidance. A collision pair is defined as a pair of geom groups. A geom
|
104
|
+
group is a set of geom names. For each geom pair, the solver will
|
105
|
+
attempt to compute joint velocities that avoid collisions between every
|
106
|
+
geom in the first geom group with every geom in the second geom group.
|
107
|
+
Self collision is achieved by adding a collision pair with the same
|
108
|
+
geom group in both pair fields.
|
109
|
+
gain: Gain factor in (0, 1] that determines how fast the geoms are
|
110
|
+
allowed to move towards each other at each iteration. Smaller values
|
111
|
+
are safer but may make the geoms move slower towards each other.
|
112
|
+
minimum_distance_from_collisions: The minimum distance to leave between
|
113
|
+
any two geoms. A negative distance allows the geoms to penetrate by
|
114
|
+
the specified amount.
|
115
|
+
collision_detection_distance: The distance between two geoms at which the
|
116
|
+
active collision avoidance limit will be active. A large value will
|
117
|
+
cause collisions to be detected early, but may incur high computational
|
118
|
+
cost. A negative value will cause the geoms to be detected only after
|
119
|
+
they penetrate by the specified amount.
|
120
|
+
bound_relaxation: An offset on the upper bound of each collision avoidance
|
121
|
+
constraint.
|
122
|
+
"""
|
111
123
|
|
112
124
|
def __init__(
|
113
125
|
self,
|
@@ -141,7 +153,7 @@ class CollisionAvoidanceLimit(Limit):
|
|
141
153
|
cost. A negative value will cause the geoms to be detected only after
|
142
154
|
they penetrate by the specified amount.
|
143
155
|
bound_relaxation: An offset on the upper bound of each collision avoidance
|
144
|
-
constraint
|
156
|
+
constraint.
|
145
157
|
"""
|
146
158
|
self.model = model
|
147
159
|
self.gain = gain
|
@@ -170,7 +182,9 @@ class CollisionAvoidanceLimit(Limit):
|
|
170
182
|
upper_bound[idx] = (self.gain * dist / dt) + self.bound_relaxation
|
171
183
|
else:
|
172
184
|
upper_bound[idx] = self.bound_relaxation
|
173
|
-
jac =
|
185
|
+
jac = compute_contact_normal_jacobian(
|
186
|
+
self.model, configuration.data, contact
|
187
|
+
)
|
174
188
|
coefficient_matrix[idx] = -jac
|
175
189
|
return Constraint(G=coefficient_matrix, h=upper_bound)
|
176
190
|
|
@@ -193,37 +207,6 @@ class CollisionAvoidanceLimit(Limit):
|
|
193
207
|
dist, fromto, geom1_id, geom2_id, self.collision_detection_distance
|
194
208
|
)
|
195
209
|
|
196
|
-
def _compute_contact_normal_jacobian(
|
197
|
-
self, data: mujoco.MjData, contact: Contact
|
198
|
-
) -> np.ndarray:
|
199
|
-
"""Computes the Jacobian mapping joint velocities to the normal component of
|
200
|
-
the relative Cartesian linear velocity between the geom pair.
|
201
|
-
|
202
|
-
The Jacobian-velocity relationship is given as:
|
203
|
-
|
204
|
-
J dq = n^T (v_2 - v_1)
|
205
|
-
|
206
|
-
where:
|
207
|
-
* J is the computed Jacobian.
|
208
|
-
* dq is the joint velocity vector.
|
209
|
-
* n^T is the transpose of the normal pointing from contact.geom1 to
|
210
|
-
contact.geom2.
|
211
|
-
* v_1, v_2 are the linear components of the Cartesian velocity of the two
|
212
|
-
closest points in contact.geom1 and contact.geom2.
|
213
|
-
|
214
|
-
Note: n^T (v_2 - v_1) is a scalar that is positive if the geoms are moving away
|
215
|
-
from each other, and negative if they are moving towards each other.
|
216
|
-
"""
|
217
|
-
geom1_body = self.model.geom_bodyid[contact.geom1]
|
218
|
-
geom2_body = self.model.geom_bodyid[contact.geom2]
|
219
|
-
geom1_contact_pos = contact.fromto[:3]
|
220
|
-
geom2_contact_pos = contact.fromto[3:]
|
221
|
-
jac2 = np.empty((3, self.model.nv))
|
222
|
-
mujoco.mj_jac(self.model, data, jac2, None, geom2_contact_pos, geom2_body)
|
223
|
-
jac1 = np.empty((3, self.model.nv))
|
224
|
-
mujoco.mj_jac(self.model, data, jac1, None, geom1_contact_pos, geom1_body)
|
225
|
-
return contact.normal @ (jac2 - jac1)
|
226
|
-
|
227
210
|
def _homogenize_geom_id_list(self, geom_list: GeomSequence) -> List[int]:
|
228
211
|
"""Take a heterogeneous list of geoms (specified via ID or name) and return
|
229
212
|
a homogenous list of IDs (int)."""
|
@@ -1,24 +1,4 @@
|
|
1
|
-
"""
|
2
|
-
|
3
|
-
Derivation
|
4
|
-
==========
|
5
|
-
|
6
|
-
Using a first order Taylor expansion on the configuration, we can write the limit as:
|
7
|
-
|
8
|
-
q_min <= q + v * dt <= q_max
|
9
|
-
q_min <= q + dq <= q_max
|
10
|
-
q_min - q <= dq <= q_max - q
|
11
|
-
|
12
|
-
Rewriting as G dq <= h:
|
13
|
-
|
14
|
-
+I * dq <= q_max - q
|
15
|
-
-I * dq <= q - q_min
|
16
|
-
|
17
|
-
Stacking them together, we get:
|
18
|
-
|
19
|
-
G = [+I, -I]
|
20
|
-
h = [q_max - q, q - q_min]
|
21
|
-
"""
|
1
|
+
"""Joint position limit."""
|
22
2
|
|
23
3
|
import mujoco
|
24
4
|
import numpy as np
|
@@ -30,16 +10,9 @@ from .limit import Constraint, Limit
|
|
30
10
|
|
31
11
|
|
32
12
|
class ConfigurationLimit(Limit):
|
33
|
-
"""
|
34
|
-
|
35
|
-
Floating base joints (joint type="free") are ignored.
|
13
|
+
"""Inequality constraint on joint positions in a robot model.
|
36
14
|
|
37
|
-
|
38
|
-
indices: Tangent indices corresponding to configuration-limited joints.
|
39
|
-
projection_matrix: Projection from tangent space to subspace with
|
40
|
-
configuration-limited joints.
|
41
|
-
lower: Lower configuration limit.
|
42
|
-
upper: Upper configuration limit.
|
15
|
+
Floating base joints are ignored.
|
43
16
|
"""
|
44
17
|
|
45
18
|
def __init__(
|
@@ -95,6 +68,26 @@ class ConfigurationLimit(Limit):
|
|
95
68
|
configuration: Configuration,
|
96
69
|
dt: float,
|
97
70
|
) -> Constraint:
|
71
|
+
r"""Compute the configuration-dependent joint position limits.
|
72
|
+
|
73
|
+
The limits are defined as:
|
74
|
+
|
75
|
+
.. math::
|
76
|
+
|
77
|
+
{q \ominus q_{min}} \leq \Delta q \leq {q_{max} \ominus q}
|
78
|
+
|
79
|
+
where :math:`q \in {\cal C}` is the robot's configuration and
|
80
|
+
:math:`\Delta q \in T_q({\cal C})` is the displacement in the tangent
|
81
|
+
space at :math:`q`. See the :ref:`derivations` section for more information.
|
82
|
+
|
83
|
+
Args:
|
84
|
+
configuration: Robot configuration :math:`q`.
|
85
|
+
dt: Integration timestep in [s].
|
86
|
+
|
87
|
+
Returns:
|
88
|
+
Pair :math:`(G, h)` representing the inequality constraint as
|
89
|
+
:math:`G \Delta q \leq h`, or ``None`` if there is no limit.
|
90
|
+
"""
|
98
91
|
del dt # Unused.
|
99
92
|
|
100
93
|
# Upper.
|