最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Cognex康耐视相机操作使用说明书

IT圈 admin 33浏览 0评论

2024年2月9日发(作者:宫新林)

实用文档

康耐视相机操作使用说明书

文档密级

文件状态:

■草稿

□修改

□定稿

项目名称

版本号

描述

编写人

审核人

□不保密■内部□机密

1.0

康耐视相机操作使用说明书

余国鹰

编写日期

审核日期

2015/9/10

实用文档

目录

一、

康耐视相机具体设置 ...........................................................3

1.1

软件安装 ................................................... 错误!未定义书签。

1.2

流程编辑 .................................................................... 3

1.3

CODESYS通信注意事项 .......................................................... 6

二、

相机标定 ....................................................................7

2.1

相机校准 .................................................................... 7

2.2

绝对坐标实现 ................................................................ 9

2.3

相对坐标实现 ............................................................... 10

三、

示教器示例程序 .............................................................. 11

3.1

绝对坐标实现范例 ........................................................... 11

3.2

相对坐标实现范例 ........................................................... 11

四、

CODESYS逻辑开发 ............................................................ 13

4.1

SOCKET通信开发 .............................................................. 13

4.2

外部点数据处理 ............................................................. 14

五、

细节说明 ................................................................... 18

实用文档

一、 康耐视相机具体设置

1.1 软件安装

双击康耐视相机软件Cognex_In-Sight_Software_4.8.1,按照步骤一步步安装即可。

1.2 流程编辑

1. 设置电脑本地连接IPV4地址为192.168.39.12(设置为39段即可)。

2. 双击康耐视In-Sight浏览器软件进入相机设置界面,软件会自动搜索连接的相机设备,如下图1.1所示。

图1.1

3. 双击相机设备(红色椭圆内设备图标),进入相机编辑界面,如下图1.2所示。

图1.2

实用文档

4. 在应用程序步骤中,开始、设置工具、配置结果、完成这4个步骤形成一个完整的相机操作流程;

 开始 单击“开始”中“已连接”,如下图1.3所示,可以进行连接设备、断开设备、刷新、添加等操作。

图1.3

单击“开始”中的“设置图像”,如下图1.4所示。

在“采集/加载图像”对话框中,“触发器”按钮是进行拍照,“实况视频”按钮是实时显示相机中的图像,“从PC加载图像”按钮是加载一张存在的图像。

图1.4

在“编辑采集设置”对话框中,设置一系列相机参数,根据具体需要进行调节

 设置工具 单击“设置工具”中“定位部件”按钮,对检测模型进行定位,作为识别的模型进行对比;单击“设置工具”中“检测部件”按钮,对模型进行编辑操作。

在“定位部件”的设置对话框中,如下图1.5所示,合格阀值:每次拍照之后的得分如果大于阀值,则拍照成功,否则失败;旋转公差:检测部件能够旋转的角度范围,如果在范围之类则会拍照成功,否则会失败

实用文档

图1.5

 配置结果 单击“配置结果”中“通信”按钮,进行通讯设置操作,如下图1.6所示。新时达机器人视觉通信采用的TCP/IP通讯方式,单击“TCP/IP”,如下图1.7所示,在“TCP/IP设置”对话框中,“服务器主机名”设为192.168.39.220(机器人控制器IP地址),“端口”设置与CodeSys中相同,本例中设为9876,“超时时间”设为15000,“结束符”设为字符串(CR13)。

单击“格式化输出字符串”,进行输出操作,如下图1.8所示。勾选“使用分隔符”,表示在输出之间用逗号分隔符进行隔开,方便进行数据处理操作;单击“添加”按钮,可以输出很多数据,这里只需要输出4个数据,“失败”、“定位器.X”、“定位器.Y”、“定位器.角度”;

输出数据说明:均为7个字节宽度,除图案.失败是整形外,其它数据均为浮点型,小数点位数为2位。

1) 第一位图案.失败:判定符,为0表示采集到特征,拍照成功;为1则拍照失败。

2) 第二位图案.定位器.X:输出用户坐标系下的X方向绝对值。

3) 第三位图案.定位器.Y:输出用户坐标系下的Y方向绝对值。

4) 第四位图案.定位器.角度:输出用户坐标系下的相对角度。

图1.6

实用文档

图1.7

图1.8

 完成 在“完成”中单击“保存作业”,则保存当前作业任务中的所有设置;在“完

成”中单击“运行作业”,则运行当前作业任务。

注意,以上参数设定必须在脱机模式下才能够设置,在联机状态下参数不能设置,与外界设备实时通讯必须在联机模式下;物体旋转一定角度拍照失败,看检测部件是否超过相机视野范围和旋转角度值设置是否合理。

1.3 Codesys通信注意事项

a) 说明:设定PC端的IP地址,IP地址必须,这里设定为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) 在下载工程成功时,查看通讯是否连接正常。当client_congnex任务中的step_cognex:=2和server_cognex中的step_server:=2时,此时通讯成功,否则通讯不正常,需要查看设备是否连接好和In-Sight软件是否处于联机状态。

