initial
This commit is contained in:
541
docs/API.md
Normal file
541
docs/API.md
Normal file
@@ -0,0 +1,541 @@
|
||||
# API 参考手册
|
||||
|
||||
本文档提供 AGV 路径跟踪与控制系统的详细 API 说明。
|
||||
|
||||
## 目录
|
||||
|
||||
- [核心类](#核心类)
|
||||
- [AGVModel](#agvmodel)
|
||||
- [PathCurve](#pathcurve)
|
||||
- [PathTracker](#pathtracker)
|
||||
- [ControlGenerator](#controlgenerator)
|
||||
- [CAN 通信](#can-通信)
|
||||
- [CurtisMotorController](#curtismotorcontroller)
|
||||
- [CANController](#cancontroller)
|
||||
|
||||
---
|
||||
|
||||
## 核心类
|
||||
|
||||
### AGVModel
|
||||
|
||||
AGV 运动学模型类,实现阿克曼转向模型。
|
||||
|
||||
#### 构造函数
|
||||
|
||||
```cpp
|
||||
AGVModel(double wheelbase, double max_steering_angle)
|
||||
```
|
||||
|
||||
**参数**:
|
||||
- `wheelbase`: 轴距(米)
|
||||
- `max_steering_angle`: 最大转向角(弧度)
|
||||
|
||||
#### 主要方法
|
||||
|
||||
##### setState
|
||||
|
||||
```cpp
|
||||
void setState(const State& state)
|
||||
```
|
||||
|
||||
设置 AGV 当前状态。
|
||||
|
||||
**参数**:
|
||||
- `state`: 包含 x, y, theta, v 的状态结构体
|
||||
|
||||
##### step
|
||||
|
||||
```cpp
|
||||
State step(double v, double delta, double dt) const
|
||||
```
|
||||
|
||||
执行一步运动学仿真。
|
||||
|
||||
**参数**:
|
||||
- `v`: 速度(m/s)
|
||||
- `delta`: 转向角(弧度)
|
||||
- `dt`: 时间步长(秒)
|
||||
|
||||
**返回值**:新的状态
|
||||
|
||||
#### 状态结构
|
||||
|
||||
```cpp
|
||||
struct State {
|
||||
double x; // x 坐标(米)
|
||||
double y; // y 坐标(米)
|
||||
double theta; // 航向角(弧度)
|
||||
double v; // 速度(m/s)
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### PathCurve
|
||||
|
||||
路径曲线类,表示 AGV 需要跟踪的参考路径。
|
||||
|
||||
#### 静态工厂方法
|
||||
|
||||
##### generateCircularPath
|
||||
|
||||
```cpp
|
||||
static PathCurve generateCircularPath(double radius, int num_points)
|
||||
```
|
||||
|
||||
生成圆形路径。
|
||||
|
||||
**参数**:
|
||||
- `radius`: 半径(米)
|
||||
- `num_points`: 路径点数量
|
||||
|
||||
**返回值**:PathCurve 对象
|
||||
|
||||
##### generateStraightPath
|
||||
|
||||
```cpp
|
||||
static PathCurve generateStraightPath(
|
||||
double start_x, double start_y,
|
||||
double end_x, double end_y,
|
||||
int num_points
|
||||
)
|
||||
```
|
||||
|
||||
生成直线路径。
|
||||
|
||||
##### loadFromCSV
|
||||
|
||||
```cpp
|
||||
static PathCurve loadFromCSV(const std::string& filename)
|
||||
```
|
||||
|
||||
从 CSV 文件加载自定义路径。
|
||||
|
||||
**CSV 格式**:
|
||||
```csv
|
||||
x,y
|
||||
0.0,0.0
|
||||
1.0,0.5
|
||||
2.0,1.0
|
||||
```
|
||||
|
||||
#### 主要方法
|
||||
|
||||
##### getPathPoints
|
||||
|
||||
```cpp
|
||||
const std::vector<PathPoint>& getPathPoints() const
|
||||
```
|
||||
|
||||
获取路径点列表。
|
||||
|
||||
##### getClosestPoint
|
||||
|
||||
```cpp
|
||||
PathPoint getClosestPoint(double x, double y, size_t& index) const
|
||||
```
|
||||
|
||||
获取距离给定位置最近的路径点。
|
||||
|
||||
**参数**:
|
||||
- `x, y`: 查询位置
|
||||
- `index`: 输出参数,最近点的索引
|
||||
|
||||
**返回值**:最近的路径点
|
||||
|
||||
---
|
||||
|
||||
### PathTracker
|
||||
|
||||
路径跟踪器类,整合模型、路径和控制算法。
|
||||
|
||||
#### 构造函数
|
||||
|
||||
```cpp
|
||||
explicit PathTracker(const AGVModel& model)
|
||||
```
|
||||
|
||||
**参数**:
|
||||
- `model`: AGV 运动学模型
|
||||
|
||||
#### 主要方法
|
||||
|
||||
##### setReferencePath
|
||||
|
||||
```cpp
|
||||
void setReferencePath(const PathCurve& path)
|
||||
```
|
||||
|
||||
设置参考路径。
|
||||
|
||||
##### setInitialState
|
||||
|
||||
```cpp
|
||||
void setInitialState(const AGVModel::State& state)
|
||||
```
|
||||
|
||||
设置初始状态。
|
||||
|
||||
##### generateControlSequence
|
||||
|
||||
```cpp
|
||||
bool generateControlSequence(
|
||||
const std::string& algorithm = "pure_pursuit",
|
||||
double dt = 0.1,
|
||||
double horizon = 10.0,
|
||||
double desired_velocity = 1.0
|
||||
)
|
||||
```
|
||||
|
||||
生成控制序列。
|
||||
|
||||
**参数**:
|
||||
- `algorithm`: 算法类型("pure_pursuit" 或 "stanley")
|
||||
- `dt`: 时间步长(秒)
|
||||
- `horizon`: 时域(秒)
|
||||
- `desired_velocity`: 期望速度(m/s)
|
||||
|
||||
**返回值**:成功返回 true
|
||||
|
||||
##### getControlSequence
|
||||
|
||||
```cpp
|
||||
const ControlSequence& getControlSequence() const
|
||||
```
|
||||
|
||||
获取生成的控制序列。
|
||||
|
||||
##### exportToCSV
|
||||
|
||||
```cpp
|
||||
void exportToCSV(const std::string& filename) const
|
||||
```
|
||||
|
||||
导出跟踪结果到 CSV 文件。
|
||||
|
||||
---
|
||||
|
||||
### ControlGenerator
|
||||
|
||||
控制生成器类,实现不同的路径跟踪算法。
|
||||
|
||||
#### 主要方法
|
||||
|
||||
##### purePursuit
|
||||
|
||||
```cpp
|
||||
static double purePursuit(
|
||||
const AGVModel::State& state,
|
||||
const PathCurve& path,
|
||||
double lookahead_distance
|
||||
)
|
||||
```
|
||||
|
||||
Pure Pursuit 算法。
|
||||
|
||||
**参数**:
|
||||
- `state`: 当前状态
|
||||
- `path`: 参考路径
|
||||
- `lookahead_distance`: 前视距离(米)
|
||||
|
||||
**返回值**:转向角(弧度)
|
||||
|
||||
##### stanley
|
||||
|
||||
```cpp
|
||||
static double stanley(
|
||||
const AGVModel::State& state,
|
||||
const PathCurve& path,
|
||||
double k = 1.0
|
||||
)
|
||||
```
|
||||
|
||||
Stanley 算法。
|
||||
|
||||
**参数**:
|
||||
- `state`: 当前状态
|
||||
- `path`: 参考路径
|
||||
- `k`: 增益参数
|
||||
|
||||
**返回值**:转向角(弧度)
|
||||
|
||||
---
|
||||
|
||||
## CAN 通信
|
||||
|
||||
### CurtisMotorController
|
||||
|
||||
Curtis 电机控制器类,通过 CAN 通信控制电机。
|
||||
|
||||
#### 主要方法
|
||||
|
||||
##### initialize
|
||||
|
||||
```cpp
|
||||
bool initialize(
|
||||
int device_type,
|
||||
int device_index,
|
||||
int can_index,
|
||||
int baudrate
|
||||
)
|
||||
```
|
||||
|
||||
初始化 CAN 设备。
|
||||
|
||||
**参数**:
|
||||
- `device_type`: 设备类型(通常为 0)
|
||||
- `device_index`: 设备索引(通常为 0)
|
||||
- `can_index`: CAN 通道索引(0 或 1)
|
||||
- `baudrate`: 波特率(如 500000 表示 500kbps)
|
||||
|
||||
**返回值**:成功返回 true
|
||||
|
||||
##### forward
|
||||
|
||||
```cpp
|
||||
void forward(int speed_percentage)
|
||||
```
|
||||
|
||||
前进控制。
|
||||
|
||||
**参数**:
|
||||
- `speed_percentage`: 速度百分比(0-100)
|
||||
|
||||
##### backward
|
||||
|
||||
```cpp
|
||||
void backward(int speed_percentage)
|
||||
```
|
||||
|
||||
后退控制。
|
||||
|
||||
**参数**:
|
||||
- `speed_percentage`: 速度百分比(0-100)
|
||||
|
||||
##### turnLeft
|
||||
|
||||
```cpp
|
||||
void turnLeft(int angle_percentage)
|
||||
```
|
||||
|
||||
左转控制。
|
||||
|
||||
**参数**:
|
||||
- `angle_percentage`: 转向角百分比(0-100)
|
||||
|
||||
##### turnRight
|
||||
|
||||
```cpp
|
||||
void turnRight(int angle_percentage)
|
||||
```
|
||||
|
||||
右转控制。
|
||||
|
||||
**参数**:
|
||||
- `angle_percentage`: 转向角百分比(0-100)
|
||||
|
||||
##### brake
|
||||
|
||||
```cpp
|
||||
void brake()
|
||||
```
|
||||
|
||||
刹车(停止所有运动)。
|
||||
|
||||
##### emergencyStop
|
||||
|
||||
```cpp
|
||||
void emergencyStop()
|
||||
```
|
||||
|
||||
紧急停止。
|
||||
|
||||
##### cleanup
|
||||
|
||||
```cpp
|
||||
void cleanup()
|
||||
```
|
||||
|
||||
清理并关闭 CAN 设备。
|
||||
|
||||
---
|
||||
|
||||
### CANController
|
||||
|
||||
底层 CAN 控制器类,提供基本的 CAN 通信功能。
|
||||
|
||||
#### 主要方法
|
||||
|
||||
##### Initialize
|
||||
|
||||
```cpp
|
||||
bool Initialize(int device_type, int device_index, int can_index)
|
||||
```
|
||||
|
||||
初始化 CAN 设备。
|
||||
|
||||
##### SendStandardFrame
|
||||
|
||||
```cpp
|
||||
bool SendStandardFrame(unsigned int id, const BYTE* data, int len)
|
||||
```
|
||||
|
||||
发送标准帧。
|
||||
|
||||
**参数**:
|
||||
- `id`: CAN ID
|
||||
- `data`: 数据缓冲区
|
||||
- `len`: 数据长度(0-8)
|
||||
|
||||
##### Receive
|
||||
|
||||
```cpp
|
||||
int Receive(std::vector<VCI_CAN_OBJ>& frames, int timeout_ms = 100)
|
||||
```
|
||||
|
||||
接收 CAN 帧。
|
||||
|
||||
**参数**:
|
||||
- `frames`: 接收缓冲区
|
||||
- `timeout_ms`: 超时时间(毫秒)
|
||||
|
||||
**返回值**:接收到的帧数量
|
||||
|
||||
---
|
||||
|
||||
## 数据结构
|
||||
|
||||
### ControlSequence
|
||||
|
||||
控制序列结构,存储路径跟踪结果。
|
||||
|
||||
```cpp
|
||||
struct ControlSequence {
|
||||
std::vector<AGVModel::State> predicted_states; // 预测状态序列
|
||||
std::vector<double> control_velocities; // 控制速度序列
|
||||
std::vector<double> control_steering; // 控制转向角序列
|
||||
std::vector<double> tracking_errors; // 跟踪误差序列
|
||||
}
|
||||
```
|
||||
|
||||
### PathPoint
|
||||
|
||||
路径点结构。
|
||||
|
||||
```cpp
|
||||
struct PathPoint {
|
||||
double x; // x 坐标
|
||||
double y; // y 坐标
|
||||
double theta; // 切线方向
|
||||
double kappa; // 曲率
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 完整的路径跟踪流程
|
||||
|
||||
```cpp
|
||||
#include "path_tracker.h"
|
||||
#include <iostream>
|
||||
|
||||
int main() {
|
||||
// 1. 创建 AGV 模型
|
||||
AGVModel model(2.0, 1.0);
|
||||
|
||||
// 2. 创建路径跟踪器
|
||||
PathTracker tracker(model);
|
||||
|
||||
// 3. 生成或加载路径
|
||||
PathCurve path = PathCurve::generateCircularPath(5.0, 100);
|
||||
// 或从文件加载
|
||||
// PathCurve path = PathCurve::loadFromCSV("path.csv");
|
||||
|
||||
tracker.setReferencePath(path);
|
||||
|
||||
// 4. 设置初始状态
|
||||
AGVModel::State initial(0, -5, M_PI/2, 0);
|
||||
tracker.setInitialState(initial);
|
||||
|
||||
// 5. 生成控制序列
|
||||
if (!tracker.generateControlSequence("pure_pursuit", 0.1, 10.0, 1.0)) {
|
||||
std::cerr << "Failed to generate control sequence" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 6. 导出结果
|
||||
tracker.exportToCSV("output.csv");
|
||||
|
||||
// 7. 获取结果用于分析
|
||||
const auto& sequence = tracker.getControlSequence();
|
||||
std::cout << "Generated " << sequence.predicted_states.size()
|
||||
<< " control steps" << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### Curtis 电机控制示例
|
||||
|
||||
```cpp
|
||||
#include "can/CurtisMotorController.h"
|
||||
#include <iostream>
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
|
||||
int main() {
|
||||
CurtisMotorController controller;
|
||||
|
||||
// 初始化
|
||||
if (!controller.initialize(0, 0, 0, 500000)) {
|
||||
std::cerr << "Failed to initialize CAN" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 前进
|
||||
controller.forward(30);
|
||||
std::this_thread::sleep_for(std::chrono::seconds(2));
|
||||
|
||||
// 左转
|
||||
controller.turnLeft(50);
|
||||
std::this_thread::sleep_for(std::chrono::seconds(1));
|
||||
|
||||
// 停止
|
||||
controller.brake();
|
||||
|
||||
// 清理
|
||||
controller.cleanup();
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 如何选择合适的算法?
|
||||
|
||||
- **Pure Pursuit**:适合高速、平滑路径跟踪
|
||||
- **Stanley**:适合低速、高精度路径跟踪
|
||||
|
||||
### 如何调整参数?
|
||||
|
||||
- **lookahead_distance**:前视距离,通常为速度的 1-2 倍
|
||||
- **k(Stanley)**:增益参数,影响横向误差的响应速度
|
||||
- **dt**:时间步长,建议 0.05-0.1 秒
|
||||
- **desired_velocity**:期望速度,根据实际情况调整
|
||||
|
||||
### CAN 通信失败怎么办?
|
||||
|
||||
1. 检查硬件连接
|
||||
2. 确认 ControlCAN.dll 在正确路径
|
||||
3. 验证波特率设置
|
||||
4. 检查 CAN 设备驱动
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2025-11-27
|
||||
Reference in New Issue
Block a user