5.4 KiB
5.4 KiB
项目功能类调用关系说明 (Project Class Interaction Documentation)
本主要介绍 image_capture 项目核心功能类之间的调用关系、数据流向以及模块划分。
1. 核心模块概览 (Core Modules Overview)
系统主要由以下几个核心模块组成:
- GUI 模块 (
MainWindow): 程序的入口与界面显示,负责系统初始化。 - Vision 控制器 (
VisionController): 系统的核心中枢,协调通信与任务管理。 - 任务管理 (
TaskManager): 负责具体的业务逻辑执行、算法调度和结果处理。 - 设备管理 (
DeviceManager): 负责相机等硬件设备的统一管理(单例模式)。 - 通信模块 (
RedisCommunicator): 负责与外部系统(如 WMS)通过 Redis 交互。 - 算法模块 (
DetectionBase及其子类): 具体的图像处理算法。
2. 类调用关系图 (Class Interaction Diagram)
classDiagram
class MainWindow {
+VisionController vision_controller
+init()
}
class VisionController {
-shared_ptr<RedisCommunicator> redis_comm
-shared_ptr<TaskManager> task_manager
+start()
+stop()
-onTaskReceived()
}
class RedisCommunicator {
+startListening()
+writeDetectionResult()
+setTaskCallback()
}
class TaskManager {
-queue<RedisTaskData> task_queue
-map detectors
+handleTask()
-executeDetectionTask()
-getDetector(flag)
}
class DeviceManager {
<<Singleton>>
+getInstance()
+getLatestImages()
+startAll()
}
class DetectionBase {
<<Abstract>>
+execute(depth, color, ...)
}
class ConcreteDetection {
+execute()
}
MainWindow --> VisionController : 拥有并管理
VisionController --> RedisCommunicator : 管理 (监听/发送)
VisionController --> TaskManager : 分发任务
RedisCommunicator --> VisionController : 回调通知 (Callback)
TaskManager ..> DeviceManager : 获取图像数据 (Dependency)
TaskManager --> DetectionBase : 调用算法
DetectionBase <|-- ConcreteDetection : 继承
3. 详细调用流程 (Detailed Call Flow)
3.1 系统初始化与启动 (Initialization & Startup)
- Entry Point:
main.cpp创建QApplication并实例化MainWindow。 - MainWindow:
- 构造函数中初始化界面。
- 调用
DeviceManager::getInstance().initialize()扫描并初始化相机设备。 - 实例化
VisionController成员变量。 - 调用
VisionController::initialize(),配置 Redis 连接参数。 - 调用
VisionController::start()启动后台服务。
- VisionController:
- 在
start()中调用RedisCommunicator::startListening()开启监听线程。
- 在
3.2 任务触发与执行 (Task Trigger & Execution)
当 Redis 中 vision_task_flag 发生变化时,流程如下:
- RedisCommunicator:
- 监听线程检测到 Flag 变化。
- 通过回调函数
VisionController::onTaskReceived通知控制器。
- VisionController:
onTaskReceived将接收到的RedisTaskData传递给TaskManager::handleTask。
- TaskManager:
handleTask将任务推入内部的任务队列task_queue_。- 工作线程
taskExecutionThreadFunc从队列中取出任务。 - 获取图像: 调用
DeviceManager::getInstance().getLatestImages(...)获取当前最新的深度图和彩色图。 - 选择算法: 根据任务 Flag 调用
getDetector(flag)获取对应的算法实例(如PalletOffsetDetection)。 - 执行算法: 调用
detector->execute(depth_img, color_img, ...)进行计算。 - 结果封装: 将算法返回的数据填充到
DetectionResult结构体中。
3.3 结果处理 (Result Handling)
算法执行完成后:
- TaskManager:
- 调用
processResult(result)。 - 该函数会格式化结果为 JSON 字符串,并计算报警/警告状态。
- 调用
redis_result_comm_->writeDetectionResult(json)将结果写入 Redis。
- 调用
- RedisCommunicator:
- 执行 Redis SET 命令,将 JSON 数据写入指定的 Key。
4. 关键类说明 (Key Class Descriptions)
VisionController (src/vision/vision_controller.h)
- 职责: 作为系统的外观(Facade),对外提供统一的 start/stop 接口,对内协调 Redis 和 TaskManager。
- 特点: 它是 MainWindow 唯一直接交互的非 GUI 业务类。
DeviceManager (src/device/device_manager.h)
- 职责: 屏蔽底层相机 SDK(Percipio / MVS)的差异,提供统一的图像获取接口。
- 模式: 单例模式 (Singleton)。确保系统中只有一份硬件控制实例。
TaskManager (src/task/task_manager.h)
- 职责: 真正的“大脑”。负责任务的缓冲(队列)、图像获取、算法调度和结果回传。
- 并发: 拥有独立的执行线程,避免阻塞 Redis 监听线程或 GUI 线程。
RedisCommunicator (src/redis/redis_communicator.h)
- 职责: 封装 Redis 的底层 socket 操作,提供易用的读写接口和异步监听机制。
DetectionBase (src/algorithm/core/detection_base.h)
- 职责: 定义所有检测算法的统一接口
execute。 - 扩展: 新增算法只需继承此类并在
TaskManager中注册即可。
文档生成时间: 2025-12-29