拷贝托盘库系统架构

This commit is contained in:
qupengwei
2026-01-06 10:49:45 +08:00
parent 893a24af55
commit 17d96c61c4
107 changed files with 35274 additions and 0 deletions

View File

@@ -0,0 +1,221 @@
# CMake 配置文档
本文档总结了 `image_capture` 项目的 CMake 构建系统配置。
---
## 目录结构
```
image_capture/
├── CMakeLists.txt # 主构建配置文件
└── cmake/ # CMake 模块目录
├── CompilerOptions.cmake # 编译器选项配置
├── Dependencies.cmake # 外部依赖管理
└── PercipioSDK.cmake # 相机 SDK 配置
```
---
## 主配置文件:[CMakeLists.txt](file:///d:/Git/stereo_warehouse_inspection/image_capture/CMakeLists.txt)
### 基本信息
- **CMake 最低版本**: 3.10
- **项目名称**: `image_capture`
- **编程语言**: C++
- **构建生成器**: Visual Studio 17 2022 (MSVC)
### 输出目录
```cmake
CMAKE_RUNTIME_OUTPUT_DIRECTORY = ${CMAKE_BINARY_DIR}/bin/Release # 可执行文件
CMAKE_LIBRARY_OUTPUT_DIRECTORY = ${CMAKE_BINARY_DIR}/lib/Release # 动态库
CMAKE_ARCHIVE_OUTPUT_DIRECTORY = ${CMAKE_BINARY_DIR}/lib/Release # 静态库
```
### 模块化设计
项目采用模块化的 CMake 配置,通过 `cmake/` 目录下的三个模块文件组织:
1. **CompilerOptions.cmake** - 编译器和全局设置
2. **Dependencies.cmake** - Qt6、OpenCV、Open3D 依赖
3. **PercipioSDK.cmake** - 图漾相机 SDK 配置
### 库和可执行文件
#### 1. Algorithm Library (`algorithm_lib`)
**类型**: 静态库
**源文件**:
- `src/algorithm/core/detection_base.cpp`
- `src/algorithm/core/detection_result.cpp`
- `src/algorithm/utils/image_processor.cpp`
- `src/algorithm/detections/slot_occupancy_detection.cpp`
- `src/algorithm/detections/pallet_offset_detection.cpp`
- `src/algorithm/detections/beam_rack_deflection_detection.cpp`
- `src/algorithm/detections/visual_inventory_detection.cpp`
- `src/algorithm/detections/visual_inventory_end_detection.cpp`
**包含路径**:
- `src`
- `third_party/percipio/common` (修复 json11.hpp 引用)
**依赖**: OpenCV, Open3D
#### 2. Main Executable (`image_capture`)
**类型**: 可执行文件
**主要源文件**:
- `src/main.cpp`
- `src/camera/ty_multi_camera_capture.cpp`
- `src/camera/mvs_multi_camera_capture.cpp`
- `src/device/device_manager.cpp`
- `src/redis/redis_communicator.cpp`
- `src/task/task_manager.cpp`
- `src/vision/vision_controller.cpp`
- `src/common/log_manager.cpp`
- `src/common/config_manager.cpp`
- `src/gui/mainwindow.cpp` / `.h` / `.ui`
**链接的库**:
- `algorithm_lib` (项目内部算法库)
- `cpp_api_lib` (相机 SDK C++ API 封装)
- `tycam` (相机 SDK 动态库)
- `${OpenCV_LIBS}` (OpenCV 库)
- `Open3D::Open3D` (Open3D 库)
- `Qt6::Core``Qt6::Widgets` (Qt 框架)
- `MvCameraControl.lib` (海康 MVS SDK)
### 测试配置
- **选项**: `BUILD_TESTS` (默认 ON)
- **测试目录**: `tests/` (通过 `add_subdirectory` 添加)
---
## CMake 模块详解
### 1. [CompilerOptions.cmake](file:///d:/Git/stereo_warehouse_inspection/image_capture/cmake/CompilerOptions.cmake)
#### C++ 标准
- **标准**: C++17
- **要求**: 必须支持
#### Qt 自动化工具
```cmake
CMAKE_AUTOMOC ON # 自动 Meta-Object Compiler
CMAKE_AUTORCC ON # 自动 Resource Compiler
CMAKE_AUTOUIC ON # 自动 UI Compiler
```
#### 编译器优化选项 (MSVC)
**Release 模式** (默认):
```cmake
/O2 # 优化速度
/Ob2 # 内联任何合适的函数
/Oi # 启用内建函数
/Ot # 代码速度优先
/Oy # 省略帧指针
/GL # 全局程序优化
```
**Debug 模式**:
```cmake
/Od # 禁用优化
/Zi # 生成完整调试信息
```
#### 其他设置
- **定义**: `OPENCV_DEPENDENCIES`
- **compile_commands.json**: 自动生成(用于 IDE 智能提示)
---
### 2. [Dependencies.cmake](file:///d:/Git/stereo_warehouse_inspection/image_capture/cmake/Dependencies.cmake)
#### Qt6 配置
```cmake
find_package(Qt6 REQUIRED COMPONENTS Widgets)
```
#### OpenCV 配置
```cmake
find_package(OpenCV REQUIRED)
```
#### Open3D 配置
```cmake
find_package(Open3D REQUIRED)
```
用于点云处理和算法运算。
---
### 3. [PercipioSDK.cmake](file:///d:/Git/stereo_warehouse_inspection/image_capture/cmake/PercipioSDK.cmake)
#### 相机 SDK 路径配置
```cmake
CAMPORT3_ROOT = ${CMAKE_CURRENT_SOURCE_DIR}/camera_sdk
CAMPORT3_LIB_DIR = ${CAMPORT3_ROOT}/lib/win/x64
```
#### 导入 tycam 动态库
```cmake
add_library(tycam SHARED IMPORTED)
```
#### C++ API 封装库 (`cpp_api_lib`)
**类型**: 静态库
**源文件**:
`camera_sdk/sample_v2/cpp/*`, `camera_sdk/common/*`
**依赖**: OpenCV
---
## 构建流程
### 配置项目
```bash
cd image_capture/build
cmake ..
```
可选参数:
```bash
-DOpenCV_DIR=<path> # 指定 OpenCV 路径
-DQt6_DIR=<path> # 指定 Qt6 路径
-DOpen3D_DIR=<path> # 指定 Open3D 路径
```
### 编译项目
```bash
cmake --build . --config Release
# 或
cmake --build . --config Debug
```
---
## 依赖项总结
| 依赖项 | 版本要求 | 用途 |
|--------|---------|------|
| CMake | ≥ 3.10 | 构建系统 |
| C++ | C++17 | 编程语言标准 |
| Qt6 | Widgets 组件 | GUI 框架 |
| OpenCV | 4.x | 图像处理 |
| Open3D | 0.17+ | 3D点云处理 |
| Percipio SDK | tycam.dll | 相机驱动 |
| MSVC | VS2022 (v143) | 编译器 |
---
## 维护建议
1. **环境一致性**: 确保所有依赖项Qt, OpenCV, Open3D都是使用 MSVC 编译的 x64 版本。
2. **DLL 管理**: 运行时确保所有必要的 DLL 都在可执行文件目录下。
3. **版本检测**: 保持 Open3D 和 OpenCV 版本的一致性,避免 ABI 冲突。
---
*文档更新时间: 2025-12-19*

