# 自动装车视觉检测系统 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毫秒时间戳 |