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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mink
3
- Version: 0.0.1
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: mypy ; extra == "dev"
23
- Requires-Dist: ruff ; extra == "dev"
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: loop-rate-limiters >= 0.1.0 ; extra == "examples"
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
  [![Build](https://img.shields.io/github/actions/workflow/status/kevinzakka/mink/ci.yml?branch=main)](https://github.com/kevinzakka/mink/actions)
46
+ [![Coverage Status](https://coveralls.io/repos/github/kevinzakka/mink/badge.svg)](https://coveralls.io/github/kevinzakka/mink?branch=main)
47
+ [![PyPI version](https://img.shields.io/pypi/v/mink)](https://pypi.org/project/mink/)
48
+ ![Banner for mink](https://github.com/kevinzakka/mink/blob/assets/banner.png?raw=true)
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 -e ".[examples]"
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 [pink](https://github.com/stephane-caron/pink) which uses [Pinocchio](https://github.com/stack-of-tasks/pinocchio) under the hood. Stéphane Caron, the original 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.
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=qLYRMUEsu-XusX2bvM_S3MJhYwYM-u3fvizqYur69XI,1627
2
- mink/configuration.py,sha256=6ScxC-mQwaSJ7Vp5Ofcms12qxgPUIMQ_0DacW6w_XwU,7490
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=0ljN-CXDZFX8dPDvtyQxlI4vGoRpmeWmBkLT1-999Rw,3542
7
- mink/utils.py,sha256=vU3huZtKY_RWYjZRez7iZbXaagXIfGa_E6KZGbJ-oo0,4251
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=tI-lfqTHT8iABKemXZCZUEtiDtj4LC9o7DEDXpkn6tI,228
330
- mink/lie/base.py,sha256=p9PoZBZ-6vCGUN0kiguz2ActGtpXRInltGU2Vk9bu54,4222
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=ii3jYqy3KrOrNR0GLA3w5OBvujUpgRg0BXa7cPXXwFE,7238
333
- mink/lie/utils.py,sha256=Drx_l0adSLlZl89kVLRZxMW4ctafG1pk0iucS7gShOI,608
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=vwi3CBdwkc04_z97xanol5Bi2khMbI94lP63ZzC0uXo,11177
340
- mink/limits/configuration_limit.py,sha256=I-4U2oXupdfgdQUWhDrrNmyvK58ZdrIxiOCSJjbZ-HY,3995
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=1uNmQGcYuiLQ4q9AVEZzzyekc-kQtx9d0HKKSH8_7ks,978
343
- mink/limits/velocity_limit.py,sha256=8q7QuBdcN5msspsz24MKGZSinrFlZEIHsby62PMtF-k,2935
344
- mink/tasks/__init__.py,sha256=e_6bfrOKuYdInaqd-7uPEXVWhWJH71R5UF73DaF59Pc,491
345
- mink/tasks/com_task.py,sha256=GvHvj1nuz_tTxglvqHL9N4VlHuNDCAHh7rgXAgrbrVY,2926
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=QpavqXsShhv89EeomXu9HhSqkX_MWqEaPO2Q8Y-Ik68,4472
348
- mink/tasks/posture_task.py,sha256=jMBmDiavG05RutJzJ4QO6xgSuSqCFbAx9bzRT8JqcjU,3125
349
- mink/tasks/task.py,sha256=bkhqO76lS1cgx4gJbXnJvD4WPLovTSQ3gDH8D0QAMd0,4074
350
- mink-0.0.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
351
- mink-0.0.1.dist-info/METADATA,sha256=mAfZ_hgRpS8vVrvz6Z_t5uoEet0jki28ILFjFuLpvHY,3575
352
- mink-0.0.1.dist-info/RECORD,,
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,,
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()
@@ -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