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]
26def build_env(model_path: str) -> tuple[mjk.Env, mjk.Robot]:
27 spec = mjk.SceneSpec()
30 spec.add_skybox =
True
31 robot_spec = mjk.RobotSpec()
32 robot_spec.path = model_path
33 spec.robots = [robot_spec]
34 env = mjk.Env.build(spec)
35 robot = env.create_robot(
"base_link",
"bracelet_link")
36 robot.ctrl_mode = mjk.CtrlMode.POSITION
41 parser = argparse.ArgumentParser()
42 parser.add_argument(
"--gui", action=
"store_true", help=
"Open the custom Simulate UI.")
43 args = parser.parse_args()
45 model_path = mjk.menagerie.model_path(
"kinova_gen3", env_var=
"MJ_KDL_MODEL")
49 state = {
"arrived":
False}
52 robot.set_joint_pos(HOME_POSE, call_forward=
False)
53 robot.jnt_pos_cmd = HOME_POSE[:]
54 state[
"arrived"] =
False
56 env.on_reset = on_reset
59 def control_step() -> None:
63 pos_cmd = robot.jnt_pos_cmd
65 for i
in range(robot.n_joints):
66 err = TARGET_POSE[i] - robot.jnt_pos_msr[i]
67 max_err = max(max_err, abs(err))
68 pos_cmd[i] +=
clamp(KV * err, -MAX_VEL, MAX_VEL) * dt
70 robot.jnt_pos_cmd = robot.jnt_pos_msr
71 state[
"arrived"] =
True
73 robot.jnt_pos_cmd = pos_cmd
76 viewer = mjk.SimulateViewer.open(robot,
"ex_vel_ctrl.py")
79 while viewer.is_running():
80 if env.time() < prev - 1e-6:
89 end = env.time() + 5.0
90 while env.time() < end
and not state[
"arrived"]:
93 max_err = max(abs(TARGET_POSE[i] - robot.jnt_pos_msr[i])
for i
in range(robot.n_joints))
94 status =
"converged" if state[
"arrived"]
else "timeout"
95 print(f
"max joint error: {max_err:.4f} rad ({status})")