187 lines
8.4 KiB
Markdown
187 lines
8.4 KiB
Markdown
|
|
# 双目视觉引导工件定位与拼接系统 - 业务流程总览
|
|||
|
|
|
|||
|
|
> 完整详细说明请查看: [BUSINESS_FLOW_DETAILS.md](./BUSINESS_FLOW_DETAILS.md)
|
|||
|
|
|
|||
|
|
## 🎯 系统架构图
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌────────────────────────────────────┐
|
|||
|
|
│ 整体业务架构与数据流向 │
|
|||
|
|
└────────────────────────────────────┘
|
|||
|
|
|
|||
|
|
┌─────────────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 1️⃣ BinocularMarkApp (Mark 3D检测服务端) │
|
|||
|
|
│ ───────────────────────────────────────────────────────────── │
|
|||
|
|
│ • 位置: App/BinocularMark/BinocularMarkApp/ │
|
|||
|
|
│ • 硬件: GalaxyDevice (大恒双目工业相机) │
|
|||
|
|
│ • 功能: 双目图像采集 → Charuco Mark 3D坐标检测 │
|
|||
|
|
│ • 算法: wd_BQ_getCharuco3DMark() │
|
|||
|
|
│ • 通信: TCP Server (端口5901) │
|
|||
|
|
└─────────────────────────────────────────────────────────────────────┘
|
|||
|
|
↓ TCP
|
|||
|
|
┌───────────────────────┐
|
|||
|
|
│ Mark 3D数据 (实时) │
|
|||
|
|
│ markID + (x, y, z) │
|
|||
|
|
└───────────────────────┘
|
|||
|
|
↓
|
|||
|
|
┌─────────────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 📡 BinocularMarkReceiver (公共TCP客户端模块) │
|
|||
|
|
│ ───────────────────────────────────────────────────────────── │
|
|||
|
|
│ • 位置: Module/BinocularMarkReceiver/ │
|
|||
|
|
│ • 类型: 静态库 - 多应用复用 │
|
|||
|
|
│ • 功能: 接收Mark数据、心跳保活、回调通知 │
|
|||
|
|
│ • 接口: IBinocularMarkReceiver │
|
|||
|
|
└─────────────────────────────────────────────────────────────────────┘
|
|||
|
|
↓ ↓
|
|||
|
|
┌──────────────────────────┐ ┌──────────────────────────┐
|
|||
|
|
│ 2️⃣ WorkpiecePositionApp │ │ 3️⃣ WorkpieceSpliceApp │
|
|||
|
|
│ (工件定位抓取) │ │ (工件拼接装配) │
|
|||
|
|
│ ────────────────────── │ │ ────────────────────── │
|
|||
|
|
│ • Mark数据 (远程) │ │ • Mark数据 (远程) │
|
|||
|
|
│ • EpicEyeDevice点云(本地)│ │ • 机械臂控制 │
|
|||
|
|
│ • 融合计算抓取位姿 │ │ • 闭环位姿调整 │
|
|||
|
|
└──────────────────────────┘ └──────────────────────────┘
|
|||
|
|
↓ ↓
|
|||
|
|
机器人抓取工件 机械臂拼接工件
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔄 核心业务流程
|
|||
|
|
|
|||
|
|
### 1️⃣ BinocularMarkApp - Mark检测
|
|||
|
|
```cpp
|
|||
|
|
初始化GalaxyDevice双目相机
|
|||
|
|
↓
|
|||
|
|
连续采集左右图像
|
|||
|
|
↓
|
|||
|
|
调用算法: wd_BQ_getCharuco3DMark(
|
|||
|
|
leftImage, rightImage,
|
|||
|
|
标定参数(相机内参、畸变、R、P、Q等),
|
|||
|
|
Mark配置(pattern、checker、marker),
|
|||
|
|
输出: marks[]
|
|||
|
|
)
|
|||
|
|
↓
|
|||
|
|
TCP发送Mark数据 → 客户端
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2️⃣ WorkpiecePositionApp - 工件抓取
|
|||
|
|
```cpp
|
|||
|
|
BinocularMarkReceiver接收Mark
|
|||
|
|
↓
|
|||
|
|
触发EpicEyeDevice采集点云
|
|||
|
|
↓
|
|||
|
|
融合算法:
|
|||
|
|
• 基于Mark建立工件坐标系
|
|||
|
|
• 点云配准与分割
|
|||
|
|
• PCA计算工件中心位姿
|
|||
|
|
• 输出: SSG_6DOF (x,y,z,rx,ry,rz)
|
|||
|
|
↓
|
|||
|
|
发送抓取位姿 → 机器人控制器
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3️⃣ WorkpieceSpliceApp - 工件拼接
|
|||
|
|
```cpp
|
|||
|
|
BinocularMarkReceiver接收Mark
|
|||
|
|
↓
|
|||
|
|
计算位姿偏差:
|
|||
|
|
• 当前Mark位置 vs 目标位置
|
|||
|
|
• SVD拟合位姿差异
|
|||
|
|
• 检查公差 (±0.1mm, ±0.5°)
|
|||
|
|
↓
|
|||
|
|
闭环控制:
|
|||
|
|
while (超出公差 && 次数<max) {
|
|||
|
|
发送调整指令 → 机械臂
|
|||
|
|
等待执行
|
|||
|
|
重新检测Mark (实时反馈)
|
|||
|
|
重新计算偏差
|
|||
|
|
}
|
|||
|
|
↓
|
|||
|
|
执行拼接操作
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 关键模块对比
|
|||
|
|
|
|||
|
|
| 模块 | BinocularMarkApp | WorkpiecePosition | WorkpieceSplice |
|
|||
|
|
|------|------------------|-------------------|-----------------|
|
|||
|
|
| **硬件** | GalaxyDevice双目相机 | GalaxyDevice(远程) + EpicEyeDevice(本地) | GalaxyDevice(远程) + 机械臂 |
|
|||
|
|
| **定位精度** | ±0.1mm | ±0.2mm | ±0.1mm, ±0.5° |
|
|||
|
|
| **处理速度** | 10-30 FPS | <500ms | <1s/次调整 |
|
|||
|
|
| **核心算法** | Charuco 3D检测 | Mark+点云融合 | SVD位姿拟合 |
|
|||
|
|
| **控制方式** | 开环检测 | 单次计算 | 闭环反馈 |
|
|||
|
|
|
|||
|
|
## 🔗 数据结构
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
// Mark 3D数据 (BinocularMarkApp → BinocularMarkReceiver)
|
|||
|
|
typedef struct {
|
|||
|
|
int markID; // Mark标识
|
|||
|
|
SVzNL3DPoint mark3D; // 3D坐标 (x, y, z)
|
|||
|
|
} SWD_charuco3DMark;
|
|||
|
|
|
|||
|
|
// 工件抓取位姿 (WorkpiecePosition输出)
|
|||
|
|
typedef struct {
|
|||
|
|
double x, y, z; // 位置 (mm)
|
|||
|
|
double x_roll; // 绕X轴旋转 (°)
|
|||
|
|
double y_pitch; // 绕Y轴旋转 (°)
|
|||
|
|
double z_yaw; // 绕Z轴旋转 (°)
|
|||
|
|
} SSG_6DOF;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 💡 典型应用场景
|
|||
|
|
|
|||
|
|
1. **无序工件抓取**
|
|||
|
|
- BinocularMarkApp检测料箱中Mark
|
|||
|
|
- WorkpiecePositionApp计算抓取位姿
|
|||
|
|
- 机器人逐个抓取
|
|||
|
|
|
|||
|
|
2. **精密装配拼接**
|
|||
|
|
- BinocularMarkApp检测待拼接工件Mark
|
|||
|
|
- WorkpieceSpliceApp闭环调整位姿
|
|||
|
|
- 满足公差后执行拼接
|
|||
|
|
|
|||
|
|
3. **质量检测**
|
|||
|
|
- BinocularMarkApp检测产品Mark
|
|||
|
|
- 对比设计位置判定合格性
|
|||
|
|
|
|||
|
|
## 📁 关键文件位置
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
GrabBag/
|
|||
|
|
├─ App/BinocularMark/BinocularMarkApp/
|
|||
|
|
│ ├─ BinocularMarkPresenter.cpp # Mark检测核心逻辑
|
|||
|
|
│ ├─ BinocularMarkTcpProtocol.cpp # TCP通信
|
|||
|
|
│ ├─ config_example.json # 配置示例
|
|||
|
|
│ └─ CONFIG_README.md # 配置说明
|
|||
|
|
│
|
|||
|
|
├─ Module/BinocularMarkReceiver/
|
|||
|
|
│ ├─ Inc/IBinocularMarkReceiver.h # 公共接口
|
|||
|
|
│ └─ Src/BinocularMarkReceiver.cpp # 实现
|
|||
|
|
│
|
|||
|
|
├─ App/WorkpieceProject/
|
|||
|
|
│ ├─ WorkpiecePositionApp/
|
|||
|
|
│ │ └─ WorkpiecePositionPresenter.cpp # 抓取逻辑
|
|||
|
|
│ ├─ WorkpieceSpliceApp/
|
|||
|
|
│ │ └─ WorkpieceSplicePresenter.cpp # 拼接逻辑
|
|||
|
|
│ ├─ BUSINESS_FLOW.md # 本文档
|
|||
|
|
│ └─ BUSINESS_FLOW_DETAILS.md # 详细说明
|
|||
|
|
│
|
|||
|
|
├─ Device/
|
|||
|
|
│ ├─ GalaxyDevice/ # 大恒相机驱动
|
|||
|
|
│ └─ EpicEyeDevice/ # VisionPro相机驱动
|
|||
|
|
│
|
|||
|
|
└─ SDK/binocularMark/Inc/
|
|||
|
|
├─ binocularMarkCam_Export.h # 算法接口
|
|||
|
|
└─ SG_baseDataType.h # 数据类型
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🚀 系统优势
|
|||
|
|
|
|||
|
|
✅ **模块化**: BinocularMarkReceiver公共模块复用
|
|||
|
|
✅ **高精度**: ±0.1mm级定位精度
|
|||
|
|
✅ **实时性**: <10ms通信延迟
|
|||
|
|
✅ **鲁棒性**: 多传感器融合
|
|||
|
|
✅ **灵活性**: 闭环控制、自适应调整
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**详细技术文档**: [BUSINESS_FLOW_DETAILS.md](./BUSINESS_FLOW_DETAILS.md)
|