i5Vision安装调试手册-2
6 定位过程
前5章在界面中调整参数进行定位测试是为了方便定位参数的选择和测试,最终运行并与G代码交互的视觉定位逻辑是在[定位过程]页面编写定位脚本程序。
6.6.1 脚本函数
i5Vision定位脚本使用Lua脚本语言编写,视觉定位的功能函数会注册在Lua虚拟机中供调用,此外,可以使用Lua基本库中的所有函数进行数据计算、文件管理等操作。
i5Vision注册在Lua中的函数列出如下:
void CreateMatcher(number _ParaOBJn, [string _Matcher])
初始化匹配器:用前面设定的序号为_ParaOBJn 的模型参数(OBJn)初始化序号为_ParaOBJn的匹配器。初始化主要是进行模型的预处理和准备图像处理空间。使用模型参数做定位测试时,就已经初始化了与当前修改的模型参数序号相同的匹配器。如果指定了_Matcher,则用_Matcher命名一个匹配器然后用序号为_ParaOBJn 的模型参数初始化它。
void DeleteMatcher(string _Matcher)
删除匹配器:如果有以_Matcher命名的匹配器,删除它以释放资源。不能也不需删除与当前修改的模型参数序号关联的匹配器。
void GetImage([number _ParaOBJn], [string _cvMat])
拍摄图像:使相机触发拍照一帧图像暂存于默认图像中。如果指定了_ParaOBJn,则以_ParaOBJn对应的模型参数中的曝光值来触发拍照;如果指定了_cvMat,则将默认图像复制到以_cvMat命名的图像中。
void ReadImage(string _filepath, [string _cvMat])
读取图像:读取文件路径为_filepath的图像文件(.bmp, .png, .jpg)暂存于默认图像中,如果指定了_cvMat,则将默认图像复制到以_cvMat命名的图像中。提示:Lua支持使用".."进行字符串的格式化和连接。
void SaveImage([string _filename])
保存图像:将默认图像保存为文件(路径和命名方式同[保存图像]按钮按下时的方式)。如果指定了_filename,则以_filename为文件路径保存默认图像。
void UseImage([string/number _Matcher], [string _cvMat])
指定匹配图像:将默认图像载入默认匹配器进行预处理。如果指定了_cvMat,将以_cvMat命名的图像载入默认匹配器进行预处理,如果指定了_Matcher,将默认图像载入序号为_Matcher或以_Matcher命名的匹配器进行预处理。
void ShareImage(string/number _MatcherDst, [string/number _MatcherSrc])
复制预处理图像:将默认匹配器的预处理图像复制到序号为_MatcherDst或以_MatcherDst命名的匹配器。如果指定了_MatcherSrc,就将_MatcherSrc匹配器的预处理图像复制到_MatcherDst中。ShareImage相当于对两个匹配器分别使用UseImage,但速度更快。
void SetPara(table _Para, [string/number _Matcher])
修改参数:为默认的匹配器设定参数,如果指定了_Matcher,就为序号为_ Matcher或以_ Matcher命名的匹配器设定参数。
设定的参数通过table传入。支持的常用键值如下:
vLocCenterX: 位置范围-x-中心值
vLocCenterY: 位置范围-y-中心值
vLocRangeX: 位置范围-x-范围值
vLocRangeY: 位置范围-y-范围值
vAspectCenterX: 变形比例-x-中心值
vAspectCenterY: 变形比例-y-中心值
dRatioCenter: 图像占比-中心值
dRatioRange: 图像占比-范围值
degRotAngleCenter: 旋转角-中心值
degRotAngleRange: 旋转角-范围值
其他键值列出如下,可根据英文名称理解其意义:
bAspectFixed, bRatioFixed, bRotAngleFixed, bROIEnable, bNeedFinalOptim, cModelState, vROIPoint1X, vROIPoint1Y, vROIPoint2X, vROIPoint2Y, dZoomRatio, iBlurSize, iLowThr, iHighThr, iChamferGrad, iSteps, iCheckCnt, iMultiGeno, dBreakFitness, dFailFitness。
举例:
l_para = {} --声明一个Lua表
l_para.degRotAngleCenter= 90 -- 旋转角中心值90°
l_para.degRotAngleRange= 5 -- 旋转角范围值±5°
SetPara(l_para, 3) -- 将3号匹配器的旋转角匹配范围设置为90°±5°
注意:此函数常用于匹配过程中修改匹配参数,且表中只需包含要修改的值即可。
table _Para = GetPara([string/number _Matcher])
获取参数:获取序号为_ Matcher或以_ Matcher命名的匹配器的参数,以表的形式返回,表支持的键值同SetPara中的表。此函数仅常用于获取报警阈值dFailFitness。
void Match([string/number _Matcher])
开始匹配:使默认匹配器开始进行模型和图像的匹配,如果指定了_Matcher,则使序号为_ Matcher或以_ Matcher命名的匹配器开始匹配。
table _Posise, boolean _FitOK = GetMatch([string/number _Matcher])
获取匹配结果:获取默认匹配器,或当指定了_Matcher,获取序号为_ Matcher或以_ Matcher命名的匹配器的匹配结果。
返回值_Posise是匹配结果的表,含有以下键:
ptImgLocX: 输出点的图像坐标-x
ptImgLocY: 输出点的图像坐标-y
dRatioX: 图像占比-x向
dRatioY: 图像占比-y向
degRotAngle: 旋转角度
dFitness: 匹配分数
定位测试时,预览窗口左上角显示的值即为此6个值。
返回值_FitOK代表匹配分数是否超过预设的报警阈值,如果超过,则为true,否则为false。
table _NCRet = CalLoc(table _NCLocCamera, [table _Posise], [boolean _FitOK])
计算定位结果:根据匹配结果和相机标定参数,计算输出点的机床坐标和实际旋转角。必须传入匹配使用图像在拍照时的机床坐标_NCLocCamera,如果没有传入_Posise和_FitOK,就使用默认匹配器的匹配结果。
返回值_NCRet含有以下键:
iRet: 匹配是否成功,成功为0,失败为-10
dLocX: 输出点的机床坐标-x
dLocY: 输出点的机床坐标-y
dLocR: 目标的实际旋转角
这个函数通常直接和GetMatch连用,例如:
ImgAt = NCGetLoc() -- 拍照前获取机床坐标
...
NCLoc = CalLoc(ImgAt, GetMatch(OBJi)) -- 计算定位结果
void ShowMatcher([string/number _Matcher])
显示匹配器图像:显示默认的匹配器匹配的(UseImage传入的)图像。如果指定了_Matcher,就显示以_Matcher为序号或命名的匹配器的图像。
void ShowCamera()
显示默认图像:显示默认图像。相机获取的图像都会存入默认图像,因此此函数即用于显示相机图像。
void NCMoveTo(table _NCLoc)
移动机床:将机床移动到指定的坐标,相当于MDA执行:
D0 G53 G90 G0 X _x Y _y Z _z
这个函数必须传入table,table包含的键应至少有x, y, z中的1个。未指定的坐标轴将不移动。例如:
toLoc = {} -- 声明一个Lua表
toLoc.x = 200 toLoc.y = -150
NCMoveTo(toLoc) -- D0 G53 G90 G0 X 200 Y -150,z轴保持不变
table _NCLoc = NCGetLoc()
获取机床坐标:获取当前机床坐标,以table形式返回,table包含键x, y, z,分别表示当前机床的x, y, z轴坐标。CalLoc计算图像中目标坐标时,需要传入拍照时的机床坐标,因此应在拍照时用此函数记录机床坐标。
void NCReleaseCall()
放行G代码调用:放行G代码的MVCALL指令。通常是在拍照完成,且声明返回值号后,使G代码可以继续执行后续加工代码。
void NCNameData(number _DataIdx, ...)
声明结果数据:声明序号为_DataIdx的结果数据,可声明多组,至少声明一组。
只有声明了序号为_DataIdx的结果数据,在G代码调用MVGET时才会等待视觉脚本定位完成(即执行NCPutData),否则MVGET会由于找不到对应的结果数据直接将-1写入系统参数$MVSTATE(其他系统参数置0)并返回。
void NCPutData(number _DataIdx, table _NCRet/(nubmer _iRet, ...))
赋值结果数据:对已声明的结果数据赋值。如果未声明序号为_DataIdx的结果数据,此函数不会做任何事情,也不会报错。
结果数据支持以table传入,或以iRet, dLocX, dLocY, dLocR, dLocD的顺序依次传入数字。当以table传入时,键应包含iRet, dLocX, dLocY, dLocR, dLocD。未包含的键,或传入数字时未写完的量,都会传入默认0。
可以看出CalLoc的返回值table正好被这个函数支持。所以这个函数可以与CalLoc连用,例如:
ImgAt = NCGetLoc() -- 拍照前获取机床坐标
...
NCNameData(OBJi) -- 声明结果数据号OBJi
...
NCPutData(OBJi, CalLoc(ImgAt, GetMatch(OBJi)) -- 计算定位结果,并写入结果数据OBJi
6.6.2 脚本示例
在[定位过程]页面,点击[插入示例脚本]会插入一段示例脚本,这段脚本会在相机到达拍照位置后被G代码调用运行,假设调用参数NCarg=1。其每行脚本的意义解释如下:
OBJi = 1 -- 定义一个变量OBJi,赋值1
ShowCamera() -- 显示相机画面
CreateMatcher(OBJi) -- 初始化匹配器1
ImgAt = NCGetLoc() -- 拍照前,获取机床坐标
GetImage(OBJi) -- 使用参数1中的曝光参数拍照一张图像,保存于默认图像
UseImage(OBJi) -- 匹配器1预处理默认图像
NCNameData(NCarg) -- 声明变量1
NCReleaseCall() -- 方形G代码MVCALL
Match(OBJi) -- 匹配器1执行图像匹配
ShowMatcher(OBJi) -- 显示匹配器1的图像(同时会刷新匹配结果)
NCPutData(NCarg, CalLoc(ImgAt, GetMatch(OBJi))) -- 获取匹配器1(OBJi)的匹配结果,传入拍照坐标ImgAt并计算目标实际位置,然后将结果传入结果数据1(NCarg)
7 G代码调用
7.7.1调用原理
升级i5Vision视觉定位软件后,i5系统G代码译码会多支持以下函数:
MVCALL(INT _Progn, INT _NCarg)
MVGET(INT _NCData)
VisionLocate=FTYPE
并增加了$MVSTATE, $MVLOCATEX, $MVLOCATEY, $MVLOCATER, $MVLOCATED 五个系统参数。它们的意义解释如下:
MVCALL(INT _Progn, INT _NCarg)
调用脚本:调用[定位过程]中序号为_Progn的脚本,脚本中全局变量NCarg的值会被赋值为_NCarg。如果脚本不存在,会生成默认脚本并且OBJi的值等于_Progn。此函数会阻塞,直到脚本中运行到NCReleaseCall()或脚本执行结束或脚本报错退出。
MVGET(INT _NCData)
获取结果:获取序号为_NCData的结果数据,将结果数据中的iRet, dLocX, dLocY, dLocR, dLocD分别写入系统参数$MVSTATE, $MVLOCATEX, $MVLOCATEY, $MVLOCATER, $MVLOCATED。如果G代码运行到此时,脚本中还没有声明序号为_NCData的结果数据,则$MVSTATE被置为-1,其他4个系统参数被置为0。如果脚本中声明了序号为_NCData的结果数据,则此函数会阻塞,直到脚本运行到NCPutData(_NCData)。特别注意:目前此函数不会在脚本运行结束后停止阻塞,如果声明了变量,最后务必对其进行赋值。
VisionLocate=FTYPE
直接定位:此函数相当于:MVCALL(FTYPE, FTYPE)+MVGET(FTYPE)。如果使用默认脚本,调用此函数会直接定位参数序号为FTYPE的模型,并返回结果到系统参数。
7.7.2调用示例
下面以加工两个工位的手机壳耳机孔为例说明调用方法:
子程序:
PROC MVLOC(VAR REAL TRANSX,VAR REAL TRANSY,INT FTYPE)
G04 H1
WAITRUNOUT
VisionLocate=FTYPE
TRANSX=$MVLOCATEX
TRANSY=$MVLOCATEY
RET
在这段子程序中,G代码程序会暂停1s并等待CNC运动结束。运动结束后,执行VisionLocate=FTYPE来进行一次定位,FTYPE为定位的特征编号,可以通过工件设定页面进行查看,定位结果返回到CNC参数TRANSX和TRANSY中,子程序要和主程序在同一个文件夹下。
主程序:
DEF REAL TRANSX[2],TRANSY[2] ; 存储定位结果
F 400 S 15000
M6T18;使用空刀位,防止撞刀
G53
TRANS X=0 Y=0
G0 Z -131.412
G0 X 148.398 Y -279.549;耳机孔移动到相机视野范围内
MVLOC(TRANSX[0],TRANSY[0],0) ; 调用定位子程序,返回耳机孔位置
IF ABS(TRANSY[0]+160.01)>0.18 GOTO N100;耳机孔位置偏差过大报警
G0 X 72.000;USB孔移动到相机视野范围内,有时需要旋转A轴
MVLOC(TRANSX[1],TRANSY[1],0); 调用定位子程序,返回USB孔位置
IF ABS(TRANSY[1]+30.693)>0.18 GOTO N110;USB孔位置偏差过大报警
$ORIGOFFS1[X]=TRANSX[0];耳机孔的X轴定位结果写入G54
$ORIGOFFS1[Y]=TRANSY[0];耳机孔的Y轴定位结果写入G54
$ORIGOFFS2[X]=TRANSX[1];USB孔的X轴定位结果写入G55
$ORIGOFFS2[Y]=TRANSY[1];USB孔的Y轴定位结果写入G55
G54
CALL ... ; 加工圆孔
G55
CALL ... ; 加工耳机孔
N100 MSG("E","耳机孔位置超差")
N110 MSG("E","USB孔位置超差")
M5
M2
在主程序中,G0 X 148.398 Y -279.549使第一个待定位工件移动到视野范围内(孔位最好在靠近相机视野的中心位置,并且孔位完整出现在相机视野中),调用定位子程序MVLOC进行一次定位,结果存储在TRANSX[0], TRANSY[0]中,然后G0 X 72.000 将第二个待定位工件移动到视野范围内,调用定位子程序MVLOC再进行一次定位结果存储在TRANSX[1], TRANSY[1]中。