8.4 KiB
8.4 KiB
双目视觉引导工件定位与拼接系统 - 业务流程总览
完整详细说明请查看: 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检测
初始化GalaxyDevice双目相机
↓
连续采集左右图像
↓
调用算法: wd_BQ_getCharuco3DMark(
leftImage, rightImage,
标定参数(相机内参、畸变、R、P、Q等),
Mark配置(pattern、checker、marker),
输出: marks[]
)
↓
TCP发送Mark数据 → 客户端
2️⃣ WorkpiecePositionApp - 工件抓取
BinocularMarkReceiver接收Mark
↓
触发EpicEyeDevice采集点云
↓
融合算法:
• 基于Mark建立工件坐标系
• 点云配准与分割
• PCA计算工件中心位姿
• 输出: SSG_6DOF (x,y,z,rx,ry,rz)
↓
发送抓取位姿 → 机器人控制器
3️⃣ WorkpieceSpliceApp - 工件拼接
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位姿拟合 |
| 控制方式 | 开环检测 | 单次计算 | 闭环反馈 |
🔗 数据结构
// 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;
💡 典型应用场景
-
无序工件抓取
- BinocularMarkApp检测料箱中Mark
- WorkpiecePositionApp计算抓取位姿
- 机器人逐个抓取
-
精密装配拼接
- BinocularMarkApp检测待拼接工件Mark
- WorkpieceSpliceApp闭环调整位姿
- 满足公差后执行拼接
-
质量检测
- 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