标定
四点标定
说明:机器人末梢移动到并标定四个点,计算后可得杆长度和轴零点偏移,若认可计算结果,可将计算结果填入 DH 参数。
上位机四点标定计算请求
命令字: 0x3700
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| ParamOf4Points | double[] | 长度为2,L1和 L2长度。两参数分别为机器人末梢从标记点 A 移动到标记点 C 时 X 的移动距离和 Y 的移动距离 |
{
"ParamOf4Points": [85.0, 70.0]
}上位机 N 号点标定请求
命令字: 0x3701
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| pointNum | int | 范围[0,3],标定点编号 |
| status | int | 范围[0,1],标定状态。0表示取消标定,1表示标定 |
{
"pointNum": 0,
"status": 1
}控制器回复上位机 N 号点标定位置信息
命令字: 0x3702
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| pointNum | int | 范围[0,3],标定点编号 |
| pos | double[] | 长度为4,位置信息列表 |
{
"pointNum": 0,
"pos": [0.0, 0.0, 0.0, 0.0]
}控制器回复上位机标定计算结果
命令字: 0x3703
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| dtheta | double[] | 长度为2,轴零点偏移列表。值全为-1表示计算失败 |
| length | double[] | 长度为2,杆长度列表。值全为-1表示计算失败 |
| result | bool | 是否计算成功 |
{
"dtheta": [-1.0, -1.0],
"length": [-1.0, -1.0],
"result": false
}上位机请求将计算结果填入 DH 参数
命令字: 0x3704
{}控制器回复上位机填入 DH 参数结果
命令字: 0x3705
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| apply | bool | 计算结果填入是否成功 |
{
"apply": true
}上位机查询标定信息
命令字: 0x3706
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| dtheta | double[] | 长度为2,轴零点偏移列表。null 表示没有计算结果 |
| length | double[] | 长度为2,杆长度列表。null 表示没有计算结果 |
| result | bool | 是否计算成功 |
| status | int[] | 点位标定状态列表。0表示未标定,1表示已标定 |
{
"dtheta": [null, null],
"length": [null, null],
"result": false,
"status": [0, 1, 0, 1]
}20点标定
说明:一种用于校准机器人的方法,通过在特定的20个点上进行标定,以确保机器人的准确性和稳定性。
上位机标定计算请求
命令字: 0x3710
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 |
| noCalZero | bool | 是否为校准零点 |
| robot | int | 范围[1,4],当前机器人号 |
| tool | int | 范围[1,999],当前工具手编号 |
{
"calibrationType": 20,
"noCalZero": false,
"robot": 1,
"tool": 1
}上位机标定 N 号点请求
命令字: 0x3711
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 |
| point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] |
| robot | int | 范围[1,4],当前机器人号 |
| tool | int | 范围[1,999],当前工具手编号 |
{
"calibrationType": 20,
"point": 1,
"robot": 1,
"tool": 1
}控制器回复上位机 N 号点标定信息
命令字: 0x3712
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 |
| point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] |
| position | double[] | 标定点关节坐标信息列表,长度为6 |
| robot | int | 范围[1,4],当前机器人号 |
{
"calibrationType": 20,
"point": 1,
"position": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
"robot": 1
}控制器回复上位机标定计算完成结果
命令字: 0x3713
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| distance | double | 标定计算结果。结果为-1表示计算失败,结果>10则请重新标定 |
| result | bool | 标定计算是否成功 |
| robot | int | 范围[1,4],当前机器人号 |
{
"distance": 464.473876425245,
"result": true,
"robot": 1
}上位机发送设置标定结果为零点
命令字: 0x3714
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 |
| robot | int | 范围[1,4],当前机器人号 |
| tool | int | 范围[1,999],当前工具手编号 |
{
"calibrationType": 12,
"robot": 1,
"tool": 1
}控制器回复上位机标定结果为零点设置结果
命令字: 0x3715
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| apply | bool | 设置为零点是否成功 |
| robot | int | 范围[1,4],当前机器人号 |
{
"apply": true,
"robot": 1
}上位机查询全部点标定状态
命令字: 0x3716
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 |
| robot | int | 范围[1,4],当前机器人号 |
| tool | int | 范围[1,999],当前工具手号 |
{
"calibrationType": 20,
"robot": 1,
"tool": 1
}控制器回复上位机全部点标定状态
命令字: 0x3717
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 |
| robot | int | 范围[1,4],当前机器人号 |
| status | int[] | 点位标定状态列表。1表示已标定,0表示未标定。长度为当前使用标点法 |
{
"calibrationType": 20,
"robot": 1,
"status": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
}上位机请求清除 N 号点标定状态
命令字: 0x3718
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 |
| point | int | 范围[0,20],标定点编号。20表示清除所有点 |
| robot | int | 范围[1,4],当前机器人号 |
| tool | int | 范围[1,999],当前工具手编号 |
{
"calibrationType": 20,
"point": 20,
"robot": 1,
"tool": 1
}上位机查询 N 号点位置信息
命令字: 0x3719
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 |
| point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] |
| robot | int | 范围[1,4],当前机器人号 |
| tool | int | 范围[1,999],当前工具手编号 |
{
"calibrationType": 20,
"point": 1,
"robot": 1,
"tool": 1
}控制器回复上位机 N 号点位置信息
命令字: 0x371A
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrationType | int | 标定点方法。2表示2点法,12表示12点法,15表示15点法,20表示20点法有校准零点,21表示21点法无校准零点 |
| point | int | 标定点编号。2点法时范围[0,1],12点法时范围[0,11],15点法时范围[0,14],20点法时范围[0,19] |
| position | double[] | 标定点关节坐标信息列表,长度为6 |
| robot | int | 范围[1,4],当前机器人号 |
{
"calibrationType": 20,
"point": 1,
"position": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
"robot": 1
}上位机请求移动到计算结果位置
命令字: 0x371B
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| robot | int | 范围[1,4],当前机器人号 |
{
"robot": 1
}上位机查询是否可以打开标定页面
命令字: 0x371C
{}控制器回复上位机是否可以打开标定页面
命令字: 0x371D
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| canCalibration | bool | 上位机是否可以打开标定页面 |
{
"canCalibration": true
}外部轴标定
说明:包含有旋转轴标定和直线轴(地轨)协同参数。
上位机外部旋转轴标定计算请求
命令字: 0x3730
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrateNum | int | 范围[1,3],当前轴组号 |
| robot | int | 范围[1,4],当前机器人号 |
{
"calibrateNum": 1,
"robot": 1
}上位机外部轴标定 N 号点请求
命令字: 0x3731
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| externalGroupNum | int | 范围[1,3],当前轴组号 |
| pointNum | int | 范围[0,4],标记点编号。旋转双周范围[0,4];旋转单轴范围[0,2] |
| robot | int | 范围[1,4],当前机器人号 |
{
"externalGroupNum": 1,
"pointNum": 0,
"robot": 1
}控制器回复上位机外部轴 N 号点标定信息
命令字: 0x3732
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| externalGroupNum | int | 范围[1,3],当前轴组号 |
| pointNum | int | 范围[0,4],标记点编号。旋转双周范围[0,4];旋转单轴范围[0,2] |
| pos | double[] | 标定点直角坐标信息列表,长度为6 |
| robot | int | 范围[1,4],当前机器人号 |
{
"externalGroupNum": 1,
"pointNum": 0,
"pos": [470.746, 0.0, 817.334, 3.14159265359, 0.0, 0.0],
"robot": 1
}控制器回复上位机外部轴标定计算结果
命令字: 0x3733
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| result | bool | 外部轴标定计算是否成功 |
| robot | int | 范围[1,4],当前机器人号 |
{
"result": true,
"robot": 1
}上位机查询机器人绑定外部轴标定状态
命令字: 0x3734
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| robot | int | 范围[1,4],当前机器人编号 |
{
"robot": 1
}控制器回复上位机机器人绑定外部轴标定状态
命令字: 0x3735
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrateResult | bool[] | 长度为3,机器人绑定外部轴标定状态。true 表示已标定,false 表示未标定 |
| robot | int | 范围[1,4],当前机器人号 |
{
"calibrateResult": [false, false, false],
"robot": 1
}上位机设置当前协作外部轴组号
命令字: 0x3736
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| externalGroupNum | int | 范围[0,2],协作外部轴组号 |
| robot | int | 范围[1,4],当前机器人号 |
{
"externalGroupNum": 0,
"robot": 1
}上位机查询当前协作外部轴组号
命令字: 0x3737
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| robot | int | 范围[1,4],当前机器人编号 |
{
"robot": 1
}控制器回复上位机当前协作外部轴组号
命令字: 0x3738
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| externalGroupNum | int | 范围[0,2],协作外部轴组号 |
| robot | int | 范围[1,4],当前机器人号 |
{
"externalGroupNum": 0,
"robot": 1
}上位机设置地轨协同参数
命令字: 0x3739
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrateResult | bool | 地轨是否协同。协同:当启用地址是确定 |
| conversionRatio | double[] | 长度为3,轴转换比列表,范围[-9998,9998]。超过当前轴数的部分默认为1.0 |
| trackMap | int[] | 长度为3,地轨各轴方向。0表示未选择方向,1表示 X 方向,2表示 Y 轴方向,3表示 Z 轴方向。超过当前轴数的部分默认为0 |
{
"calibrateResult": true,
"conversionRatio": [58.0, 1.0, 1.0],
"trackMap": [1, 0, 0]
}上位机查询当前机器人地轨协同参数
命令字: 0x373A
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| robot | int | 范围[1,4],当前机器人编号 |
{
"robot": 1
}控制器回复当前机器人地轨协同参数
命令字: 0x373B
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| calibrateResult | bool | 地轨是否协同 |
| conversionRatio | double[] | 长度为3,轴转换比列表,范围[-9998,9998]。初始化为9999 |
| robot | int | 当前机器人号 |
| trackMap | int[] | 长度为3,地轨各轴方向。0表示未选择方向,1表示 X 方向,2表示 Y 轴方向,3表示 Z 轴方向。初始化为0 |
{
"calibrateResult": false,
"conversionRatio": [9999, 9999, 9999],
"robot": 1,
"trackMap": [0, 0, 0]
}上位机发送设置外部轴标定结果
命令字: 0x373C
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| syncPositionerNum | int | 范围[1,3],当前轴组号 |
| resultArray | double[][] | 各轴标定结果列表。一维长度为当前外部轴总轴数,二维长度为6 |
{
"syncPositionerNum": 1,
"resultArray": [
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]
]
}上位机查询外部轴标定结果
命令字: 0x373D
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| syncPositionerNum | int | 范围[1,3],当前轴组号 |
{
"syncPositionerNum": 1
}控制器回复上位机外部轴标定结果
命令字: 0x373E
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| syncPositionerNum | int | 范围[1,3],当前轴组号 |
| calibrateResult | bool | 外部轴标定计算结果 |
| resultArray | double[][] | 各轴标定结果列表。一维长度为当前外部轴总轴数,二维长度为6 |
{
"syncPositionerNum": 1,
"calibrateResult": false,
"resultArray": [
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]
]
}上位机发送设置地轨方向校准系数
命令字: 0x373F
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| axis_num | int | 范围[1,3],地轨轴号 |
| direction_ratio | double[] | 方向校准系数,范围[-100,100]。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 |
{
"axis_num": 1,
"direction_ratio": [1.0, 0.0, 0.0]
}上位机查询地轨方向校准系数
命令字: 0x3740
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| axis_num | int | 范围[1,3],地轨轴号 |
{
"axis_num": 1
}控制器回复地轨方向校准系数
命令字: 0x3741
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| axis_num | int | 范围[1,3],地轨轴号 |
| direction_ratio | double[] | 方向校准系数,范围[-100,100]。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 |
{
"axis_num": 1,
"direction_ratio": [1.0, 0.0, 0.0]
}上位机标定轴 N 号点请求
命令字: 0x3742
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| axis_num | int | 范围[1,3],当前标定的轴号 |
| point_num | int | 范围[1,2],当前标定点编号 |
{
"axis_num": 1,
"point_num": 1
}上位机请求地轨移动到标记点
命令字: 0x3743
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| axis_num | int | 范围[1,3],当前标定的轴号 |
| point_num | int | 范围[1,2],当前标定点编号 |
{
"axis_num": 1,
"point_num": 1
}上位机地轨标定点计算请求
命令字: 0x3744
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| axis_num | int | 范围[1,3],当前标定的轴号 |
{
"axis_num": 1
}控制器回复上位机标定计算结果
命令字: 0x3745
| 参数名 | 类型 | 范围/说明 |
|---|---|---|
| axis_num | int | 范围[1,3],地轨轴号 |
| direction_ratio | double[] | 方向校准系数。参数分别为 X 方向系数、Y 方向系数、Z 方向系数 |
{
"axis_num": 1,
"direction_ratio": [1.0, 0.0, 0.0]
}标定算法参数
四点标定算法
四点标定通过四个已知位置的标定点,利用几何关系计算出机器人杆长和轴零点偏移。
算法原理
- 机器人末梢移动到四个标定点(标记点 A, B, C, D)
- 通过最小二乘法求解杆长 L1, L2 和轴零点偏移 dtheta1, dtheta2
- 计算结果可填入 DH 参数,修正运动学模型
算法参数 (ParamOf4Points)
| 参数 | 说明 | 单位 |
|---|---|---|
| L1 | 机器人末梢从标记点A移动到C时X方向移动距离 | mm |
| L2 | 机器人末梢从标记点A移动到C时Y方向移动距离 | mm |
20点标定算法
20点标定通过在不同姿态下的大量采样点,利用非线性优化算法求解完整的运动学参数。
优化目标
最小化所有标定点的位置误差:min sum(||P_actual_i - P_target||)
其中 P_actual_i 是第 i 个标定点的实际位置,P_target 是标记点位置。
收敛条件
| 条件 | 阈值 | 说明 |
|---|---|---|
| 标定距离 | < 10mm | 标定计算结果 distance < 10 表示标定成功 |
| 计算成功 | result=true | 优化算法成功收敛 |
标定点方法选择
| calibrationType | 方法 | 标定点数 | 校准内容 | 适用场景 |
|---|---|---|---|---|
| 2 | 2点法 | 2 | 简单校准 | 快速校准 |
| 12 | 12点法 | 12 | 零点+工具手 | 未激光标定+焊枪 |
| 15 | 15点法 | 15 | 零点+工具手(精确) | 高精度场景 |
| 20 | 20点法(校准零点) | 20 | 零点+工具手 | 零点丢失 |
| 21 | 21点法(不校准零点) | 21 | 仅工具手 | 零点已校准 |
标定算法参数调节
| 参数 | 说明 | 推荐值 |
|---|---|---|
| 标定点分布 | 标定点应覆盖尽可能大的工作空间 | 全工作空间的60%以上 |
| 姿态多样性 | 各标定点的姿态应有明显差异 | 各轴角度变化 > 20度 |
| 参考点稳定性 | 参考点在标定过程中不允许移动 | 固定偏差 < 0.1mm |
自动标定流程
四点标定流程
标定步骤
准备阶段
- 确认机器人处于手动/示教模式
- 安装标定工具(如标定锥)
- 设置固定参考点
标定阶段
- 移动机器人末梢到标记点 A,发送标定请求(0x3701, pointNum=0, status=1)
- 沿 X 方向移动 L1 距离到标记点 C,发送标定请求(0x3701, pointNum=2, status=1)
- 沿 Y 方向移动 L2 距离到标记点 B,发送标定请求(0x3701, pointNum=1, status=1)
- 移动机器人末梢到标记点 D,发送标定请求(0x3701, pointNum=3, status=1)
计算阶段
- 发送标定计算请求(0x3700),传入 ParamOf4Points=[L1, L2]
- 控制器返回计算结果(0x3703),包含杆长 length 和零点偏移 dtheta
- 检查 result 是否为 true,dtheta 和 length 是否不为 -1
应用阶段
- 如认可结果,发送填入 DH 参数请求(0x3704)
- 控制器返回应用结果(0x3705)
标定数据流
标定点1~4 -> 几何计算 -> 杆长 L1+L2 + 零点偏移 dtheta1+dtheta2 -> 填入 DH 参数 -> 验证
20点标定流程
标定步骤
准备阶段
- 设置参考点(固定标记点)
- 选择标定方法类型 (calibrationType=20)
- 选择工具手编号
标定阶段(循环20次)
- 移动机器人到第 i 个标定点
- 发送标定请求(0x3711, point=i)
- 控制器返回标定点信息(0x3712)
计算阶段
- 全部20点标定完成后,发送计算请求(0x3710)
- 控制器返回计算结果(0x3713),包含 distance 和 result
- 检查 result=true 且 distance < 10
应用阶段
- 如认可结果,发送设置为零点请求(0x3714)
- 控制器返回设置结果(0x3715)
标定状态查询
可随时查询各标定点的完成情况:
- 查询全部点状态(0x3716/0x3717): 返回 status 数组,1=已标定,0=未标定
- 查询 N 号点位置(0x3719/0x371A): 返回该点的关节坐标
外部轴标定流程
旋转轴标定
- 设置协作外部轴组号(0x3736)
- 移动机器人到标定点1,发送标定请求(0x3731, pointNum=0)
- 旋转外部轴到不同角度,移动机器人到标定点2~5,逐一标定
- 发送计算请求(0x3730)获取标定结果(0x3733)
地轨标定
- 设置地轨协同参数(0x3739):包含转换比(conversionRatio)和各轴方向(trackMap)
- 移动地轨到标记点1,发送标定请求(0x3742, point_num=1)
- 移动地轨到标记点2,发送标定请求(0x3742, point_num=2)
- 发送计算请求(0x3744)获取方向校准系数(0x3745)
自动标定安全检查
| 检查项 | 方法 | 标准 |
|---|---|---|
| 参考点固定 | 标定前后检查参考点位置 | 偏差 < 1mm |
| 碰撞风险 | 标定路径上无障碍物 | 手动确认路径安全 |
| 伺服状态 | 标定前确认伺服开启 | 各轴伺服正常 |
| 急停可用 | 确保急停按钮可用 | 紧急情况可中断 |