f) 详细指令及其他形式的通信可参考文档《通信设定sdnb-cn5-714d_fh_fz5》。

实用文档

二、 相机标定

要实现将相机采集的数据转换为机器人坐标系下的位姿数据,必须建立相机坐标系与机器人坐标系的对应转换关系,该过程通过相机标定来实现。

相机也分平面相机和三维相机,前者只支持平面数据采集,后者则可以获取xyz空间值。以三维相机为例,要详细建立相机三维空间的位置与机器人坐标系的对应关系,必须通过严格的手眼标定来实现。不同相机有手眼标定算法,通过示教多个点来建立手眼转换关系。这里不详述。

如果只做平面工件抓取,那只需要工件变化的坐标值x、y以及绕z轴的转动角度c,问题就简单的多,只需要进行平面的简单标定即可实现。以康耐视相机为例,格力等客户只需要实现流水线来料的抓取操作,标定平面坐标系即可,康耐视相机可以提供移动后的工件相对于移动前的偏移位置量,或者提供工件的绝对移动位置。这里,我们提供这两种工作方式的实现过程。

2.1 相机校准

相机默认输出的坐标值是相机采集到的像素值,并非实际工件位置尺寸,因此需要将物理坐标与像素值进行映射标定。设定校准后,可使测量结果像素值转换为实际尺寸并输出,康耐视提供了校准参数的制作过程。

1.单击“设置图像“,界面右下角出现下图2.1所示界面。校准类型中有很多种,根据实际需要选择,这里选择“网格”,然后单击“校准”按钮,出现下图2.2所示界面。

图2.1

2.打印校准网格纸张。在图2.2中,单击“打印网格”按钮,然后将打印的网格纸张放在相机视野正中间。

3.在“设置”界面中,“网格类型”为方格图案(带基准),其它值均为默认。

4.单击“姿势”,进入姿势设置界面,如图2.3所示,原点位置为默认,单击“触发器”按钮, 相机会自动拍照,最后单击“校准”,校准工作就结束。

5.单击“结果”,可以查看校准情况,如图2.4所示。

实用文档

图2.2

图2.3

实用文档

图2.4

6.建立检测模型。单击“定位部件”,出现如图2.5所示界面,单击“位置工具”中“图案”,然后单击“添加”,单击“OK”,接着单击界面右下角“模型”,拖动绿色模型矩形框,使被检测模型处于绿色矩形框中,最后单击界面右下角“训练”,此时检测模型已经建立。

图2.5

7.查看模型建立是否成功。在界面右侧选择板中,可以查看建立图案的情况,绿色圆点表示模型建立成功,同时会输出检测模型的位置、角度、得分,如图2.6所示。

图2.6

通过以上7步即可完成相机的校准过程。

2.2 绝对坐标实现

绝对坐标的实现必须借助机器人的用户坐标系,即机器人在用户坐标系下走绝对位置运动。具体实现由以下几个步骤组成。

首先,用step机器人三点法示教出一个固定用户坐标系。用户坐标系的原点根据实际情况而定,一般选择流水线上一个固定位置参考点,该参考点要方便相机进行坐标转化标定。关于用户坐标系的标定,可参见新时达机器人操作使用说明书;

其次,进行相机坐标与实际位置坐标的标定转换。在完成第一步中的固定用户坐标系标定后,在该坐标系下选取工件上的三点,计算出这三点在用户坐标系的X、Y值(该步骤可通过机器人协助示教获得在用户坐标系下的位姿值)。在图像输入的“校准”模块中,按照2.1中的步骤完成相机坐标与实际位置坐标的校准参数制作转换;

最后,机器人实现绝对位置运动。在完成第二步后,工件每偏移一点,相机均可计算出其在用户坐标系下新的位置值X、Y和绕Z轴的theta角度值。这样,只需要在示教器程序中设

实用文档

置抓取运动点参考的坐标系为用户坐标系即可,即RefSys语句下走绝对cpe点。该cpe点是codesys里直接读取的相机返回值。

2.3 相对坐标实现

相对坐标的实现就比较简单,只需要将相机坐标转换为实际位置坐标即可。在工件上选取三个特征点,用带尖机器人示教出这三点在机器人基坐标系下的坐标值(主要是X和Y)。按照2.1中的校准流程制作出校准参数。这样,工件偏移后,相机可以直接计算出其新的坐标X、Y和theta。

需要注意的是,使用相对坐标运动时,相机输出数据必须是相对量,即测量坐标与基准坐标之差,而不是绝对测量坐标。具体信息见后续章节。

实用文档

三、 示教器示例程序

3.1 绝对坐标实现范例

Tool(tool0);//若带工具,则先加载好

PTP(ap0);

//走到一个安全位置点

