mink 0.0.1__py3-none-any.whl → 0.0.3__py3-none-any.whl
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/__init__.py +12 -3
- mink/configuration.py +67 -30
- mink/lie/__init__.py +1 -2
- mink/lie/base.py +2 -2
- mink/lie/so3.py +2 -0
- mink/lie/utils.py +2 -10
- mink/limits/collision_avoidance_limit.py +46 -63
- mink/limits/configuration_limit.py +23 -30
- mink/limits/limit.py +27 -9
- mink/limits/velocity_limit.py +30 -23
- mink/solve_ik.py +2 -2
- mink/tasks/__init__.py +4 -0
- mink/tasks/com_task.py +24 -9
- mink/tasks/damping_task.py +20 -0
- mink/tasks/frame_task.py +45 -13
- mink/tasks/posture_task.py +53 -14
- mink/tasks/relative_frame_task.py +142 -0
- mink/tasks/task.py +61 -28
- mink/utils.py +15 -7
- {mink-0.0.1.dist-info → mink-0.0.3.dist-info}/METADATA +37 -9
- {mink-0.0.1.dist-info → mink-0.0.3.dist-info}/RECORD +22 -24
- mink/lie/tests/__init__.py +0 -0
- mink/lie/tests/test_axioms.py +0 -51
- mink/lie/tests/test_operations.py +0 -77
- mink/lie/tests/utils.py +0 -20
- {mink-0.0.1.dist-info → mink-0.0.3.dist-info}/WHEEL +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,10 +1,10 @@
|
|
1
|
-
mink/__init__.py,sha256=
|
2
|
-
mink/configuration.py,sha256=
|
1
|
+
mink/__init__.py,sha256=1-kNZ2BmlC9wD98boMF9tujEz3z9ipx9bTUpE4d8T4c,1717
|
2
|
+
mink/configuration.py,sha256=ScwX77IGeqsheIvEqp8VUJv1D9dV0ies66vCnYp2zDE,9085
|
3
3
|
mink/constants.py,sha256=hcWy4zM4hGI7vvJrTmCjJgs2WtOxKJ1IVtYHucWbOAI,813
|
4
4
|
mink/exceptions.py,sha256=tmExo-ydn_mu9Mny5sP0Ehr7hfo3d79fM8HvvxZBKYM,2931
|
5
5
|
mink/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
-
mink/solve_ik.py,sha256=
|
7
|
-
mink/utils.py,sha256
|
6
|
+
mink/solve_ik.py,sha256=hrAnwO5imCoFczmoXQf4v5Rfw5l1wisd0qtmFt-y0vs,3578
|
7
|
+
mink/utils.py,sha256=-00C_AmtfvkmmWiHpds5Fu83gLcnt9OJ2KmyB01aTa8,4387
|
8
8
|
mink/.mypy_cache/.gitignore,sha256=amnaZw0RUw038PDP3HvtMLeOpkNOJPenMgi5guKdMiw,34
|
9
9
|
mink/.mypy_cache/CACHEDIR.TAG,sha256=8cE6_FVTWMkDOw8fMKqhd_6IvaQPS4okWYQA1UeHatw,190
|
10
10
|
mink/.mypy_cache/3.12/@plugins_snapshot.json,sha256=RBNvo1WzZ4oRRq0W9-hknpT7T8If536DEMBg9hyq_4o,2
|
@@ -326,27 +326,25 @@ mink/.mypy_cache/3.12/unittest/signals.data.json,sha256=1ZiaD7LP0g0iBSmVb5g87M9q
|
|
326
326
|
mink/.mypy_cache/3.12/unittest/signals.meta.json,sha256=t4kGxxcZb9aDLojvZ5naLIcckL77G1RAB0P2iJsSjM0,1681
|
327
327
|
mink/.mypy_cache/3.12/unittest/suite.data.json,sha256=3XPU9U8rt00fnG-hgEIbpIqS14lI9xQMDiBsl2_mlXQ,12050
|
328
328
|
mink/.mypy_cache/3.12/unittest/suite.meta.json,sha256=5ADDHudtGO-JtLaD0-SB-7_Ekm34XeG_QCXLEDIZeIM,1699
|
329
|
-
mink/lie/__init__.py,sha256=
|
330
|
-
mink/lie/base.py,sha256=
|
329
|
+
mink/lie/__init__.py,sha256=7tm3ZFnF3o1SDd9MOFO1In13lHMQJHO0FB-ejI6tsgE,202
|
330
|
+
mink/lie/base.py,sha256=ummp2-yROMrcYCtsNCoKEiKoJ7wLF0nSjnOOD95aXaY,4220
|
331
331
|
mink/lie/se3.py,sha256=R4hH4i0-do5I8bWV0le-huSuAfQ_bwolkAjJNVlDNXs,7914
|
332
|
-
mink/lie/so3.py,sha256=
|
333
|
-
mink/lie/utils.py,sha256=
|
334
|
-
mink/lie/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
335
|
-
mink/lie/tests/test_axioms.py,sha256=Vgkwoa-GtqUgiI8A5F041NfdOkP4Gxj6wUdNzHzuuFE,1756
|
336
|
-
mink/lie/tests/test_operations.py,sha256=UTUyYA-jDm73LCe8KWOcQo0PFx45UDDm25Y1J03FVhk,2664
|
337
|
-
mink/lie/tests/utils.py,sha256=N6B86t7BRH_Ls5yykCD4llVM2ElyXp9ze2RyLPMBUY4,562
|
332
|
+
mink/lie/so3.py,sha256=LkjciJHcVTWYzpDzAo1KuUI7xy0HPnSGAYxQS_q-Kx4,7302
|
333
|
+
mink/lie/utils.py,sha256=DuEl3pj84daLvMKN84-YBvkXnJfqvc5vpvJ9J-pJ11U,403
|
338
334
|
mink/limits/__init__.py,sha256=hX5Dgpri9AE6YtUCkW79AXMBuNAuBhniR9kQ6Rxwv3Y,416
|
339
|
-
mink/limits/collision_avoidance_limit.py,sha256=
|
340
|
-
mink/limits/configuration_limit.py,sha256=
|
335
|
+
mink/limits/collision_avoidance_limit.py,sha256=pVLpkruWAqrOcAW4yulHc_hIuczMR4EbrXF1x-0Bb80,10973
|
336
|
+
mink/limits/configuration_limit.py,sha256=8GlOIRWHJUX9QCGrmR6YEYkpXntnQxWjd5oz2r8qUb4,4037
|
341
337
|
mink/limits/exceptions.py,sha256=EnVKgFhUJFM6rNVCtdngb-XMu66PWKMFSDy-XkdKzr8,178
|
342
|
-
mink/limits/limit.py,sha256=
|
343
|
-
mink/limits/velocity_limit.py,sha256=
|
344
|
-
mink/tasks/__init__.py,sha256=
|
345
|
-
mink/tasks/com_task.py,sha256=
|
338
|
+
mink/limits/limit.py,sha256=feF9yjgLHWShnuSrJNOH-PfMWtEMRGQi2mDiRia9tFg,1578
|
339
|
+
mink/limits/velocity_limit.py,sha256=2zPOAb69V9RusKk-U4cJ0lK3-Ek9g4nvr3c8QHbixzw,3506
|
340
|
+
mink/tasks/__init__.py,sha256=SCS3YMWyuFQpF3XSHiht83px-xmN9IxtFeG-ULkpl64,624
|
341
|
+
mink/tasks/com_task.py,sha256=ch6w7pwa5E0GVo2DCAuEF-c8TCN1iMk-ySY9A4B6yoQ,3121
|
342
|
+
mink/tasks/damping_task.py,sha256=SwSfUvMHzoNYNsloQRD1qlPLd4kfoDIWZlTDU9LuKM4,556
|
346
343
|
mink/tasks/exceptions.py,sha256=1BxQS_t8vuKoTd8RY0MdZOJ_-2RX--iUtVs-Bu3IVgs,708
|
347
|
-
mink/tasks/frame_task.py,sha256=
|
348
|
-
mink/tasks/posture_task.py,sha256=
|
349
|
-
mink/tasks/
|
350
|
-
mink
|
351
|
-
mink-0.0.
|
352
|
-
mink-0.0.
|
344
|
+
mink/tasks/frame_task.py,sha256=DeNg-bEJxqnrRI0FaJK4UHyb8CyF4A7uPF9G-CdN0sg,5307
|
345
|
+
mink/tasks/posture_task.py,sha256=sVDZyalCh5DP8zmCuX5kYuZxiMxRut_mTZUjv5y3b5M,3998
|
346
|
+
mink/tasks/relative_frame_task.py,sha256=9rIiYocI1eEESt0bLZZpQR7K6ggVRZH8iEhdhzkfZa0,5119
|
347
|
+
mink/tasks/task.py,sha256=F16YZT1L9ueNOcKoOhbCyEnZw0DOgrmjqADl0jahVQI,4838
|
348
|
+
mink-0.0.3.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
349
|
+
mink-0.0.3.dist-info/METADATA,sha256=_cnAalKVJSiTLM-tTJ9qpFwwrPO14bkFd_CPZ3TCkEE,4961
|
350
|
+
mink-0.0.3.dist-info/RECORD,,
|
mink/lie/tests/__init__.py
DELETED
File without changes
|
mink/lie/tests/test_axioms.py
DELETED
@@ -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()
|
@@ -1,77 +0,0 @@
|
|
1
|
-
"""Tests for general operation definitions."""
|
2
|
-
|
3
|
-
from typing import Type
|
4
|
-
|
5
|
-
import numpy as np
|
6
|
-
from absl.testing import absltest, parameterized
|
7
|
-
|
8
|
-
from ..base import MatrixLieGroup
|
9
|
-
from ..se3 import SE3
|
10
|
-
from ..so3 import SO3
|
11
|
-
from .utils import assert_transforms_close
|
12
|
-
|
13
|
-
|
14
|
-
@parameterized.named_parameters(
|
15
|
-
("SO3", SO3),
|
16
|
-
("SE3", SE3),
|
17
|
-
)
|
18
|
-
class TestOperations(parameterized.TestCase):
|
19
|
-
def test_inverse_bijective(self, group: Type[MatrixLieGroup]):
|
20
|
-
"""Check inverse of inverse."""
|
21
|
-
transform = group.sample_uniform()
|
22
|
-
assert_transforms_close(transform, transform.inverse().inverse())
|
23
|
-
|
24
|
-
def test_matrix_bijective(self, group: Type[MatrixLieGroup]):
|
25
|
-
"""Check that we can convert to and from matrices."""
|
26
|
-
transform = group.sample_uniform()
|
27
|
-
assert_transforms_close(transform, group.from_matrix(transform.as_matrix()))
|
28
|
-
|
29
|
-
def test_log_exp_bijective(self, group: Type[MatrixLieGroup]):
|
30
|
-
"""Check 1-to-1 mapping for log <=> exp operations."""
|
31
|
-
transform = group.sample_uniform()
|
32
|
-
|
33
|
-
tangent = transform.log()
|
34
|
-
self.assertEqual(tangent.shape, (group.tangent_dim,))
|
35
|
-
|
36
|
-
exp_transform = group.exp(tangent)
|
37
|
-
assert_transforms_close(transform, exp_transform)
|
38
|
-
np.testing.assert_allclose(tangent, exp_transform.log())
|
39
|
-
|
40
|
-
def test_adjoint(self, group: Type[MatrixLieGroup]):
|
41
|
-
transform = group.sample_uniform()
|
42
|
-
omega = np.random.randn(group.tangent_dim)
|
43
|
-
assert_transforms_close(
|
44
|
-
transform @ group.exp(omega),
|
45
|
-
group.exp(transform.adjoint() @ omega) @ transform,
|
46
|
-
)
|
47
|
-
|
48
|
-
def test_rminus(self, group: Type[MatrixLieGroup]):
|
49
|
-
T_wa = group.sample_uniform()
|
50
|
-
T_wb = group.sample_uniform()
|
51
|
-
T_ab = T_wa.inverse() @ T_wb
|
52
|
-
np.testing.assert_allclose(T_wb.rminus(T_wa), T_ab.log())
|
53
|
-
|
54
|
-
def test_rplus(self, group: Type[MatrixLieGroup]):
|
55
|
-
T_wa = group.sample_uniform()
|
56
|
-
T_wb = group.sample_uniform()
|
57
|
-
T_ab = T_wa.inverse() @ T_wb
|
58
|
-
assert_transforms_close(T_wa.rplus(T_ab.log()), T_wb)
|
59
|
-
|
60
|
-
def test_jlog(self, group: Type[MatrixLieGroup]):
|
61
|
-
state = group.sample_uniform()
|
62
|
-
w = np.random.rand(state.tangent_dim) * 1e-4
|
63
|
-
state_pert = state.plus(w).log()
|
64
|
-
state_lin = state.log() + state.jlog() @ w
|
65
|
-
np.testing.assert_allclose(state_pert, state_lin, atol=1e-7)
|
66
|
-
|
67
|
-
|
68
|
-
class TestGroupSpecificOperations(absltest.TestCase):
|
69
|
-
"""Group specific tests."""
|
70
|
-
|
71
|
-
def test_so3_rpy_bijective(self):
|
72
|
-
T = SO3.sample_uniform()
|
73
|
-
assert_transforms_close(T, SO3.from_rpy_radians(*T.as_rpy_radians()))
|
74
|
-
|
75
|
-
|
76
|
-
if __name__ == "__main__":
|
77
|
-
absltest.main()
|
mink/lie/tests/utils.py
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
import numpy as np
|
2
|
-
|
3
|
-
from ..base import MatrixLieGroup
|
4
|
-
from ..se3 import SE3, SO3
|
5
|
-
|
6
|
-
|
7
|
-
def assert_transforms_close(a: MatrixLieGroup, b: MatrixLieGroup) -> None:
|
8
|
-
np.testing.assert_allclose(a.as_matrix(), b.as_matrix(), atol=1e-7)
|
9
|
-
|
10
|
-
# Account for quaternion double cover (q = -q).
|
11
|
-
pa = a.parameters()
|
12
|
-
pb = b.parameters()
|
13
|
-
if isinstance(a, SO3):
|
14
|
-
pa *= np.sign(pa[0])
|
15
|
-
pb *= np.sign(pb[0])
|
16
|
-
elif isinstance(a, SE3):
|
17
|
-
pa[:4] *= np.sign(pa[0])
|
18
|
-
pb[:4] *= np.sign(pb[0])
|
19
|
-
|
20
|
-
np.testing.assert_allclose(pa, pb, atol=1e-7)
|
File without changes
|