Repository files navigation

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

[website] [arxiv] [pdf]

Cover

News

  • [2026-6] We release OASIS, including data collection code, assets and paper.

🛠️ Getting Started

1. Installation

cd IssacLab && ./isaaclab.sh -c oasis
conda activate 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

2. Usage

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.

Note

  • 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-service on your PC before teleopperation.

  1. Visualize the simulation environment without recording
conda activate oasis
sh play.sh
  1. Collect data in headless mode
conda activate oasis
sh record.sh

Run teleop

conda activate gmr
sh teleop.sh

In 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.

  1. Replay trajectories offline and apply domain randomization
sh replay.sh

In 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.

3. Generate your own assets

  1. Upload photos of your asset to the Hunyuan3d, generate the 3D model file, and export it in GLB format.
  2. 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).
  3. 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.
  4. Right-click on Layer → Root Layer → Save A Copy → assets/objects/${your_object_name}/${your_object_name}.usd, and import the ${your_object_name}.usd into Isaacsim.
  5. In /World/Looks/Material_001/baseColorTex, check the texture path in Shader/Inputs/Texture/Texture File under Property. Move the textures folder to assets/objects/${your_object_name}, and reconfigure the texture paths for baseColorTex, metallicRoughnessTex, and normalTex.
  6. 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") 

Acknowledgements

OASIS builds upon code from unitree_sim_isaaclab and TWIST2, and uses Teleopit as its low-level controller.

Contact

Feel free to contact me at yuzh24@m.fudan.edu.cn if you encounter any problems.

About

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

Resources

Stars

63 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

[website] [arxiv] [pdf]

Cover

News

  • [2026-6] We release OASIS, including data collection code, assets and paper.

🛠️ Getting Started

1. Installation

cd IssacLab && ./isaaclab.sh -c oasis
conda activate 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

2. Usage

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.

Note

  • 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-service on your PC before teleopperation.

  1. Visualize the simulation environment without recording
conda activate oasis
sh play.sh
  1. Collect data in headless mode
conda activate oasis
sh record.sh

Run teleop

conda activate gmr
sh teleop.sh

In 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.

  1. Replay trajectories offline and apply domain randomization
sh replay.sh

In 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.

3. Generate your own assets

  1. Upload photos of your asset to the Hunyuan3d, generate the 3D model file, and export it in GLB format.
  2. 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).
  3. 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.
  4. Right-click on Layer → Root Layer → Save A Copy → assets/objects/${your_object_name}/${your_object_name}.usd, and import the ${your_object_name}.usd into Isaacsim.
  5. In /World/Looks/Material_001/baseColorTex, check the texture path in Shader/Inputs/Texture/Texture File under Property. Move the textures folder to assets/objects/${your_object_name}, and reconfigure the texture paths for baseColorTex, metallicRoughnessTex, and normalTex.
  6. 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") 

Acknowledgements

OASIS builds upon code from unitree_sim_isaaclab and TWIST2, and uses Teleopit as its low-level controller.

Contact

Feel free to contact me at yuzh24@m.fudan.edu.cn if you encounter any problems.

About

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

Resources

Stars

63 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

[website] [arxiv] [pdf]

Cover

News

  • [2026-6] We release OASIS, including data collection code, assets and paper.

🛠️ Getting Started

1. Installation

cd IssacLab && ./isaaclab.sh -c oasis
conda activate 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

2. Usage

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.

Note

  • 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-service on your PC before teleopperation.

  1. Visualize the simulation environment without recording
conda activate oasis
sh play.sh
  1. Collect data in headless mode
conda activate oasis
sh record.sh

Run teleop

conda activate gmr
sh teleop.sh

In 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.

  1. Replay trajectories offline and apply domain randomization
sh replay.sh

In 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.

3. Generate your own assets

  1. Upload photos of your asset to the Hunyuan3d, generate the 3D model file, and export it in GLB format.
  2. 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).
  3. 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.
  4. Right-click on Layer → Root Layer → Save A Copy → assets/objects/${your_object_name}/${your_object_name}.usd, and import the ${your_object_name}.usd into Isaacsim.
  5. In /World/Looks/Material_001/baseColorTex, check the texture path in Shader/Inputs/Texture/Texture File under Property. Move the textures folder to assets/objects/${your_object_name}, and reconfigure the texture paths for baseColorTex, metallicRoughnessTex, and normalTex.
  6. 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") 

