GrabBag/App/HoleDetection/Doc/孔洞检测TCP通信协议.md

176 lines
5.1 KiB
Markdown
Raw Normal View History

2026-03-11 23:40:06 +08:00
# 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>`
- 支持多相机独立标定