- [2026-6] We release OASIS, including data collection code, assets and paper.
- Install Isaac Lab v2.1.0 by following the installation guide.
cd IssacLab && ./isaaclab.sh -c oasis
./isaaclab.sh -i- Install OASIS
git clone https://github.com/TeleHuman/oasis.git
conda activate oasis
cd oasis && pip install -e .To use OASIS objects, download the object dataset from object dataset. ( Ignore if you want to build your own scenes.) Place it at assets/.
To use OASIS textures during replay stage, download the texture from texture dataset. ( Ignore if you want to use your own textures.) Place it at assets/.
- Install GMR and PICO SDK, following GMR
After installing the PICO SDK, you need to first open XRoboToolkit on the PICO and check the PICO's IP address, then enter the corresponding IP into the pico_host field in play.sh and record.sh.
-
Due to XRoboToolkit's requirements, your PC must have Ubuntu 22.04 installed.
-
PICO must be on the same network segment as your PC.
-
Remember to start
xrobotoolkit-pc-serviceon your PC before teleopperation.
- Visualize the simulation environment without recording
conda activate oasis
sh play.sh- Collect data in headless mode
conda activate oasis
sh record.shRun teleop
conda activate gmr
sh teleop.shIn record mode, the camera feed from the robot's head camera in Isaac Sim will be streamed to the PICO in real time. You need to click Listen in the Remote Vision section of XRoboToolkit to display the image in the center of your field of view. You can control the data collection lifecycle and gripper behavior using the PICO controllers.
- X —— Start recording data
- Y —— End recording and save the data
- A —— Reset the environment and discard the data currently being recorded
- B —— Switch the first-person view display mode.
- Left Trig / Right Trig —— Close left / right hand
- Left Grip / Right Grip —— Open left / right hand
To improve the frame rate, you can remove the two wrist cameras during recording. Camera generation is configured in tasks/teleop/scenes/scene_factory.py. Remember to re-enable them during the replay stage.
- Replay trajectories offline and apply domain randomization
sh replay.shIn replay.sh, set input_dir to the path of the recorded trajectories and output_dir to the path where the rendered data will be saved.
We use Isaac Sim's PathTracing mode to apply texture, lighting, and camera extrinsics randomization to the collected trajectories. Rendering requires an NVIDIA RTX series GPU. The rendering process consumes a significant amount of storage space, so please make sure you have sufficient disk space.
You can use the start, end, and target_envs_per_episode parameters to specify the starting sequence, ending sequence, and target number of rendered environments per trajectory for the replay.
If your rendering is interrupted midway, don't worry — we use .done files to detect whether the current sequence has finished rendering, and rendering will automatically resume from where it left off.
- Upload photos of your asset to the Hunyuan3d, generate the 3D model file, and export it in GLB format.
- Open Isaacsim and import the GLB asset. (you cannot import it by drag-and-drop; instead, navigate to the GLB file's path in the Content browser at the bottom and import it from there).
- Right-click the Mesh -> Add -> Physics -> Rigid Body with Colliders Preset to add collision. Then, in the mesh's Physics properties, change the collision Approximation to Convex Decomposition.
- Right-click on Layer → Root Layer → Save A Copy →
assets/objects/${your_object_name}/${your_object_name}.usd, and import the${your_object_name}.usdinto Isaacsim. - In
/World/Looks/Material_001/baseColorTex, check the texture path inShader/Inputs/Texture/Texture Fileunder Property. Move thetexturesfolder toassets/objects/${your_object_name}, and reconfigure the texture paths forbaseColorTex,metallicRoughnessTex, andnormalTex. - Adjust the scale in Transform to set the size. The object's actual physical dimensions can be obtained via the script below. You need to open
Window->Script Editor, copy this script into it, and run it.
import omni.usd
from pxr import Usd, UsdGeom
stage = omni.usd.get_context().get_stage()
prim_path = "/World"
prim = stage.GetPrimAtPath(prim_path)
bbox_cache = UsdGeom.BBoxCache(
Usd.TimeCode.Default(),
includedPurposes=[UsdGeom.Tokens.default_]
)
bbox = bbox_cache.ComputeWorldBound(prim)
r = bbox.ComputeAlignedRange()
mn, mx = r.GetMin(), r.GetMax()
size_x = mx[0] - mn[0]
size_y = mx[1] - mn[1]
size_z = mx[2] - mn[2]
print(f"prim: {prim_path}")
print(f"min = ({mn[0]:.4f}, {mn[1]:.4f}, {mn[2]:.4f})")
print(f"max = ({mx[0]:.4f}, {mx[1]:.4f}, {mx[2]:.4f})")
print(f"size: L={size_x:.4f} m, W={size_y:.4f} m, H={size_z:.4f} m") OASIS builds upon code from unitree_sim_isaaclab and TWIST2, and uses Teleopit as its low-level controller.
Feel free to contact me at yuzh24@m.fudan.edu.cn if you encounter any problems.
