NVIDIA Isaac Sim + OpenUSD:座舱数据合成完整技术栈

NVIDIA Isaac Sim + OpenUSD:座舱数据合成完整技术栈

技术路线:从 OpenUSD 场景构建到 Isaac Sim 物理仿真,再到 Cosmos 3 增强,打造端到端座舱数据生成流水线。

一、技术栈全景图

1.1 核心组件关系

graph TB
    subgraph Assets["资产层"]
        InteriorAgent[InteriorAgent<br/>座舱资产库]
        Metahuman[Metahuman<br/>数字人资产]
        SimReady[SimReady Assets<br/>物理资产]
    end
    
    subgraph Scene["场景构建层"]
        OpenUSD[OpenUSD<br/>场景描述]
        Composer[Omniverse Composer<br/>场景编辑器]
    end
    
    subgraph Simulation["仿真层"]
        IsaacSim[Isaac Sim<br/>物理仿真]
        Sensors[传感器仿真<br/>相机/雷达/ToF]
    end
    
    subgraph Enhancement["增强层"]
        Cosmos[Cosmos 3<br/>世界模型]
        PostProcess[后处理<br/>域随机化]
    end
    
    subgraph Output["输出层"]
        Dataset[训练数据集]
        Annotations[自动标注]
    end
    
    Assets --> OpenUSD
    OpenUSD --> IsaacSim
    IsaacSim --> Cosmos
    Cosmos --> Dataset
    
    IsaacSim --> Sensors
    Sensors --> Annotations

二、OpenUSD 基础:场景描述标准

2.1 OpenUSD 核心概念

概念 描述 示例
Layer 数据层,支持组合和覆盖 base_layer.usd + lighting_override.usd
Prim 场景图中的基本元素 /World/Driver/Head
Property Prim 的属性 xformOp:translate, material:color
Variant 变体,支持同一资产的不同版本 /Car/Wheel[Variant=’Winter’]
Reference 外部文件引用 引用座舱资产

2.2 座舱场景 OpenUSD 结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 座舱场景 USD 文件结构示例
cabin_scene.usd
├── /World
│ ├── /Cabin # 座舱环境
│ │ ├── /Dashboard # 仪表盘
│ │ ├── /SteeringWheel # 方向盘
│ │ ├── /Seats # 座椅(前排/后排)
│ │ ├── /Windows # 车窗
│ │ └── /Mirrors # 后视镜
│ ├── /Driver # 驾驶员
│ │ ├── /Body # 身体
│ │ ├── /Head # 头部
│ │ ├── /Face # 面部
│ │ └── /Hands # 手部
│ ├── /Passengers # 乘客(后排)
│ └── /Sensors # 传感器
│ ├── /DMS_Camera # DMS 相机
│ ├── /OMS_Camera # OMS 相机
│ └── /ToF_Sensor # ToF 深度相机

2.3 Python API 创建座舱场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
from pxr import Usd, UsdGeom, UsdLux, Gf, Sdf
import omni
from omni.isaac.core import World

class CabinSceneBuilder:
"""座舱场景构建器"""

def __init__(self, stage_path="/World/Cabin"):
self.stage = omni.usd.get_context().get_stage()
self.stage_path = stage_path

def create_cabin_base(self):
"""创建座舱基础结构"""
# 1. 创建根节点
cabin_prim = UsdGeom.Xform.Define(
self.stage, self.stage_path
)

# 2. 添加仪表盘
dashboard = UsdGeom.Mesh.Define(
self.stage, f"{self.stage_path}/Dashboard"
)
self._set_mesh_geometry(dashboard, self._dashboard_geometry())

# 3. 添加方向盘
steering = UsdGeom.Mesh.Define(
self.stage, f"{self.stage_path}/SteeringWheel"
)
self._set_mesh_geometry(steering, self._steering_geometry())

# 4. 添加座椅
for i, position in enumerate(["FrontLeft", "FrontRight", "RearLeft", "RearRight"]):
seat = UsdGeom.Mesh.Define(
self.stage, f"{self.stage_path}/Seats/{position}"
)
self._set_mesh_geometry(seat, self._seat_geometry())
self._set_transform(seat, self._seat_transform(position))

