Source code for unisim.backend.drake.playback
"""Drake-owned playback execution helpers."""
from __future__ import annotations
from collections.abc import Mapping
from os import PathLike
from typing import Any, Callable, TypeVar
import numpy as np
from unisim.backend.base import CameraCfg, DebugOverlayGetter
from unisim.backend.mujoco.playback import run_mujoco_playback
ObsT = TypeVar("ObsT")
[docs]
def run_drake_playback(
*,
env: Any,
initialize: Callable[[], ObsT],
step: Callable[[ObsT], ObsT],
num_steps: int | None,
output_video: str | PathLike[str] | None,
render_spacing: float | None,
render_offset_mode: str | None,
headless: bool,
record_video: bool,
frame_state_getter: Callable[[], np.ndarray] | None,
camera_kwargs: CameraCfg | Mapping[str, Any] | None,
debug_overlay_getter: DebugOverlayGetter | None = None,
on_frame: Callable[[int, np.ndarray], np.ndarray | None] | None = None,
) -> str | None:
"""Run Drake physics playback and optionally render it with MuJoCo.
Drake owns the rollout: ``step`` must advance the Drake backend and
``frame_state_getter`` must read Drake state snapshots. MuJoCo is used only
as an offline visual renderer for the recorded state sequence.
"""
del render_offset_mode
if record_video:
return run_mujoco_playback(
env=env,
initialize=initialize,
step=step,
num_steps=num_steps,
output_video=output_video,
render_spacing=render_spacing,
headless=True,
record_video=True,
frame_state_getter=frame_state_getter,
camera_kwargs=camera_kwargs,
debug_overlay_getter=debug_overlay_getter,
on_frame=on_frame,
)
if not headless:
raise NotImplementedError("Drake playback does not support interactive rendering yet.")
obs = initialize()
steps_run = 0
while num_steps is None or steps_run < int(num_steps):
obs = step(obs)
steps_run += 1
return None
__all__ = ["run_drake_playback"]