Lin(cp3);//走到标准抓取位置(工件处于标准位置时机器人的抓取位姿,提前示教好)

RefSys(ref1);//切到用户坐标系下

WaitTime(uint3);

BOOLEXTSet(boolbasepos,TRUE);//端口号为2,发送信号到codesys,读取当前位置作为标准抓取位置

WaitTime(uint4);

BOOLEXTSet(boolbasepos,FALSE);//关闭该端口

/////以上为获得标准抓取位置需要的步骤

RefSys(WORLD);

PTP(ap0);

LP:int0;

BOOLEXTSet(boolphoto,TRUE);

//发送相机拍照命令,端口号0

WaitTime(uint0);

//等待PLC处理时间,建议在300ms以上

bool0:=BOOLEXTRead(boolenableget);

//读取抓取标志位,为TRUE则能抓取

BOOLEXTSet(boolphoto,FALSE);

//关闭该端口,保证下次为高电平触发

IF(bool0=0)THEN

//为true则可抓取,否则重新发送拍照命令

WaitTime(uint1);

GOTO(int0);

END_IF

RefSys(ref1);

//切到用户坐标系下

Lin(rcpe0);

//走到codesys里输出的绝对位置(外部点形式,端口号0)BOOLEXTSet(boolfinishget,TRUE);

//发送抓取完成标志

WaitTime(uint2);

BOOLEXTSet(boolfinishget,FALSE);

//关闭抓取完成标志

PTP(ap1);

GOTO(int1);

//回到循环开始,等待下一个工件

3.2 相对坐标实现范例

Tool(tool0);//若带工具,则先加载好

PTP(ap0); //走到一个安全位置点

Lin(cp3);//走到标准抓取位置(工件处于标准位置时机器人的抓取位姿,提前示教好)

WaitTime(uint3);

BOOLEXTSet(boolbasepos,TRUE);//端口号为2,读取当前位置作为标准抓取位置

WaitTime(uint4);

实用文档

BOOLEXTSet(boolbasepos,FALSE);//关闭该端口

/////以上为获得标准抓取位置需要的步骤

PTP(ap0);//回到安全点

LP:int0;

BOOLEXTSet(boolphoto,TRUE);

//发送相机拍照命令,端口号0

WaitTime(uint0);

//等待PLC处理时间,建议在300ms以上

bool0:=BOOLEXTRead(boolenableget);

//读取抓取标志位,为TRUE则能抓取

BOOLEXTSet(boolphoto,FALSE);

//关闭该端口,保证下次为高电平触发

IF(bool0=0)THEN

//为true则可抓取,否则重新发送拍照命令

WaitTime(uint1);

GOTO(int0);

END_IF

Lin(rcpe1);

//走到codesys里输出的绝对位置(外部点形式,该位置是机器人当前位置加上相对偏移,端口号1)

BOOLEXTSet(boolfinishget,TRUE);

//发送抓取完成标志

WaitTime(uint2);

BOOLEXTSet(boolfinishget,FALSE);

//关闭抓取完成标志

PTP(ap1);

GOTO(int1);

//回到循环开始,等待下一个工件

实用文档

四、 Codesys逻辑开发

4.1 Socket通信开发

首先,要在codesys上完成socket通讯开发。通讯开发的要点包括协议类型、协议数据、数据收发、逻辑判断等。

一般的相机都是支持TCP/IP协议的,我们也多是采用该协议完成step控制器与各类相机的通讯连接及数据交互的。一般来说,机器人控制器作为主机server(服务器),相机处理器作为从机client(客户端)。控制器作为主机的好处在于,控制器“知道”自己什么时候需要拍照、需要数据,此时给相机发送命令即可。相机作为客户端始终处于监听状态。主机控制器的IP地址为192.168.39.220,端口号任意,如取为9876,用网线与相机控制器相连,在完成相机与控制器的通信数据格式设定后,接下来就是codesys端编程实现。

通信示例说明:

CASE step OF

0:

:= '192.168.39.120';//服务器地址

server(xEnable:=TRUE,ipAddr:=SAddr,uiPort:=9876);//建立服务器

IF( = TRUE) THEN

connect(xEnable:=,hServer:=r);//连接

IF(e = TRUE) THEN//连接成功

step := 1;//执行接收数据

END_IF

IF( = TRUE)THEN//连接报错

step := 3;//复位

END_IF

END_IF

IF( = TRUE)THEN

step := 3;

END_IF

是串行数据输出中设定的首位

///////////////////////例如设定的整数位为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:=ction,szSize:=size1,pData:=precv);//接收数据

IF(t>7) THEN//判断是否收到数据输出,这里的数字应小于数据总长度

END_IF

step:=5;//数据处理

///////////////////////从相机传过来的数据以ASCII码的形式存储到recvokcr数组,数组的第一位存储的

实用文档

IF THEN//接收数据报错

step:=3;

END_IF

///////////////////////以ASCII码的形式从senddata数组传给相机,给相机发送“M回车(CR)”命令可以采集一张图片

