3、AGV基础:AGV类型、运动学模型(差速、阿克曼)、传感器(激光雷达、IMU、相机)原理与仿真表示

在进入 Isaac Sim 的 AGV 路径规划仿真之前,必须首先建立对 AGV 本体的系统性认知。仿真不是对现实世界的简单复制,而是对物理规律与传感器特性的抽象建模。如果对 AGV 的类型差异、运动学约束以及传感器噪声模型缺乏理解,后续搭建的仿真场景将要么过于理想化(导致算法无法迁移到真实环境),要么过于复杂(导致仿真运行效率低下)。本章将围绕 AGV 的三大核心要素展开:类型划分、运动学模型、传感器仿真表示,并重点说明在 Isaac Sim 中如何通过 USD 组件与 ROS 2 接口实现这些要素的映射。

AGV 仿真建模核心要素关系图 AGV 仿真模型 AGV 类型划分 • 潜伏式 / 牵引式 / 叉车式 • 室内导航 vs 室外重载 • 决定仿真中的碰撞体积与 底盘悬挂参数 运动学模型 • 差速模型:v, ω 解耦 • 阿克曼模型:前轮转向角约束 • 仿真中通过 Articulation 或 WheelJoint 实现 传感器仿真 • 激光雷达:RayCast 噪声 • IMU:偏置 + 高斯白噪声 • 相机:RGB + 深度 + 语义 • 通过 Isaac Sim 的 Sensor USD Schema 挂载 输出:ROS 2 Topic / TF 树 / 点云 / 图像 用于导航栈(Nav2)与路径规划算法验证

上图展示了本章的核心逻辑框架: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 属性设置)。
经验提醒:在 Isaac Sim 中,不要直接使用默认的 Cube 作为 AGV 车身。建议使用 Prim 创建带质量属性的刚体,并添加 CollisionApproximation(如凸包或球体),否则物理仿真时会出现穿透或抖动。

案例拆解:潜伏式 AGV 仿真模型搭建

假设我们要搭建一台潜伏式 AGV,用于模拟仓库货架搬运。初始目标:在 Isaac Sim 中创建一个可被 Nav2 控制的差速底盘。关键参数如下:

参数项数值仿真设置
车体尺寸800mm × 600mm × 300mmBox Collider + Mesh Collider
轮距(轴距)500mm左右轮间距
轮子半径100mmCylinder Shape
质量80kgMass = 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 曲线
仿真复杂度低(两个驱动轮)高(转向 + 驱动解耦)
典型场景室内货架搬运室外园区物流
风险提示:在 Isaac Sim 中,如果使用阿克曼模型,必须确保前轮转向角与后轮速度的同步更新。否则会出现轮胎打滑或模型抖动。建议使用 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 中挂载传感器

  1. 激光雷达:在 AGV 车体上添加 Lidar Prim,设置 Draw Points 为 True 可实时查看点云。通过 ROS2 Lidar 桥接发布 sensor_msgs/LaserScan。
  2. IMU:添加 ImuSensor 到车体中心,设置 Linear Acceleration 与 Angular Velocity 的噪声参数。发布 sensor_msgs/Imu。
  3. 相机:添加 Camera Prim,设置分辨率与 FOV。通过 ROS2 Camera 发布 sensor_msgs/Image 或 CompressedImage。
关键配置示例:在 Isaac Sim 的 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 畸变参数。