Skip to content

视觉工艺

试拍照(0x8125)

说明: 上位机发送,试拍照

命令字: 0x8125

请求参数

参数名类型必填说明取值范围
cali_camera_anglebool是否记录工件旋转角度true: 记录, false: 不记录
robotint当前机器人[1, 4]
visionNumint工艺号[0, 98]

请求示例

json
{
  "cali_camera_angle": false,
  "robot": 1,
  "visionNum": 0
}

拍照结果(0x8126)

说明: 控制器返回拍照结果

命令字: 0x8126

响应参数

参数名类型必填说明取值范围
cameraPointdouble[6]相机坐标点-
protocol.typeint数据解析类型0: 2维, 1: 2维+高度, 2: 3维
camera_angledouble工件旋转角度[-180, 180]
cameraDatastring接收数据-

响应示例

json
{
  "cameraPoint": [0, 0, 0, 0, 0, 0],
  "protocol":
  {
    "type": 0
  },
  "camera_angle": 0,
  "cameraData": ""
}

视觉标定(0x8150)

说明: 上位机发送,下发标定点及标定参数用于视觉标定(手眼标定)

命令字: 0x8150

请求参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
visionNumint工艺号[0, 98]
camera_position_by_robotint相机相对机器人位置(标定方式)0: 眼在手上;1: 眼在手外
calibrationobject标定数据-
calibration.point_numint标定点数量-
calibration.pointarray标定点集合-
calibration.point[].pixel_posdouble[7]标定点像素坐标,定长 7 位-
calibration.point[].robot_posdouble[7]标定点机器人直角坐标,定长 7 位,姿态用弧度单位-
eye_to_hand_calibrationobject眼在手外标定参数-
eye_to_hand_calibration.angle_settingdouble角度设置-
eye_to_hand_calibration.select_templateint选择模板-
eye_to_hand_calibration.step_angledouble步进角度-
eye_to_hand_calibration.step_settingdouble步进设置-
eye_to_hand_calibration.tool_numint工具号-

请求示例

