Files
Loongson_2k0300_SmartCar/2K0300智能车项目代码文档.md
T

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