3、AGV基础与仿真模型:AGV小车结构、运动学模型、在Isaac Sim中导入或创建AGV模型、添加传感器(相机、IMU、激光雷达)
AGV(Automated Guided Vehicle,自动导引车)是智能物流与柔性制造系统中的核心执行单元。在Isaac Sim中进行视觉导航仿真之前,必须首先建立对AGV本体结构与运动学模型的准确认知,并掌握在仿真环境中构建或导入AGV模型、配置传感器的方法。本章将围绕“结构认知→运动学建模→仿真资产构建→传感器集成”这一主线展开,帮助学习者建立从物理实体到数字孪生的完整映射。
3.1 AGV小车结构:从物理组成到仿真映射
3.1.1 核心原理:AGV的五大子系统
AGV虽然形态多样,但本质上由五大子系统构成:车体与机械结构(底盘、车架、举升机构)、驱动与转向系统(电机、减速器、转向轮)、导航与感知系统(激光雷达、相机、IMU、磁条/二维码传感器)、控制与计算单元(PLC、工控机、嵌入式板卡)、能源与通信系统(电池、充电模块、WiFi/5G模块)。在Isaac Sim中,我们不需要对每个螺栓进行建模,但必须保留影响物理仿真和视觉感知的关键部件:车轮位置与尺寸、传感器安装位姿、车体碰撞体积、重心位置。
从仿真角度,AGV模型可分为三个层次:视觉层(外观网格,用于渲染和相机仿真)、物理层(碰撞体、质量、惯性张量,用于动力学仿真)、逻辑层(关节、驱动接口、传感器数据接口)。在Isaac Sim中,这三个层次统一由USD(Universal Scene Description)格式描述,通过Prim(场景图节点)组织。
3.1.2 判断方法:如何确定AGV的仿真建模精度
建模精度取决于仿真目标,可参考以下决策矩阵:
| 仿真目标 | 视觉层精度 | 物理层精度 | 推荐建模方式 |
|---|---|---|---|
| 视觉导航算法验证 | 高(纹理清晰) | 低(简单碰撞体) | URDF导入 + 纹理贴图 |
| 运动控制算法验证 | 中 | 高(精确惯量/摩擦) | 程序化创建 + 物理属性调优 |
| 多机协同调度 | 低(简化模型) | 中 | USD引用 + 简化碰撞体 |
| 传感器仿真(相机/雷达) | 高(材质真实) | 中 | 精细USD + 传感器参数标定 |
一个实用原则:视觉层精度决定传感器仿真可信度,物理层精度决定运动控制可信度。如果做视觉导航,车体外观和传感器安装位置必须精确;如果做运动学验证,轮径、轴距、质量分布必须准确。
3.1.3 案例拆解:典型差速AGV的结构参数
以一款常见的仓储差速AGV为例,其关键参数如下:
- 车体尺寸:800mm × 600mm × 300mm(长×宽×高),离地间隙50mm
- 驱动轮:两个差速驱动轮,直径200mm,轮距400mm,位于车体中部偏前
- 万向轮:四个从动万向轮,分布在四角,直径75mm
- 传感器布局:顶部安装2D激光雷达(高度500mm),前方安装RGB相机(高度350mm,俯仰角-5°),车体中心安装IMU
- 质量参数:整车质量120kg,重心位于几何中心下方30mm处
在Isaac Sim中创建该模型时,需要将上述参数转换为USD属性:车轮关节的driveType设置为"rotational",轮径通过physics:radius指定,传感器通过Camera、Lidar、Imu等Prim类型添加,并设置相对于车体坐标系的localPosition和localOrientation。
3.2 运动学模型:从数学描述到仿真驱动
3.2.1 核心原理:三种典型运动学模型
AGV的运动学模型描述了车轮速度与车体速度之间的映射关系。根据驱动方式不同,主要分为三类:
- 差速模型:两个独立驱动轮 + 万向从动轮。车体速度由左右轮速决定:线速度 \(v = (v_L + v_R)/2\),角速度 \(\omega = (v_R - v_L)/L\)(L为轮距)。该模型结构简单、转向灵活,是室内AGV的主流选择。
- 阿克曼模型:前轮转向 + 后轮驱动(或四轮驱动)。适用于室外高速场景,转弯半径受转向角限制,运动学约束为 \(v = \omega \cdot R\),其中R为转弯半径。
- 全向模型:采用麦克纳姆轮或全向轮,可实现平移和旋转的独立控制。运动学模型为 \( \begin{bmatrix} v_x \\ v_y \\ \omega \end{bmatrix} = J \cdot \begin{bmatrix} \omega_1 \\ \omega_2 \\ \omega_3 \\ \omega_4 \end{bmatrix} \),其中J为雅可比矩阵,取决于轮子安装角度。
在Isaac Sim中,运动学模型通过关节驱动实现。对于差速模型,需要为两个驱动轮分别创建RevoluteJoint,并设置driveType为"velocity",通过Python API或ROS2接口发布左右轮速度指令。
3.2.2 操作流程:在Isaac Sim中实现差速运动学
- 创建车轮关节:在USD中为左右驱动轮添加
RevoluteJoint,将body0设为车体,body1设为车轮,关节轴向设为Y轴(或根据模型调整)。 - 配置驱动参数:在关节的
Physics属性中设置driveType="velocity",maxVelocity设为2.0 m/s,maxForce设为100 N。 - 编写控制脚本:使用Isaac Sim的Python API,通过
articulation_view.set_joint_velocity_targets()设置左右轮目标速度。 - 验证运动学:在仿真中发布恒定速度指令,测量车体实际线速度和角速度,与理论值对比。
# 差速AGV速度控制示例
import omni.isaac.core.utils.stage as stage_utils
from omni.isaac.core.articulations import ArticulationView
# 获取关节视图
articulation_view = ArticulationView(prim_paths_expr="/World/AGV")
# 设置左右轮速度 (rad/s),假设轮径0.2m,目标线速度0.5m/s
wheel_radius = 0.1
v_target = 0.5 # m/s
omega_target = 0.2 # rad/s
v_left = (2*v_target - omega_target*0.4) / (2*wheel_radius)
v_right = (2*v_target + omega_target*0.4) / (2*wheel_radius)
articulation_view.set_joint_velocity_targets([v_left, v_right], joint_indices=[0, 1])
3.2.3 常见误区与总结复盘
RevoluteJoint轴向设置错误(例如将轴向设为Z轴),会导致车轮无法正常旋转或车体运动异常。此外,maxForce设置过小会导致AGV在重载或斜坡上打滑,设置过大会导致仿真不稳定。建议先使用physics:angularDamping增加阻尼,再逐步调整驱动力。
另一个常见误区是忽略车轮与地面的摩擦系数。Isaac Sim默认的摩擦系数可能无法模拟真实AGV的抓地力,导致急加速时车轮空转。建议在物理场景中设置地面材质为concrete或asphalt,并调整车轮碰撞体的physics:dynamicFriction和physics:staticFriction。
3.3 在Isaac Sim中导入或创建AGV模型
3.3.1 核心原理:三种建模路径对比
| 建模方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| URDF导入 | 已有ROS/URDF模型 | 保留关节/传感器定义,生态兼容 | 物理属性可能不准确,需手动调整 |
| USD原生创建 | 从零开始或精细控制 | 完全可控,性能最优 | 建模工作量大,需熟悉USD语法 |
| 程序化生成 | 参数化研究、批量生成 | 可脚本化,便于参数扫描 | 复杂几何体建模困难 |
对于大多数课程项目,推荐URDF导入 + 手动调优的混合路径:先用SolidWorks/Fusion 360导出URDF,再在Isaac Sim中调整物理属性和传感器参数。
3.3.2 操作流程:URDF导入与调优
- 准备URDF文件:确保URDF中包含所有和
定义,且每个link具有 visual和collision几何体。 - 使用Isaac Sim URDF Importer:通过菜单
Isaac Utils → URDF Importer或Python API导入,设置fix_base_link为False(AGV需要移动)。 - 检查导入结果:在Stage中检查Prim层次结构,确认所有关节和传感器已正确创建。
- 调整物理属性:为每个link设置
physics:mass和physics:inertia,可通过Compute Inertia工具自动计算。 - 添加传感器:在URDF中已定义的传感器会保留,未定义的需手动添加。
# URDF导入Python示例
from omni.isaac.urdf import _urdf
urdf_importer = _urdf.UrdfImporter()
urdf_path = "/path/to/agv.urdf"
result = urdf_importer.import_urdf(urdf_path, stage_units_in_meters=1.0)
# 获取导入后的根Prim路径
root_prim_path = result.root_prim_path
print(f"AGV模型已导入: {root_prim_path}")
3.3.3 案例拆解:从SolidWorks到Isaac Sim的完整流程
某项目需要将一款定制AGV导入Isaac Sim,具体过程如下:
- 背景与约束:AGV为四轮差速结构,包含举升机构,需保留举升关节的运动学约束。模型文件为SolidWorks格式,需转换为URDF。
- 操作步骤:① 在SolidWorks中安装SW2URDF插件,配置各link的坐标系和关节类型;② 导出URDF包(包含meshes文件夹);③ 在Isaac Sim中导入URDF,发现举升关节的
prismatic类型被正确识别;④ 手动调整举升关节的maxForce为500N,确保能承载货物;⑤ 添加激光雷达和相机传感器。 - 结果对比:导入后模型在仿真中可正常驱动,举升机构运动范围与实物一致。但发现车轮摩擦系数偏低,导致急停时打滑,通过将
dynamicFriction从0.3调至0.8解决。 - 复盘经验:URDF导入后必须检查
collision几何体是否与visual一致,否则可能出现“视觉穿透”或“碰撞异常”。
3.4 添加传感器:相机、IMU、激光雷达
3.4.1 核心原理:传感器仿真机制
Isaac Sim中的传感器仿真基于渲染引擎和物理引擎的协同工作:
- 相机(Camera):通过渲染管线生成RGB图像、深度图、语义分割图。关键参数包括分辨率、FOV、焦距、曝光时间。在视觉导航中,通常使用RGB相机获取环境纹理,使用深度相机获取距离信息。
- IMU(惯性测量单元):通过物理引擎的刚体动力学计算加速度和角速度。关键参数包括采样频率、噪声密度、偏置稳定性。IMU数据用于状态估计和运动控制。
- 激光雷达(Lidar):通过射线投射(Raycast)模拟激光束的发射与接收。关键参数包括扫描线数、角度范围、角分辨率、最大测距。2D激光雷达常用于SLAM和避障,3D激光雷达用于环境重建。
3.4.2 操作流程:在Isaac Sim中配置传感器
- 添加相机:在AGV Prim下创建
Camera子Prim,设置localPosition和localOrientation,配置imageWidth、imageHeight、focalLength等属性。 - 添加IMU:创建
ImuPrim,设置linearAcceleration和angularVelocity的噪声参数,通过ImuSensor接口读取数据。 - 添加激光雷达:创建
LidarPrim,设置horizontalFov、verticalFov、range、rotationRate等参数,通过LidarSensor接口获取点云数据。
# 添加相机传感器示例
from omni.isaac.sensor import Camera
camera = Camera(
prim_path="/World/AGV/chassis/front_camera",
position=[0.3, 0, 0.35],
orientation=[0.996, 0, 0.087, 0], # 约-5°俯仰角
frequency=30,
resolution=(640, 480)
)
camera.initialize()
# 获取RGB图像
rgb_image = camera.get_rgba()
3.4.3 常见误区与调优建议
rotationRate(旋转速率)与horizontalFov(水平视场角)共同决定点云密度。如果rotationRate过高,点云会稀疏;过低则数据冗余。建议根据导航算法需求设置:2D SLAM常用10Hz旋转速率、270°视场角;3D感知常用5Hz旋转速率、360°视场角。
另一个常见问题是传感器时间同步。在Isaac Sim中,不同传感器的数据回调频率可能不同,需要设置统一的frequency或使用on_tick事件同步读取。对于视觉导航,建议将相机和激光雷达的频率设为相同(如30Hz),IMU设为100Hz以上,并在控制循环中缓存最近一帧数据。
get_rgba()),会引入数据传输延迟。对于实时性要求高的场景,建议使用Tensor API直接在GPU上处理图像和点云数据,避免CPU-GPU拷贝。
3.4.4 案例拆解:多传感器融合的AGV感知系统
某视觉导航项目需要AGV在仓库中自主行驶,感知系统配置如下:
- 传感器配置:顶部2D激光雷达(10Hz,270°FOV,30m量程),前方RGB相机(30Hz,640×480,FOV 90°),车体中心IMU(100Hz,加速度计±4g,陀螺仪±500°/s)。
- 初始现象:在仿真中,AGV在直道行驶时定位正常,但在转弯时激光雷达点云出现明显畸变,导致SLAM建图失败。
- 分析过程:检查发现激光雷达的
rotationRate设置为20Hz,而车体转弯角速度达到0.5rad/s,导致点云在扫描周期内发生运动畸变。IMU数据虽然能提供角速度补偿,但未与激光雷达时间戳对齐。 - 解决方案:将激光雷达
rotationRate降至5Hz,并在读取点云时使用IMU数据进行运动补偿(去畸变)。同时,将相机和激光雷达的frequency统一为10Hz,确保数据同步。 - 结果对比:调整后,SLAM建图精度显著提升,轨迹误差从0.3m降至0.05m。但点云密度下降,通过增加
horizontalFov分辨率(从0.5°降至0.25°)弥补。 - 复盘经验:传感器参数必须与AGV运动特性匹配。高速运动场景应降低激光雷达旋转速率或使用固态激光雷达;同时,多传感器时间同步是融合算法的基础,建议在仿真中提前验证。
通过本章的学习,学习者应能够独立完成AGV仿真模型的构建:从结构参数确定、运动学模型选择,到Isaac Sim中的模型导入/创建,再到相机、IMU、激光雷达的配置与数据读取。下一阶段,我们将基于这些传感器数据,开展视觉导航算法的开发与验证。