172 lines
7.9 KiB
Markdown
172 lines
7.9 KiB
Markdown
# 2K0300智能车项目代码文档
|
|
|
|
## 项目概述
|
|
该项目是一个智能车控制系统,包含摄像头图像处理、电机控制、编码器反馈、PID 控制、帧缓冲区显示等功能。项目使用 C++ 编写,依赖 OpenCV 库进行图像处理,并通过 CMake 进行构建。
|
|
|
|
## 目录结构
|
|
- **CMakeLists.txt**: 项目的构建配置文件。
|
|
- **cross.cmake**: 交叉编译工具链配置文件。
|
|
- **src/**: 库文件目录,包含摄像头、电机控制、PID 控制等模块的实现。
|
|
- **lib/**: 库文件目录,包含摄像头、电机控制、PID 控制等模块的头文件。
|
|
- **main/**: 主程序目录。
|
|
- **xx_demo/**: 示例程序目录,包含多个演示程序。
|
|
|
|
---
|
|
|
|
## 主要模块介绍
|
|
|
|
### 1. 摄像头模块 (`camera.cpp`, `camera.h`)
|
|
摄像头模块负责初始化摄像头设备、捕获图像并进行处理。主要功能包括:
|
|
- **摄像头初始化**: 打开摄像头设备,设置分辨率、帧率等参数。
|
|
- **图像捕获**: 通过 OpenCV 捕获摄像头图像,并进行缩放、二值化等处理。
|
|
- **帧缓冲区显示**: 将处理后的图像显示到帧缓冲区设备(如 LCD 屏幕)。
|
|
- **图像保存**: 支持将捕获的图像保存为文件。
|
|
|
|
#### 关键函数:
|
|
- `CameraInit(uint8_t camera_id, double dest_fps, int width, int height)`: 初始化摄像头设备。
|
|
- `CameraHandler(void)`: 处理摄像头捕获的图像。
|
|
- `streamCapture(void)`: 持续捕获摄像头图像,存储到全局变量`cv::Mat pubframe`中,`std::mutex frameMutex`为互斥锁。
|
|
- `cameraDeInit(void)`: 释放摄像头资源。
|
|
|
|
---
|
|
|
|
### 2. 电机控制模块 (`MotorController.cpp`, `MotorController.h`)
|
|
电机控制模块负责控制智能车的电机,支持 PWM 调速和方向控制。主要功能包括:
|
|
- **电机初始化**: 初始化 PWM 控制器和 GPIO 引脚。
|
|
- **速度控制**: 通过 PID 控制器调节电机速度。
|
|
- **方向控制**: 控制电机的正反转。
|
|
|
|
#### 关键函数:
|
|
- `MotorController(int pwmchip, int pwmnum, int gpioNum, unsigned int period_ns, double kp, double ki, double kd, double targetSpeed, int encoder_pwmNum, int encoder_gpioNum, int encoder_dir_)`: 构造函数,初始化电机控制器,`encoder_dir_`取值为1/-1,在更新速度时自动乘算到编码器速度上。
|
|
- `updateSpeed(void)`: 从编码器更新当前速度。
|
|
- `updateTarget(int speed)`: 设置目标速度。
|
|
- `updateduty(double dutyCycle)`: 设置 PWM 占空比,为负值时反转。
|
|
|
|
---
|
|
|
|
### 3. PID 控制模块 (`PIDController.cpp`, `PIDController.h`)
|
|
PID 控制模块实现了位置式和增量式 PID 控制器,用于电机速度和舵机角度的精确控制。主要功能包括:
|
|
- **PID 参数设置**: 支持动态调整比例、积分、微分参数。
|
|
- **控制模式切换**: 支持位置式和增量式 PID 控制。
|
|
- **输出限幅**: 防止输出值超出设定范围。
|
|
- **积分限幅**:放置积分项超出设定范围。
|
|
|
|
#### 关键函数:
|
|
- `PIDController(double kp, double ki, double kd, double target, PIDMode mode, double output_limit, double integral_limit)`: 构造函数,初始化 PID 参数。
|
|
- `update(double measured_value)`: 输入测量值,更新 PID 控制器输出。
|
|
- `setTarget(double target)`:设置PID控制器目标值。
|
|
- `setPID(double kp, double ki, double kd)`: 设置 PID 参数。
|
|
- `setMode(PIDMode mode)`: 设置控制模式(位置式或增量式)。
|
|
|
|
---
|
|
|
|
### 4. 编码器模块 (`encoder.cpp`, `encoder.h`)
|
|
编码器模块用于读取电机编码器的脉冲信号,计算电机转速。主要功能包括:
|
|
- **编码器初始化**: 映射寄存器,初始化编码器设备。
|
|
- **脉冲计数**: 读取编码器脉冲信号,计算转速。
|
|
- **方向检测**: 通过 GPIO 读取电机方向。
|
|
|
|
#### 关键函数:
|
|
- `ENCODER(int pwmNum, int gpioNum)`: 构造函数,初始化编码器。
|
|
- `pulse_counter_update(void)`: 更新脉冲计数并计算转速(单位:rps)。
|
|
|
|
---
|
|
|
|
### 5. 帧缓冲区模块 (`frame_buffer.cpp`, `frame_buffer.h`)
|
|
帧缓冲区模块负责将 OpenCV 图像转换为 RGB565 格式并显示到帧缓冲区设备(如 LCD 屏幕)。主要功能包括:
|
|
- **图像格式转换**: 将 OpenCV 的 RGB888 图像转换为 RGB565 格式。
|
|
- **帧缓冲区写入**: 将转换后的图像写入帧缓冲区设备。
|
|
|
|
#### 关键函数:
|
|
- `convertMatToRGB565(const cv::Mat &frame, uint16_t *buffer, int width, int height)`: 将 OpenCV 图像转换为 RGB565 格式,写入到buffer中。
|
|
- `convertRGBToRGB565(uint8_t r, uint8_t g, uint8_t b)`: 将 RGB888 颜色值转换为 RGB565 格式。
|
|
|
|
---
|
|
|
|
### 6. GPIO 模块 (`GPIO.cpp`, `GPIO.h`)
|
|
GPIO 模块用于控制 GPIO 引脚,支持方向设置、值读取和写入。主要功能包括:
|
|
- **GPIO 初始化**: 导出 GPIO 引脚并设置方向。
|
|
- **值读写**: 读取或写入 GPIO 引脚的值。
|
|
|
|
#### 关键函数:
|
|
- `GPIO(int gpioNum)`: 构造函数,初始化 GPIO 引脚。
|
|
- `setDirection(const std::string &direction)`: 设置 GPIO 引脚方向。
|
|
- `setValue(bool value)`: 设置 GPIO 引脚值。
|
|
- `readValue(void)`: 读取 GPIO 引脚值。
|
|
|
|
---
|
|
|
|
### 7. PWM 控制模块 (`PwmController.cpp`, `PwmController.h`)
|
|
PWM 控制模块用于生成 PWM 信号,控制电机速度和舵机角度。主要功能包括:
|
|
- **PWM 初始化**: 初始化 PWM 设备。
|
|
- **周期和占空比设置**: 设置 PWM 信号的周期和占空比。
|
|
- **PWM 启用/禁用**: 控制 PWM 信号的输出。
|
|
|
|
#### 关键函数:
|
|
- `PwmController(int pwmchip, int pwmnum)`: 构造函数,初始化 PWM 设备。
|
|
- `setPeriod(unsigned int period_ns)`: 设置 PWM 周期。
|
|
- `setDutyCycle(unsigned int duty_cycle_ns)`: 设置 PWM 占空比。
|
|
- `enable(void)`: 启用 PWM 输出。
|
|
- `disable(void)`: 禁用 PWM 输出。
|
|
|
|
---
|
|
|
|
### 8. 图像处理模块 (`image_cv.cpp`, `image_cv.h`)
|
|
图像处理模块负责对摄像头捕获的图像进行处理,提取赛道边缘和中线。主要功能包括:
|
|
- **图像缩放**: 将图像缩放到指定大小。
|
|
- **二值化处理**: 将图像转换为二值图像。
|
|
- **边缘提取**: 提取赛道的左右边缘和中线。
|
|
|
|
#### 关键函数:
|
|
- `image_main(void)`: 主图像处理函数,执行缩放、二值化和边缘提取。
|
|
|
|
---
|
|
|
|
### 9. 全局变量模块 (`global.cpp`, `global.h`)
|
|
全局变量模块定义了项目中使用的全局变量和工具函数。主要功能包括:
|
|
- **文件读取**: 从文件中读取双精度值和标志。
|
|
- **全局变量**: 定义 PID 参数、目标速度等全局变量。
|
|
|
|
#### 关键函数:
|
|
- `readDoubleFromFile(const std::string &filename)`: 从文件中读取双精度值。
|
|
- `readFlag(const std::string &filename)`: 从文件中读取标志。
|
|
|
|
---
|
|
|
|
### 10. 定时器模块 (`Timer.cpp`, `Timer.h`)
|
|
定时器模块用于创建定时任务,定期执行指定函数。主要功能包括:
|
|
- **定时任务创建**: 创建定时任务并启动。
|
|
- **定时任务停止**: 停止定时任务。
|
|
|
|
#### 关键函数:
|
|
- `Timer(int interval_ms, std::function<void()> task)`: 构造函数,初始化定时器。
|
|
- `start(void)`: 启动定时任务。
|
|
- `stop(void)`: 停止定时任务。
|
|
|
|
---
|
|
|
|
## 示例程序
|
|
|
|
### 1. 编码器测试程序 (`encoder_demo.cpp`)
|
|
该程序用于测试编码器模块,读取编码器脉冲信号并输出转速。
|
|
|
|
### 2. 帧缓冲区测试程序 (`framebuffer_demo.cpp`)
|
|
该程序用于测试帧缓冲区模块,绘制图形并显示到帧缓冲区设备。
|
|
|
|
### 3. OpenCV 测试程序 (`opencv_demo1.cpp`, `opencv_demo2.cpp`, `opencv_demo3.cpp`)
|
|
这些程序用于测试 OpenCV 图像处理功能,分别为显示摄像头图像、显示旋转立方体、目标匹配。
|
|
- `opencv_demo3.cpp`在运行时依赖`opencv/share/opencv4/haarcascades/haarcascade_frontalface_default.xml`,需要在`opencv`文件夹同一目录下运行。
|
|
|
|
### 4. 遥控车演示程序 (`demo1.cpp`)
|
|
该程序通过键盘控制智能车的运动,支持前进、后退、左转、右转。
|
|
|
|
---
|
|
|
|
## 构建项目
|
|
使用 CMake 构建项目:
|
|
```bash
|
|
mkdir build
|
|
cd build
|
|
cmake ..
|
|
make
|
|
``` |