Acknowledgements

OASIS builds upon code from unitree_sim_isaaclab and TWIST2, and uses Teleopit as its low-level controller.

Contact

Feel free to contact me at yuzh24@m.fudan.edu.cn if you encounter any problems.

About

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

Resources

Stars

63 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

[website] [arxiv] [pdf]

Cover

News

  • [2026-6] We release OASIS, including data collection code, assets and paper.

🛠️ Getting Started

1. Installation

cd IssacLab && ./isaaclab.sh -c oasis
conda activate 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

2. Usage

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.

Note

  • 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-service on your PC before teleopperation.

  1. Visualize the simulation environment without recording
conda activate oasis
sh play.sh
  1. Collect data in headless mode
conda activate oasis
sh record.sh

Run teleop

conda activate gmr
sh teleop.sh

In 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.

  1. Replay trajectories offline and apply domain randomization
sh replay.sh

In 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.

3. Generate your own assets

  1. Upload photos of your asset to the Hunyuan3d, generate the 3D model file, and export it in GLB format.
  2. 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).
  3. 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.
  4. Right-click on Layer → Root Layer → Save A Copy → assets/objects/${your_object_name}/${your_object_name}.usd, and import the ${your_object_name}.usd into Isaacsim.
  5. In /World/Looks/Material_001/baseColorTex, check the texture path in Shader/Inputs/Texture/Texture File under Property. Move the textures folder to assets/objects/${your_object_name}, and reconfigure the texture paths for baseColorTex, metallicRoughnessTex, and normalTex.
  6. 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") 

Acknowledgements

OASIS builds upon code from unitree_sim_isaaclab and TWIST2, and uses Teleopit as its low-level controller.

Contact

Feel free to contact me at yuzh24@m.fudan.edu.cn if you encounter any problems.

About

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

Resources

Stars

63 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

[website] [arxiv] [pdf]

Cover

News

  • [2026-6] We release OASIS, including data collection code, assets and paper.

🛠️ Getting Started

1. Installation

cd IssacLab && ./isaaclab.sh -c oasis
conda activate 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

2. Usage

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.

Note

  • 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-service on your PC before teleopperation.

  1. Visualize the simulation environment without recording
conda activate oasis
sh play.sh
  1. Collect data in headless mode
conda activate oasis
sh record.sh

Run teleop

conda activate gmr
sh teleop.sh

In 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.

  1. Replay trajectories offline and apply domain randomization
sh replay.sh

In 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.

3. Generate your own assets

  1. Upload photos of your asset to the Hunyuan3d, generate the 3D model file, and export it in GLB format.
  2. 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).
  3. 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.
  4. Right-click on Layer → Root Layer → Save A Copy → assets/objects/${your_object_name}/${your_object_name}.usd, and import the ${your_object_name}.usd into Isaacsim.
  5. In /World/Looks/Material_001/baseColorTex, check the texture path in Shader/Inputs/Texture/Texture File under Property. Move the textures folder to assets/objects/${your_object_name}, and reconfigure the texture paths for baseColorTex, metallicRoughnessTex, and normalTex.
  6. 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") 

Acknowledgements

OASIS builds upon code from unitree_sim_isaaclab and TWIST2, and uses Teleopit as its low-level controller.

Contact

Feel free to contact me at yuzh24@m.fudan.edu.cn if you encounter any problems.

About

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

Resources

Stars

63 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

[website] [arxiv] [pdf]

Cover

News

  • [2026-6] We release OASIS, including data collection code, assets and paper.

🛠️ Getting Started

1. Installation

cd IssacLab && ./isaaclab.sh -c oasis
conda activate 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

2. Usage

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.

Note

  • 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-service on your PC before teleopperation.

  1. Visualize the simulation environment without recording
conda activate oasis
sh play.sh
  1. Collect data in headless mode
conda activate oasis
sh record.sh

Run teleop

conda activate gmr
sh teleop.sh

