# 平滑路径生成器使用说明

## 📁 文件位置

- **源代码**: `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