2:

size2 := SIZEOF(senddata);//数组长度

senddata[0]:=16#4D;//M的ASCII码,16进制表示,是单次测量的指令。

senddata[1]:=16#0D;//回车(CR)的ASCII码,16进制表示(欧姆龙相机用MCR来发送数据)

psend := ADR(senddata);//指令地址

send(xExecute:=TRUE,hConnection:=ction,szSize:=size2,pData:=psend,udiTimeOut:=1000000);

IF( = TRUE) THEN//发送成功

send(xExecute:=FALSE);//函数复位

step := 1;

END_IF

IF( = TRUE) THEN//发送报错

5:

//数据处理程序………………………..

3: //复位后返回

connect(xEnable:=FALSE);

server(xEnable:=FALSE);

recv(xEnable:=FALSE,hConnection:=ction,szSize:=size,pData:=precv);

step := 99;

99:

step:=0;

END_CASE

send(xExecute:=FALSE);

step := 3;

END_IF

注意,多数socket函数都是上升沿执行,所以在调用后,应在合适的地方将其关闭(给下降沿),这样下一周期执行时才会继续生效。否则可能造成函数执行无效,程序死循环卡死在某一步、或者报错处理。

4.2 外部点数据处理

在步骤1.1通过socket实现控制器与相机的通信连接及数据收发处理后,本步骤主要完成与HMI的命令收发处理以及外部cpe点位置计算与返回。

完整流程逻辑如下:

//获取示教器输入

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 = 0)) THEN

BasePosCount := 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); //注意,当前读取用户坐标系下的位置值

END_IF

IF BasePosGet = FALSE THEN

BasePosCount := 0;

END_IF

//(**请求相机数据并计算抓取外部点{与通讯部分分开使用,通过标志符确定是否获取数据成功}***)

rtrig(CLK :=TakePhoPLC);

IF rtrig.Q = TRUE THEN

TakePhoPLC := FALSE;

// baseTCP为标准抓取位置

baseTCP.x := BasePos.x;

baseTCP.y := BasePos.y;

baseTCP.z := BasePos.z;

baseTCP.a := BasePos.a*D2R;

baseTCP.b := BasePos.b*D2R;

baseTCP.c := BasePos.c*D2R;

// Tpos为相机输出数据

Tpos.x := _x;

Tpos.y := _y;

Tpos.z := 0;

Tpos.a := 0;

Tpos.b := 0;

Tpos.c := _c*D2R;

// 以下过程为坐标变换,将相机坐标系下的角度theta转换到用户坐标系下

FB_Cartpos2Homomatrix_0(SR_RefSys_0 := baseTCP);

baseTCP_homomatrix := FB_Cartpos2Homomatrix__Homomatrix;

FB_Cartpos2Homomatrix_1(SR_RefSys_0 := Tpos);

basecamera_homomatrix := FB_Cartpos2Homomatrix__Homomatrix;

FB_MulHomomatrix_0(homomatrix_1

baseTCP_homomatrix);

:= basecamera_homomatrix, homomatrix_2 :=

实用文档

T0TCP := FB_MulHomomatrix_trix_out;

(* change to xyzabc*)

FB_Homomatrix2Cartpos_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;

//绝对坐标输出,端口号0

EXTPos.x:=_x; // x和y值用相机输出数据

EXTPos.y:=_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);

//相对坐标输出,端口号1

EXTPos_1.x:=BasePos.x + _x;

EXTPos_1.y:=BasePos.y + _y;

EXTPos_1.z:=BasePos.z;

EXTPos_1.a:=BasePos.a;

EXTPos_1.b:=BasePos.b;

EXTPos_1.c:=SR_RefSys_0.c;

EXTPos_ := 0;

SetCartPos(Enable:=TRUE,PortNumber:=1,RobotCartPos:=EXTPos_1);

//发送允许抓取命令

EnableGet := TRUE;

END_IF

IF FinishGet THEN

EnableGet := FALSE;

END_IF

//输出到示教器的数据,告诉示教器可以抓取

SetHMIBOOL(Enable := TRUE,PortNumber := 0, Data := EnableGet);

注意:

1) EnableGet变量要设置为GVL全局变量,否则示教器会出现数据收发延迟、造成逻辑错乱的情况。

2) 每次在更换了检测模型时,一定要注意保存和运行作业任务,然后将软件进入联机模式,这样相机和机器人收发数据才会成功。

3) 在建立用户坐标系时,要使用带原点的三点法示教,原点为校准方格的原点,X

实用文档

4)

轴和Y轴方向均要同校准方格方向相同。

机器人程序每次在LP语句之间循环,机器人不运动,检查检测部件是否超出相机的视野范围和一些Bool语句是否给它下降沿信号了。

实用文档

五、 细节说明

1. 视觉开关的关键点在于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位置存在一定的误差。而相对坐标给出的全部是相对当前位置的增量,误差会减小。

2024年2月9日发(作者:宫新林)

实用文档

康耐视相机操作使用说明书

文档密级

文件状态:

■草稿

□修改

□定稿

项目名称

版本号

描述

编写人

审核人

□不保密■内部□机密

1.0

康耐视相机操作使用说明书

余国鹰

编写日期

审核日期

2015/9/10

实用文档

目录

一、

康耐视相机具体设置 ...........................................................3

1.1

软件安装 ................................................... 错误!未定义书签。

1.2

流程编辑 .................................................................... 3

1.3

CODESYS通信注意事项 .......................................................... 6

二、

相机标定 ....................................................................7

2.1

相机校准 .................................................................... 7

2.2

绝对坐标实现 ................................................................ 9

2.3

相对坐标实现 ............................................................... 10

三、

示教器示例程序 .............................................................. 11

3.1

绝对坐标实现范例 ........................................................... 11

3.2

相对坐标实现范例 ........................................................... 11

四、

CODESYS逻辑开发 ............................................................ 13

4.1

SOCKET通信开发 .............................................................. 13

4.2

外部点数据处理 ............................................................. 14

五、

细节说明 ................................................................... 18

实用文档

一、 康耐视相机具体设置

1.1 软件安装

双击康耐视相机软件Cognex_In-Sight_Software_4.8.1,按照步骤一步步安装即可。

1.2 流程编辑

1. 设置电脑本地连接IPV4地址为192.168.39.12(设置为39段即可)。

2. 双击康耐视In-Sight浏览器软件进入相机设置界面,软件会自动搜索连接的相机设备,如下图1.1所示。

图1.1

3. 双击相机设备(红色椭圆内设备图标),进入相机编辑界面,如下图1.2所示。

图1.2

实用文档

4. 在应用程序步骤中,开始、设置工具、配置结果、完成这4个步骤形成一个完整的相机操作流程;

 开始 单击“开始”中“已连接”,如下图1.3所示,可以进行连接设备、断开设备、刷新、添加等操作。

图1.3

单击“开始”中的“设置图像”,如下图1.4所示。

在“采集/加载图像”对话框中,“触发器”按钮是进行拍照,“实况视频”按钮是实时显示相机中的图像,“从PC加载图像”按钮是加载一张存在的图像。

图1.4

在“编辑采集设置”对话框中,设置一系列相机参数,根据具体需要进行调节

 设置工具 单击“设置工具”中“定位部件”按钮,对检测模型进行定位,作为识别的模型进行对比;单击“设置工具”中“检测部件”按钮,对模型进行编辑操作。

在“定位部件”的设置对话框中,如下图1.5所示,合格阀值:每次拍照之后的得分如果大于阀值,则拍照成功,否则失败;旋转公差:检测部件能够旋转的角度范围,如果在范围之类则会拍照成功,否则会失败

实用文档

图1.5

 配置结果 单击“配置结果”中“通信”按钮,进行通讯设置操作,如下图1.6所示。新时达机器人视觉通信采用的TCP/IP通讯方式,单击“TCP/IP”,如下图1.7所示,在“TCP/IP设置”对话框中,“服务器主机名”设为192.168.39.220(机器人控制器IP地址),“端口”设置与CodeSys中相同,本例中设为9876,“超时时间”设为15000,“结束符”设为字符串(CR13)。

单击“格式化输出字符串”,进行输出操作,如下图1.8所示。勾选“使用分隔符”,表示在输出之间用逗号分隔符进行隔开,方便进行数据处理操作;单击“添加”按钮,可以输出很多数据,这里只需要输出4个数据,“失败”、“定位器.X”、“定位器.Y”、“定位器.角度”;

输出数据说明:均为7个字节宽度,除图案.失败是整形外,其它数据均为浮点型,小数点位数为2位。

1) 第一位图案.失败:判定符,为0表示采集到特征,拍照成功;为1则拍照失败。

2) 第二位图案.定位器.X:输出用户坐标系下的X方向绝对值。

3) 第三位图案.定位器.Y:输出用户坐标系下的Y方向绝对值。

4) 第四位图案.定位器.角度:输出用户坐标系下的相对角度。

图1.6

实用文档

图1.7

图1.8

 完成 在“完成”中单击“保存作业”,则保存当前作业任务中的所有设置;在“完

成”中单击“运行作业”,则运行当前作业任务。

注意,以上参数设定必须在脱机模式下才能够设置,在联机状态下参数不能设置,与外界设备实时通讯必须在联机模式下;物体旋转一定角度拍照失败,看检测部件是否超过相机视野范围和旋转角度值设置是否合理。

1.3 Codesys通信注意事项

a) 说明:设定PC端的IP地址,IP地址必须,这里设定为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) 在下载工程成功时,查看通讯是否连接正常。当client_congnex任务中的step_cognex:=2和server_cognex中的step_server:=2时,此时通讯成功,否则通讯不正常,需要查看设备是否连接好和In-Sight软件是否处于联机状态。

f) 详细指令及其他形式的通信可参考文档《通信设定sdnb-cn5-714d_fh_fz5》。

实用文档

二、 相机标定

要实现将相机采集的数据转换为机器人坐标系下的位姿数据,必须建立相机坐标系与机器人坐标系的对应转换关系,该过程通过相机标定来实现。

相机也分平面相机和三维相机,前者只支持平面数据采集,后者则可以获取xyz空间值。以三维相机为例,要详细建立相机三维空间的位置与机器人坐标系的对应关系,必须通过严格的手眼标定来实现。不同相机有手眼标定算法,通过示教多个点来建立手眼转换关系。这里不详述。

如果只做平面工件抓取,那只需要工件变化的坐标值x、y以及绕z轴的转动角度c,问题就简单的多,只需要进行平面的简单标定即可实现。以康耐视相机为例,格力等客户只需要实现流水线来料的抓取操作,标定平面坐标系即可,康耐视相机可以提供移动后的工件相对于移动前的偏移位置量,或者提供工件的绝对移动位置。这里,我们提供这两种工作方式的实现过程。

2.1 相机校准

相机默认输出的坐标值是相机采集到的像素值,并非实际工件位置尺寸,因此需要将物理坐标与像素值进行映射标定。设定校准后,可使测量结果像素值转换为实际尺寸并输出,康耐视提供了校准参数的制作过程。

1.单击“设置图像“,界面右下角出现下图2.1所示界面。校准类型中有很多种,根据实际需要选择,这里选择“网格”,然后单击“校准”按钮,出现下图2.2所示界面。

图2.1

2.打印校准网格纸张。在图2.2中,单击“打印网格”按钮,然后将打印的网格纸张放在相机视野正中间。

3.在“设置”界面中,“网格类型”为方格图案(带基准),其它值均为默认。

4.单击“姿势”,进入姿势设置界面,如图2.3所示,原点位置为默认,单击“触发器”按钮, 相机会自动拍照,最后单击“校准”,校准工作就结束。

5.单击“结果”,可以查看校准情况,如图2.4所示。

实用文档

图2.2

图2.3

实用文档

图2.4

6.建立检测模型。单击“定位部件”,出现如图2.5所示界面,单击“位置工具”中“图案”,然后单击“添加”,单击“OK”,接着单击界面右下角“模型”,拖动绿色模型矩形框,使被检测模型处于绿色矩形框中,最后单击界面右下角“训练”,此时检测模型已经建立。

图2.5

7.查看模型建立是否成功。在界面右侧选择板中,可以查看建立图案的情况,绿色圆点表示模型建立成功,同时会输出检测模型的位置、角度、得分,如图2.6所示。

图2.6

通过以上7步即可完成相机的校准过程。

2.2 绝对坐标实现

绝对坐标的实现必须借助机器人的用户坐标系,即机器人在用户坐标系下走绝对位置运动。具体实现由以下几个步骤组成。

首先,用step机器人三点法示教出一个固定用户坐标系。用户坐标系的原点根据实际情况而定,一般选择流水线上一个固定位置参考点,该参考点要方便相机进行坐标转化标定。关于用户坐标系的标定,可参见新时达机器人操作使用说明书;

其次,进行相机坐标与实际位置坐标的标定转换。在完成第一步中的固定用户坐标系标定后,在该坐标系下选取工件上的三点,计算出这三点在用户坐标系的X、Y值(该步骤可通过机器人协助示教获得在用户坐标系下的位姿值)。在图像输入的“校准”模块中,按照2.1中的步骤完成相机坐标与实际位置坐标的校准参数制作转换;

最后,机器人实现绝对位置运动。在完成第二步后,工件每偏移一点,相机均可计算出其在用户坐标系下新的位置值X、Y和绕Z轴的theta角度值。这样,只需要在示教器程序中设

实用文档

置抓取运动点参考的坐标系为用户坐标系即可,即RefSys语句下走绝对cpe点。该cpe点是codesys里直接读取的相机返回值。

2.3 相对坐标实现

相对坐标的实现就比较简单,只需要将相机坐标转换为实际位置坐标即可。在工件上选取三个特征点,用带尖机器人示教出这三点在机器人基坐标系下的坐标值(主要是X和Y)。按照2.1中的校准流程制作出校准参数。这样,工件偏移后,相机可以直接计算出其新的坐标X、Y和theta。

需要注意的是,使用相对坐标运动时,相机输出数据必须是相对量,即测量坐标与基准坐标之差,而不是绝对测量坐标。具体信息见后续章节。

实用文档

三、 示教器示例程序

3.1 绝对坐标实现范例

Tool(tool0);//若带工具,则先加载好

PTP(ap0);

//走到一个安全位置点

Lin(cp3);//走到标准抓取位置(工件处于标准位置时机器人的抓取位姿,提前示教好)

