GrabBag/App/HoleDetection/Doc/孔洞检测TCP通信协议.md
2026-03-11 23:40:06 +08:00

176 lines
5.1 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.

# HoleDetection 孔洞检测系统 - TCP通信协议
## 版本历史
| 版本 | 日期 | 修改内容 |
|------|------|----------|
| 1.0 | 2026-03-10 | 改为文本格式协议,增加机器人位姿(眼在手上) |
---
## 1. 协议概述
本文档定义了上位机与HoleDetection孔洞检测系统之间的TCP/IP通信协议。协议采用纯文本格式进行数据交换支持眼在手上Eye-in-Hand坐标变换。
### 1.1 通信方式
- **传输协议**: TCP/IP
- **数据格式**: 纯文本
- **端口**: 7800默认可通过配置文件修改
- **行分隔符**: `\n`(换行符)
### 1.2 通信模式
- 服务端HoleDetection孔洞检测系统
- 客户端:上位机控制系统(机器人控制器/PLC
### 1.3 坐标变换方式
采用 **眼在手上(Eye-in-Hand)** 方式:
```
P_base = T_base_to_end × T_end_to_cam × P_cam
```
- `T_base_to_end` = 机器人位姿(触发信号中的 RbtX/Y/Z/Roll/Pitch/Yaw
- `T_end_to_cam` = 手眼标定矩阵(配置文件中的 4×4 矩阵)
- `P_cam` = 相机坐标系下的检测结果
## 2. 触发信号(客户端 → 服务端)
上位机发送触发信号,携带相机索引和当前机器人法兰位姿。
### 2.1 格式
```
X<相机索引> RbtX<值> RbtY<值> RbtZ<值> RbtRoll<值> RbtPitch<值> RbtYaw<值>\n
```
### 2.2 字段说明
| 字段 | 类型 | 说明 |
|------|------|------|
| X | Integer | 相机索引。`1` = 相机1`2` = 相机2 |
| RbtX | Float | 机器人法兰 X 坐标mm |
| RbtY | Float | 机器人法兰 Y 坐标mm |
| RbtZ | Float | 机器人法兰 Z 坐标mm |
| RbtRoll | Float | 机器人法兰 Roll 角度(°) |
| RbtPitch | Float | 机器人法兰 Pitch 角度(°) |
| RbtYaw | Float | 机器人法兰 Yaw 角度(°) |
> **注意**
> - 各字段之间用**空格**分隔
> - 数值可以为负数,负号是值的一部分(如 `RbtX-23.45`
> - 数值与前缀之间**无空格**(如 `RbtX100.0`,不是 `RbtX 100.0`
> - 每条消息以 `\n` 结尾
### 2.3 示例
```
X1 RbtX100.0 RbtY200.0 RbtZ300.0 RbtRoll0.0 RbtPitch0.0 RbtYaw0.0
```
```
X2 RbtX-23.45 RbtY150.30 RbtZ-80.00 RbtRoll-12.50 RbtPitch45.00 RbtYaw-90.00
```
## 3. 返回信号(服务端 → 客户端)
检测完成后,服务端返回检测到的孔洞数量和各孔洞在机器人基坐标系下的位姿。
### 3.1 格式
```
<孔洞数量>_<X1>_<Y1>_<Z1>_<Roll1>_<Pitch1>_<Yaw1>/<X2>_<Y2>_<Z2>_<Roll2>_<Pitch2>_<Yaw2>/...\n
```
### 3.2 格式规则
| 符号 | 说明 |
|------|------|
| 第一个数值 | 检测到的孔洞数量 |
| `_` | 同一孔洞各分量之间的分隔符 |
| `/` | 不同孔洞之间的分隔符 |
| `\n` | 消息结尾 |
### 3.3 单个孔洞位姿字段
| 顺序 | 类型 | 说明 |
|------|------|------|
| 1 | Float | 机器人基坐标系下 X 坐标mm |
| 2 | Float | 机器人基坐标系下 Y 坐标mm |
| 3 | Float | 机器人基坐标系下 Z 坐标mm |
| 4 | Float | Roll 角度(°) |
| 5 | Float | Pitch 角度(°) |
| 6 | Float | Yaw 角度(°) |
> **注意**姿态角Roll/Pitch/Yaw的输出顺序可通过配置文件中的 `poseOutputOrder` 参数调整。
### 3.4 示例
**检测到 2 个孔洞:**
```
2_100.50_200.30_50.20_1.23_4.56_7.89/110.00_210.00_60.00_1.00_5.00_8.00/
```
**检测到 0 个孔洞:**
```
0
```
**检测到 1 个孔洞:**
```
1_120.50_180.30_45.20_0.00_0.00_0.00/
```
## 4. 通信流程
### 4.1 正常检测流程
```
上位机(机器人控制器) 孔洞检测系统
| |
| X1 RbtX... RbtYaw... |
|------------------------------------>|
| |
| | (拍照+检测+坐标变换)
| |
| 2_X1_Y1_Z1_R1_P1_Y1/X2_... |
|<------------------------------------|
| |
```
### 4.2 无检测结果
```
上位机(机器人控制器) 孔洞检测系统
| |
| X1 RbtX... RbtYaw... |
|------------------------------------>|
| |
| | (拍照+检测,未找到孔洞)
| |
| 0 |
|<------------------------------------|
| |
```
## 5. 注意事项
1. **连接管理**
- 客户端应实现断线重连机制
- 服务端支持多客户端连接,结果广播给所有已连接客户端
2. **粘包处理**
- 协议以 `\n` 作为消息分隔符
- 接收方应按 `\n` 分割完整行后再解析
3. **数据精度**
- 坐标精度小数点后2位毫米
- 角度精度小数点后2位
4. **性能考虑**
- 单次检测时间约 500ms - 2s
- 建议客户端设置合理的超时时间建议10秒
5. **手眼标定**
- 使用前需完成手眼标定,标定矩阵存储在 config.xml 的 `<HandEyeCalibMatrixList>`
- 支持多相机独立标定