1、上海新时达机器人有限公司康耐视相机操作使用说明书文档密级 不保密内部机密项目名称版本号 1.0描述 康耐视相机操作使用说明书编写人 余国鹰 编写日期 2015/9/10文件状态:草稿修改定稿审核人 审核日期上海新时达机器人有限公司目录一、 康耐视相机具体设置 31.1 软件安装 .错误!未定义书签。1.2 流程编辑 31.3 CODESYS 通信注意事项 6二、 相机标定 72.1 相机校准 72.2 绝对坐标实现 92.3 相对坐标实现 10三、 示教器示例程序 113.1 绝对坐标实现范例 113.2 相对坐标实现范例 11四、 CODESYS 逻辑开发 134.1 SOCKET 通信开发
2、 134.2 外部点数据处理 14五、 细节说明 17康耐视相机操作使用说明书一、 康耐视相机具体设置1.1 软件安装双击康耐视相机软件 Cognex_In-Sight_Software_4.8.1,按照步骤一步步安装即可。1.2 流程编辑1. 设置电脑本地连接 IPV4 地址为 192.168.39.12(设置为 39 段即可) 。2. 双击康耐视 In-Sight 浏览器软件进入相机设置界面,软件会自动搜索连接的相机设备,如下图 1.1 所示。图 1.13. 双击相机设备(红色椭圆内设备图标) ,进入相机编辑界面,如下图 1.2 所示。图 1.2 上海新时达机器人有限公司4. 在应用程序步
3、骤中,开始、设置工具、配置结果、完成这 4 个步骤形成一个完整的相机操作流程; 开始 单击“开始”中“已连接” ,如下图 1.3 所示,可以进行连接设备、断开设备、刷新、添加等操作。图 1.3单击“开始”中的“设置图像” ,如下图 1.4 所示。在“采集/加载图像”对话框中, “触发器”按钮是进行拍照, “实况视频”按钮是实时显示相机中的图像, “从 PC 加载图像”按钮是加载一张存在的图像。图 1.4在“编辑采集设置”对话框中,设置一系列相机参数,根据具体需要进行调节 设置工具 单击“设置工具”中“定位部件”按钮,对检测模型进行定位,作为识别的模型进行对比;单击“设置工具”中“检测部件”按钮
4、,对模型进行编辑操作。在“定位部件”的设置对话框中,如下图 1.5 所示,合格阀值:每次拍照之后的得分如果大于阀值,则拍照成功,否则失败;旋转公差:检测部件能够旋转的角度范围,如果在范围之类则会拍照成功,否则会失败康耐视相机操作使用说明书图 1.5 配置结果 单击“配置结果”中“通信”按钮,进行通讯设置操作,如下图 1.6 所示。新时达机器人视觉通信采用的 TCP/IP 通讯方式,单击“TCP/IP ”,如下图 1.7 所示,在“TCP/IP 设置 ”对话框中, “服务器主机名”设为 192.168.39.220(机器人控制器 IP 地址) , “端口”设置与 CodeSys 中相同,本例中设
5、为 9876, “超时时间”设为 15000, “结束符”设为字符串(CR13) 。单击“格式化输出字符串” ,进行输出操作,如下图 1.8 所示。勾选“使用分隔符” ,表示在输出之间用逗号分隔符进行隔开,方便进行数据处理操作;单击“添加”按钮,可以输出很多数据,这里只需要输出 4 个数据, “失败” 、 “定位器.X” 、 “定位器.Y ”、 “定位器.角度” ;输出数据说明:均为 7 个字节宽度,除图案.失败是整形外,其它数据均为浮点型,小数点位数为 2 位。1) 第一位图案.失败:判定符,为 0 表示采集到特征,拍照成功;为 1 则拍照失败。2) 第二位图案.定位器.X:输出用户坐标系下
6、的 X 方向绝对值。3) 第三位图案.定位器.Y:输出用户坐标系下的 Y 方向绝对值。4) 第四位图案.定位器.角度:输出用户坐标系下的相对角度。图 1.6上海新时达机器人有限公司图 1.7图 1.8 完成 在“完成”中单击“保存作业” ,则保存当前作业任务中的所有设置;在“完成”中单击“运行作业” ,则运行当前作业任务。注意,以上参数设定必须在脱机模式下才能够设置,在联机状态下参数不能设置,与外界设备实时通讯必须在联机模式下;物体旋转一定角度拍照失败,看检测部件是否超过相机视野范围和旋转角度值设置是否合理。1.3 Codesys 通信注意事项a) 说明:设定 PC 端的 IP 地址,IP 地
7、址必须 192.168.39.XXX,这里设定为192.168.39.12,用网线与相机控制器相连;b) 通信流程包括:建立 TCPIP 的服务器端并连接,给相机发送指令,从相机接收数据;c) 图 1.7 中如果把“字段分隔符”改为“停止” ,则两个数据之间就是无分隔符的直接连接;如果选择其他,则有相应的分隔符号;d) 例:采用“消零”为“有” , “字段分隔符”为“停止”的方式时,相机发送数据“-001.00”和“1010.02”时,实际上发送了“45 48 48 49 46 48 48 49 48 49 48 46 48 50 13”(13 是回车符的 ASIIC 码);e) 在下载工程成
8、功时,查看通讯是否连接正常。当 client_congnex 任务中的step_cognex:=2 和 server_cognex 中的 step_server:=2 时,此时通讯成功,否则通讯不正常,需要查看设备是否连接好和 In-Sight 软件是否处于联机状态。康耐视相机操作使用说明书f) 详细指令及其他形式的通信可参考文档通信设定 sdnb-cn5-714d_fh_fz5 。上海新时达机器人有限公司二、 相机标定要实现将相机采集的数据转换为机器人坐标系下的位姿数据,必须建立相机坐标系与机器人坐标系的对应转换关系,该过程通过相机标定来实现。相机也分平面相机和三维相机,前者只支持平面数据采
9、集,后者则可以获取 xyz 空间值。以三维相机为例,要详细建立相机三维空间的位置与机器人坐标系的对应关系,必须通过严格的手眼标定来实现。不同相机有手眼标定算法,通过示教多个点来建立手眼转换关系。这里不详述。如果只做平面工件抓取,那只需要工件变化的坐标值 x、y 以及绕 z 轴的转动角度 c,问题就简单的多,只需要进行平面的简单标定即可实现。以康耐视相机为例,格力等客户只需要实现流水线来料的抓取操作,标定平面坐标系即可,康耐视相机可以提供移动后的工件相对于移动前的偏移位置量,或者提供工件的绝对移动位置。这里,我们提供这两种工作方式的实现过程。相机校准相机默认输出的坐标值是相机采集到的像素值,并非
10、实际工件位置尺寸,因此需要将物理坐标与像素值进行映射标定。设定校准后,可使测量结果像素值转换为实际尺寸并输出,康耐视提供了校准参数的制作过程。1.单击“设置图像“,界面右下角出现下图 2.1 所示界面。校准类型中有很多种,根据实际需要选择,这里选择“网格” ,然后单击“校准”按钮,出现下图 2.2 所示界面。图 2.12.打印校准网格纸张。在图 2.2 中,单击“打印网格”按钮,然后将打印的网格纸张放在相机视野正中间。3.在“设置”界面中, “网格类型”为方格图案(带基准) ,其它值均为默认。4.单击“姿势” ,进入姿势设置界面,如图 2.3 所示,原点位置为默认,单击“触发器”按钮, 相机会
11、自动拍照,最后单击“校准” ,校准工作就结束。5.单击“结果” ,可以查看校准情况,如图 2.4 所示。康耐视相机操作使用说明书图 2.2图 2.3上海新时达机器人有限公司图 2.46.建立检测模型。单击“定位部件” ,出现如图 2.5 所示界面,单击“位置工具”中“图案” ,然后单击“添加” ,单击“OK” ,接着单击界面右下角 “模型” ,拖动绿色模型矩形框,使被检测模型处于绿色矩形框中,最后单击界面右下角“训练” ,此时检测模型已经建立。图 2.57.查看模型建立是否成功。在界面右侧选择板中,可以查看建立图案的情况,绿色圆点表示模型建立成功,同时会输出检测模型的位置、角度、得分,如图 2
12、.6 所示。图 2.6通过以上7步即可完成相机的校准过程。2.2 绝对坐标实现 绝对坐标的实现必须借助机器人的用户坐标系,即机器人在用户坐标系下走绝对位置运动。具体实现由以下几个步骤组成。首先,用step机器人三点法示教出一个固定用户坐标系。用户坐标系的原点根据实际情况而定,一般选择流水线上一个固定位置参考点,该参考点要方便相机进行坐标转化标定。关于用户坐标系的标定,可参见新时达机器人操作使用说明书;其次,进行相机坐标与实际位置坐标的标定转换。在完成第一步中的固定用户坐标系标定后,在该坐标系下选取工件上的三点,计算出这三点在用户坐标系的X、Y值(该步骤可通过机器人协助示教获得在用户坐标系下的位
13、姿值)。在图像输入的“校准”模块中,按照2.1中的步骤完成相机坐标与实际位置坐标的校准参数制作转换;最后,机器人实现绝对位置运动。在完成第二步后,工件每偏移一点,相机均可计算出其在用户坐标系下新的位置值X、Y和绕Z轴的theta角度值。这样,只需要在示教器程序中设康耐视相机操作使用说明书置抓取运动点参考的坐标系为用户坐标系即可,即RefSys语句下走绝对cpe点。该cpe点是codesys里直接读取的相机返回值。2.3 相对坐标实现相对坐标的实现就比较简单,只需要将相机坐标转换为实际位置坐标即可。在工件上选取三个特征点,用带尖机器人示教出这三点在机器人基坐标系下的坐标值(主要是X和Y)。按照2
14、.1中的校准流程制作出校准参数。这样,工件偏移后,相机可以直接计算出其新的坐标X、Y和theta。需要注意的是,使用相对坐标运动时,相机输出数据必须是相对量,即测量坐标与基准坐标之差,而不是绝对测量坐标。具体信息见后续章节。上海新时达机器人有限公司三、 示教器示例程序绝对坐标实现范例Tool(tool0);/若带工具,则先加载好PTP(ap0); /走到一个安全位置点Lin(cp3);/走到标准抓取位置(工件处于标准位置时机器人的抓取位姿,提前示教好)RefSys(ref1);/切到用户坐标系下WaitTime(uint3);BOOLEXTSet(boolbasepos,TRUE);/端口号为
15、2,发送信号到 codesys,读取当前位置作为标准抓取位置WaitTime(uint4);BOOLEXTSet(boolbasepos,FALSE);/关闭该端口/以上为获得标准抓取位置需要的步骤RefSys(WORLD);PTP(ap0);LP:int0;BOOLEXTSet(boolphoto,TRUE); /发送相机拍照命令,端口号 0WaitTime(uint0); /等待PLC处理时间,建议在300ms 以上bool0:=BOOLEXTRead(boolenableget); /读取抓取标志位 ,为TRUE 则能抓取BOOLEXTSet(boolphoto,FALSE); /关闭该
16、端口,保证下次为高电平触发IF(bool0=0)THEN /为true则可抓取,否则重新发送拍照命令WaitTime(uint1);GOTO(int0);END_IFRefSys(ref1); /切到用户坐标系下Lin(rcpe0); /走到codesys 里输出的绝对位置(外部点形式,端口号0)BOOLEXTSet(boolfinishget,TRUE); /发送抓取完成标志WaitTime(uint2);BOOLEXTSet(boolfinishget,FALSE); /关闭抓取完成标志PTP(ap1);GOTO(int1); /回到循环开始,等待下一个工件3.2 相对坐标实现范例Tool
17、(tool0);/若带工具,则先加载好PTP(ap0); /走到一个安全位置点Lin(cp3);/走到标准抓取位置(工件处于标准位置时机器人的抓取位姿,提前示教好)WaitTime(uint3);BOOLEXTSet(boolbasepos,TRUE);/端口号为2,读取当前位置作为标准抓取位置WaitTime(uint4);康耐视相机操作使用说明书BOOLEXTSet(boolbasepos,FALSE);/关闭该端口/以上为获得标准抓取位置需要的步骤PTP(ap0);/回到安全点LP:int0;BOOLEXTSet(boolphoto,TRUE); /发送相机拍照命令,端口号 0WaitT
18、ime(uint0); /等待PLC处理时间,建议在300ms 以上bool0:=BOOLEXTRead(boolenableget); /读取抓取标志位 ,为TRUE 则能抓取BOOLEXTSet(boolphoto,FALSE); /关闭该端口,保证下次为高电平触发IF(bool0=0)THEN /为true则可抓取,否则重新发送拍照命令WaitTime(uint1);GOTO(int0);END_IFLin(rcpe1); /走到codesys 里输出的绝对位置(外部点形式,该位置是机器人当前位置加上相对偏移,端口号1)BOOLEXTSet(boolfinishget,TRUE); /发
19、送抓取完成标志WaitTime(uint2);BOOLEXTSet(boolfinishget,FALSE); /关闭抓取完成标志PTP(ap1);GOTO(int1); /回到循环开始,等待下一个工件上海新时达机器人有限公司四、 Codesys 逻辑开发Socket 通信开发首先,要在 codesys 上完成 socket 通讯开发。通讯开发的要点包括协议类型、协议数据、数据收发、逻辑判断等。一般的相机都是支持 TCP/IP 协议的,我们也多是采用该协议完成 step 控制器与各类相机的通讯连接及数据交互的。一般来说,机器人控制器作为主机 server(服务器) ,相机处理器作为从机 cli
20、ent(客户端) 。控制器作为主机的好处在于,控制器“知道”自己什么时候需要拍照、需要数据,此时给相机发送命令即可。相机作为客户端始终处于监听状态。主机控制器的 IP 地址为 192.168.39.220,端口号任意,如取为 9876,用网线与相机控制器相连,在完成相机与控制器的通信数据格式设定后,接下来就是 codesys 端编程实现。通信示例说明:CASE step OF0:SAddr.sAddr := 192.168.39.120;/服务器地址server(xEnable:=TRUE,ipAddr:=SAddr,uiPort:=9876);/建立服务器IF(server.xBusy =
21、TRUE) THENconnect(xEnable:=server.xBusy,hServer:=server.hServer);/连接IF(connect.xActive = TRUE) THEN/连接成功step := 1;/执行接收数据END_IFIF(connect.xError = TRUE)THEN/连接报错step := 3;/复位END_IFEND_IFIF(server.xError = TRUE)THENstep := 3;END_IF/从相机传过来的数据以 ASCII 码的形式存储到 recvokcr 数组,数组的第一位存储的是串行数据输出中设定的首位/例如设定的整数位为
22、 1,小数位为 1,当相机发送一个 1.0 时,用 BYTE 型 recvokcr 数组“1.0回车(CR) ”对应的 ASCII 码“49“, ”62“, ”48“, ”13“1:size1 := SIZEOF(recvokcr);/数组长度precv := ADR(recvokcr);/数组地址recv(xEnable:=TRUE,hConnection:=connect.hConnection,szSize:=size1,pData:=precv);/接收数据IF(recv.szCount7) THEN/判断是否收到数据输出,这里的数字应小于数据总长度step:=5;/数据处理END_I
23、FIF recv.xError THEN/接收数据报错康耐视相机操作使用说明书step:=3;END_IF/以 ASCII 码的形式从 senddata 数组传给相机,给相机发送“M 回车(CR ) ”命令可以采集一张图片2:size2 := SIZEOF(senddata);/数组长度senddata0:=16#4D;/M 的 ASCII 码,16 进制表示,是单次测量的指令。senddata1:=16#0D;/回车(CR )的 ASCII 码,16 进制表示(欧姆龙相机用 MCR 来发送数据)psend := ADR(senddata);/指令地址send(xExecute:=TRUE,h
24、Connection:=connect.hConnection,szSize:=size2,pData:=psend,udiTimeOut:=1000000);IF(send.xDone = TRUE) THEN/发送成功send(xExecute:=FALSE);/函数复位step := 1;END_IFIF(send.xError = TRUE) THEN/发送报错send(xExecute:=FALSE);step := 3;END_IF5:/数据处理程序3: /复位后返回connect(xEnable:=FALSE);server(xEnable:=FALSE);recv(xEnabl
25、e:=FALSE,hConnection:=connect.hConnection,szSize:=size,pData:=precv);step := 99;99:step:=0;END_CASE注意,多数 socket 函数都是上升沿执行,所以在调用后,应在合适的地方将其关闭(给下降沿) ,这样下一周期执行时才会继续生效。否则可能造成函数执行无效,程序死循环卡死在某一步、或者报错处理。4.2 外部点数据处理在步骤 1.1 通过 socket 实现控制器与相机的通信连接及数据收发处理后,本步骤主要完成与 HMI 的命令收发处理以及外部 cpe 点位置计算与返回。完整流程逻辑如下:/获取示教器
26、输入GetHMIBOOL(Enable := TRUE,PortNumber := 0,Data = ReqGet); /获取拍照命令GetHMIBOOL(Enable := TRUE,PortNumber := 1,Data = FinishGet); /获取完成抓取命令GetHMIBOOL(Enable := TRUE,PortNumber := 2,Data = BasePosGet); /获取标准抓取位置命令上海新时达机器人有限公司/(*获取标准抓取位置(当前通过 IO 语句发送命令实现,端口号为 2)*)IF (BasePosGet = TRUE AND (BasePosCount
27、= 0) THENBasePosCount := 1;ReadRefSys(Enable := TRUE,RefSys = RefSys_qz);/注意, ReadRefSys 读出来的当前坐标系的 ABC 为弧度,需要转换为角度RefSys_qz.a := RefSys_qz.a * R2D;RefSys_qz.b := RefSys_qz.b * R2D;RefSys_qz.c := RefSys_qz.c * R2D;ReadTCPData(Enable := TRUE,RefSys := RefSys_qz,CartPos =BasePos); /注意,当前读取用户坐标系下的位置值EN
28、D_IFIF BasePosGet = FALSE THENBasePosCount := 0;END_IF/(*请求相机数据并计算抓取外部点 与通讯部分分开使用,通过标志符确定是否获取数据成功*)rtrig(CLK :=TakePhoPLC);IF rtrig.Q = TRUE THENTakePhoPLC := FALSE;/ baseTCP 为标准抓取位置baseTCP.x := BasePos.x;baseTCP.y := BasePos.y;baseTCP.z := BasePos.z;baseTCP.a := BasePos.a*D2R;baseTCP.b := BasePos.b
29、*D2R;baseTCP.c := BasePos.c*D2R;/ Tpos 为相机输出数据Tpos.x := server.Pos_x;Tpos.y := server.Pos_y;Tpos.z := 0;Tpos.a := 0;Tpos.b := 0;Tpos.c := server.Pos_c*D2R;/ 以下过程为坐标变换,将相机坐标系下的角度 theta 转换到用户坐标系下 FB_Cartpos2Homomatrix_0(SR_RefSys_0 := baseTCP);baseTCP_homomatrix := FB_Cartpos2Homomatrix_0.Ref_Homomatr
30、ix;FB_Cartpos2Homomatrix_1(SR_RefSys_0 := Tpos);basecamera_homomatrix := FB_Cartpos2Homomatrix_1.Ref_Homomatrix;FB_MulHomomatrix_0(homomatrix_1 := basecamera_homomatrix, homomatrix_2 := baseTCP_homomatrix);T0TCP := FB_MulHomomatrix_0.homomatrix_out;康耐视相机操作使用说明书(* change to xyzabc*)FB_Homomatrix2Cart
31、pos_0(Ref_Homomatrix := T0TCP, SR_RefSys_0 = SR_test);FB_Homomatrix2Cartpos_0(Ref_Homomatrix := T0TCP, SR_RefSys_0 = SR_RefSys_0);SR_RefSys_0.a := SR_RefSys_0.a * R2D;SR_RefSys_0.b := SR_RefSys_0.b * R2D;SR_RefSys_0.c := SR_RefSys_0.c * R2D;/绝对坐标输出,端口号 0EXTPos.x:=server.Pos_x; / x 和 y 值用相机输出数据EXTPos
32、.y:=server.Pos_y;EXTPos.z:=BasePos.z; / z、a 、b 用标准抓取位置值EXTPos.a:=BasePos.a;EXTPos.b:=BasePos.b;EXTPos.c:= SR_RefSys_0.c; /theta 用转换过的角度SetCartPos(Enable:=TRUE,PortNumber:=0,RobotCartPos:=EXTPos);/相对坐标输出,端口号 1EXTPos_1.x:=BasePos.x + server.Pos_x;EXTPos_1.y:=BasePos.y + server.Pos_y;EXTPos_1.z:=BasePo
33、s.z;EXTPos_1.a:=BasePos.a;EXTPos_1.b:=BasePos.b;EXTPos_1.c:=SR_RefSys_0.c;EXTPos_1.mode := 0;SetCartPos(Enable:=TRUE,PortNumber:=1,RobotCartPos:=EXTPos_1);/发送允许抓取命令EnableGet := TRUE;END_IFIF FinishGet THENEnableGet := FALSE;END_IF/输出到示教器的数据,告诉示教器可以抓取SetHMIBOOL(Enable := TRUE,PortNumber := 0, Data :=
34、 EnableGet);注意:1) EnableGet 变量要设置为 GVL 全局变量,否则示教器会出现数据收发延迟、造成逻辑错乱的情况。2) 每次在更换了检测模型时,一定要注意保存和运行作业任务,然后将软件进入联机模式,这样相机和机器人收发数据才会成功。3) 在建立用户坐标系时,要使用带原点的三点法示教,原点为校准方格的原点,X 轴和 Y 轴方向均要同校准方格方向相同。4) 机器人程序每次在 LP 语句之间循环,机器人不运动,检查检测部件是否超出上海新时达机器人有限公司相机的视野范围和一些 Bool 语句是否给它下降沿信号了。康耐视相机操作使用说明书五、 细节说明1. 视觉开关的关键点在于
35、socket 通信的稳定性和相机数据的转换。对于前者,必须保证socket 通信程序逻辑无明显漏洞,防止 case 语句存在死循环;2. 通信数据的处理:康耐视发送的是 ASCII 码,需要转换成浮点型位置数据;3. 位置数据的处理:一般采用外部 cpe 点来发送位置数据,cpe 点的数据计算在 codesys 里完成。需要注意的是,cpe 点的 mode 请慎重,一般情况下为 0,但是具体和机器人所处位形有关和控制器和相机 IP 一样,始终以控制器 IP 为主机进行测试;6. 如果要直接连相机,调试相机通信逻辑,可临时将相机改为主机,PC 机与相机 IP 在同一段内,通过调试工具连接相机,发送指令数据进行测试;7. 使用 socket 相关函数需要在工程 library manager 里安装相关库,主要有 CAA NetBaseSrv,SysSocket 和 SysMem;8. 关于绝对坐标与相对坐标两种支持方式,各有优缺点。绝对坐标需要使用三点法示教用户坐标系,靠相机获得的 X 和 Y 位置存在一定的误差。而相对坐标给出的全部是相对当前位置的增量,误差会减小。