In 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.

  1. Replay trajectories offline and apply domain randomization
sh replay.sh

In 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.

3. Generate your own assets

  1. Upload photos of your asset to the Hunyuan3d, generate the 3D model file, and export it in GLB format.
  2. 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).
  3. 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.
  4. Right-click on Layer → Root Layer → Save A Copy → assets/objects/${your_object_name}/${your_object_name}.usd, and import the ${your_object_name}.usd into Isaacsim.
  5. In /World/Looks/Material_001/baseColorTex, check the texture path in Shader/Inputs/Texture/Texture File under Property. Move the textures folder to assets/objects/${your_object_name}, and reconfigure the texture paths for baseColorTex, metallicRoughnessTex, and normalTex.
  6. 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") 

Acknowledgements

OASIS builds upon code from unitree_sim_isaaclab and TWIST2, and uses Teleopit as its low-level controller.

Contact

Feel free to contact me at yuzh24@m.fudan.edu.cn if you encounter any problems.

About

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

Resources

Stars

63 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

[website] [arxiv] [pdf]

Cover

News

  • [2026-6] We release OASIS, including data collection code, assets and paper.

🛠️ Getting Started

1. Installation

cd IssacLab && ./isaaclab.sh -c oasis
conda activate 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

2. Usage

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.

Note

  • 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-service on your PC before teleopperation.

  1. Visualize the simulation environment without recording
conda activate oasis
sh play.sh
  1. Collect data in headless mode
conda activate oasis
sh record.sh

Run teleop

conda activate gmr
sh teleop.sh

In 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.

  1. Replay trajectories offline and apply domain randomization
sh replay.sh

In 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.

3. Generate your own assets

  1. Upload photos of your asset to the Hunyuan3d, generate the 3D model file, and export it in GLB format.
  2. 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).
  3. 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.
  4. Right-click on Layer → Root Layer → Save A Copy → assets/objects/${your_object_name}/${your_object_name}.usd, and import the ${your_object_name}.usd into Isaacsim.
  5. In /World/Looks/Material_001/baseColorTex, check the texture path in Shader/Inputs/Texture/Texture File under Property. Move the textures folder to assets/objects/${your_object_name}, and reconfigure the texture paths for baseColorTex, metallicRoughnessTex, and normalTex.
  6. 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") 

Acknowledgements

OASIS builds upon code from unitree_sim_isaaclab and TWIST2, and uses Teleopit as its low-level controller.

Contact

Feel free to contact me at yuzh24@m.fudan.edu.cn if you encounter any problems.

About

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

Resources

Stars

63 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

[website] [arxiv] [pdf]

Cover

News

  • [2026-6] We release OASIS, including data collection code, assets and paper.

🛠️ Getting Started

1. Installation

cd IssacLab && ./isaaclab.sh -c oasis
conda activate 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

2. Usage

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.

Note

  • 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-service on your PC before teleopperation.

  1. Visualize the simulation environment without recording
conda activate oasis
sh play.sh
  1. Collect data in headless mode
conda activate oasis
sh record.sh

Run teleop

conda activate gmr
sh teleop.sh

In 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.

  1. Replay trajectories offline and apply domain randomization
sh replay.sh

In 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.

3. Generate your own assets

  1. Upload photos of your asset to the Hunyuan3d, generate the 3D model file, and export it in GLB format.
  2. 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).
  3. 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.
  4. Right-click on Layer → Root Layer → Save A Copy → assets/objects/${your_object_name}/${your_object_name}.usd, and import the ${your_object_name}.usd into Isaacsim.
  5. In /World/Looks/Material_001/baseColorTex, check the texture path in Shader/Inputs/Texture/Texture File under Property. Move the textures folder to assets/objects/${your_object_name}, and reconfigure the texture paths for baseColorTex, metallicRoughnessTex, and normalTex.
  6. 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") 

Acknowledgements

OASIS builds upon code from unitree_sim_isaaclab and TWIST2, and uses Teleopit as its low-level controller.

Contact

Feel free to contact me at yuzh24@m.fudan.edu.cn if you encounter any problems.

About

OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation

Resources

Stars

63 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages