GrabBag/App/DiscHolePose/Doc/砂轮盘孔定位ModbusTCP协议文档.md

121 lines
4.5 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.

# 砂轮盘孔定位 / 砂轮盘架子定位 ModbusTCP 协议
## 1. 概述
- 协议Modbus TCP
- 默认端口:`502`
- 当前实现使用保持寄存器
## 2. 寄存器定义
| 地址 | 长度 | 访问 | 说明 |
|---|---:|---|---|
| `0` | 1 | 写 | 触发检测,`1=砂轮盘孔检测``2=砂轮盘架子检测` |
| `1` | 1 | 读 | 工作状态,`0=空闲``1=检测中``2=完成``3=异常` |
| `2` | 2 | 写 | 机械臂当前 `X``float32` |
| `4` | 2 | 写 | 机械臂当前 `Y``float32` |
| `6` | 2 | 写 | 机械臂当前 `Z``float32` |
| `8` | 2 | 写 | 机械臂当前 `A``float32` |
| `10` | 2 | 写 | 机械臂当前 `B``float32` |
| `12` | 2 | 写 | 机械臂当前 `C``float32` |
| `14` | 2 | 读 | 接近点 `AX``float32` |
| `16` | 2 | 读 | 接近点 `AY``float32` |
| `18` | 2 | 读 | 接近点 `AZ``float32` |
| `20` | 2 | 读 | 接近点 `A``float32`(与目标姿态相同) |
| `22` | 2 | 读 | 接近点 `B``float32`(与目标姿态相同) |
| `24` | 2 | 读 | 接近点 `C``float32`(与目标姿态相同) |
| `26` | 2 | 读 | 目标点 `X``float32` |
| `28` | 2 | 读 | 目标点 `Y``float32` |
| `30` | 2 | 读 | 目标点 `Z``float32` |
| `32` | 2 | 读 | 目标点 `A``float32` |
| `34` | 2 | 读 | 目标点 `B``float32` |
| `36` | 2 | 读 | 目标点 `C``float32` |
说明:
- `2~13` 为机械臂当前位姿输入
- `14~25`**接近点** 输出(机械臂先运动到这里)
- `26~37`**目标点** 输出(从接近点沿工具 Z 轴直线下压到此)
- 接近点与目标点的 `A/B/C` 姿态字段值相同
- 每个 `float32` 占 2 个保持寄存器
- 当前仅输出第一个目标结果
## 3. 姿态输入/输出顺序
`A/B/C` 的实际含义由网络配置中的 `poseOutputOrder` 统一控制。
支持顺序:
- `RX-RY-RZ`
- `RX-RZ-RY`
- `RY-RX-RZ`
- `RY-RZ-RX`
- `RZ-RX-RY`
- `RZ-RY-RX`
同一个配置同时作用于:
- Modbus 输入 `A/B/C`
- Modbus 输出 `A/B/C`
例如,当 `poseOutputOrder = RZ-RY-RX` 时:
- 地址 `8~13` 表示输入 `RZ/RY/RX`
- 地址 `20~25` 表示接近点输出 `RZ/RY/RX`
- 地址 `32~37` 表示目标点输出 `RZ/RY/RX`
## 4. 工作状态说明
| 状态值 | 含义 |
|---:|---|
| `0` | 空闲 |
| `1` | 检测中 |
| `2` | 检测完成 |
| `3` | 异常或请求不支持 |
## 5. 触发流程
1. 确认地址 `1` 当前为 `0`
2. 将机械臂当前位姿写入 `2~13`
3. 向地址 `0` 写入 `1`(砂轮盘孔检测)或 `2`(砂轮盘架子检测)
4. 轮询地址 `1`
5. 当地址 `1=2` 时,读取 `14~37`(接近点 + 目标点)
6. 机械臂先运动到接近点 `14~25`,再保持姿态沿工具 Z 轴直线下压到目标点 `26~37`
7. 当地址 `1=3` 时,本次检测失败
## 6. 结果语义
- **砂轮盘孔检测**输出:机械臂坐标系下的孔中心 `接近点(AX/AY/AZ) + 目标点(X/Y/Z) + A/B/C`
- 孔姿态由法向量normDir计算Pitch 由 Z 分量与水平面夹角确定Yaw 由 X/Y 分量确定Roll 固定为 0
- **砂轮盘架子检测**输出:机械臂坐标系下的架子中心 `接近点(AX/AY/AZ) + 目标点(X/Y/Z) + A/B/C`
- 架子姿态由三轴向量pose_x/pose_y/pose_z构建旋转矩阵后提取欧拉角
说明:
- 内部姿态求解顺序由 `eulerOrder` 控制
- `poseOutputOrder` 只控制寄存器中姿态字段的排列顺序
- 接近点与目标点姿态一致;机械臂到达接近点后沿工具 Z 轴直线下压到目标点
- 接近点 = 目标点在 Eye 坐标系下、沿"Z 轴方向"偏移 `approachOffset`,再经手眼矩阵变换到机器人坐标系得到
- `approachOffset` 每台相机独立配置(手眼标定页的"接近点偏移(mm)");为 0 时接近点与目标点重合
## 7. 算法说明
使用 `workpieceHolePositioning` 算法库:
- **砂轮盘孔定位**`sx_getDiscHolePose()`
- 输入:扫描线数据 + 角点检测参数cornerParam
- 输出:孔中心位置 + 法向量方向
- **砂轮盘架子定位**`sx_getDiscRackCenterPosition()`
- 输入:扫描线数据 + 角点检测参数cornerParam
- 输出:架子中心位置 + 三轴方向向量pose_x/pose_y/pose_z
## 8. TCP 文本协议
除 ModbusTCP 外,还支持 TCP 文本协议(默认端口 `7800`
- 请求:`D1_X_Y_Z_A_B_C\r\n`D=砂轮盘孔检测)或 `R1_X_Y_Z_A_B_C\r\n`R=砂轮盘架子检测)
- 数字表示相机编号1 或 2
- 成功响应:`1_AX_AY_AZ_A_B_C_X_Y_Z_A_B_C\r\n`12 个 float接近点 6 个 + 目标点 6 个)
- 失败响应:`0_0_0_0_0_0_0_0_0_0_0_0\r\n`