7.6 KiB
7.6 KiB
平滑路径生成器使用说明
📁 文件位置
- 源代码:
examples/generate_smooth_path.cpp - 可执行文件:
build/Debug/generate_smooth_path.exe或build/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中使用
-
运行 Qt GUI 程序:
./build/Debug/agv_qt_gui.exe -
在界面中选择 "Path Type" → "Load from CSV"
-
在文件对话框中选择生成的任意 CSV 文件
-
点击 "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