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.
Files changed (354) hide show
  1. {mink-0.0.2 → mink-0.0.3}/PKG-INFO +4 -3
  2. {mink-0.0.2 → mink-0.0.3}/README.md +3 -2
  3. {mink-0.0.2 → mink-0.0.3}/mink/__init__.py +2 -2
  4. {mink-0.0.2 → mink-0.0.3}/mink/configuration.py +41 -24
  5. {mink-0.0.2 → mink-0.0.3}/mink/lie/__init__.py +1 -2
  6. {mink-0.0.2 → mink-0.0.3}/mink/lie/utils.py +2 -10
  7. {mink-0.0.2 → mink-0.0.3}/mink/limits/collision_avoidance_limit.py +22 -35
  8. {mink-0.0.2 → mink-0.0.3}/mink/solve_ik.py +2 -2
  9. {mink-0.0.2 → mink-0.0.3}/mink/tasks/__init__.py +2 -0
  10. {mink-0.0.2 → mink-0.0.3}/mink/tasks/damping_task.py +2 -1
  11. {mink-0.0.2 → mink-0.0.3}/mink/tasks/posture_task.py +14 -5
  12. mink-0.0.3/mink/tasks/relative_frame_task.py +142 -0
  13. {mink-0.0.2 → mink-0.0.3}/pyproject.toml +14 -1
  14. mink-0.0.2/mink/lie/tests/__init__.py +0 -0
  15. mink-0.0.2/mink/lie/tests/test_axioms.py +0 -51
  16. mink-0.0.2/mink/lie/tests/test_operations.py +0 -77
  17. mink-0.0.2/mink/lie/tests/utils.py +0 -20
  18. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/.gitignore +0 -0
  19. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/@plugins_snapshot.json +0 -0
  20. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/__future__.data.json +0 -0
  21. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/__future__.meta.json +0 -0
  22. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_ast.data.json +0 -0
  23. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_ast.meta.json +0 -0
  24. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_codecs.data.json +0 -0
  25. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_codecs.meta.json +0 -0
  26. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_collections_abc.data.json +0 -0
  27. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_collections_abc.meta.json +0 -0
  28. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_ctypes.data.json +0 -0
  29. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_ctypes.meta.json +0 -0
  30. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_thread.data.json +0 -0
  31. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_thread.meta.json +0 -0
  32. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_typeshed/__init__.data.json +0 -0
  33. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_typeshed/__init__.meta.json +0 -0
  34. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_warnings.data.json +0 -0
  35. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/_warnings.meta.json +0 -0
  36. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/abc.data.json +0 -0
  37. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/abc.meta.json +0 -0
  38. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/array.data.json +0 -0
  39. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/array.meta.json +0 -0
  40. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/ast.data.json +0 -0
  41. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/ast.meta.json +0 -0
  42. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/builtins.data.json +0 -0
  43. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/builtins.meta.json +0 -0
  44. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/codecs.data.json +0 -0
  45. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/codecs.meta.json +0 -0
  46. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/__init__.data.json +0 -0
  47. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/__init__.meta.json +0 -0
  48. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/abc.data.json +0 -0
  49. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/collections/abc.meta.json +0 -0
  50. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/contextlib.data.json +0 -0
  51. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/contextlib.meta.json +0 -0
  52. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/ctypes/__init__.data.json +0 -0
  53. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/ctypes/__init__.meta.json +0 -0
  54. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/dataclasses.data.json +0 -0
  55. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/dataclasses.meta.json +0 -0
  56. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/datetime.data.json +0 -0
  57. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/datetime.meta.json +0 -0
  58. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/__init__.data.json +0 -0
  59. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/__init__.meta.json +0 -0
  60. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/charset.data.json +0 -0
  61. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/charset.meta.json +0 -0
  62. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/contentmanager.data.json +0 -0
  63. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/contentmanager.meta.json +0 -0
  64. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/errors.data.json +0 -0
  65. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/errors.meta.json +0 -0
  66. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/header.data.json +0 -0
  67. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/header.meta.json +0 -0
  68. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/message.data.json +0 -0
  69. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/message.meta.json +0 -0
  70. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/policy.data.json +0 -0
  71. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/email/policy.meta.json +0 -0
  72. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/enum.data.json +0 -0
  73. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/enum.meta.json +0 -0
  74. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/genericpath.data.json +0 -0
  75. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/genericpath.meta.json +0 -0
  76. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/__init__.data.json +0 -0
  77. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/__init__.meta.json +0 -0
  78. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/abc.data.json +0 -0
  79. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/abc.meta.json +0 -0
  80. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/machinery.data.json +0 -0
  81. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/machinery.meta.json +0 -0
  82. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/__init__.data.json +0 -0
  83. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/__init__.meta.json +0 -0
  84. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/_meta.data.json +0 -0
  85. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/metadata/_meta.meta.json +0 -0
  86. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/readers.data.json +0 -0
  87. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/readers.meta.json +0 -0
  88. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/__init__.data.json +0 -0
  89. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/__init__.meta.json +0 -0
  90. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/abc.data.json +0 -0
  91. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/importlib/resources/abc.meta.json +0 -0
  92. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/io.data.json +0 -0
  93. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/io.meta.json +0 -0
  94. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/logging/__init__.data.json +0 -0
  95. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/logging/__init__.meta.json +0 -0
  96. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/math.data.json +0 -0
  97. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/math.meta.json +0 -0
  98. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/mink/limits/limit.data.json +0 -0
  99. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/mink/limits/limit.meta.json +0 -0
  100. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/mmap.data.json +0 -0
  101. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/mmap.meta.json +0 -0
  102. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/__init__.data.json +0 -0
  103. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/__init__.meta.json +0 -0
  104. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_pytesttester.data.json +0 -0
  105. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_pytesttester.meta.json +0 -0
  106. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/__init__.data.json +0 -0
  107. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/__init__.meta.json +0 -0
  108. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.data.json +0 -0
  109. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_add_docstring.meta.json +0 -0
  110. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_array_like.data.json +0 -0
  111. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_array_like.meta.json +0 -0
  112. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_callable.data.json +0 -0
  113. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_callable.meta.json +0 -0
  114. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_char_codes.data.json +0 -0
  115. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_char_codes.meta.json +0 -0
  116. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.data.json +0 -0
  117. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_dtype_like.meta.json +0 -0
  118. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.data.json +0 -0
  119. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_extended_precision.meta.json +0 -0
  120. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nbit.data.json +0 -0
  121. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nbit.meta.json +0 -0
  122. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.data.json +0 -0
  123. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_nested_sequence.meta.json +0 -0
  124. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_scalars.data.json +0 -0
  125. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_scalars.meta.json +0 -0
  126. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_shape.data.json +0 -0
  127. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_shape.meta.json +0 -0
  128. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_ufunc.data.json +0 -0
  129. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_typing/_ufunc.meta.json +0 -0
  130. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/__init__.data.json +0 -0
  131. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/__init__.meta.json +0 -0
  132. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/_convertions.data.json +0 -0
  133. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/_utils/_convertions.meta.json +0 -0
  134. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/__init__.data.json +0 -0
  135. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/__init__.meta.json +0 -0
  136. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_asarray.data.json +0 -0
  137. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_asarray.meta.json +0 -0
  138. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_internal.data.json +0 -0
  139. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_internal.meta.json +0 -0
  140. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_type_aliases.data.json +0 -0
  141. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_type_aliases.meta.json +0 -0
  142. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_ufunc_config.data.json +0 -0
  143. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/_ufunc_config.meta.json +0 -0
  144. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/arrayprint.data.json +0 -0
  145. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/arrayprint.meta.json +0 -0
  146. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/defchararray.data.json +0 -0
  147. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/defchararray.meta.json +0 -0
  148. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/einsumfunc.data.json +0 -0
  149. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/einsumfunc.meta.json +0 -0
  150. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/fromnumeric.data.json +0 -0
  151. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/fromnumeric.meta.json +0 -0
  152. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/function_base.data.json +0 -0
  153. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/function_base.meta.json +0 -0
  154. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/multiarray.data.json +0 -0
  155. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/multiarray.meta.json +0 -0
  156. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numeric.data.json +0 -0
  157. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numeric.meta.json +0 -0
  158. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numerictypes.data.json +0 -0
  159. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/numerictypes.meta.json +0 -0
  160. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/records.data.json +0 -0
  161. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/records.meta.json +0 -0
  162. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/shape_base.data.json +0 -0
  163. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/shape_base.meta.json +0 -0
  164. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/umath.data.json +0 -0
  165. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/core/umath.meta.json +0 -0
  166. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ctypeslib.data.json +0 -0
  167. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ctypeslib.meta.json +0 -0
  168. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/dtypes.data.json +0 -0
  169. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/dtypes.meta.json +0 -0
  170. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/exceptions.data.json +0 -0
  171. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/exceptions.meta.json +0 -0
  172. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/__init__.data.json +0 -0
  173. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/__init__.meta.json +0 -0
  174. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/_pocketfft.data.json +0 -0
  175. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/_pocketfft.meta.json +0 -0
  176. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/helper.data.json +0 -0
  177. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/fft/helper.meta.json +0 -0
  178. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/__init__.data.json +0 -0
  179. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/__init__.meta.json +0 -0
  180. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/_version.data.json +0 -0
  181. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/_version.meta.json +0 -0
  182. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraypad.data.json +0 -0
  183. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraypad.meta.json +0 -0
  184. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraysetops.data.json +0 -0
  185. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arraysetops.meta.json +0 -0
  186. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arrayterator.data.json +0 -0
  187. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/arrayterator.meta.json +0 -0
  188. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/format.data.json +0 -0
  189. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/format.meta.json +0 -0
  190. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/function_base.data.json +0 -0
  191. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/function_base.meta.json +0 -0
  192. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/histograms.data.json +0 -0
  193. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/histograms.meta.json +0 -0
  194. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/index_tricks.data.json +0 -0
  195. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/index_tricks.meta.json +0 -0
  196. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/mixins.data.json +0 -0
  197. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/mixins.meta.json +0 -0
  198. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/nanfunctions.data.json +0 -0
  199. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/nanfunctions.meta.json +0 -0
  200. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/npyio.data.json +0 -0
  201. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/npyio.meta.json +0 -0
  202. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/polynomial.data.json +0 -0
  203. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/polynomial.meta.json +0 -0
  204. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/scimath.data.json +0 -0
  205. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/scimath.meta.json +0 -0
  206. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/shape_base.data.json +0 -0
  207. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/shape_base.meta.json +0 -0
  208. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/stride_tricks.data.json +0 -0
  209. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/stride_tricks.meta.json +0 -0
  210. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/twodim_base.data.json +0 -0
  211. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/twodim_base.meta.json +0 -0
  212. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/type_check.data.json +0 -0
  213. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/type_check.meta.json +0 -0
  214. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/ufunclike.data.json +0 -0
  215. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/ufunclike.meta.json +0 -0
  216. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/utils.data.json +0 -0
  217. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/lib/utils.meta.json +0 -0
  218. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/__init__.data.json +0 -0
  219. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/__init__.meta.json +0 -0
  220. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/linalg.data.json +0 -0
  221. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/linalg/linalg.meta.json +0 -0
  222. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/__init__.data.json +0 -0
  223. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/__init__.meta.json +0 -0
  224. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/core.data.json +0 -0
  225. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/core.meta.json +0 -0
  226. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/extras.data.json +0 -0
  227. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/extras.meta.json +0 -0
  228. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/mrecords.data.json +0 -0
  229. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/ma/mrecords.meta.json +0 -0
  230. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/__init__.data.json +0 -0
  231. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/__init__.meta.json +0 -0
  232. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.data.json +0 -0
  233. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/matrixlib/defmatrix.meta.json +0 -0
  234. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/__init__.data.json +0 -0
  235. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/__init__.meta.json +0 -0
  236. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/_polybase.data.json +0 -0
  237. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/_polybase.meta.json +0 -0
  238. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.data.json +0 -0
  239. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/chebyshev.meta.json +0 -0
  240. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite.data.json +0 -0
  241. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite.meta.json +0 -0
  242. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.data.json +0 -0
  243. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/hermite_e.meta.json +0 -0
  244. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/laguerre.data.json +0 -0
  245. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/laguerre.meta.json +0 -0
  246. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/legendre.data.json +0 -0
  247. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/legendre.meta.json +0 -0
  248. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polynomial.data.json +0 -0
  249. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polynomial.meta.json +0 -0
  250. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polyutils.data.json +0 -0
  251. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/polynomial/polyutils.meta.json +0 -0
  252. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/__init__.data.json +0 -0
  253. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/__init__.meta.json +0 -0
  254. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_generator.data.json +0 -0
  255. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_generator.meta.json +0 -0
  256. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_mt19937.data.json +0 -0
  257. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_mt19937.meta.json +0 -0
  258. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_pcg64.data.json +0 -0
  259. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_pcg64.meta.json +0 -0
  260. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_philox.data.json +0 -0
  261. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_philox.meta.json +0 -0
  262. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_sfc64.data.json +0 -0
  263. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/_sfc64.meta.json +0 -0
  264. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/bit_generator.data.json +0 -0
  265. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/bit_generator.meta.json +0 -0
  266. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/mtrand.data.json +0 -0
  267. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/random/mtrand.meta.json +0 -0
  268. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/__init__.data.json +0 -0
  269. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/__init__.meta.json +0 -0
  270. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/__init__.data.json +0 -0
  271. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/__init__.meta.json +0 -0
  272. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/utils.data.json +0 -0
  273. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/testing/_private/utils.meta.json +0 -0
  274. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/typing/__init__.data.json +0 -0
  275. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/typing/__init__.meta.json +0 -0
  276. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/version.data.json +0 -0
  277. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/numpy/version.meta.json +0 -0
  278. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/os/__init__.data.json +0 -0
  279. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/os/__init__.meta.json +0 -0
  280. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/os/path.data.json +0 -0
  281. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/os/path.meta.json +0 -0
  282. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/pathlib.data.json +0 -0
  283. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/pathlib.meta.json +0 -0
  284. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/posixpath.data.json +0 -0
  285. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/posixpath.meta.json +0 -0
  286. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/re.data.json +0 -0
  287. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/re.meta.json +0 -0
  288. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_compile.data.json +0 -0
  289. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_compile.meta.json +0 -0
  290. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_constants.data.json +0 -0
  291. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_constants.meta.json +0 -0
  292. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_parse.data.json +0 -0
  293. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sre_parse.meta.json +0 -0
  294. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/string.data.json +0 -0
  295. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/string.meta.json +0 -0
  296. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/subprocess.data.json +0 -0
  297. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/subprocess.meta.json +0 -0
  298. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/__init__.data.json +0 -0
  299. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/__init__.meta.json +0 -0
  300. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/_monitoring.data.json +0 -0
  301. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/sys/_monitoring.meta.json +0 -0
  302. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/textwrap.data.json +0 -0
  303. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/textwrap.meta.json +0 -0
  304. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/threading.data.json +0 -0
  305. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/threading.meta.json +0 -0
  306. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/time.data.json +0 -0
  307. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/time.meta.json +0 -0
  308. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/types.data.json +0 -0
  309. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/types.meta.json +0 -0
  310. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/typing.data.json +0 -0
  311. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/typing.meta.json +0 -0
  312. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/typing_extensions.data.json +0 -0
  313. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/typing_extensions.meta.json +0 -0
  314. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/__init__.data.json +0 -0
  315. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/__init__.meta.json +0 -0
  316. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/_log.data.json +0 -0
  317. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/_log.meta.json +0 -0
  318. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/async_case.data.json +0 -0
  319. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/async_case.meta.json +0 -0
  320. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/case.data.json +0 -0
  321. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/case.meta.json +0 -0
  322. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/loader.data.json +0 -0
  323. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/loader.meta.json +0 -0
  324. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/main.data.json +0 -0
  325. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/main.meta.json +0 -0
  326. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/result.data.json +0 -0
  327. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/result.meta.json +0 -0
  328. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/runner.data.json +0 -0
  329. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/runner.meta.json +0 -0
  330. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/signals.data.json +0 -0
  331. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/signals.meta.json +0 -0
  332. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/suite.data.json +0 -0
  333. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/unittest/suite.meta.json +0 -0
  334. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/warnings.data.json +0 -0
  335. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/warnings.meta.json +0 -0
  336. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/zipfile.data.json +0 -0
  337. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/3.12/zipfile.meta.json +0 -0
  338. {mink-0.0.2 → mink-0.0.3}/mink/.mypy_cache/CACHEDIR.TAG +0 -0
  339. {mink-0.0.2 → mink-0.0.3}/mink/constants.py +0 -0
  340. {mink-0.0.2 → mink-0.0.3}/mink/exceptions.py +0 -0
  341. {mink-0.0.2 → mink-0.0.3}/mink/lie/base.py +0 -0
  342. {mink-0.0.2 → mink-0.0.3}/mink/lie/se3.py +0 -0
  343. {mink-0.0.2 → mink-0.0.3}/mink/lie/so3.py +0 -0
  344. {mink-0.0.2 → mink-0.0.3}/mink/limits/__init__.py +0 -0
  345. {mink-0.0.2 → mink-0.0.3}/mink/limits/configuration_limit.py +0 -0
  346. {mink-0.0.2 → mink-0.0.3}/mink/limits/exceptions.py +0 -0
  347. {mink-0.0.2 → mink-0.0.3}/mink/limits/limit.py +0 -0
  348. {mink-0.0.2 → mink-0.0.3}/mink/limits/velocity_limit.py +0 -0
  349. {mink-0.0.2 → mink-0.0.3}/mink/py.typed +0 -0
  350. {mink-0.0.2 → mink-0.0.3}/mink/tasks/com_task.py +0 -0
  351. {mink-0.0.2 → mink-0.0.3}/mink/tasks/exceptions.py +0 -0
  352. {mink-0.0.2 → mink-0.0.3}/mink/tasks/frame_task.py +0 -0
  353. {mink-0.0.2 → mink-0.0.3}/mink/tasks/task.py +0 -0
  354. {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.2
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
  [![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)
46
+ [![Coverage Status](https://coveralls.io/repos/github/kevinzakka/mink/badge.svg)](https://coveralls.io/github/kevinzakka/mink?branch=main)
47
47
  [![PyPI version](https://img.shields.io/pypi/v/mink)](https://pypi.org/project/mink/)
48
48
  ![Banner for mink](https://github.com/kevinzakka/mink/blob/assets/banner.png?raw=true)
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
  [![Build](https://img.shields.io/github/actions/workflow/status/kevinzakka/mink/ci.yml?branch=main)](https://github.com/kevinzakka/mink/actions)
4
- [![Coverage Status](https://coveralls.io/repos/github/kevinzakka/mink/badge.svg)](https://coveralls.io/github/kevinzakka/mink)
4
+ [![Coverage Status](https://coveralls.io/repos/github/kevinzakka/mink/badge.svg)](https://coveralls.io/github/kevinzakka/mink?branch=main)
5
5
  [![PyPI version](https://img.shields.io/pypi/v/mink)](https://pypi.org/project/mink/)
6
6
  ![Banner for mink](https://github.com/kevinzakka/mink/blob/assets/banner.png?raw=true)
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 bundles a MuJoCo `model <https://mujoco.readthedocs.io/en/latest/APIreference/APItypes.html#mjmodel>`__
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
- and enables easy access to kinematic quantities such as frame transforms and frame
6
- Jacobians.
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 convenient methods to access and update the kinematic quantities
26
- of a robot model, such as frame transforms and Jacobians. It ensures that forward
27
- kinematics is computed at each time step, allowing the user to query up-to-date
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
- - Running forward kinematics to update the state.
37
- - Checking configuration limits.
38
- - Computing Jacobians for different frames.
39
- - Retrieving frame transforms relative to the world frame.
40
- - Integrating velocities to update configurations.
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 reference configuration `qpos0`.
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, mat2quat, skew
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 _Contact:
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 = self._compute_contact_normal_jacobian(configuration.data, contact)
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
- ) -> _Contact:
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 _Contact(
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: float):
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: float,
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.asarray([cost] * model.nv),
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 = ["version", "description"]
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()