# 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()
```