def add_dms_camera(self, position, orientation):
"""
添加 DMS 相机

Args:
position: (x, y, z) 相机位置
orientation: (roll, pitch, yaw) 相机姿态
"""
camera_prim = UsdGeom.Camera.Define(
self.stage, f"{self.stage_path}/../Sensors/DMS_Camera"
)

# 设置相机参数
camera_prim.CreateFocalLengthAttr(35.0) # 35mm 焦距
camera_prim.CreateHorizontalApertureAttr(36.0)
camera_prim.CreateVerticalApertureAttr(24.0)
camera_prim.CreateClippingRangeAttr((0.1, 100.0)) # 近/远裁剪

# 设置位置和姿态
xform = UsdGeom.Xformable(camera_prim)
xform_op = xform.AddTranslateOp()
xform_op.Set(Gf.Vec3d(*position))

rotate_op = xform.AddRotateXYZOp()
rotate_op.Set(Gf.Vec3d(*orientation))

def add_lighting(self):
"""添加座舱照明"""
# 自然光(车窗进入)
sun_light = UsdLux.DistantLight.Define(
self.stage, f"{self.stage_path}/../Lights/SunLight"
)
sun_light.CreateIntensityAttr(5000.0)
sun_light.CreateColorAttr(Gf.Vec3f(1.0, 0.95, 0.9)) # 略暖色温
sun_light.CreateAngleAttr(0.53) # 太阳角度

# 仪表盘背光
dash_light = UsdLux.RectLight.Define(
self.stage, f"{self.stage_path}/../Lights/DashboardLight"
)
dash_light.CreateIntensityAttr(500.0)
dash_light.CreateColorAttr(Gf.Vec3f(0.8, 0.9, 1.0)) # 冷色调
dash_light.CreateWidthAttr(0.5)
dash_light.CreateHeightAttr(0.1)

def _dashboard_geometry(self):
"""仪表盘几何数据"""
return {
'points': [...], # 顶点坐标
'faceVertexCounts': [...], # 面顶点数
'faceVertexIndices': [...] # 面顶点索引
}

def _set_mesh_geometry(self, mesh, geometry):
"""设置网格几何"""
mesh.CreatePointsAttr(geometry['points'])
mesh.CreateFaceVertexCountsAttr(geometry['faceVertexCounts'])
mesh.CreateFaceVertexIndicesAttr(geometry['faceVertexIndices'])


# 使用示例
if __name__ == "__main__":
builder = CabinSceneBuilder()
builder.create_cabin_base()

# 添加 DMS 相机(驾驶员左上方)
builder.add_dms_camera(
position=(0.3, -0.4, 0.5), # 相对于驾驶员头部
orientation=(0, -15, 10) # 俯仰-15度,偏航10度
)

builder.add_lighting()

三、InteriorAgent:开源座舱资产库

3.1 资产库特性

特性 描述
资产类型 座椅、仪表盘、方向盘、车窗、后视镜
格式 OpenUSD (.usd, .usda, .usdz)
材质 MDL (Material Definition Language)
物理属性 碰撞体、质量、摩擦系数
语义标注 语义ID、可交互性标记

3.2 从 Hugging Face 加载资产

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from huggingface_hub import snapshot_download
from pathlib import Path

def download_interior_agent():
"""下载 InteriorAgent 资产库"""
repo_id = "spatialverse/InteriorAgent"

# 下载到本地
local_dir = Path("./assets/InteriorAgent")
local_dir.mkdir(parents=True, exist_ok=True)

snapshot_download(
repo_id=repo_id,
repo_type="dataset",
local_dir=local_dir,
allow_patterns=["*.usd", "*.usda", "*.mdl"]
)

return local_dir


# 资产目录结构
assets/InteriorAgent/
├── Vehicles/
│ ├── Sedan/
│ │ ├── Cabin/
│ │ │ ├── Dashboard.usd
│ │ │ ├── Seats.usd
│ │ │ ├── SteeringWheel.usd
│ │ │ └── Windows.usd
│ │ └── Materials/
│ │ ├── Leather.mdl
│ │ ├── Plastic.mdl
│ │ └── Metal.mdl
│ └── SUV/
│ └── ...
├── Props/
│ ├── Phone.usd
│ ├── Bottle.usd
│ └── ChildSeat.usd
└── Humans/
├── Metahuman_Male_01/
└── Metahuman_Female_01/

