A custom Isaac Sim extension that adds STMicroelectronics IMU sensor models directly into the Create → Sensors menu. Spawns a physics-driven, noise-augmented IMU prim with a visible viewport marker.
Supported sensor models:
- ASM330LHH
- LSM6DSV
- ✅ Native Isaac Sim menu integration — no scripting required to place sensors
- ✅ Auto-attaches to whichever prim is selected in the Stage panel
- ✅ Visible dark navy cube marker in the viewport
- ✅ Physics-step driven runtime ticks each IMU at its configured ODR, independent of render rate
- ✅ Realistic noise model
- ✅ Verified against clean Isaac IMU output via included verification scripts
- Ubuntu 22.04 (tested)
- Isaac Sim Full 6.0.0 with Python 3.12 — Installation Guide
- The compiled C++ noise engine:
- Bundled for Isaac Sim 6.0.0 / Python 3.12:
sim2real_native_v0_1.cpython-312-x86_64-linux-gnu.so - Native binaries are platform-specific and must match the Python runtime and target Linux distribution.
- Ubuntu 22.04 builds must not require a glibc version newer than the OS-provided glibc 2.35.
- Bundled for Isaac Sim 6.0.0 / Python 3.12:
Version 2.x targets Isaac Sim 6.0.0 only. Older Isaac Sim releases are outside the production support scope.
st-mems-isaac-sim2real/
config/
extension.toml # Extension metadata and dependencies
data/
models/
ASM330LHH.json # ASM330LHH noise profile and hardware config
LSM6DSV.json # LSM6DSV noise profile and hardware config
sim2real/
imu/
sensor/
__init__.py
extension.py # Menu registration, prim spawning
config.py # JSON config loader
runtime.py # Physics-step subscription + ODR scheduler
noise/
__init__.py
native_backend.py # C++ pybind wrapper
imgs/ # Screenshots for this README
sim_binary/
sim2real_native_v0_1.cpython-312-x86_64-linux-gnu.so
verification_script.py # Trajectory logging script
plot_verification.py # Plot generator
README.md
git clone <https://github.com/STMicroelectronics/st-mems-isaac-sim2real>
cd st-mems-isaac-sim2realCopy the repo contents into your Isaac Sim extensions directory:
cp -r . /path/to/isaac-sim/exts/sim2real.imu.sensor/The destination folder must be registered as an extension search path in Isaac Sim. To check or add paths: Window → Extensions → ⚙️ (gear icon) → Extension Search Paths
The extension auto-discovers the bundled Python 3.12 native backend from sim_binary/. Set SIM2REAL_NATIVE_PATH only when you need to override the bundled backend with another Isaac Sim 6.0.0-compatible build:
export SIM2REAL_NATIVE_PATH="/path/to/custom/native/backend"- Launch Isaac Sim
- Go to Window → Extensions
- Search for
sim2real - Toggle Sim2Real IMU Sensor on
- Check the console for:
[Sim2Real IMU] Native C++ backend loaded successfully.
[Sim2Real Runtime] Physics step subscription active.
- (Optional) Check AUTOLOAD to enable automatically on every launch.
- Load a robot into your scene
- In the Stage panel, click the link you want to attach the sensor to (e.g.
panda_hand) - From the top menu:
Create → Sensors → STMicroelectronics IMU → ASM330LHH
- The sensor appears as a child prim of your selected link with a navy cube visible in the viewport
- Select the IMU prim and inspect Properties to confirm the config was applied
- Press Play — the noise engine ticks automatically at the sensor's configured ODR
Each model's noise profile lives in data/models/<model>.json. Edit these files to tune the sensor — no code changes required.
{
"model_id": "ASM330LHH",
"accel_fs_g": 8.0,
"gyro_fs_dps": 2000.0,
"odr_hz": 104.0,
"vibration": true
}| Parameter | Description |
|---|---|
accel_fs_g |
Accelerometer full-scale range (g) |
gyro_fs_dps |
Gyroscope full-scale range (deg/s) |
odr_hz |
Output data rate (Hz) |
vibration |
Enable structural vibration model |
Config changes take effect the next time you place a sensor. Delete and re-place the prim to apply new values. All internal noise parameters (bias drift, white noise, quantization) are fixed in the C++ engine and not user-configurable.
- Create
data/models/<NewModel>.jsonwith the hardware specs - Add one entry to the submenu in
extension.py:
MenuItemDescription(
name="NewModel",
onclick_fn=lambda: self._spawn_sensor("NewModel"),
),- Toggle the extension off and on
Included scripts let you validate the noise pipeline against clean Isaac IMU output.
- Load a stage with a Franka robot
- Select
panda_handin the Stage panel and place an ASM330LHH sensor via the menu - Open Window → Script Editor
- Paste and run
verification_script.py - Press Play — 5 trajectories log automatically to
~/Documents/trajectories_verification/
python3 plot_verification.pyEach traj_N/ folder gets a verification_plot.png showing clean vs noisy IMU output across all 6 axes:
The noisy trace (red) should follow the clean motion profile (black dashed) with visible noise and bias drift on top.
Extension not found in manager
find /path/to/exts/sim2real.imu.sensor -type fConfirm all files are present including noise/__init__.py.
C++ backend fails to load
- If you set
SIM2REAL_NATIVE_PATH, verify it points to the folder containing a compatiblesim2real_native_v0_1*.so - Confirm the
.somatches Python 3.12 and the Isaac Sim 6.0.0 runtime - If the error mentions
GLIBC_x.y not found, do not manually upgrade system glibc. Use a backend rebuilt on the target OS/version instead.
Menu shows but cube is not visible in viewport
- Toggle the extension off and on
- Check the console for Python errors
- Run this in the Script Editor to confirm the prim exists:
import omni.usd
stage = omni.usd.get_context().get_stage()
prim = stage.GetPrimAtPath("/World/franka/panda_hand/ASM330LHH/visual")
print("Visual prim exists:", prim.IsValid())Noise profile looks too clean or too aggressive
- Edit
data/models/ASM330LHH.jsondirectly - Delete and re-place the sensor prim to pick up the new values
- Rerun
verification_script.pyandplot_verification.pyto verify
| Component | Version |
|---|---|
| Isaac Sim | 6.0.0 |
| Ubuntu | 22.04 |
| Python | 3.12 |
| GPU | NVIDIA GeForce RTX 3060 |





