Merge pull request #1769 from fanminshi:renderer_context

PiperOrigin-RevId: 648508835
Change-Id: Ice87cd1221723ed44ba0ddca97b6aac245dd8975
This commit is contained in:
Copybara-Service
2024-07-01 15:48:41 -07:00
+197 -176
View File
@@ -420,8 +420,8 @@
"data = mujoco.MjData(model)\n", "data = mujoco.MjData(model)\n",
"\n", "\n",
"# Make renderer, render and show the pixels\n", "# Make renderer, render and show the pixels\n",
"renderer = mujoco.Renderer(model)\n", "with mujoco.Renderer(model) as renderer:\n",
"media.show_image(renderer.render())" " media.show_image(renderer.render())"
] ]
}, },
{ {
@@ -445,10 +445,11 @@
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
"mujoco.mj_forward(model, data)\n", "with mujoco.Renderer(model) as renderer:\n",
"renderer.update_scene(data)\n", " mujoco.mj_forward(model, data)\n",
" renderer.update_scene(data)\n",
"\n", "\n",
"media.show_image(renderer.render())" " media.show_image(renderer.render())"
] ]
}, },
{ {
@@ -480,11 +481,11 @@
"model = mujoco.MjModel.from_xml_string(xml)\n", "model = mujoco.MjModel.from_xml_string(xml)\n",
"data = mujoco.MjData(model)\n", "data = mujoco.MjData(model)\n",
"\n", "\n",
"renderer = mujoco.Renderer(model)\n", "with mujoco.Renderer(model) as renderer:\n",
"mujoco.mj_forward(model, data)\n", " mujoco.mj_forward(model, data)\n",
"renderer.update_scene(data)\n", " renderer.update_scene(data)\n",
"\n", "\n",
"media.show_image(renderer.render())" " media.show_image(renderer.render())"
] ]
}, },
{ {
@@ -508,9 +509,10 @@
"source": [ "source": [
"# Run this cell multiple times for different colors\n", "# Run this cell multiple times for different colors\n",
"model.geom('red_box').rgba[:3] = np.random.rand(3)\n", "model.geom('red_box').rgba[:3] = np.random.rand(3)\n",
"renderer.update_scene(data)\n", "with mujoco.Renderer(model) as renderer:\n",
" renderer.update_scene(data)\n",
"\n", "\n",
"media.show_image(renderer.render())" " media.show_image(renderer.render())"
] ]
}, },
{ {
@@ -540,12 +542,13 @@
"# Simulate and display video.\n", "# Simulate and display video.\n",
"frames = []\n", "frames = []\n",
"mujoco.mj_resetData(model, data) # Reset state and time.\n", "mujoco.mj_resetData(model, data) # Reset state and time.\n",
"while data.time < duration:\n", "with mujoco.Renderer(model) as renderer:\n",
" mujoco.mj_step(model, data)\n", " while data.time < duration:\n",
" if len(frames) < data.time * framerate:\n", " mujoco.mj_step(model, data)\n",
" renderer.update_scene(data)\n", " if len(frames) < data.time * framerate:\n",
" pixels = renderer.render()\n", " renderer.update_scene(data)\n",
" frames.append(pixels)\n", " pixels = renderer.render()\n",
" frames.append(pixels)\n",
"\n", "\n",
"media.show_video(frames, fps=framerate)" "media.show_video(frames, fps=framerate)"
] ]
@@ -583,7 +586,6 @@
"\"\"\"\n", "\"\"\"\n",
"model = mujoco.MjModel.from_xml_string(xml)\n", "model = mujoco.MjModel.from_xml_string(xml)\n",
"data = mujoco.MjData(model)\n", "data = mujoco.MjData(model)\n",
"renderer = mujoco.Renderer(model)\n",
"\n", "\n",
"# enable joint visualization option:\n", "# enable joint visualization option:\n",
"scene_option = mujoco.MjvOption()\n", "scene_option = mujoco.MjvOption()\n",
@@ -595,12 +597,13 @@
"# Simulate and display video.\n", "# Simulate and display video.\n",
"frames = []\n", "frames = []\n",
"mujoco.mj_resetData(model, data)\n", "mujoco.mj_resetData(model, data)\n",
"while data.time < duration:\n", "with mujoco.Renderer(model) as renderer:\n",
" mujoco.mj_step(model, data)\n", " while data.time < duration:\n",
" if len(frames) < data.time * framerate:\n", " mujoco.mj_step(model, data)\n",
" renderer.update_scene(data, scene_option=scene_option)\n", " if len(frames) < data.time * framerate:\n",
" pixels = renderer.render()\n", " renderer.update_scene(data, scene_option=scene_option)\n",
" frames.append(pixels)\n", " pixels = renderer.render()\n",
" frames.append(pixels)\n",
"\n", "\n",
"media.show_video(frames, fps=framerate)" "media.show_video(frames, fps=framerate)"
] ]
@@ -651,12 +654,13 @@
"# Simulate and display video.\n", "# Simulate and display video.\n",
"frames = []\n", "frames = []\n",
"mujoco.mj_resetData(model, data)\n", "mujoco.mj_resetData(model, data)\n",
"while data.time < duration:\n", "with mujoco.Renderer(model) as renderer:\n",
" mujoco.mj_step(model, data)\n", " while data.time < duration:\n",
" if len(frames) < data.time * framerate:\n", " mujoco.mj_step(model, data)\n",
" renderer.update_scene(data, scene_option=scene_option)\n", " if len(frames) < data.time * framerate:\n",
" pixels = renderer.render()\n", " renderer.update_scene(data, scene_option=scene_option)\n",
" frames.append(pixels)\n", " pixels = renderer.render()\n",
" frames.append(pixels)\n",
"\n", "\n",
"media.show_video(frames, fps=60)" "media.show_video(frames, fps=60)"
] ]
@@ -760,12 +764,12 @@
"\"\"\"\n", "\"\"\"\n",
"model = mujoco.MjModel.from_xml_string(tippe_top)\n", "model = mujoco.MjModel.from_xml_string(tippe_top)\n",
"data = mujoco.MjData(model)\n", "data = mujoco.MjData(model)\n",
"renderer = mujoco.Renderer(model)\n",
"\n", "\n",
"mujoco.mj_forward(model, data)\n", "mujoco.mj_forward(model, data)\n",
"renderer.update_scene(data, camera=\"closeup\")\n", "with mujoco.Renderer(model) as renderer:\n",
" renderer.update_scene(data, camera=\"closeup\")\n",
"\n", "\n",
"media.show_image(renderer.render())" " media.show_image(renderer.render())"
] ]
}, },
{ {
@@ -821,12 +825,13 @@
"# Simulate and display video.\n", "# Simulate and display video.\n",
"frames = []\n", "frames = []\n",
"mujoco.mj_resetDataKeyframe(model, data, 0) # Reset the state to keyframe 0\n", "mujoco.mj_resetDataKeyframe(model, data, 0) # Reset the state to keyframe 0\n",
"while data.time < duration:\n", "with mujoco.Renderer(model) as renderer:\n",
" mujoco.mj_step(model, data)\n", " while data.time < duration:\n",
" if len(frames) < data.time * framerate:\n", " mujoco.mj_step(model, data)\n",
" renderer.update_scene(data, \"closeup\")\n", " if len(frames) < data.time * framerate:\n",
" pixels = renderer.render()\n", " renderer.update_scene(data, \"closeup\")\n",
" frames.append(pixels)\n", " pixels = renderer.render()\n",
" frames.append(pixels)\n",
"\n", "\n",
"media.show_video(frames, fps=framerate)" "media.show_video(frames, fps=framerate)"
] ]
@@ -939,12 +944,14 @@
"\"\"\"\n", "\"\"\"\n",
"model = mujoco.MjModel.from_xml_string(chaotic_pendulum)\n", "model = mujoco.MjModel.from_xml_string(chaotic_pendulum)\n",
"data = mujoco.MjData(model)\n", "data = mujoco.MjData(model)\n",
"renderer = mujoco.Renderer(model, 480, 640)\n", "height = 480\n",
"width = 640\n",
"\n", "\n",
"mujoco.mj_forward(model, data)\n", "with mujoco.Renderer(model, height, width) as renderer:\n",
"renderer.update_scene(data, camera=\"fixed\")\n", " mujoco.mj_forward(model, data)\n",
" renderer.update_scene(data, camera=\"fixed\")\n",
"\n", "\n",
"media.show_image(renderer.render())" " media.show_image(renderer.render())"
] ]
}, },
{ {
@@ -970,7 +977,8 @@
"framerate = 30 # Hz\n", "framerate = 30 # Hz\n",
"n_frames = int(n_seconds * framerate)\n", "n_frames = int(n_seconds * framerate)\n",
"frames = []\n", "frames = []\n",
"renderer = mujoco.Renderer(model, 240, 320)\n", "height = 240\n",
"width = 320\n",
"\n", "\n",
"# set initial state\n", "# set initial state\n",
"mujoco.mj_resetData(model, data)\n", "mujoco.mj_resetData(model, data)\n",
@@ -981,17 +989,18 @@
"sim_time = 0\n", "sim_time = 0\n",
"render_time = 0\n", "render_time = 0\n",
"n_steps = 0\n", "n_steps = 0\n",
"for i in range(n_frames):\n", "with mujoco.Renderer(model, height, width) as renderer:\n",
" while data.time * framerate < i:\n", " for i in range(n_frames):\n",
" while data.time * framerate < i:\n",
" tic = time.time()\n",
" mujoco.mj_step(model, data)\n",
" sim_time += time.time() - tic\n",
" n_steps += 1\n",
" tic = time.time()\n", " tic = time.time()\n",
" mujoco.mj_step(model, data)\n", " renderer.update_scene(data, \"fixed\")\n",
" sim_time += time.time() - tic\n", " frame = renderer.render()\n",
" n_steps += 1\n", " render_time += time.time() - tic\n",
" tic = time.time()\n", " frames.append(frame)\n",
" renderer.update_scene(data, \"fixed\")\n",
" frame = renderer.render()\n",
" render_time += time.time() - tic\n",
" frames.append(frame)\n",
"\n", "\n",
"# print timing and play video\n", "# print timing and play video\n",
"step_time = 1e6*sim_time/n_steps\n", "step_time = 1e6*sim_time/n_steps\n",
@@ -1233,12 +1242,14 @@
"\"\"\"\n", "\"\"\"\n",
"model = mujoco.MjModel.from_xml_string(free_body_MJCF)\n", "model = mujoco.MjModel.from_xml_string(free_body_MJCF)\n",
"data = mujoco.MjData(model)\n", "data = mujoco.MjData(model)\n",
"renderer = mujoco.Renderer(model, 400, 600)\n", "height = 400\n",
"width = 600\n",
"\n", "\n",
"mujoco.mj_forward(model, data)\n", "with mujoco.Renderer(model, height, width) as renderer:\n",
"renderer.update_scene(data, \"fixed\")\n", " mujoco.mj_forward(model, data)\n",
" renderer.update_scene(data, \"fixed\")\n",
"\n", "\n",
"media.show_image(renderer.render())" " media.show_image(renderer.render())"
] ]
}, },
{ {
@@ -1262,7 +1273,6 @@
"height = 240\n", "height = 240\n",
"width = 320\n", "width = 320\n",
"frames = []\n", "frames = []\n",
"renderer = mujoco.Renderer(model, height, width)\n",
"\n", "\n",
"# visualize contact frames and forces, make body transparent\n", "# visualize contact frames and forces, make body transparent\n",
"options = mujoco.MjvOption()\n", "options = mujoco.MjvOption()\n",
@@ -1282,12 +1292,13 @@
"data.qvel[3:6] = 5*np.random.randn(3)\n", "data.qvel[3:6] = 5*np.random.randn(3)\n",
"\n", "\n",
"# Simulate and display video.\n", "# Simulate and display video.\n",
"for i in range(n_frames):\n", "with mujoco.Renderer(model, height, width) as renderer:\n",
" while data.time < i/120.0: #1/4x real time\n", " for i in range(n_frames):\n",
" mujoco.mj_step(model, data)\n", " while data.time < i/120.0: #1/4x real time\n",
" renderer.update_scene(data, \"track\", options)\n", " mujoco.mj_step(model, data)\n",
" frame = renderer.render()\n", " renderer.update_scene(data, \"track\", options)\n",
" frames.append(frame)\n", " frame = renderer.render()\n",
" frames.append(frame)\n",
"\n", "\n",
"media.show_video(frames, fps=30)" "media.show_video(frames, fps=30)"
] ]
@@ -1440,16 +1451,16 @@
"# load\n", "# load\n",
"model = mujoco.MjModel.from_xml_string(MJCF)\n", "model = mujoco.MjModel.from_xml_string(MJCF)\n",
"data = mujoco.MjData(model)\n", "data = mujoco.MjData(model)\n",
"renderer = mujoco.Renderer(model, height, width)\n",
"\n", "\n",
"# Simulate and display video.\n", "# Simulate and display video.\n",
"mujoco.mj_resetData(model, data)\n", "with mujoco.Renderer(model, height, width) as renderer:\n",
"for i in range(n_frames):\n", " mujoco.mj_resetData(model, data)\n",
" while data.time < i/30.0:\n", " for i in range(n_frames):\n",
" mujoco.mj_step(model, data)\n", " while data.time < i/30.0:\n",
" renderer.update_scene(data, \"y\")\n", " mujoco.mj_step(model, data)\n",
" frame = renderer.render()\n", " renderer.update_scene(data, \"y\")\n",
" frames.append(frame)\n", " frame = renderer.render()\n",
" frames.append(frame)\n",
"\n", "\n",
"media.show_video(frames, fps=30)" "media.show_video(frames, fps=30)"
] ]
@@ -1520,12 +1531,14 @@
"\"\"\"\n", "\"\"\"\n",
"model = mujoco.MjModel.from_xml_string(MJCF)\n", "model = mujoco.MjModel.from_xml_string(MJCF)\n",
"data = mujoco.MjData(model)\n", "data = mujoco.MjData(model)\n",
"renderer = mujoco.Renderer(model, 480, 480)\n", "height = 480\n",
"width = 480\n",
"\n", "\n",
"mujoco.mj_forward(model, data)\n", "with mujoco.Renderer(model, height, width) as renderer:\n",
"renderer.update_scene(data, \"fixed\")\n", " mujoco.mj_forward(model, data)\n",
" renderer.update_scene(data, \"fixed\")\n",
"\n", "\n",
"media.show_image(renderer.render())\n" " media.show_image(renderer.render())"
] ]
}, },
{ {
@@ -1553,21 +1566,20 @@
"times = []\n", "times = []\n",
"sensordata = []\n", "sensordata = []\n",
"\n", "\n",
"renderer = mujoco.Renderer(model, height, width)\n",
"\n",
"# constant actuator signal\n", "# constant actuator signal\n",
"mujoco.mj_resetData(model, data)\n", "mujoco.mj_resetData(model, data)\n",
"data.ctrl = 20\n", "data.ctrl = 20\n",
"\n", "\n",
"# Simulate and display video.\n", "# Simulate and display video.\n",
"for i in range(n_frames):\n", "with mujoco.Renderer(model, height, width) as renderer:\n",
" while data.time < i/fps:\n", " for i in range(n_frames):\n",
" mujoco.mj_step(model, data)\n", " while data.time < i/fps:\n",
" times.append(data.time)\n", " mujoco.mj_step(model, data)\n",
" sensordata.append(data.sensor('accelerometer').data.copy())\n", " times.append(data.time)\n",
" renderer.update_scene(data, \"fixed\")\n", " sensordata.append(data.sensor('accelerometer').data.copy())\n",
" frame = renderer.render()\n", " renderer.update_scene(data, \"fixed\")\n",
" frames.append(frame)\n", " frame = renderer.render()\n",
" frames.append(frame)\n",
"\n", "\n",
"media.show_video(frames, fps=fps)" "media.show_video(frames, fps=fps)"
] ]
@@ -1644,12 +1656,12 @@
"</mujoco>\n", "</mujoco>\n",
"\"\"\"\n", "\"\"\"\n",
"model = mujoco.MjModel.from_xml_string(xml)\n", "model = mujoco.MjModel.from_xml_string(xml)\n",
"renderer = mujoco.Renderer(model)\n",
"data = mujoco.MjData(model)\n", "data = mujoco.MjData(model)\n",
"\n", "\n",
"mujoco.mj_forward(model, data)\n", "with mujoco.Renderer(model) as renderer:\n",
"renderer.update_scene(data)\n", " mujoco.mj_forward(model, data)\n",
"media.show_image(renderer.render())" " renderer.update_scene(data)\n",
" media.show_image(renderer.render())"
] ]
}, },
{ {
@@ -1664,9 +1676,10 @@
"\n", "\n",
"scene_option.frame = mujoco.mjtFrame.mjFRAME_GEOM\n", "scene_option.frame = mujoco.mjtFrame.mjFRAME_GEOM\n",
"scene_option.flags[mujoco.mjtVisFlag.mjVIS_TRANSPARENT] = True\n", "scene_option.flags[mujoco.mjtVisFlag.mjVIS_TRANSPARENT] = True\n",
"renderer.update_scene(data, scene_option=scene_option)\n", "with mujoco.Renderer(model) as renderer:\n",
"frame = renderer.render()\n", " renderer.update_scene(data, scene_option=scene_option)\n",
"media.show_image(frame)" " frame = renderer.render()\n",
" media.show_image(frame)"
] ]
}, },
{ {
@@ -1679,25 +1692,24 @@
"source": [ "source": [
"#@title Depth rendering {vertical-output: true}\n", "#@title Depth rendering {vertical-output: true}\n",
"\n", "\n",
"# update renderer to render depth\n", "with mujoco.Renderer(model) as renderer:\n",
"renderer.enable_depth_rendering()\n", " # update renderer to render depth\n",
" renderer.enable_depth_rendering()\n",
"\n", "\n",
"# reset the scene\n", " # reset the scene\n",
"renderer.update_scene(data)\n", " renderer.update_scene(data)\n",
"\n", "\n",
"# depth is a float array, in meters.\n", " # depth is a float array, in meters.\n",
"depth = renderer.render()\n", " depth = renderer.render()\n",
"\n", "\n",
"# Shift nearest values to the origin.\n", " # Shift nearest values to the origin.\n",
"depth -= depth.min()\n", " depth -= depth.min()\n",
"# Scale by 2 mean distances of near rays.\n", " # Scale by 2 mean distances of near rays.\n",
"depth /= 2*depth[depth <= 1].mean()\n", " depth /= 2*depth[depth <= 1].mean()\n",
"# Scale to [0, 255]\n", " # Scale to [0, 255]\n",
"pixels = 255*np.clip(depth, 0, 1)\n", " pixels = 255*np.clip(depth, 0, 1)\n",
"\n", "\n",
"media.show_image(pixels.astype(np.uint8))\n", " media.show_image(pixels.astype(np.uint8))"
"\n",
"renderer.disable_depth_rendering()"
] ]
}, },
{ {
@@ -1710,25 +1722,26 @@
"source": [ "source": [
"#@title Segmentation rendering {vertical-output: true}\n", "#@title Segmentation rendering {vertical-output: true}\n",
"\n", "\n",
"# update renderer to render segmentation\n", "with mujoco.Renderer(model) as renderer:\n",
"renderer.enable_segmentation_rendering()\n", " renderer.disable_depth_rendering()\n",
"\n", "\n",
"# reset the scene\n", " # update renderer to render segmentation\n",
"renderer.update_scene(data)\n", " renderer.enable_segmentation_rendering()\n",
"\n", "\n",
"seg = renderer.render()\n", " # reset the scene\n",
" renderer.update_scene(data)\n",
"\n", "\n",
"# Display the contents of the first channel, which contains object\n", " seg = renderer.render()\n",
"# IDs. The second channel, seg[:, :, 1], contains object types.\n",
"geom_ids = seg[:, :, 0]\n",
"# Infinity is mapped to -1\n",
"geom_ids = geom_ids.astype(np.float64) + 1\n",
"# Scale to [0, 1]\n",
"geom_ids = geom_ids / geom_ids.max()\n",
"pixels = 255*geom_ids\n",
"media.show_image(pixels.astype(np.uint8))\n",
"\n", "\n",
"renderer.disable_segmentation_rendering()" " # Display the contents of the first channel, which contains object\n",
" # IDs. The second channel, seg[:, :, 1], contains object types.\n",
" geom_ids = seg[:, :, 0]\n",
" # Infinity is mapped to -1\n",
" geom_ids = geom_ids.astype(np.float64) + 1\n",
" # Scale to [0, 1]\n",
" geom_ids = geom_ids / geom_ids.max()\n",
" pixels = 255*geom_ids\n",
" media.show_image(pixels.astype(np.uint8))"
] ]
}, },
{ {
@@ -1792,37 +1805,39 @@
"source": [ "source": [
"#@title Project from world to camera coordinates {vertical-output: true}\n", "#@title Project from world to camera coordinates {vertical-output: true}\n",
"\n", "\n",
"# reset the scene\n", "with mujoco.Renderer(model) as renderer:\n",
"renderer.update_scene(data)\n", " renderer.disable_segmentation_rendering()\n",
" # reset the scene\n",
" renderer.update_scene(data)\n",
"\n", "\n",
"# Get the world coordinates of the box corners\n", " # Get the world coordinates of the box corners\n",
"box_pos = data.geom_xpos[model.geom('red_box').id]\n", " box_pos = data.geom_xpos[model.geom('red_box').id]\n",
"box_mat = data.geom_xmat[model.geom('red_box').id].reshape(3, 3)\n", " box_mat = data.geom_xmat[model.geom('red_box').id].reshape(3, 3)\n",
"box_size = model.geom_size[model.geom('red_box').id]\n", " box_size = model.geom_size[model.geom('red_box').id]\n",
"offsets = np.array([-1, 1]) * box_size[:, None]\n", " offsets = np.array([-1, 1]) * box_size[:, None]\n",
"xyz_local = np.stack(list(itertools.product(*offsets))).T\n", " xyz_local = np.stack(list(itertools.product(*offsets))).T\n",
"xyz_global = box_pos[:, None] + box_mat @ xyz_local\n", " xyz_global = box_pos[:, None] + box_mat @ xyz_local\n",
"\n", "\n",
"# Camera matrices multiply homogenous [x, y, z, 1] vectors.\n", " # Camera matrices multiply homogenous [x, y, z, 1] vectors.\n",
"corners_homogeneous = np.ones((4, xyz_global.shape[1]), dtype=float)\n", " corners_homogeneous = np.ones((4, xyz_global.shape[1]), dtype=float)\n",
"corners_homogeneous[:3, :] = xyz_global\n", " corners_homogeneous[:3, :] = xyz_global\n",
"\n", "\n",
"# Get the camera matrix.\n", " # Get the camera matrix.\n",
"m = compute_camera_matrix(renderer, data)\n", " m = compute_camera_matrix(renderer, data)\n",
"\n", "\n",
"# Project world coordinates into pixel space. See:\n", " # Project world coordinates into pixel space. See:\n",
"# https://en.wikipedia.org/wiki/3D_projection#Mathematical_formula\n", " # https://en.wikipedia.org/wiki/3D_projection#Mathematical_formula\n",
"xs, ys, s = m @ corners_homogeneous\n", " xs, ys, s = m @ corners_homogeneous\n",
"# x and y are in the pixel coordinate system.\n", " # x and y are in the pixel coordinate system.\n",
"x = xs / s\n", " x = xs / s\n",
"y = ys / s\n", " y = ys / s\n",
"\n", "\n",
"# Render the camera view and overlay the projected corner coordinates.\n", " # Render the camera view and overlay the projected corner coordinates.\n",
"pixels = renderer.render()\n", " pixels = renderer.render()\n",
"fig, ax = plt.subplots(1, 1)\n", " fig, ax = plt.subplots(1, 1)\n",
"ax.imshow(pixels)\n", " ax.imshow(pixels)\n",
"ax.plot(x, y, '+', c='w')\n", " ax.plot(x, y, '+', c='w')\n",
"ax.set_axis_off()" " ax.set_axis_off()"
] ]
}, },
{ {
@@ -1894,17 +1909,18 @@
"mujoco.mj_resetData(model, data)\n", "mujoco.mj_resetData(model, data)\n",
"mujoco.mj_forward(model, data)\n", "mujoco.mj_forward(model, data)\n",
"\n", "\n",
"while data.time < duration:\n", "with mujoco.Renderer(model) as renderer:\n",
" # append data to the traces\n", " while data.time < duration:\n",
" positions.append(data.geom_xpos[data.geom(\"green_sphere\").id].copy())\n", " # append data to the traces\n",
" times.append(data.time)\n", " positions.append(data.geom_xpos[data.geom(\"green_sphere\").id].copy())\n",
" speeds.append(get_geom_speed(model, data, \"green_sphere\"))\n", " times.append(data.time)\n",
" mujoco.mj_step(model, data)\n", " speeds.append(get_geom_speed(model, data, \"green_sphere\"))\n",
" if len(frames) < data.time * framerate:\n", " mujoco.mj_step(model, data)\n",
" renderer.update_scene(data)\n", " if len(frames) < data.time * framerate:\n",
" modify_scene(renderer.scene)\n", " renderer.update_scene(data)\n",
" pixels = renderer.render()\n", " modify_scene(renderer.scene)\n",
" frames.append(pixels)\n", " pixels = renderer.render()\n",
" frames.append(pixels)\n",
"\n", "\n",
"media.show_video(frames, fps=framerate)" "media.show_video(frames, fps=framerate)"
] ]
@@ -2018,8 +2034,7 @@
"</mujoco>\n", "</mujoco>\n",
"\"\"\"\n", "\"\"\"\n",
"model = mujoco.MjModel.from_xml_string(dominos_xml)\n", "model = mujoco.MjModel.from_xml_string(dominos_xml)\n",
"data = mujoco.MjData(model)\n", "data = mujoco.MjData(model)\n"
"renderer = mujoco.Renderer(model, height=1024, width=1440)"
] ]
}, },
{ {
@@ -2035,16 +2050,19 @@
"\n", "\n",
"duration = 2.5 # (seconds)\n", "duration = 2.5 # (seconds)\n",
"framerate = 60 # (Hz)\n", "framerate = 60 # (Hz)\n",
"height = 1024\n",
"width = 1440\n",
"\n", "\n",
"# Simulate and display video.\n", "# Simulate and display video.\n",
"frames = []\n", "frames = []\n",
"mujoco.mj_resetData(model, data) # Reset state and time.\n", "mujoco.mj_resetData(model, data) # Reset state and time.\n",
"while data.time < duration:\n", "with mujoco.Renderer(model, height, width) as renderer:\n",
" mujoco.mj_step(model, data)\n", " while data.time < duration:\n",
" if len(frames) < data.time * framerate:\n", " mujoco.mj_step(model, data)\n",
" renderer.update_scene(data, camera='top')\n", " if len(frames) < data.time * framerate:\n",
" pixels = renderer.render()\n", " renderer.update_scene(data, camera='top')\n",
" frames.append(pixels)\n", " pixels = renderer.render()\n",
" frames.append(pixels)\n",
"\n", "\n",
"media.show_video(frames, fps=framerate)" "media.show_video(frames, fps=framerate)"
] ]
@@ -2061,6 +2079,8 @@
"#@title Render from moving camera\n", "#@title Render from moving camera\n",
"\n", "\n",
"duration = 3 # (seconds)\n", "duration = 3 # (seconds)\n",
"height = 1024\n",
"width = 1440\n",
"\n", "\n",
"# find time when box is thrown (speed > 2cm/s)\n", "# find time when box is thrown (speed > 2cm/s)\n",
"throw_time = 0.0\n", "throw_time = 0.0\n",
@@ -2115,13 +2135,14 @@
"slowdown = 4 # 4x slow-down\n", "slowdown = 4 # 4x slow-down\n",
"mujoco.mj_resetData(model, data)\n", "mujoco.mj_resetData(model, data)\n",
"frames = []\n", "frames = []\n",
"while data.time < duration:\n", "with mujoco.Renderer(model, height, width) as renderer:\n",
" mujoco.mj_step(model, data)\n", " while data.time < duration:\n",
" if len(frames) < data.time * framerate * slowdown:\n", " mujoco.mj_step(model, data)\n",
" cam.distance, cam.azimuth, cam.elevation, cam.lookat = cam_motion()\n", " if len(frames) < data.time * framerate * slowdown:\n",
" renderer.update_scene(data, cam)\n", " cam.distance, cam.azimuth, cam.elevation, cam.lookat = cam_motion()\n",
" pixels = renderer.render()\n", " renderer.update_scene(data, cam)\n",
" frames.append(pixels)\n", " pixels = renderer.render()\n",
" frames.append(pixels)\n",
"\n", "\n",
"media.show_video(frames, fps=framerate)" "media.show_video(frames, fps=framerate)"
] ]