3.3 引用资产到场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from pxr import Usd, UsdGeom, Gf

def add_interior_asset(stage, asset_path, prim_path, transform):
"""
添加 InteriorAgent 资产到场景

Args:
stage: USD Stage
asset_path: 资产文件路径(.usd)
prim_path: 场景中的 Prim 路径
transform: 位置/旋转/缩放
"""
# 创建引用
prim = stage.DefinePrim(prim_path, "Xform")

# 添加外部引用
references = prim.GetReferences()
references.AddReference(asset_path)

# 设置变换
xform = UsdGeom.Xformable(prim)

# 平移
translate_op = xform.AddTranslateOp()
translate_op.Set(Gf.Vec3d(*transform['translate']))

# 旋转(欧拉角)
rotate_op = xform.AddRotateXYZOp()
rotate_op.Set(Gf.Vec3d(*transform['rotate']))

# 缩放
scale_op = xform.AddScaleOp()
scale_op.Set(Gf.Vec3d(*transform['scale']))

return prim


# 使用示例
stage = omni.usd.get_context().get_stage()

# 添加座椅
add_interior_asset(
stage,
asset_path="./assets/InteriorAgent/Vehicles/Sedan/Cabin/Seats.usd",
prim_path="/World/Cabin/Seats/FrontLeft",
transform={
'translate': (0.5, -0.3, 0.0),
'rotate': (0, 0, 0),
'scale': (1.0, 1.0, 1.0)
}
)

四、Isaac Sim 物理仿真

4.1 Isaac Sim 核心能力

能力 描述 IMS 应用
刚体动力学 物理碰撞、重力、摩擦 安全带约束仿真
柔体仿真 织物、软体变形 座椅形变、安全带拉伸
人物仿真 Metahuman 骨骼驱动 驾驶员姿态变化
传感器仿真 相机、雷达、IMU DMS/OMS 相机仿真
域随机化 光照、纹理、姿态随机 数据增强

4.2 驾驶员骨骼动画控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
from omni.isaac.core.articulations import Articulation
from omni.isaac.core.utils.stage import add_reference_to_stage
import numpy as np

class DriverController:
"""驾驶员动画控制器"""

def __init__(self, metahuman_path):
"""
Args:
metahuman_path: Metahuman 资产路径
"""
# 加载 Metahuman
add_reference_to_stage(metahuman_path, "/World/Driver")

# 创建 Articulation(骨骼系统)
self.driver = Articulation(prim_path="/World/Driver")

# 定义关键关节
self.joints = {
'head': 'Head',
'neck': 'Neck',
'spine': 'Spine',
'left_shoulder': 'LeftArm/LeftShoulder',
'right_shoulder': 'RightArm/RightShoulder',
'left_elbow': 'LeftArm/LeftForeArm/LeftElbow',
'right_elbow': 'RightArm/RightForeArm/RightElbow'
}

def apply_fatigue_pose(self, intensity):
"""
应用疲劳姿态

Args:
intensity: 疲劳强度 (0.0-1.0)
"""
# 头部下垂(俯仰角)
head_pitch = -30.0 * intensity # 最大下俯30度
self.driver.set_joint_positions(
positions=np.array([head_pitch]),
joint_indices=[self.joints['head']]
)

# 颈部前倾
neck_pitch = -15.0 * intensity
self.driver.set_joint_positions(
positions=np.array([neck_pitch]),
joint_indices=[self.joints['neck']]
)

# 脊柱弯曲
spine_pitch = -10.0 * intensity
self.driver.set_joint_positions(
positions=np.array([spine_pitch]),
joint_indices=[self.joints['spine']]
)