View File

@@ -0,0 +1,513 @@
# 项目架构及调用关系文档
## 1. 系统概述
本系统是一个基于立体视觉的仓库巡检图像采集与处理系统。它集成了图漾(Percipio)工业深度相机SDK和海康(MVS)工业2D相机SDK进行多相机图像采集使用OpenCV进行图像处理Qt6作为用户界面框架并通过Redis与外部系统如WMS仓库管理系统、机器人控制系统进行通信和任务调度。
系统主要功能包括:
- **多相机统一管理**同时支持深度相机Percipio和2D相机MVS的数据采集
- **实时图像预览与状态监控**GUI界面实时显示相机图像支持深度图伪彩色显示
- **基于Redis的任务触发与结果上报**:支持跨数据库的任务监听和结果写入
- **多种检测算法**
- 货位占用检测Flag 1基于2D图像的目标检测
- 托盘位置偏移检测Flag 2基于深度数据的3D位置计算
- 横梁/立柱变形检测Flag 3基于深度数据的结构变形测量
- 视觉盘点检测Flag 4基于Halcon的QR码识别支持连续扫描和去重
- 盘点停止信号Flag 5停止Flag 4的连续扫描循环
- **智能相机分配**:根据任务类型自动选择合适的相机设备
- **系统配置管理与日志记录**:支持参数持久化、实时日志显示和错误处理
## 2. 目录结构说明
```text
scripts/ # 批处理脚本 (Redis数据库配置、模拟WMS任务等)
docs/ # 项目文档
├── project_architecture.md # 项目架构文档 (本文档)
├── project_class_interaction.md # 类交互关系文档
└── cmake_configuration_summary.md # CMake构建配置文档
image_capture/
├── CMakeLists.txt # 主构建配置文件
├── cmake/ # CMake模块配置
│ ├── CompilerOptions.cmake # 编译器选项配置
│ ├── Dependencies.cmake # 依赖项管理 (Qt6, OpenCV, Open3D)
│ └── PercipioSDK.cmake # Percipio相机SDK配置
├── config.json # 系统配置文件 (相机参数、算法阈值、Redis配置等)
└── src/
├── algorithm/ # 核心算法库
│ ├── core/ # 算法基类与结果定义
│ │ ├── detection_base.h/cpp # 检测算法基类
│ │ └── detection_result.h/cpp # 检测结果数据结构
│ ├── detections/ # 具体检测算法实现
│ │ ├── slot_occupancy/ # 货位占用检测
│ │ ├── pallet_offset/ # 托盘偏移检测
│ │ ├── beam_rack_deflection/ # 横梁立柱变形检测
│ │ └── visual_inventory/ # 视觉盘点检测
│ └── utils/ # 图像处理工具
├── camera/ # 相机驱动层
│ ├── ty_multi_camera_capture.h/cpp # 图漾(Percipio)深度相机封装
│ └── mvs_multi_camera_capture.h/cpp # 海康(MVS)2D相机封装
├── common/ # 通用设施
│ ├── config_manager.h/cpp # 配置管理单例 (JSON配置加载/保存)
│ ├── log_manager.h/cpp # 日志管理 (spdlog封装)
│ └── log_streambuf.h # std::cout重定向到GUI
├── device/ # 硬件设备管理
│ └── device_manager.h/cpp # 相机设备单例管理 (统一设备接口)
├── gui/ # 用户界面 (Qt6)
│ └── mainwindow.h/cpp/ui # 主窗口实现 (实时预览+设置界面)
├── redis/ # 通信模块
│ └── redis_communicator.h/cpp # Redis客户端封装 (跨数据库支持)
├── task/ # 任务调度
│ └── task_manager.h/cpp # 任务管理器 (队列+线程+算法调度)
├── vision/ # 系统控制
│ └── vision_controller.h/cpp # 顶层控制器 (Redis+Task协调)
├── common_types.h # 通用数据类型 (Point3D, CameraIntrinsics等)
├── tools/ # 工具程序目录
│ ├── calibration_tool/ # 相机标定工具
│ ├── slot_algo_tuner/ # 货位算法调参工具
│ └── intrinsic_dumper/ # 相机内参导出工具
└── main.cpp # 程序入口
```
## 3. 核心架构设计
系统采用分层架构设计,各模块职责明确:
- **展示层 (Presentation)**: `MainWindow` 负责Qt6界面显示、实时相机预览、手动控制、参数配置及日志展示。
- **控制层 (Control)**: `VisionController` 作为系统级控制器,负责服务的启动/停止协调Redis通信和任务管理使用回调机制解耦模块间依赖。
- **业务逻辑层 (Business Logic)**: `TaskManager` 负责任务队列管理、算法调度和结果处理;`DeviceManager` 作为硬件资源的统一访问点(单例模式)。
- **算法层 (Algorithm)**: 提供具体的视觉检测功能,所有算法继承自 `DetectionBase`,支持统一的 `execute()` 接口。
- **基础设施层 (Infrastructure)**: `CameraCapture` 封装底层相机SDK调用`RedisCommunicator` 处理跨数据库通信,`ConfigManager` 管理系统配置。
### 系统分层架构图
```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_
+QTimer imageTimer_
+updateImage()
+onSaveSettings()
+showLogMessage()
}
class VisionController {
+shared_ptr<RedisCommunicator> redis_comm_
+shared_ptr<RedisCommunicator> redis_result_comm_
+shared_ptr<TaskManager> task_manager_
+initialize()
+start()
+stop()
-onTaskReceived()
}
class DeviceManager {
<<Singleton>>
+shared_ptr<CameraCapture> capture_
+unique_ptr<MvsMultiCameraCapture> mvs_cameras_
+initialize()
+startAll()
+getLatestImages()
+computePointCloud()
+get2DCameraImage()
}
class TaskManager {
+queue<RedisTaskData> task_queue_
+map<int, DetectionBase*> detectors_
+thread execution_thread_
+handleTask()
+executeDetectionTask()
-executeVisualInventoryLoop()
-processResult()
-addWarningAlarmSignals()
}
class CameraCapture {
+vector<CameraInfo> cameras_
+getLatestImages()
+computePointCloud()
+start()
-captureThreadFunc()
}
class MvsMultiCameraCapture {
+vector<CameraInfo> cameras_
+getLatestImage()
+start()
}
class RedisCommunicator {
+connect()
+startListening()
+writeString()
+setTaskCallback()
}
class ConfigManager {
<<Singleton>>
+json config_data_
+loadConfig()
+saveConfig()
+getValue()
}
class DetectionBase {
<<Abstract>>
+execute(depth, color, side, result, point_cloud, beam_length)
}
class SlotOccupancyDetection {
+execute()
}
class PalletOffsetDetection {
+execute()
}
class BeamRackDeflectionDetection {
+execute()
}
class VisualInventoryDetection {
+execute()
}
MainWindow --> VisionController : 拥有并管理
VisionController --> RedisCommunicator : 管理 (任务监听)
VisionController --> TaskManager : 分发任务
RedisCommunicator --> VisionController : 回调通知 (onTaskReceived)
VisionController ..> DeviceManager : 依赖(全局单例)
TaskManager ..> DeviceManager : 获取图像数据 (Dependency)
DeviceManager --> CameraCapture : 拥有 (深度相机)
DeviceManager --> MvsMultiCameraCapture : 拥有 (2D相机)
TaskManager --> DetectionBase : 调用算法
DetectionBase <|-- SlotOccupancyDetection : 继承
DetectionBase <|-- PalletOffsetDetection : 继承
DetectionBase <|-- BeamRackDeflectionDetection : 继承
DetectionBase <|-- VisualInventoryDetection : 继承
MainWindow ..> ConfigManager : 读写配置 (Dependency)
TaskManager ..> ConfigManager : 读取参数 (Dependency)
MainWindow ..> DeviceManager : 图像显示 (Dependency)
```
## 4. 关键模块详解
### 4.1 GUI与主入口 (MainWindow)
- **职责**: Qt6应用程序主窗口负责UI渲染、用户交互、参数配置、实时预览及日志展示。
- **调用关系**:
- 程序启动时创建 `VisionController` 并初始化系统。
- 通过 `QTimer` (30FPS) 定期从 `DeviceManager` 获取最新图像更新界面显示。
- **实时预览**: 支持深度图伪彩色显示和彩色图显示,带自适应缩放。
- **设置界面**: Settings Tab提供完整的算法参数配置包括
- Beam/Rack Deflection: 横梁/立柱变形检测阈值和ROI配置
- Pallet Offset: 托盘位置偏移检测参数
- 系统配置: Redis连接参数、相机设置等
- **日志显示**: 通过 `LogStreamBuf``std::cout/cerr` 重定向到GUI日志窗口。
- 通过 `ConfigManager` 加载和保存 `config.json` 配置,支持热重载。
### 4.2 视觉控制器 (VisionController)
- **职责**: 系统的核心控制器协调Redis通信和任务管理支持无头模式运行。
- **架构特点**:
- 使用智能指针管理 `RedisCommunicator``TaskManager` 生命周期。
- 支持跨数据库Redis操作任务监听DB(输入)和结果写入DB(输出)。
- 通过回调机制实现模块解耦,避免循环依赖。
- **工作流程**:
1. `initialize()`: 创建并初始化两个Redis连接器任务DB和结果DB
2. 初始化 `TaskManager`传入Redis连接器用于结果写入和任务状态清空。
3. `start()`: 启动Redis任务监听线程设置任务接收回调。
4. `onTaskReceived()`: 收到Redis任务时通过回调转发给 `TaskManager::handleTask()`
### 4.3 任务管理 (TaskManager)
- **职责**: 任务队列管理、算法调度、结果处理和跨线程执行的核心业务逻辑处理器。
- **架构特点**:
- **异步处理**: 使用任务队列 + 独立执行线程避免阻塞Redis监听和GUI。
- **相机智能分配**: 根据任务Flag自动选择合适的相机设备和数据类型。
- **去重机制**: Flag 4视觉盘点支持连续扫描和QR码去重。
- **状态管理**: 提供任务执行状态查询接口,支持外部监控。
- **工作流**:
1. `handleTask()`: 接收Redis任务加入线程安全的任务队列。
2. `taskExecutionThreadFunc()`: 后台线程持续处理队列任务。
3. **相机选择**: 根据Flag选择相机
- Flag 1: MVS 2D相机 (SN: DA8743029左/DA8742900右)
- Flag 2/3: Percipio深度相机 (SN: 207000146458左/207000146703右)
- Flag 4: MVS 2D相机 (SN: DA8789631) + 连续扫描循环
4. **数据获取**: 调用 `DeviceManager` 获取图像Flag 2/3时生成点云。
5. **算法执行**: 调用对应的 `DetectionBase::execute()` 方法。
6. **结果处理**: `processResult()` 格式化JSON、计算警告/报警、写入Redis结果DB。
### 4.4 设备管理 (DeviceManager)
- **职责**: 多类型相机的统一管理接口,全系统硬件资源的单例访问点。
- **架构特点**:
- **双SDK支持**: 同时管理Percipio深度相机和MVS 2D相机。
- **统一接口**: 提供一致的设备枚举、启动/停止和数据获取接口。
- **线程安全**: 所有接口都是线程安全的,支持并发访问。
- **资源管理**: 使用智能指针和RAII确保相机资源正确释放。
- **功能**:
- `initialize()`: 扫描并初始化所有类型的相机设备。
- `getLatestImages()`: 统一的图像获取接口,支持深度图+彩色图。
- `get2DCameraImage()`: 专门的2D相机图像获取接口。
- `computePointCloud()`: 基于深度图和相机内参计算3D点云。
- **相机索引映射**: 内部管理深度相机和2D相机的索引映射。
### 4.5 相机驱动层
- **Percipio深度相机** (`ty_multi_camera_capture.cpp`):
- 基于图漾工业相机SDK支持TY系列深度相机。
- 为每个相机维护独立采集线程和帧缓冲区。
- 支持深度图和彩色图同步采集,内部处理时间戳对齐。
- **点云计算**: 集成 `TYMapDepthImageToPoint3d`利用相机标定参数生成精确3D点云。
- 自动畸变校正和深度数据滤波。
- **MVS 2D相机** (`mvs_multi_camera_capture.cpp`):
- 基于海康工业相机SDK支持MV系列2D相机。
- 支持连续采集模式,内部缓冲区管理。
- 提供高帧率彩色图像采集,适用于快速检测场景。
- 支持相机序列号匹配,便于多相机场景下的设备识别。
### 4.6 配置管理 (ConfigManager)
- **职责**: 管理 `config.json` 文件,集中管理系统配置。
- **管理内容**:
- Redis 连接信息。
- 算法阈值 (Beam/Rack, Pallet Offset 等)。
- ROI (Region of Interest) 坐标点。
- 系统通用参数 (最小/最大深度等)。
- **特性**: 单例模式,支持热加载(部分参数)和持久化保存。程序启动时由 `MainWindow` 加载确保算法使用持久化的用户设置。GUI中的Settings Tab直接操作此模块。
## 5. 系统执行与数据流
### 5.1 初始化流程
1. **程序启动**: `main.cpp` 创建Qt6应用程序设置Fusion样式。
2. **MainWindow构造**:
- 初始化Qt6 UI界面主窗口 + Settings选项卡
- **配置加载**: 调用 `ConfigManager::loadConfig()``config.json` 加载系统配置。
- **设备初始化**: 调用 `DeviceManager::initialize()` 扫描Percipio和MVS相机。
- **控制器创建**: 实例化 `VisionController`传入Redis配置参数。
- **Redis初始化**: `VisionController::initialize()` 创建任务监听和结果写入的Redis连接器。
- **定时器启动**: 启动30FPS的 `QTimer` 用于实时图像预览。
3. **设备启动**: 调用 `DeviceManager::startAll()` 启动所有相机采集线程。
4. **服务启动**: 调用 `VisionController::start()` 开启Redis监听确保设备就绪后再接收任务。
### 5.2 自动任务执行流 (Redis触发)
```mermaid
sequenceDiagram
participant WMS as WMS/外部系统
participant Redis_Task as Redis_Task_DB
participant RC_Task as RedisCommunicator_Task
participant VC as VisionController
participant TM as TaskManager
participant DM as DeviceManager
participant Algo as DetectionAlgorithm
participant RC_Result as RedisCommunicator_Result
participant Redis_Result as Redis_Result_DB
WMS->>Redis_Task: SET vision_task_flag=1,side=left,time=xxx
Redis_Task->>RC_Task: Key change notification
RC_Task->>VC: onTaskReceived(task_data)
VC->>TM: handleTask(task_data)
activate TM
TM->>TM: Queue task (async)
TM->>DM: getLatestImages() or get2DCameraImage()
DM-->>TM: images (depth+color or 2D only)
alt Flag 2/3 (需要点云)
TM->>DM: computePointCloud(depth)
DM-->>TM: point_cloud (vector<Point3D>)
end
TM->>Algo: execute(images, point_cloud, ...)
activate Algo
Algo-->>TM: DetectionResult
deactivate Algo
TM->>TM: processResult() + addWarningAlarmSignals()
TM->>RC_Result: writeDetectionResult(json_map)
RC_Result->>Redis_Result: MSET key1=value1 key2=value2 ...
TM->>RC_Task: writeString(vision_task_flag, "0")
TM->>RC_Task: writeString(vision_task_side, "")
TM->>RC_Task: writeString(vision_task_time, "")
RC_Task->>Redis_Task: Clear task flags
deactivate TM
```
1. **外部触发**: WMS系统通过Redis Task DB发布任务设置 `vision_task_flag``side``time`)。
2. **异步接收**: `RedisCommunicator_Task` 监听Task DB触发回调给 `VisionController`
3. **任务队列**: `VisionController` 将任务加入 `TaskManager` 的线程安全队列。
4. **后台执行**: `TaskManager` 执行线程处理任务根据Flag选择相机和算法
- **Flag 1**: MVS 2D相机 → `SlotOccupancyDetection`
- **Flag 2**: Percipio深度相机 → `PalletOffsetDetection` (带点云)
- **Flag 3**: Percipio深度相机 → `BeamRackDeflectionDetection` (带点云)
- **Flag 4**: MVS 2D相机 → `VisualInventoryDetection` (连续循环+QR识别)
5. **智能数据获取**: 根据任务类型调用相应的 `DeviceManager` 接口。
6. **结果处理**: 计算警告/报警信号格式化JSON结果。
7. **跨DB写入**: 结果写入Redis Result DB任务状态清理写入Task DB。
### 5.3 实时监控执行流 (GUI)
```mermaid
sequenceDiagram
participant Timer as QTimer (30FPS)
participant MainWin as MainWindow
participant DM as DeviceManager
loop 每33ms
Timer->>MainWin: timeout()
activate MainWin
MainWin->>DM: getLatestImages(0) + get2DCameraImage(0)
DM-->>MainWin: depth_img, color_img, mvs_img
alt 深度相机活跃
MainWin->>MainWin: applyColorMap(depth_img) → 伪彩色显示
else 2D相机活跃
MainWin->>MainWin: 显示彩色图像
end
MainWin->>MainWin: MatToQImage() + scaleToFit()
MainWin->>MainWin: update QLabel displays
deactivate MainWin
end
```
1. **高频刷新**: `QTimer` 以30FPS触发 `updateImage()`,确保流畅的实时预览。
2. **多相机预览**: 同时获取深度相机和2D相机的最新图像支持混合显示。
3. **图像处理**: 深度图应用伪彩色映射,便于观察深度信息;彩色图直接显示。
4. **自适应渲染**: OpenCV Mat转换为QImage支持窗口大小自适应缩放。
5. **状态同步**: 图像显示与任务执行异步进行,不影响检测性能。
## 6. 异常处理与日志
- **日志**: 使用 `LogManager``spdlog` (如果集成) 或标准输出。
- **重定向**: `LogStreamBuf``std::cout/cerr` 重定向到GUI的日志窗口方便现场调试。
- **错误恢复**: 相机掉线重连机制(在驱动层实现或计划中)。
## 6. 检测算法详解
### 6.1 算法框架 (DetectionBase)
所有检测算法继承自 `DetectionBase` 抽象基类,提供统一的接口:
```cpp
virtual bool execute(const cv::Mat& depth_img,
const cv::Mat& color_img,
const std::string& side,
DetectionResult& result,
const std::vector<Point3D>* point_cloud = nullptr,
double beam_length = 0.0) = 0;
```
### 6.2 具体算法实现
#### Flag 1: 货位占用检测 (SlotOccupancyDetection)
- **输入**: 2D彩色图像 (MVS相机)
- **算法**: 基于图像处理的目标检测和位置判断
- **输出**: 货位占用状态 (occupied/free)
- **相机**: DA8743029 (左侧), DA8742900 (右侧)
#### Flag 2: 托盘位置偏移检测 (PalletOffsetDetection)
- **输入**: 深度图 + 彩色图 + 3D点云
- **算法**: 基于点云的3D位置计算检测托盘相对于基准位置的偏移
- **输出**: 左右偏移(mm)、前后偏移(mm)、插孔变形(mm)、旋转角度(°)
- **相机**: 207000146458 (左侧), 207000146703 (右侧)
- **警告/报警**: 基于阈值的四级判断 (正常/警告/报警)
#### Flag 3: 横梁/立柱变形检测 (BeamRackDeflectionDetection)
- **输入**: 深度图 + 彩色图 + 3D点云
- **算法**: 基于点云的结构变形测量
- **输出**: 横梁弯曲量(mm)、立柱弯曲量(mm)
- **相机**: 207000146458 (左侧), 207000146703 (右侧)
- **警告/报警**: 基于阈值的四级判断
#### Flag 4: 视觉盘点检测 (VisualInventoryDetection)
- **输入**: 2D彩色图像 (MVS相机)
- **算法**: 基于Halcon的QR码识别支持连续扫描和去重
- **特殊机制**: 循环执行直到收到Flag 5停止信号支持实时去重
- **输出**: JSON格式的条码列表 `{"side": ["BOX001", "BOX002", ...]}`
- **相机**: DA8789631 (专用盘点相机)
#### Flag 5: 盘点停止信号
- **功能**: 停止Flag 4的连续扫描循环
- **无算法执行**: 仅作为控制信号
### 6.3 相机分配策略
系统根据任务Flag智能选择相机
| Flag | 相机类型 | 序列号 | 位置 | 数据类型 |
|------|---------|--------|------|----------|
| 1 | MVS 2D | DA8743029 / DA8742900 | 左/右 | 彩色图 |
| 2 | Percipio深度 | 207000146458 / 207000146703 | 左/右 | 深度+彩色+点云 |
| 3 | Percipio深度 | 207000146458 / 207000146703 | 左/右 | 深度+彩色+点云 |
| 4 | MVS 2D | DA8789631 | 盘点专用 | 彩色图 |
## 7. 编译与构建
- **构建系统**: CMake 3.10+
- **编程语言**: C++17
- **目标平台**: Windows 10/11 (MSVC 2022 v143)
- **主要依赖**:
- **Qt6**: Widgets组件 (GUI框架)
- **OpenCV 4.x**: 图像处理和计算机视觉
- **Open3D 0.17+**: 3D点云处理
- **Percipio SDK**: 图漾工业相机驱动
- **MVS SDK**: 海康工业相机驱动
- **Redis C++ Client**: hiredis + redis-plus-plus (Redis通信)
- **可选依赖**: Halcon (用于QR码识别在Flag 4中使用)
- **构建流程**: 标准CMake流程支持Release/Debug配置
---
*文档更新时间: 2025-01-06*

