GrabBag/App/WeldSeam/Doc/焊缝视觉TCP协议文档.md

349 lines
13 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.

# 焊缝视觉 TCP 协议
## 版本
版本: 1.1
日期: 2026-09-01
---
### 版本历史
| 版本 | 日期 | 修改内容 |
|------|------------|------------------|
| 1.1 | 2026-09-01 | 修改支持多机械臂的情况 |
| 1.0 | 2026-08-04 | 初始版本 |
---
## 1. 概述
- 传输协议:TCP/IP
- 数据编码:UTF-8 文本
- 机械臂服务端端口:由机械臂侧确定并提供
- 视觉控制器服务端监听端口:`7800`
- 报文字段分隔符:`_`
- 报文结束符:`\r\n`
- 一条 TCP 连接同一时刻只处理一个请求
本协议包含两组独立的对接关系:
| 使用场景 | 客户端 | 服务端 | 服务端端口 | 用途 |
|---------|-------|-------|--------|---------|
| 手眼标定 | 标定软件</br>Windows | 机械臂 | 机械臂侧确定 | 标定软件主动连接机械臂读取机械臂当前坐标 |
| 正常工作 | 主控软件 | 视觉控制器 | `7800` | 主控软件主动连接视觉控制器计算,视觉控制器返回计算结果 |
服务端与客户端职责:
- 服务端绑定本机 IP 地址并监听约定端口,等待客户端连接。
- 客户端配置服务端 IP 地址和端口,主动发起 TCP 连接。
- 连接建立后,客户端发送请求,服务端返回应答或计算结果。
- 连接断开后,由客户端负责重新建立连接。
> 两组对接关系使用两条相互独立的 TCP 连接。机械臂服务端端口不受本协议限制,由机械臂侧确定;视觉控制器服务端固定监听端口 `7800`。
> **特别说明:视觉只负责检测,不负责运动控制,可获取运动部分的坐标信息。**
## 2. 通用报文约定
报文格式:
```text
命令_字段1_字段2_...\r\n
```
约定:
- 命令名称使用大写英文字母。
- 每条报文必须以 `\r\n` 结束。
- 字段之间使用半角下划线 `_` 分隔。
- 字段内容不得包含 `_`、回车或换行。
- 接收方应按结束符拆分报文,不能假定一次 TCP 接收操作恰好得到一条完整报文。
- 未识别命令、字段数量错误或字段格式错误时,接收方返回错误报文。
通用错误报文:
```text
ERROR_错误码\r\n
```
| 错误码 | 说明 |
|---|---|
| `UNKNOWN_COMMAND` | 命令无法识别 |
| `INVALID_FORMAT` | 报文格式或字段数量错误 |
| `INVALID_VALUE` | 字段值无法解析或超出允许范围 |
| `BUSY` | 接收方正在处理其他任务 |
| `NOT_READY` | 设备或算法尚未就绪 |
| `CALC_FAILED` | 视觉计算失败 |
| `INTERNAL_ERROR` | 接收方内部错误 |
## 3. 手眼标定协议
### 3.1 场景说明
- 标定工具运行在 Windows 标定软件中,并通过 TCP/IP 对接机械臂。
- 机械臂作为 TCP 服务端,监听端口由机械臂侧确定并提供。
- Windows 标定软件作为 TCP 客户端,按照机械臂侧提供的 IP 地址和端口主动连接机械臂。
- 标定物为多个圆柱。
- 相机一次性扫描全部圆柱;扫描完成后,机械臂依次移动到每个圆柱中心并逐点获取坐标,不对每个圆柱重复扫描。
- 机械臂由现场人员手动移动;视觉系统不发送机械臂运动指令,也不参与机械臂运动控制。
- 进行手眼标定前,必须先完成机械臂工具中心点(Tool Center Point,以下简称“工具 TCP”)标定。
- 标定软件只在采集标定点时读取当前工具 TCP 的机械臂坐标。
> 本节中的“工具 TCP”指机械臂工具中心点;第 1 节中的“TCP/IP”指网络传输协议,两者含义不同。
### 3.2 前置步骤:工具 TCP 标定
1. 在机械臂上安装手眼标定过程中实际使用的工具。
2. 按机械臂厂商提供的方法完成工具 TCP 标定。
3. 在机械臂控制器中保存并启用该工具 TCP。
4. 确认机械臂对外返回的 `X/Y/Z/RX/RY/RZ` 是已启用工具 TCP 的位姿,而不是机械臂法兰盘位姿。
5. 工具 TCP 确认无误后,方可开始相机扫描及手眼标定数据采集。
注意:
- 整个手眼标定过程中必须使用同一个工具和同一组工具 TCP 参数。
- 更换工具、重新安装工具或修改工具 TCP 参数后,之前采集的手眼标定数据全部失效,必须重新采集并重新计算手眼标定结果。
### 3.3 通信时序
```text
标定软件 机械臂
| |
| 相机一次性扫描全部圆柱 |
| 扫描完成 |
| |
| 手动移动工具 TCP 到圆柱 1 中心 |
|------------ GET_POSE ------------->|
|<------ POSE_X_Y_Z_RX_RY_RZ --------|
| 保存圆柱 1 对应坐标 |
| |
| 手动移动工具 TCP 到圆柱 2 中心 |
|------------ GET_POSE ------------->|
|<------ POSE_X_Y_Z_RX_RY_RZ --------|
| 保存圆柱 2 对应坐标 |
| |
| ...依次完成其余圆柱... |
| |
```
### 3.4 手眼标定流程
1. 确认机械臂已经启用完成标定的工具 TCP。
2. 将相机移动到扫描起点。
3. 移动相机,通过编码器触发方式一次性扫描全部圆柱。
4. 完成本次扫描并保存所有圆柱的相机数据;后续逐点取坐标过程中不再移动相机或重复扫描。
5. 手动拖动机械臂,使工具 TCP 到达第 1 个圆柱的中心点。
6. 标定软件向机械臂请求当前工具 TCP 的坐标。
7. 机械臂返回当前工具 TCP 位姿,标定软件将该坐标与第 1 个圆柱的相机数据对应保存。
8. 手动拖动机械臂到下一个圆柱中心,再读取并保存一次工具 TCP 坐标。
9. 重复步骤 8,直至所有圆柱均完成坐标获取。
> 整个手眼标定过程只进行一次相机扫描;机械臂移动和 `GET_POSE` 坐标读取按圆柱数量重复执行。
### 3.5 读取机械臂坐标
标定软件请求:
```text
GET_POSE\r\n
```
机械臂返回:
```text
POSE_X_Y_Z_RX_RY_RZ\r\n
```
示例:
```text
GET_POSE\r\n
POSE_-500.920_1553.084_267.836_89.211_74.550_176.850\r\n
```
字段说明:
| 字段 | 说明 |
|---|---|
| `X` | 当前工具 TCP 的 X 坐标,单位 mm |
| `Y` | 当前工具 TCP 的 Y 坐标,单位 mm |
| `Z` | 当前工具 TCP 的 Z 坐标,单位 mm |
| `RX` | 当前工具 TCP 绕 X 轴的姿态角,单位 deg |
| `RY` | 当前工具 TCP 绕 Y 轴的姿态角,单位 deg |
| `RZ` | 当前工具 TCP 绕 Z 轴的姿态角,单位 deg |
说明:
- 位姿数值建议至少保留 3 位小数。
- 基坐标系、已启用的工具 TCP、欧拉角旋转顺序和角度正方向必须在联调前由机械臂方确认。
- 机械臂无法读取当前位姿时,返回对应的 `ERROR` 报文。
## 4. 视觉计算协议
系统最多支持 2 个物理相机和 4 个机械臂。`START_SCAN_1` 启动物理相机 1,`START_SCAN_3` 启动物理相机 2;两个物理相机不同时扫描。
| 命令 | 用途 |
|---|---|
| `START_SCAN_1` | 启动物理相机 1 扫描 |
| `START_SCAN_3` | 启动物理相机 2 扫描 |
| `GET_RET_1` | 获取物理相机 1 检测得到的机械臂 1 坐标 |
| `GET_RET_2` | 获取物理相机 1 检测得到的机械臂 2 坐标 |
| `GET_RET_3` | 获取物理相机 2 检测得到的机械臂 3 坐标 |
| `GET_RET_4` | 获取物理相机 2 检测得到的机械臂 4 坐标 |
### 4.1 场景说明
- 视觉控制器与主控软件通过 TCP/IP 对接。
- 视觉控制器作为 TCP 服务端,监听端口 `7800`。
- 主控软件作为 TCP 客户端,主动连接视觉控制器的 IP 地址和监听端口。
- 主控软件发送开始扫描命令,并在收到视觉控制器确认后控制相机从起点开始移动。
- 相机移动距离由现场确定;相机移动结束后,主控软件发送结束扫描命令。
- 视觉控制器收到结束扫描命令后自动进入计算,无需主控软件另行发送计算命令。
- 视觉控制器完成检测后主动通知主控软件,主控软件通过 `GET_RET_n` 获取对应机械臂的坐标结果。
- 主控软件负责现场运动控制,视觉控制器不通过本协议控制相机或机械臂运动。
### 4.2 通信时序
```text
主控软件 视觉控制器
| |
| 相机到达扫描起点 |
|----------- START_SCAN_1 ---------->|
|<------------ START_ACK ------------|
| |
| 收到确认后开始移动相机 | 扫描采集
| 相机移动结束并停止 |
|------------- STOP_SCAN ----------->|
|<------------- STOP_ACK ------------|
| | 自动检测
|<----------- RESULT_READY ----------|
|------------- GET_RET_1 ----------->|
|<---- RESULT_OK_PointNum_点集 ------| 机械臂1坐标
|------------- GET_RET_2 ----------->|
|<---- RESULT_OK_PointNum_点集 ------| 机械臂2坐标
| |
```
### 4.3 工作流程
1. 相机到达扫描起点后,主控软件发送 `START_SCAN_1` 或 `START_SCAN_3` 报文。
2. 视觉控制器进入扫描采集状态,并返回 `START_ACK` 报文。
3. 主控软件收到 `START_ACK` 后,方可控制相机从起点开始移动。
4. 相机移动指定距离并停止后,主控软件发送 `STOP_SCAN` 报文。
5. 视觉控制器结束扫描,返回 `STOP_ACK` 报文,并自动进入计算状态。
6. 视觉控制器检测完成后主动发送 `RESULT_READY` 报文。
7. 主控软件收到 `RESULT_READY` 后发送 `GET_RET_n`,获取对应机械臂的坐标结果。
### 4.4 开始扫描
主控软件请求:
```text
START_SCAN_1\r\n
START_SCAN_3\r\n
```
视觉控制器应答:
```text
START_ACK\r\n
```
说明:
- `START_ACK` 表示视觉控制器已经进入扫描采集状态。
- 只允许 `START_SCAN_1` 和 `START_SCAN_3`;前者启动物理相机 1,后者启动物理相机 2。
- 未配置物理相机 2 时,`START_SCAN_3` 返回 `ERROR_INVALID_CAMERA\r\n`。
- 主控软件必须收到 `START_ACK` 后才能开始移动相机,不得在发送开始命令后立即移动。
- 视觉控制器尚未就绪时返回 `ERROR_NOT_READY\r\n`。
- 视觉控制器正在扫描或计算上一次任务时返回 `ERROR_BUSY\r\n`。
### 4.5 结束扫描并自动计算
相机移动结束并停止后,主控软件请求:
```text
STOP_SCAN\r\n
```
视觉控制器应答:
```text
STOP_ACK\r\n
```
说明:
- `STOP_ACK` 表示视觉控制器已结束扫描采集并开始计算,不表示计算已经完成。
- 检测完成后,视觉控制器主动发送 `RESULT_READY\r\n`。该报文只表示检测已经结束,检测是否成功以 `GET_RET_n` 的应答为准。
- 主控软件不需要再发送计算命令,收到 `RESULT_READY` 后通过 `GET_RET_n` 获取结果。
- 未处于扫描状态时收到 `STOP_SCAN`,视觉控制器返回 `ERROR_NOT_READY\r\n`。
### 4.6 查询并返回计算结果
主控软件请求,其中 `n` 为已配置的机械臂编号:
```text
GET_RET_n\r\n
```
视觉控制器根据检测状态返回:
```text
RESULT_PENDING\r\n
RESULT_EMPTY\r\n
RESULT_NG\r\n
```
计算完成且手眼转换成功时返回:
```text
RESULT_OK_PointNum_X1_Y1_Z1_X2_Y2_Z2_..._Xn_Yn_Zn\r\n
```
字段说明:
| 字段 | 说明 |
|---|---|
| `OK` | 计算成功 |
| `PointNum` | 返回的路径点总数,必须与后续坐标点数量一致 |
| `Xn/Yn/Zn` | 第 n 个路径点的坐标,单位 mm |
路径点按焊接行进方向依次排列:
```text
首点 -> 中间修正点1 -> 中间修正点2 -> ... -> 末点
```
每相邻两个路径点构成一段直线。分段间距由现场配置,例如分段间距为 1 m、焊缝总长为 10 m 时,共有 10 段直线,返回首尾在内的 11 个路径点:
```text
RESULT_OK_11_X1_Y1_Z1_X2_Y2_Z2_X3_Y3_Z3_..._X11_Y11_Z11\r\n
```
说明:
- 第 1 个点为焊缝首点,第 `PointNum` 个点为焊缝末点,其余点为中间修正点。
- 当焊缝长度不能被分段间距整除时,末点必须单独返回,最后一段长度可以小于配置的分段间距。
- 坐标值建议保留 3 位小数。
- 路径点所使用的坐标系需要在联调前确认。
- `GET_RET_1/2` 返回物理相机 1 检测得到的机械臂 1/2 坐标,`GET_RET_3/4` 返回物理相机 2 检测得到的机械臂 3/4 坐标。
- 可以重复查询最近一次检测结果。
未得到有效结果时返回:
```text
RESULT_NG\r\n
```
## 5. 超时与重连
- 建议建立 TCP 连接的超时时间为 5 s。
- `GET_POSE` 应答超时时间建议为 3 s。
- `START_SCAN_1/3` 和 `STOP_SCAN` 的应答超时时间建议为 3 s。
- 主控软件未收到 `START_ACK` 时不得移动相机,应检查连接及视觉控制器状态。
- 视觉计算耗时与现场数据量有关,`RESULT_READY` 等待超时时间由双方根据现场节拍配置。
- TCP 连接断开后,由 TCP 客户端重新建立连接;TCP 服务端继续监听并等待连接。
- 扫描过程中连接断开时,本次扫描数据无效。连接恢复后,相机应重新回到扫描起点,再开始新的扫描任务。
- 连接断开或结果超时后,不应自动重复发送运动相关指令;主控软件应先确认现场设备状态,再决定是否重新扫描。