41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
import time
|
|
from pathlib import Path
|
|
|
|
import mujoco
|
|
import mujoco.viewer
|
|
|
|
|
|
def main():
|
|
_PROJECT_ROOT: Path = Path(__file__).parent.parent
|
|
_MENAGERIE_ROOT: Path = _PROJECT_ROOT / "third_party" / "mujoco_menagerie"
|
|
xml = _MENAGERIE_ROOT / "franka_emika_panda" / "panda.xml"
|
|
|
|
# xml = _MENAGERIE_ROOT / "universal_robots_ur5e" / "ur5e.xml"
|
|
|
|
m = mujoco.MjModel.from_xml_path(xml.as_posix())
|
|
d = mujoco.MjData(m)
|
|
|
|
with mujoco.viewer.launch_passive(m, d) as viewer:
|
|
# Close the viewer automatically after 30 wall-seconds.
|
|
while viewer.is_running():
|
|
step_start = time.time()
|
|
|
|
# mj_step can be replaced with code that also evaluates
|
|
# a policy and applies a control signal before stepping the physics.
|
|
mujoco.mj_step(m, d)
|
|
|
|
# Example modification of a viewer option: toggle contact points every two seconds.
|
|
with viewer.lock():
|
|
viewer.opt.flags[mujoco.mjtVisFlag.mjVIS_CONTACTPOINT] = int(d.time % 2)
|
|
|
|
# Pick up changes to the physics state, apply perturbations, update options from GUI.
|
|
viewer.sync()
|
|
|
|
# Rudimentary time keeping, will drift relative to wall clock.
|
|
time_until_next_step = m.opt.timestep - (time.time() - step_start)
|
|
if time_until_next_step > 0:
|
|
time.sleep(time_until_next_step)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|