mink 0.0.8__py3-none-any.whl → 0.0.9__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/lie/se3.py CHANGED
@@ -113,130 +113,131 @@ class SE3(MatrixLieGroup):
113
113
 
114
114
  @classmethod
115
115
  def exp(cls, tangent: np.ndarray) -> SE3:
116
- assert tangent.shape == (SE3.tangent_dim,)
116
+ assert tangent.shape == (cls.tangent_dim,)
117
117
  rotation = SO3.exp(tangent[3:])
118
- theta_squared = tangent[3:] @ tangent[3:]
119
- use_taylor = theta_squared < get_epsilon(theta_squared.dtype)
120
- theta_squared_safe = 1.0 if use_taylor else theta_squared
121
- theta_safe = np.sqrt(theta_squared_safe)
122
- skew_omega = skew(tangent[3:])
123
- if use_taylor:
124
- V = rotation.as_matrix()
118
+ theta = np.float64(mujoco.mju_norm3(tangent[3:]))
119
+ t2 = theta * theta
120
+ if t2 < get_epsilon(t2.dtype):
121
+ v_mat = rotation.as_matrix()
125
122
  else:
126
- V = (
123
+ skew_omega = skew(tangent[3:])
124
+ v_mat = (
127
125
  np.eye(3, dtype=np.float64)
128
- + (1.0 - np.cos(theta_safe)) / (theta_squared_safe) * skew_omega
129
- + (theta_safe - np.sin(theta_safe))
130
- / (theta_squared_safe * theta_safe)
131
- * (skew_omega @ skew_omega)
126
+ + (1.0 - np.cos(theta)) / t2 * skew_omega
127
+ + (theta - np.sin(theta)) / (t2 * theta) * (skew_omega @ skew_omega)
132
128
  )
133
- return SE3.from_rotation_and_translation(
129
+ return cls.from_rotation_and_translation(
134
130
  rotation=rotation,
135
- translation=V @ tangent[:3],
131
+ translation=v_mat @ tangent[:3],
136
132
  )
137
133
 
138
134
  def inverse(self) -> SE3:
139
- R_inv = self.rotation().inverse()
140
- return SE3.from_rotation_and_translation(
141
- rotation=R_inv,
142
- translation=-(R_inv @ self.translation()),
135
+ inverse_wxyz_xyz = np.empty(SE3.parameters_dim, dtype=np.float64)
136
+ mujoco.mju_negQuat(inverse_wxyz_xyz[:4], self.wxyz_xyz[:4])
137
+ mujoco.mju_rotVecQuat(
138
+ inverse_wxyz_xyz[4:], -1.0 * self.wxyz_xyz[4:], inverse_wxyz_xyz[:4]
143
139
  )
140
+ return SE3(wxyz_xyz=inverse_wxyz_xyz)
144
141
 
145
142
  def normalize(self) -> SE3:
146
- return SE3.from_rotation_and_translation(
147
- rotation=self.rotation().normalize(),
148
- translation=self.translation(),
149
- )
143
+ normalized_wxyz_xyz = np.array(self.wxyz_xyz)
144
+ mujoco.mju_normalize4(normalized_wxyz_xyz[:4])
145
+ return SE3(wxyz_xyz=normalized_wxyz_xyz)
150
146
 
151
147
  def apply(self, target: np.ndarray) -> np.ndarray:
152
148
  assert target.shape == (SE3.space_dim,)
153
- return self.rotation() @ target + self.translation()
149
+ rotated_target = np.empty(SE3.space_dim, dtype=np.float64)
150
+ mujoco.mju_rotVecQuat(rotated_target, target, self.wxyz_xyz[:4])
151
+ return rotated_target + self.wxyz_xyz[4:]
154
152
 
155
153
  def multiply(self, other: SE3) -> SE3:
156
- return SE3.from_rotation_and_translation(
157
- rotation=self.rotation() @ other.rotation(),
158
- translation=(self.rotation() @ other.translation()) + self.translation(),
159
- )
154
+ wxyz_xyz = np.empty(SE3.parameters_dim, dtype=np.float64)
155
+ mujoco.mju_mulQuat(wxyz_xyz[:4], self.wxyz_xyz[:4], other.wxyz_xyz[:4])
156
+ mujoco.mju_rotVecQuat(wxyz_xyz[4:], other.wxyz_xyz[4:], self.wxyz_xyz[:4])
157
+ wxyz_xyz[4:] += self.wxyz_xyz[4:]
158
+ return SE3(wxyz_xyz=wxyz_xyz)
160
159
 
161
160
  def log(self) -> np.ndarray:
162
161
  omega = self.rotation().log()
163
- theta_squared = omega @ omega
164
- use_taylor = theta_squared < get_epsilon(theta_squared.dtype)
162
+ theta = np.float64(mujoco.mju_norm3(omega))
163
+ t2 = theta * theta
165
164
  skew_omega = skew(omega)
166
- theta_squared_safe = 1.0 if use_taylor else theta_squared
167
- theta_safe = np.sqrt(theta_squared_safe)
168
- half_theta_safe = 0.5 * theta_safe
169
- skew_omega_norm = skew_omega @ skew_omega
170
- if use_taylor:
171
- V_inv = (
172
- np.eye(3, dtype=np.float64) - 0.5 * skew_omega + skew_omega_norm / 12.0
165
+ skew_omega2 = skew_omega @ skew_omega
166
+ if t2 < get_epsilon(t2.dtype):
167
+ vinv_mat = (
168
+ np.eye(3, dtype=np.float64) - 0.5 * skew_omega + skew_omega2 / 12.0
173
169
  )
174
170
  else:
175
- V_inv = (
171
+ half_theta = 0.5 * theta
172
+ vinv_mat = (
176
173
  np.eye(3, dtype=np.float64)
177
174
  - 0.5 * skew_omega
178
- + (
179
- 1.0
180
- - theta_safe
181
- * np.cos(half_theta_safe)
182
- / (2.0 * np.sin(half_theta_safe))
183
- )
184
- / theta_squared_safe
185
- * skew_omega_norm
175
+ + (1.0 - 0.5 * theta * np.cos(half_theta) / np.sin(half_theta))
176
+ / t2
177
+ * skew_omega2
186
178
  )
187
- return np.concatenate([V_inv @ self.translation(), omega])
179
+ tangent = np.empty(SE3.tangent_dim, dtype=np.float64)
180
+ tangent[:3] = vinv_mat @ self.translation()
181
+ tangent[3:] = omega
182
+ return tangent
188
183
 
189
184
  def adjoint(self) -> np.ndarray:
190
- R = self.rotation().as_matrix()
191
- return np.block(
192
- [
193
- [R, skew(self.translation()) @ R],
194
- [np.zeros((3, 3), dtype=np.float64), R],
195
- ]
196
- )
185
+ rotation = self.rotation()
186
+ rotation_mat = rotation.as_matrix()
187
+ tangent_mat = skew(self.translation()) @ rotation_mat
188
+ adjoint_mat = np.zeros((SE3.tangent_dim, SE3.tangent_dim), dtype=np.float64)
189
+ adjoint_mat[:3, :3] = rotation_mat
190
+ adjoint_mat[:3, 3:] = tangent_mat
191
+ adjoint_mat[3:, 3:] = rotation_mat
192
+ return adjoint_mat
197
193
 
198
194
  # Jacobians.
199
195
 
200
196
  # Eqn 179 a)
201
197
  @classmethod
202
198
  def ljac(cls, other: np.ndarray) -> np.ndarray:
203
- theta = other[3:]
204
- if theta @ theta < get_epsilon(theta.dtype):
199
+ theta_squared = np.float64(mujoco.mju_dot3(other[3:], other[3:]))
200
+ if theta_squared < get_epsilon(theta_squared.dtype):
205
201
  return np.eye(cls.tangent_dim)
206
- Q = _getQ(other)
207
- J = SO3.ljac(theta)
208
- O = np.zeros((3, 3))
209
- return np.block([[J, Q], [O, J]])
202
+ ljac_se3 = np.zeros((cls.tangent_dim, cls.tangent_dim), dtype=np.float64)
203
+ ljac_translation = _getQ(other)
204
+ ljac_so3 = SO3.ljac(other[3:])
205
+ ljac_se3[:3, :3] = ljac_so3
206
+ ljac_se3[:3, 3:] = ljac_translation
207
+ ljac_se3[3:, 3:] = ljac_so3
208
+ return ljac_se3
210
209
 
211
210
  # Eqn 179 b)
212
211
  @classmethod
213
212
  def ljacinv(cls, other: np.ndarray) -> np.ndarray:
214
- theta = other[3:]
215
- if theta @ theta < get_epsilon(theta.dtype):
213
+ theta_squared = np.float64(mujoco.mju_dot3(other[3:], other[3:]))
214
+ if theta_squared < get_epsilon(theta_squared.dtype):
216
215
  return np.eye(cls.tangent_dim)
217
- Q = _getQ(other)
218
- J_inv = SO3.ljacinv(theta)
219
- O = np.zeros((3, 3))
220
- return np.block([[J_inv, -J_inv @ Q @ J_inv], [O, J_inv]])
216
+ ljacinv_se3 = np.zeros((cls.tangent_dim, cls.tangent_dim), dtype=np.float64)
217
+ ljac_translation = _getQ(other)
218
+ ljacinv_so3 = SO3.ljacinv(other[3:])
219
+ ljacinv_se3[:3, :3] = ljacinv_so3
220
+ ljacinv_se3[:3, 3:] = -ljacinv_so3 @ ljac_translation @ ljacinv_so3
221
+ ljacinv_se3[3:, 3:] = ljacinv_so3
222
+ return ljacinv_se3
221
223
 
222
224
 
223
225
  # Eqn 180.
224
226
  def _getQ(c) -> np.ndarray:
225
- theta_sq = c[3:] @ c[3:]
227
+ theta = np.float64(mujoco.mju_norm3(c[3:]))
228
+ t2 = theta * theta
226
229
  A = 0.5
227
- if theta_sq < get_epsilon(theta_sq.dtype):
228
- B = (1.0 / 6.0) + (1.0 / 120.0) * theta_sq
229
- C = -(1.0 / 24.0) + (1.0 / 720.0) * theta_sq
230
+ if t2 < get_epsilon(t2.dtype):
231
+ B = (1.0 / 6.0) + (1.0 / 120.0) * t2
232
+ C = -(1.0 / 24.0) + (1.0 / 720.0) * t2
230
233
  D = -(1.0 / 60.0)
231
234
  else:
232
- theta = np.sqrt(theta_sq)
235
+ t4 = t2 * t2
233
236
  sin_theta = np.sin(theta)
234
237
  cos_theta = np.cos(theta)
235
- B = (theta - sin_theta) / (theta_sq * theta)
236
- C = (1.0 - theta_sq / 2.0 - cos_theta) / (theta_sq * theta_sq)
237
- D = ((2) * theta - (3) * sin_theta + theta * cos_theta) / (
238
- (2) * theta_sq * theta_sq * theta
239
- )
238
+ B = (theta - sin_theta) / (t2 * theta)
239
+ C = (1.0 - 0.5 * t2 - cos_theta) / t4
240
+ D = (2.0 * theta - 3.0 * sin_theta + theta * cos_theta) / (2.0 * t4 * theta)
240
241
  V = skew(c[:3])
241
242
  W = skew(c[3:])
242
243
  VW = V @ W
@@ -246,6 +247,6 @@ def _getQ(c) -> np.ndarray:
246
247
  return (
247
248
  +A * V
248
249
  + B * (WV + VW + WVW)
249
- - C * (VWW - VWW.T - 3 * WVW)
250
+ - C * (VWW - VWW.T - 3.0 * WVW)
250
251
  + D * (WVW @ W + W @ WVW)
251
252
  )
mink/lie/so3.py CHANGED
@@ -7,10 +7,9 @@ import mujoco
7
7
  import numpy as np
8
8
 
9
9
  from .base import MatrixLieGroup
10
- from .utils import get_epsilon, skew
10
+ from .utils import get_epsilon
11
11
 
12
12
  _IDENTITIY_WXYZ = np.array([1.0, 0.0, 0.0, 0.0], dtype=np.float64)
13
- _INVERT_QUAT_SIGN = np.array([1.0, -1.0, -1.0, -1.0], dtype=np.float64)
14
13
 
15
14
 
16
15
  class RollPitchYaw(NamedTuple):
@@ -137,63 +136,47 @@ class SO3(MatrixLieGroup):
137
136
  yaw=self.compute_yaw_radians(),
138
137
  )
139
138
 
140
- # Paragraph above Appendix B.A.
141
139
  def inverse(self) -> SO3:
142
- return SO3(wxyz=self.wxyz * _INVERT_QUAT_SIGN)
140
+ conjugate_wxyz = np.empty(4)
141
+ mujoco.mju_negQuat(conjugate_wxyz, self.wxyz)
142
+ return SO3(wxyz=conjugate_wxyz)
143
143
 
144
144
  def normalize(self) -> SO3:
145
- return SO3(wxyz=self.wxyz / np.linalg.norm(self.wxyz))
145
+ normalized_wxyz = np.array(self.wxyz)
146
+ mujoco.mju_normalize4(normalized_wxyz)
147
+ return SO3(wxyz=normalized_wxyz)
146
148
 
147
149
  # Eq. 136.
148
150
  def apply(self, target: np.ndarray) -> np.ndarray:
149
151
  assert target.shape == (SO3.space_dim,)
150
- padded_target = np.concatenate([np.zeros(1, dtype=np.float64), target])
151
- return (self @ SO3(wxyz=padded_target) @ self.inverse()).wxyz[1:]
152
+ rotated_target = np.empty(SO3.space_dim, dtype=np.float64)
153
+ mujoco.mju_rotVecQuat(rotated_target, target, self.wxyz)
154
+ return rotated_target
152
155
 
153
156
  def multiply(self, other: SO3) -> SO3:
154
157
  res = np.empty(self.parameters_dim, dtype=np.float64)
155
158
  mujoco.mju_mulQuat(res, self.wxyz, other.wxyz)
156
159
  return SO3(wxyz=res)
157
160
 
158
- ##
159
- #
160
- ##
161
-
162
161
  # Eq. 132.
163
162
  @classmethod
164
163
  def exp(cls, tangent: np.ndarray) -> SO3:
165
- assert tangent.shape == (SO3.tangent_dim,)
166
- theta_squared = tangent @ tangent
167
- theta_pow_4 = theta_squared * theta_squared
168
- use_taylor = theta_squared < get_epsilon(tangent.dtype)
169
- safe_theta = 1.0 if use_taylor else np.sqrt(theta_squared)
170
- safe_half_theta = 0.5 * safe_theta
171
- if use_taylor:
172
- real = 1.0 - theta_squared / 8.0 + theta_pow_4 / 384.0
173
- imaginary = 0.5 - theta_squared / 48.0 + theta_pow_4 / 3840.0
174
- else:
175
- real = np.cos(safe_half_theta)
176
- imaginary = np.sin(safe_half_theta) / safe_theta
177
- wxyz = np.concatenate([np.array([real]), imaginary * tangent])
164
+ axis = np.array(tangent)
165
+ theta = mujoco.mju_normalize3(axis)
166
+ wxyz = np.zeros(4)
167
+ mujoco.mju_axisAngle2Quat(wxyz, axis, theta)
178
168
  return SO3(wxyz=wxyz)
179
169
 
180
170
  # Eq. 133.
181
171
  def log(self) -> np.ndarray:
182
- w = self.wxyz[0]
183
- norm_sq = self.wxyz[1:] @ self.wxyz[1:]
184
- use_taylor = norm_sq < get_epsilon(norm_sq.dtype)
185
- norm_safe = 1.0 if use_taylor else np.sqrt(norm_sq)
186
- w_safe = w if use_taylor else 1.0
187
- atan_n_over_w = np.arctan2(-norm_safe if w < 0 else norm_safe, abs(w))
188
- if use_taylor:
189
- atan_factor = 2.0 / w_safe - 2.0 / 3.0 * norm_sq / w_safe**3
172
+ if self.wxyz[0] < 0.0:
173
+ theta = 2.0 * np.arccos(-self.wxyz[0])
174
+ axis = -1.0 * np.array(self.wxyz[1:])
190
175
  else:
191
- if abs(w) < get_epsilon(w.dtype):
192
- scl = 1.0 if w > 0.0 else -1.0
193
- atan_factor = scl * np.pi / norm_safe
194
- else:
195
- atan_factor = 2.0 * atan_n_over_w / norm_safe
196
- return atan_factor * self.wxyz[1:]
176
+ theta = 2.0 * np.arccos(self.wxyz[0])
177
+ axis = np.array(self.wxyz[1:])
178
+ mujoco.mju_normalize3(axis)
179
+ return theta * axis
197
180
 
198
181
  # Eq. 139.
199
182
  def adjoint(self) -> np.ndarray:
@@ -204,28 +187,73 @@ class SO3(MatrixLieGroup):
204
187
  # Eqn. 145, 174.
205
188
  @classmethod
206
189
  def ljac(cls, other: np.ndarray) -> np.ndarray:
207
- theta = np.sqrt(other @ other)
208
- use_taylor = theta < get_epsilon(theta.dtype)
209
- if use_taylor:
210
- t2 = theta**2
211
- A = (1.0 / 2.0) * (1.0 - t2 / 12.0 * (1.0 - t2 / 30.0 * (1.0 - t2 / 56.0)))
212
- B = (1.0 / 6.0) * (1.0 - t2 / 20.0 * (1.0 - t2 / 42.0 * (1.0 - t2 / 72.0)))
190
+ theta = np.float64(mujoco.mju_norm3(other))
191
+ t2 = theta * theta
192
+ if theta < get_epsilon(theta.dtype):
193
+ alpha = (1.0 / 2.0) * (
194
+ 1.0 - t2 / 12.0 * (1.0 - t2 / 30.0 * (1.0 - t2 / 56.0))
195
+ )
196
+ beta = (1.0 / 6.0) * (
197
+ 1.0 - t2 / 20.0 * (1.0 - t2 / 42.0 * (1.0 - t2 / 72.0))
198
+ )
213
199
  else:
214
- A = (1 - np.cos(theta)) / (theta**2)
215
- B = (theta - np.sin(theta)) / (theta**3)
216
- skew_other = skew(other)
217
- return np.eye(3) + A * skew_other + B * (skew_other @ skew_other)
200
+ t3 = t2 * theta
201
+ alpha = (1 - np.cos(theta)) / t2
202
+ beta = (theta - np.sin(theta)) / t3
203
+ # ljac = eye(3) + alpha * skew_other + beta * (skew_other @ skew_other)
204
+ ljac = np.empty((3, 3))
205
+ # skew_other @ skew_other == outer(other) - inner(other) * eye(3)
206
+ mujoco.mju_mulMatMat(ljac, other.reshape(3, 1), other.reshape(1, 3))
207
+ inner_product = mujoco.mju_dot3(other, other)
208
+ ljac[0, 0] -= inner_product
209
+ ljac[1, 1] -= inner_product
210
+ ljac[2, 2] -= inner_product
211
+ ljac *= beta
212
+ # + alpha * skew_other
213
+ alpha_vec = alpha * other
214
+ ljac[0, 1] += -alpha_vec[2]
215
+ ljac[0, 2] += alpha_vec[1]
216
+ ljac[1, 0] += alpha_vec[2]
217
+ ljac[1, 2] += -alpha_vec[0]
218
+ ljac[2, 0] += -alpha_vec[1]
219
+ ljac[2, 1] += alpha_vec[0]
220
+ # + eye(3)
221
+ ljac[0, 0] += 1.0
222
+ ljac[1, 1] += 1.0
223
+ ljac[2, 2] += 1.0
224
+ return ljac
218
225
 
219
226
  @classmethod
220
227
  def ljacinv(cls, other: np.ndarray) -> np.ndarray:
221
- theta = np.sqrt(other @ other)
222
- use_taylor = theta < get_epsilon(theta.dtype)
223
- if use_taylor:
224
- t2 = theta**2
225
- A = (1.0 / 12.0) * (1.0 + t2 / 60.0 * (1.0 + t2 / 42.0 * (1.0 + t2 / 40.0)))
228
+ theta = np.float64(mujoco.mju_norm3(other))
229
+ t2 = theta * theta
230
+ if theta < get_epsilon(theta.dtype):
231
+ beta = (1.0 / 12.0) * (
232
+ 1.0 + t2 / 60.0 * (1.0 + t2 / 42.0 * (1.0 + t2 / 40.0))
233
+ )
226
234
  else:
227
- A = (1.0 / theta**2) * (
235
+ beta = (1.0 / t2) * (
228
236
  1.0 - (theta * np.sin(theta) / (2.0 * (1.0 - np.cos(theta))))
229
237
  )
230
- skew_other = skew(other)
231
- return np.eye(3) - 0.5 * skew_other + A * (skew_other @ skew_other)
238
+ # ljacinv = eye(3) - 0.5 * skew_other + beta * (skew_other @ skew_other)
239
+ ljacinv = np.empty((3, 3))
240
+ # skew_other @ skew_other == outer(other) - inner(other) * eye(3)
241
+ mujoco.mju_mulMatMat(ljacinv, other.reshape(3, 1), other.reshape(1, 3))
242
+ inner_product = mujoco.mju_dot3(other, other)
243
+ ljacinv[0, 0] -= inner_product
244
+ ljacinv[1, 1] -= inner_product
245
+ ljacinv[2, 2] -= inner_product
246
+ ljacinv *= beta
247
+ # - 0.5 * skew_other
248
+ alpha_vec = -0.5 * other
249
+ ljacinv[0, 1] += -alpha_vec[2]
250
+ ljacinv[0, 2] += alpha_vec[1]
251
+ ljacinv[1, 0] += alpha_vec[2]
252
+ ljacinv[1, 2] += -alpha_vec[0]
253
+ ljacinv[2, 0] += -alpha_vec[1]
254
+ ljacinv[2, 1] += alpha_vec[0]
255
+ # + eye(3)
256
+ ljacinv[0, 0] += 1.0
257
+ ljacinv[1, 1] += 1.0
258
+ ljacinv[2, 2] += 1.0
259
+ return ljacinv
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mink
3
- Version: 0.0.8
3
+ Version: 0.0.9
4
4
  Summary: mink: MuJoCo inverse kinematics.
5
5
  Keywords: inverse,kinematics,mujoco
6
6
  Author-email: Kevin Zakka <zakka@berkeley.edu>
@@ -21,7 +21,7 @@ License-File: LICENSE
21
21
  Requires-Dist: mujoco >= 3.1.6
22
22
  Requires-Dist: qpsolvers[daqp] >= 4.3.1
23
23
  Requires-Dist: typing_extensions
24
- Requires-Dist: numpy < 2.0.0
24
+ Requires-Dist: numpy
25
25
  Requires-Dist: mink[examples, dev] ; extra == "all"
26
26
  Requires-Dist: black ; extra == "dev"
27
27
  Requires-Dist: mink[test] ; extra == "dev"
@@ -333,8 +333,8 @@ mink/contrib/keyboard_teleop/keycodes.py,sha256=1AN3bWpkw99ZjrkIQnu8QdHSz-_boWMY
333
333
  mink/contrib/keyboard_teleop/teleop_mocap.py,sha256=2cuauiBHsQb6IVruRbGtCumdHQazEGvt9w2L50eKGzw,8095
334
334
  mink/lie/__init__.py,sha256=7tm3ZFnF3o1SDd9MOFO1In13lHMQJHO0FB-ejI6tsgE,202
335
335
  mink/lie/base.py,sha256=8TGWWEWRvmoBsJP-9y1YXQHkTC-TFfI8JDvBFKxxP-A,4865
336
- mink/lie/se3.py,sha256=mmPjbljB0ddPrV0b47OV8GP9rqU6f-bpW8TQPW_p-9A,8050
337
- mink/lie/so3.py,sha256=IqXqalM5NG0cTi1ZZcuXA2lcAk7A3Jnt_1O2n-ae0DE,7474
336
+ mink/lie/se3.py,sha256=cEzAzKEfBAQcbHhbZbhW8QZA8WpfRRaeZ0YGdSmhOx8,8634
337
+ mink/lie/so3.py,sha256=0KgvflDlUJHd_Ruy2pDlgyR7ZC1HkJz4HVxWcCLo5EY,8182
338
338
  mink/lie/utils.py,sha256=DuEl3pj84daLvMKN84-YBvkXnJfqvc5vpvJ9J-pJ11U,403
339
339
  mink/limits/__init__.py,sha256=hX5Dgpri9AE6YtUCkW79AXMBuNAuBhniR9kQ6Rxwv3Y,416
340
340
  mink/limits/collision_avoidance_limit.py,sha256=MJXesSjvm_2O6RUEz2e4D8uTVOHyTsH9j4UxkPemcn8,11918
@@ -351,7 +351,7 @@ mink/tasks/frame_task.py,sha256=DeNg-bEJxqnrRI0FaJK4UHyb8CyF4A7uPF9G-CdN0sg,5307
351
351
  mink/tasks/posture_task.py,sha256=sVDZyalCh5DP8zmCuX5kYuZxiMxRut_mTZUjv5y3b5M,3998
352
352
  mink/tasks/relative_frame_task.py,sha256=9rIiYocI1eEESt0bLZZpQR7K6ggVRZH8iEhdhzkfZa0,5119
353
353
  mink/tasks/task.py,sha256=F16YZT1L9ueNOcKoOhbCyEnZw0DOgrmjqADl0jahVQI,4838
354
- mink-0.0.8.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
355
- mink-0.0.8.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
356
- mink-0.0.8.dist-info/METADATA,sha256=SoXK-YNeZsu55hyaqB2hPAPjtWXR7xH7wL9cc2vBTBU,5614
357
- mink-0.0.8.dist-info/RECORD,,
354
+ mink-0.0.9.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
355
+ mink-0.0.9.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
356
+ mink-0.0.9.dist-info/METADATA,sha256=PbX9fwluNc1-M5fB8cuJnPD33Flma45GzAU5yd6myfg,5606
357
+ mink-0.0.9.dist-info/RECORD,,
File without changes