4. AGV小车建模
在Isaac Sim中搭建AGV产线仿真项目,建模是物理仿真正确性的基石。许多初学者习惯直接导入高精度的CAD模型,却忽略了物理引擎对模型的基本要求——碰撞体、质量属性、摩擦系数等。本章将系统讲解如何从零开始使用Prim(场景图节点)构建一个可用的AGV小车模型,并在此基础上完成碰撞体添加、物理属性配置,以及外部CAD模型的正确导入与处理流程。通过本章学习,你将掌握Isaac Sim中“仿真可用模型”与“视觉展示模型”的本质区别,并能够独立搭建出具备物理响应能力的AGV基础平台。
4.1 核心原理:Prim、碰撞体与物理属性的关系
在Isaac Sim中,所有场景对象都以Prim(Primitive)的形式存在于USD(Universal Scene Description)层级结构中。一个AGV小车模型本质上是由多个Prim组成的层级树:底盘、车轮、传感器支架、货架等。每个Prim可以拥有视觉属性(Visual)、碰撞属性(Collision)和物理属性(Physics)。理解这三者的关系是建模的第一步。
视觉属性决定了模型在渲染视图中的外观,包括网格、材质、纹理;碰撞属性决定了物理引擎如何计算该物体与其他物体的接触;物理属性则定义了物体的质量、惯性、摩擦等动力学参数。在仿真中,一个没有碰撞体的Prim会直接“穿透”地面或其他物体,而一个没有物理属性的Prim则不会受到重力或外力的影响。因此,一个完整的可仿真AGV模型必须同时具备这三层属性。
4.2 使用Prim创建简单AGV模型:从底盘到车轮
我们以一个两轮差速AGV为例,演示如何通过Isaac Sim的Prim面板手动创建模型。整个过程分为四个步骤:创建底盘、创建驱动轮、创建万向轮、组装层级结构。
4.2.1 创建底盘
在Isaac Sim中,点击菜单栏 Create → Shape → Cylinder 创建一个圆柱体作为底盘基础。在右侧的Property面板中,将其半径设为0.5米,高度设为0.2米。为了后续方便调整,建议将Prim重命名为 AGV_Chassis。此时创建的Cylinder默认只有视觉属性,我们需要在后续步骤中为其添加碰撞体和物理属性。
4.2.2 创建驱动轮
再次创建两个Cylinder,分别命名为 Left_Wheel 和 Right_Wheel。将半径设为0.15米,高度设为0.1米。在Transform属性中,将左轮位置设为 (-0.3, 0.4, 0.1),右轮位置设为 (-0.3, -0.4, 0.1),使其对称安装在底盘两侧。注意,车轮需要绕X轴旋转90度,使其圆柱轴线沿Y轴方向,才能实现滚动效果。
4.2.3 创建万向轮
万向轮通常使用Sphere(球体)来近似。创建一个Sphere,命名为 Rear_Caster,半径设为0.08米,位置放在底盘后方 (0.4, 0, 0.05)。球体作为万向轮可以简化物理计算,同时提供稳定的三点支撑。
4.2.4 组装层级结构
在Stage面板中,将 Left_Wheel、Right_Wheel、Rear_Caster 拖拽到 AGV_Chassis 下,形成父子层级。这样,当底盘移动时,所有子Prim会跟随移动。层级结构是后续添加关节(Joint)和传感器的基础。
| Prim名称 | 几何类型 | 尺寸参数 | 位置 (X, Y, Z) | 用途 |
|---|---|---|---|---|
| AGV_Chassis | Cylinder | R=0.5, H=0.2 | (0, 0, 0.1) | 承载车身 |
| Left_Wheel | Cylinder | R=0.15, H=0.1 | (-0.3, 0.4, 0.1) | 左驱动轮 |
| Right_Wheel | Cylinder | R=0.15, H=0.1 | (-0.3, -0.4, 0.1) | 右驱动轮 |
| Rear_Caster | Sphere | R=0.08 | (0.4, 0, 0.05) | 万向支撑轮 |
4.3 添加碰撞体:从视觉模型到物理模型
创建完视觉模型后,需要为每个Prim添加碰撞体。在Isaac Sim中,选中一个Prim后,在Property面板中点击 Add Physics Component → Collision Approximations。此时会弹出碰撞体类型选择菜单,包括 Convex Hull、Convex Decomposition、Box、Sphere、Cylinder 等选项。
对于底盘,由于它是圆柱体,直接选择 Cylinder 碰撞体即可,物理引擎会将其视为一个完美的圆柱碰撞体。对于车轮,同样选择 Cylinder 碰撞体。对于万向轮,选择 Sphere 碰撞体。这种“视觉与碰撞一一对应”的方式在简单模型中效率最高。
Convex Hull(凸包)作为碰撞体。凸包会生成一个包裹模型的最小凸多面体,计算效率高且能避免凹形物体碰撞穿透的问题。对于带有凹槽或孔的零件,可以使用 Convex Decomposition 将模型分解为多个凸包,但会增加物理计算开销。
4.4 设置物理属性:让AGV“活”起来
添加碰撞体后,AGV仍然静止不动,因为它还没有被赋予物理属性。在Isaac Sim中,物理属性通过 Rigid Body 组件启用。选中底盘Prim,点击 Add Physics Component → Rigid Body,此时底盘会获得质量、惯性等属性,并受到重力影响。
在Rigid Body属性面板中,需要设置以下关键参数:
- Mass(质量):AGV底盘建议设为50~100kg,根据实际负载调整。质量影响加速性能和惯性矩。
- Linear Damping(线性阻尼):建议设为0.1~0.5,模拟空气阻力和轴承摩擦,防止AGV在停止时产生滑行。
- Angular Damping(角阻尼):建议设为0.1~0.3,抑制旋转抖动。
- Friction(摩擦系数):在碰撞体属性中设置,底盘与地面接触的摩擦系数建议为0.8~1.0,车轮与地面为1.0~1.5(橡胶轮)。
- Restitution(恢复系数):设为0.0~0.1,避免AGV碰撞时产生弹跳。
车轮的物理属性设置与底盘略有不同。车轮需要绕轴旋转,因此需要添加 Revolute Joint(旋转关节)将车轮连接到底盘上。选中车轮Prim,点击 Create → Physics → Revolute Joint,然后在属性面板中指定 Body0 为底盘,Body1 为车轮。关节的轴方向设置为Y轴(因为车轮绕Y轴旋转)。
# 在Python脚本中设置物理属性的示例
from omni.isaac.core.utils.prims import set_rigid_body_properties
from omni.isaac.core.utils.prims import set_collision_properties
# 设置底盘质量
set_rigid_body_properties("/World/AGV_Chassis", mass=80.0, linear_damping=0.2, angular_damping=0.1)
# 设置车轮摩擦系数
set_collision_properties("/World/Left_Wheel", friction=1.2, restitution=0.0)
4.5 导入外部CAD模型:从URDF到USD的转换
在实际项目中,AGV的机械结构通常由SolidWorks、Fusion 360等CAD工具设计。Isaac Sim支持直接导入URDF(Unified Robot Description Format)文件,这是ROS生态中最常用的机器人描述格式。导入URDF时,Isaac Sim会自动将每个link转换为Prim,并将collision标签转换为碰撞体,将inertial标签转换为物理属性。
导入URDF的推荐流程如下:
- 在CAD软件中将模型导出为STL或OBJ格式,并确保单位是米(或导出时统一缩放)。
- 使用
urdf2isaac工具或Isaac Sim内置的Import URDF功能导入模型。 - 导入后,检查每个link的碰撞体类型。如果碰撞体是三角网格(Triangle Mesh),建议手动替换为Convex Hull或Primitive,以提升仿真性能。
- 检查关节类型。URDF中的revolute关节会自动映射为Revolute Joint,但需要确认关节轴方向和限位参数是否正确。
Xform 的 Reset Origin 功能将模型原点对齐到质心。
4.6 案例拆解:从零搭建一台可运行的AGV仿真原型
下面我们通过一个完整案例,将上述知识串联起来。假设我们需要搭建一台用于产线物料搬运的AGV,要求能够在地面上直线行驶并避开障碍物。
初始条件:我们有一个SolidWorks设计的AGV底盘模型(包含两个驱动轮、两个万向轮、一个货架),导出为STL格式,单位毫米。底盘尺寸为1200mm×800mm×300mm,重量约150kg。
操作步骤:
第一步,在Isaac Sim中新建场景,点击 Import → URDF,选择我们预先转换好的URDF文件(在SolidWorks中通过插件导出)。导入后,场景中会出现 agv_base 的Prim层级。
第二步,检查碰撞体。选中 chassis_link,发现其碰撞体类型为Triangle Mesh。我们将其删除,重新添加 Convex Hull 碰撞体。对于四个轮子,我们将其碰撞体替换为 Cylinder,并设置摩擦系数为1.0。
第三步,设置物理属性。选中 chassis_link,添加Rigid Body组件,设置质量为150kg,线性阻尼0.3,角阻尼0.2。检查四个轮子的关节,确认驱动轮的Revolute Joint轴方向正确(沿Y轴),并设置电机驱动参数(最大速度、最大扭矩)。
第四步,添加地面。创建一个 Plane 作为地面,设置摩擦系数为0.8。点击Play按钮,观察AGV是否稳定停在地面上,没有穿透或抖动。
结果对比:使用Convex Hull碰撞体后,仿真帧率从45 FPS提升到58 FPS,且碰撞检测的误报率明显降低。如果直接使用原始三角网格碰撞体,AGV在行驶过程中会出现车轮卡顿和底盘弹跳现象。
复盘经验:在导入CAD模型时,不要急于仿真。先花10分钟检查碰撞体类型和物理属性,可以避免后续数小时的调试。对于产线仿真,建议将AGV的碰撞体简化为2~3个基本几何体(底盘一个Box,每个轮子一个Cylinder),这样既能保证物理行为准确,又能最大化仿真性能。
4.7 常见误区与总结复盘
在AGV建模过程中,初学者常犯以下错误:
- 误区一:认为视觉模型越精细越好。实际上,高精度网格会拖慢物理引擎,且容易导致碰撞穿透。正确做法是视觉高精度、碰撞低精度。
- 误区二:忘记设置摩擦系数。默认摩擦系数为0,导致AGV在光滑地面上无法加速或转向。
- 误区三:所有轮子都设置为Rigid Body,但没有添加关节。这会导致轮子与底盘分离,AGV散架。
- 误区四:忽略单位转换。CAD中毫米模型导入后,如果不缩放,AGV会变成“巨无霸”或“微缩模型”。