12HOME_POSE = [0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708]
31 parser = argparse.ArgumentParser()
32 parser.add_argument(
"--gui", action=
"store_true")
33 args = parser.parse_args()
35 spec = mjk.SceneSpec()
38 spec.add_skybox =
True
39 robot_spec = mjk.RobotSpec()
40 robot_spec.path = str(mjk.ASSETS_DIR /
"kinova_gen3/gen3.xml")
41 spec.robots = [robot_spec]
43 env = mjk.Env.build(spec)
45 robot = env.create_robot(
"base_link",
"bracelet_link")
46 robot.set_control_mode(mjk.CtrlMode.TORQUE)
47 chain = robot.kdl_chain()
48 fk = kdl.ChainFkSolverPos_recursive(chain)
49 dyn = kdl.ChainDynParam(chain, kdl.Vector(0.0, 0.0, spec.gravity_z))
52 robot.set_joint_pos(HOME_POSE)
53 robot.jnt_trq_cmd =
gravity(dyn, HOME_POSE)
55 env.on_reset = on_reset
58 env.open_viewer(
"ex_gravity_comp.py")
61 fk.JntToCart(
joints(HOME_POSE), start)
62 for _
in range(STEPS):
64 robot.jnt_trq_cmd =
gravity(dyn, robot.jnt_pos_msr)
71 fk.JntToCart(
joints(robot.jnt_pos_msr), end)
72 drift = (end.p - start.p).Norm()
73 print(f
"EE drift after {STEPS} steps: {drift * 1000:.4f} mm (limit {MAX_DRIFT * 1000} mm)")
78 ok = drift <= MAX_DRIFT
79 print(f
"{'PASS' if ok else 'FAIL'}: the arm holds its pose")