3. 基础场景搭建:Stage与Prim概念、添加地面与基础几何体、坐标系与变换操作、保存与加载USD场景

好,我们正式开始动手搭建场景了。这一章是整个课程的地基,说白了就是学会在Isaac Sim里「造东西」。你想想看,后面所有的运动规划、路径仿真,都得跑在一个具体的场景里。场景都搭不起来,后面全是空谈。

我个人习惯,每接触一个新仿真平台,第一件事就是搞清楚它的场景组织方式。Isaac Sim用的是USD(Universal Scene Description)这套东西,核心就两个概念:Stage和Prim。搞懂这俩,你就掌握了场景的骨架。

3.1 Stage与Prim:场景的「舞台」与「演员」

Stage,你可以把它理解成一个巨大的虚拟舞台。所有东西——地面、墙壁、机器人、传感器、灯光——都摆在这个舞台上。每个放在舞台上的东西,就是一个Prim。

Prim是USD里最基本的元素。一个Prim可以是一个立方体、一个球体、一个网格模型,甚至是一个空的变换节点。Prim之间可以嵌套,形成层级结构。比如一个机器人模型,它本身是一个Prim,它的关节、连杆、传感器,都是它的子Prim。

我在项目中遇到过一个问题:同事把几十个零件直接平铺在Stage根目录下,没有做任何层级分组。结果场景一复杂,找东西全靠翻,效率极低。所以从一开始,就要养成好习惯——用层级来组织你的场景。

核心要点:
  • Stage:整个场景的根容器,一个USD文件对应一个Stage。
  • Prim:Stage上的每一个独立对象,可以是几何体、灯光、相机、关节等。
  • 层级关系:Prim可以包含子Prim,形成树状结构,便于管理和变换传递。

下面这张图,帮你快速理解Stage和Prim的关系:

Stage与Prim层级结构示意图 Stage (Root) GroundPlane Robot BaseLink Joint Sensor Obstacles Box Cylinder Sphere 图例: Stage根节点 地面 机器人 子部件 障碍物

3.2 添加地面与基础几何体

理论讲完了,咱们直接上手。打开Isaac Sim,创建一个空Stage。第一步,加个地面。没有地面,你放个机器人上去,它就直接掉到虚空里了。

添加地面有两种方式:

  • 通过菜单:Create -> Physics -> Ground Plane。这是最直接的方法,它会自动添加一个无限大的地面,并且带物理属性。
  • 通过代码:用Python API创建。后面做自动化场景生成时会用到。

然后,加几个基础几何体。Create -> Mesh -> 选择 Cube、Sphere、Cylinder。这些是搭建障碍物、工作台、参考物的基本积木。

我的小技巧: 添加几何体后,立刻在Stage窗口中给它重命名。别用默认的「Cube_01」、「Sphere_02」这种名字。改成「Obstacle_Box_01」、「Table_Top」这种有意义的名称。场景一复杂,你就知道这个习惯有多救命了。

3.3 坐标系与变换操作

物体放上去了,怎么摆到想要的位置?这就涉及到坐标系和变换了。

Isaac Sim里,每个Prim都有自己的局部坐标系。你可以通过修改它的Transform属性(位置、旋转、缩放)来移动它。

变换操作有三种方式:

操作方式 工具/位置 适用场景
视图区直接拖拽 工具栏的移动/旋转/缩放工具 快速手动摆放,视觉直观
属性面板精确输入 选中Prim -> Property面板 -> Transform 需要精确数值,比如对齐到网格
Python API控制 通过GetAttribute和SetAttribute操作 批量处理或动态调整

这里有个坑,我曾经踩过。视图区拖拽时,默认是世界坐标系。但如果你选中了某个子Prim,它的局部坐标系可能和世界坐标系方向不同。拖拽时一定要看清楚视图区右上角的坐标轴指示器,确认当前是「World」还是「Local」模式。

注意: 旋转操作使用欧拉角(Roll, Pitch, Yaw),顺序是XYZ。不同软件对欧拉角的定义可能不同,从其他软件导入模型时,一定要检查旋转值是否对得上。我遇到过从Blender导出的模型,旋转值全乱套的情况。

3.4 保存与加载USD场景

场景搭好了,不保存等于白干。Isaac Sim的默认保存格式就是.usd。

保存操作很简单:File -> Save As,选择路径,起个名字。但我建议你养成几个好习惯:

  • 分层保存:把地面、静态障碍物、机器人模型分别保存成独立的USD文件。然后用Reference或Payload的方式引用到主场景里。这样修改某个部分时,不用动整个场景。
  • 使用相对路径:保存时,如果引用了外部模型(比如机器人URDF转出来的USD),尽量用相对路径。否则换台电脑,路径一断,场景就加载不出来了。
  • 定期另存为:我习惯每完成一个关键步骤,就另存为一个新版本。比如scene_v01.usd、scene_v02.usd。万一改坏了,还能回退。

加载场景更简单:File -> Open,选择你的.usd文件。或者直接把文件拖拽到Isaac Sim的视图区。

保存与加载的黄金法则:
  1. 场景文件路径中不要有中文和空格。
  2. 所有引用的资源(纹理、模型、USD子文件)都放在同一个项目目录下。
  3. 加载后如果发现物体位置不对,先检查Transform属性,再检查Reference路径是否有效。

嗯,这一章的内容就这些。看起来都是基础操作,但万丈高楼平地起。你花10分钟把场景组织得井井有条,后面做运动规划时就能省下几个小时。别嫌麻烦,动手练一遍,比看十遍都管用。