initial
This commit is contained in:
69
docs/guides/BUILD_INSTRUCTIONS.md
Normal file
69
docs/guides/BUILD_INSTRUCTIONS.md
Normal file
@@ -0,0 +1,69 @@
|
||||
# 编译说明
|
||||
|
||||
## 重要提示
|
||||
|
||||
在重新编译之前,请**先关闭正在运行的 `agv_qt_gui.exe` 程序**!
|
||||
|
||||
检测到程序正在运行(进程ID: 2996),需要先关闭才能重新编译。
|
||||
|
||||
## 关闭程序的方法
|
||||
|
||||
### 方法1: 通过任务管理器
|
||||
1. 按 `Ctrl + Shift + Esc` 打开任务管理器
|
||||
2. 找到 `agv_qt_gui.exe` 进程
|
||||
3. 右键点击,选择"结束任务"
|
||||
|
||||
### 方法2: 通过命令行
|
||||
在 **Windows命令提示符**(不是Git Bash)中运行:
|
||||
```cmd
|
||||
taskkill /F /PID 2996
|
||||
```
|
||||
|
||||
或者查找并关闭所有 agv_qt_gui 进程:
|
||||
```cmd
|
||||
taskkill /F /IM agv_qt_gui.exe
|
||||
```
|
||||
|
||||
## 编译步骤
|
||||
|
||||
关闭程序后,执行以下命令重新编译:
|
||||
|
||||
```bash
|
||||
cd build
|
||||
cmake --build . --config Release
|
||||
```
|
||||
|
||||
或者如果需要Debug版本:
|
||||
```bash
|
||||
cmake --build . --config Debug
|
||||
```
|
||||
|
||||
## 编译成功的标志
|
||||
|
||||
如果编译成功,应该看到:
|
||||
```
|
||||
agv_qt_gui.vcxproj -> C:\work\AGV\AGV运动规划\agv_path_tracking\build\Release\agv_qt_gui.exe
|
||||
```
|
||||
|
||||
## 运行修复后的程序
|
||||
|
||||
编译成功后,运行:
|
||||
```bash
|
||||
# Release版本
|
||||
./build/Release/agv_qt_gui.exe
|
||||
|
||||
# 或 Debug版本
|
||||
./build/Debug/agv_qt_gui.exe
|
||||
```
|
||||
|
||||
然后测试"Load from CSV"功能,特别是:
|
||||
1. 尝试加载包含中文路径的CSV文件
|
||||
2. 尝试加载各种格式的CSV文件
|
||||
|
||||
## 已修复的问题
|
||||
|
||||
✓ Windows路径编码问题(主要原因)
|
||||
✓ 单点路径处理
|
||||
✓ 异常处理改进
|
||||
|
||||
所有修改已应用到源代码,只需重新编译即可生效。
|
||||
110
docs/guides/CUSTOM_PATH_README.md
Normal file
110
docs/guides/CUSTOM_PATH_README.md
Normal file
@@ -0,0 +1,110 @@
|
||||
# 自定义路径功能 - 快速导航
|
||||
|
||||
## 📍 文档位置
|
||||
|
||||
所有自定义路径功能的文档已整理到:
|
||||
|
||||
```
|
||||
docs/custom_path/
|
||||
```
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 查看文档目录
|
||||
```bash
|
||||
cd docs/custom_path
|
||||
cat README.md
|
||||
```
|
||||
|
||||
### 2. 推荐阅读顺序
|
||||
|
||||
**新手入门(5分钟):**
|
||||
```
|
||||
docs/custom_path/FINAL_SUMMARY.md # 功能总览 ⭐
|
||||
docs/custom_path/QUICKSTART_CUSTOM_PATH.md # 快速上手
|
||||
```
|
||||
|
||||
**QT界面集成(10分钟):**
|
||||
```
|
||||
docs/custom_path/apply_qt_modifications.md # 修改步骤 ⭐
|
||||
docs/custom_path/qt_gui_custom_code_snippet.cpp # 代码示例
|
||||
```
|
||||
|
||||
**深入学习(30分钟):**
|
||||
```
|
||||
docs/custom_path/CUSTOM_PATH_GUIDE.md # 完整教程
|
||||
```
|
||||
|
||||
## 📦 核心功能
|
||||
|
||||
1. **CSV文件加载** - 从外部文件加载任意路径
|
||||
2. **样条插值** - 从关键点生成平滑曲线
|
||||
3. **路径保存** - 导出路径为CSV格式
|
||||
4. **QT界面集成** - 图形化操作
|
||||
|
||||
## 🔧 安装
|
||||
|
||||
### 自动安装(推荐)
|
||||
```bash
|
||||
bash docs/custom_path/install_custom_path.sh
|
||||
```
|
||||
|
||||
### 手动安装
|
||||
参考文档:`docs/custom_path/CUSTOM_PATH_GUIDE.md`
|
||||
|
||||
## 📖 完整文档列表
|
||||
|
||||
访问 `docs/custom_path/README.md` 查看所有文档的详细说明。
|
||||
|
||||
## 📁 文件结构
|
||||
|
||||
```
|
||||
agv_path_tracking/
|
||||
├── src/
|
||||
│ └── path_curve_custom.cpp # 核心实现
|
||||
├── include/
|
||||
│ └── path_curve.h # 需要添加方法声明
|
||||
├── examples/
|
||||
│ ├── custom_path.csv # 示例路径
|
||||
│ └── warehouse_path.csv # 仓库路径
|
||||
├── docs/
|
||||
│ └── custom_path/ # 📚 所有文档在这里!
|
||||
│ ├── README.md # 文档导航
|
||||
│ ├── FINAL_SUMMARY.md # 功能总览 ⭐
|
||||
│ ├── QUICKSTART_CUSTOM_PATH.md
|
||||
│ ├── CUSTOM_PATH_GUIDE.md
|
||||
│ ├── apply_qt_modifications.md ⭐
|
||||
│ ├── QT_GUI_CUSTOM_PATH_GUIDE.md
|
||||
│ ├── qt_gui_custom_code_snippet.cpp
|
||||
│ ├── install_custom_path.sh
|
||||
│ ├── path_curve.h.patch
|
||||
│ └── CUSTOM_PATH_IMPLEMENTATION_SUMMARY.txt
|
||||
└── CUSTOM_PATH_README.md # 本文件(快速导航)
|
||||
```
|
||||
|
||||
## ✨ 快速示例
|
||||
|
||||
```cpp
|
||||
// 1. 加载自定义路径
|
||||
PathCurve path;
|
||||
path.loadFromCSV("examples/custom_path.csv");
|
||||
|
||||
// 2. 使用路径
|
||||
PathTracker tracker(agv);
|
||||
tracker.setReferencePath(path);
|
||||
tracker.generateControlSequence("pure_pursuit", 0.1, 20.0);
|
||||
```
|
||||
|
||||
## 🎯 使用场景
|
||||
|
||||
| 场景 | 查看文档 |
|
||||
|-----|---------|
|
||||
| 快速试用 | `docs/custom_path/QUICKSTART_CUSTOM_PATH.md` |
|
||||
| QT界面 | `docs/custom_path/apply_qt_modifications.md` |
|
||||
| 深入学习 | `docs/custom_path/CUSTOM_PATH_GUIDE.md` |
|
||||
| 安装配置 | `docs/custom_path/install_custom_path.sh` |
|
||||
| 完整总览 | `docs/custom_path/FINAL_SUMMARY.md` ⭐ |
|
||||
|
||||
---
|
||||
|
||||
**开始使用**: `cd docs/custom_path && cat README.md`
|
||||
183
docs/guides/QUICKSTART.md
Normal file
183
docs/guides/QUICKSTART.md
Normal file
@@ -0,0 +1,183 @@
|
||||
# AGV 路径跟踪控制系统 - 快速入门指南
|
||||
|
||||
本指南将帮助您快速上手 AGV 路径跟踪控制系统。
|
||||
|
||||
## 1. 编译项目
|
||||
|
||||
### Windows 用户
|
||||
|
||||
使用 PowerShell:
|
||||
```powershell
|
||||
.\build.ps1
|
||||
```
|
||||
|
||||
或手动编译:
|
||||
```powershell
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
cmake --build . --config Release
|
||||
```
|
||||
|
||||
### Linux/MacOS 用户
|
||||
|
||||
```bash
|
||||
chmod +x build.sh
|
||||
./build.sh
|
||||
```
|
||||
|
||||
或手动编译:
|
||||
```bash
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make
|
||||
```
|
||||
|
||||
## 2. 运行程序
|
||||
|
||||
### 命令行演示程序
|
||||
|
||||
Windows:
|
||||
```powershell
|
||||
cd build\Release
|
||||
.\agv_demo.exe
|
||||
```
|
||||
|
||||
Linux/MacOS:
|
||||
```bash
|
||||
cd build
|
||||
./agv_demo
|
||||
```
|
||||
|
||||
### 控制台 GUI 程序
|
||||
|
||||
Windows:
|
||||
```powershell
|
||||
cd build\Release
|
||||
.\agv_gui.exe
|
||||
```
|
||||
|
||||
Linux/MacOS:
|
||||
```bash
|
||||
cd build
|
||||
./agv_gui
|
||||
```
|
||||
|
||||
### Qt 图形界面程序
|
||||
|
||||
Windows:
|
||||
```powershell
|
||||
cd build\Release
|
||||
.\agv_qt_gui.exe
|
||||
```
|
||||
|
||||
Linux/MacOS:
|
||||
```bash
|
||||
cd build
|
||||
./agv_qt_gui
|
||||
```
|
||||
|
||||
## 3. 使用示例
|
||||
|
||||
运行 `agv_demo` 后,您将看到交互式菜单:
|
||||
|
||||
1. **选择路径类型**
|
||||
- 1: 直线路径
|
||||
- 2: 圆弧路径
|
||||
- 3: 贝塞尔曲线
|
||||
- 4: S形曲线
|
||||
|
||||
2. **选择控制算法**
|
||||
- 1: Pure Pursuit(推荐用于平滑路径)
|
||||
- 2: Stanley(推荐用于高精度跟踪)
|
||||
|
||||
3. **查看结果**
|
||||
- 程序会在控制台显示控制序列
|
||||
- 可选择保存为CSV文件
|
||||
|
||||
## 4. 可视化结果
|
||||
|
||||
如果保存了CSV文件,可以使用Python脚本可视化:
|
||||
|
||||
```bash
|
||||
python visualize.py
|
||||
```
|
||||
|
||||
需要安装的依赖:
|
||||
```bash
|
||||
pip install pandas matplotlib numpy
|
||||
```
|
||||
|
||||
## 5. 输出文件说明
|
||||
|
||||
生成的 CSV 文件包含:
|
||||
|
||||
- **control_sequence.csv**: 时间、速度、转向角(弧度和角度)
|
||||
- **trajectory.csv**: AGV 的预测轨迹(x, y, θ)
|
||||
|
||||
文件格式示例:
|
||||
```csv
|
||||
# AGV Control Sequence
|
||||
# Time(s), Velocity(m/s), Steering(rad), Steering(deg)
|
||||
0.000000, 1.000000, 0.732770, 41.984039
|
||||
0.100000, 1.000000, 0.732933, 41.993384
|
||||
```
|
||||
|
||||
## 6. 自定义使用
|
||||
|
||||
参考 `examples/demo.cpp` 中的代码,您可以:
|
||||
|
||||
```cpp
|
||||
// 创建自定义路径
|
||||
PathCurve my_path;
|
||||
my_path.generateLine(PathPoint(0, 0), PathPoint(10, 5), 100);
|
||||
|
||||
// 调整 AGV 参数
|
||||
AGVModel my_agv(
|
||||
1.5, // 轴距 1.5m
|
||||
3.0, // 最大速度 3.0 m/s
|
||||
M_PI/3 // 最大转向角 60 度
|
||||
);
|
||||
|
||||
// 生成控制序列
|
||||
tracker.generateControlSequence("pure_pursuit", 0.05, 15.0);
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 编译时找不到 cmake?
|
||||
**A:** 请安装 CMake:https://cmake.org/download/
|
||||
|
||||
### Q: Windows 下编译失败?
|
||||
**A:** 确保安装了以下之一:
|
||||
- Visual Studio(推荐 2019 或更新版本)
|
||||
- MinGW-w64
|
||||
|
||||
### Q: 如何修改路径参数?
|
||||
**A:** 编辑 `examples/demo.cpp` 或参考完整 README 文档自定义路径
|
||||
|
||||
### Q: 控制序列太长或太短?
|
||||
**A:** 调整 `generateControlSequence` 的 `horizon` 参数(时域长度)
|
||||
|
||||
### Q: Pure Pursuit 和 Stanley 算法有什么区别?
|
||||
**A:**
|
||||
- **Pure Pursuit**:适合平滑路径,计算简单,跟踪稳定
|
||||
- **Stanley**:适合高精度跟踪,对横向误差更敏感
|
||||
|
||||
### Q: 如何调整可视化参数?
|
||||
**A:** 编辑 `visualize.py` 文件中的绘图参数,如箭头间隔、线宽等
|
||||
|
||||
## 下一步
|
||||
|
||||
- 阅读完整的 [README.md](README.md) 了解详细 API 和算法原理
|
||||
- 查看 `examples/` 目录下的示例代码学习使用方法
|
||||
- 尝试不同的路径类型和控制算法组合
|
||||
- 调整 AGV 参数观察对控制效果的影响
|
||||
- 集成到您自己的项目中
|
||||
|
||||
## 技术支持
|
||||
|
||||
如有问题或建议,请在代码仓库中创建 issue。
|
||||
|
||||
祝使用愉快!
|
||||
119
docs/guides/QUICK_START.md
Normal file
119
docs/guides/QUICK_START.md
Normal file
@@ -0,0 +1,119 @@
|
||||
# 快速使用指南 - 完整路径追踪
|
||||
|
||||
## 问题
|
||||
❌ trajectory路径只有一段,无法完整追踪reference path
|
||||
|
||||
## 解决方案
|
||||
✅ **已修复并重新编译成功!**
|
||||
|
||||
## 立即测试
|
||||
|
||||
### 1. 运行程序
|
||||
```bash
|
||||
./build/Release/agv_qt_gui.exe
|
||||
```
|
||||
|
||||
### 2. 检查Horizon参数
|
||||
在GUI界面中找到:
|
||||
```
|
||||
Horizon (s): [ 50.0 ] ← 默认值已改为50秒
|
||||
范围: 1-100秒
|
||||
```
|
||||
|
||||
### 3. 生成控制序列
|
||||
- 选择任意路径类型(建议先测试 "Straight Line")
|
||||
- 点击 "Generate Control"
|
||||
- 观察可视化窗口中的trajectory(绿色线)
|
||||
|
||||
### 4. 验证结果
|
||||
✓ trajectory应该完整覆盖reference path(红色线)
|
||||
✓ 不应该在中途停止
|
||||
✓ 应该接近路径终点(0.5米范围内)
|
||||
|
||||
## 如果轨迹仍不完整
|
||||
|
||||
### 场景1: 路径很长(>50米)
|
||||
**解决**: 手动增加Horizon值
|
||||
```
|
||||
路径长度: 80米
|
||||
速度: 1.0 m/s
|
||||
推荐Horizon: 80 × 1.5 = 120秒
|
||||
但GUI最大值是100秒,所以设置为100秒
|
||||
```
|
||||
|
||||
### 场景2: 速度很慢(<0.5 m/s)
|
||||
**解决**: 同样需要增加Horizon
|
||||
```
|
||||
路径长度: 20米
|
||||
速度: 0.5 m/s
|
||||
推荐Horizon: 20 / 0.5 × 1.5 = 60秒
|
||||
```
|
||||
|
||||
### 场景3: 路径超长(>100米)
|
||||
**解决**: 需要修改代码中的最大值
|
||||
在 `qt_gui_demo.cpp:294` 中将 100.0 改为更大的值(比如200.0)
|
||||
|
||||
## 计算Horizon公式
|
||||
|
||||
```
|
||||
Horizon (秒) = 路径长度(米) / 期望速度(m/s) × 1.5
|
||||
```
|
||||
|
||||
**示例**:
|
||||
- 20米路径 @ 1.0 m/s → 30秒
|
||||
- 50米路径 @ 1.0 m/s → 75秒
|
||||
- 30米路径 @ 0.5 m/s → 90秒
|
||||
|
||||
## 修复对比
|
||||
|
||||
| 项目 | 修复前 | 修复后 |
|
||||
|------|--------|--------|
|
||||
| Horizon默认值 | 10秒 | **50秒** ✓ |
|
||||
| Horizon最大值 | 30秒 | **100秒** ✓ |
|
||||
| 终止阈值 | 0.1米 | **0.5米** ✓ |
|
||||
| 默认可追踪距离 | 10米 | **50米** ✓ |
|
||||
|
||||
## 预设路径测试
|
||||
|
||||
| 路径类型 | 预估长度 | 推荐Horizon | 状态 |
|
||||
|---------|---------|------------|------|
|
||||
| Straight Line | ~14米 | 默认50秒即可 | ✓ |
|
||||
| Circle Arc | ~15米 | 默认50秒即可 | ✓ |
|
||||
| S-Curve | ~12米 | 默认50秒即可 | ✓ |
|
||||
| Load from CSV | 视文件而定 | 可能需调整 | ✓ |
|
||||
| Custom Spline | 视输入而定 | 可能需调整 | ✓ |
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 轨迹还是不完整?
|
||||
A: 检查以下几点:
|
||||
1. Horizon值是否足够大(建议设为路径长度的1.5倍所需时间)
|
||||
2. 在控制台查看是否有错误信息
|
||||
3. 确认路径点是否正确加载
|
||||
|
||||
### Q: 如何查看路径长度?
|
||||
A: 在控制台中会输出:
|
||||
```
|
||||
Path length: 14.1421 m
|
||||
Path points: 100
|
||||
```
|
||||
|
||||
### Q: Horizon设太大会有问题吗?
|
||||
A: 不会!程序会在到达终点时自动停止(distance < 0.5米)。Horizon只是最大时间限制。
|
||||
|
||||
### Q: 为什么编译时有警告?
|
||||
A: C4267警告(size_t转int)是良性的,不影响功能,可以忽略。
|
||||
|
||||
## 技术支持
|
||||
|
||||
如有问题,检查文档:
|
||||
- `TRAJECTORY_FIX.md` - 详细技术分析
|
||||
- `TRAJECTORY_COMPLETE.md` - 完整修复报告
|
||||
- `FIX_SUMMARY.md` - CSV加载修复
|
||||
- `FINAL_REPORT.md` - 完整技术文档
|
||||
|
||||
---
|
||||
|
||||
**更新日期**: 2025-11-14
|
||||
**版本**: v1.1
|
||||
**状态**: ✅ 已修复、已编译、待测试
|
||||
328
docs/guides/SMOOTH_PATH_GENERATOR_README.md
Normal file
328
docs/guides/SMOOTH_PATH_GENERATOR_README.md
Normal file
@@ -0,0 +1,328 @@
|
||||
# 平滑路径生成器使用说明
|
||||
|
||||
## 📁 文件位置
|
||||
|
||||
- **源代码**: `examples/generate_smooth_path.cpp`
|
||||
- **可执行文件**: `build/Debug/generate_smooth_path.exe` 或 `build/Release/generate_smooth_path.exe`
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 编译程序
|
||||
|
||||
```bash
|
||||
# 进入 build 目录
|
||||
cd build
|
||||
|
||||
# 编译 Debug 版本
|
||||
cmake --build . --target generate_smooth_path --config Debug
|
||||
|
||||
# 或编译 Release 版本
|
||||
cmake --build . --target generate_smooth_path --config Release
|
||||
```
|
||||
|
||||
### 2. 运行程序
|
||||
|
||||
```bash
|
||||
# 运行 Debug 版本
|
||||
./build/Debug/generate_smooth_path.exe
|
||||
|
||||
# 或运行 Release 版本
|
||||
./build/Release/generate_smooth_path.exe
|
||||
```
|
||||
|
||||
运行后会自动生成 6 个 CSV 文件在当前目录:
|
||||
|
||||
- ✅ `smooth_path.csv` - 默认平滑路径(5个关键点)
|
||||
- ✅ `smooth_path_arc.csv` - 圆弧路径
|
||||
- ✅ `smooth_path_scurve.csv` - S型曲线
|
||||
- ✅ `smooth_path_complex.csv` - 复杂路径(10个关键点)
|
||||
- ✅ `smooth_path_loop.csv` - 环形路径
|
||||
- ✅ `smooth_path_figure8.csv` - 8字形路径
|
||||
|
||||
## 📚 类方法说明
|
||||
|
||||
`SmoothPathGenerator` 类提供以下静态方法:
|
||||
|
||||
### 1. `generateCircleArc()` - 生成圆弧路径
|
||||
|
||||
```cpp
|
||||
SmoothPathGenerator::generateCircleArc(
|
||||
"output.csv", // 输出文件名
|
||||
5.0, 0.0, // 圆心坐标 (center_x, center_y)
|
||||
5.0, // 半径
|
||||
M_PI, M_PI/2, // 起始角度和终止角度(弧度)
|
||||
150 // 路径点数量
|
||||
);
|
||||
```
|
||||
|
||||
### 2. `generateSCurve()` - 生成S型曲线
|
||||
|
||||
```cpp
|
||||
SmoothPathGenerator::generateSCurve(
|
||||
"scurve.csv", // 输出文件名
|
||||
0.0, 0.0, // 起点 (start_x, start_y)
|
||||
10.0, 0.0, // 终点 (end_x, end_y)
|
||||
2.5, // 控制点偏移量
|
||||
200 // 路径点数量
|
||||
);
|
||||
```
|
||||
|
||||
### 3. `generateSpline()` - 生成样条曲线
|
||||
|
||||
```cpp
|
||||
std::vector<PathPoint> key_points = {
|
||||
PathPoint(0.0, 0.0),
|
||||
PathPoint(3.0, 1.0),
|
||||
PathPoint(6.0, 3.0),
|
||||
PathPoint(9.0, 3.5),
|
||||
PathPoint(12.0, 3.0)
|
||||
};
|
||||
|
||||
SmoothPathGenerator::generateSpline(
|
||||
"spline.csv", // 输出文件名
|
||||
key_points, // 关键点数组
|
||||
200, // 生成的总路径点数
|
||||
0.5 // 张力参数 (0-1, 越大越紧)
|
||||
);
|
||||
```
|
||||
|
||||
### 4. `generateComplexPath()` - 生成复杂路径
|
||||
|
||||
```cpp
|
||||
// 自动生成一个包含10个关键点的复杂路径
|
||||
SmoothPathGenerator::generateComplexPath("complex.csv", 300);
|
||||
```
|
||||
|
||||
### 5. `generateLoop()` - 生成环形路径
|
||||
|
||||
```cpp
|
||||
SmoothPathGenerator::generateLoop(
|
||||
"loop.csv", // 输出文件名
|
||||
5.0, // 半径
|
||||
300 // 路径点数量
|
||||
);
|
||||
```
|
||||
|
||||
### 6. `generateFigure8()` - 生成8字形路径
|
||||
|
||||
```cpp
|
||||
SmoothPathGenerator::generateFigure8(
|
||||
"figure8.csv", // 输出文件名
|
||||
4.0, // 8字大小
|
||||
400 // 路径点数量
|
||||
);
|
||||
```
|
||||
|
||||
## 🎯 自定义使用示例
|
||||
|
||||
### 示例1:创建自己的平滑路径
|
||||
|
||||
```cpp
|
||||
#include "path_curve.h"
|
||||
#include <vector>
|
||||
|
||||
int main() {
|
||||
// 定义你的关键点
|
||||
std::vector<PathPoint> my_points = {
|
||||
PathPoint(0.0, 0.0), // 起点
|
||||
PathPoint(2.0, 3.0), // 第一个转折点
|
||||
PathPoint(5.0, 4.0), // 第二个转折点
|
||||
PathPoint(8.0, 2.0), // 第三个转折点
|
||||
PathPoint(10.0, 0.0) // 终点
|
||||
};
|
||||
|
||||
// 生成样条曲线
|
||||
PathCurve path;
|
||||
path.generateSpline(my_points, 250, 0.4); // 250个点,张力0.4
|
||||
|
||||
// 保存为CSV
|
||||
path.saveToCSV("my_custom_path.csv");
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 示例2:在代码中调用生成器
|
||||
|
||||
```cpp
|
||||
#include "examples/generate_smooth_path.cpp" // 或者定义成头文件
|
||||
|
||||
int main() {
|
||||
// 快速生成一个S型路径
|
||||
SmoothPathGenerator::generateSCurve(
|
||||
"warehouse_path.csv",
|
||||
0.0, 0.0, // 从原点开始
|
||||
20.0, 5.0, // 到达(20, 5)
|
||||
5.0, // 较大的弯曲
|
||||
300 // 高精度
|
||||
);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 示例3:批量生成多条路径
|
||||
|
||||
```cpp
|
||||
int main() {
|
||||
// 生成多条不同参数的路径
|
||||
for (int i = 1; i <= 5; i++) {
|
||||
std::string filename = "path_" + std::to_string(i) + ".csv";
|
||||
double radius = i * 2.0;
|
||||
SmoothPathGenerator::generateLoop(filename, radius, 200);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
## 🖥️ 在Qt GUI中使用
|
||||
|
||||
1. 运行 Qt GUI 程序:
|
||||
```bash
|
||||
./build/Debug/agv_qt_gui.exe
|
||||
```
|
||||
|
||||
2. 在界面中选择 **"Path Type"** → **"Load from CSV"**
|
||||
|
||||
3. 在文件对话框中选择生成的任意 CSV 文件
|
||||
|
||||
4. 点击 **"Generate Control"** 查看效果
|
||||
|
||||
## 📊 CSV 文件格式
|
||||
|
||||
生成的 CSV 文件格式如下:
|
||||
|
||||
```csv
|
||||
# Custom Path Data
|
||||
# x(m), y(m), theta(rad), kappa(1/m)
|
||||
0.000000, 0.000000, 0.310064, 0.000000
|
||||
0.015153, 0.004855, 0.299013, 1.369770
|
||||
0.030624, 0.009440, 0.278105, 1.221140
|
||||
...
|
||||
```
|
||||
|
||||
- **x, y**: 路径点坐标(米)
|
||||
- **theta**: 切线方向角(弧度)
|
||||
- **kappa**: 曲率(1/米)
|
||||
|
||||
## 🔧 常见问题
|
||||
|
||||
### Q1: 如何调整路径的平滑度?
|
||||
|
||||
修改 `tension` 参数(0-1):
|
||||
- `0.0`: 非常平滑,接近直线
|
||||
- `0.5`: 适中平滑(推荐)
|
||||
- `1.0`: 紧贴关键点,更多曲折
|
||||
|
||||
### Q2: 如何增加路径精度?
|
||||
|
||||
增加 `num_points` 参数:
|
||||
- 简单路径: 100-200 点
|
||||
- 复杂路径: 300-500 点
|
||||
- 高精度需求: 500+ 点
|
||||
|
||||
### Q3: 生成的路径在哪里?
|
||||
|
||||
路径文件生成在程序运行的当前目录。如果从 `build/Debug/` 运行,文件会在 `build/Debug/` 目录下。
|
||||
|
||||
建议运行时切换到项目根目录:
|
||||
```bash
|
||||
cd C:/work/AGV/AGV运动规划/agv_path_tracking
|
||||
./build/Debug/generate_smooth_path.exe
|
||||
```
|
||||
|
||||
### Q4: 如何只生成 smooth_path.csv?
|
||||
|
||||
修改 `main()` 函数,只保留需要的生成代码,或者创建自己的简化版本。
|
||||
|
||||
## 📝 完整调用示例
|
||||
|
||||
```cpp
|
||||
#include "path_curve.h"
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
int main() {
|
||||
// 方法1: 使用 PathCurve 类直接生成
|
||||
PathCurve path1;
|
||||
std::vector<PathPoint> points = {
|
||||
PathPoint(0, 0),
|
||||
PathPoint(5, 2),
|
||||
PathPoint(10, 0)
|
||||
};
|
||||
path1.generateSpline(points, 200, 0.5);
|
||||
path1.saveToCSV("method1.csv");
|
||||
|
||||
// 方法2: 使用 SmoothPathGenerator 封装类
|
||||
SmoothPathGenerator::generateSCurve(
|
||||
"method2.csv",
|
||||
0, 0, 10, 0, 3.0, 200
|
||||
);
|
||||
|
||||
std::cout << "Paths generated!" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
## 🎓 进阶用法
|
||||
|
||||
### 自定义路径生成器
|
||||
|
||||
你可以继承或扩展 `SmoothPathGenerator` 类来添加更多路径类型:
|
||||
|
||||
```cpp
|
||||
class MyPathGenerator : public SmoothPathGenerator {
|
||||
public:
|
||||
// 添加自定义路径类型
|
||||
static bool generateZigZag(const std::string& filename,
|
||||
int segments = 5,
|
||||
double width = 2.0) {
|
||||
std::vector<PathPoint> points;
|
||||
for (int i = 0; i <= segments; i++) {
|
||||
double x = i * 2.0;
|
||||
double y = (i % 2) * width;
|
||||
points.push_back(PathPoint(x, y));
|
||||
}
|
||||
|
||||
PathCurve path;
|
||||
path.generateSpline(points, segments * 50, 0.3);
|
||||
return path.saveToCSV(filename);
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## 📖 相关文档
|
||||
|
||||
- [PathCurve 类文档](include/path_curve.h)
|
||||
- [Qt GUI 使用说明](QUICKSTART.md)
|
||||
- [AGV 控制系统文档](README.md)
|
||||
|
||||
## ✅ 验证生成结果
|
||||
|
||||
使用 Python 可视化(如果安装了 matplotlib):
|
||||
|
||||
```python
|
||||
import pandas as pd
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
# 读取CSV文件
|
||||
df = pd.read_csv('smooth_path.csv', comment='#')
|
||||
|
||||
# 绘制路径
|
||||
plt.figure(figsize=(10, 8))
|
||||
plt.plot(df['x(m)'], df['y(m)'], 'b-', linewidth=2, label='Path')
|
||||
plt.plot(df['x(m)'], df['y(m)'], 'ro', markersize=3)
|
||||
plt.xlabel('X (m)')
|
||||
plt.ylabel('Y (m)')
|
||||
plt.title('Generated Smooth Path')
|
||||
plt.grid(True)
|
||||
plt.axis('equal')
|
||||
plt.legend()
|
||||
plt.show()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**作者**: AGV Path Tracking System
|
||||
**最后更新**: 2025-11-13
|
||||
226
docs/guides/TRACKING_TEST_GUIDE.md
Normal file
226
docs/guides/TRACKING_TEST_GUIDE.md
Normal file
@@ -0,0 +1,226 @@
|
||||
# 快速测试指南 - 路径跟踪改进
|
||||
|
||||
## 🎯 验证修复效果
|
||||
|
||||
修复已完成并编译成功!现在测试新的跟踪性能。
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 运行程序
|
||||
```bash
|
||||
./build/Release/agv_qt_gui.exe
|
||||
```
|
||||
|
||||
### 2. 关键检查点
|
||||
|
||||
#### ✓ 检查点1: 初始状态对齐
|
||||
**测试**: 选择任意路径 → Generate Control
|
||||
|
||||
**观察**: 绿色trajectory的起点应与红色reference path的起点**完美重合**
|
||||
|
||||
**修复前**: 起点偏离,有明显gap
|
||||
**修复后**: 起点完美对齐 ✓
|
||||
|
||||
#### ✓ 检查点2: 速度参数生效
|
||||
**测试**:
|
||||
1. 设置 Max Velocity = 2.0 m/s
|
||||
2. 选择 Circle Arc → Generate Control
|
||||
3. 查看动画速度
|
||||
|
||||
**修复前**: 动画慢(实际1.0 m/s)
|
||||
**修复后**: 动画快(实际2.0 m/s)✓
|
||||
|
||||
#### ✓ 检查点3: 跟踪精度
|
||||
**测试**: 选择 S-Curve → Generate Control
|
||||
|
||||
**观察**: trajectory应紧密跟随path,特别是弯道部分
|
||||
|
||||
**修复前**: 偏差0.5-2.0米,明显偏离
|
||||
**修复后**: 偏差<0.2米,紧密贴合 ✓
|
||||
|
||||
#### ✓ 检查点4: CSV路径
|
||||
**测试**:
|
||||
1. Load from CSV → 选择 smooth_path.csv
|
||||
2. Max Velocity = 1.0 m/s
|
||||
3. Generate Control
|
||||
|
||||
**修复前**:
|
||||
- 起点朝向错误(偏17.8度)
|
||||
- 持续偏离路径
|
||||
- 看起来在"追赶"路径
|
||||
|
||||
**修复后**:
|
||||
- 起点完美对齐 ✓
|
||||
- 全程紧密跟踪 ✓
|
||||
- 平滑流畅 ✓
|
||||
|
||||
## 推荐测试序列
|
||||
|
||||
### 序列1: 基础验证(5分钟)
|
||||
```
|
||||
1. Straight Line + Pure Pursuit → 检查起点对齐
|
||||
2. Circle Arc + Pure Pursuit → 检查圆弧跟踪
|
||||
3. S-Curve + Stanley → 检查弯道响应
|
||||
```
|
||||
|
||||
### 序列2: 速度测试(5分钟)
|
||||
```
|
||||
1. Circle Arc, Velocity=0.5 m/s → 低速精确
|
||||
2. Circle Arc, Velocity=1.0 m/s → 标准速度
|
||||
3. Circle Arc, Velocity=2.0 m/s → 高速平滑
|
||||
```
|
||||
|
||||
### 序列3: 算法对比(5分钟)
|
||||
```
|
||||
同一路径(如S-Curve):
|
||||
1. Pure Pursuit → 观察跟踪效果
|
||||
2. Stanley → 观察跟踪效果
|
||||
比较哪个更好
|
||||
```
|
||||
|
||||
### 序列4: 真实场景(5分钟)
|
||||
```
|
||||
1. Load CSV → smooth_path.csv
|
||||
2. Velocity = 1.0 m/s
|
||||
3. Pure Pursuit
|
||||
4. Generate → 观察完整跟踪
|
||||
```
|
||||
|
||||
## 参数建议
|
||||
|
||||
### 基础设置(推荐新手)
|
||||
```
|
||||
Wheelbase: 1.0 m
|
||||
Max Velocity: 1.0 m/s
|
||||
Max Steering: 45 deg
|
||||
Time Step: 0.1 s
|
||||
Horizon: 50 s
|
||||
Algorithm: Pure Pursuit
|
||||
```
|
||||
|
||||
### 高性能设置(追求速度)
|
||||
```
|
||||
Max Velocity: 2.0 m/s
|
||||
Horizon: 50 s
|
||||
Algorithm: Pure Pursuit
|
||||
```
|
||||
|
||||
### 高精度设置(追求精度)
|
||||
```
|
||||
Max Velocity: 0.5 m/s
|
||||
Time Step: 0.05 s
|
||||
Horizon: 80 s
|
||||
Algorithm: Stanley
|
||||
```
|
||||
|
||||
## 预期结果
|
||||
|
||||
### 视觉效果
|
||||
|
||||
**好的跟踪**(修复后):
|
||||
```
|
||||
- trajectory与path几乎重叠
|
||||
- 起点完美对齐
|
||||
- 弯道平滑通过
|
||||
- 无明显偏离
|
||||
```
|
||||
|
||||
**差的跟踪**(修复前):
|
||||
```
|
||||
- trajectory在path外侧
|
||||
- 起点有gap
|
||||
- 弯道切弯或偏离
|
||||
- 持续偏差
|
||||
```
|
||||
|
||||
### 数值指标
|
||||
|
||||
查看统计信息(Statistics面板):
|
||||
- Max Velocity: 应与设置一致
|
||||
- Control Steps: 约 horizon/dt 步
|
||||
- Path Points: 路径点数量
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 看不出明显改善?
|
||||
A: 检查这些:
|
||||
1. **确认重新编译**(exe时间戳应该是最新的)
|
||||
2. **尝试CSV路径**(最能体现初始状态修复)
|
||||
3. **对比算法**(Pure Pursuit vs Stanley)
|
||||
4. **调整速度**(试试2.0 m/s)
|
||||
|
||||
### Q: 仍有小偏差?
|
||||
A: 这是正常的!
|
||||
- 控制算法不是零误差
|
||||
- 典型误差0.1-0.3米是正常的
|
||||
- 重点是**没有累积偏差**
|
||||
|
||||
### Q: 高速时切弯?
|
||||
A: 这是Pure Pursuit的特性
|
||||
- 前视距离大 → 切弯
|
||||
- 解决:降低速度或换Stanley
|
||||
|
||||
### Q: 动画不流畅?
|
||||
A: 调整Time Step
|
||||
- 减小dt → 更流畅(如0.05s)
|
||||
- 增大dt → 更快(如0.2s)
|
||||
|
||||
## 关键改进验证
|
||||
|
||||
### ✓ 改进1: 初始对齐
|
||||
**如何验证**:
|
||||
- 放大起点区域
|
||||
- trajectory应从path起点开始,无偏移
|
||||
|
||||
### ✓ 改进2: 速度生效
|
||||
**如何验证**:
|
||||
- 设置Max Velocity = 2.0
|
||||
- 动画应明显比1.0时快
|
||||
|
||||
### ✓ 改进3: 自适应前视
|
||||
**如何验证**:
|
||||
- 低速(0.5): 转弯更紧,不切弯
|
||||
- 高速(2.0): 转弯平滑,提前预判
|
||||
|
||||
### ✓ 改进4: Stanley响应
|
||||
**如何验证**:
|
||||
- 选择Stanley算法
|
||||
- 横向偏差修正应很快
|
||||
|
||||
## 性能基准
|
||||
|
||||
**良好跟踪的标准**:
|
||||
- ✓ 起点对齐误差 < 0.1米
|
||||
- ✓ 平均横向误差 < 0.2米
|
||||
- ✓ 最大横向误差 < 0.5米
|
||||
- ✓ 无明显累积偏差
|
||||
- ✓ 视觉上紧密贴合
|
||||
|
||||
**如果达不到**:
|
||||
1. 确认已重新编译
|
||||
2. 降低速度至1.0 m/s
|
||||
3. 增加Horizon至80秒
|
||||
4. 尝试不同算法
|
||||
|
||||
## 报告问题
|
||||
|
||||
如果修复后仍有问题,请提供:
|
||||
1. 使用的路径类型
|
||||
2. 参数设置(速度、算法等)
|
||||
3. 观察到的偏差范围
|
||||
4. 截图或描述
|
||||
|
||||
## 成功指标
|
||||
|
||||
修复成功的标志:
|
||||
- ✅ 起点完美对齐
|
||||
- ✅ trajectory紧贴path
|
||||
- ✅ 速度设置生效
|
||||
- ✅ 无明显偏离
|
||||
- ✅ 平滑流畅
|
||||
|
||||
---
|
||||
|
||||
**开始测试吧!** 🚀
|
||||
|
||||
建议从"Straight Line"开始,逐步测试更复杂的路径。
|
||||
Reference in New Issue
Block a user