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 +15 -0
- mink/lie/se3.py +83 -77
- mink/lie/so3.py +89 -56
- {mink-0.0.7.dist-info → mink-0.0.9.dist-info}/METADATA +5 -4
- {mink-0.0.7.dist-info → mink-0.0.9.dist-info}/RECORD +7 -7
- {mink-0.0.7.dist-info → mink-0.0.9.dist-info}/WHEEL +0 -0
- {mink-0.0.7.dist-info → mink-0.0.9.dist-info}/licenses/LICENSE +0 -0
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 == (
|
116
|
+
assert tangent.shape == (cls.tangent_dim,)
|
112
117
|
rotation = SO3.exp(tangent[3:])
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
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
|
-
|
123
|
+
skew_omega = skew(tangent[3:])
|
124
|
+
v_mat = (
|
122
125
|
np.eye(3, dtype=np.float64)
|
123
|
-
+ (1.0 - np.cos(
|
124
|
-
+ (
|
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
|
129
|
+
return cls.from_rotation_and_translation(
|
129
130
|
rotation=rotation,
|
130
|
-
translation=
|
131
|
+
translation=v_mat @ tangent[:3],
|
131
132
|
)
|
132
133
|
|
133
134
|
def inverse(self) -> SE3:
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
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
|
-
|
142
|
-
|
143
|
-
|
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
|
-
|
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
|
-
|
152
|
-
|
153
|
-
|
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
|
-
|
159
|
-
|
162
|
+
theta = np.float64(mujoco.mju_norm3(omega))
|
163
|
+
t2 = theta * theta
|
160
164
|
skew_omega = skew(omega)
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
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
|
-
|
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
|
-
|
175
|
-
|
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
|
-
|
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
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
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
|
-
|
199
|
-
if
|
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
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
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
|
-
|
210
|
-
if
|
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
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
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
|
-
|
227
|
+
theta = np.float64(mujoco.mju_norm3(c[3:]))
|
228
|
+
t2 = theta * theta
|
221
229
|
A = 0.5
|
222
|
-
if
|
223
|
-
B = (1.0 / 6.0) + (1.0 / 120.0) *
|
224
|
-
C = -(1.0 / 24.0) + (1.0 / 720.0) *
|
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
|
-
|
235
|
+
t4 = t2 * t2
|
228
236
|
sin_theta = np.sin(theta)
|
229
237
|
cos_theta = np.cos(theta)
|
230
|
-
B = (theta - sin_theta) / (
|
231
|
-
C = (1.0 -
|
232
|
-
D = (
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
146
|
-
|
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
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
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
|
-
|
178
|
-
|
179
|
-
|
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
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
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.
|
203
|
-
|
204
|
-
if
|
205
|
-
|
206
|
-
|
207
|
-
|
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
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
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.
|
217
|
-
|
218
|
-
if
|
219
|
-
|
220
|
-
|
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
|
-
|
235
|
+
beta = (1.0 / t2) * (
|
223
236
|
1.0 - (theta * np.sin(theta) / (2.0 * (1.0 - np.cos(theta))))
|
224
237
|
)
|
225
|
-
|
226
|
-
|
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.
|
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[
|
22
|
+
Requires-Dist: qpsolvers[daqp] >= 4.3.1
|
23
23
|
Requires-Dist: typing_extensions
|
24
|
-
Requires-Dist: numpy
|
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[
|
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=
|
336
|
-
mink/lie/se3.py,sha256=
|
337
|
-
mink/lie/so3.py,sha256
|
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.
|
355
|
-
mink-0.0.
|
356
|
-
mink-0.0.
|
357
|
-
mink-0.0.
|
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
|
File without changes
|