1、 建立 TCPIP通信,从视觉系统获取可使用的像素坐标字符串,一般机器人控制器作为客户端 client ,而视觉系统作为 server 。
涉及指令【 OpenNet WaitNet LineInput Print # Parsestr Val】
Function TCPIP
Function TCPIP
OpenNet #201 As Client WaitNet #201
LineInput #201 Parsestr ..
FEND
2、 确定相机的安装位置,此处以相机安装在 #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 指令MemOn.MemO指ff 令即可形成循环的逻辑判断,知道相机的进程,以及对拍照失败等情况做出反应
7、其他需要注意的地方是程序的容错性,不能中途进行不下去就一直等待或者没有别的相应操作,全局变量和局部变量的使用 该项目中相机固定在机器人的 4#轴上,为移动相机 , 利用相机拍照识别托盘中的工件放在一固定的模具内,每次放置为角度位置确保一致
Global String pixel_string$;
Global String rec_string$(10);
Global Real data_x, data_y, data_u;
Integer camara_id;
Global Real data_x, data_y, data_u;
Integer camara_id;
Function main
Call intialization
Call TCPIP
Call TCPIP
Call creat_calib_data
Call point_trans
Call point_trans
Call working
Fend
初始化
Fend
初始化
Function intialization
If Motor = Off Then
Motor On
Motor On
EndIf
SpeedS 500; AccelS 1000, 1000 Home; Reset;
Power High; Speed 60; Accel 60, 60
SpeedS 500; AccelS 1000, 1000
Fend
'[ 点位的对应关系 , 计算出来的是否足够准确 ]
' 创建标定数据 caa0.caa, 准备好标定需要的像素坐标 , 机械坐标各 9 个点,[ 参考点的使用与否 ]
Function creat_calib_data
Integer i, j, k;
Integer i, j, k;
Real info(10);
LoadPoints "robot1.pts"
LoadPoints "robot1.pts"
Pallet 1, robot_cal1, robot_cal3, robot_cal7, robot_cal9, 3, 3
' 生成 9 个机器人坐标点 P20-P28,4.6 换顺序
For i = 1 To 9
P(i + 19) = Pallet(1, i)
Next i
Next i
P13 = Pallet(1, 6)
P15 = Pallet(1, 4)
P15 = Pallet(1, 4)
SavePoints "robot1.pts"
' 基于刚才生成的 9 个机器人坐标点 , 拍照 9 次, 获取对应点的像素坐标
P10-P18
For j = 20 To 28
Go P(j)
Go P(j)
On light1, 0.4; On camara1, 0.2 ' 执行拍照
Call parsestr_str ' 拍完照后进行解析
P(j - 10) = XY(data_x, data_y, 0, data_u)
Print "P(j-10)", P(j - 10)
Print "P(j-10)", P(j - 10)
Next j
SavePoints "robot1.pts"
' 开始生成标定数据
'vxcalib 0[1-15 标定数据 ID 号],5[ 安装方式 :mobile on joint#4],P[ 指定的像素坐标 xy only],P[ 指定的机器人坐标 ],P[ 参考点, 也不一定要 ]
VxCalib 0, 5, P(10:18), P(20:28), P9
VxCalib 0, 5, P(10:18), P(20:28), P9
If (VxCalInfo(0, 1) = True) Then
For k = 0 To 7
For k = 0 To 7
info(k) = VxCalInfo(0, k + 2)
Next k
Print "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 "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)
Print "Y Max error [mm]:", info(5)
Print "Y mm per pixel [mm]:", info(6)
Print "Y tilt [deg]", info(7)
Else
Print "calibration failed!"
EndIf
EndIf
VxCalSave "ccd0.caa"
Fend
' 创建 TCP/IP 通信, 解析发送来的像素坐标字符串
Function TCPIP
Function TCPIP
pixel_string$ = "12000,2212.00,2121212,0.9999";
OpenNet #201 As Client
Print "waiting for connect"
WaitNet #201
Print "waiting for connect"
WaitNet #201
Print #201, "test"; Print "test"
Print "connection success"
Line Input #201, pixel_string$
Print "connection success"
Line Input #201, pixel_string$
Print "Receive info: ", pixel_string$
ParseStr pixel_string$, rec_string$(), ","
data_x = Val(rec_string$(0))
ParseStr pixel_string$, rec_string$(), ","
data_x = Val(rec_string$(0))
data_y = Val(rec_string$(1))
data_u = Val(rec_string$(2))
data_u = Val(rec_string$(2))
Fend
Function parsestr_str
Line Input #201, pixel_string$
Print "receive info :", 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))
data_y = Val(rec_string$(1))
data_u = Val(rec_string$(2))
Fend
Function vision_crl(camara_id As Integer)
OpenNet #202 As Client;
OpenNet #202 As Client;
WaitNet #202;
If camara_id = 0 Then
On light1, 0.4; Print #202, "C1";;
EndIf
EndIf
If camara_id = 1 Then
On light2, 0.4; Print #202, "C2";
EndIf
EndIf
Line Input #202, pixel_string$
Print "receive info :", pixel_string$
Print "receive info :", pixel_string$
ParseStr pixel_string$, rec_string$(), ","
data_x = Val(rec_string$(0))
data_x = Val(rec_string$(0))
data_y = Val(rec_string$(1))
data_u = Val(rec_string$(2))
data_u = Val(rec_string$(2))
Fend
' 坐标转换 , 根据标定数据,将像素坐标转换为机器人坐标
Function point_trans
' 只是用转化后的 XY值, 高度 Z 值进行人为指定 , 角度 U值进行偏移处理
VxCalLoad "caa0.caa";
VxCalLoad "caa0.caa";
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 "robot1.pts"
P34 = XY(CX(P31), CY(P31), 0, data_u) ' 模具上方点坐标
SavePoints "robot1.pts"
Fend
' 工艺流程程序
Function working
Integer l;
Integer l;
Pallet 2, robot_cal1, robot_cal3, robot_cal7, robot_cal7, 3, 3;
For l = 1 To 9
Go Pallet(2, 1); On light1, 0.4; On camara1, 0.2; ' 前往指定点拍照
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, 0.4; On camara1, 0.2 !;
Off vocaum; Go P34; ' 前往固定模具处放料
Next l
Off vocaum; Go P34; ' 前往固定模具处放料
Next l
Fend
' 拍照的时候仍然要注意的是要检测模具处究竟有没有物料,模具上放置点的圆心位置也是通过
' 拍照发送过来的 , 这样的话每次来说要移动的仅仅是工具中心的位置, 把整体当
做工具中心。
' 那么基于规律,发过来的角度用于放置工件时的计算,因为不同角度过来的姿态都是根据 0 度调整而来的控制拍照的方法, *好是一直执行的 , 但是要有衔接 , 这样就涉及内存 IO 的同步,也就是标志位置把拍照选择分支写在前面,字符串处理写在后面
了解更多信息可点击咨询:爱普生机器人服务商