案例/模板说明

机械臂主控主函数说明

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

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

坐标移动基础模板

GLOBAL PROC CartMoveBasic()
    VAR int err_code;           // 错误代码
    VAR int flag                // 0 表示眼在手上,1表示眼在手外
    VAR jointtarget home_pose   // home 点
    VAR robtarget scan_pose     // 眼在手上时,需要发送的拍照位
    VAR robtarget place_pose    // 放置位姿

    xyzClose("MasterSock")   // 断开可能已存在的socket
    xyzConnect("MasterSock") // 连接上位机 server

    // err_code = xyzSwitchFlow("test.t")    // 切换 flow ,默认被注释掉,如果需求可以取消注释
    // if (err_code != 0)                    // 异常处理
    //     xyzClose("MasterSock")
    // endif

    // 切换工件,两个参数分别表示视觉服务ID,和工件代号
    // 工件代号为MAX中映射表与通讯协议设置中的参数
    err_code = xyzSwitchObject(0, "obj1")
    if (err_code != 0)                  // 异常处理
        xyzClose("MasterSock")
    endif

    SetDO DO0_0, false // 重置数字输出

    // 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值
    // 或者用使用其他点来替代
    MoveAbsJ home_pose,v1000,z50,tool0

    flag = 1    // 修改手眼关系标志位(是否需要发送拍照点位姿)
    While (true)
                if (flag==0)
            // 注意需要先定义 scan_pose 的位姿,或者用使用其他点来替代
            MoveL scan_pose,v1000,z50,tool0 // 移动到 scan pose
            err_code = xyzSendCurrentCartPose()  // 发送拍照位姿
            if (err_code != 0)                   // 异常处理
                xyzClose("MasterSock")
            endif
        endif

        err_code = xyzReqGraspPose(0)   // 请求 grasp pose
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif

        // 获取grasp pose
        err_code = xyzGetGraspPose(Token)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif
        if (PoseNum < 1)    // 识别失败处理
            Wait 5
                        continue
                endif

        // 可能需要添加其他路径点作为过渡

        // 移动到抓取位姿
        MoveL GraspPose,v1000,z50,tool0
        SetDO DO0_0, true   // 控制数字输出

        // 需要添加其他路径点作为过渡

        // 移动到放置点
        MoveL place_pose,v1000,z50,tool0
        SetDO DO0_0, false  // 重置数字输出
    Endwhile
ENDPROC

坐标移动二次定位模板

GLOBAL PROC CartMoveRepo()
    VAR int err_code             //错误代码
    VAR jointtarget home_pose    // home 点
    VAR robtarget scan_pose      // 拍照位姿
    VAR robtarget place_pose     // 放置位姿

    xyzClose("MasterSock")   // 断开可能已存在的socket
    xyzConnect("MasterSock") // 连接上位机 server

    // err_code = xyzSwitchFlow("test.t")    // 切换 flow ,默认被注释掉,如果需求可以取消注释
    // if (err_code != 0)                    // 异常处理
    //     xyzClose("MasterSock")
    // endif

    // 切换工件,两个参数分别表示视觉服务ID,和工件代号
    // 工件代号为MAX中映射表与通讯协议设置中的参数
    err_code = xyzSwitchObject(0, "obj1")
    if (err_code != 0)                  // 异常处理
        xyzClose("MasterSock")
    endif

    SetDO DO0_0, false // 重置数字输出
        SetDO DO0_1, false

    // 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值, 或者用使用其他点来替代
    MoveAbsJ home_pose,v1000,z50,tool0
    err_code = xyzReqGraspPose(0)   // 请求 grasp pose
    if (err_code != 0)              // 异常处理
        xyzClose("MasterSock")
    endif

    While (true)
        // 获取抓取位姿
        err_code = xyzGetGraspPose(Token)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif
        if (PoseNum < 1)                            // 如果识别数量为0
            // 工作空间内没有工件,需要先移除隔板
            err_code = xyzSwitchObject(0, "board") // 切换隔板
            if (err_code != 0)              // 异常处理
                xyzClose("MasterSock")
            endif

            err_code = xyzReqGraspPose(0);      // 请求隔板的抓取位姿
            if (err_code != 0)              // 异常处理
                xyzClose("MasterSock")
            endif

            // 获取隔板抓取位姿
            err_code = xyzGetGraspPose(Token)
            if (err_code != 0) OR (pose_num < 1)  // 异常处理与未识别处理
                xyzClose("MasterSock")
            endif

            // 可能需要添加其他路径点作为过渡

            // 移动到抓取位姿
            MoveL GraspPose,v1000,z50,tool0
            SetDO DO0_0, true   // 控制数字输出

            // 此处需要添加放置隔板的路径点

            err_code = xyzSwitchObject(0, "obj1")    // 切换工件
            if (err_code != 0)              // 异常处理
                xyzClose("MasterSock")
            endif

            err_code = xyzReqGraspPose(0)   // 请求抓取位姿
            if (err_code != 0)              // 异常处理
                xyzClose("MasterSock")
            endif
            continue
        else    // 如果识别数量不为0
            // 注意需要先定义 scan_pose 的位姿,或者用使用其他点来替代
            MoveL scan_pose,v1000,z50,tool0   // 运动到 scan pose
                        err_code = xyzSendCurrentCartPose()    // 发送 scan pose
            if (err_code != 0)              // 异常处理
                xyzClose("MasterSock")
            endif

            err_code = xyzSwitchObject(1, "obj1") // 切换工作空间与工件
            if (err_code != 0)              // 异常处理
                xyzClose("MasterSock")
            endif

            err_code = xyzReqGraspPose(1)  // 请求抓取位姿
            if (err_code != 0)              // 异常处理
                xyzClose("MasterSock")
            endif

            err_code = xyzGetGraspPose(Token) // 获取抓取位姿
            if (err_code != 0) OR (pose_num < 1)  // 异常处理与未识别处理
                xyzClose("MasterSock")
            endif

            // 可能需要添加其他路径点作为过渡

            // 移动到抓取位姿
            MoveL GraspPose,v1000,z50,tool0
                        SetDO DO0_1,true   // 控制数字输出

            // 可能需要添加其他路径点作为过渡

            // 移动到放置位姿
            MoveL place_pose,v1000,z50,tool0
            SetDO DO0_1,false   // 重置数字输出

        ENDIF
        err_code = xyzSwitchObject(0, "obj1")  // 切换工作空间与工件
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif

        err_code = xyzReqGraspPose(0)   // 请求抓取位姿
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif
    Endwhile
