-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathik.py
More file actions
56 lines (43 loc) · 1.83 KB
/
ik.py
File metadata and controls
56 lines (43 loc) · 1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import numpy as np
import mink
import mujoco
from loop_rate_limiters import RateLimiter
class InverseKinematics:
def __init__(self, model: mujoco.MjModel, data: mujoco.MjData):
self.configuration = mink.Configuration(model)
self.tasks = [
end_effector_task := mink.FrameTask(
frame_name="gripperframe",
frame_type="site",
position_cost=1.0,
orientation_cost=1.0,
lm_damping=1e-6,
),
posture_task := mink.PostureTask(model, cost=1e-3),
]
self.ee_task = end_effector_task
self.limits = [
mink.ConfigurationLimit(model=self.configuration.model),
]
model.body("target").mocapid[0]
# IK settings.
self.solver = "daqp"
self.pos_threshold = 1e-4
self.ori_threshold = 1e-4
self.max_iters = 20
self.configuration.update(data.qpos)
mujoco.mj_forward(model, data)
posture_task.set_target_from_configuration(self.configuration)
mink.move_mocap_to_frame(model, data, "target", "gripperframe", "site")
def compute(self, model: mujoco.MjModel, data: mujoco.MjData, rate: RateLimiter):
T_wt = mink.SE3.from_mocap_name(model, data, "target")
self.ee_task.set_target(T_wt)
for i in range(self.max_iters):
vel = mink.solve_ik(self.configuration, self.tasks, rate.dt, self.solver, limits=self.limits)
self.configuration.integrate_inplace(vel, rate.dt)
err = self.ee_task.compute_error(self.configuration)
pos_achieved = np.linalg.norm(err[:3]) <= self.pos_threshold
ori_achieved = np.linalg.norm(err[3:]) <= self.ori_threshold
if pos_achieved and ori_achieved:
break
data.ctrl = self.configuration.q