Mujoco KDL Wrapper  0.2.2
MuJoCo + KDL bridge for robot kinematics and dynamics
Loading...
Searching...
No Matches
viewer_scene.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2"""View a mj_kdl_wrapper-built scene with the official MuJoCo Python viewer."""
3
4from __future__ import annotations
5
6import subprocess
7import sys
8import tempfile
9from pathlib import Path
10
11import mj_kdl_wrapper as mjk
12
13
14def build_scene(model_path: str) -> mjk.Scene:
15 spec = mjk.SceneSpec()
16 spec.timestep = 0.002
17 spec.add_floor = True
18 spec.add_skybox = True
19 robot_spec = mjk.RobotSpec()
20 robot_spec.path = model_path
21 spec.robots = [robot_spec]
22 return mjk.Scene.build(spec)
23
24
25def main() -> int:
26 model_path = mjk.menagerie.model_path("kinova_gen3", env_var="MJ_KDL_MODEL")
27
28 scene = build_scene(model_path)
29 try:
30 tmp = tempfile.NamedTemporaryFile(suffix=".mjb", delete=False)
31 tmp.close()
32 mjb_path = Path(tmp.name)
33 scene.save_binary(str(mjb_path))
34 finally:
35 scene.close()
36
37 try:
38 viewer_code = """
39import sys
40import mujoco
41import mujoco.viewer
42
43expected = sys.argv[2]
44actual = mujoco.mj_versionString()
45if actual != expected:
46 raise SystemExit(
47 f"This example exports a MuJoCo {expected} .mjb file. "
48 f"Installed Python mujoco is {actual}; install the same mujoco version "
49 "or rebuild the wrapper against the installed Python mujoco version."
50 )
51
52model = mujoco.MjModel.from_binary_path(sys.argv[1])
53data = mujoco.MjData(model)
54mujoco.viewer.launch(model, data)
55"""
56 try:
57 subprocess.run(
58 [sys.executable, "-c", viewer_code, str(mjb_path), mjk.mujoco_version()],
59 check=True,
60 )
61 except subprocess.CalledProcessError as exc:
62 raise RuntimeError(
63 "MuJoCo viewer failed to start. If you are running from a sandbox, SSH session, "
64 "or headless shell, run this command from a graphical session with DISPLAY or "
65 "WAYLAND_DISPLAY available."
66 ) from exc
67 finally:
68 if mjb_path.exists():
69 mjb_path.unlink()
70
71 return 0
72
73
74if __name__ == "__main__":
75 raise SystemExit(main())
mjk.Scene build_scene(str model_path)