项目背景:相机对法兰盘表面进行拍照,获取法兰盘上16个孔位的位置,通过VisionMaster进行TCP通信,将位置信息发送给机械臂,对这16孔位的螺丝进行拧紧,同时需要根据十字锁付的特点。
思路分析:
1.方案一:采用的方案是用高精度特征匹配,将孔位作为特征模板,识别16个孔位,通过标定转换等步骤将坐标发送给机械臂。
PS:因为需要进行十字锁付,所以需要将识别到的16个孔位坐标进行从X、Y两个方向进行排列,同时由于孔位特征较小,存在个别孔位识别遗漏的情况。
2.方案二:由于法兰盘是固定在工位上的,无论法兰盘如何旋转,法兰盘的圆心位置都是固定的,孔位只是圆上的一点,跟随圆的旋转变换坐标,所以只需要计算出法兰盘的旋转角度即可。
采用的方案是用高精度特征匹配,将整个法兰盘作为模板,通过模板匹配得出当前法兰盘位置相对于模板的旋转角度,同时计算出孔位的坐标沿圆心旋转后的坐标。
PS:因为在模板中每个孔位是固定的,按编号从1~16,根据十字锁付的特点,一个周期拧编号1、9、5、13这四个点。这么做每个孔位点是计算出来的,就不存在个别孔位识别遗漏的情况。
1.圆上某点沿圆心旋转后的坐标关系式
参考:https://blog.csdn.net/zhaitianbao/article/details/120971301
2.Lua语言中的三角运算
接下来将上述的公式转换为Lua函数,由于在VisionMaster高精度模板匹配中设置的旋转角度是-180°——180°,则待检测目标若是由模板顺时针旋转得到,则角度范围是0°——180°,反之逆时针的角度范围是-180°——0°。所以按照上面的公式中旋转角度T要变成-T。
Lua中的三角函数与反三角函数,操作的是弧度非角度。
print(math.sin(angle * pi / 180))
print("sin value......")
print(math.sin(angle))
print(pi)
local pi = 3.14159265358979323846
local rotate_angle=0 --相比于模板旋转的角度
--法兰盘的中心点
local center_x=0
local center_y=0
--圆上某点沿圆心旋转后的坐标关系式
--计算旋转后的x坐标
function offset_x(x1,y1)
result_x = (x1 - center_x) * math.cos(-rotate_angle * pi / 180) - (y1 - center_y) * math.sin(-rotate_angle * pi / 180) + center_x
return result_x
end
--计算旋转后的y坐标
function offset_y(x1,y1)
result_y = (y1 - center_y) * math.cos(-rotate_angle * pi / 180) + (x1 - center_x) * math.sin(-rotate_angle * pi / 180) + center_y
return result_y
end
3.VisionMaster
打开通信管理,开启TCP服务端
相机管理中设置相机固定曝光和增益,触发模式改为软触发