AGV 路径跟踪与控制系统
一个完整的 AGV(自动导引车)路径跟踪与控制系统,提供路径规划、轨迹跟踪、Curtis 电机控制和 Qt 可视化界面。
项目概述
本项目实现了一套完整的 AGV 控制系统,包括:
- 路径规划:支持圆形、直线和自定义路径
- 轨迹跟踪:Pure Pursuit 和 Stanley 算法
- 硬件控制:Curtis 电机控制器 CAN 通信
- 可视化:Qt6 图形界面和控制台界面
主要功能
1. 路径生成
- 预定义路径:圆形路径、直线路径
- 自定义路径:通过 CSV 文件导入任意路径点
- 平滑路径:使用三次样条插值生成平滑轨迹
2. 路径跟踪算法
- Pure Pursuit:前视距离控制,适合平滑路径
- Stanley:横向误差与航向误差结合,适合精确跟踪
3. Curtis 电机控制
- CAN 通信:支持 USB-CAN 设备(USBCAN-2A/2C、CANalyst-II)
- 速度控制:前进/后退速度控制
- 转向控制:左转/右转控制
- 安全保护:紧急停止和安全限制
4. 可视化界面
- Qt6 GUI:实时路径和轨迹可视化
- 参数调节:动态调整控制参数
- 数据分析:跟踪误差和控制输出显示
项目结构
agv-control-slam/
├── include/ # 头文件
│ ├── agv_model.h # AGV 运动模型
│ ├── path_curve.h # 路径曲线
│ ├── path_tracker.h # 路径跟踪器
│ ├── control_generator.h # 控制生成器
│ └── can/ # CAN 控制相关
│ ├── CANController.h
│ └── CurtisMotorController.h
├── src/ # 源文件
│ └── control/ # 控制算法实现
│ ├── agv_model.cpp
│ ├── path_curve.cpp
│ ├── path_curve_custom.cpp
│ ├── path_tracker.cpp
│ ├── control_generator.cpp
│ └── can/ # CAN 通信实现
├── examples/ # 示例程序
│ ├── demo.cpp # 基本演示
│ ├── gui_demo.cpp # 控制台 GUI
│ ├── qt_gui_demo.cpp # Qt 图形界面
│ ├── curtis_demo.cpp # Curtis 键盘控制
│ ├── curtis_path_tracking_demo.cpp # Curtis 路径跟踪
│ ├── generate_data.cpp # 数据生成工具
│ └── generate_smooth_path.cpp # 平滑路径生成
├── lib/ # 第三方库
│ └── ControlCAN.lib/dll # USB-CAN 接口库
├── scripts/ # 工具脚本
├── build.sh # Linux/MSYS2 构建脚本
└── deploy_windows.sh # Windows 部署脚本
快速开始
环境要求
- 编译器:GCC 7.0+ 或 MSVC 2017+ 或 MinGW-w64
- CMake:3.10 或更高版本
- Qt6:6.0 或更高版本(用于 GUI)
- Python 3:用于可视化工具(可选)
Windows 编译(推荐)
使用 MSYS2/MinGW-w64 环境:
# 1. 安装依赖
pacman -S mingw-w64-x86_64-cmake mingw-w64-x86_64-gcc mingw-w64-x86_64-qt6
# 2. 构建项目
./build.sh
# 3. 运行示例
cd build
./agv_demo.exe # 基本演示
./agv_gui.exe # 控制台 GUI
./agv_qt_gui.exe # Qt 图形界面
部署可执行程序
# 打包 Qt 应用及其依赖
./deploy_windows.sh
# 可执行文件将在 release_package/ 目录中
cd release_package
./agv_qt_gui.exe
Linux 编译
# 1. 安装依赖
sudo apt-get install cmake g++ qt6-base-dev
# 2. 构建项目
mkdir build && cd build
cmake ..
make
# 3. 运行示例
./agv_demo
./agv_qt_gui
使用示例
1. 基本路径跟踪
#include "path_tracker.h"
// 创建 AGV 模型
AGVModel model(2.0, 1.0); // 轴距 2.0m, 最大转向角 1.0 rad
// 创建路径跟踪器
PathTracker tracker(model);
// 生成圆形路径
PathCurve path = PathCurve::generateCircularPath(5.0, 100);
tracker.setReferencePath(path);
// 设置初始状态
AGVModel::State initial_state(0, -5, M_PI/2, 0);
tracker.setInitialState(initial_state);
// 生成控制序列
tracker.generateControlSequence("pure_pursuit", 0.1, 10.0, 1.0);
// 导出结果
tracker.exportToCSV("output.csv");
2. 自定义路径跟踪
// 从 CSV 文件加载路径
PathCurve custom_path = PathCurve::loadFromCSV("custom_path.csv");
tracker.setReferencePath(custom_path);
// 使用 Stanley 算法
tracker.generateControlSequence("stanley", 0.1, 10.0, 1.0);
3. Curtis 电机控制
#include "can/CurtisMotorController.h"
// 初始化控制器
CurtisMotorController controller;
controller.initialize(0, 0, 0, 500000); // CAN0, 500kbps
// 控制车辆
controller.forward(30); // 前进,速度 30%
controller.turnLeft(50); // 左转,转向 50%
controller.brake(); // 刹车
controller.emergencyStop(); // 紧急停止
核心算法
Pure Pursuit 算法
- 前视距离:根据速度动态调整
- 转向计算:基于前视点的几何关系
- 适用场景:平滑路径跟踪
Stanley 算法
- 横向误差:垂直于路径的偏差
- 航向误差:车辆朝向与路径切线的偏差
- 适用场景:精确路径跟踪和低速场景
可视化工具
Qt GUI 界面
- 实时路径和轨迹显示
- 参数动态调整
- CSV 文件导入/导出
- 动画播放控制
Python 可视化
python visualize.py output.csv
CAN 通信配置
硬件支持
- USBCAN-2A/2C
- CANalyst-II
- MiniPCIe-CAN
库文件配置
将 ControlCAN.dll 和 ControlCAN.lib 放置在 lib/ 目录。详见 lib/README.md。
开发文档
详细的开发文档和 API 参考,请查看 docs/ 目录:
- API 参考手册
- 开发指南
- 算法说明
更新日志
2025-11-27
- 项目文档重新整理
- 清理过时文档
- 更新项目结构说明
2025-11-27(早期)
- Qt6 升级完成
- 部署脚本优化
- 构建系统改进
许可证
本项目采用 MIT 许可证。
贡献
欢迎提交 Issue 和 Pull Request。
作者
AGV 控制系统开发团队
最后更新: 2025-11-27 项目状态: 活跃开发中
Description
Languages
C++
61.1%
Shell
23.8%
Python
10.6%
C
2.7%
CMake
1.5%
Other
0.3%