def apply_distraction_pose(self, distraction_type):
"""
应用分心姿态

Args:
distraction_type: 'phone_left' | 'phone_right' | 'radio' | 'rear'
"""
poses = {
'phone_left': {
'left_shoulder': (-20, -60, -30), # 抬臂看左手手机
'left_elbow': (-90, 0, 0),
'head': (0, 20, -40) # 头部左转
},
'phone_right': {
'right_shoulder': (-20, 60, 30),
'right_elbow': (-90, 0, 0),
'head': (0, 20, 40)
},
'radio': {
'right_shoulder': (0, 45, 0),
'right_elbow': (-45, 0, 0),
'head': (0, -30, 20)
},
'rear': {
'spine': (0, 45, 0),
'head': (0, 60, 0)
}
}

pose = poses.get(distraction_type, {})
for joint_name, rotation in pose.items():
self.driver.set_joint_positions(
positions=np.array(rotation),
joint_indices=[self.joints[joint_name]]
)

4.3 传感器仿真配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
from omni.isaac.sensor import Camera, CameraInfo
import omni.replicator.core as rep

class DMSCameraSimulator:
"""DMS 相机仿真"""

def __init__(self, camera_path="/World/Sensors/DMS_Camera"):
self.camera_path = camera_path
self.camera = None

def setup_camera(self, resolution=(1920, 1080), fps=30):
"""
配置 DMS 相机

Args:
resolution: (width, height)
fps: 帧率
"""
# 创建相机
self.camera = Camera(
prim_path=self.camera_path,
position=np.array([0.3, -0.4, 0.5]),
frequency=fps,
resolution=resolution,
orientation=np.array([0, -15, 10])
)

# 设置相机参数
self.camera.set_focal_length(35.0)
self.camera.set_focus_distance(1.0)
self.camera.set_clipping_range(0.1, 10.0)

# 初始化
self.camera.initialize()

def add_image_type(self, image_type):
"""
添加图像类型输出

Args:
image_type: 'rgb' | 'depth' | 'instance' | 'semantic'
"""
if image_type == 'rgb':
rep.create.render_product(self.camera_path, resolution=self.camera.resolution)
elif image_type == 'depth':
rep.create.render_product(
self.camera_path,
resolution=self.camera.resolution,
output_type='distance_to_camera'
)
elif image_type == 'semantic':
rep.create.render_product(
self.camera_path,
resolution=self.camera.resolution,
output_type='semantic_segmentation'
)

def domain_randomization(self):
"""域随机化配置"""
# 光照随机化
rep.randomizer.lighting(
light_count=2,
intensity_range=(500, 2000),
color_temperature_range=(3000, 7000)
)

# 背景纹理随机化
rep.randomizer.texture(
textures=[
"./assets/textures/leather_brown.png",
"./assets/textures/leather_black.png",
"./assets/textures/fabric_gray.png"
]
)

# 姿态随机化
rep.randomizer.pose(
subject="/World/Driver",
translation_min=(-0.05, -0.05, -0.05),
translation_max=(0.05, 0.05, 0.05),
rotation_min=(-5, -5, -5),
rotation_max=(5, 5, 5)
)


# 使用示例
simulator = DMSCameraSimulator()
simulator.setup_camera(resolution=(1920, 1080), fps=30)
simulator.add_image_type('rgb')
simulator.add_image_type('depth')
simulator.domain_randomization()

五、数据生成 Pipeline

5.1 批量数据生成脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from omni.isaac.core import World
from omni.isaac.core.utils.stage import add_reference_to_stage
import omni.replicator.core as rep
import numpy as np
from pathlib import Path

class CabinDataPipeline:
"""座舱数据生成流水线"""

def __init__(self, output_dir="./generated_data"):
self.output_dir = Path(output_dir)
self.output_dir.mkdir(parents=True, exist_ok=True)

# 初始化仿真世界
self.world = World(stage_units_in_meters=1.0)

# 初始化控制器
self.scene_builder = CabinSceneBuilder()
self.driver_controller = None
self.camera_simulator = None

def setup_scene(self):
"""设置场景"""
# 加载座舱资产
self.scene_builder.create_cabin_base()
self.scene_builder.add_dms_camera(
position=(0.3, -0.4, 0.5),
orientation=(0, -15, 10)
)
self.scene_builder.add_lighting()

