案例/模板说明

机械臂主控模板说明

以下为机械臂主控模板代码,包含坐标移动基础模板, 坐标移动二次定位模板,轨迹移动同步模板以及轨迹移动异步模板。 关于模板中的 API 可以查阅 Denso 的 “API 说明” 部分。

请注意模板函数并不能直接运行,请一定根据项目现场环境和流程需求进行修改。

坐标移动基础模板

Sub CartMoveBasic()
    ' S1: 初始化
    Dim err_code As Integer       ' 错误代码
    Dim eye_in_hand As Integer    ' true 表示眼在手上,false 表示眼在手外
    Dim token As Integer          ' 获取请求结果凭证
    Dim home_pose As Joint        ' home 点
    Dim scan_pose As Position     ' 眼在手上时,需要发送的拍照位
    Dim grasp_pose As Position    ' 抓取位姿
    Dim pose_num As Integer       ' 识别出的位姿个数
    Dim pipeline_num As Integer   ' 处理流程编号
    Dim register_num As Integer   ' 抓取序号
    Dim ints_array(5) As Integer  '

    ReSet IO[128]

    ' S2: 连接到工控机
    Call xyzMasterConnect()

    ' 切换任务流图 ,默认被注释掉,如果需求可以取消注释
    ' err_code = xyzSwitchTask("cart_basic.t")
    ' 检查工控机返回的错误码,如果有错误程序将直接停止。可以根据项目需求自定义错误代码处理方式
    ' Call xyzCheckErrorCode(err_code)
    err_code = xyzResetTask()
    Call xyzCheckErrorCode(err_code)

    ' S3: 切换成当前工件
    err_code = xyzSwitchItem(0, "item1")
    Call xyzCheckErrorCode(err_code)

    ' 4: 运动到 home 位
    ' 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值
    ' 或者用使用其他点来替代
    Move P, @[0] home_pose

    ' 如果是眼在机械臂上的应用形式,请把 eye_in_hand 赋值为 true
    eye_in_hand = False
    Do
        ' S5: 眼在机械臂上
        if eye_in_hand = True then
            ' S6: 运动到拍照位姿
            ' 注意需要先定义 scan_pose 的位姿
            ' 或者用使用其他点来替代
            Move L, @[0] scan_pose
            ' S7: 发送拍照位姿
            err_code = xyzSendCurrentCartPose(scan_pose)
            Call xyzCheckErrorCode(err_code)
        End if

        ' S8: 请求抓取点位
        err_code = xyzReqGraspPose(0, token)
        Call xyzCheckErrorCode(err_code)

        ' S9: 获取抓取点位
        err_code = xyzGetGraspPose(token, pose_num, pipeline_num, register_num, grasp_pose, ints_array)
        Call xyzCheckErrorCode(err_code)
        if pose_num < 1 then
            ' 处理没有识别到工件的情况
            Stop
        End if

        ' S10: 运动到抓取点并抓取工件
        ' 需要添加其他路径点作为过渡

        Move L, @[0] grasp_pose
        Set IO[128]

        ' 需要添加其他路径点作为过渡点,使机械臂运动到放置点

        ReSet IO[128]
    Loop While (True)

End Sub

坐标移动二次定位模板

