mink 0.0.7__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/base.py CHANGED
@@ -103,6 +103,21 @@ class MatrixLieGroup(abc.ABC):
103
103
  """Normalize/projects values and returns."""
104
104
  raise NotImplementedError
105
105
 
106
+ def interpolate(self, other: Self, alpha: float = 0.5) -> Self:
107
+ """Interpolate between two matrix Lie groups.
108
+
109
+ Args:
110
+ other: The other Lie group, which serves as the end point of interpolation.
111
+ alpha: The fraction of interpolation between [self, other]. This must
112
+ be within [0.0, 1.0]. 0.0 = self, 1.0 = other.
113
+
114
+ Returns:
115
+ The interpolated matrix Lie group.
116
+ """
117
+ if alpha < 0.0 or alpha > 1.0:
118
+ raise ValueError(f"Expected alpha within [0.0, 1.0] but received {alpha}")
119
+ return self @ self.exp(alpha * (self.inverse() @ other).log())
120
+
106
121
  # Plus and minus operators.
107
122
 
108
123
  # Eqn. 25.
mink/lie/se3.py CHANGED
@@ -32,6 +32,11 @@ class SE3(MatrixLieGroup):
32
32
  xyz = np.round(self.wxyz_xyz[4:], 5)
33
33
  return f"{self.__class__.__name__}(wxyz={quat}, xyz={xyz})"
34
34
 
35
+ def __eq__(self, other: object) -> bool:
36
+ if not isinstance(other, SE3):
37
+ return NotImplemented
38
+ return np.array_equal(self.wxyz_xyz, other.wxyz_xyz)
39
+
35
40
  def copy(self) -> SE3:
36
41
  return SE3(wxyz_xyz=np.array(self.wxyz_xyz))
37
42
 
@@ -108,130 +113,131 @@ class SE3(MatrixLieGroup):
108
113
 
109
114
  @classmethod
110
115
  def exp(cls, tangent: np.ndarray) -> SE3:
111
- assert tangent.shape == (SE3.tangent_dim,)
116
+ assert tangent.shape == (cls.tangent_dim,)
112
117
  rotation = SO3.exp(tangent[3:])
113
- theta_squared = tangent[3:] @ tangent[3:]
114
- use_taylor = theta_squared < get_epsilon(theta_squared.dtype)
115
- theta_squared_safe = 1.0 if use_taylor else theta_squared
116
- theta_safe = np.sqrt(theta_squared_safe)
117
- skew_omega = skew(tangent[3:])
118
- if use_taylor:
119
- 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()
120
122
  else:
121
- V = (
123
+ skew_omega = skew(tangent[3:])
124
+ v_mat = (
122
125
  np.eye(3, dtype=np.float64)
123
- + (1.0 - np.cos(theta_safe)) / (theta_squared_safe) * skew_omega
124
- + (theta_safe - np.sin(theta_safe))
125
- / (theta_squared_safe * theta_safe)
126
- * (skew_omega @ skew_omega)
126
+ + (1.0 - np.cos(theta)) / t2 * skew_omega
127
+ + (theta - np.sin(theta)) / (t2 * theta) * (skew_omega @ skew_omega)
127
128
  )
128
- return SE3.from_rotation_and_translation(
129
+ return cls.from_rotation_and_translation(
129
130
  rotation=rotation,
130
- translation=V @ tangent[:3],
131
+ translation=v_mat @ tangent[:3],
131
132
  )
132
133
 
133
134
  def inverse(self) -> SE3:
134
- R_inv = self.rotation().inverse()
135
- return SE3.from_rotation_and_translation(
136
- rotation=R_inv,
137
- 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]
138
139
  )
140
+ return SE3(wxyz_xyz=inverse_wxyz_xyz)
139
141
 
140
142
  def normalize(self) -> SE3:
141
- return SE3.from_rotation_and_translation(
142
- rotation=self.rotation().normalize(),
143
- translation=self.translation(),
144
- )
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)
145
146
 
146
147
  def apply(self, target: np.ndarray) -> np.ndarray:
147
148
  assert target.shape == (SE3.space_dim,)
