mink 0.0.2__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.2 → mink-0.0.3}/PKG-INFO +4 -3
- {mink-0.0.2 → mink-0.0.3}/README.md +3 -2
- {mink-0.0.2 → mink-0.0.3}/mink/__init__.py +2 -2
- {mink-0.0.2 → mink-0.0.3}/mink/configuration.py +41 -24
- {mink-0.0.2 → mink-0.0.3}/mink/lie/__init__.py +1 -2
- {mink-0.0.2 → mink-0.0.3}/mink/lie/utils.py +2 -10
- {mink-0.0.2 → mink-0.0.3}/mink/limits/collision_avoidance_limit.py +22 -35
- {mink-0.0.2 → mink-0.0.3}/mink/solve_ik.py +2 -2
- {mink-0.0.2 → mink-0.0.3}/mink/tasks/__init__.py +2 -0
- {mink-0.0.2 → mink-0.0.3}/mink/tasks/damping_task.py +2 -1
- {mink-0.0.2 → mink-0.0.3}/mink/tasks/posture_task.py +14 -5
- mink-0.0.3/mink/tasks/relative_frame_task.py +142 -0
- {mink-0.0.2 → mink-0.0.3}/pyproject.toml +14 -1
- mink-0.0.2/mink/lie/tests/__init__.py +0 -0
- mink-0.0.2/mink/lie/tests/test_axioms.py +0 -51
- mink-0.0.2/mink/lie/tests/test_operations.py +0 -77
- mink-0.0.2/mink/lie/tests/utils.py +0 -20
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/.gitignore +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/@plugins_snapshot.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/__future__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/__future__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_ast.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_ast.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_codecs.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_codecs.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_collections_abc.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_collections_abc.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_ctypes.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_ctypes.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_thread.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_thread.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_typeshed/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_typeshed/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_warnings.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_warnings.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/abc.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/abc.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/array.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/array.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/ast.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/ast.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/builtins.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/builtins.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/codecs.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/codecs.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/abc.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/abc.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/contextlib.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/contextlib.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/ctypes/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/ctypes/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/dataclasses.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/dataclasses.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/datetime.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/datetime.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/charset.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/charset.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/contentmanager.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/contentmanager.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/errors.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/errors.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/header.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/header.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/message.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/message.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/policy.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/policy.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/enum.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/enum.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/genericpath.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/genericpath.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/abc.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/abc.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/machinery.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/machinery.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/_meta.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/_meta.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/readers.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/readers.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/abc.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/abc.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/io.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/io.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/logging/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/logging/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/math.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/math.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/mink/limits/limit.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/mink/limits/limit.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/mmap.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/mmap.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_pytesttester.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_pytesttester.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_array_like.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_array_like.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_callable.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_callable.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_char_codes.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_char_codes.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nbit.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nbit.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_scalars.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_scalars.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_shape.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_shape.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_ufunc.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_ufunc.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/_convertions.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/_convertions.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_asarray.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_asarray.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_internal.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_internal.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_type_aliases.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_type_aliases.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_ufunc_config.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_ufunc_config.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/arrayprint.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/arrayprint.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/defchararray.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/defchararray.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/einsumfunc.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/einsumfunc.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/fromnumeric.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/fromnumeric.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/function_base.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/function_base.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/multiarray.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/multiarray.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numeric.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numeric.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numerictypes.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numerictypes.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/records.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/records.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/shape_base.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/shape_base.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/umath.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/umath.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ctypeslib.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ctypeslib.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/dtypes.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/dtypes.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/exceptions.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/exceptions.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/_pocketfft.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/_pocketfft.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/helper.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/helper.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/_version.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/_version.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraypad.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraypad.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraysetops.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraysetops.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arrayterator.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arrayterator.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/format.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/format.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/function_base.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/function_base.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/histograms.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/histograms.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/index_tricks.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/index_tricks.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/mixins.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/mixins.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/nanfunctions.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/nanfunctions.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/npyio.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/npyio.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/polynomial.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/polynomial.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/scimath.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/scimath.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/shape_base.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/shape_base.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/stride_tricks.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/stride_tricks.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/twodim_base.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/twodim_base.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/type_check.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/type_check.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/ufunclike.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/ufunclike.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/utils.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/utils.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/linalg.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/linalg.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/core.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/core.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/extras.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/extras.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/mrecords.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/mrecords.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/_polybase.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/_polybase.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/laguerre.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/laguerre.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/legendre.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/legendre.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polynomial.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polynomial.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polyutils.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polyutils.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_generator.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_generator.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_mt19937.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_mt19937.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_pcg64.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_pcg64.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_philox.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_philox.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_sfc64.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_sfc64.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/bit_generator.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/bit_generator.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/mtrand.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/mtrand.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/utils.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/utils.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/typing/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/typing/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/version.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/version.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/os/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/os/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/os/path.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/os/path.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/pathlib.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/pathlib.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/posixpath.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/posixpath.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/re.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/re.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_compile.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_compile.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_constants.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_constants.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_parse.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_parse.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/string.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/string.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/subprocess.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/subprocess.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/_monitoring.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/_monitoring.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/textwrap.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/textwrap.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/threading.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/threading.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/time.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/time.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/types.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/types.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/typing.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/typing.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/typing_extensions.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/typing_extensions.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/__init__.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/__init__.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/_log.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/_log.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/async_case.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/async_case.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/case.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/case.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/loader.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/loader.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/main.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/main.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/result.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/result.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/runner.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/runner.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/signals.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/signals.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/suite.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/suite.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/warnings.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/warnings.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/zipfile.data.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/zipfile.meta.json +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/CACHEDIR.TAG +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/constants.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/exceptions.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/lie/base.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/lie/se3.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/lie/so3.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/limits/__init__.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/limits/configuration_limit.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/limits/exceptions.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/limits/limit.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/limits/velocity_limit.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/py.typed +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/tasks/com_task.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/tasks/exceptions.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/tasks/frame_task.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/tasks/task.py +0 -0
- {mink-0.0.2 → mink-0.0.3}/mink/utils.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>
|
@@ -43,7 +43,7 @@ Provides-Extra: test
|
|
43
43
|
# mink
|
44
44
|
|
45
45
|
[](https://github.com/kevinzakka/mink/actions)
|
46
|
-
[](https://coveralls.io/github/kevinzakka/mink)
|
46
|
+
[](https://coveralls.io/github/kevinzakka/mink?branch=main)
|
47
47
|
[](https://pypi.org/project/mink/)
|
48
48
|

|
49
49
|
|
@@ -79,7 +79,8 @@ mink works with a variety of robots, including:
|
|
79
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)
|
80
80
|
* Humanoids: [Unitree G1](https://github.com/kevinzakka/mink/blob/main/examples/humanoid_g1.py)
|
81
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)
|
82
|
-
* Hands: [Shadow Hand](https://github.com/kevinzakka/mink/blob/main/examples/hand_shadow.py)
|
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)
|
83
84
|
|
84
85
|
Check out the [examples](https://github.com/kevinzakka/mink/blob/main/examples/) directory for more code.
|
85
86
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# mink
|
2
2
|
|
3
3
|
[](https://github.com/kevinzakka/mink/actions)
|
4
|
-
[](https://coveralls.io/github/kevinzakka/mink)
|
4
|
+
[](https://coveralls.io/github/kevinzakka/mink?branch=main)
|
5
5
|
[](https://pypi.org/project/mink/)
|
6
6
|

|
7
7
|
|
@@ -37,7 +37,8 @@ mink works with a variety of robots, including:
|
|
37
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)
|
38
38
|
* Humanoids: [Unitree G1](https://github.com/kevinzakka/mink/blob/main/examples/humanoid_g1.py)
|
39
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)
|
40
|
-
* Hands: [Shadow Hand](https://github.com/kevinzakka/mink/blob/main/examples/hand_shadow.py)
|
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)
|
41
42
|
|
42
43
|
Check out the [examples](https://github.com/kevinzakka/mink/blob/main/examples/) directory for more code.
|
43
44
|
|
@@ -31,6 +31,7 @@ from .tasks import (
|
|
31
31
|
FrameTask,
|
32
32
|
Objective,
|
33
33
|
PostureTask,
|
34
|
+
RelativeFrameTask,
|
34
35
|
TargetNotSet,
|
35
36
|
Task,
|
36
37
|
)
|
@@ -42,8 +43,6 @@ from .utils import (
|
|
42
43
|
move_mocap_to_frame,
|
43
44
|
)
|
44
45
|
|
45
|
-
__version__ = "0.0.2"
|
46
|
-
|
47
46
|
__all__ = (
|
48
47
|
"ComTask",
|
49
48
|
"Configuration",
|
@@ -51,6 +50,7 @@ __all__ = (
|
|
51
50
|
"solve_ik",
|
52
51
|
"DampingTask",
|
53
52
|
"FrameTask",
|
53
|
+
"RelativeFrameTask",
|
54
54
|
"PostureTask",
|
55
55
|
"Task",
|
56
56
|
"Objective",
|
@@ -1,12 +1,10 @@
|
|
1
1
|
"""Configuration space of a robot model.
|
2
2
|
|
3
|
-
The :class:`Configuration` class
|
3
|
+
The :class:`Configuration` class encapsulates a MuJoCo
|
4
|
+
`model <https://mujoco.readthedocs.io/en/latest/APIreference/APItypes.html#mjmodel>`__
|
4
5
|
and `data <https://mujoco.readthedocs.io/en/latest/APIreference/APItypes.html#mjdata>`__,
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
Frames are coordinate systems that can be attached to different elements of
|
9
|
-
the robot model. mink supports frames of type `body`, `geom` and `site`.
|
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.
|
10
8
|
"""
|
11
9
|
|
12
10
|
from typing import Optional
|
@@ -22,22 +20,17 @@ from .lie import SE3, SO3
|
|
22
20
|
class Configuration:
|
23
21
|
"""Encapsulates a model and data for convenient access to kinematic quantities.
|
24
22
|
|
25
|
-
This class provides
|
26
|
-
|
27
|
-
|
28
|
-
information about the robot's state.
|
29
|
-
|
30
|
-
In this context, a frame refers to a coordinate system that can be attached to
|
31
|
-
different elements of the robot model. Currently supported frames include
|
32
|
-
`body`, `geom` and `site`.
|
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.
|
33
26
|
|
34
27
|
Key functionalities include:
|
35
28
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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.
|
41
34
|
"""
|
42
35
|
|
43
36
|
def __init__(
|
@@ -50,7 +43,7 @@ class Configuration:
|
|
50
43
|
Args:
|
51
44
|
model: Mujoco model.
|
52
45
|
q: Configuration to initialize from. If None, the configuration
|
53
|
-
is initialized to the
|
46
|
+
is initialized to the default configuration `qpos0`.
|
54
47
|
"""
|
55
48
|
self.model = model
|
56
49
|
self.data = mujoco.MjData(model)
|
@@ -60,7 +53,7 @@ class Configuration:
|
|
60
53
|
"""Run forward kinematics.
|
61
54
|
|
62
55
|
Args:
|
63
|
-
q: Optional configuration vector to override internal data.qpos with.
|
56
|
+
q: Optional configuration vector to override internal `data.qpos` with.
|
64
57
|
"""
|
65
58
|
if q is not None:
|
66
59
|
self.data.qpos = q
|
@@ -74,9 +67,6 @@ class Configuration:
|
|
74
67
|
|
75
68
|
Args:
|
76
69
|
key_name: The name of the keyframe.
|
77
|
-
|
78
|
-
Raises:
|
79
|
-
ValueError: if no key named `key` was found in the model.
|
80
70
|
"""
|
81
71
|
key_id = mujoco.mj_name2id(self.model, mujoco.mjtObj.mjOBJ_KEY, key_name)
|
82
72
|
if key_id == -1:
|
@@ -193,6 +183,33 @@ class Configuration:
|
|
193
183
|
translation=xpos,
|
194
184
|
)
|
195
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
|
+
|
196
213
|
def integrate(self, velocity: np.ndarray, dt: float) -> np.ndarray:
|
197
214
|
"""Integrate a velocity starting from the current configuration.
|
198
215
|
|
@@ -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
|
)
|
@@ -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
|
@@ -18,7 +18,7 @@ CollisionPairs = Sequence[CollisionPair]
|
|
18
18
|
|
19
19
|
|
20
20
|
@dataclass(frozen=True)
|
21
|
-
class
|
21
|
+
class Contact:
|
22
22
|
dist: float
|
23
23
|
fromto: np.ndarray
|
24
24
|
geom1: int
|
@@ -35,6 +35,22 @@ class _Contact:
|
|
35
35
|
return self.dist == self.distmax and not self.fromto.any()
|
36
36
|
|
37
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
|
+
|
38
54
|
def _is_welded_together(model: mujoco.MjModel, geom_id1: int, geom_id2: int) -> bool:
|
39
55
|
"""Returns true if the geoms are part of the same body, or if their bodies are
|
40
56
|
welded together."""
|
@@ -166,7 +182,9 @@ class CollisionAvoidanceLimit(Limit):
|
|
166
182
|
upper_bound[idx] = (self.gain * dist / dt) + self.bound_relaxation
|
167
183
|
else:
|
168
184
|
upper_bound[idx] = self.bound_relaxation
|
169
|
-
jac =
|
185
|
+
jac = compute_contact_normal_jacobian(
|
186
|
+
self.model, configuration.data, contact
|
187
|
+
)
|
170
188
|
coefficient_matrix[idx] = -jac
|
171
189
|
return Constraint(G=coefficient_matrix, h=upper_bound)
|
172
190
|
|
@@ -174,7 +192,7 @@ class CollisionAvoidanceLimit(Limit):
|
|
174
192
|
|
175
193
|
def _compute_contact_with_minimum_distance(
|
176
194
|
self, data: mujoco.MjData, geom1_id: int, geom2_id: int
|
177
|
-
) ->
|
195
|
+
) -> Contact:
|
178
196
|
"""Returns the smallest signed distance between a geom pair."""
|
179
197
|
fromto = np.empty(6)
|
180
198
|
dist = mujoco.mj_geomDistance(
|
@@ -185,41 +203,10 @@ class CollisionAvoidanceLimit(Limit):
|
|
185
203
|
self.collision_detection_distance,
|
186
204
|
fromto,
|
187
205
|
)
|
188
|
-
return
|
206
|
+
return Contact(
|
189
207
|
dist, fromto, geom1_id, geom2_id, self.collision_detection_distance
|
190
208
|
)
|
191
209
|
|
192
|
-
def _compute_contact_normal_jacobian(
|
193
|
-
self, data: mujoco.MjData, contact: _Contact
|
194
|
-
) -> np.ndarray:
|
195
|
-
"""Computes the Jacobian mapping joint velocities to the normal component of
|
196
|
-
the relative Cartesian linear velocity between the geom pair.
|
197
|
-
|
198
|
-
The Jacobian-velocity relationship is given as:
|
199
|
-
|
200
|
-
J dq = n^T (v_2 - v_1)
|
201
|
-
|
202
|
-
where:
|
203
|
-
* J is the computed Jacobian.
|
204
|
-
* dq is the joint velocity vector.
|
205
|
-
* n^T is the transpose of the normal pointing from contact.geom1 to
|
206
|
-
contact.geom2.
|
207
|
-
* v_1, v_2 are the linear components of the Cartesian velocity of the two
|
208
|
-
closest points in contact.geom1 and contact.geom2.
|
209
|
-
|
210
|
-
Note: n^T (v_2 - v_1) is a scalar that is positive if the geoms are moving away
|
211
|
-
from each other, and negative if they are moving towards each other.
|
212
|
-
"""
|
213
|
-
geom1_body = self.model.geom_bodyid[contact.geom1]
|
214
|
-
geom2_body = self.model.geom_bodyid[contact.geom2]
|
215
|
-
geom1_contact_pos = contact.fromto[:3]
|
216
|
-
geom2_contact_pos = contact.fromto[3:]
|
217
|
-
jac2 = np.empty((3, self.model.nv))
|
218
|
-
mujoco.mj_jac(self.model, data, jac2, None, geom2_contact_pos, geom2_body)
|
219
|
-
jac1 = np.empty((3, self.model.nv))
|
220
|
-
mujoco.mj_jac(self.model, data, jac1, None, geom1_contact_pos, geom1_body)
|
221
|
-
return contact.normal @ (jac2 - jac1)
|
222
|
-
|
223
210
|
def _homogenize_geom_id_list(self, geom_list: GeomSequence) -> List[int]:
|
224
211
|
"""Take a heterogeneous list of geoms (specified via ID or name) and return
|
225
212
|
a homogenous list of IDs (int)."""
|
@@ -27,8 +27,8 @@ def _compute_qp_inequalities(
|
|
27
27
|
) -> tuple[Optional[np.ndarray], Optional[np.ndarray]]:
|
28
28
|
if limits is None:
|
29
29
|
limits = [ConfigurationLimit(configuration.model)]
|
30
|
-
G_list = []
|
31
|
-
h_list = []
|
30
|
+
G_list: list[np.ndarray] = []
|
31
|
+
h_list: list[np.ndarray] = []
|
32
32
|
for limit in limits:
|
33
33
|
inequality = limit.compute_qp_inequalities(configuration, dt)
|
34
34
|
if not inequality.inactive:
|
@@ -11,6 +11,7 @@ from .exceptions import (
|
|
11
11
|
)
|
12
12
|
from .frame_task import FrameTask
|
13
13
|
from .posture_task import PostureTask
|
14
|
+
from .relative_frame_task import RelativeFrameTask
|
14
15
|
from .task import Objective, Task
|
15
16
|
|
16
17
|
__all__ = (
|
@@ -19,6 +20,7 @@ __all__ = (
|
|
19
20
|
"Objective",
|
20
21
|
"DampingTask",
|
21
22
|
"PostureTask",
|
23
|
+
"RelativeFrameTask",
|
22
24
|
"Task",
|
23
25
|
"TargetNotSet",
|
24
26
|
"InvalidTarget",
|
@@ -3,6 +3,7 @@
|
|
3
3
|
from __future__ import annotations
|
4
4
|
|
5
5
|
import mujoco
|
6
|
+
import numpy.typing as npt
|
6
7
|
|
7
8
|
from .posture_task import PostureTask
|
8
9
|
|
@@ -14,6 +15,6 @@ class DampingTask(PostureTask):
|
|
14
15
|
target configuration are set to 0 and qpos0 respectively.
|
15
16
|
"""
|
16
17
|
|
17
|
-
def __init__(self, model: mujoco.MjModel, cost:
|
18
|
+
def __init__(self, model: mujoco.MjModel, cost: npt.ArrayLike):
|
18
19
|
super().__init__(model=model, cost=cost, gain=0.0, lm_damping=0.0)
|
19
20
|
self.target_q = model.qpos0
|
@@ -29,15 +29,12 @@ class PostureTask(Task):
|
|
29
29
|
def __init__(
|
30
30
|
self,
|
31
31
|
model: mujoco.MjModel,
|
32
|
-
cost:
|
32
|
+
cost: npt.ArrayLike,
|
33
33
|
gain: float = 1.0,
|
34
34
|
lm_damping: float = 0.0,
|
35
35
|
):
|
36
|
-
if cost < 0.0:
|
37
|
-
raise TaskDefinitionError(f"{self.__class__.__name__} cost must be >= 0")
|
38
|
-
|
39
36
|
super().__init__(
|
40
|
-
cost=np.
|
37
|
+
cost=np.zeros((model.nv,)),
|
41
38
|
gain=gain,
|
42
39
|
lm_damping=lm_damping,
|
43
40
|
)
|
@@ -52,6 +49,18 @@ class PostureTask(Task):
|
|
52
49
|
|
53
50
|
self.k = model.nv
|
54
51
|
self.nq = model.nq
|
52
|
+
self.set_cost(cost)
|
53
|
+
|
54
|
+
def set_cost(self, cost: npt.ArrayLike) -> None:
|
55
|
+
cost = np.atleast_1d(cost)
|
56
|
+
if cost.ndim != 1 or cost.shape[0] not in (1, self.k):
|
57
|
+
raise TaskDefinitionError(
|
58
|
+
f"{self.__class__.__name__} cost must be a vector of shape (1,) "
|
59
|
+
f"(aka identical cost for all dofs) or ({self.k},). Got {cost.shape}"
|
60
|
+
)
|
61
|
+
if not np.all(cost >= 0.0):
|
62
|
+
raise TaskDefinitionError(f"{self.__class__.__name__} cost should be >= 0")
|
63
|
+
self.cost[: self.k] = cost
|
55
64
|
|
56
65
|
def set_target(self, target_q: npt.ArrayLike) -> None:
|
57
66
|
"""Set the target posture.
|
@@ -0,0 +1,142 @@
|
|
1
|
+
"""Relative frame task implementation."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
from typing import Optional
|
6
|
+
|
7
|
+
import numpy as np
|
8
|
+
import numpy.typing as npt
|
9
|
+
|
10
|
+
from ..configuration import Configuration
|
11
|
+
from ..lie import SE3
|
12
|
+
from .exceptions import TargetNotSet, TaskDefinitionError
|
13
|
+
from .task import Task
|
14
|
+
|
15
|
+
|
16
|
+
class RelativeFrameTask(Task):
|
17
|
+
"""Regulate the pose of a frame relative to another frame.
|
18
|
+
|
19
|
+
Attributes:
|
20
|
+
frame_name: Name of the frame to regulate, typically the name of body, geom
|
21
|
+
or site in the robot model.
|
22
|
+
frame_type: The frame type: `body`, `geom` or `site`.
|
23
|
+
root_name: Name of the frame the task is relative to.
|
24
|
+
root_type: The root frame type: `body`, `geom` or `site`.
|
25
|
+
transform_target_to_root: Target pose in the root frame.
|
26
|
+
"""
|
27
|
+
|
28
|
+
k: int = 6
|
29
|
+
transform_target_to_root: Optional[SE3]
|
30
|
+
|
31
|
+
def __init__(
|
32
|
+
self,
|
33
|
+
frame_name: str,
|
34
|
+
frame_type: str,
|
35
|
+
root_name: str,
|
36
|
+
root_type: str,
|
37
|
+
position_cost: npt.ArrayLike,
|
38
|
+
orientation_cost: npt.ArrayLike,
|
39
|
+
gain: float = 1.0,
|
40
|
+
lm_damping: float = 0.0,
|
41
|
+
):
|
42
|
+
super().__init__(cost=np.zeros((self.k,)), gain=gain, lm_damping=lm_damping)
|
43
|
+
self.frame_name = frame_name
|
44
|
+
self.frame_type = frame_type
|
45
|
+
self.root_name = root_name
|
46
|
+
self.root_type = root_type
|
47
|
+
self.position_cost = position_cost
|
48
|
+
self.orientation_cost = orientation_cost
|
49
|
+
self.transform_target_to_root = None
|
50
|
+
|
51
|
+
self.set_position_cost(position_cost)
|
52
|
+
self.set_orientation_cost(orientation_cost)
|
53
|
+
|
54
|
+
def set_position_cost(self, position_cost: npt.ArrayLike) -> None:
|
55
|
+
position_cost = np.atleast_1d(position_cost)
|
56
|
+
if position_cost.ndim != 1 or position_cost.shape[0] not in (1, 3):
|
57
|
+
raise TaskDefinitionError(
|
58
|
+
f"{self.__class__.__name__} position cost should be a vector of shape "
|
59
|
+
"1 (aka identical cost for all coordinates) or (3,) but got "
|
60
|
+
f"{position_cost.shape}"
|
61
|
+
)
|
62
|
+
if not np.all(position_cost >= 0.0):
|
63
|
+
raise TaskDefinitionError(
|
64
|
+
f"{self.__class__.__name__} position cost should be >= 0"
|
65
|
+
)
|
66
|
+
self.cost[:3] = position_cost
|
67
|
+
|
68
|
+
def set_orientation_cost(self, orientation_cost: npt.ArrayLike) -> None:
|
69
|
+
orientation_cost = np.atleast_1d(orientation_cost)
|
70
|
+
if orientation_cost.ndim != 1 or orientation_cost.shape[0] not in (1, 3):
|
71
|
+
raise TaskDefinitionError(
|
72
|
+
f"{self.__class__.__name__} orientation cost should be a vector of "
|
73
|
+
"shape 1 (aka identical cost for all coordinates) or (3,) but got "
|
74
|
+
f"{orientation_cost.shape}"
|
75
|
+
)
|
76
|
+
if not np.all(orientation_cost >= 0.0):
|
77
|
+
raise TaskDefinitionError(
|
78
|
+
f"{self.__class__.__name__} position cost should be >= 0"
|
79
|
+
)
|
80
|
+
self.cost[3:] = orientation_cost
|
81
|
+
|
82
|
+
def set_target(self, transform_target_to_root: SE3) -> None:
|
83
|
+
"""Set the target pose in the root frame.
|
84
|
+
|
85
|
+
Args:
|
86
|
+
transform_target_to_root: Transform from the task target frame to the
|
87
|
+
root frame.
|
88
|
+
"""
|
89
|
+
self.transform_target_to_root = transform_target_to_root.copy()
|
90
|
+
|
91
|
+
def set_target_from_configuration(self, configuration: Configuration) -> None:
|
92
|
+
"""Set the target pose from a given robot configuration.
|
93
|
+
|
94
|
+
Args:
|
95
|
+
configuration: Robot configuration :math:`q`.
|
96
|
+
"""
|
97
|
+
self.set_target(
|
98
|
+
configuration.get_transform(
|
99
|
+
self.frame_name,
|
100
|
+
self.frame_type,
|
101
|
+
self.root_name,
|
102
|
+
self.root_type,
|
103
|
+
)
|
104
|
+
)
|
105
|
+
|
106
|
+
def compute_error(self, configuration: Configuration) -> np.ndarray:
|
107
|
+
if self.transform_target_to_root is None:
|
108
|
+
raise TargetNotSet(self.__class__.__name__)
|
109
|
+
|
110
|
+
transform_frame_to_root = configuration.get_transform(
|
111
|
+
self.frame_name,
|
112
|
+
self.frame_type,
|
113
|
+
self.root_name,
|
114
|
+
self.root_type,
|
115
|
+
)
|
116
|
+
return transform_frame_to_root.rminus(self.transform_target_to_root)
|
117
|
+
|
118
|
+
def compute_jacobian(self, configuration: Configuration) -> np.ndarray:
|
119
|
+
if self.transform_target_to_root is None:
|
120
|
+
raise TargetNotSet(self.__class__.__name__)
|
121
|
+
|
122
|
+
jacobian_frame_in_frame = configuration.get_frame_jacobian(
|
123
|
+
self.frame_name, self.frame_type
|
124
|
+
)
|
125
|
+
jacobian_root_in_root = configuration.get_frame_jacobian(
|
126
|
+
self.root_name, self.root_type
|
127
|
+
)
|
128
|
+
|
129
|
+
transform_frame_to_root = configuration.get_transform(
|
130
|
+
self.frame_name,
|
131
|
+
self.frame_type,
|
132
|
+
self.root_name,
|
133
|
+
self.root_type,
|
134
|
+
)
|
135
|
+
transform_frame_to_target = (
|
136
|
+
self.transform_target_to_root.inverse() @ transform_frame_to_root
|
137
|
+
)
|
138
|
+
|
139
|
+
return transform_frame_to_target.jlog() @ (
|
140
|
+
jacobian_frame_in_frame
|
141
|
+
- transform_frame_to_root.inverse().adjoint() @ jacobian_root_in_root
|
142
|
+
)
|
@@ -4,12 +4,13 @@ build-backend = "flit_core.buildapi"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "mink"
|
7
|
+
version = "0.0.3"
|
7
8
|
readme = "README.md"
|
8
9
|
authors = [
|
9
10
|
{name = "Kevin Zakka", email = "zakka@berkeley.edu"},
|
10
11
|
]
|
11
12
|
requires-python = ">=3.9"
|
12
|
-
dynamic = ["
|
13
|
+
dynamic = ["description"]
|
13
14
|
classifiers = [
|
14
15
|
"Development Status :: 5 - Production/Stable",
|
15
16
|
"Framework :: Robot Framework :: Library",
|
@@ -91,3 +92,15 @@ python_version = "3.12"
|
|
91
92
|
ignore_missing_imports = true
|
92
93
|
warn_unused_configs = true
|
93
94
|
exclude = ["scripts/"]
|
95
|
+
|
96
|
+
[tool.coverage.report]
|
97
|
+
exclude_also = [
|
98
|
+
"raise NotImplementedError",
|
99
|
+
"if __name__ == .__main__.:",
|
100
|
+
"class .*\\bProtocol\\):",
|
101
|
+
"@(abc\\.)?abstractmethod",
|
102
|
+
"def __repr__",
|
103
|
+
]
|
104
|
+
omit = [
|
105
|
+
"*exceptions.py",
|
106
|
+
]
|
File without changes
|
@@ -1,51 +0,0 @@
|
|
1
|
-
"""Tests for group axioms."""
|
2
|
-
|
3
|
-
from typing import Type
|
4
|
-
|
5
|
-
from absl.testing import absltest, parameterized
|
6
|
-
|
7
|
-
from mink import lie
|
8
|
-
|
9
|
-
from ..base import MatrixLieGroup
|
10
|
-
from .utils import assert_transforms_close
|
11
|
-
|
12
|
-
|
13
|
-
@parameterized.named_parameters(
|
14
|
-
("SO3", lie.SO3),
|
15
|
-
("SE3", lie.SE3),
|
16
|
-
)
|
17
|
-
class TestAxioms(parameterized.TestCase):
|
18
|
-
def test_closure(self, group: Type[MatrixLieGroup]):
|
19
|
-
transform_a = group.sample_uniform()
|
20
|
-
transform_b = group.sample_uniform()
|
21
|
-
composed = transform_a @ transform_b
|
22
|
-
assert_transforms_close(composed, composed.normalize())
|
23
|
-
composed = transform_b @ transform_a
|
24
|
-
assert_transforms_close(composed, composed.normalize())
|
25
|
-
composed = transform_a @ transform_b
|
26
|
-
assert_transforms_close(composed, composed.normalize())
|
27
|
-
|
28
|
-
def test_identity(self, group: Type[MatrixLieGroup]):
|
29
|
-
transform = group.sample_uniform()
|
30
|
-
identity = group.identity()
|
31
|
-
assert_transforms_close(transform, identity @ transform)
|
32
|
-
assert_transforms_close(transform, transform @ identity)
|
33
|
-
|
34
|
-
def test_inverse(self, group: Type[MatrixLieGroup]):
|
35
|
-
transform = group.sample_uniform()
|
36
|
-
identity = group.identity()
|
37
|
-
assert_transforms_close(identity, transform.inverse() @ transform)
|
38
|
-
assert_transforms_close(identity, transform @ transform.inverse())
|
39
|
-
|
40
|
-
def test_associative(self, group: Type[MatrixLieGroup]):
|
41
|
-
transform_a = group.sample_uniform()
|
42
|
-
transform_b = group.sample_uniform()
|
43
|
-
transform_c = group.sample_uniform()
|
44
|
-
assert_transforms_close(
|
45
|
-
(transform_a @ transform_b) @ transform_c,
|
46
|
-
transform_a @ (transform_b @ transform_c),
|
47
|
-
)
|
48
|
-
|
49
|
-
|
50
|
-
if __name__ == "__main__":
|
51
|
-
absltest.main()
|