基于 Syslab 的仓储 AGV 任务分配、路径规划与轨迹跟踪控制教学案例

案例简介

本案例模拟一个简化的智能仓储场景,通过 Syslab 完成从运筹优化(任务分配 + 路径规划)控制算法(AGV 轨迹跟踪) 的完整闭环实验。学生可以直观理解如何将仓储搬运任务转化为代价最小化问题,使用 A* 算法规划最优路径,并通过 PID 控制器实现 AGV 轨迹跟踪。

案例亮点

  • 可直接用于课堂演示、上机实验或课程作业
  • 自带仓储场景生成脚本,无需额外准备真实数据
  • 学生可通过修改 AGV 数量、任务数量、障碍物布局、控制参数观察结果变化
  • 同时覆盖运筹优化和控制算法,适合做跨课程综合实验
  • 可结合 MWORKS AI 辅助理解代码、修改参数和生成实验结论

适用课程

课程 适用内容
运筹学 任务分配建模、代价矩阵、目标函数
自动控制原理 PID 控制参数整定、轨迹跟踪
现代控制理论 系统建模、状态空间分析
物流系统优化 仓储 AGV 调度、路径优化
智能制造系统 无人搬运系统设计与仿真
机器人路径规划 A* 算法实现与障碍物避让
工业工程实验课 物流仿真实验
数学建模与优化 运输问题建模、图论应用

适用专业

自动化、机械工程、物流工程、工业工程、智能制造、管理科学与工程、应用数学等。

建议课时

  • 课堂讲解:1 课时(50 分钟)
  • 上机实验:2 课时(100 分钟)
  • 课后拓展:自主安排

学生基础要求

  • 了解线性代数和距离度量的基本概念
  • 了解图论搜索或最短路径问题的基本思想
  • 了解 PID 控制的基本原理
  • 能够运行 Syslab / Julia 脚本

教学目标

通过本案例,学生能够:

  1. 将仓储搬运任务建模为运筹优化问题,理解代价矩阵与目标函数
  2. 使用贪心算法和穷举搜索完成 AGV 与任务的最优分配
  3. 理解并实现 A* 路径规划算法,在栅格地图中避开障碍物
  4. 建立 AGV 简化运动模型,设计 PID 控制器完成轨迹跟踪
  5. 通过可视化结果分析路径长度、任务完成时间和控制误差
  6. 对比优化分配与顺序分配,体会运筹优化带来的实际改善

案例背景

场景描述

模拟一个 20×20 的二维网格仓库,仓库中包含若干货架/障碍物区域。系统中有 3 辆 AGV 小车,需要完成 5 个搬运任务。每个任务包含取货点和送达点。

核心流程

场景生成 → 任务分配 → 路径规划 → 轨迹跟踪 → 结果评价
  1. 场景生成:自动生成仓库地图、AGV 初始位置和任务点
  2. 任务分配:构建代价矩阵,求解最优任务分配
  3. 路径规划:使用 A* 算法为每辆 AGV 规划避障路径
  4. 轨迹跟踪:使用 PID 控制器实现 AGV 沿路径运动
  5. 结果评价:对比优化分配与顺序分配,分析控制误差

任务分配方法说明

本案例实现了两种分配方法,供教学对比:

方法 复杂度 说明
贪心分配 O(mn) 按总代价最小的 AGV 优先选择最近的可用任务
穷举搜索 O(n!) 枚举所有排列组合,找到全局最优解(小规模用)

路径规划算法说明

使用 A(A-Star)算法*进行路径规划。

A* 算法结合了 Dijkstra 算法的最短路径保证和最佳优先搜索的效率,通过代价函数 $f(n) = g(n) + h(n)$ 选择节点:

  • $g(n)$:从起点到节点 $n$ 的实际代价
  • $h(n)$:从节点 $n$ 到终点的启发式估计(曼哈顿距离)
  • 网格地图采用 4-邻域(上下左右)移动

每条 AGV 路径包括两段:AGV 初始位置 → 任务取货点 → 任务送达点。

AGV 运动模型说明

采用二维平面离散运动模型:

$$\begin{aligned}
x(k+1) &= x(k) + v(k) \cdot \cos\theta(k) \cdot \Delta t \
y(k+1) &= y(k) + v(k) \cdot \sin\theta(k) \cdot \Delta t \
\theta(k+1) &= \theta(k) + \omega(k) \cdot \Delta t
\end{aligned}$$

其中 $x, y$ 为位置,$\theta$ 为航向角,$v$ 为线速度,$\omega$ 为角速度,$\Delta t = 0.1s$。

轨迹跟踪控制方法说明

