工具手
概述
工具手标定是工业机器人坐标系管理的核心功能,用于建立机器人末端工具的坐标系(Tool Coordinate System, TCS)。
什么是工具坐标系
- 法兰盘中心:默认工具坐标系的原点,法兰盘中心指向法兰盘定位孔方向为+X 方向,垂直法兰向外为+Z 方向,根据右手法则判定 Y 方向
- 工具中心点(TCP):工具坐标系的原点,通常是工具的工作点(如焊丝尖端、吸盘中心等)
- 工具坐标系特点:新的工具坐标系相对于默认的工具坐标系变化得到,位置和方向始终同法兰盘保持绝对的位置和姿态关系
为什么要建立工具坐标系
确立工具的 TCP 点:方便调整工具状态
- 例如:焊接时,将 TCP 定义到焊丝尖端,程序记录的位置便是焊丝尖端的位置
确定工具进给方向:方便工具位置调整
- 例如:手爪的前进方向可以直接移动过去
适用场景
需要使用工具手的情况:
- 机器人工作时 X、Y、Z 轴需要绕着 A、B、C 姿态轴旋转
- 典型工艺:焊接、打磨、喷涂、切割等
无需使用工具手的情况:
- 机器人本身仅做 Z 轴姿态旋转
- 工具末梢位于机器人6轴法兰中心延长线上
标定方式选择指南
| 场景 | 推荐方式 | 说明 |
|---|---|---|
| 已激光标定 + 使用焊枪 | 6点标定 | 校准工具手尺寸+姿态,C轴精度较好 |
| 未激光标定 + 使用焊枪 | 12点标定 | 校准零点+工具手尺寸 |
| 标定码垛夹爪 | 直接填写尺寸或6点标定 | 优先选择直接填工具尺寸 |
| 零点丢失 | 20点标定 | 校准零点+工具手尺寸 |
| 6点标定后A/B轴旋转误差大 | 7点标定 | 校准工具手尺寸+姿态,A/B轴精度较好 |
工具手参数说明
| 参数 | 说明 | 单位 |
|---|---|---|
| X轴 | 工具末端相对于法兰中心,沿直角坐标系X轴方向的偏移长度 | mm |
| Y轴 | 工具末端相对于法兰中心,沿直角坐标系Y轴方向的偏移长度 | mm |
| Z轴 | 工具末端相对于法兰中心,沿直角坐标系Z轴方向的偏移长度 | mm |
| A轴 | 工具末端相对于法兰中心,绕直角坐标系X轴方向旋转角度 | °/rad |
| B轴 | 工具末端相对于法兰中心,绕直角坐标系Y轴方向旋转角度 | °/rad |
| C轴 | 工具末端相对于法兰中心,绕直角坐标系Z轴方向的旋转角度 | °/rad |
工具手参数
上位机设置工具手参数
命令字: 0x3500
参数列表:
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| A | double | 绕 A 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] |
| B | double | 绕 B 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] |
| C | double | 绕 C 轴旋转 | 弧度制[-3.1416,3.1416],角度制[-180,180] |
| X | double | X 轴方向偏移,单位 mm | [-2000,2000] |
| Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] |
| Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] |
| note | string | 工具手注释 | - |
| payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] |
| payloadMass | double | 负载质量,单位 kg | [0,999999] |
| payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] |
| payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] |
| payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] |
| robot | int | 当前机器人号 | [1,4] |
| tool | int | 当前工具手号 | [1,999] |
请求示例:
{
"parameter": {
"A": 0.0,
"B": 0.0,
"C": 0.0,
"X": -68.0,
"Y": 3.0,
"Z": 162.0,
"note": "",
"payloadInertia": 0.0,
"payloadMass": 3.0,
"payloadMassCenterX": 0.0,
"payloadMassCenterY": 0.0,
"payloadMassCenterZ": 0.170
},
"robot": 1,
"tool": 1
}上位机查询工具手参数
命令字: 0x3501
参数列表:
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| robot | int | 当前机器人号 | [1,4] |
| tool | int | 当前工具手号 | [1,999] |
请求示例:
{
"robot": 1,
"tool": 1
}控制器回复上位机工具手参数
命令字: 0x3502
参数列表(弧度制):
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| A | double | 绕 A 轴旋转 | [-3.1416,3.1416] |
| B | double | 绕 B 轴旋转 | [-3.1416,3.1416] |
| C | double | 绕 C 轴旋转 | [-3.1416,3.1416] |
| X | double | X 轴方向偏移,单位 mm | [-2000,2000] |
| Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] |
| Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] |
| note | string | 工具手注释 | - |
| payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] |
| payloadMass | double | 负载质量,单位 kg | [0,999999] |
| payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] |
| payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] |
| payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] |
参数列表(角度制):
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| A | double | 绕 A 轴旋转 | [-180,180] |
| B | double | 绕 B 轴旋转 | [-180,180] |
| C | double | 绕 C 轴旋转 | [-180,180] |
| X | double | X 轴方向偏移,单位 mm | [-2000,2000] |
| Y | double | Y 轴方向偏移,单位 mm | [-2000,2000] |
| Z | double | Z 轴方向偏移,单位 mm | [-2000,2000] |
| note | string | 工具手注释 | - |
| payloadInertia | double | 负载惯量,单位0.001kgm² | [-999999,999999] |
| payloadMass | double | 负载质量,单位 kg | [0,999999] |
| payloadMassCenterX | double | 负载质心 X,单位 m | [-999999,999999] |
| payloadMassCenterY | double | 负载质心 Y,单位 m | [-999999,999999] |
| payloadMassCenterZ | double | 负载质心 Z,单位 m | [-999999,999999] |
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| robot | int | 当前机器人号 | [1,4] |
| tool | int | 当前工具手号 | [1,999] |
响应示例:
{
"parameter": {
"A": 0.0,
"B": 0.0,
"C": 0.0,
"X": -68.0,
"Y": 3.0,
"Z": 162.0,
"note": "",
"payloadInertia": 0.0,
"payloadMass": 3.0,
"payloadMassCenterX": 0.0,
"payloadMassCenterY": 0.0,
"payloadMassCenterZ": 0.17
},
"parameterDeg": {
"A": 0.0,
"B": 0.0,
"C": 0.0,
"X": -68.0,
"Y": 3.0,
"Z": 162.0,
"note": "",
"payloadInertia": 0.0,
"payloadMass": 3.0,
"payloadMassCenterX": 0.0,
"payloadMassCenterY": 0.0,
"payloadMassCenterZ": 0.17
},
"robot": 1,
"tool": 1
}工具号
上位机请求切换工具号
命令字: 0x3510
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| robot | int | 当前机器人号 | [1,4] |
| tool | int | 需要切换的工具手号,0表示无工具手 | [0,999] |
请求示例:
{
"robot": 1,
"tool": 0
}上位机查询工具手号
命令字: 0x3511
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| robot | int | 当前机器人号 | [1,4] |
请求示例:
{
"robot": 1
}控制器回复上位机工具手号
命令字: 0x3512
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| curToolNum | int | 当前已选中工具手号 | [0,999] |
| robot | int | 当前机器人号 | [1,4] |
| tool | int | 与已选中工具手号一致,选中工具号为0时值为1 | [1,999] |
响应示例:
{
"curToolNum": 0,
"robot": 1,
"tool": 1
}工具标定
六点法和七点法标定,包含有标定 N 号点、获取标定点位置信息、点位标定状态。
标定计算前需标定好所有点,先用0x3521标定每一个点,所有的点位标定完成后用0x3520计算标定结果。
查询 N 号点位置信息时需 N 号点已标定。
标定方式详解
6点标定
6点标定用于校准工具手尺寸和姿态,标定结果旋转 C 轴精度较好。
标定步骤:
- TC1标定:机器人5轴垂直向下,工具手末梢对准标定锥尖端
- TC2标定:在第一点的基础上 C 轴旋转180度
- TC3标定:在第一点的基础上 B 轴角度在35度
- TC4标定:机器人回到零点,然后工具手末梢垂直
- TC5标定:在第四点的基础上动 X-
- TC6标定:在第五点的基础上动 Y+
计算:六个点标定结束后,点击"计算"会算出计算结果,如果计算结果大于1的话就需要重新标定。
7点标定
7点标定用于校准工具手尺寸和姿态,标定结果旋转 A、B 轴精度较好。
标定步骤:
- TC1:工具手末梢垂直对准参考点
- TC2:将机器人切换一个姿势,末端正对参考点
- TC3:将机器人切换一个姿势,末端正对参考点
- TC4:将机器人切换一个姿势,末端正对参考点
- TC5:将工具末端垂直且正对参考点(同 TC1)
- TC6:在 TC5的基础上,沿笛卡尔坐标系 X 轴负方向移动任意距离
- TC7:在 TC6的基础上,沿笛卡尔坐标系 Y 轴正方向移动任意距离
注意事项:进行数据量取前请将法兰盘平行于水平面!
12点标定
12点标定结果只有工具手的 XYZ 轴方向偏移,无绕 ABC 旋转的数值。
标定步骤:
- TC1:机器人回归零点,通过直角坐标将机器人尖端对准标定锥尖端
- TC2:在第一个点的基础上,通过直角坐标系将 C 旋转180度
- TC3:机器人回归零点,通过直角坐标系将机器人尖端对准标定锥尖端
- TC4:在第三个点的基础上,通过直角坐标系做 B-、度数位于30-60度
- TC5:在第四个点的基础上,通过直角坐标系做 B+、J5大于-90度
- TC6:选中第一个点,在第一个点的基础上,通过直角坐标系做 B+、J5大于-90度
- TC7:在第一个点的基础上,通过直角坐标系做 B-、J5大于-90度
- TC8:在第七个点的基础上,通过直角坐标系做 A+、旋转90度、J5大于-90度
- TC9:在第七个点的基础上,通过直角坐标系做 A-、旋转90度、J5大于-90度
- TC10:回到第一个点,通过关节坐标系点动五轴,使五轴向上、J5小于-90度
- TC11:在第十点的基础上,通过直角坐标系做 A+、旋转90度、J5小于-90度
- TC12:在第十点的基础上,通过直角坐标系做 A-、旋转90度、J5小于-90度
计算:标定完成后点击计算,计算出标定结果,如果计算出来的数值较大的话,就需要重新标定。
15点标定
15点标定结果只有工具手的 XYZ 轴方向偏移,无绕 ABC 旋转的数值。
标定步骤:
- TC1:机器人回归零点,通过直角坐标将机器人尖端对准标定锥尖端
- TC2:在第一个点的基础上,通过直角坐标系将 C 旋转180度
- TC3:机器人回归零点,通过直角坐标系将机器人尖端对准标定锥尖端
- TC4:在第三个点的基础上,通过直角坐标系做 B-、度数位于30-60度
- TC5:在第四个点的基础上,通过直角坐标系做 B+、J5大于-90度
- TC6:选中第一个点,在第一个点的基础上,通过直角坐标系做 B+,J5大于-90度
- TC7:在第一个点的基础上,通过直角坐标系做 B-、J5大于-90度
- TC8:在第七个点的基础上,通过直角坐标系做 A+、旋转90度、J5大于-90度
- TC9:在第七个点的基础上,通过直角坐标系做 A-、旋转90度、J5大于-90度
- TC10:机器人回到第一个点,通过关节坐标系点动五轴使五轴向上,J5小于-90度
- TC11:在第十点的基础上,通过直角坐标系做 A+、旋转90度、J5小于-90度
- TC12:在第十点的基础上,通过直角坐标系做 A-、旋转90度、J5小于-90度
- TC13:机器人回到零点位置,调整机器人姿态,使机器人末端工具尖端竖直朝下,将标定尖端与标定锥对齐
- TC14:在第十三点的基础上,通过直角坐标系做 X-,机器人位移一段距离
- TC15:在第十四点的基础上,通过直角坐标系做 Y+,机器人位移一段距离
20点标定
标定步骤:
- TC1:机器人工具手末端垂直参考点
- TC2:在第一点的基础上动 A+
- TC3:在第一点的基础上动 A+ 40度
- TC4:在第一点的基础上动 A+ 60度
- TC5:在第一点基础上动 A- 20度
- TC6:在第一点基础上动 A- 40度
- TC7:在第一点基础上动 A- 60度
- TC8:在第一点基础上动 B+ 20度
- TC9:在第一点基础上动 B+ 30度
- TC10:在第一点基础上动 B+ 40度
- TC11:在第一点基础上动 B- 20度
- TC12:在第一点基础上动 B- 30度
- TC13:在第一点基础上动 B- 40度
- TC14:在第一点基础上动 C+ 30度
- TC15:在第一点基础上动 C+ 50度
- TC16:在第一点基础上动 C+ 70度
- TC17:在第一点基础上动 C+ 90度
- TC18:在第一点基础上动 C- 30度
- TC19:在第一点基础上动 C- 60度
- TC20:第二十点在第一点基础上动 C- 90度
注意事项:
- 进行数据量取前请将法兰盘平行于水平面!
- 标定过程中请保持参考点固定,否则标定误差增大
验证标定精度
示教模式下,工具手标定的末梢对准标定锥,在两个尖端对准的情况下,选中标定的工具手工具手编号,然后在直角坐标系下点动 A、B、C 轴,看尖端是否对准、偏了多少 mm。
API接口
上位机标定计算请求
命令字: 0x3520
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| robot | int | 当前机器人号 | [1,4] |
| tool | int | 当前工具手编号 | [1,999] |
| calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] |
请求示例:
{
"robot": 1,
"tool": 1,
"calibrationType": 7
}上位机标定 N 号点请求
命令字: 0x3521
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] |
| point | int | 标定点编号 | 六点法[0,5],七点法[0,6] |
| robot | int | 当前机器人号 | [1,4] |
| tool | int | 当前工具手编号 | [1,999] |
请求示例:
{
"calibrationType": 7,
"point": 4,
"robot": 1,
"tool": 1
}控制器回复上位机 N 号点标定信息
命令字: 0x3522
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] |
| point | int | 标定点编号 | 六点法[0,5],七点法[0,6] |
| position | array<double> | 标定点直角坐标信息列表 | - |
| robot | int | 当前机器人号 | [1,4] |
响应示例:
{
"calibrationType": 7,
"point": 1,
"position": [19998.0, 0.000000000001, 19998.0, 3.14159265359, 0.0, 0.0, 0.0],
"robot": 1
}控制器回复上位机标定计算完成结果
命令字: 0x3523
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| result | bool | 标定计算结果 | - |
| robot | int | 当前机器人号 | [1,4] |
响应示例:
{
"result": true,
"robot": 1
}上位机查询 N 号点位置信息
命令字: 0x3524
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] |
| point | int | 标定点编号 | 六点法[0,5],七点法[0,6] |
| robot | int | 当前机器人号 | [1,4] |
| tool | int | 当前工具手编号 | [1,999] |
请求示例:
{
"calibrationType": 7,
"point": 4,
"robot": 1,
"tool": 1
}控制器回复上位机 N 号点位置信息
命令字: 0x3525
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] |
| point | int | 标定点编号 | 六点法[0,5],七点法[0,6] |
| position | array<double> | 标定点直角坐标信息列表 | - |
| robot | int | 当前机器人号 | [1,4] |
响应示例:
{
"calibrationType": 7,
"point": 1,
"position": [19998.0, 0.000000000001, 19998.0, 3.14159265359, 0.0, 0.0, 0.0],
"robot": 1
}上位机查询全部点标定状态
命令字: 0x3526
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] |
| robot | int | 当前机器人号 | [1,4] |
| tool | int | 当前工具手编号 | [1,999] |
请求示例:
{
"calibrationType": 7,
"robot": 1,
"tool": 1
}控制器回复上位机全部点标定状态
命令字: 0x3527
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] |
| robot | int | 当前机器人号 | [1,4] |
| status | array<int> | 点位标定状态列表,1表示已标定,0表示未标定 | 六点法长度6,七点法长度7 |
响应示例:
{
"calibrationType": 7,
"robot": 1,
"status": [1, 1, 1, 0, 0, 1, 1]
}上位机请求清除 N 号点标定状态
命令字: 0x3528
| 参数名 | 类型 | 说明 | 范围 |
|---|---|---|---|
| calibrationType | int | 标定点方法,6为六点法,7为七点法 | [6,7] |
| point | int | 标定点编号 | 六点法[0,5],七点法[0,6] |
| robot | int | 当前机器人号 | [1,4] |
| tool | int | 当前工具手编号 | [1,999] |
请求示例:
{
"calibrationType": 7,
"point": 0,
"robot": 1,
"tool": 1
}常见问题
Q: 什么是工具坐标系? A: 工具坐标系是机器人末端工具的坐标系,原点是 TCP(工具中心点),用于确定工具的位姿。
Q: 为什么要建立工具坐标系? A: 1. 确立工具的 TCP 点,方便调整工具状态;2. 确定工具进给方向,方便工具位置调整。
Q: 什么情况下需要使用工具手标定? A: 需要用到绕 X、绕 Y、绕 Z 的姿态旋转时,需要进行工具手标定,例如焊接工艺、打磨工艺、喷涂工艺等。
Q: 什么情况下无需使用工具手? A: 机器人本身仅做 Z 轴姿态旋转,且工具末梢位于机器人6轴法兰中心延长线上;此时可以不设置工具手参数。
Q: 如何选择工具手标定方式? A: 1. 已做过激光标定+使用焊枪:使用6点标定;2. 未做过激光标定+使用焊枪:使用12点标定;3. 标定码垛夹抓:优先选择直接填工具尺寸;4. 零点丢失:使用20点标定;5. 6点标定后 A、B 轴旋转误差大:使用7点标定。
Q: 标定失败,计算结果大于1怎么办? A: 可能原因:标定点位置不准确、标定过程中参考点移动、机器人姿态不正确。解决方案:重新标定,确保参考点固定,检查机器人姿态是否正确,使用更精确的标定工具。
Q: 标定后 A、B 轴旋转误差大怎么办? A: 可能原因:6点标定精度不够、标定点分布不合理。解决方案:更换7点标定,重新标定,确保标定点分布合理。
Q: 标定后 C 轴旋转误差大怎么办? A: 可能原因:标定点位置不准确、参考点移动。解决方案:重新标定,确保参考点固定。
工具手坐标系变换
坐标系变换链
机器人系统中各坐标系之间的变换关系如下:
基座坐标系(Base) -> 关节变换(J1~J6) -> 法兰坐标系(Flange) -> 工具坐标系(TCP)
其中工具坐标系(TCP)由法兰坐标系经过工具手参数变换得到。
工具手变换矩阵
工具手参数 (X, Y, Z, A, B, C) 定义了一个从法兰坐标系到工具坐标系的齐次变换矩阵:
平移部分由 (X, Y, Z) 定义,单位 mm。 旋转部分由 (A, B, C) 定义,遵循 ZYX 欧拉角顺序(先绕 Z 轴转 C,再绕 Y 轴转 B,最后绕 X 轴转 A)。
变换矩阵计算
工具手变换矩阵 T_tool 的计算公式:
T_tool = Trans(X,Y,Z) * RotX(A) * RotY(B) * RotZ(C)
其中:
- Trans(X,Y,Z) 是平移变换矩阵
- RotX(A) 是绕 X 轴旋转 A 弧度的旋转矩阵
- RotY(B) 是绕 Y 轴旋转 B 弧度的旋转矩阵
- RotZ(C) 是绕 Z 轴旋转 C 弧度的旋转矩阵
坐标变换应用
获取TCP在基座坐标系下的位姿
TCP 在基座坐标系下的位姿 = T_base_to_flange * T_tool
其中 T_base_to_flange 是基座坐标系到法兰坐标系的变换矩阵,由正运动学计算得到。
工具手参数对运动的影响
- 平移影响:设置工具手 X/Y/Z 偏移后,机器人将 TCP 点移动到目标位置而不是法兰中心
- 旋转影响:设置工具手 A/B/C 后,直角坐标系的旋转轴将围绕 TCP 点旋转
- 速度影响:线速度从法兰中心速度转换为 TCP 点速度
切换工具手的坐标变换
当运行时切换工具手号时,系统会自动:
- 读取新工具手的 (X, Y, Z, A, B, C) 参数
- 重新计算工具手变换矩阵 T_tool
- 后续所有运动指令基于新的 TCP 进行计算
工具手负载参数对动力学的影响
负载参数 (payloadMass, payloadMassCenterX/Y/Z, payloadInertia) 用于:
- 前馈补偿:根据负载质量和质心位置计算前馈力矩
- 碰撞检测:修正碰撞检测阈值,防止误报
- 力控模式:在力控制中补偿负载重力和惯性
坐标系变换示例
假设工具手参数为 X=-68, Y=3, Z=162, A=0, B=0, C=0(仅平移):
TCP 相对于法兰的位置偏移为 (-68, 3, 162) mm 当法兰位于基座坐标 (500, 200, 800) 时,TCP 位于基座坐标 (432, 203, 962)
工具手参数校验
| 校验项 | 方法 | 标准 |
|---|---|---|
| TCP位置 | 四/六点法标定后检查 | 标定距离 < 1mm |
| 姿态精度 | 绕A/B/C轴旋转检查尖端偏移 | < 2mm |
| 负载质心 | 实际测量与参数对比 | 偏差 < 50mm |
| 负载质量 | 称重对比 | 偏差 < 1kg |