15HOME_POSE = [0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708]
16TARGET_POSE = [0.3, 0.5, 2.9, -2.0, 0.3, 1.2, 1.3]
24def build_env(model_path: str) -> tuple[mjk.Env, mjk.Robot]:
25 spec = mjk.SceneSpec()
28 spec.add_skybox =
True
29 robot_spec = mjk.RobotSpec()
30 robot_spec.path = model_path
31 spec.robots = [robot_spec]
32 env = mjk.Env.build(spec)
33 robot = env.create_robot(
"base_link",
"bracelet_link")
34 robot.ctrl_mode = mjk.CtrlMode.POSITION
39 parser = argparse.ArgumentParser()
40 parser.add_argument(
"--gui", action=
"store_true", help=
"Open the custom Simulate UI.")
41 args = parser.parse_args()
43 model_path = mjk.menagerie.model_path(
"kinova_gen3", env_var=
"MJ_KDL_MODEL")
47 state = {
"t_start": 0.0}
50 robot.set_joint_pos(HOME_POSE, call_forward=
False)
51 robot.jnt_pos_cmd = HOME_POSE[:]
52 state[
"t_start"] = env.time()
54 env.on_reset = on_reset
59 alpha =
clamp((env.time() - state[
"t_start"]) / MOTION_DURATION, 0.0, 1.0)
61 HOME_POSE[i] + alpha * (TARGET_POSE[i] - HOME_POSE[i])
62 for i
in range(robot.n_joints)
66 viewer = mjk.SimulateViewer.open(robot,
"ex_pos_ctrl.py")
69 while viewer.is_running():
70 if env.time() < prev - 1e-6:
79 end = env.time() + MOTION_DURATION + 1.0
80 while env.time() < end:
83 max_err = max(abs(TARGET_POSE[i] - robot.jnt_pos_msr[i])
for i
in range(robot.n_joints))
84 print(f
"max joint error at end: {max_err:.4f} rad")