使用 PID 控制完成轨迹跟踪,包括两个控制回路:

  1. 速度控制回路(外环):根据当前位置与目标路径点的距离误差计算线速度
  2. 航向控制回路(内环):根据当前航向与目标航向的角度误差计算角速度

PID 控制律:

$$u(t) = K_p e(t) + K_i \int_0^t e(\tau) d\tau + K_d \frac{de(t)}{dt}$$

快速开始

1. 环境要求

  • Syslab 2026a 或更高版本
  • 安装时选择 Julia 运行时支持

2. 运行顺序

在 Syslab 中逐脚本运行(或统一运行):

# 第 1 步:生成场景
include("src/01_generate_scene.jl")

# 第 2 步:任务分配
include("src/02_task_assignment.jl")

# 第 3 步:路径规划
include("src/03_path_planning.jl")

# 第 4 步:轨迹跟踪控制
include("src/04_trajectory_tracking_control.jl")

# 第 5 步:结果评价
include("src/05_result_evaluation.jl")

# 第 6 步:综合可视化
include("src/06_visualize_result.jl")

3. 一键运行

也可以在 Syslab 中创建 runtests.jl 一次性运行所有脚本:

for script in [
    "01_generate_scene.jl",
    "02_task_assignment.jl",
    "03_path_planning.jl",
    "04_trajectory_tracking_control.jl",
    "05_result_evaluation.jl",
    "06_visualize_result.jl"
]
    println("\n","="^60)
    println("  Running: src/$(script)")
    println("="^60)
    include("src/$(script)")
end

文件结构

agv_operation_control_case/
├── README.md                          # 本文件
├── data/                              # 数据文件目录
│   ├── warehouse_map.csv              # 仓库地图(0=可通行,1=障碍物)
│   ├── agv_positions.csv              # AGV 初始位置
│   ├── task_points.csv                # 任务取货点和送达点
│   ├── cost_matrix.csv                # 任务分配代价矩阵
│   ├── assignment_result.csv          # 任务分配结果
│   ├── path_result.csv                # 路径规划结果
│   ├── control_result.csv             # 控制仿真结果
│   ├── evaluation_result.csv          # 评价对比结果
│   └── analysis_report.txt            # 实验结论报告
├── src/                               # 源代码目录
│   ├── 01_generate_scene.jl           # 场景生成
│   ├── 02_task_assignment.jl          # 任务分配
│   ├── 03_path_planning.jl            # 路径规划
│   ├── 04_trajectory_tracking_control.jl  # 轨迹跟踪控制
│   ├── 05_result_evaluation.jl        # 结果评价
│   └── 06_visualize_result.jl         # 综合可视化
├── figures/                           # 图像输出目录
│   ├── warehouse_scene.png            # 仓储初始场景
│   ├── cost_matrix.png                # 代价矩阵热力图
│   ├── assignment_result.png          # 任务分配结果图
│   ├── path_planning_result.png       # 路径规划结果图
│   ├── trajectory_tracking_result.png # 轨迹跟踪结果图
│   ├── tracking_error_curve.png       # 跟踪误差曲线
│   └── optimization_comparison.png    # 优化前后对比图
└── docs/                              # 教学文档目录
    ├── 学生实验指导书.md              # 学生实验指导书
    └── 教师使用建议.md                # 教师使用建议

数据字段说明

warehouse_map.csv

列名 说明
矩阵 0 可通行,1 障碍物

agv_positions.csv

列名 说明
agv_id AGV 编号
x X 坐标(列)
y Y 坐标(行)

task_points.csv

列名 说明
task_id 任务编号
pickup_x 取货点 X
pickup_y 取货点 Y
delivery_x 送达点 X
delivery_y 送达点 Y

cost_matrix.csv

列名 说明
矩阵 行=AGV,列=任务,值为曼哈顿距离

assignment_result.csv

列名 说明
agv_id AGV 编号
assigned_task 分配的任务编号
pickup_cost 到取货点的距离代价

path_result.csv

列名 说明
agv_id AGV 编号
task_id 任务编号
path_x 路径点 X 坐标
path_y 路径点 Y 坐标
segment 1=取货段,2=送货段
path_length 总路径长度

control_result.csv

列名 说明
agv_id AGV 编号
time 仿真时间 (s)
x AGV 水平位置
y AGV 垂直位置
theta 航向角 (rad)
v 线速度 (m/s)
omega 角速度 (rad/s)
pos_error 位置误差
theta_error 航向角误差

运行结果说明

