场景创建与导入:地面、障碍物、AGV模型与物理属性设置
在Isaac Sim中构建AGV仿真环境,场景的创建与导入是后续路径规划、感知算法验证的基础。一个物理属性正确、视觉结构清晰的场景,能够显著减少仿真与真实环境之间的差距。本章将围绕地面、障碍物、AGV模型导入以及材质与物理属性设置四个核心环节展开,帮助您建立一套可复用、可扩展的场景搭建流程。
4.1 地面创建:从Prim到物理材质
地面是AGV仿真场景中最基础的支撑元素。在Isaac Sim中,地面通常使用Plane Prim或Cube Prim拉伸生成。推荐使用Plane,因为它天然是无限平面,适合作为AGV行驶的基准面。创建地面时,需要同时考虑视觉表现和物理属性:视觉上,地面应有网格纹理或材质贴图,便于观察AGV运动轨迹;物理上,地面必须具有碰撞属性,否则AGV会直接穿透。
核心操作流程:
- 在Stage面板中点击
Add→Physics→Plane,创建默认地面。 - 选中地面Prim,在
Property面板中设置Physics→Collision→Collision Enabled为True。 - 为地面添加视觉材质:在
Materials面板中创建OmniPBR材质,设置Base Color为浅灰色(如RGB 0.8, 0.8, 0.8),并添加网格纹理。 - 设置物理材质:在
Physics→Material中创建PhysicsMaterial,设置静态摩擦系数(Static Friction)为0.8,动态摩擦系数(Dynamic Friction)为0.5,恢复系数(Restitution)为0.1。
地面物理材质的选择直接影响AGV的牵引力与制动效果。若摩擦系数过低,AGV在加速或刹车时会出现打滑;若过高,则可能引起轮胎磨损或电机过载。对于室内仓储场景,建议静态摩擦系数在0.6~1.0之间,动态摩擦系数在0.4~0.7之间。
| 参数 | 推荐值 | 影响 |
|---|---|---|
| 静态摩擦系数 | 0.8 | 决定AGV起步时的最大静摩擦力 |
| 动态摩擦系数 | 0.5 | 影响AGV匀速行驶时的阻力 |
| 恢复系数 | 0.1 | 控制AGV跌落或碰撞后的弹跳程度 |
4.2 障碍物导入:Prim、USD与碰撞体配置
障碍物是AGV路径规划中必须避让的静态或动态对象。Isaac Sim支持多种障碍物导入方式:直接创建Prim(如Cube、Cylinder)、导入外部USD文件、或从URDF中提取。无论哪种方式,障碍物都必须具备碰撞体(Collider)属性,否则路径规划算法无法感知其存在。
对于简单障碍物(如货架、立柱),推荐使用Prim创建并添加碰撞体。对于复杂障碍物(如货架组合、传送带),建议使用USD文件导入,以保留精细的视觉模型。导入后,需要检查碰撞体是否与视觉模型对齐——碰撞体可以比视觉模型略小,但不能明显大于视觉模型,否则会造成“虚拟碰撞”。
经验提醒:在创建障碍物时,建议将碰撞体形状简化为Box或Cylinder,避免使用三角网格碰撞体。三角网格碰撞体计算开销大,且容易在AGV高速行驶时产生穿透或抖动。例如,一个货架可以用一个Box碰撞体近似,尺寸略小于货架实际尺寸(如每边缩小2~3厘米),即可满足大多数路径规划需求。
4.3 AGV模型导入:URDF与USD的实战选择
AGV模型是仿真场景的核心。Isaac Sim支持两种主流导入方式:URDF(Unified Robot Description Format)和USD(Universal Scene Description)。URDF是ROS生态中常用的机器人描述格式,包含连杆、关节、视觉网格和碰撞网格;USD是NVIDIA推荐的场景描述格式,支持更丰富的物理属性和材质。
对于已有URDF模型的AGV,推荐使用Isaac Utils → URDF Importer导入。导入时需注意:
- 确保URDF中的
mesh路径正确,且单位一致(通常为米)。 - 在导入设置中勾选
Fix Base Link,将AGV底盘固定为base_link。 - 导入后检查关节(Joint)是否完整,特别是驱动轮对应的
continuous关节。
若使用USD格式,可直接通过File → Import导入。USD的优势在于可以保留Isaac Sim原生物理属性(如刚体质量、惯性张量),且加载速度更快。但USD文件通常较大,且不易修改关节参数,因此更适合使用官方提供的AGV模型或经过预处理的模型。
风险提示:URDF导入后,AGV的轮子可能无法正常旋转。这通常是因为URDF中的transmission标签未被正确解析。解决方法是:在导入后手动为驱动轮关节添加D6Joint或RevoluteJoint,并设置驱动模式为Velocity,同时指定目标速度。
4.4 材质与物理属性设置:从视觉到仿真一致性
材质与物理属性是连接视觉与仿真行为的桥梁。在Isaac Sim中,材质分为视觉材质(如OmniPBR、OmniSurface)和物理材质(如PhysicsMaterial)。视觉材质决定物体外观,物理材质决定物体交互行为。两者独立设置,但共同作用于仿真效果。
设置物理属性时,需要关注以下关键参数:
- 质量(Mass):AGV整机质量影响加速度与制动距离。建议根据真实AGV参数设置,例如轻型AGV约50kg,重型AGV约200kg。
- 惯性张量(Inertia Tensor):对于非对称模型,默认的惯性张量可能不准确。可在
Physics→Rigid Body中手动计算或输入。 - 碰撞形状(Collision Shape):AGV底盘建议使用Box或Convex Hull,轮子使用Cylinder或Sphere。
# 设置AGV刚体属性的Python示例
from omni.isaac.core.utils.stage import get_current_stage
from pxr import UsdPhysics, UsdShade
stage = get_current_stage()
agv_prim = stage.GetPrimAtPath("/World/AGV")
# 启用刚体
UsdPhysics.RigidBodyAPI.Apply(agv_prim)
# 设置质量
mass_api = UsdPhysics.MassAPI.Apply(agv_prim)
mass_api.CreateMassAttr().Set(120.0)
# 设置碰撞
UsdPhysics.CollisionAPI.Apply(agv_prim)
4.5 案例拆解:搭建一个带货架的AGV测试场景
下面通过一个完整案例,演示如何从零搭建一个包含地面、障碍物和AGV的测试场景。该场景用于验证AGV在货架间的路径规划能力。
场景需求:模拟一个10m×8m的仓库区域,包含4个货架(障碍物),AGV需要从起点A行驶到目标点B,避开货架。
操作步骤:
- 创建地面:使用Plane Prim,设置尺寸为10×8米(通过Scale调整),添加网格纹理和物理材质(摩擦系数0.7)。
- 创建货架:使用Cube Prim,每个货架尺寸为1.2m×0.8m×2m,放置在指定坐标(如(2,2,0)、(2,5,0)、(7,2,0)、(7,5,0))。为每个货架添加Box碰撞体。
- 导入AGV:使用URDF导入功能,选择AGV的URDF文件,设置base_link为底盘,检查轮子关节。
- 设置AGV物理属性:设置质量为80kg,轮子摩擦系数为0.9,底盘碰撞体为Box。
- 验证场景:点击Play运行仿真,观察AGV是否稳定站立在地面上,轮子是否正常旋转,货架是否阻挡AGV。
结果与复盘:首次运行时,发现AGV在起步时出现轻微打滑。分析原因是地面摩擦系数设置过低(0.5)。将地面静态摩擦系数调整为0.8后,打滑现象消失。另外,货架的碰撞体比视觉模型大了一圈,导致AGV在靠近货架时提前停止。将碰撞体尺寸缩小至视觉模型的95%后,路径规划更加顺畅。
案例经验总结:
- 物理属性设置应基于真实AGV参数,而非随意取值。
- 碰撞体应略小于视觉模型,避免“虚拟碰撞”影响路径规划。
- 每次修改物理属性后,应重新运行仿真验证,观察AGV的运动行为是否符合预期。
4.6 常见误区与调试技巧
在场景创建过程中,以下误区需要特别注意:
- 误区一:忽略碰撞体设置。只添加视觉模型而不添加碰撞体,导致AGV直接穿过障碍物。解决方法是检查每个障碍物Prim的
Collision属性。 - 误区二:单位不一致。URDF中模型使用毫米,而Isaac Sim默认使用米,导致模型过大或过小。导入前应统一单位。
- 误区三:物理材质未生效。创建了PhysicsMaterial但未绑定到Prim上。需要在
Physics→Material中点击Bind。
调试时,建议开启Physics → Debug → Collision Shapes可视化,查看碰撞体是否与视觉模型对齐。同时,使用Stage面板检查Prim路径,确保所有对象都在正确的层级下。
高效工作流建议:将常用的地面、货架、AGV模型保存为USD文件,放入Assets库中。下次创建场景时,直接拖拽复用,避免重复配置物理属性。同时,使用Stage面板的Layer功能,将地面、障碍物、AGV分别放在不同Layer中,便于独立编辑和调试。