视觉工艺
试拍照(0x8125)
说明: 上位机发送,试拍照
命令字: 0x8125
请求参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| cali_camera_angle | bool | 是 | 是否记录工件旋转角度 | true: 记录, false: 不记录 |
| robot | int | 是 | 当前机器人 | [1, 4] |
| visionNum | int | 是 | 工艺号 | [0, 98] |
请求示例
{
"cali_camera_angle": false,
"robot": 1,
"visionNum": 0
}拍照结果(0x8126)
说明: 控制器返回拍照结果
命令字: 0x8126
响应参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| cameraPoint | double[6] | 是 | 相机坐标点 | - |
| protocol.type | int | 是 | 数据解析类型 | 0: 2维, 1: 2维+高度, 2: 3维 |
| camera_angle | double | 是 | 工件旋转角度 | [-180, 180] |
| cameraData | string | 是 | 接收数据 | - |
响应示例
{
"cameraPoint": [0, 0, 0, 0, 0, 0],
"protocol":
{
"type": 0
},
"camera_angle": 0,
"cameraData": ""
}视觉标定(0x8150)
说明: 上位机发送,下发标定点及标定参数用于视觉标定(手眼标定)
命令字: 0x8150
请求参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| visionNum | int | 是 | 工艺号 | [0, 98] |
| camera_position_by_robot | int | 是 | 相机相对机器人位置(标定方式) | 0: 眼在手上;1: 眼在手外 |
| calibration | object | 是 | 标定数据 | - |
| calibration.point_num | int | 是 | 标定点数量 | - |
| calibration.point | array | 是 | 标定点集合 | - |
| calibration.point[].pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位 | - |
| calibration.point[].robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - |
| eye_to_hand_calibration | object | 是 | 眼在手外标定参数 | - |
| eye_to_hand_calibration.angle_setting | double | 是 | 角度设置 | - |
| eye_to_hand_calibration.select_template | int | 是 | 选择模板 | - |
| eye_to_hand_calibration.step_angle | double | 是 | 步进角度 | - |
| eye_to_hand_calibration.step_setting | double | 是 | 步进设置 | - |
| eye_to_hand_calibration.tool_num | int | 是 | 工具号 | - |
请求示例
{
"calibration":
{
"point":
[
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}
],
"point_num": 9
},
"camera_position_by_robot": 0,
"eye_to_hand_calibration":
{
"angle_setting": 5.0,
"select_template": 0,
"step_angle": 5.0,
"step_setting": 5.0,
"tool_num": 1
},
"robot": 1,
"visionNum": 0
}视觉标定查询(0x8151)
说明: 上位机发送,查询视觉标定数据
命令字: 0x8151
请求参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| visionNum | int | 是 | 工艺号 | [0, 98] |
响应示例
{
"robot": 1,
"visionNum": 0
}视觉标定数据(0x8152)
说明: 控制器返回,获取到的视觉标定数据
命令字: 0x8152
响应参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| visionNum | int | 是 | 工艺号 | [0, 98] |
| camera_position_by_robot | int | 是 | 相机相对机器人位置(标定方式) | - |
| target_pos_calibrated | bool | 是 | 目标点是否已标定 | true: 已标定, false: 未标定 |
| calibration | object | 是 | 标定数据 | - |
| calibration.calc_result | double | 是 | 标定计算结果 | - |
| calibration.calibrated | bool | 是 | 是否已标定 | true: 已标定, false: 未标定 |
| calibration.point_num | int | 是 | 标定点数量 | - |
| calibration.point | array | 是 | 标定点集合 | - |
| calibration.point[].pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用弧度单位 | - |
| calibration.point[].pixel_pos_deg | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用角度单位 | - |
| calibration.point[].robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - |
| calibration.point[].robot_pos_deg | double[7] | 是 | 标定点机器人角度坐标,定长 7 位,姿态用角度单位 | - |
| calibration.target_pos_calibrated | bool | 是 | 目标点是否已标定 | true: 已标定, false: 未标定 |
| eye_to_hand_calibration | object | 是 | 眼在手外标定参数 | - |
| eye_to_hand_calibration.angle_setting | double | 是 | 角度设置 | - |
| eye_to_hand_calibration.select_template | int | 是 | 选择模板 | - |
| eye_to_hand_calibration.step_angle | double | 是 | 步进角度 | - |
| eye_to_hand_calibration.step_setting | double | 是 | 步进设置 | - |
| eye_to_hand_calibration.tool_num | int | 是 | 工具号 | - |
请求示例
{
"calibration":
{
"calc_result": 0.0,
"calibrated": false,
"point":
[
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]},
{"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "robot_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}
],
"point_num": 9,
"target_pos_calibrated": false
},
"camera_position_by_robot": 4,
"eye_to_hand_calibration":
{
"angle_setting": 5.0,
"select_template": 0,
"step_angle": 5.0,
"step_setting": 5.0,
"tool_num": 1
},
"robot": 1,
"target_pos_calibrated": false,
"visionNum": 0
}视觉标定点查询(0x8153)
说明: 上位机发送,查询标定点数据
命令字: 0x8153
请求参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| visionNum | int | 是 | 工艺号 | [0, 98] |
| point_num | int | 是 | 当前标定点 | - |
响应示例
{
"point_num": 1,
"robot": 1,
"visionNum": 0
}视觉标定点数据(0x8154)
说明: 控制器返回,标定点数据
命令字: 0x8154
响应参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| visionNum | int | 是 | 工艺号 | [0, 98] |
| point_num | int | 是 | 当前标定点 | - |
| pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用弧度单位 | - |
| pixel_pos_deg | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用角度单位 | - |
| robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - |
| robot_pos_deg | double[7] | 是 | 标定点机器人角度坐标,定长 7 位,姿态用角度单位 | - |
响应示例
{
"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
"pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
"point_num": 1,
"robot": 1,
"robot_pos": [557.984545757289, -5.704418391263, 1056.73931896607, -3.085566393119, 0.021842103824, -3.047913696756, 0.0],
"robot_pos_deg": [557.984545757289, -5.704418391263, 1056.73931896607, -176.789931733112, 1.251460364796, -174.632591144215, 0.0],
"visionNum": 0
}运行至标定点(0x8155)
说明: 上位机发送,运行至该标定点
命令字: 0x8155
请求参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| visionNum | int | 是 | 工艺号 | [0, 98] |
| point_num | int | 是 | 当前标定点 | - |
请求示例
{
"point_num": 1,
"robot": 1,
"visionNum": 1
}清除标定点(0x8156)
说明: 上位机发送,清除指定标定点
命令字: 0x8156
请求参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| visionNum | int | 是 | 工艺号 | [0, 98] |
| point_num | int | 是 | 当前标定点 | - |
请求示例
{
"point_num": 3,
"robot": 1,
"visionNum": 0
}眼在手外自动标定运行(0x8157)
说明: 上位机发送,眼在手外自动标定运行
命令字: 0x8157
请求参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| visionNum | int | 是 | 工艺号 | [0, 98] |
请求示例
{
"robot": 1,
"visionNum": 0
}视觉标定像素数据(0x8158)
说明: 控制器返回,标定点对应的像素坐标数据
命令字: 0x8158
响应参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| visionNum | int | 是 | 工艺号 | [0, 98] |
| point_num | int | 是 | 当前标定点 | - |
| pixel_pos | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用弧度单位 | - |
| pixel_pos_deg | double[7] | 是 | 标定点像素坐标,定长 7 位,姿态用角度单位 | - |
响应示例
{
"robot": 1,
"visionNum": 0,
"point_num": 1,
"pixel_pos": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
"pixel_pos_deg": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
}手眼标定计算(0x8160)
说明: 上位机发送,根据 socket 数据计算转换矩阵(手眼标定)
命令字: 0x8160 VISION_CALIBRATION_CALCULATE_BY_SOCKET_DATA
请求参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| camera_type | int | 是 | 相机类型 | 0: 2D;1: 3D(扩展,暂不支持) |
| calculation_type | int | 是 | 标定计算类型 | 0: 眼在手上固定姿态的手眼标定(如眼在三轴直角机器人上);1: 眼在手上变姿态的手眼标定(如眼在四轴 SCARA、六轴串联上);2: 眼在手外的手眼标定 |
| base_robot_pos | double[7] | 是 | 基准机器人直角坐标,定长 7 位,姿态用弧度单位 | - |
| mark_pos | array | 是 | 标定点集合(共 9 个点) | - |
| mark_pos[].robot_pos | double[7] | 是 | 标定点机器人直角坐标,定长 7 位,姿态用弧度单位 | - |
| mark_pos[].camera_pos | double[7] | 是 | 标定点像素坐标,定长 7 位 | - |
请求示例
{
"robot": 1,
"camera_type": 0,
"calculation_type": 0,
"base_robot_pos": [0, 0, 0, 0, 0, 0, 0],
"mark_pos":
[
{
"robot_pos": [0, 0, 0, 0, 0, 0, 0],
"camera_pos": [0, 0, 0, 0, 0, 0, 0]
},
{
"robot_pos": [0, 0, 0, 0, 0, 0, 0],
"camera_pos": [0, 0, 0, 0, 0, 0, 0]
}
]
}手眼标定计算回复(0x8161)
说明: 控制器返回手眼标定计算结果(转换矩阵)
命令字: 0x8161 VISION_CALIBRATION_CALCULATE_BY_SOCKET_DATA_RESPOND
响应参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| result | bool | 是 | 计算是否成功 | true: 成功, false: 失败 |
| matrix | double[16] | 是 | 转换矩阵(4×4,行优先共 16 位) | - |
响应示例
{
"robot": 1,
"result": true,
"matrix": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}视觉目标点计算(0x8162)
说明: 上位机发送,计算视觉目标点的机器人坐标
命令字: 0x8162 VISION_CALCULATE_TARGET_POS
请求参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| camera_type | int | 是 | 相机类型 | 0: 2D;1: 3D |
| calculation_type | int | 是 | 标定计算类型 | 0: 眼在手上;1: 眼在手外 |
| robot_pos | double[7] | 是 | 机器人直角坐标,定长 7 位,姿态用弧度单位 | - |
| camera_pos | double[7] | 是 | 像素坐标,定长 7 位 | - |
| matrix | double[16] | 是 | 手眼标定结果(4×4,行优先共 16 位) | - |
请求示例
{
"robot": 1,
"camera_type": 0,
"calculation_type": 0,
"robot_pos": [0, 0, 0, 0, 0, 0, 0],
"camera_pos": [0, 0, 0, 0, 0, 0, 0],
"matrix": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}视觉目标点计算回复(0x8163)
说明: 控制器返回视觉目标点的机器人坐标
命令字: 0x8163 VISION_CALCULATE_TARGET_POS_RESPOND
响应参数
| 参数名 | 类型 | 必填 | 说明 | 取值范围 |
|---|---|---|---|---|
| robot | int | 是 | 当前机器人 | [1, 4] |
| result | bool | 是 | 计算是否成功 | true: 成功, false: 失败 |
| robot_pos | double[7] | 是 | 目标点机器人直角坐标,定长 7 位,姿态用弧度单位 | - |
响应示例
{
"robot": 1,
"result": true,
"robot_pos": [0, 0, 0, 0, 0, 0, 0]
}视觉触发方式
视觉触发决定了相机何时拍照并获取图像数据,系统支持多种触发方式以适应不同应用场景。
触发方式对比
| 触发方式 | 实现方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 软触发(命令触发) | 上位机发送拍照命令 0x8125 | 单次拍照、调试 | 灵活可控 | 延迟不可控 |
| 硬触发(IO触发) | 通过数字IO信号触发相机 | 高速产线、固定工位 | 延迟低、一致性高 | 需额外接线 |
| 连续触发 | 相机持续拍照 | 动态检测 | 无遗漏 | 数据量大 |
| 编码器触发 | 通过编码器位置触发 | 传送带跟踪 | 位置精确 | 需要编码器 |
软触发完整流程
- 上位机发送试拍照命令 0x8125(含 cali_camera_angle 标志)
- 控制器转发拍照指令给相机
- 相机拍照并返回图像数据
- 控制器通过 0x8126 返回拍照结果(含 cameraData 和 cameraPoint)
- 上位机解析结果数据进行后续处理
视觉结果解析
视觉拍照后返回的数据需要根据不同协议类型进行解析。
数据解析类型
| protocol.type | 名称 | 数据格式 | 适用场景 |
|---|---|---|---|
| 0 | 2维 | (X, Y, 角度) | 平面定位、抓取 |
| 1 | 2维+高度 | (X, Y, Z, 角度) | 带高度信息的抓取 |
| 2 | 3维 | (X, Y, Z, A, B, C) | 三维空间定位 |
cameraData 解析
cameraData 为字符串类型,根据 protocol.type 不同,解析方式不同:
2维数据解析 (type=0)
格式: X,Y,Angle(逗号分隔),X/Y 为像素坐标或物理坐标,Angle 为工件旋转角度(度)
2维+高度 (type=1)
格式: X,Y,Z,Angle(逗号分隔),增加高度 Z 信息
3维数据解析 (type=2)
格式: X,Y,Z,A,B,C(逗号分隔),完整的六自由度位姿数据
cameraPoint 说明
cameraPoint 为 double[6] 数组,表示拍照时相机在工作坐标系下的位置:
- cameraPoint[0]~[2]:X, Y, Z 坐标 (mm)
- cameraPoint[3]~[5]:A, B, C 姿态 (弧度)
camera_angle 说明
工件旋转角度,单位为度,范围 [-180, 180]。仅在 cali_camera_angle=true 时有效返回实际角度。
视觉坐标变换
坐标系关系
像素坐标系 -> 相机坐标系 -> 工具坐标系 -> 基座坐标系 (分别通过相机内参、手眼矩阵、法兰变换进行转换)
手眼标定矩阵应用
手眼标定得到的 4x4 变换矩阵 matrix(16个元素,行优先),用于将相机坐标转换为机器人坐标。 矩阵格式为行优先的 4x4 齐次变换矩阵,包含旋转分量 R(3x3) 和平移分量 Tx,Ty,Tz。
计算目标点机器人坐标
已知条件:
- camera_pos:目标在相机坐标系下的位置
- matrix:手眼标定矩阵
- robot_pos:拍照时机器人的当前位置
计算步骤:
- 将 camera_pos 通过 matrix 变换到机器人基坐标系下的偏移
- 将偏移叠加到 robot_pos 上得到最终目标位置
- 使用 0x8162/0x8163 命令进行此计算
常见视觉配置校验
| 检查项 | 方法 |
|---|---|
| 手眼标定精度 | 使用多个验证点检查重投影误差,一般要求 < 0.5mm |
| 相机安装稳定性 | 在固定位置连续拍照多次,检查位置重复性 |
| 光照条件 | 确保拍照区域光照均匀,避免反光或阴影 |