Files
pallet_storage_detection_sy…/docs/project_architecture.md
2026-01-04 16:51:58 +08:00

307 lines
11 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.
# 项目架构及调用关系文档
## 1. 系统概述
本系统是一个基于立体视觉的仓库巡检图像采集与处理系统。它集成了图漾(Percipio)工业相机SDK和海康(MVS)相机SDK进行多相机图像采集使用OpenCV进行图像处理Qt6作为用户界面框架并通过Redis与外部系统如机器人控制系统进行通信和任务调度。
系统主要功能包括:
- 多相机同步采集(深度图与彩色图)
- 实时图像预览与状态监控
- 基于Redis的任务触发与结果上报
- 多种检测算法(货位占用、横梁/立柱变形、托盘偏差等)
- 系统配置管理与日志记录
## 2. 目录结构说明
```text
scripts/ # 批处理脚本 (数据库配置、模拟任务等)
image_capture/
└── src/
├── algorithm/ # 核心算法库
│ ├── core/ # 算法基类与结果定义 (DetectionBase, DetectionResult)
│ ├── detections/ # 具体检测算法实现 (SlotOccupancy, BeamRackDeflection等)
│ └── utils/ # 图像处理工具 (ImageProcessor)
├── camera/ # 相机驱动层
│ ├── ty_multi_camera_capture.cpp/h # 图漾(Percipio) 3D相机封装
│ └── mvs_multi_camera_capture.cpp/h # 海康(MVS) 2D相机封装
├── common/ # 通用设施
│ ├── config_manager.cpp/h # 配置管理单例
│ ├── log_manager.cpp/h # 日志管理
│ └── log_streambuf.h # std::cout重定向到GUI
├── device/ # 硬件设备管理
│ └── device_manager.cpp/h # 相机设备单例管理
├── gui/ # 用户界面
│ └── mainwindow.cpp/h/ui # 主窗口实现 (集成Settings Tab)
├── redis/ # 通信模块
│ └── redis_communicator.cpp/h # Redis客户端封装
├── task/ # 任务调度
│ └── task_manager.cpp/h # 任务分发与执行逻辑
├── vision/ # 系统控制
│ └── vision_controller.cpp/h # 顶层控制器协调Redis与Task
├── common_types.h # 通用数据类型 (Point3D, CameraIntrinsics)
└── main.cpp # 程序入口
```
## 3. 核心架构设计
系统采用分层架构设计,各模块职责明确:
- **展示层 (GUI)**: `MainWindow` 负责界面显示、手动控制、参数配置及日志展示。
- **控制层 (Controller)**: `VisionController` 作为系统级控制器,负责服务的启动/停止,协调 `RedisCommunicator``TaskManager`
- **业务逻辑层 (Task/Manager)**: `TaskManager` 解析任务指令,`DeviceManager` 管理硬件资源。
- **算法层 (Algorithm)**: 提供具体的视觉检测功能,继承自 `DetectionBase`
- **驱动层 (Driver)**: `CameraCapture` 封装底层SDK调用。
### 系统分层架构图
```mermaid
graph TB
subgraph Presentation ["展示层 (Presentation)"]
direction TB
GUI[MainWindow]
end
subgraph Control ["控制层 (Control)"]
VC[VisionController]
end
subgraph Business ["业务逻辑层 (Business Logic)"]
direction TB
TM[TaskManager]
DM[DeviceManager]
end
subgraph Algorithm ["算法层 (Algorithm)"]
direction TB
DB[DetectionBase]
Det[Concrete Detections<br/>(Slot, Beam, etc.)]
end
subgraph Infrastructure ["基础设施层 (Infrastructure)"]
direction TB
Cam[CameraCapture]
Redis[RedisCommunicator]
Conf[ConfigManager]
end
%% 层级调用关系
GUI --> VC
VC --> TM
VC --> Redis
TM --> DM
TM --> DB
DB <|-- Det
DM --> Cam
DM --> MVS[MvsMultiCameraCapture]
%% 跨层辅助调用
GUI -.-> Conf
TM -.-> Conf
style Presentation fill:#e1f5fe,stroke:#01579b
style Control fill:#e8f5e9,stroke:#2e7d32
style Business fill:#fff3e0,stroke:#ef6c00
style Algorithm fill:#f3e5f5,stroke:#7b1fa2
style Infrastructure fill:#eceff1,stroke:#455a64
```
### 系统类图
```mermaid
classDiagram
class MainWindow {
+VisionController visionController_
+updateImage()
+onSaveSettings()
}
class VisionController {
+RedisCommunicator redis_comm_
+TaskManager task_manager_
+start()
+stop()
}
class DeviceManager {
<<Singleton>>
+CameraCapture camera_capture_
+initialize()
+computePointCloud()
}
class TaskManager {
+executeTask()
-algorithms_ map
}
class CameraCapture {
+getLatestImages()
+computePointCloud()
+start()
-captureThreadFunc()
}
class RedisCommunicator {
+connect()
+listenForTasks()
+publishResult()
}
class ConfigManager {
<<Singleton>>
+loadConfig()
+saveConfig()
}
MainWindow --> VisionController : 只有与管理
VisionController --> RedisCommunicator : 使用
VisionController --> TaskManager : 使用
VisionController ..> DeviceManager : 依赖(全局)
TaskManager ..> DeviceManager : 获取图像/点云
DeviceManager --> CameraCapture : 拥有
MainWindow ..> ConfigManager : 读写配置
TaskManager ..> ConfigManager : 读取参数
```
## 4. 关键模块详解
### 4.1 GUI与主入口 (MainWindow)
- **职责**: 程序的主要入口负责UI渲染、用户交互、参数配置及系统状态反馈。
- **调用关系**:
- 初始化时创建 `VisionController`
- 通过 `QTimer` 定期从 `DeviceManager` 获取图像更新界面。
- **Settings Tab**: 直接在 `MainWindow` 中实现,提供 "Beam/Rack Deflection", "Pallet Offset" 等算法参数配置界面。
- 通过 `ConfigManager` 加载和保存配置项包括ROI点坐标和各类阈值。
### 4.2 视觉控制器 (VisionController)
- **职责**: 系统的"大脑"不依赖于GUI运行设计上支持无头模式
- **流程**:
1. `initialize()`: 连接Redis。
2. `start()`: 启动Redis监听线程。
3. `onTaskReceived()`: 当Redis收到任务时转发给 `TaskManager`
### 4.3 任务管理 (TaskManager)
- **职责**: 解析Redis下发的JSON指令选择合适的算法执行。
- **工作流**:
1. 接收任务ID和参数。
2.`DeviceManager` 获取当前最新的一帧图像(深度+彩色)。
3. **点云生成**: 对于需要3D数据的任务Flag 2/3调用 `DeviceManager::computePointCloud()` 生成点云。
4. 根据任务类型实例化或调用相应的 `DetectionBase` 子类。
5. 执行 `detect()`,传入图像和点云数据。
6. 将结果打包为JSON通过回调或直接通过 `RedisCommunicator` 返回。
### 4.4 设备管理 (DeviceManager)
- **职责**: 硬件资源的全局访问点(单例模式)。
- **封装**: 内部持有 `CameraCapture` 实例,确保相机资源全生命周期只被初始化一次。
- **功能**:
- 提供线程安全的图像获取接口 `getLatestImages()`
- 提供点云计算接口 `computePointCloud()`利用SDK内部参数生成高精度点云。
### 4.5 相机驱动 (CameraCapture)
- **实现**: `ty_multi_camera_capture.cpp`
- **机制**:
- 为每个相机开启独立采集线程。
- 维护内部帧缓冲区。
- 将SDK的 `TYImage` 转换为 OpenCV `cv::Mat`
- **点云优化**: 内部集成 `TYMapDepthImageToPoint3d`利用相机标定参数直接计算3D点云消除畸变。
### 4.6 配置管理 (ConfigManager)
- **职责**: 管理 `config.json` 文件,集中管理系统配置。
- **管理内容**:
- Redis 连接信息。
- 算法阈值 (Beam/Rack, Pallet Offset 等)。
- ROI (Region of Interest) 坐标点。
- 系统通用参数 (最小/最大深度等)。
- **特性**: 单例模式,支持热加载(部分参数)和持久化保存。程序启动时由 `MainWindow` 加载确保算法使用持久化的用户设置。GUI中的Settings Tab直接操作此模块。
## 5. 系统执行与数据流
### 5.1 初始化流程
1. `main()` 启动 `QApplication`
2. `MainWindow` 构造:
- 初始化UI。
- **调用 `ConfigManager::getInstance().loadConfig()` 加载本地配置。**
- 调用 `DeviceManager::getInstance().initialize()` 初始化相机。
- 创建并初始化 `VisionController`(连接 Redis但暂不启动监听
- 启动定时器调用 `updateImage()` 刷新界面显示。
3. 启动设备采集:调用 `DeviceManager::startAll()`
4. 设备启动成功后再调用 `VisionController::start()` 开启 Redis 监听,确保任务到来时设备已就绪。
### 5.2 自动任务执行流 (Redis触发)
```mermaid
sequenceDiagram
participant Redis
participant RC as RedisCommunicator
participant VC as VisionController
participant TM as TaskManager
participant DM as DeviceManager
participant Algo as DetectionAlgorithm
Redis->>RC: Publish Task (JSON)
RC->>VC: onTaskReceived(data)
VC->>TM: executeTask(data)
activate TM
TM->>DM: getLatestImages()
DM-->>TM: depth_img, color_img
TM->>DM: computePointCloud(depth)
DM-->>TM: point_cloud (vector<Point3D>)
TM->>Algo: execute(images, point_cloud)
activate Algo
Algo-->>TM: DetectionResult
deactivate Algo
TM->>TM: processResult()
TM->>RC: writeString(key, value)
RC->>Redis: Set Key-Value
deactivate TM
```
1. **外部触发**: Redis 发布任务消息。
2. **接收**: `RedisCommunicator` 监听到消息,触发回调。
3. **调度**: `VisionController` 调用 `TaskManager::executeTask()`
4. **获取数据**: `TaskManager``DeviceManager` 获取最新帧。
5. **算法处理**: 调用相应算法(如 `SlotOccupancyDetection::detect`)。
6. **结果反馈**: 结果封装成JSON通过 `RedisCommunicator` 写入Redis结果队列。
7. **任务复位**: 结果写入完成后,将 `vision_task_flag``0``vision_task_side`/`vision_task_time` 置空,避免程序重启后被旧任务自动触发。
### 5.3 实时监控执行流 (GUI)
```mermaid
sequenceDiagram
participant Timer as QTimer
participant MainWin as MainWindow
participant DM as DeviceManager
Timer->>MainWin: timeout()
activate MainWin
MainWin->>DM: getLatestImages()
DM-->>MainWin: depth_img, color_img
MainWin->>MainWin: Convert to QImage
MainWin->>MainWin: update QLabel
deactivate MainWin
```
1. **定时刷新**: `MainWindow``QTimer` 触发 `updateImage()`
2. **数据拉取**: 调用 `DeviceManager::getInstance().getLatestImages()`
3. **渲染**: 将OpenCV Mat 转换为 QImage 并显示在 `QLabel` 上。
- 深度图进行伪彩色处理以便观察。
- 自适应窗口大小缩放。
## 6. 异常处理与日志
- **日志**: 使用 `LogManager``spdlog` (如果集成) 或标准输出。
- **重定向**: `LogStreamBuf``std::cout/cerr` 重定向到GUI的日志窗口方便现场调试。
- **错误恢复**: 相机掉线重连机制(在驱动层实现或计划中)。
## 7. 编译与构建
- **工具**: CMake
- **依赖**: Qt6, OpenCV 4.x, Percipio SDK, (Redis库通常被封装或作为源码包含)
- **平台**: Windows (MSVC/MinGW)