RefSys(ref1);//切到用户坐标系下

WaitTime(uint3);

BOOLEXTSet(boolbasepos,TRUE);//端口号为2,发送信号到codesys,读取当前位置作为标准抓取位置

WaitTime(uint4);

BOOLEXTSet(boolbasepos,FALSE);//关闭该端口

/////以上为获得标准抓取位置需要的步骤

RefSys(WORLD);

PTP(ap0);

LP:int0;

BOOLEXTSet(boolphoto,TRUE);

//发送相机拍照命令,端口号0

WaitTime(uint0);

//等待PLC处理时间,建议在300ms以上

bool0:=BOOLEXTRead(boolenableget);

//读取抓取标志位,为TRUE则能抓取

BOOLEXTSet(boolphoto,FALSE);

//关闭该端口,保证下次为高电平触发

IF(bool0=0)THEN

//为true则可抓取,否则重新发送拍照命令

WaitTime(uint1);

GOTO(int0);

END_IF

RefSys(ref1);

//切到用户坐标系下

Lin(rcpe0);

//走到codesys里输出的绝对位置(外部点形式,端口号0)BOOLEXTSet(boolfinishget,TRUE);

//发送抓取完成标志

WaitTime(uint2);

BOOLEXTSet(boolfinishget,FALSE);

//关闭抓取完成标志

PTP(ap1);

GOTO(int1);

//回到循环开始,等待下一个工件

3.2 相对坐标实现范例

Tool(tool0);//若带工具,则先加载好

PTP(ap0); //走到一个安全位置点

Lin(cp3);//走到标准抓取位置(工件处于标准位置时机器人的抓取位姿,提前示教好)

WaitTime(uint3);

BOOLEXTSet(boolbasepos,TRUE);//端口号为2,读取当前位置作为标准抓取位置

WaitTime(uint4);

实用文档

BOOLEXTSet(boolbasepos,FALSE);//关闭该端口

/////以上为获得标准抓取位置需要的步骤

PTP(ap0);//回到安全点

LP:int0;

BOOLEXTSet(boolphoto,TRUE);

//发送相机拍照命令,端口号0

WaitTime(uint0);

//等待PLC处理时间,建议在300ms以上

bool0:=BOOLEXTRead(boolenableget);

//读取抓取标志位,为TRUE则能抓取

BOOLEXTSet(boolphoto,FALSE);

//关闭该端口,保证下次为高电平触发

IF(bool0=0)THEN

//为true则可抓取,否则重新发送拍照命令

WaitTime(uint1);

GOTO(int0);

END_IF

Lin(rcpe1);

//走到codesys里输出的绝对位置(外部点形式,该位置是机器人当前位置加上相对偏移,端口号1)

BOOLEXTSet(boolfinishget,TRUE);

//发送抓取完成标志

WaitTime(uint2);

BOOLEXTSet(boolfinishget,FALSE);

//关闭抓取完成标志

PTP(ap1);

GOTO(int1);

//回到循环开始,等待下一个工件

实用文档

四、 Codesys逻辑开发

4.1 Socket通信开发

首先,要在codesys上完成socket通讯开发。通讯开发的要点包括协议类型、协议数据、数据收发、逻辑判断等。

一般的相机都是支持TCP/IP协议的,我们也多是采用该协议完成step控制器与各类相机的通讯连接及数据交互的。一般来说,机器人控制器作为主机server(服务器),相机处理器作为从机client(客户端)。控制器作为主机的好处在于,控制器“知道”自己什么时候需要拍照、需要数据,此时给相机发送命令即可。相机作为客户端始终处于监听状态。主机控制器的IP地址为192.168.39.220,端口号任意,如取为9876,用网线与相机控制器相连,在完成相机与控制器的通信数据格式设定后,接下来就是codesys端编程实现。

通信示例说明:

CASE step OF

0:

:= '192.168.39.120';//服务器地址

server(xEnable:=TRUE,ipAddr:=SAddr,uiPort:=9876);//建立服务器

IF( = TRUE) THEN

connect(xEnable:=,hServer:=r);//连接

IF(e = TRUE) THEN//连接成功

step := 1;//执行接收数据

END_IF

IF( = TRUE)THEN//连接报错

step := 3;//复位

END_IF

END_IF

IF( = TRUE)THEN

step := 3;

END_IF

是串行数据输出中设定的首位

///////////////////////例如设定的整数位为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:=ction,szSize:=size1,pData:=precv);//接收数据

IF(t>7) THEN//判断是否收到数据输出,这里的数字应小于数据总长度

END_IF

step:=5;//数据处理

///////////////////////从相机传过来的数据以ASCII码的形式存储到recvokcr数组,数组的第一位存储的

实用文档

IF THEN//接收数据报错

step:=3;

END_IF

///////////////////////以ASCII码的形式从senddata数组传给相机,给相机发送“M回车(CR)”命令可以采集一张图片

2:

size2 := SIZEOF(senddata);//数组长度