148
- 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:]
149
152
 
150
153
  def multiply(self, other: SE3) -> SE3:
151
- return SE3.from_rotation_and_translation(
152
- rotation=self.rotation() @ other.rotation(),
153
- translation=(self.rotation() @ other.translation()) + self.translation(),
154
- )
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)
155
159
 
156
160
  def log(self) -> np.ndarray:
157
161
  omega = self.rotation().log()
158
- theta_squared = omega @ omega
159
- use_taylor = theta_squared < get_epsilon(theta_squared.dtype)
162
+ theta = np.float64(mujoco.mju_norm3(omega))
163
+ t2 = theta * theta
160
164
  skew_omega = skew(omega)
161
- theta_squared_safe = 1.0 if use_taylor else theta_squared
162
- theta_safe = np.sqrt(theta_squared_safe)
163
- half_theta_safe = 0.5 * theta_safe
164
- skew_omega_norm = skew_omega @ skew_omega
165
- if use_taylor:
166
- V_inv = (
167
- 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
168
169
  )
169
170
  else:
170
- V_inv = (
171
+ half_theta = 0.5 * theta
172
+ vinv_mat = (
171
173
  np.eye(3, dtype=np.float64)
172
174
  - 0.5 * skew_omega
173
- + (
174
- 1.0
175
- - theta_safe
176
- * np.cos(half_theta_safe)
177
- / (2.0 * np.sin(half_theta_safe))
178
- )
179
- / theta_squared_safe
180
- * skew_omega_norm
175
+ + (1.0 - 0.5 * theta * np.cos(half_theta) / np.sin(half_theta))
176
+ / t2
177
+ * skew_omega2
181
178
  )
182
- 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
183
183
 
184
184
  def adjoint(self) -> np.ndarray:
185
- R = self.rotation().as_matrix()
186
- return np.block(
187
- [
188
- [R, skew(self.translation()) @ R],
189
- [np.zeros((3, 3), dtype=np.float64), R],
190
- ]
191
- )
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
192
193
 
193
194
  # Jacobians.
194
195
 
195
196
  # Eqn 179 a)
196
197
  @classmethod
197
198
  def ljac(cls, other: np.ndarray) -> np.ndarray:
198
- theta = other[3:]
199
- 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):
200
201
  return np.eye(cls.tangent_dim)
201
- Q = _getQ(other)
202
- J = SO3.ljac(theta)
203
- O = np.zeros((3, 3))
204
- 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
205
209
 
206
210
  # Eqn 179 b)
207
211
  @classmethod
208
212
  def ljacinv(cls, other: np.ndarray) -> np.ndarray:
209
- theta = other[3:]
210
- 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):
211
215
  return np.eye(cls.tangent_dim)
212
- Q = _getQ(other)
213
- J_inv = SO3.ljacinv(theta)
214
- O = np.zeros((3, 3))
215
- 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
216
223
 
217
224
 
218
225
  # Eqn 180.
219
226
  def _getQ(c) -> np.ndarray:
220
- theta_sq = c[3:] @ c[3:]
227
+ theta = np.float64(mujoco.mju_norm3(c[3:]))
228
+ t2 = theta * theta
221
229
  A = 0.5
222
- if theta_sq < get_epsilon(theta_sq.dtype):
223
- B = (1.0 / 6.0) + (1.0 / 120.0) * theta_sq
224
- 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
225
233
  D = -(1.0 / 60.0)
226
234
  else:
227
- theta = np.sqrt(theta_sq)
235
+ t4 = t2 * t2
228
236
  sin_theta = np.sin(theta)
229
237
  cos_theta = np.cos(theta)
230
- B = (theta - sin_theta) / (theta_sq * theta)
231
- C = (1.0 - theta_sq / 2.0 - cos_theta) / (theta_sq * theta_sq)
232
- D = ((2) * theta - (3) * sin_theta + theta * cos_theta) / (
233
- (2) * theta_sq * theta_sq * theta
234
- )
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)
235
241
  V = skew(c[:3])
236
242
  W = skew(c[3:])
237
243
  VW = V @ W
