GrabBag/App/AutoLoading/Doc/TCP_PROTOCOL.md

481 lines
15 KiB
Markdown
Raw Permalink 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.

# 自动装车视觉检测系统 TCP/IP 通信协议
**协议版本**: v1.0
**文档日期**: 2026-03-14
**维护单位**: 自动装车视觉检测系统开发组
## 1. 协议概述
### 1.1 通信方式
- **协议类型**: TCP/IP
- **数据格式**: JSON
- **编码方式**: UTF-8
- **端口**: 默认 6800可配置
- **连接模式**: 长连接,支持心跳保活
### 1.2 角色定义
- **服务端**: 视觉检测系统(本系统)
- **客户端**: 小车控制器
### 1.3 通信流程
```
客户端 服务端
| |
|-------- 建立TCP连接 ------------------->|
|<------- 连接确认 -----------------------|
| |
|-------- 发送检测请求JSON----------->|
| |
| 处理检测任务 |
| 执行视觉算法 |
| |
|<------- 返回检测结果JSON------------|
| |
|-------- 心跳包 ----------------------->|
|<------- 心跳响应 ----------------------|
| |
```
## 2. 消息格式定义
### 2.1 通用消息结构
所有消息均为JSON格式包含以下基本字段
```json
{
"msgType": "请求类型或响应类型",
"timestamp": "时间戳(毫秒)",
"seq": "请求序号",
"data": {
// 具体数据内容
}
}
```
### 2.2 字段说明
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| msgType | string | 是 | 消息类型标识 |
| timestamp | long | 是 | 消息发送时间戳Unix毫秒 |
| seq | int | 是 | 请求序号从1开始递增响应使用相同序号 |
| data | object | 是 | 消息数据体 |
## 3. 消息类型定义
### 3.1 消息类型枚举
| msgType | 说明 | 方向 |
|---------|------|------|
| HEARTBEAT_REQ | 心跳请求 | 客户端→服务端 |
| HEARTBEAT_RESP | 心跳响应 | 服务端→客户端 |
| TAIL_DETECT_REQ | 车尾检测请求 | 客户端→服务端 |
| TAIL_DETECT_RESP | 车尾检测响应 | 服务端→客户端 |
| MIDDLE_DETECT_REQ | 车厢中段检测请求 | 客户端→服务端 |
| MIDDLE_DETECT_RESP | 车厢中段检测响应 | 服务端→客户端 |
| ERROR_RESP | 错误响应 | 服务端→客户端 |
## 4. 完整检测流程
从车尾到车头的完整检测通信流程:
```
客户端(小车控制器) 服务端(视觉检测系统)
| |
|========== 1. 建立连接 ========================|
| |
|-------- HEARTBEAT_REQ (seq=1) -------------->|
|<------- HEARTBEAT_RESP (seq=1) --------------|
| |
|========== 2. 车尾入口检测 ====================|
| |
| 小车到达车尾入口 |
|-------- TAIL_DETECT_REQ (seq=2) ------------>|
| 处理检测 |
|<------- TAIL_DETECT_RESP (seq=2) -----------|
| 返回:偏移-15.5mm角度2.3° |
| |
| 调整姿态,进入车厢 |
| |
|========== 3. 中段导航检测(循环)=============|
| |
| 前进1米 |
|-------- MIDDLE_DETECT_REQ (seq=3) --------->|
| forwardDistance=1000 |
| 处理检测 |
|<------- MIDDLE_DETECT_RESP (seq=3) ---------|
| 返回:偏移-8.2mm角度1.5° |
| hasFrontWall=false |
| |
| 调整方向继续前进1米 |
|-------- MIDDLE_DETECT_REQ (seq=4) --------->|
| forwardDistance=2000 |
| 处理检测 |
|<------- MIDDLE_DETECT_RESP (seq=4) ---------|
| 返回:偏移-5.0mm角度0.8° |
| hasFrontWall=false |
| |
| 调整方向继续前进1米 |
|-------- MIDDLE_DETECT_REQ (seq=5) --------->|
| forwardDistance=3000 |
| 处理检测 |
| 扫描到前端 |
|<------- MIDDLE_DETECT_RESP (seq=5) ---------|
| 返回:偏移-2.5mm角度0.3° |
| hasFrontWall=true |
| frontDistance=2500mm |
| 车厢宽度=2400mm |
| 左右侧边界直线 |
| 左侧加强筋×2 |
| 右侧加强筋×2 |
| |
|========== 4. 获得完整车厢信息 ================|
| |
| 进行装载规划 |
| |
|-------- HEARTBEAT_REQ (seq=6) ------------->|
|<------- HEARTBEAT_RESP (seq=6) -------------|
| |
```
**流程说明**
1. **建立连接**:客户端连接服务端,通过心跳确认通信正常
2. **车尾检测**:小车到达车尾入口,检测偏移和角度,调整后进入车厢
3. **中段导航**:小车在车厢内前进,每前进一定距离进行一次检测
- 未检测到前端时:只返回偏移、角度等导航数据
- 检测到前端时:返回完整车厢信息(边界、宽度、加强筋)
4. **完成检测**:获得完整车厢空间信息,进行装载规划
## 5. 心跳协议
### 5.1 心跳请求 (HEARTBEAT_REQ)
**客户端 → 服务端**
```json
{
"msgType": "HEARTBEAT_REQ",
"timestamp": 1678886400000,
"seq": 1,
"data": {}
}
```
### 5.2 心跳响应 (HEARTBEAT_RESP)
**服务端 → 客户端**
```json
{
"msgType": "HEARTBEAT_RESP",
"timestamp": 1678886400100,
"seq": 1,
"data": {
"status": "OK"
}
}
```
**说明**:
- 心跳间隔建议: 30秒
- 超时时间: 90秒3个心跳周期
- 超时后自动断开连接
## 6. 检测协议
### 6.1 阶段一:车尾检测
#### 6.1.1 车尾检测请求 (TAIL_DETECT_REQ)
**客户端 → 服务端**
```json
{
"msgType": "TAIL_DETECT_REQ",
"timestamp": 1678886400000,
"seq": 2,
"data": {}
}
```
#### 6.1.2 车尾检测响应 (TAIL_DETECT_RESP)
**服务端 → 客户端**
```json
{
"msgType": "TAIL_DETECT_RESP",
"timestamp": 1678886401500,
"seq": 2,
"data": {
"result": "SUCCESS",
"errorCode": 0,
"errorMsg": "",
"detectData": {
"lateralOffset": -15.5,
"offsetDirection": "LEFT",
"rotationAngle": 2.3
}
}
}
```
**响应参数说明**:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| result | string | 检测结果SUCCESS-成功FAILED-失败 |
| errorCode | int | 错误码0表示成功 |
| errorMsg | string | 错误信息 |
| detectData | object | 检测数据对象 |
**detectData 字段说明**:
| 字段名 | 类型 | 单位 | 说明 |
|--------|------|------|------|
| lateralOffset | double | mm | 左右偏移距离,负值表示左偏,正值表示右偏 |
| offsetDirection | string | - | 偏移方向LEFT-左偏RIGHT-右偏CENTER-居中 |
| rotationAngle | double | 度 | 偏转角度,逆时针为正,顺时针为负 |
### 6.2 阶段二:车厢中段检测
#### 6.2.1 车厢中段检测请求 (MIDDLE_DETECT_REQ)
**客户端 → 服务端**
```json
{
"msgType": "MIDDLE_DETECT_REQ",
"timestamp": 1678886410000,
"seq": 3,
"data": {
"forwardDistance": 1000.0
}
}
```
**请求参数说明**:
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| forwardDistance | double | 是 | 前进距离mm |
#### 6.2.2 车厢中段检测响应 (MIDDLE_DETECT_RESP)
**服务端 → 客户端**
**情况1未检测到车厢前端 (hasFrontWall=false)**
```json
{
"msgType": "MIDDLE_DETECT_RESP",
"timestamp": 1678886411500,
"seq": 3,
"data": {
"result": "SUCCESS",
"errorCode": 0,
"errorMsg": "",
"detectData": {
"lateralOffset": -8.2,
"offsetDirection": "LEFT",
"forwardAngle": 1.5,
"frontDistance": -1,
"hasFrontWall": false
}
}
}
```
**情况2检测到车厢前端 (hasFrontWall=true)**
```json
{
"msgType": "MIDDLE_DETECT_RESP",
"timestamp": 1678886411500,
"seq": 3,
"data": {
"result": "SUCCESS",
"errorCode": 0,
"errorMsg": "",
"detectData": {
"lateralOffset": -8.2,
"offsetDirection": "LEFT",
"forwardAngle": 1.5,
"frontDistance": 3500.0,
"hasFrontWall": true,
"leftSideLine": {
"startPoint": {"x": 0.0, "y": -1200.0, "z": 0.0},
"endPoint": {"x": 5000.0, "y": -1200.0, "z": 0.0}
},
"rightSideLine": {
"startPoint": {"x": 0.0, "y": 1200.0, "z": 0.0},
"endPoint": {"x": 5000.0, "y": 1200.0, "z": 0.0}
},
"compartmentWidth": 2400.0,
"leftRibs": [
{
"ribId": 1,
"distanceToFront": 1500.0,
"width": 120.0,
"height": 80.0
},
{
"ribId": 2,
"distanceToFront": 3000.0,
"width": 120.0,
"height": 80.0
}
],
"rightRibs": [
{
"ribId": 1,
"distanceToFront": 1500.0,
"width": 120.0,
"height": 80.0
},
{
"ribId": 2,
"distanceToFront": 3000.0,
"width": 120.0,
"height": 80.0
}
]
}
}
}
```
**detectData 字段说明**:
| 字段名 | 类型 | 单位 | 说明 |
|--------|------|------|------|
| lateralOffset | double | mm | 左右偏移距离 |
| offsetDirection | string | - | 偏移方向LEFT-左偏RIGHT-右偏CENTER-居中 |
| forwardAngle | double | 度 | 前进方向角,相对于车厢中心线 |
| frontDistance | double | mm | 到车厢前端的距离,-1表示未检测到 |
| hasFrontWall | bool | - | 是否检测到车厢前端 |
| leftSideLine | object | - | 左侧车厢直线仅hasFrontWall=true时有效 |
| rightSideLine | object | - | 右侧车厢直线仅hasFrontWall=true时有效 |
| compartmentWidth | double | mm | 车厢宽度仅hasFrontWall=true时有效 |
| leftRibs | array | - | 左侧加强筋数组仅hasFrontWall=true时有效 |
| rightRibs | array | - | 右侧加强筋数组仅hasFrontWall=true时有效 |
**侧边线对象 (SideLine)**:
| 字段名 | 类型 | 单位 | 说明 |
|--------|------|------|------|
| startPoint | object | mm | 起点坐标 {x, y, z} |
| endPoint | object | mm | 终点坐标 {x, y, z} |
**加强筋对象 (ReinforcementRib)**:
| 字段名 | 类型 | 单位 | 说明 |
|--------|------|------|------|
| ribId | int | - | 加强筋编号 |
| distanceToFront | double | mm | 距离车厢前端的距离 |
| width | double | mm | 加强筋宽度 |
| height | double | mm | 凸起高度 |
## 7. 错误响应
### 7.1 错误响应格式 (ERROR_RESP)
**服务端 → 客户端**
```json
{
"msgType": "ERROR_RESP",
"timestamp": 1678886401000,
"seq": 2,
"data": {
"errorCode": 1001,
"errorMsg": "相机连接失败",
"errorDetail": "Camera device not found: Camera-01"
}
}
```
### 7.2 错误码定义
| 错误码 | 错误类型 | 说明 |
|--------|----------|------|
| 0 | SUCCESS | 成功 |
| 1001 | CAMERA_ERROR | 相机错误 |
| 1002 | ALGORITHM_ERROR | 算法处理错误 |
| 1003 | TIMEOUT_ERROR | 检测超时 |
| 1004 | INVALID_REQUEST | 无效请求 |
| 1005 | SYSTEM_BUSY | 系统繁忙 |
| 1006 | CALIBRATION_ERROR | 标定数据错误 |
| 1007 | DATA_PARSE_ERROR | 数据解析错误 |
| 1008 | NETWORK_ERROR | 网络通信错误 |
| 1009 | DETECTION_FAILED | 检测失败(未检测到目标) |
| 1010 | LOW_CONFIDENCE | 置信度过低 |
| 9999 | UNKNOWN_ERROR | 未知错误 |
## 8. 坐标系定义
### 8.1 世界坐标系
- **原点**: 车厢尾部中心点
- **X轴**: 车厢长度方向,指向车头为正
- **Y轴**: 车厢宽度方向,指向右侧为正
- **Z轴**: 车厢高度方向,向上为正
- **单位**: 毫米 (mm)
### 8.2 角度定义
- **偏转角 (rotationAngle)**: 小车相对于车厢中心线的旋转角度
- 逆时针旋转为正
- 顺时针旋转为负
- 范围: [-180°, 180°]
- **前进方向角 (forwardAngle)**: 小车前进方向相对于车厢中心线的夹角
- 向右偏为正
- 向左偏为负
- 范围: [-90°, 90°]
## 9. 通信约定
### 9.1 连接管理
1. **连接建立**: 客户端主动连接服务端
2. **连接保持**: 通过心跳机制保持连接
3. **断线重连**: 客户端负责断线重连重连间隔建议5秒
4. **连接超时**: 90秒无心跳自动断开
### 9.2 消息发送
1. **消息编码**: UTF-8
2. **消息分隔**: 每条JSON消息以换行符 `\n` 结尾
3. **消息大小**: 单条消息不超过 10MB
4. **消息顺序**: 保证请求-响应的顺序性
### 9.3 超时设置
| 操作类型 | 超时时间 | 说明 |
|----------|----------|------|
| 连接超时 | 10秒 | TCP连接建立超时 |
| 心跳超时 | 90秒 | 3个心跳周期 |
| 车尾检测 | 30秒 | 单次检测超时 |
| 中段检测 | 30秒 | 单次检测超时 |
| 前端检测 | 60秒 | 全扫描检测超时 |
### 9.4 并发控制
1. **单连接模式**: 每个客户端只能建立一个TCP连接
2. **串行处理**: 同一连接的检测请求串行处理
3. **队列机制**: 多个请求进入队列等待处理
4. **最大队列**: 队列最大长度为10超出返回系统繁忙错误
## 10. 数据精度要求
| 数据类型 | 精度 | 说明 |
|----------|------|------|
| 位置坐标 | 0.1mm | 小数点后1位 |
| 偏移距离 | 0.1mm | 小数点后1位 |
| 角度 | 0.1° | 小数点后1位 |
| 置信度 | 0.01 | 小数点后2位 |
| 时间戳 | 1ms | Unix毫秒时间戳 |