senddata[0]:=16#4D;//M的ASCII码,16进制表示,是单次测量的指令。

senddata[1]:=16#0D;//回车(CR)的ASCII码,16进制表示(欧姆龙相机用MCR来发送数据)

psend := ADR(senddata);//指令地址

send(xExecute:=TRUE,hConnection:=ction,szSize:=size2,pData:=psend,udiTimeOut:=1000000);

IF( = TRUE) THEN//发送成功

send(xExecute:=FALSE);//函数复位

step := 1;

END_IF

IF( = TRUE) THEN//发送报错

5:

//数据处理程序………………………..

3: //复位后返回

connect(xEnable:=FALSE);

server(xEnable:=FALSE);

recv(xEnable:=FALSE,hConnection:=ction,szSize:=size,pData:=precv);

step := 99;

99:

step:=0;

END_CASE

send(xExecute:=FALSE);

step := 3;

END_IF

注意,多数socket函数都是上升沿执行,所以在调用后,应在合适的地方将其关闭(给下降沿),这样下一周期执行时才会继续生效。否则可能造成函数执行无效,程序死循环卡死在某一步、或者报错处理。

4.2 外部点数据处理

在步骤1.1通过socket实现控制器与相机的通信连接及数据收发处理后,本步骤主要完成与HMI的命令收发处理以及外部cpe点位置计算与返回。

完整流程逻辑如下:

//获取示教器输入

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 = 0)) THEN

BasePosCount := 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); //注意,当前读取用户坐标系下的位置值

END_IF

IF BasePosGet = FALSE THEN

BasePosCount := 0;

END_IF

//(**请求相机数据并计算抓取外部点{与通讯部分分开使用,通过标志符确定是否获取数据成功}***)

rtrig(CLK :=TakePhoPLC);

IF rtrig.Q = TRUE THEN

TakePhoPLC := FALSE;

// baseTCP为标准抓取位置

baseTCP.x := BasePos.x;

baseTCP.y := BasePos.y;

baseTCP.z := BasePos.z;

baseTCP.a := BasePos.a*D2R;

baseTCP.b := BasePos.b*D2R;

baseTCP.c := BasePos.c*D2R;

// Tpos为相机输出数据

Tpos.x := _x;

Tpos.y := _y;

Tpos.z := 0;

Tpos.a := 0;

Tpos.b := 0;

Tpos.c := _c*D2R;

// 以下过程为坐标变换,将相机坐标系下的角度theta转换到用户坐标系下

FB_Cartpos2Homomatrix_0(SR_RefSys_0 := baseTCP);

baseTCP_homomatrix := FB_Cartpos2Homomatrix__Homomatrix;

FB_Cartpos2Homomatrix_1(SR_RefSys_0 := Tpos);

basecamera_homomatrix := FB_Cartpos2Homomatrix__Homomatrix;

FB_MulHomomatrix_0(homomatrix_1

baseTCP_homomatrix);

:= basecamera_homomatrix, homomatrix_2 :=

实用文档

T0TCP := FB_MulHomomatrix_trix_out;

(* change to xyzabc*)

FB_Homomatrix2Cartpos_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;

//绝对坐标输出,端口号0

EXTPos.x:=_x; // x和y值用相机输出数据

EXTPos.y:=_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);

//相对坐标输出,端口号1

EXTPos_1.x:=BasePos.x + _x;

EXTPos_1.y:=BasePos.y + _y;

EXTPos_1.z:=BasePos.z;

EXTPos_1.a:=BasePos.a;

EXTPos_1.b:=BasePos.b;

EXTPos_1.c:=SR_RefSys_0.c;

EXTPos_ := 0;

SetCartPos(Enable:=TRUE,PortNumber:=1,RobotCartPos:=EXTPos_1);

//发送允许抓取命令

EnableGet := TRUE;

END_IF

IF FinishGet THEN

EnableGet := FALSE;

END_IF

//输出到示教器的数据,告诉示教器可以抓取

SetHMIBOOL(Enable := TRUE,PortNumber := 0, Data := EnableGet);

注意:

1) EnableGet变量要设置为GVL全局变量,否则示教器会出现数据收发延迟、造成逻辑错乱的情况。

2) 每次在更换了检测模型时,一定要注意保存和运行作业任务,然后将软件进入联机模式,这样相机和机器人收发数据才会成功。

3) 在建立用户坐标系时,要使用带原点的三点法示教,原点为校准方格的原点,X

实用文档

4)

轴和Y轴方向均要同校准方格方向相同。

机器人程序每次在LP语句之间循环,机器人不运动,检查检测部件是否超出相机的视野范围和一些Bool语句是否给它下降沿信号了。

实用文档

五、 细节说明

1. 视觉开关的关键点在于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位置存在一定的误差。而相对坐标给出的全部是相对当前位置的增量,误差会减小。

发布评论

评论列表 (0)

  1. 暂无评论