# 加载 Metahuman
metahuman_path = "./assets/InteriorAgent/Humans/Metahuman_Male_01.usd"
add_reference_to_stage(metahuman_path, "/World/Driver")
self.driver_controller = DriverController(metahuman_path)

# 设置相机
self.camera_simulator = DMSCameraSimulator()
self.camera_simulator.setup_camera()

def generate_fatigue_scenarios(self, num_samples=1000):
"""
生成疲劳场景数据

Args:
num_samples: 样本数量
"""
fatigue_levels = np.linspace(0.0, 1.0, num_samples)

for i, intensity in enumerate(fatigue_levels):
# 应用疲劳姿态
self.driver_controller.apply_fatigue_pose(intensity)

# 仿真一步
self.world.step(render=True)

# 保存数据
self._save_frame(i, {
'fatigue_intensity': intensity,
'scenario': 'fatigue'
})

def generate_distraction_scenarios(self, num_samples_per_type=200):
"""
生成分心场景数据

Args:
num_samples_per_type: 每种类型样本数
"""
distraction_types = ['phone_left', 'phone_right', 'radio', 'rear']

for dtype in distraction_types:
for i in range(num_samples_per_type):
# 应用分心姿态
self.driver_controller.apply_distraction_pose(dtype)

# 仿真一步
self.world.step(render=True)

# 保存数据
self._save_frame(
i + len(distraction_types) * num_samples_per_type,
{
'distraction_type': dtype,
'scenario': 'distraction'
}
)

def _save_frame(self, frame_id, metadata):
"""保存单帧数据"""
# 获取渲染结果
rgb_data = self.camera_simulator.camera.get_rgb()
depth_data = self.camera_simulator.camera.get_depth()

# 保存图像
rgb_path = self.output_dir / f"rgb_{frame_id:05d}.png"
depth_path = self.output_dir / f"depth_{frame_id:05d}.npy"

import cv2
cv2.imwrite(str(rgb_path), rgb_data)
np.save(depth_path, depth_data)

# 保存元数据
import json
meta_path = self.output_dir / f"meta_{frame_id:05d}.json"
with open(meta_path, 'w') as f:
json.dump(metadata, f, indent=2)

def run(self):
"""运行完整流水线"""
self.setup_scene()

print("生成疲劳场景数据...")
self.generate_fatigue_scenarios(num_samples=1000)

print("生成分心场景数据...")
self.generate_distraction_scenarios(num_samples_per_type=200)

print(f"数据生成完成!保存至: {self.output_dir}")


# 主程序
if __name__ == "__main__":
pipeline = CabinDataPipeline(output_dir="./cabin_dataset")
pipeline.run()

5.2 自动标注生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
def generate_annotations(self, frame_id):
"""
生成自动标注

Returns:
dict: 包含所有标注信息
"""
# 1. 获取驾驶员姿态
joint_positions = self.driver_controller.driver.get_joint_positions()

# 2. 获取头部姿态
head_pose = self.driver_controller.driver.get_world_pose(
prim_path="/World/Driver/Head"
)

# 3. 获取眼球视线(从 Metahuman 骨骼计算)
left_eye_pose = self.driver_controller.driver.get_world_pose(
prim_path="/World/Driver/Head/LeftEye"
)
right_eye_pose = self.driver_controller.driver.get_world_pose(
prim_path="/World/Driver/Head/RightEye"
)

# 4. 计算视线向量
gaze_vector = self._calculate_gaze_vector(left_eye_pose, right_eye_pose)

# 5. 获取手部位置
left_hand_pose = self.driver_controller.driver.get_world_pose(
prim_path="/World/Driver/LeftArm/LeftHand"
)
right_hand_pose = self.driver_controller.driver.get_world_pose(
prim_path="/World/Driver/RightArm/RightHand"
)

return {
'frame_id': frame_id,
'joint_positions': joint_positions.tolist(),
'head_pose': {
'position': head_pose[:3].tolist(),
'orientation': head_pose[3:].tolist()
},
'gaze_vector': gaze_vector.tolist(),
'left_hand_position': left_hand_pose[:3].tolist(),
'right_hand_position': right_hand_pose[:3].tolist()
}

