7.9 KiB
7.9 KiB
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 构建项目:
mkdir build
cd build
cmake ..
make