17TABLE_POSE = [-0.00258, 1.43, 3.14, -1.70, -0.018, 1.74, 1.57]
26 table = mjk.SceneObject()
28 table.mjcf_path = mjk.menagerie.asset_path(
"table.xml", env_var=
"MJ_KDL_TABLE")
29 table.pos = [0.0, 0.0, TABLE_Z]
31 attach = mjk.AttachmentSpec()
32 attach.mjcf_path = mjk.menagerie.asset_path(
"robotiq_2f85/2f85.xml", env_var=
"MJ_KDL_GRIPPER")
33 attach.attach_to = mjk.AttachTarget(mjk.AttachKind.Site,
"pinch_site")
35 spec = mjk.SceneSpec()
38 spec.add_skybox =
True
39 spec.objects = [table]
40 robot_spec = mjk.RobotSpec()
41 robot_spec.path = mjk.menagerie.model_path(
"kinova_gen3", env_var=
"MJ_KDL_MODEL")
42 robot_spec.pos = [0.0, 0.0, TABLE_Z]
43 robot_spec.attachments = [attach]
44 spec.robots = [robot_spec]
45 env = mjk.Env.build(spec)
46 tool = mjk.ToolFrameSpec()
47 tool.tool_body =
"g_base"
48 tool.tcp_site =
"g_pinch"
49 robot = env.create_robot(
"base_link",
"bracelet_link", tool=tool)
65 alpha = kdl.Jacobian(5)
66 alpha.setColumn(0, kdl.Twist(kdl.Vector(1, 0, 0), kdl.Vector.Zero()))
67 alpha.setColumn(1, kdl.Twist(kdl.Vector(0, 1, 0), kdl.Vector.Zero()))
68 alpha.setColumn(2, kdl.Twist(kdl.Vector.Zero(), kdl.Vector(1, 0, 0)))
69 alpha.setColumn(3, kdl.Twist(kdl.Vector.Zero(), kdl.Vector(0, 1, 0)))
70 alpha.setColumn(4, kdl.Twist(kdl.Vector.Zero(), kdl.Vector(0, 0, 1)))
74def achd_step(robot, chain, fk, achd, rnea, target, err_prev, first_pid):
76 q =
jnt(robot.jnt_pos_msr)
77 qd =
jnt(robot.jnt_vel_msr)
79 fk.JntToCart(q, current)
80 err = kdl.diff(current, target)
82 e = [err.vel.x(), err.vel.y(), err.rot.x(), err.rot.y(), err.rot.z()]
86 de = [(e[i] - err_prev[i]) / dt
for i
in range(5)]
88 beta = kdl.JntArray(5)
89 beta[0] =
clamp_abs(KPLIN * e[0] + KDLIN * de[0], BETA_MAX)
90 beta[1] =
clamp_abs(KPLIN * e[1] + KDLIN * de[1], BETA_MAX)
91 beta[2] =
clamp_abs(KPROT * e[2] + KDROT * de[2], BETA_MAX)
92 beta[3] =
clamp_abs(KPROT * e[3] + KDROT * de[3], BETA_MAX)
93 beta[4] =
clamp_abs(KPROT * e[4] + KDROT * de[4], BETA_MAX)
98 constraint_tau = kdl.JntArray(n)
99 f_ext = [kdl.Wrench.Zero()
for _
in range(chain.getNrOfSegments())]
100 if achd.CartToJnt(q, qd, qdd,
alpha_no_linear_z(), beta, f_ext, ff, constraint_tau) < 0:
101 raise RuntimeError(
"PyKDL ACHD failed")
103 tau = kdl.JntArray(n)
104 rnea_wrenches = [kdl.Wrench.Zero()
for _
in range(chain.getNrOfSegments())]
105 if rnea.CartToJnt(q, qd, qdd, rnea_wrenches, tau) < 0:
106 raise RuntimeError(
"PyKDL RNEA failed")
107 robot.jnt_trq_cmd = [
clamp_abs(tau[i], TAU_MAX)
for i
in range(n)]
111 parser = argparse.ArgumentParser()
112 parser.add_argument(
"--gui", action=
"store_true")
113 args = parser.parse_args()
117 chain = robot.kdl_chain()
118 fk = kdl.ChainFkSolverPos_recursive(chain)
119 achd = kdl.ChainHdSolver_Vereshchagin_Fixed_Joint(
120 chain, kdl.Twist(kdl.Vector(0.0, 0.0, 9.81), kdl.Vector.Zero()), 5
122 rnea = kdl.ChainIdSolver_RNE(chain, kdl.Vector(0.0, 0.0, -9.81))
123 robot.ctrl_mode = mjk.CtrlMode.TORQUE
129 robot.set_joint_pos(TABLE_POSE, call_forward=
False)
132 env.on_reset = on_reset
137 fk.JntToCart(
jnt(TABLE_POSE), start)
138 target = kdl.Frame(start.M, start.p + kdl.Vector(MOVE_X, 0.0, 0.0))
141 achd_step(robot, chain, fk, achd, rnea, target, err_prev, first_pid)
142 if env.has_actuator(
"g_fingers_actuator"):
143 env.set_actuator_ctrl(
"g_fingers_actuator", 255.0)
146 viewer = mjk.SimulateViewer.open(robot,
"ex_achd_table_slide.py")
149 while viewer.is_running():
150 if env.time() < prev - 1e-6:
154 if not viewer.step():
159 end = env.time() + 2.0
160 while env.time() < end:
164 print(f
"tcp target x shift: {MOVE_X:.3f} m")
165 final_frame = robot.fk_frame()
166 final_pos = [final_frame.p.x(), final_frame.p.y(), final_frame.p.z()]
167 print(f
"final bracelet frame: {[round(x, 3) for x in final_pos]}")