1. 创建基础仿真环境
任务说明
本案例目标是在 Isaac Sim 中创建一个可供后续强化学习训练使用的基础仿真环境:包含地面、一个简单障碍物,并完成物理引擎参数设置。最终通过 Python 脚本方式启动仿真,验证场景加载成功且物理模拟正常推进。
环境依赖
- Isaac Sim 2023.1.0 或更新版本(基于 Omniverse Kit)
- Python 3.10(Isaac Sim 内置环境)
- 无需额外 pip 包,使用 Isaac Sim 自带 API
实现代码
创建文件 create_basic_env.py,内容如下:
"""创建基础仿真环境:地面 + 障碍物 + 物理参数设置"""
from isaacsim import SimulationApp
# 启动仿真应用(必须在导入其他 Isaac Sim 模块之前)
sim_app = SimulationApp({"headless": False})
from omni.isaac.core import World
from omni.isaac.core.utils.stage import add_reference_to_stage
from omni.isaac.core.prims import RigidPrim
from omni.isaac.core.utils.prims import create_prim
from pxr import UsdPhysics, UsdLux, Gf, Sdf
# 创建 World 实例(自动加载默认 stage)
world = World(stage_units_in_meters=1.0)
stage = world.stage
# 设置物理引擎参数
physics_scene = UsdPhysics.Scene.Define(stage, Sdf.Path("/World/physicsScene"))
physics_scene.CreateGravityDirectionAttr().Set(Gf.Vec3f(0.0, 0.0, -1.0))
physics_scene.CreateGravityMagnitudeAttr().Set(9.81)
physics_scene.CreateEnableCCDAttr(True) # 启用连续碰撞检测
# 添加地面(使用默认立方体拉伸为薄板)
ground_prim = create_prim(
"/World/Ground",
prim_type="Cube",
position=[0, 0, -0.05],
scale=[100, 100, 0.1],
semantic_label="ground"
)
# 添加碰撞体
from omni.isaac.core.utils.collision import add_collision_to_prim
add_collision_to_prim(ground_prim)
# 添加简单障碍物(立方体)
obstacle_prim = create_prim(
"/World/Obstacle",
prim_type="Cube",
position=[2.0, 0.0, 0.5],
scale=[0.5, 0.5, 1.0],
semantic_label="obstacle"
)
add_collision_to_prim(obstacle_prim)
# 添加光源(便于可视化)
light_prim = UsdLux.DistantLight.Define(stage, Sdf.Path("/World/DistantLight"))
light_prim.CreateIntensityAttr(500.0)
# 重置世界以应用物理参数
world.reset()
# 物理模拟步进验证
for _ in range(10):
world.step(render=True)
# 输出验证信息
print("=== 环境创建完成 ===")
print(f"物理引擎: 重力 = {physics_scene.GetGravityMagnitudeAttr().Get()} m/s^2")
print(f"方向 = {physics_scene.GetGravityDirectionAttr().Get()}")
print(f"CCD 启用: {physics_scene.GetEnableCCDAttr().Get()}")
print("地面和障碍物已添加,物理模拟正常推进。")
# 保持窗口打开(headless=False 时)
if not sim_app.is_headless():
import time
time.sleep(3) # 让用户观察场景
sim_app.close()
运行方式
# 在 Isaac Sim 的 Python 环境中运行
./python.sh create_basic_env.py
# 或使用 isaac-sim 的 conda 环境
conda activate isaac-sim
python create_basic_env.py
验证方法
- 可视化验证:运行后应看到 3D 视口显示一个大型灰色地面(薄板)和一个位于 (2,0,0.5) 处的立方体障碍物,场景有光照。
- 控制台输出:终端应打印重力数值为 9.81,方向为 (0,0,-1),CCD 状态为 True。
- 物理推进验证:脚本执行 10 次物理步进无报错,说明物理引擎正常初始化。
常见问题
- 窗口不显示:确认
headless参数为 False,且运行环境有图形界面。 - 碰撞不生效:检查是否调用了
add_collision_to_prim,地面和障碍物都需要碰撞体。 - 重力方向错误:Isaac Sim 使用 Z 轴向上,重力方向应为 (0,0,-1)。
本案例完成了一个最小可用的仿真环境搭建,后续案例可在此基础之上添加机器人模型和强化学习接口。