View File

@@ -0,0 +1,133 @@
# 项目功能类调用关系说明 (Project Class Interaction Documentation)
本主要介绍 `image_capture` 项目核心功能类之间的调用关系、数据流向以及模块划分。
## 1. 核心模块概览 (Core Modules Overview)
系统主要由以下几个核心模块组成:
* **GUI 模块 (`MainWindow`)**: 程序的入口与界面显示,负责系统初始化。
* **Vision 控制器 (`VisionController`)**: 系统的核心中枢,协调通信与任务管理。
* **任务管理 (`TaskManager`)**: 负责具体的业务逻辑执行、算法调度和结果处理。
* **设备管理 (`DeviceManager`)**: 负责相机等硬件设备的统一管理(单例模式)。
* **通信模块 (`RedisCommunicator`)**: 负责与外部系统(如 WMS通过 Redis 交互。
* **算法模块 (`DetectionBase` 及其子类)**: 具体的图像处理算法。
## 2. 类调用关系图 (Class Interaction Diagram)
```mermaid
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)
1. **Entry Point**: `main.cpp` 创建 `QApplication` 并实例化 `MainWindow`
2. **MainWindow**:
* 构造函数中初始化界面。
* 调用 `DeviceManager::getInstance().initialize()` 扫描并初始化相机设备。
* 实例化 `VisionController` 成员变量。
* 调用 `VisionController::initialize()`,配置 Redis 连接参数。
* 调用 `VisionController::start()` 启动后台服务。
3. **VisionController**:
*`start()` 中调用 `RedisCommunicator::startListening()` 开启监听线程。
### 3.2 任务触发与执行 (Task Trigger & Execution)
当 Redis 中 `vision_task_flag` 发生变化时,流程如下:
1. **RedisCommunicator**:
* 监听线程检测到 Flag 变化。
* 通过回调函数 `VisionController::onTaskReceived` 通知控制器。
2. **VisionController**:
* `onTaskReceived` 将接收到的 `RedisTaskData` 传递给 `TaskManager::handleTask`
3. **TaskManager**:
* `handleTask` 将任务推入内部的任务队列 `task_queue_`
* 工作线程 `taskExecutionThreadFunc` 从队列中取出任务。
* **获取图像**: 调用 `DeviceManager::getInstance().getLatestImages(...)` 获取当前最新的深度图和彩色图。
* **选择算法**: 根据任务 Flag 调用 `getDetector(flag)` 获取对应的算法实例(如 `PalletOffsetDetection`)。
* **执行算法**: 调用 `detector->execute(depth_img, color_img, ...)` 进行计算。
* **结果封装**: 将算法返回的数据填充到 `DetectionResult` 结构体中。
### 3.3 结果处理 (Result Handling)
算法执行完成后:
1. **TaskManager**:
* 调用 `processResult(result)`
* 该函数会格式化结果为 JSON 字符串,并计算报警/警告状态。
* 调用 `redis_result_comm_->writeDetectionResult(json)` 将结果写入 Redis。
2. **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`)
* **职责**: 屏蔽底层相机 SDKPercipio / 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*