ENDPROC

轨迹移动同步模板

GLOBAL PROC TrajMoveSync()
    VAR int err_code           // 错误代码
    VAR jointtarget home_pose  // home 点位

    xyzClose("MasterSock")   // 断开可能已存在的socket
    xyzConnect("MasterSock") // 连接上位机 server

    // err_code = xyzSwitchFlow("traj_sync.t")    // 切换 flow ,默认被注释掉,如果需求可以取消注释
    // if (err_code != 0)                    // 异常处理
    //     xyzClose("MasterSock")
    // endif

    // 切换工件,两个参数分别表示视觉服务 ID ,和工件代号
    // 工件代号为 MAX 中映射表与通讯协议设置中的参数
    err_code = xyzSwitchObject(0, "obj1")
    if (err_code != 0)                  // 异常处理
        xyzClose("MasterSock")
    endif

    Reset output0; //重置数字输出

    // 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值,或者用使用其他点来替代
    MoveAbsJ home_pose,v1000,z50,tool0

    While (true)
        // 请求抓取和放置规划
        err_code = xyzReqPickPlace(0)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif

        // 请求 pick in 轨迹
        err_code = xyzGetPickin(0)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif
        if (PoseNum < 1)
            print("Tote cleared")
            break
        endif

        // 执行 pick in 轨迹
        xyzExecuteTraj()
        SetDO DO0_0, true

        // 请求 pick out 轨迹
        err_code = xyzGetPickout(0)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif

        // 执行 pick out 轨迹
        xyzExecuteTraj()

        // 请求 place in 轨迹
        err_code = xyzGetPlacein(0)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif

        // 执行 place in 轨迹
        xyzExecuteTraj()
        Reset output0;

        // 请求 place out 轨迹
        err_code = xyzGetPlaceout(0)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif

        // 执行 place out 轨迹
        xyzExecuteTraj()
    Endwhile
ENDPROC

轨迹移动异步模板

GLOBAL PROC TrajMoveAsync()
    VAR int err_code           // 错误代码
    VAR jointtarget home_pose  // home 点位

    xyzClose("MasterSock")   // 断开可能已存在的socket
    xyzConnect("MasterSock") // 连接上位机 server

    // err_code = xyzSwitchFlow("traj_sync.t")    // 切换 flow ,默认被注释掉,如果需求可以取消注释
    // if (err_code != 0)                    // 异常处理
    //     xyzClose("MasterSock")
    // endif

    // 切换工件,两个参数分别表示视觉服务 ID ,和工件代号
    // 工件代号为 MAX 中映射表与通讯协议设置中的参数
    err_code = xyzSwitchObject(0, "obj1")
    if (err_code != 0)                  // 异常处理
        xyzClose("MasterSock")
    endif

    Reset output0; //重置数字输出

    // 首先移动到 home 点。注意需要先定义 home_pose 的关节角度值,或者用使用其他点来替代
    MoveAbsJ home_pose,v1000,z50,tool0

    err_code = xyzReqPickPlace(0)  // 请求抓取和放置规划
    if (err_code != 0)                  // 异常处理
        xyzClose("MasterSock")
    endif

    While (true)
        // 请求抓取和放置规划
        err_code = xyzReqPickPlace(0)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif

        // 请求 pick in 轨迹
        err_code = xyzGetPickin(0)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif
        if (PoseNum < 1)
            print("Tote cleared")
            break
        endif

        // 执行 pick in 轨迹
        xyzExecuteTraj()
        SetDO DO0_0, true

        // 请求 pick out 轨迹
        err_code = xyzGetPickout(0)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif

        // 执行 pick out 轨迹
        xyzExecuteTraj()

        // 运动到相机视野外,请求下一次轨迹运算
        err_code = xyzReqPickPlace(0)  // 请求抓取和放置规划
        if (err_code != 0)                  // 异常处理
            xyzClose("MasterSock")
        endif

        // 继续请求本次 place in 轨迹
        err_code = xyzGetPlacein(0)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif

        // 执行 place in 轨迹
        xyzExecuteTraj()
        Reset output0;

        // 继续请求本次 place out 轨迹
        err_code = xyzGetPlaceout(0)
        if (err_code != 0)              // 异常处理
            xyzClose("MasterSock")
        endif

        // 执行 place out 轨迹
        xyzExecuteTraj()
    Endwhile
ENDPROC