17HOME_POSE = [0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708]
37def make_box(name, x, y, hx, hy, hz, color) -> mjk.SceneObject:
38 obj = mjk.SceneObject()
40 obj.shape = mjk.Shape.BOX
41 obj.size = [hx, hy, hz]
42 obj.pos = [x, y, SURFACE_Z + hz]
43 obj.rgba = [color[0], color[1], color[2], 1.0]
45 obj.friction = [1.0, 0.005, 0.0001]
50 obj = mjk.SceneObject()
52 obj.shape = mjk.Shape.SPHERE
53 obj.size = [radius, 0.0, 0.0]
54 obj.pos = [x, y, SURFACE_Z + radius]
55 obj.rgba = [color[0], color[1], color[2], 1.0]
57 obj.friction = [1.0, 0.005, 0.0001]
64 make_box(
"red_cube", 0.35, 0.10, 0.03, 0.03, 0.03, (1.0, 0.2, 0.2)),
65 make_box(
"green_cube", 0.35, -0.10, 0.03, 0.03, 0.03, (0.2, 1.0, 0.2)),
66 make_box(
"blue_cube", 0.35, 0.30, 0.04, 0.04, 0.04, (0.2, 0.2, 1.0)),
67 make_sphere(
"orange_sphere", -0.20, 0.20, 0.035, (1.0, 0.55, 0.0)),
68 make_sphere(
"purple_sphere", -0.20, -0.20, 0.025, (0.7, 0.0, 0.9)),
72def build_env(model_path: str, gripper_path: str, table_path: str) -> tuple[mjk.Env, mjk.Robot]:
73 spec = mjk.SceneSpec()
76 spec.add_skybox =
True
78 robot_spec = mjk.RobotSpec()
79 robot_spec.path = model_path
80 robot_spec.pos = [0.0, 0.0, SURFACE_Z]
82 spec.robots = [robot_spec]
83 overview = mjk.CameraSpec()
84 overview.name =
"overview"
85 overview.pos = [0.0, -0.6, 1.6]
86 overview.euler = [34.0, 0.0, 0.0]
88 side = mjk.CameraSpec()
90 side.pos = [-1.0, 0.0, 1.1]
91 side.euler = [0.0, -68.0, 0.0]
93 spec.cameras = [overview, side]
94 env = mjk.Env.build(spec)
95 tool = mjk.ToolFrameSpec()
96 tool.tool_body =
"g_base"
97 tool.tcp_site =
"g_pinch"
98 robot = env.create_robot(
"base_link",
"bracelet_link", tool=tool)
102def run_loop(env: mjk.Env, robot: mjk.Robot, step_fn, *, duration: float, gui: bool) ->
None:
104 viewer = mjk.SimulateViewer.open(robot,
"ex_table_scene.py")
107 while viewer.is_running():
108 if env.time() < prev - 1e-6:
112 if not viewer.step():
117 end = env.time() + duration
118 while env.time() < end:
124 parser = argparse.ArgumentParser()
125 parser.add_argument(
"--gui", action=
"store_true")
126 args = parser.parse_args()
129 mjk.menagerie.model_path(
"kinova_gen3", env_var=
"MJ_KDL_MODEL"),
130 mjk.menagerie.asset_path(
"robotiq_2f85/2f85.xml", env_var=
"MJ_KDL_GRIPPER"),
131 mjk.menagerie.asset_path(
"table.xml", env_var=
"MJ_KDL_TABLE"),
134 robot.ctrl_mode = mjk.CtrlMode.TORQUE
135 env.on_reset =
lambda ctx: robot.set_joint_pos(HOME_POSE, call_forward=
False)
138 top = env.site_frame(mjk.scene_object_site_name(env.spec.objects[0],
"table_top"))
139 print(f
"table top z = {top.p.z():.3f}")
140 print(f
"cameras: {' '.join(env.camera_names())}")
144 robot.jnt_trq_cmd = robot.gravity_torques(-9.81)
145 if env.has_actuator(
"g_fingers_actuator"):
146 env.set_actuator_ctrl(
147 "g_fingers_actuator", 255.0
if math.fmod(env.time(), 6.0) < 3.0
else 0.0
150 run_loop(env, robot, step, duration=1.0, gui=args.gui)