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 |
|---|---|
|
Defines the payload type, default controller cfg and supported host robots. It is the directory source shared by the three Env DIY front ends |
|
Converts UI selections to |
|
Writes the payload to the environment JSON and normalizes it on reading |
|
Create sensors, manipulator articulation, FixedJoint and corresponding controllers according to the environment selection |
|
Provides asset configuration and ROS2 release implementation of Orsus and LiDAR |
|
Define the universal mounting primitives of UR5/Z1 and the installation profiles of different hosts |
|
Provides |
|
Create the robot arm ROS2 command and status interface according to the robot instance |
|
Save Orsus, LiDAR and other sensor USD assets |
|
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 |
|
Z1 |
Manipulator |
Carter, Go2, B2, M20, Scout, Lite3 |
|
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.