json
{
  "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

请求参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
visionNumint工艺号[0, 98]

响应示例

json
{
  "robot": 1,
  "visionNum": 0
}

视觉标定数据(0x8152)

说明: 控制器返回,获取到的视觉标定数据

命令字: 0x8152

响应参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
visionNumint工艺号[0, 98]
camera_position_by_robotint相机相对机器人位置(标定方式)-
target_pos_calibratedbool目标点是否已标定true: 已标定, false: 未标定
calibrationobject标定数据-
calibration.calc_resultdouble标定计算结果-
calibration.calibratedbool是否已标定true: 已标定, false: 未标定
calibration.point_numint标定点数量-
calibration.pointarray标定点集合-
calibration.point[].pixel_posdouble[7]标定点像素坐标,定长 7 位,姿态用弧度单位-
calibration.point[].pixel_pos_degdouble[7]标定点像素坐标,定长 7 位,姿态用角度单位-
calibration.point[].robot_posdouble[7]标定点机器人直角坐标,定长 7 位,姿态用弧度单位-
calibration.point[].robot_pos_degdouble[7]标定点机器人角度坐标,定长 7 位,姿态用角度单位-
calibration.target_pos_calibratedbool目标点是否已标定true: 已标定, false: 未标定
eye_to_hand_calibrationobject眼在手外标定参数-
eye_to_hand_calibration.angle_settingdouble角度设置-
eye_to_hand_calibration.select_templateint选择模板-
eye_to_hand_calibration.step_angledouble步进角度-
eye_to_hand_calibration.step_settingdouble步进设置-
eye_to_hand_calibration.tool_numint工具号-

请求示例

json
{
  "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

请求参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
visionNumint工艺号[0, 98]
point_numint当前标定点-

响应示例

json
{
  "point_num": 1,
  "robot": 1,
  "visionNum": 0
}

视觉标定点数据(0x8154)

说明: 控制器返回,标定点数据

命令字: 0x8154

响应参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
visionNumint工艺号[0, 98]
point_numint当前标定点-
pixel_posdouble[7]标定点像素坐标,定长 7 位,姿态用弧度单位-
pixel_pos_degdouble[7]标定点像素坐标,定长 7 位,姿态用角度单位-
robot_posdouble[7]标定点机器人直角坐标,定长 7 位,姿态用弧度单位-
robot_pos_degdouble[7]标定点机器人角度坐标,定长 7 位,姿态用角度单位-

响应示例

json
{
  "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

请求参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
visionNumint工艺号[0, 98]
point_numint当前标定点-

请求示例

json
{
  "point_num": 1,
  "robot": 1,
  "visionNum": 1
}

清除标定点(0x8156)

说明: 上位机发送,清除指定标定点

命令字: 0x8156

请求参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
visionNumint工艺号[0, 98]
point_numint当前标定点-

请求示例

json
{
  "point_num": 3,
  "robot": 1,
  "visionNum": 0
}

眼在手外自动标定运行(0x8157)

说明: 上位机发送,眼在手外自动标定运行

命令字: 0x8157

请求参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
visionNumint工艺号[0, 98]

请求示例

json
{
  "robot": 1,
  "visionNum": 0
}

视觉标定像素数据(0x8158)

说明: 控制器返回,标定点对应的像素坐标数据

命令字: 0x8158

响应参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
visionNumint工艺号[0, 98]
point_numint当前标定点-
pixel_posdouble[7]标定点像素坐标,定长 7 位,姿态用弧度单位-
pixel_pos_degdouble[7]标定点像素坐标,定长 7 位,姿态用角度单位-

响应示例

json
{
  "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

请求参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
camera_typeint相机类型0: 2D;1: 3D(扩展,暂不支持)
calculation_typeint标定计算类型0: 眼在手上固定姿态的手眼标定(如眼在三轴直角机器人上);1: 眼在手上变姿态的手眼标定(如眼在四轴 SCARA、六轴串联上);2: 眼在手外的手眼标定
base_robot_posdouble[7]基准机器人直角坐标,定长 7 位,姿态用弧度单位-
mark_posarray标定点集合(共 9 个点)-
mark_pos[].robot_posdouble[7]标定点机器人直角坐标,定长 7 位,姿态用弧度单位-
mark_pos[].camera_posdouble[7]标定点像素坐标,定长 7 位-

请求示例

json
{
  "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

响应参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
resultbool计算是否成功true: 成功, false: 失败
matrixdouble[16]转换矩阵(4×4,行优先共 16 位)-

响应示例

json
{
  "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

请求参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
camera_typeint相机类型0: 2D;1: 3D
calculation_typeint标定计算类型0: 眼在手上;1: 眼在手外
robot_posdouble[7]机器人直角坐标,定长 7 位,姿态用弧度单位-
camera_posdouble[7]像素坐标,定长 7 位-
matrixdouble[16]手眼标定结果(4×4,行优先共 16 位)-

请求示例

json
{
  "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

响应参数

参数名类型必填说明取值范围
robotint当前机器人[1, 4]
resultbool计算是否成功true: 成功, false: 失败
robot_posdouble[7]目标点机器人直角坐标,定长 7 位,姿态用弧度单位-

响应示例

json
{
  "robot": 1,
  "result": true,
  "robot_pos": [0, 0, 0, 0, 0, 0, 0]
}

视觉触发方式

视觉触发决定了相机何时拍照并获取图像数据,系统支持多种触发方式以适应不同应用场景。

触发方式对比

触发方式实现方式适用场景优点缺点
软触发(命令触发)上位机发送拍照命令 0x8125单次拍照、调试灵活可控延迟不可控
硬触发(IO触发)通过数字IO信号触发相机高速产线、固定工位延迟低、一致性高需额外接线
连续触发相机持续拍照动态检测无遗漏数据量大
编码器触发通过编码器位置触发传送带跟踪位置精确需要编码器

软触发完整流程

  1. 上位机发送试拍照命令 0x8125(含 cali_camera_angle 标志)
  2. 控制器转发拍照指令给相机
  3. 相机拍照并返回图像数据
  4. 控制器通过 0x8126 返回拍照结果(含 cameraData 和 cameraPoint)
  5. 上位机解析结果数据进行后续处理

视觉结果解析

视觉拍照后返回的数据需要根据不同协议类型进行解析。

数据解析类型

protocol.type名称数据格式适用场景
02维(X, Y, 角度)平面定位、抓取
12维+高度(X, Y, Z, 角度)带高度信息的抓取
23维(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:拍照时机器人的当前位置

计算步骤:

  1. 将 camera_pos 通过 matrix 变换到机器人基坐标系下的偏移
  2. 将偏移叠加到 robot_pos 上得到最终目标位置
  3. 使用 0x8162/0x8163 命令进行此计算

常见视觉配置校验

检查项方法
手眼标定精度使用多个验证点检查重投影误差,一般要求 < 0.5mm
相机安装稳定性在固定位置连续拍照多次,检查位置重复性
光照条件确保拍照区域光照均匀,避免反光或阴影