预期运行结果

  1. 场景生成:生成 20×20 仓库地图,3 辆 AGV,5 个任务,含障碍物
  2. 任务分配:贪心分配总代价约 15-25,最优分配 ≤ 贪心分配
  3. 路径规划:每条路径避开障碍物,总路径长度约 40-70 步
  4. 轨迹跟踪:PID 控制实现位置误差和航向误差的逐步收敛
  5. 优化对比:优化分配相比顺序分配显著降低总路径长度

教学使用建议

课堂讲解顺序

环节 时间 内容
案例背景讲解 10 分钟 智能仓储与 AGV 调度场景
运筹建模讲解 15 分钟 代价矩阵、最小成本分配问题
路径规划讲解 15 分钟 A* 算法原理与实现
控制模型讲解 15 分钟 AGV 运动模型与 PID 轨迹跟踪
代码运行演示 15 分钟 运行完整案例并展示结果
参数修改实验 30 分钟 修改任务数量、障碍物布局和控制参数
结果讨论 20 分钟 分析优化效果、路径差异和跟踪误差
拓展任务 课后 动态障碍物、多 AGV 冲突处理或 MPC 控制

上机实验组织方式

  1. 基础实验:按顺序运行 6 个脚本,观察每一步的输出
  2. 参数修改实验:修改控制参数(Kp、Ki、Kd),比较轨迹跟踪效果
  3. 场景修改实验:修改障碍物布局或增加 AGV/任务数量
  4. 算法对比实验:对比贪心分配与穷举搜索的最优分配差异
  5. 综合实验:在基础代码上增加新功能(如多任务分配、动态障碍物)

学生实验任务

基础任务

  1. 运行完整案例,截图保存每一步的结果图
  2. 记录任务分配结果和路径长度
  3. 观察轨迹跟踪误差曲线的变化趋势

进阶任务

  1. 将 AGV 数量从 3 改为 4,重新运行并分析任务分配结果变化
  2. 修改障碍物布局(移动或新增),观察路径规划结果变化
  3. 调整 PID 控制参数(Kp, Ki, Kd),记录跟踪误差变化
  4. 将控制方法从 PID 改为纯 P 控制,比较控制效果

挑战任务

  1. 实现 A* 算法支持 8-邻域移动(增加对角线方向)
  2. 实现多任务分配(每辆 AGV 可执行多个任务)
  3. 增加动态障碍物,实现实时避障
  4. 实现 Pure Pursuit 或简化 MPC 控制算法

MWORKS AI 辅助学习提示

以下是适合向 MWORKS AI 提问的提示词示例:

请解释 02_task_assignment.jl 中代价矩阵和任务分配算法的实现逻辑。
请解释 03_path_planning.jl 中 A* 路径规划算法的实现过程。
请将 AGV 数量从 3 改为 4,并说明任务分配结果可能发生什么变化。
请增加一组新的障碍物,并重新生成路径规划结果。
请解释 04_trajectory_tracking_control.jl 中 AGV 运动模型和控制算法的含义。
请调整轨迹跟踪控制参数,并比较修改前后的跟踪误差。
请根据本次实验结果生成一段实验报告结论。
请将当前案例扩展为支持动态障碍物避让的版本。

常见问题

Q1: 运行提示找不到 TyPlot 包?

A: 确保使用 Syslab 自带的 Julia 环境运行,Syslab 已预装 TyPlot 和基础数据读写包。

Q2: 路径规划结果为空?

A: 检查任务点是否被障碍物包围,可在 01_generate_scene.jl 中调整随机种子或增大任务点与障碍物的最小距离。

Q3: 轨迹跟踪误差很大?

A: 尝试调整 PID 参数:增大 Kp_v(速度比例增益)或减小 Kp_theta(降低航向控制的震荡)。

Q4: 如何修改 AGV 数量或任务数量?

A: 修改 01_generate_scene.jl 开头的 n_agvn_tasks 变量。

Q5: 图片中的中文字符无法正常显示?

A: 在 Syslab 的 TyPlot 中默认支持中文。如出现乱码,请确认 Syslab 版本为 2026a SP1 或更新。

拓展方向

  1. 多任务分配:每辆 AGV 分配多个任务,考虑任务完成顺序
  2. 动态障碍物:AGV 运动过程中实时检测和避开新出现的障碍物
  3. 多 AGV 冲突处理:多辆 AGV 同时运行时避免碰撞
  4. MPC 控制:使用模型预测控制(MPC)替代 PID,提高跟踪精度
  5. 强化学习:使用 Q-learning 或 DQN 完成 AGV 路径规划
  6. 能耗优化:在路径代价中加入 AGV 能耗模型
  7. 三维仿真:将网格地图扩展到三维空间
  8. ROS 集成:将本案例的控制算法输出到 ROS 进行 Gazebo 仿真