Skip to content

[isaac-parity] missing list_robots, robot_joint_names, remove_robot, remove_object #49

@cagataycali

Description

@cagataycali

Problem

IsaacSimulation (PR #47, branch pr4/isaac-simulation) cannot be instantiated:

TypeError: Can't instantiate abstract class IsaacSimulation with abstract methods
  list_robots, remove_object, remove_robot, robot_joint_names

Reproduced on Isaac Sim 5.1.0 (L40S EC2, Python 3.12) with the full PR stack (#44#45#46#47) merged.

MuJoCo Reference Signatures

From strands_robots/simulation/mujoco/simulation.py:

def list_robots(self) -> list[str]:
    """Return ordered robot names (SimEngine ABC)."""
    if self._world is None or not self._world.robots:
        return []
    return list(self._world.robots.keys())

def robot_joint_names(self, robot_name: str) -> list[str]:
    """Ordered joint names for robot_name (SimEngine ABC)."""
    if self._world is None or robot_name not in self._world.robots:
        return []
    return list(self._world.robots[robot_name].joint_names)

def remove_robot(self, name: str) -> dict[str, Any]:
    """Remove robot and its MJCF elements, recompile."""
    # ...validates existence, stops policies, ejects from scene...

def remove_object(self, name: str) -> dict[str, Any]:
    """Remove object body from scene, recompile."""
    # ...validates existence, deletes from spec, recompiles...

Isaac Implementation Plan

All 4 methods are trivial given IsaacSimulation already tracks self._robots: dict[str, _RobotState]:

def list_robots(self) -> list[str]:
    return list(self._robots.keys())

def robot_joint_names(self, robot_name: str) -> list[str]:
    if robot_name not in self._robots:
        return []
    return list(self._robots[robot_name].joint_names)

def remove_robot(self, name: str) -> dict[str, Any]:
    with self._lock:
        if name not in self._robots:
            return {"status": "error", "content": [{"text": f"Robot '{name}' not found."}]}
        prim_path = self._robots[name].prim_path
        # omni.usd: delete_prim_at_path(prim_path) or stage.RemovePrim(prim_path)
        del self._robots[name]
        return {"status": "success", "content": [{"text": f"Robot '{name}' removed."}]}

def remove_object(self, name: str) -> dict[str, Any]:
    with self._lock:
        # Similar pattern: lookup prim path, remove from USD stage, remove from tracking
        return {"status": "success", "content": [{"text": f"Object '{name}' removed."}]}

For remove_robot/remove_object, the USD-level deletion uses:

  • omni.usd.get_context().get_stage().RemovePrim(prim_path) or
  • omni.kit.commands.execute('DeletePrims', paths=[prim_path])

Impact

This blocks:

  • Any instantiation of IsaacSimulation
  • All downstream testing (determinism baseline, headless render check)
  • PolicyRunner integration (uses list_robots() and robot_joint_names())

Refs: PR #47, #44, #31

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions