4. AGV小车模型导入
在Isaac Sim中开展AGV小车仿真项目,第一步便是将外部三维建模工具(如SolidWorks、Blender、Fusion 360)中设计好的小车模型导入到仿真环境中。这一环节看似基础,却直接决定了后续物理属性配置、传感器仿真以及运动控制逻辑的准确性。如果模型导入不当,轻则出现贴图丢失、部件错位,重则导致碰撞检测失效或关节驱动异常。本章将系统讲解Isaac Sim支持的模型格式、标准导入流程、模型完整性检查方法以及坐标系对齐策略,帮助您建立一套可复用的模型导入规范。
上图展示了AGV模型导入的四个核心阶段及其关键检查点。在实际项目中,这四步并非线性走完即可,而是需要反复迭代——例如在坐标系调整时发现模型单位错误,就必须返回第一步重新导出。下面我们将逐一深入每个环节。
4.1 支持格式与选型建议
Isaac Sim基于NVIDIA Omniverse平台构建,其原生格式为USD(Universal Scene Description)。USD并非一种简单的三维文件格式,而是一个支持复杂场景层级、多图层覆盖、延迟加载的通用场景描述框架。理解这一点是掌握Isaac Sim模型导入的关键。
在实际项目中,我们通常不会直接使用USD作为建模工具的原始格式,而是通过中间格式转换。下表列出了Isaac Sim支持的主要导入格式及其适用场景:
| 格式 | 扩展名 | 适用场景 | 注意事项 |
|---|---|---|---|
| USD / USDA / USDC | .usd / .usda / .usdc | 原生格式,跨软件协作,复杂场景 | 推荐使用,支持所有Isaac Sim特性 |
| URDF | .urdf | ROS生态,机器人描述标准 | 需配合Xacro或mesh文件,导入后自动生成关节 |
| STL | .stl | 纯几何模型,3D打印或简单部件 | 无材质、无层级,需手动组装 |
| OBJ | .obj | 带材质的静态模型 | 支持顶点颜色和纹理,但无物理属性 |
| FBX | .fbx | 动画模型,游戏资产 | 需注意骨骼和动画是否保留 |
| glTF / GLB | .gltf / .glb | Web端资产,PBR材质 | 支持物理渲染材质,但需检查单位 |
对于AGV小车项目,我们强烈建议采用以下工作流:在SolidWorks或Fusion 360中完成机械设计后,导出为URDF(通过SW2URDF插件)或直接导出为USD。如果团队使用ROS,URDF是天然的选择,因为Isaac Sim内置了URDF导入器,能够自动将link和joint转换为USD的Prim层级和关节组件。如果追求最高保真度,则直接使用USD格式,但需要建模工具支持USD导出(如Blender 3.0+、Maya、Houdini)。
4.2 标准导入流程详解
无论使用哪种格式,Isaac Sim的导入流程都遵循“创建新场景 → 导入资产 → 检查层级 → 保存为USD”的基本路径。下面以最常见的URDF导入为例,给出完整操作步骤。
- 准备URDF文件:确保URDF及其引用的mesh文件(通常是STL或DAE)位于同一目录下,且路径为相对路径。在文本编辑器中打开URDF,检查
<link>和<joint>定义是否完整。 - 启动Isaac Sim:打开Isaac Sim,选择“New”创建一个空场景。建议使用“Standalone”模式以便后续脚本化操作。
- 导入URDF:点击菜单栏
File → Import → URDF,在弹出的文件浏览器中选择目标URDF文件。此时会弹出URDF导入选项面板,关键设置包括:- Fix Base Link:如果AGV的base_link需要固定在空间中(如测试台架),勾选此项;如果小车需要自由移动,则不勾选。
- Make Default Prim:建议勾选,将导入的模型设为场景默认Prim,方便后续添加组件。
- Distance Scale:通常保持1.0,但若URDF中的单位是厘米,需设置为0.01。
- 执行导入:点击“Import”后,Isaac Sim会解析URDF并生成对应的USD层级。在Stage面板中可以看到以机器人名称命名的Root Prim,其下包含各个link的Prim,以及关节对应的Joint组件。
- 保存场景:导入完成后,立即执行
File → Save As,将场景保存为USD文件。这一步非常重要,因为后续所有修改(材质、物理属性、传感器)都应基于这个USD文件进行,而不是每次重新导入URDF。
对于STL或OBJ格式,导入流程更简单:直接拖拽文件到Viewport窗口,或使用 File → Import 选择文件。但这类格式没有层级和关节信息,导入后只是一个静态网格,需要手动创建关节和物理约束。
# 使用Python脚本导入URDF(自动化批处理场景)
from omni.isaac.urdf import _urdf
from omni.isaac.core.utils.stage import add_reference_to_stage
urdf_path = "/path/to/your/agv.urdf"
usd_path = "/path/to/output/agv.usd"
# 方式一:通过扩展接口导入
urdf_interface = _urdf.acquire_urdf_interface()
urdf_interface.import_urdf(urdf_path, usd_path)
# 方式二:将URDF作为引用添加到当前Stage
add_reference_to_stage(usd_path, "/AGV_Robot")
4.3 模型完整性检查清单
模型导入后,不能直接开始配置物理属性或传感器,必须先进行系统性检查。根据我们的项目经验,以下五项检查缺一不可。
第一项:几何完整性。在Viewport中旋转视角,检查模型是否有破面、缺面、拉伸变形。特别关注车轮与车身的连接处、传感器安装支架等细节部位。使用 Viewport → Wireframe 模式可以快速发现非流形边。
第二项:材质与纹理。确认所有部件都有正确的材质分配。如果模型显示为纯灰色或紫色,说明材质丢失。在Isaac Sim中,可以通过 Material 面板重新指定PBR材质,但更高效的做法是在建模软件中预先赋予材质并导出为支持材质的格式(如OBJ+MTL或glTF)。
第三项:层级结构。在Stage面板中展开Prim树,检查层级是否清晰。一个规范的AGV模型层级应如下所示:
/AGV_Robot
├── base_link (包含车身网格、碰撞体)
├── left_wheel (包含轮子网格、碰撞体)
├── right_wheel
├── caster_wheel (万向轮)
├── lidar_sensor (激光雷达安装座)
└── camera_mount (相机支架)
如果层级混乱(例如所有部件平铺在Root下),后续添加关节约束和传感器时将会非常痛苦。
第四项:物理属性。选中任意部件Prim,在 Property 面板中检查 Physics 标签页。确认每个link都有Collider(碰撞体),且碰撞体形状与视觉网格大致吻合。对于AGV小车,建议使用凸包碰撞体(Convex Hull)而非三角网格碰撞体,以提升物理仿真性能。
第五项:单位与比例。使用 Measure 工具测量车轮直径和轴距,与真实设计值对比。如果发现尺寸偏差超过1%,需要检查导入时的单位设置。一个常见的错误是:CAD模型以毫米为单位,导出URDF时未转换,导致Isaac Sim中的小车变成“巨无霸”。
| 检查项 | 检查方法 | 通过标准 | 常见问题 |
|---|---|---|---|
| 几何完整性 | Wireframe模式目视检查 | 无破面、无拉伸变形 | 法线翻转导致面片不可见 |
| 材质纹理 | Viewport渲染模式 | 所有部件有正确材质 | 紫色/灰色表示材质丢失 |
| 层级结构 | Stage面板展开Prim树 | Root→Link→Mesh层级清晰 | 所有部件平铺在Root下 |
| 物理属性 | Property→Physics面板 | 每个link有Collider | 缺少碰撞体导致穿透 |
| 单位比例 | Measure工具测量 | 尺寸与设计值偏差<1% | 毫米/厘米未转换为米 |
4.4 坐标系调整与对齐策略
坐标系调整是模型导入中最容易出错、也最影响后续开发的一环。Isaac Sim遵循右手坐标系,Z轴朝上,X轴朝前,Y轴朝左。这与ROS的REP-103标准一致,但与许多CAD软件(如SolidWorks的Z轴朝上但Y轴朝前)不同。
坐标系调整的核心目标:让AGV模型的base_link坐标系与Isaac Sim的世界坐标系对齐,即小车前进方向为X轴正方向,左侧为Y轴正方向,垂直向上为Z轴正方向。同时,所有关节的旋转轴应尽量与坐标轴平行,以简化运动学计算。
具体操作步骤如下:
- 识别当前坐标系:在Viewport中开启
Show Axes功能,观察模型当前的坐标轴方向。通常导入的模型会保留建模软件中的坐标系。 - 调整Root Prim的旋转:选中Root Prim,在
Transform面板中修改Rotation值。例如,如果模型绕Z轴旋转了90度,则设置Rotation Z = -90进行修正。 - 调整位置偏移:如果base_link的原点不在车轮接地平面的中心,需要调整
Translation值。对于AGV,通常将原点设置在车体几何中心在地面的投影点,这样后续添加里程计和路径规划时坐标计算更直观。 - 统一缩放:确认
Scale为 (1, 1, 1)。如果导入时单位错误导致缩放异常,应返回建模软件修正,而不是在Isaac Sim中强行缩放——因为缩放会影响物理引擎的碰撞计算精度。 - 验证关节轴方向:对于每个旋转关节(如车轮),检查其旋转轴是否与Z轴平行(对于差速驱动AGV,车轮绕Y轴旋转)。如果轴方向不对,需要在URDF中修正
<axis>标签,或直接在USD中调整Joint的Axis属性。
下面是一个典型的坐标系修正案例:某AGV模型在SolidWorks中设计时,车头朝向Y轴正方向。导入Isaac Sim后,需要将Root Prim绕Z轴旋转-90度,使车头朝向X轴正方向。同时,由于SolidWorks的原点位于车体底面中心,而我们需要原点位于车轮接地平面,因此还需将模型沿Z轴向下平移一个车轮半径的距离。
# 通过Python脚本调整坐标系
from omni.isaac.core.utils.prims import set_prim_attribute_value
# 假设Root Prim路径为 /AGV_Robot
prim_path = "/AGV_Robot"
# 设置旋转:绕Z轴旋转-90度
set_prim_attribute_value(prim_path, "xformOp:rotateZ", -90.0)
# 设置位置:沿Z轴向下平移0.1米(假设车轮半径为0.1m)
set_prim_attribute_value(prim_path, "xformOp:translate", (0.0, 0.0, -0.1))
4.5 实战案例:从SolidWorks到Isaac Sim的完整导入
下面我们通过一个完整的案例,将上述知识点串联起来。假设我们有一台差速驱动AGV小车,设计参数如下:车体尺寸800mm×600mm×300mm,车轮直径200mm,轴距400mm,轮距500mm。我们使用SolidWorks建模,并安装了SW2URDF插件。
阶段一:SolidWorks中的准备工作。在SolidWorks中,确保所有零件单位设置为毫米。为每个运动部件(左轮、右轮、万向轮)创建单独的零件文件,并装配到总装配体中。使用SW2URDF插件导出URDF时,注意以下几点:
- 将base_link的原点设置在车体底面中心(即两个驱动轮轴线与车体纵向中心线的交点在地面的投影)。
- 为每个link添加视觉几何和碰撞几何,碰撞几何尽量简化(使用圆柱体代替轮子,使用长方体代替车体)。
- 导出时选择“米”作为单位,确保mesh文件与URDF在同一文件夹下。
阶段二:Isaac Sim导入与初步检查。按照4.2节的流程导入URDF。导入后,使用Measure工具测量车轮直径,显示为0.2米,符合预期。但发现车头朝向Y轴正方向,需要修正。同时,Stage面板中层级清晰,但发现万向轮的碰撞体缺失。
阶段三:坐标系修正与碰撞体补充。选中Root Prim,设置Rotation Z = -90度,使车头朝向X轴。然后选中万向轮link,在 Physics 面板中添加 Collider,选择“Sphere”形状,半径设为0.05米(万向轮半径)。
阶段四:物理属性验证。点击Play按钮运行仿真,观察小车是否自然落地。如果小车陷入地面或弹跳,说明碰撞体或质量设置有问题。此时检查每个link的 Mass 属性,确保总质量与设计值(如50kg)接近。同时,检查四个车轮是否与地面正确接触——在 Physics → Contact Reports 中查看接触点信息。
结果对比:修正前,小车在仿真中无法正常站立,车轮陷入地面;修正后,小车平稳停在地面上,推动车身可以观察到车轮正确旋转。整个调试过程耗时约30分钟,主要时间花在碰撞体补充和坐标系微调上。
复盘经验:这次案例暴露了两个常见问题:一是CAD软件与仿真软件的坐标系差异,二是碰撞体遗漏。建议在建模阶段就按照目标仿真坐标系进行设计,并在导出前使用URDF可视化工具(如RViz)预览,提前发现问题。