Isaac Sim environment for Boston Dynamics Spot with 6 RGB-D cameras and ROS2 bridge
![]() |
![]() |
![]() |
|
- Ubuntu 22.04.5 LTS
- CUDA 12.8+ (Recommended: RTX 3000+)
- ~30 GB of free disk
git clone --recurse-submodules <repo-url>
cd spot-simsudo snap install just --classicjust install-simImportant
Isaac Sim already has internal ROS2 libraries. Do not source your local ROS2 installation (source /opt/ros/<distro>/setup.bash) in .bashrc — this causes conflicts when running Isaac Sim.
Run just to see all available commands:
justjust run-spot-sim # with viewport
just run-spot-sim-h # headless modeThe --task flag selects a named task configuration (default: _default):
just run-spot-sim -- --task my_taskEach task lives in scripts/spot_isaacsim/tasks/<name>/task.py and owns its scene build, camera/bridge config, and lifecycle hooks.
spot-isaacsim/
├── assets/ # Robot + object assets (Spot, drill, jar, etc.)
├── external/ # Git submodules
│ ├── relic/ # Spot URDF/USD assets
│ ├── curobo/ # Motion planning & IK
│ ├── IsaacRobotics/ # Isaac Robotics utilities
│ └── zed-isaac-sim/ # ZED camera extension for Isaac Sim
├── scripts/
│ ├── spot_isaacsim/ # Main: Isaac Sim + ROS2 bridge
│ │ ├── play.py # Entry point (just run-spot-sim)
│ │ ├── tasks/ # Named task configs (--task flag)
│ │ ├── scene/ # Scene setup (builder.py, loaders/, scene_cfg.yaml)
│ │ ├── omnigraph/ # ROS2 bridge (OmniGraph)
│ │ ├── control/
│ │ │ ├── components/ # Locomotion, arm IK, collision avoidance
│ │ │ └── interfaces/ # Keyboard and ROS controllers
│ │ └── spot_config/ # Robot configuration and constants
│ └── tools/ # Utility scripts (install, patch)
├── justfile # Task runner (run 'just' for all commands)
└── pyproject.toml # uv dependency management
The simulation node is named grasp_executor and communicates over ROS_DOMAIN_ID=77.
| Topic | Type | Description |
|---|---|---|
/spot/camera/<cam>/image |
sensor_msgs/Image |
RGB image per camera |
/spot/camera/<cam>/camera_info |
sensor_msgs/CameraInfo |
RGB camera intrinsics |
/spot/depth_registered/<cam>/image |
sensor_msgs/Image |
Depth image per camera |
/spot/depth_registered/<cam>/camera_info |
sensor_msgs/CameraInfo |
Depth camera intrinsics |
/joint_states |
sensor_msgs/JointState |
Robot joint states |
/tf / /tf_static |
tf2_msgs/TFMessage |
Robot + camera transforms |
Cameras: hand, frontleft, frontright, left, right, rear. Which cameras are published is configured per-task via publishing_cameras in the task's BridgeConfig.
| Topic | Type | Description |
|---|---|---|
/graspgen/arm_joint_command |
trajectory_msgs/JointTrajectory |
Arm joint trajectory commands |
| Service | Description |
|---|---|
/grasp_executor/pick |
Full sequence: approach → grasp → retrieve |
/grasp_executor/approach |
Move arm to pre-grasp pose |
/grasp_executor/grasp |
Close gripper |
/grasp_executor/retrieve |
Lift arm after grasp |
/grasp_executor/approach_and_grasp |
Approach + close gripper |
/grasp_executor/move_to |
Walk robot to face target |
/grasp_executor/home |
Return arm to home position |
/grasp_executor/trajectory |
Execute a joint trajectory |
| Doc | Description |
|---|---|
| docs/tasks.md | Task plugin system — how to create and configure tasks |
| docs/robot_control.md | Keyboard and ROS2 control interfaces |
- Tasks: Create
scripts/spot_isaacsim/tasks/<name>/task.pywith aTaskclass implementingbuild(),on_setup(),update(),on_reinitialize(),on_shutdown(). Select it with--task <name>. - Scene: Edit
scripts/spot_isaacsim/scene/scene_cfg.yamlto change objects, stage, robot spawn, and lighting. Asset physics uses a nestedphysics:block (rigid_body,material). - Environment: Use
just run <script>to run scripts inside the simulation Python environment (viauv run). - ROS2:
ROS_DOMAIN_ID=77andRMW_IMPLEMENTATION=rmw_cyclonedds_cppare written into the venv activate script at install time. Make sure the ROS2 consumer uses the same domain ID.
MIT License