@@ -241,6 +247,6 @@ def _getQ(c) -> np.ndarray:
241
247
  return (
242
248
  +A * V
243
249
  + B * (WV + VW + WVW)
244
- - C * (VWW - VWW.T - 3 * WVW)
250
+ - C * (VWW - VWW.T - 3.0 * WVW)
245
251
  + D * (WVW @ W + W @ WVW)
246
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):
@@ -45,6 +44,11 @@ class SO3(MatrixLieGroup):
45
44
  wxyz = np.round(self.wxyz, 5)
46
45
  return f"{self.__class__.__name__}(wxyz={wxyz})"
47
46
 
47
+ def __eq__(self, other: object) -> bool:
48
+ if not isinstance(other, SO3):
49
+ return NotImplemented
50
+ return np.array_equal(self.wxyz, other.wxyz)
51
+
48
52
  def parameters(self) -> np.ndarray:
49
53
  return self.wxyz
50
54
 
@@ -132,63 +136,47 @@ class SO3(MatrixLieGroup):
132
136
  yaw=self.compute_yaw_radians(),
133
137
  )
134
138
 
135
- # Paragraph above Appendix B.A.
136
139
  def inverse(self) -> SO3:
137
- 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)
138
143
 
139
144
  def normalize(self) -> SO3:
140
- 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)
141
148
 
142
149
  # Eq. 136.
143
150
  def apply(self, target: np.ndarray) -> np.ndarray:
144
151
  assert target.shape == (SO3.space_dim,)
145
- padded_target = np.concatenate([np.zeros(1, dtype=np.float64), target])
146
- 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
147
155
 
148
156
  def multiply(self, other: SO3) -> SO3:
149
157
  res = np.empty(self.parameters_dim, dtype=np.float64)
150
158
  mujoco.mju_mulQuat(res, self.wxyz, other.wxyz)
151
159
  return SO3(wxyz=res)
152
160
 
153
- ##
154
- #
155
- ##
156
-
157
161
  # Eq. 132.
158
162
  @classmethod
159
163
  def exp(cls, tangent: np.ndarray) -> SO3:
160
- assert tangent.shape == (SO3.tangent_dim,)
161
- theta_squared = tangent @ tangent
162
- theta_pow_4 = theta_squared * theta_squared
163
- use_taylor = theta_squared < get_epsilon(tangent.dtype)
164
- safe_theta = 1.0 if use_taylor else np.sqrt(theta_squared)
165
- safe_half_theta = 0.5 * safe_theta
166
- if use_taylor:
167
- real = 1.0 - theta_squared / 8.0 + theta_pow_4 / 384.0
168
- imaginary = 0.5 - theta_squared / 48.0 + theta_pow_4 / 3840.0
169
- else:
170
- real = np.cos(safe_half_theta)
171
- imaginary = np.sin(safe_half_theta) / safe_theta
172
- 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)
173
168
  return SO3(wxyz=wxyz)
174
169
 
175
170
  # Eq. 133.
176
171
  def log(self) -> np.ndarray:
177
- w = self.wxyz[0]
178
- norm_sq = self.wxyz[1:] @ self.wxyz[1:]
179
- use_taylor = norm_sq < get_epsilon(norm_sq.dtype)
180
- norm_safe = 1.0 if use_taylor else np.sqrt(norm_sq)
181
- w_safe = w if use_taylor else 1.0
182
- atan_n_over_w = np.arctan2(-norm_safe if w < 0 else norm_safe, abs(w))
183
- if use_taylor:
184
- 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:])
185
175
  else:
186
- if abs(w) < get_epsilon(w.dtype):
187
- scl = 1.0 if w > 0.0 else -1.0
188
- atan_factor = scl * np.pi / norm_safe
189
- else:
190
- atan_factor = 2.0 * atan_n_over_w / norm_safe
191
- 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
192
180
 
193
181
  # Eq. 139.
194
182
  def adjoint(self) -> np.ndarray:
@@ -199,28 +187,73 @@ class SO3(MatrixLieGroup):
199
187
  # Eqn. 145, 174.
