导读:在工作中,通常会使用机器人去实现物料的抓取,而物料的颜色、形状、大小、角度等参数,机器人无法去实现,而视觉相机有可以实现这一功能。但是双方交换数据时,需要编程人员去规约或者提取。今天就和大家聊聊ABB机器人与视觉的通信及数据处理。 本次机器人与视觉这边,我们采用的是Socket通信。这种协议我们在这不作介绍,主要的重点是给大家介绍双方数据的提取和转换过程。 如图1,机器人欲抓起物料,但是物料的角度只能通过视觉相机这边提供给机器人(2D相机,可以识别平面旋转角度)。 图1 在编程之前,我们要掌握机器人去准确抓取一个物料的条件有两个:1.物料的位置值 2.物料的旋转角度值。所以,需要视觉这边提供3个数据,分别是:物料的X和Y位置数据和Z旋转角度值。但是ABB机器人工具的旋转姿态由q1/q2/q3/q4四个参数(四元素)决定,而视觉相机发过来的值是旋转角度值(欧拉角),所以要通过欧拉角转换为四元素机器人才能调整适合的工具姿态去抓取物料。 MODULE Module1 VAR num cam_x:=0;定义视觉发送X位置数据值 VAR num cam_y:=0; 定义视觉发送y位置数据值 VAR num cam_angle:=0; 定义视觉发送旋转角度数据值 CONST robtarget p10:=[[-1.289131E-05,3.351449E-06,237.1972],[0.01633704,-3.806521E-08,0.9998665,-3.595199E-08],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]]; 定义安全位置点数据 Var robtarget 定义抓取位置点数据 ppick:=[[24.6736,49.99907,19.99434],[0.01633701,-5.075877E-09,0.9998665,-2.882863E-08],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]]; VAR socketdev Socket1;定义套接字数据 VAR string received_string;定义字符串数据 VAR num startBit1; 定义num数据startBit1 VAR num startBit2; 定义num数据startBit2 VAR num startBit3; 定义num数据startBit3 VAR num startBit4; 定义num数据startBit4 VAR num startBit5; 定义num数据startBit5 VAR num EndBit1; 定义num数据 VAR num EndBit2; 定义num数据 VAR num EndBit3; 定义num数据 VAR num LenBit1; 定义num数据 VAR num LenBit2; 定义num数据 VAR num LenBit3; 定义num数据 VAR num Lenstring; 定义num数据 VAR string XData:=""; 定义num数据 VAR string yData:=""; 定义num数据 VAR string AngleData:=""; 定义num数据 PERS num X; 定义num数据 PERS num Y; 定义num数据 PERS num Angle; 定义num数据 以下是ABB机器人程序编写:(视觉发送给机器人的数据以字符串的格式发送并分号进行隔开,例如“12.3;33.5;24.2”) PROC main() SocketCreate Socket1; 创建套接字 SocketConnect Socket1, "127.0.0.1", 3000; 连接套接字 WHILE TRUE DO SocketSend Socket1\Str:="hello server";发送数据给视觉相机 SocketReceive Socket1\Str:=received_string; 接收数据到机器人 TPWrite "server wrote-"+received_string; 写屏 DecodeData; 数据解析程序 cal_data; 欧拉角四元素转换程序 r_move; 抓取程序 ENDWHILE ERROR 出错将关闭通信 SocketClose Socket1; ENDPROC PROC DecodeData()数据转换程序 VAR string Strread:=""; 定义字符串数据 VAR bool datatrue:=FALSE;定义布尔数据 Strread:=received_string; !接收来的数据存入Strread Lenstring:=StrLen(Strread); !判断接收来的数据长度 startBit1:=1; EndBit1:=StrFind(Strread,startBit1,";"); 查找第一个分号 LenBit1:=EndBit1-startBit1; 确定第一个数据的长度 startBit2:=EndBit1+1; EndBit2:=StrFind(Strread,startBit2,";");查找第二个分号 LenBit2:=EndBit2-startBit2;确定第二个数据的长度 startBit3:=EndBit2+1; 查找第三个分号 EndBit3:=StrFind(Strread,startBit3,";"); 确定第三个数据的长度 LenBit3:=EndBit3-startBit3; XData:=StrPart(Strread,startBit1,LenBit1); 截取第一个数据 yData:=StrPart(Strread,startBit2,LenBit2); 截取第二个数据 AngleData:=StrPart(Strread,startBit3,LenBit3); 截取第三个数据 datatrue:=StrToVal(XData,cam_x); 字符串转换为num datatrue:=StrToVal(yData,cam_y); 字符串转换为num datatrue:=StrToVal(AngleData,cam_angle); 字符串转换为num ENDPROC PROC cal_data()欧拉角四元素转换程序 VAR num rx;定义num数据 VAR num ry; 定义num数据 VAR num rz; 定义num数据 ppick.trans.z:=0; 2D视觉平面旋转,Z为0 rx:=EulerZYX(\X,ppick.rot); 四元素转换为欧拉角X ry:=EulerZYX(\Y,ppick.rot); 四元素转换为欧拉角Y rz:=EulerZYX(\z,ppick.rot); 四元素转换为欧拉角Z ppick.trans.x:=cam_x; 相机X位置值给到抓取点X ppick.trans.y:=cam_y; 相机Y位置值给到抓取点Y ppick.rot:=OrientZYX(cam_angle,ry,rx); 欧拉角转换为四元素 ENDPROC PROC r_move()抓取程序 MoveL Offs(ppick,0,0,30),v1000,z50,xipan\WObj:=Workobject_2; 移动到抓取点上方 MoveL ppick,v1000,fine,xipan\WObj:=Workobject_2; 移动到抓取点 WaitTime 0.5;等待0.5秒 MoveL Offs(ppick,0,0,30),v1000,fine,xipan\WObj:=Workobject_2; 移动到抓取点上方 MoveL p10,v1000,fine,xipan\WObj:=Workobject_2;回到安全点 ENDPROC ENDMODULE 结束语:ABB机器人与视觉相机的通信并且实现抓取,主要掌握以下几个知识点即可解决: 1.视觉会发送哪几个数据给机器人,以什么格式进行发送? 2.视觉发送数据给了机器人,如何提取出来? 3.视觉发送的数据欧拉角如何转换成机器人的工具旋转角度 没有视觉的话我们可以采用调试软件进行测试。如图2 来源:PLC发烧友,作者:眭相建,未经授权不得转载 更多知识可关注公众号“PLC发烧友” |
|