六、与 Cosmos 3 协同

6.1 Isaac Sim → Cosmos 3 流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from diffusers import Cosmos3OmniPipeline

class IsaacCosmosPipeline:
"""Isaac Sim + Cosmos 3 协同流水线"""

def __init__(self):
# 加载 Cosmos 3 模型
self.cosmos = Cosmos3OmniPipeline.from_pretrained(
"nvidia/Cosmos3-Nano",
torch_dtype=torch.bfloat16,
device_map="cuda"
)

def enhance_isaac_output(self, isaac_frame, enhancement_type='detail'):
"""
用 Cosmos 3 增强 Isaac Sim 输出

Args:
isaac_frame: Isaac Sim 渲染帧
enhancement_type: 'detail' | 'realism' | 'variation'
"""
if enhancement_type == 'detail':
# 增强细节(如皮肤纹理、眼镜反光)
prompt = """
Enhance the fine details of the driver's face in this image.
Add realistic skin texture, subtle facial hair, and natural lighting.
Preserve the overall pose and expression.
"""

result = self.cosmos(
prompt=prompt,
image=isaac_frame,
num_frames=1,
strength=0.3 # 保留70%原始内容
)

elif enhancement_type == 'variation':
# 生成变体(不同光照、背景)
prompt = """
Generate variations of this cabin scene with different lighting conditions:
morning light, afternoon sun, night with dashboard glow.
Keep the driver's pose unchanged.
"""

result = self.cosmos(
prompt=prompt,
image=isaac_frame,
num_frames=10, # 生成10帧变体
strength=0.5
)

return result

七、性能优化

7.1 GPU 加速设置

1
2
3
4
5
6
7
8
9
10
# 启用 GPU 渲染加速
import omni.kit.settings

settings = omni.kit.settings.get_settings()
settings.set("/app/renderer/enabled", "rtx") # RTX 渲染器
settings.set("/app/renderer/active_gpu", 0) # 使用GPU 0
settings.set("/app/renderer/samplesPerPixel", 4) # 采样数

# 启用 Iray 交互式渲染
settings.set("/app/renderer/hybrid/enabled", True)

7.2 批量渲染配置

1
2
3
4
5
6
7
8
9
# 配置批量渲染
import omni.replicator.core as rep

rep.settings.set_carb_settings({
"/app/renderer/samplesPerPixel": 4,
"/app/renderer/hybrid/enabled": True,
"/omni/replicator/asyncRendering": True,
"/omni/replicator/asyncRenderingLowResScale": 0.5
})

八、总结

8.1 技术栈价值

组件 价值
OpenUSD 统一场景描述,支持协作和版本管理
InteriorAgent 开源座舱资产,降低场景构建成本
Isaac Sim 物理仿真,自动标注,数据一致性
Cosmos 3 真实感增强,长尾场景扩展

8.2 IMS/DMS 落地建议

  1. 采用 InteriorAgent 快速搭建座舱场景
  2. 使用 Metahuman 创建多样化驾驶员
  3. 利用 Isaac Sim 自动标注降低成本
  4. 结合 Cosmos 3 增强真实感和多样性

参考文献

  1. NVIDIA. Isaac Sim Documentation. https://docs.isaacsim.omniverse.nvidia.com/
  2. NVIDIA. OpenUSD Fundamentals. https://docs.isaacsim.omniverse.nvidia.com/5.0.0/omniverse_usd/open_usd.html
  3. Hugging Face. InteriorAgent Dataset. https://huggingface.co/datasets/spatialverse/InteriorAgent

发布时间:2026-08-01
关键词:Isaac Sim、OpenUSD、InteriorAgent、数据合成、物理仿真、DMS、OMS
技术栈:NVIDIA Omniverse + Isaac Sim 4.5 + Cosmos 3


NVIDIA Isaac Sim + OpenUSD:座舱数据合成完整技术栈
https://dapalm.com/2026/08/01/2026-08-01-isaac-sim-openusd-cabin-synthetic-data-pipeline/
作者
Mars
发布于
2026年8月1日
许可协议