Sub CartMoveRepo()
    ' S1: 初始化
    Dim err_code As Integer     ' 错误代码
    Dim token As Integer        ' 获取请求结果凭证1
    Dim token1 As Integer       ' 获取请求结果凭证2
    Dim home_pose As Joint      ' home 点
    Dim scan_pose As Position   ' 拍照位姿
    Dim grasp_pose As Position  ' 抓取位姿
    Dim pose_num As Integer     ' 识别出的位姿个数
    Dim pipeline_num As Integer ' 处理流程编号
    Dim register_num As Integer ' 抓取序号
    Dim ints_array(5) As Integer

    ReSet IO[128]
    ReSet IO[129]

    ' S2: 连接到工控机
    Call xyzMasterConnect()

    ' 切换任务流图,默认被注释掉,如果需求可以取消注释
    ' err_code = xyzSwitchTask("cart_repo.t")
    ' 检查工控机返回的错误码,如果有错误程序将直接停止。可以根据项目需求自定义错误代码处理方式
    ' Call xyzCheckErrorCode(err_code)
    err_code = xyzResetTask()
    Call xyzCheckErrorCode(err_code)

    ' S3: 机械臂外的相机切换成识别当前工件
    err_code = xyzSwitchItem(0, "item1")
    Call xyzCheckErrorCode(err_code)

    ' S4: 运动到 home 位
    ' 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值
    ' 或者用使用其他点来替代
    Move P, @[0] home_pose

    Do
        ' S5: 请求工件的抓取位姿
        err_code = xyzReqGraspPose(0, token)
        Call xyzCheckErrorCode(err_code)

        ' S6: 获取工件的抓取位姿
        err_code = xyzGetGraspPose(token, pose_num, pipeline_num, register_num, grasp_pose, ints_array)
        Call xyzCheckErrorCode(err_code)

        ' S7: 处理是否识别到工件
        if pose_num < 1 then
            ' 工作空间内没有工件,需要先移除隔板
            ' S15: 没有识别到工件,机械臂外的相机切换识别隔板
            err_code = xyzSwitchItem(0, "board")
            Call xyzCheckErrorCode(err_code)

            ' S16: 请求隔板抓取位姿
            err_code = xyzReqGraspPose(0, token)
            Call xyzCheckErrorCode(err_code)

            ' S17: 获取隔板的抓取位姿
            err_code = xyzGetGraspPose(token, pose_num, pipeline_num, register_num, grasp_pose, ints_array)
            Call xyzCheckErrorCode(err_code)
            if pose_num < 1 then
                PrintDbg "Get board grasp pose failed"
                Stop
            End if

            ' S18: 运动到隔板抓取位姿,并抓取隔板
            ' 注意: 可能需要添加其他路径点作为过渡
            Move L, @[0] grasp_pose

            ' S19: 运动到隔板的放置位姿
            ' 注意: 可能需要添加其他路径点作为过渡
            ' 注意需要定义隔板放置位姿


            ' S20: 机械臂外的相机切换成识别当前工件
            err_code = xyzSwitchItem(0, "item1")
            Call xyzCheckErrorCode(err_code)
        else
            ' S8: 运动到拍照位姿
            ' 注意需要先定义 scan_pose 的位姿
            ' 或者用使用其他点来替代
            Move L, @[0] scan_pose
            ' S9: 发送拍照位姿
            err_code = xyzSendCurrentCartPose(scan_pose)
            Call xyzCheckErrorCode(err_code)

            ' S10: 机械臂上的相机切换成识别当前工件
            err_code = xyzSwitchItem(1, "item1")
            Call xyzCheckErrorCode(err_code)

            ' S11: 请求机械臂上的相机获取工件抓取位姿
            err_code = xyzReqGraspPose(1, token1)
            Call xyzCheckErrorCode(err_code)

            ' S12: 获取工件的抓取位姿
            err_code = xyzGetGraspPose(token1, pose_num, pipeline_num, register_num, grasp_pose, ints_array)
            Call xyzCheckErrorCode(err_code)
            if pose_num < 1 then
                ' 未识别到工件的处理
                PrintDbg "Get object grasp pose failed"
                Stop
            End if

            ' S13: 运动到工件的抓取位姿并进行抓取
            ' 注意: 可能需要添加其他路径点作为过渡

            Move L, @[0] grasp_pose

            ' S14: 运动到工件的放置位姿
            ' 注意:可能需要添加其他路径点作为过渡
            ' 注意:需要定义工件放置位姿

        End if
    Loop While (True)
End Sub

轨迹移动同步模板

