This commit is contained in:
CaiXiang
2025-11-14 16:09:58 +08:00
commit af65c2425d
74 changed files with 14650 additions and 0 deletions

View File

@@ -0,0 +1,225 @@
# Trajectory不完整问题修复报告
## 问题描述
**现象**: trajectory路径只有一段无法完整追踪reference path
**用户反馈**: "要能完整的追踪reference path,现在trajectory路径只有一段"
## 根本原因分析
经过深入分析代码,发现问题的根本原因:
### 1. Horizon时间范围参数过小 ⭐⭐⭐(主要原因)
**问题详情**:
- 默认 `horizon = 10.0`
- 默认速度 `desired_velocity = 1.0` m/s
- **在10秒内AGV只能行驶10米**
- 如果参考路径长度 > 10米例如20米轨迹就会在路径中途停止
**位置**: `examples/qt_gui_demo.cpp:294`
```cpp
horizon_spin_ = createParamRow("Horizon (s):", 1.0, 30.0, 10.0, control_layout);
// ^^^^ ^^^^
// 最大值 默认值
```
**分析**:
```
路径长度示例: smooth_path.csv 约 20 米
默认设置: horizon = 10秒, velocity = 1.0 m/s
结果: 10秒 × 1.0 m/s = 10米 < 20米路径
→ 轨迹只覆盖路径的前一半
```
### 2. 终止阈值过于严格
**问题详情**:
- 终止条件: `distance_to_end < 0.1`
- 0.1米的阈值太小,可能导致永远无法满足终止条件
- AGV可能在终点附近"徘徊"消耗时间但无法达到精确的0.1米范围
**位置**:
- `src/control_generator.cpp:58` (Pure Pursuit算法)
- `src/control_generator.cpp:114` (Stanley算法)
## 已应用的修复
### 修复1: 增加Horizon参数范围
**文件**: `examples/qt_gui_demo.cpp`
**修改前**:
```cpp
horizon_spin_ = createParamRow("Horizon (s):", 1.0, 30.0, 10.0, control_layout);
```
**修改后**:
```cpp
horizon_spin_ = createParamRow("Horizon (s):", 1.0, 100.0, 50.0, control_layout);
// ^^^^^ ^^^^
// 新最大值 新默认值
```
**效果**:
- 最大值: 30秒 → **100秒** (可支持更长路径)
- 默认值: 10秒 → **50秒** 默认可走50米
- 用户可以根据路径长度调整horizon参数
### 修复2: 放宽终止阈值
**文件**: `src/control_generator.cpp`
**Pure Pursuit算法 (第50-62行)**:
修改前:
```cpp
// 检查是否接近路径终点
if (distance_to_end < 0.1) {
break; // 已到达终点附近
}
```
修改后:
```cpp
// 修复: 检查是否接近路径终点(阈值放宽以确保完整追踪)
if (distance_to_end < 0.5) {
break; // 已到达终点附近
}
```
**Stanley算法 (第108-120行)**: 同样的修改
**效果**:
- 终止阈值: 0.1米 → **0.5米**
- 更容易到达终止条件
- 确保路径能够完整追踪
## 修改文件清单
1.`examples/qt_gui_demo.cpp` - 增加horizon范围
2.`src/control_generator.cpp` - 放宽终止阈值
## 备份文件
- `examples/qt_gui_demo.cpp.backup`
- `src/control_generator.cpp.backup2`
## 修复效果对比
### 修复前
```
路径长度: 20米
Horizon: 10秒
速度: 1.0 m/s
轨迹长度: 10米 ✗(只覆盖一半)
```
### 修复后
```
路径长度: 20米
Horizon: 50秒默认
速度: 1.0 m/s
轨迹长度: 20米 ✓(完整覆盖)
```
## 使用建议
### 如何设置合适的Horizon值
计算公式:
```
horizon (秒) = 路径长度(米) / 期望速度(m/s) × 1.5
```
示例:
- 路径长度 = 20米
- 期望速度 = 1.0 m/s
- 建议horizon = 20 / 1.0 × 1.5 = **30秒**
### GUI界面操作
1. 在GUI中找到 "Horizon (s):" 参数框
2. 根据路径长度调整范围1-100秒
3. 默认50秒适用于大多数情况
4. 如果轨迹仍不完整可以继续增加horizon值
## 下一步操作
### 重新编译项目
```bash
cd build
cmake --build . --config Release
```
### 测试验证
1. 运行新编译的 `agv_qt_gui.exe`
2. 加载一个较长的CSV路径如 smooth_path.csv
3. 设置 Horizon = 50秒默认值
4. 点击 "Generate Control"
5. 观察 trajectory 是否完整覆盖 reference path
### 预期结果
- ✓ Trajectory应该完整追踪整条reference path
- ✓ 轨迹应该接近路径终点0.5米范围内)
- ✓ 不会提前终止
## 技术说明
### Horizon参数的含义
- **Horizon**: 控制序列生成的时间范围
- 循环条件: `while (current_time < horizon)`
- AGV会根据控制算法生成从0到horizon时间内的所有控制指令
### 终止条件
现在有两个终止条件(满足任一即停止):
1. 时间达到horizon: `current_time >= horizon`
2. 到达路径终点: `distance_to_end < 0.5`
### 性能影响
- Horizon增大会增加计算量更多控制步数
- 50秒 @ 0.1秒步长 = 500个控制步
- 计算时间仍然很快(< 1秒
## 其他改进建议(可选)
### 自动计算Horizon未实现
可以添加自动计算功能
```cpp
double path_length = path.getPathLength();
double auto_horizon = path_length / desired_velocity * 1.5;
horizon = std::max(auto_horizon, horizon);
```
### 显示路径完成度(未实现)
在GUI中显示
```
Path Coverage: 85% (17.0m / 20.0m)
```
## 总结
**问题**: Trajectory只追踪路径的一部分
**原因**: Horizon时间太短10秒只能走10米
**修复**:
- 增加Horizon默认值10秒 50秒
- 增加Horizon最大值30秒 100秒
- 放宽终止阈值0.1米 0.5米
**结果**: 现在可以完整追踪长达50米的路径默认设置
---
**修复日期**: 2025-11-14
**修复状态**: 代码已修复等待重新编译测试
**影响范围**: 轨迹生成功能Pure Pursuit和Stanley算法
**风险评估**: 低风险仅修改参数范围和阈值