Files
agv-control-slam/docs/guides/SMOOTH_PATH_GENERATOR_README.md
CaiXiang af65c2425d initial
2025-11-14 16:09:58 +08:00

7.6 KiB
Raw Blame History

平滑路径生成器使用说明

📁 文件位置

  • 源代码: examples/generate_smooth_path.cpp
  • 可执行文件: build/Debug/generate_smooth_path.exebuild/Release/generate_smooth_path.exe

🚀 快速开始

1. 编译程序

# 进入 build 目录
cd build

# 编译 Debug 版本
cmake --build . --target generate_smooth_path --config Debug

# 或编译 Release 版本
cmake --build . --target generate_smooth_path --config Release

2. 运行程序

# 运行 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() - 生成圆弧路径

SmoothPathGenerator::generateCircleArc(
    "output.csv",     // 输出文件名
    5.0, 0.0,        // 圆心坐标 (center_x, center_y)
    5.0,             // 半径
    M_PI, M_PI/2,    // 起始角度和终止角度(弧度)
    150              // 路径点数量
);

2. generateSCurve() - 生成S型曲线

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() - 生成样条曲线

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() - 生成复杂路径

// 自动生成一个包含10个关键点的复杂路径
SmoothPathGenerator::generateComplexPath("complex.csv", 300);

5. generateLoop() - 生成环形路径

SmoothPathGenerator::generateLoop(
    "loop.csv",      // 输出文件名
    5.0,             // 半径
    300              // 路径点数量
);

6. generateFigure8() - 生成8字形路径

SmoothPathGenerator::generateFigure8(
    "figure8.csv",   // 输出文件名
    4.0,             // 8字大小
    400              // 路径点数量
);

🎯 自定义使用示例

示例1创建自己的平滑路径

#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在代码中调用生成器

#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批量生成多条路径

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 程序:

    ./build/Debug/agv_qt_gui.exe
    
  2. 在界面中选择 "Path Type""Load from CSV"

  3. 在文件对话框中选择生成的任意 CSV 文件

  4. 点击 "Generate Control" 查看效果

📊 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/ 目录下。

建议运行时切换到项目根目录:

cd C:/work/AGV/AGV运动规划/agv_path_tracking
./build/Debug/generate_smooth_path.exe

Q4: 如何只生成 smooth_path.csv

修改 main() 函数,只保留需要的生成代码,或者创建自己的简化版本。

📝 完整调用示例

#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 类来添加更多路径类型:

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);
    }
};

📖 相关文档

验证生成结果

使用 Python 可视化(如果安装了 matplotlib

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