Sub TrajMoveSync()
    ' S1: 初始化
    Dim err_code As Integer     ' 错误代码
    Dim vs_id As Integer        ' 视觉服务编号
    Dim pose_num As Integer     ' 轨迹点的个数
    Dim pipeline_num As Integer ' 处理流程编号
    Dim register_num As Integer ' 抓取序号
    Dim home_pose As Joint      ' home 点位
    Dim traj As Variant         ' 路径点数据

    vs_id = 0

    ' S2: 连接到工控机
    Call xyzMasterConnect()

    ' 切换任务流图,默认被注释掉,如果需求可以取消注释
    ' err_code = xyzSwitchTask("traj_sync.t")
    ' Call xyzCheckErrorCode(err_code)
    err_code = xyzResetTask()
    Call xyzCheckErrorCode(err_code)

    ' S3: 切换成当前工件
    err_code = xyzSwitchItem(0, "item1")
    Call xyzCheckErrorCode(err_code)

    ' S4: 运动到 home 位
    ' 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值
    ' 或者用使用其他点来替代
    Move P, @[0] home_pose

    Do
        ' S5: 请求抓取和放置规划
        err_code = xyzReqPickPlace(vs_id)
        Call xyzCheckErrorCode(err_code)

        ' S6: S6: 获取 pick-in 轨迹
        err_code = xyzGetPickin(vs_id, pipeline_num, register_num, pose_num, traj)
        Call xyzCheckErrorCode(err_code)

        ' S7: 判断是否识别到工件
        if pose_num < 1 then
            PrintDbg "tote clear"
            Stop
        End if

        ' S8: 执行 pick-in 轨迹
        Call xyzExecuteTraj(pose_num, traj)

        ' S9: 获取 pick-out 轨迹
        err_code = xyzGetPickout(vs_id, pipeline_num, register_num, pose_num, traj)
        Call xyzCheckErrorCode(err_code)

        ' S10: 执行 pick-out 轨迹
        Call xyzExecuteTraj(pose_num, traj)

        ' S11: 获取 place-in 轨迹
        err_code = xyzGetPlacein(vs_id, pipeline_num, register_num, pose_num, traj)
        Call xyzCheckErrorCode(err_code)

        ' S12: 执行 place-in 轨迹
        Call xyzExecuteTraj(pose_num, traj)

        ' S13: 获取 place-out 轨迹
        err_code = xyzGetPlaceout(vs_id, pipeline_num, register_num, pose_num, traj)
        Call xyzCheckErrorCode(err_code)

        ' S14: 执行 place-out 轨迹
        Call xyzExecuteTraj(pose_num, traj)
    Loop While (True)
End Sub

轨迹移动异步模板

Sub TrajMoveAsync()
    ' S1: 初始化
    Dim err_code As Integer     ' 错误代码
    Dim vs_id As Integer        ' 视觉服务id
    Dim pose_num As Integer     ' 轨迹点的个数
    Dim pipeline_num As Integer ' 处理流程编号
    Dim register_num As Integer ' 抓取序号
    Dim home_pose As Joint      ' 示教的 home 点位
    Dim traj As Variant         ' 路径点数据

    vs_id = 0

    ' S2: 连接到工控机
    Call xyzMasterConnect()

    ' err_code = xyzSwitchTask("traj_async.t")
    ' Call xyzCheckErrorCode(err_code)
    err_code = xyzResetTask()
    Call xyzCheckErrorCode(err_code)

    ' S3: 切换成当前工件
    err_code = xyzSwitchItem(0, "item1")
    Call xyzCheckErrorCode(err_code)

    ' S4: 运动到 home 位
    ' 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值
    ' 或者用使用其他点来替代
    Move P, @[0] home_pose

    ' S5: 请求抓取和放置规划
    err_code = xyzReqPickPlace(vs_id)
    Call xyzCheckErrorCode(err_code)

    Do
        ' S6: 获取 pick-in 轨迹
        err_code = xyzGetPickin(vs_id, pipeline_num, register_num, pose_num, traj)
        Call xyzCheckErrorCode(err_code)

        ' S7: 判断是否识别到工件
        if pose_num < 1 then
            PrintDbg "tote clear"
            Stop
        End if

        ' S8: 执行 pick-in 轨迹
        Call xyzExecuteTraj(pose_num, traj)

        ' S9: 获取 pick-out 轨迹
        err_code = xyzGetPickout(vs_id, pipeline_num, register_num, pose_num, traj)
        Call xyzCheckErrorCode(err_code)

        ' S10: 执行 pick-out 轨迹
        Call xyzExecuteTraj(pose_num, traj)

        ' S11: 请求下一次的抓取和放置规划
        ' 运动到相机视野外,开始请求下一次的抓取和放置规划
        err_code = xyzReqPickPlace(vs_id)
        Call xyzCheckErrorCode(err_code)

        ' S12: 获取本次 place-in 轨迹
        err_code = xyzGetPlacein(vs_id, pipeline_num, register_num, pose_num, traj)
        Call xyzCheckErrorCode(err_code)

        ' S13: 执行本次 place-in 轨迹
        Call xyzExecuteTraj(pose_num, traj)

        ' S14: 获取本次 place-out 轨迹
        err_code = xyzGetPlaceout(vs_id, pipeline_num, register_num, pose_num, traj)
        Call xyzCheckErrorCode(err_code)

        ' S15: 执行本次 place-out 轨迹
        Call xyzExecuteTraj(pose_num, traj)
    Loop While (True)
End Sub