Files
RCS-3000/docs/API.md
CaiXiang 7b6c956b6a initial
2025-11-27 15:20:21 +08:00

542 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 倍
- **kStanley**:增益参数,影响横向误差的响应速度
- **dt**:时间步长,建议 0.05-0.1 秒
- **desired_velocity**:期望速度,根据实际情况调整
### CAN 通信失败怎么办?
1. 检查硬件连接
2. 确认 ControlCAN.dll 在正确路径
3. 验证波特率设置
4. 检查 CAN 设备驱动
---
**最后更新**: 2025-11-27