---
# System prepended metadata

title: Isaac Sim Tutorial
tags: [Technical, School]

---

# Isaac Sim Tutorial


## 1. Workflow Overview
1. SolidWorks 匯出 URDF。
2. Isaac Sim 內用 URDF Importer 匯入機體。
3. 建立場景與地面 grid。
4. 加入單目 Camera。
5. 加入 IMU。
6. 用 Python 串 API 讀取 Camera/IMU。
7. 串接專案。

---

## 2. Prerequisites

### 2.1 安裝 Isaac Sim (Windows)

1. 下載 [Isaac Sim 5.1 Windows](https://download.isaacsim.omniverse.nvidia.com/isaac-sim-standalone-5.1.0-windows-x86_64.zip)
2. 解壓到 `C:\isaacsim`。
3. 執行 `post_install.bat` 和 `isaac-sim.bat`。

官方安裝指令：
```bash
mkdir C:\isaacsim
cd %USERPROFILE%/Downloads
tar -xvzf "isaac-sim-standalone-5.1.0-windows-x86_64.zip" -C C:\isaacsim
cd C:\isaacsim
post_install.bat
isaac-sim.bat
```

Reference: https://docs.isaacsim.omniverse.nvidia.com/6.0.0/installation/quick-install.html

---

## 3. SolidWorks -> URDF -> Isaac Sim

### 3.1 SolidWorks 端輸出 URDF

注意事項：
- link / joint 名稱只用英文、數字、底線，特殊字元會被換掉。
- mesh 檔案路徑可攜（建議相對路徑）。

### 3.2 在 Isaac Sim 匯入 URDF

1. 進 Isaac Sim 後，選上方選單 `File > Import`。
2. 選 `*.urdf` 的檔案。
3. 在 URDF Importer 面板調整 Import Options（Model、Links、Colliders 等）。
4. 可以看 `Output Log` 有沒有 warning/error。

### 3.3 URDF 匯入常用選項建議

- `Links`: 依無人機需求選 movable base。
- `Colliders`: 先用穩定配置 convex hull；若幾何複雜可考慮 convex decomposition。
- `Allow self-collision`: 官方建議除非確認不會自碰，否則先關閉。

Reference: 
- URDF Importer Extension
- https://docs.isaacsim.omniverse.nvidia.com/5.1.0/importer_exporter/ext_isaacsim_asset_importer_urdf.html

---

## 4. 建立模擬場景

### 4.1 建空場景 + Ground Plane + Grid

1. `File > New`
2. `Create > Physics > Ground Plane`

官方有提供 simple grid 環境資產，可以放進來：
`Create > Environments > Flat Grid` 或 `Create > Environments > Black Grid`

Reference:
- https://docs.isaacsim.omniverse.nvidia.com/5.1.0/introduction/quickstart_isaacsim.html
- https://docs.isaacsim.omniverse.nvidia.com/5.1.0/assets/usd_assets_environments.html#simple-grid

### 4.2 加 Camera

1. `Create > Camera`
2. 在 Stage 選到 Camera prim，調整位置與朝向。
3. 在 viewport 上方 video/camera 選單切換到該 Camera，確認影像輸出。

>[!Tip]
> `Tools > Sensors > Camera Inspector` 
> 可建立專屬 viewport、檢查覆蓋範圍與複製相機姿態。

可以 run python example 看看：
https://docs.isaacsim.omniverse.nvidia.com/5.1.0/sensors/isaacsim_sensors_camera.html#standalone-python

Reference:
https://docs.isaacsim.omniverse.nvidia.com/5.1.0/sensors/isaacsim_sensors_camera.html

### 4.3 加 IMU

1. 確認場景有 `Physics Scene`（沒有就 `Create > Physics > Physics Scene`）。
2. 在 Stage 選擇要掛載的機體 prim。
3. `Create > Sensors > Imu Sensor`。
4. 在屬性調整 `sensor period`、filter width 等。

注意事項：

- IMU 感測頻率不可超過 physics 頻率。
- 感測器應掛在 rigid body prim。
- 模擬執行中改 IMU 階層關係可能造成失效（例如改 rigid body parent），通常要停模擬再改。

可以看官方範例，包括 read output：
https://docs.isaacsim.omniverse.nvidia.com/5.1.0/sensors/isaacsim_sensors_physics_imu.html#standalone-python

Reference:
https://docs.isaacsim.omniverse.nvidia.com/5.1.0/sensors/isaacsim_sensors_physics_imu.html#imu-sensor

---

## 5. 用 Python 讀 Camera + IMU（Windows）
>[!Caution]
> ai 寫的，待驗證
### 5.1 執行方式

在 Isaac Sim 安裝根目錄執行：

```bat
python.bat your_script.py
```

### 5.2 最小讀值範例

```python
from isaacsim import SimulationApp
simulation_app = SimulationApp({"headless": False})

import numpy as np
from isaacsim.core.api import World
from isaacsim.sensors.camera import Camera
from isaacsim.sensors.physics import IMUSensor
import isaacsim.core.utils.numpy.rotations as rot_utils
import matplotlib.pyplot as plt

world = World(stage_units_in_meters=1.0)

cam = Camera(
    prim_path="/World/UAV/cam_down",
    frequency=30,
    resolution=(1280, 720),
    position=np.array([0.0, 0.0, 0.0]),
    orientation=rot_utils.euler_angles_to_quats(np.array([0, 90, 0]), degrees=True),
)
cam.initialize()

imu = IMUSensor(
    prim_path="/World/UAV/Imu",
    name="imu",
    frequency=100,
    translation=np.array([0.0, 0.0, 0.0]),
    orientation=np.array([1.0, 0.0, 0.0, 0.0]),
    linear_acceleration_filter_size=10,
    angular_velocity_filter_size=10,
    orientation_filter_size=10,
)

while simulation_app.is_running():
    world.step(render=True)

    rgba = cam.get_rgba()                # 影像
    # imgplot = plt.imshow(camera.get_rgba()[:, :, :3])
    # plt.show()
    imu_frame = imu.get_current_frame()  # IMU: lin_acc, ang_vel, orientation...

    # TODO: 呼叫你的 SPN pipeline
    # spn_out = spn_navigator.update(rgba[:, :, :3], imu_frame)

simulation_app.close()
```