GrabBag/App/AutoLoading/Doc/TCP_PROTOCOL.md

15 KiB
Raw Permalink Blame History

自动装车视觉检测系统 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格式包含以下基本字段

{
    "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)

客户端 → 服务端

{
    "msgType": "HEARTBEAT_REQ",
    "timestamp": 1678886400000,
    "seq": 1,
    "data": {}
}

5.2 心跳响应 (HEARTBEAT_RESP)

服务端 → 客户端

{
    "msgType": "HEARTBEAT_RESP",
    "timestamp": 1678886400100,
    "seq": 1,
    "data": {
        "status": "OK"
    }
}

说明:

  • 心跳间隔建议: 30秒
  • 超时时间: 90秒3个心跳周期
  • 超时后自动断开连接

6. 检测协议

6.1 阶段一:车尾检测

6.1.1 车尾检测请求 (TAIL_DETECT_REQ)

客户端 → 服务端

{
    "msgType": "TAIL_DETECT_REQ",
    "timestamp": 1678886400000,
    "seq": 2,
    "data": {}
}

6.1.2 车尾检测响应 (TAIL_DETECT_RESP)

服务端 → 客户端

{
    "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)

客户端 → 服务端

{
    "msgType": "MIDDLE_DETECT_REQ",
    "timestamp": 1678886410000,
    "seq": 3,
    "data": {
        "forwardDistance": 1000.0
    }
}

请求参数说明:

字段名 类型 必填 说明
forwardDistance double 前进距离mm

6.2.2 车厢中段检测响应 (MIDDLE_DETECT_RESP)

服务端 → 客户端

情况1未检测到车厢前端 (hasFrontWall=false)

{
    "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)

{
    "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)

服务端 → 客户端

{
    "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毫秒时间戳