155 def __init__(self, env: mjk.Env, robot: mjk.Robot):
158 self.
fk = kdl.ChainFkSolverPos_recursive(self.
chain)
159 gravity_z = env.model.opt.gravity[2]
160 root_acc = kdl.Twist(kdl.Vector(0.0, 0.0, -gravity_z), kdl.Vector.Zero())
162 self.
achd = kdl.ChainHdSolver_Vereshchagin(self.
chain, root_acc, 5)
164 self.
achd.setDriverWeights(np.ones(5), np.zeros(5))
165 self.
rnea = kdl.ChainIdSolver_RNE(self.
chain, kdl.Vector(0.0, 0.0, gravity_z))
168 segments = self.
chain.getNrOfSegments()
169 self.
f_ext = [kdl.Wrench.Zero()
for _
in range(segments)]
170 self.
no_wrench = [kdl.Wrench.Zero()
for _
in range(segments)]
198 dt = env.model.opt.timestep
199 if self.
phase == APPROACH:
201 v = min(max(DESCENT_GAIN * self.
tracked.p.z(), V_TOUCH), V_MAX_LIN)
202 self.
tracked.p -= kdl.Vector(0.0, 0.0, v * dt)
203 elif self.
phase == SLIDE:
205 dist = to_goal.Norm()
207 self.
tracked.p += to_goal * (min(dist, V_MAX_LIN * dt) / dist)
210 q, qd =
jnt(robot.jnt_pos_msr),
jnt(robot.jnt_vel_msr)
211 current = kdl.Frame()
212 self.
fk.JntToCart(q, current)
213 err = kdl.diff(current, self.
tracked)
214 e = [err.vel.x(), err.vel.y(), err.vel.z(), err.rot.x(), err.rot.y(), err.rot.z()]
216 de = [(e[i] - prev[i]) / dt
for i
in range(6)]
218 gains = [(KPLIN, KDLIN)] * 3 + [(KPROT, KDROT)] * 3
219 b = [
clamp_abs(kp * e[i] + kd * de[i], BETA_MAX)
for i, (kp, kd)
in enumerate(gains)]
224 if self.
rnea.CartToJnt(q, kdl.JntArray(n), kdl.JntArray(n), self.
no_wrench, ff) < 0:
225 raise RuntimeError(
"PyKDL RNEA failed")
226 qdd, constraint_tau, tau = kdl.JntArray(n), kdl.JntArray(n), kdl.JntArray(n)
227 if self.
phase == APPROACH:
230 ramp = min(1.0, self.
steps / PRESS_STEPS)
if self.
phase == PRESS
else 1.0
231 press = kdl.Vector(0.0, 0.0, -ramp * PRESS_FORCE)
232 self.
f_ext[-1] = kdl.Wrench(press, kdl.Vector.Zero())
234 beta =
jnt([b[0], b[1], b[3], b[4], b[5]])
235 if solver.CartToJnt(q, qd, qdd, alpha, beta, f_ext, ff, constraint_tau) < 0:
236 raise RuntimeError(
"PyKDL ACHD failed")
238 raise RuntimeError(
"PyKDL RNEA failed")
240 robot.jnt_trq_cmd = [tau[i]
for i
in range(n)]