3、AGV基础:AGV类型、运动学模型(差速、阿克曼)、传感器(激光雷达、IMU、相机)原理与仿真表示
在进入 Isaac Sim 的 AGV 路径规划仿真之前,必须首先建立对 AGV 本体的系统性认知。仿真不是对现实世界的简单复制,而是对物理规律与传感器特性的抽象建模。如果对 AGV 的类型差异、运动学约束以及传感器噪声模型缺乏理解,后续搭建的仿真场景将要么过于理想化(导致算法无法迁移到真实环境),要么过于复杂(导致仿真运行效率低下)。本章将围绕 AGV 的三大核心要素展开:类型划分、运动学模型、传感器仿真表示,并重点说明在 Isaac Sim 中如何通过 USD 组件与 ROS 2 接口实现这些要素的映射。
上图展示了本章的核心逻辑框架:AGV 类型决定了仿真中的物理外形与挂载方式,运动学模型决定了底盘控制指令的映射关系,而传感器仿真则为算法提供感知输入。三者共同构成一个完整的 AGV 仿真体,最终通过 ROS 2 接口与导航栈交互。下面逐一展开。
3.1 AGV 类型与仿真选型
核心原理:按导航方式与负载形式分类
AGV(Automated Guided Vehicle)在工业场景中主要分为三类:潜伏式(顶升或背负货架)、牵引式(拖拽料车)、叉车式(举升托盘)。从导航方式看,又可分为磁条/色带导航、激光反射板导航、自然导航(SLAM)。在 Isaac Sim 中,我们主要关注自然导航类 AGV,因为其依赖激光雷达与 IMU 进行实时定位与建图,与课程后续的路径规划算法直接相关。
仿真选型时需注意:潜伏式 AGV 通常采用差速底盘,外形为圆柱或方形,重心较低;叉车式 AGV 则可能采用阿克曼转向或后轮转向,且具有举升机构,仿真中需要添加额外的 prismatic joint。如果课程目标是验证 Nav2 局部规划器,建议优先选择差速模型,因为其控制接口简单(cmd_vel 线速度与角速度),便于快速验证算法。
判断方法:根据任务场景选择仿真模型
- 场景1:室内窄通道、货架密集 → 选择潜伏式差速 AGV,仿真中碰撞体积设为圆柱体,直径 600mm,高度 300mm。
- 场景2:室外园区、长距离重载 → 选择叉车式或重载牵引车,采用阿克曼模型,仿真中需考虑最小转弯半径。
- 场景3:需要对接辊筒线或精确停靠 → 选择麦克纳姆轮全向 AGV(虽然本章不重点讲,但 Isaac Sim 支持全向轮模型,通过 wheel OMDirection 属性设置)。
Prim 创建带质量属性的刚体,并添加 CollisionApproximation(如凸包或球体),否则物理仿真时会出现穿透或抖动。
案例拆解:潜伏式 AGV 仿真模型搭建
假设我们要搭建一台潜伏式 AGV,用于模拟仓库货架搬运。初始目标:在 Isaac Sim 中创建一个可被 Nav2 控制的差速底盘。关键参数如下:
| 参数项 | 数值 | 仿真设置 |
|---|---|---|
| 车体尺寸 | 800mm × 600mm × 300mm | Box Collider + Mesh Collider |
| 轮距(轴距) | 500mm | 左右轮间距 |
| 轮子半径 | 100mm | Cylinder Shape |
| 质量 | 80kg | Mass = 80 |
| 驱动方式 | 两轮差速,前后万向轮 | 左右轮为 revolute joint,万向轮为 fixed joint |
操作步骤:在 Isaac Sim 中创建 Articulation 根节点,添加车身 RigidBody,然后添加左右驱动轮,设置 D6Joint 或 RevoluteJoint,并指定驱动模式为 Velocity。最后通过 ROS2 Control 桥接 cmd_vel 话题。注意:左右轮的旋转方向必须相反,否则 AGV 无法原地旋转。
3.2 运动学模型:差速与阿克曼
核心原理:从控制指令到轮速映射
差速模型是最常见的室内 AGV 运动学模型。其核心公式为:
v = (v_right + v_left) / 2
ω = (v_right - v_left) / L
其中 v 为线速度,ω 为角速度,L 为轮距。该模型无法实现侧向平移,但可以零半径旋转。在 Isaac Sim 中,我们通过设置左右轮的 JointVelocity 指令来实现。
阿克曼模型模拟汽车转向,前轮负责转向,后轮驱动。其运动学约束为:
tan(δ) = L_wheelbase / R
其中 δ 为前轮平均转向角,R 为转弯半径。阿克曼模型不能原地旋转,且存在最小转弯半径。在仿真中,需要同时控制前轮的转向关节(revolute joint)和后轮的驱动关节。
判断方法:如何选择运动学模型
| 对比维度 | 差速模型 | 阿克曼模型 |
|---|---|---|
| 控制接口 | cmd_vel (v, ω) | cmd_vel + 前轮转角 |
| 路径规划适配 | 适合 Reeds-Shepp 曲线 | 适合 Dubins 曲线 |
| 仿真复杂度 | 低(两个驱动轮) | 高(转向 + 驱动解耦) |
| 典型场景 | 室内货架搬运 | 室外园区物流 |
ArticulationController 的 set_joint_velocities 和 set_joint_positions 接口分别控制驱动与转向。
实战场景:差速 AGV 的里程计解算
在仿真中,我们通常不直接读取轮子转速来计算里程计,而是通过 Odom 传感器或直接读取底盘 Articulation 的 WorldPosition。但为了验证运动学模型的正确性,可以手动实现轮速积分:
# 伪代码:差速里程计解算
dt = 0.05
v = (w_left + w_right) * r / 2
ω = (w_right - w_left) * r / L
x += v * cos(θ) * dt
y += v * sin(θ) * dt
θ += ω * dt
在 Isaac Sim 中,可以通过 ROS2 Odom 发布器直接输出 nav_msgs/Odometry,但需要注意:仿真中的里程计是理想值,没有累积误差。如果课程需要模拟真实场景,可以在 Odom 输出上叠加高斯噪声。
3.3 传感器原理与仿真表示
核心原理:三大传感器的物理特性
激光雷达(LiDAR)通过发射激光束并测量反射时间来计算距离。在仿真中,Isaac Sim 使用 RayCast 传感器模拟,可以设置光束数量、扫描范围、角度分辨率以及噪声模型。关键参数包括:horizontal_fov(水平视场角)、max_range(最大量程)、noise_stddev(高斯噪声标准差)。
IMU(惯性测量单元)提供加速度与角速度。仿真中需要模拟零偏(bias)与高斯白噪声。Isaac Sim 的 ImuSensor 可以输出线性加速度与角速度,但默认是理想值。为了贴近真实,需要添加 Bias 节点或通过 ROS 2 驱动添加噪声。
相机在 AGV 中主要用于视觉定位(如 AprilTag 识别)或语义分割。Isaac Sim 提供 Camera 传感器,可输出 RGB、深度、语义分割等数据。仿真中需注意相机的内参(焦距、主点)与畸变模型,否则视觉算法无法直接迁移。
仿真表示:在 Isaac Sim 中挂载传感器
- 激光雷达:在 AGV 车体上添加
LidarPrim,设置Draw Points为 True 可实时查看点云。通过ROS2 Lidar桥接发布sensor_msgs/LaserScan。 - IMU:添加
ImuSensor到车体中心,设置Linear Acceleration与Angular Velocity的噪声参数。发布sensor_msgs/Imu。 - 相机:添加
CameraPrim,设置分辨率与 FOV。通过ROS2 Camera发布sensor_msgs/Image或CompressedImage。
Lidar 属性中,设置 horizontal_fov 为 360,rotation_rate 为 10Hz,range 为 30m,noise_stddev 为 0.02m。这样模拟出的点云更接近真实雷达(如 SICK TIM561)。
常见误区与总结复盘
- 误区1:认为仿真传感器是完美的。实际上,如果不在仿真中添加噪声,路径规划算法在真实环境中会因传感器误差而失效。建议在课程初期就引入噪声模型。
- 误区2:忽略传感器坐标系与车体坐标系的 TF 变换。在 Isaac Sim 中,传感器挂载在车体 Prim 下,但发布 TF 时需确保
base_link到laser_frame的变换正确。 - 误区3:相机仿真中不设置畸变。对于视觉定位,畸变会影响特征点提取精度。建议在
Camera属性中设置fisheye或radial畸变参数。