Payloads

Env DIY saves devices installed on the host robot in robots[].attachments[]. Currently divided into Sensors (Orsus, LiDAR, RealSense D455) and Manipulators (UR5, Z1); the visualization window, terminal quick mode and Isaac Sim 3D editor share the same directory and compatibility rules.

Project structure

Position

Responsibilities

source/EAI/EAI/hmrs_env/env_diy/catalog.py

Defines the payload type, default controller cfg and supported host robots. It is the directory source shared by the three Env DIY front ends

source/EAI/EAI/hmrs_env/env_diy/flow.py

Converts UI selections to AttachmentSelection and checks duplicates, host compatibility, and the UR5/Z1 and Orsus/LiDAR mutual-exclusion rules

source/EAI/EAI/hmrs_env/env_diy/storage.py

Writes the payload to the environment JSON and normalizes it on reading robots[].attachments[]

source/EAI_hmrs/EAI_hmrs/env_builder.py

Create sensors, manipulator articulation, FixedJoint and corresponding controllers according to the environment selection

source/EAI_assets/EAI_assets/sensor/

Provides asset configuration and ROS2 release implementation of Orsus and LiDAR

source/EAI_assets/EAI_assets/robots/*_mount.py

Define the universal mounting primitives of UR5/Z1 and the installation profiles of different hosts

source/EAI_assets/EAI_assets/controller/traditional/

Provides UR5_IK_CFG, Z1_IK_CFG and public robot arm IK controllers

source/EAI/EAI/hmrs_ros/manipulator_omnigraph.py

Create the robot arm ROS2 command and status interface according to the robot instance

usd/payloads/sensors/

Save Orsus, LiDAR and other sensor USD assets

usd/payloads/manipulators/

Save USD, URDF and source description assets of UR5, Z1 and other robotic arms

Usage

When using Env DIY, first select the host robot and then add compatible devices from Payloads Sensors or Payloads Manipulators. Configuration example after saving:

{
  "type": "go2",
  "controller": {"mode": "default", "cfg": "GO2_VELOCITY_RSL_CFG"},
  "attachments": [
    {"type": "orsus", "controller": null},
    {"type": "z1", "controller": {"mode": "default", "cfg": "Z1_IK_CFG"}},
    {"type": "navigation_io", "controller": null}
  ]
}

The saved environment can then be launched directly:

python simulator.py --env=<env_name> --num_envs=1 --device=cuda:0

The runtime call chain is as follows:

Environment JSON
  → storage.py / flow.py parse and verify attachments
  → env_builder.py matches host installation parameters
  → Create sensor or <robot>_arm articulation
  → Configure ROS2 Graph and controller
  → MultiRobotDirectEnv starts the formal environment

The Camera Tool exclusively controls Orsus left/right image publishing, while Navigation I/O exclusively controls point-cloud and odometry publishing. A standalone LiDAR payload always provides the physical sensor; its /cloud and /odometry publishers also require Navigation I/O. Navigation I/O uses the internal navigation_io key in environment JSON. Iris, Pegasus, and CF2X carry a camera, Example_Rotary LiDAR, and base sensors by default; Camera and Navigation I/O only gate the corresponding topic publishers. A ground robot can select Camera only after mounting Orsus or RealSense D455; MuSHR does not support Orsus, so it requires an explicitly attached RealSense D455 for image output. The current simulator.py registers a manipulator OmniGraph for UR5 and Z1 attachments actually mounted in the selection, without requiring Navigation I/O. Before publishing commands, still confirm through runtime topics that setup_robot(...) succeeded rather than relying only on static interface declarations.

Compatibility

Payload

Classification

Supported host robots

Default control configuration

Orsus

Sensor

Carter, Go2, B2, M20, Scout, Coco, Lite3

None

LiDAR

Sensor

Carter, Go2, B2, M20, Scout, MuSHR v2, Coco, Lite3

None

RealSense D455

Sensor

Pepper, MuSHR v2, Carter, Go2, B2, M20, Scout, Coco, Lite3

None

UR5

Manipulator

Go2, B2, M20, Scout, Lite3

UR5_IK_CFG

Z1

Manipulator

Carter, Go2, B2, M20, Scout, Lite3

Z1_IK_CFG

A host can carry compatible sensors and one type of manipulator, but it cannot carry both Orsus and LiDAR or both UR5 and Z1. The sensor restriction applies per robot, so separate robots may use Orsus and LiDAR respectively. The ROS2 namespace of each instance uses the robot name generated by the Builder, such as go2_1, m20_1; sensor data and robot arm commands are isolated between multiple robots.