1、建立TCPIP通信,从视觉系统获取可使用的像素坐标字符串,一般机器人控制器作为客户端client,而视觉系统作为server。
涉及指令【OpenNet WaitNet LineInput Print # Parsestr Val】Function TCPIPOpenNet #201 As ClientWaitNet #201LineInput #201……Parsestr…………..FEND2、确定相机的安装位置,此处以相机安装在#4 joint为例子,此时吸嘴也不在原来的Tool0中心,所以此时需要确立新的两个坐标系,此中最必要的是确立吸嘴的工具坐标系Tool1,在机器人控制中的工具坐标系向导进行示教保存,这是前期必要的准备工作。
3、有了以上步骤作为辅助后,根据Epson视觉标定的需求,具体见VxClib函数,需要9个机器人坐标系下的点,总而言之就是,在新建的Tool1下示教9个点,且获取这九个点下的像素坐标,这样的就可以生成具体的视觉标定caa文件了涉及指令【VxClib LoadPoints SavePoints VxCalSav VxCalInfo】4、利用上面生成的标定caa文件就可以进行之后的操作了,标定文件是之后坐标转换的基准,也就是说,像素坐标对应的机器人坐标均由此产生。
涉及指令【VxCalLoad VxTrans XY CX CY CZ CU CV CW】5、基于以上步骤,要注意实际运行时工具的选用,以免造成工具坐标系的不匹配而位置错误6、关机触发拍照,最好使用视觉系统触发,这样的话配合内部存储IO指令指令即可形成循环的逻辑判断,知道相机的进程,以及对拍照失败等情况做出反应7、其他需要注意的地方是程序的容错性,不能中途进行不下去就一直等待或者没有别的相应操作,全局变量和局部变量的使用'该项目中相机固定在机器人的4#轴上,为移动相机,利用相机拍照识别托盘中的工件'放在一固定的模具内,每次放置为角度位置确保一致Global String pixel_string$;Global String rec_string$(10);Global Real data_x, data_y, data_u;Integer camara_id;Function main'Call intializationCall TCPIPCall creat_calib_dataCall point_transCall workingFend'初始化Function intializationIf Motor = Off ThenMotor OnEndIfSpeedS 500; AccelS 1000, 1000Home; Reset;Power High; Speed 60; Accel 60, 60SpeedS 500; AccelS 1000, 1000Fend'[点位的对应关系,计算出来的是否足够准确]'创建标定数据,准备好标定需要的像素坐标,机械坐标各9个点,[参考点的使用与否]Function creat_calib_dataInteger i, j, k;Real info(10);LoadPoints ""Pallet 1, robot_cal1, robot_cal3, robot_cal7, robot_cal9, 3, 3'生成9个机器人坐标点P20-P28,换顺序For i = 1 To 9P(i + 19) = Pallet(1, i)Next iP13 = Pallet(1, 6)P15 = Pallet(1, 4)SavePoints ""'基于刚才生成的9个机器人坐标点,拍照9次,获取对应点的像素坐标P10-P18For j = 20 To 28Go P(j)On light1, ; On camara1, '执行拍照Call parsestr_str '拍完照后进行解析P(j - 10) = XY(data_x, data_y, 0, data_u)Print "P(j-10)", P(j - 10)Next jSavePoints ""'开始生成标定数据'vxcalib 0[1-15标定数据ID号],5[安装方式:mobile on joint#4],P[指定的像素坐标xy only],P[指定的机器人坐标],P[参考点,也不一定要]VxCalib 0, 5, P(10:18), P(20:28), P9If (VxCalInfo(0, 1) = True) ThenFor k = 0 To 7info(k) = VxCalInfo(0, k + 2)Next kPrint "Calibration_0 result:"Print "X Avg Error [mm]:", info(0)Print "X Max error [mm]:", info(1)Print "X mm per pixel [mm]:", info(2)Print "X tilt [deg]:", info(3)Print "Y Avg error [mm]:", info(4)Print "Y Max error [mm]:", info(5)Print "Y mm per pixel [mm]:", info(6)Print "Y tilt [deg]", info(7)ElsePrint "calibration failed!"EndIfVxCalSave ""Fend'创建TCP/IP通信,解析发送来的像素坐标字符串Function TCPIPpixel_string$ = "12000,,2121212,";OpenNet #201 As ClientPrint "waiting for connect"WaitNet #201Print #201, "test"; Print "test"Print "connection success"Line Input #201, pixel_string$Print "Receive info: ", pixel_string$ParseStr pixel_string$, rec_string$(), ","data_x = Val(rec_string$(0))data_y = Val(rec_string$(1))data_u = Val(rec_string$(2))FendFunction parsestr_strLine Input #201, pixel_string$Print "receive info :", pixel_string$ParseStr pixel_string$, rec_string$(), ","data_x = Val(rec_string$(0))data_y = Val(rec_string$(1))data_u = Val(rec_string$(2))FendFunction vision_crl(camara_id As Integer) OpenNet #202 As Client;WaitNet #202;If camara_id = 0 ThenOn light1, ; Print #202, "C1";;EndIfIf camara_id = 1 ThenOn light2, ; Print #202, "C2";EndIfLine Input #202, pixel_string$Print "receive info :", pixel_string$ParseStr pixel_string$, rec_string$(), ","data_x = Val(rec_string$(0))data_y = Val(rec_string$(1))data_u = Val(rec_string$(2))Fend'坐标转换,根据标定数据,将像素坐标转换为机器人坐标Function point_trans'只是用转化后的XY值,高度Z值进行人为指定,角度U值进行偏移处理VxCalLoad "";P30 = XY(data_x, data_y, 0, 0)Tool 2;P31 = VxTrans(0, P30)P31 = XY(CX(P31), CY(P31), -50, data_u) '吸料点坐标P32 = XY(CX(P31), CY(P31), 0, data_u) '吸料上方点坐标'P33 = XY(CX(P31), CY(P31), -50, data_u) '模具放料点坐标P34 = XY(CX(P31), CY(P31), 0, data_u) '模具上方点坐标SavePoints ""Fend'工艺流程程序Function workingInteger l;Pallet 2, robot_cal1, robot_cal3, robot_cal7, robot_cal7, 3, 3;For l = 1 To 9Go Pallet(2, 1); On light1, ; On camara1, ; '前往指定点拍照Call parsestr_str(0);Call point_trans;Call parsestr_str(1);Call point_trans;Go P31; On vocaum; Go P32; '校正姿态取料Go P33 ! D20; On light1, ; On camara1, !;Off vocaum; Go P34; '前往固定模具处放料Next lFend'拍照的时候仍然要注意的是要检测模具处究竟有没有物料,模具上放置点的圆心位置也是通过'拍照发送过来的,这样的话每次来说要移动的仅仅是工具中心的位置,把整体当做工具中心'那么基于规律,发过来的角度用于放置工件时的计算,因为不同角度过来的姿态都是根据0度调整而来的'控制拍照的方法,最好是一直执行的,但是要有衔接,这样就涉及内存IO的同步,也就是标志位'把拍照选择分支写在前面,字符串处理写在后面。