Source code for adam.model.factory
from __future__ import annotations
import pathlib
from typing import Any
from adam.model.abc_factories import ModelFactory
from adam.model.std_factories.std_model import URDFModelFactory
[docs]
def _is_mujoco_model(obj: Any) -> bool:
"""Check if obj is a MuJoCo MjModel without importing mujoco."""
cls = obj.__class__
cls_name = getattr(cls, "__name__", "")
cls_module = getattr(cls, "__module__", "")
if cls_name != "MjModel" or "mujoco" not in cls_module:
return False
return all(hasattr(obj, attr) for attr in ("nq", "nv", "nu", "nbody"))
[docs]
def _is_urdf(obj: Any) -> bool:
"""Check if obj is a URDF."""
if isinstance(obj, pathlib.Path):
return obj.suffix.lower() == ".urdf"
if isinstance(obj, str):
s = obj.lstrip()
if s.startswith("<") and "<robot" in s[:2048].lower():
return True
try:
return pathlib.Path(obj).suffix.lower() == ".urdf"
except Exception:
return False
return False
[docs]
def build_model_factory(description: Any, math) -> ModelFactory:
"""Return a ModelFactory from a URDF string/path or a MuJoCo model."""
if _is_mujoco_model(description):
from adam.model.mj_factory.mujoco_model import MujocoModelFactory
return MujocoModelFactory(mj_model=description, math=math)
if _is_urdf(description):
return URDFModelFactory(path=description, math=math)
raise ValueError(
f"Unsupported model description. Expected a URDF path/string or a mujoco.MjModel. "
f"Got: {type(description)!r}"
)