14HOME_POSE = [0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708]
17def build_env(model_path: str) -> tuple[mjk.Env, mjk.Robot]:
18 spec = mjk.SceneSpec()
21 spec.add_skybox =
True
22 robot_spec = mjk.RobotSpec()
23 robot_spec.path = model_path
24 spec.robots = [robot_spec]
25 env = mjk.Env.build(spec)
26 robot = env.create_robot(
"base_link",
"bracelet_link")
30def run_loop(env: mjk.Env, robot: mjk.Robot, step_fn, *, duration: float, gui: bool) ->
None:
32 viewer = mjk.SimulateViewer.open(robot,
"ex_gravity_comp.py")
35 while viewer.is_running():
36 if env.time() < prev - 1e-6:
45 end = env.time() + duration
46 while env.time() < end:
52 parser = argparse.ArgumentParser()
53 parser.add_argument(
"--gui", action=
"store_true")
54 args = parser.parse_args()
56 model_path = mjk.menagerie.model_path(
"kinova_gen3", env_var=
"MJ_KDL_MODEL")
59 robot.ctrl_mode = mjk.CtrlMode.TORQUE
60 env.on_reset =
lambda ctx: robot.set_joint_pos(HOME_POSE, call_forward=
False)
64 start_frame = robot.fk_frame()
65 start = [start_frame.p.x(), start_frame.p.y(), start_frame.p.z()]
69 robot.jnt_trq_cmd = robot.gravity_torques(-9.81)
71 run_loop(env, robot, step, duration=2.0, gui=args.gui)
72 end_frame = robot.fk_frame()
73 end = [end_frame.p.x(), end_frame.p.y(), end_frame.p.z()]
74 drift = sum((end[i] - start[i]) ** 2
for i
in range(3)) ** 0.5
75 print(f
"EE drift: {drift:.6f} m")