200
188
  @classmethod
201
189
  def ljac(cls, other: np.ndarray) -> np.ndarray:
202
- theta = np.sqrt(other @ other)
203
- use_taylor = theta < get_epsilon(theta.dtype)
204
- if use_taylor:
205
- t2 = theta**2
206
- A = (1.0 / 2.0) * (1.0 - t2 / 12.0 * (1.0 - t2 / 30.0 * (1.0 - t2 / 56.0)))
207
- 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
+ )
208
199
  else:
209
- A = (1 - np.cos(theta)) / (theta**2)
210
- B = (theta - np.sin(theta)) / (theta**3)
211
- skew_other = skew(other)
212
- 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
213
225
 
214
226
  @classmethod
215
227
  def ljacinv(cls, other: np.ndarray) -> np.ndarray:
216
- theta = np.sqrt(other @ other)
217
- use_taylor = theta < get_epsilon(theta.dtype)
218
- if use_taylor:
219
- t2 = theta**2
220
- 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
+ )
221
234
  else:
222
- A = (1.0 / theta**2) * (
235
+ beta = (1.0 / t2) * (
223
236
  1.0 - (theta * np.sin(theta) / (2.0 * (1.0 - np.cos(theta))))
224
237
  )
225
- skew_other = skew(other)
226
- 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.7
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>
@@ -19,9 +19,9 @@ Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Topic :: Scientific/Engineering
20
20
  License-File: LICENSE
21
21
  Requires-Dist: mujoco >= 3.1.6
22
- Requires-Dist: qpsolvers[quadprog] >= 4.3.1
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"
@@ -29,7 +29,8 @@ Requires-Dist: mypy ; extra == "dev"
29
29
  Requires-Dist: ruff ; extra == "dev"
30
30
  Requires-Dist: dm_control >= 1.0.20 ; extra == "examples"
31
31
  Requires-Dist: loop-rate-limiters >= 0.1.0 ; extra == "examples"
32
- Requires-Dist: qpsolvers[quadprog, osqp] >= 4.3.1 ; extra == "examples"
32
+ Requires-Dist: qpsolvers[daqp] >= 4.3.1 ; extra == "examples"
33
+ Requires-Dist: osqp >=0.6.2,<1 ; extra == "examples"
33
34
  Requires-Dist: absl-py ; extra == "test"
34
35
  Requires-Dist: coveralls ; extra == "test"
35
36
  Requires-Dist: pytest ; extra == "test"
@@ -332,9 +332,9 @@ mink/contrib/keyboard_teleop/__init__.py,sha256=wtG_0D-RurdQiGTPjLYVXXt44ieh6ITT
332
332
  mink/contrib/keyboard_teleop/keycodes.py,sha256=1AN3bWpkw99ZjrkIQnu8QdHSz-_boWMYWI2LlZOp5uw,1644
333
333
  mink/contrib/keyboard_teleop/teleop_mocap.py,sha256=2cuauiBHsQb6IVruRbGtCumdHQazEGvt9w2L50eKGzw,8095
334
334
  mink/lie/__init__.py,sha256=7tm3ZFnF3o1SDd9MOFO1In13lHMQJHO0FB-ejI6tsgE,202
335
- mink/lie/base.py,sha256=ummp2-yROMrcYCtsNCoKEiKoJ7wLF0nSjnOOD95aXaY,4220
336
- mink/lie/se3.py,sha256=DudNNLNKgSsS7nMbbpzK-ZdR2z9O_k_AOxzM7yZubpE,7870
337
- mink/lie/so3.py,sha256=-XWy8qMZ16WdhcscsA4ow-D7CTxUgbnsIU45GGOn9P0,7302
335
+ mink/lie/base.py,sha256=8TGWWEWRvmoBsJP-9y1YXQHkTC-TFfI8JDvBFKxxP-A,4865
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.7.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
355
- mink-0.0.7.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
356
- mink-0.0.7.dist-info/METADATA,sha256=ZcQbHajE_Mda5DlByQ23XGpSn7vh4NXiUOJAidbXkvI,5575
357
- mink-0.0.7.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