适用场景:单相机拍物料的抓取场景。
标定方式:工具中心与旋转中心(一般为法兰中心)共轴的定位引导场景,此时可采用九点标定,即单相机与机构做平移标定(9点标定)。工具中心与旋转中心不共轴,此时可采用十二点标定,如图所示为不共轴示意图。
限制条件:不支持多相机联立坐标系、相机拍照位姿变化等场景。
2.1.1. 机构应安装稳固,不能产生松动。
2.1.2. 调整相机应保持镜头平面与物料平面平行。
2.1.3. 网线接口要安装稳固应采用海康网线。
2.1.4. 电源线应采用高柔电缆。
2.1.5. 镜头光圈先拧到底再反拧半圈,保证既有一定的景深同时保持较好的图像锐利度。
2.2.1. Win系统要求:Win10 64bit。
2.2.2. 处理器要求:I5以上CPU。
1) 调整相机焦距保证成像清晰(以图像边缘过渡带不超过两个像素为准)。
2) 保证待检测特征处于图像正中心(图像边缘容易产生径向畸变)。
2.3.1. 静态测试:相机在拍照位与物料保持静止,连续拍照,保证图像特征点提取稳定在一个像素以内,特征点提取不稳定则需选取更为稳定的特征点。
2.3.2. 动态测试
1) 平移精度:物料保持不动,机械手分别沿X/Y正负方向等步长移动4次得到三组像素差,计算像素差是否相等(需控制在一个像素以内)。每次移动后回到原位,查看平移复位精度(即回原位查看物料图像特征点坐标必须在一个像素以内)。
2) 旋转精度:机械手分别沿正反方向旋转一定角度(与标定时的角度相当),查看图像特征角度是否等角度变化(一般需保证在0.1度以内),同时回原位查看复位精度(即回原位查看物料图像特征点坐标必须在一个像素以内)。
2.3.3. 点位移动测试:使用VM通讯发送绝对坐标给机械手,确保机械手能移动到指定点位。
如图所示为标定方案。
3.1.1 图像源模块:可根据实际情况选择相机或本地图像。一般情况配合机械手实时采图需选择相机并进行相机配置。
3.1.2 快速模板匹配:提取图像特征点,需保证在同一位置特征点定位精度保持在一个像素以内,同一位置模板匹配角度需稳定保持在0.1度以内。
3.1.3 N点标定模块
1) 标定基本参数设置如图所示:平移次数默认九次;旋转次数九点标定设为0,十二点标定设为3;偏移X/Y设置应使九点整个平移轨迹应尽量覆盖视野1/2以上;角度偏移应不小于10度。
1) 标定运行参数设置:相机模式根据实际场景选择,自由度一般情况建议选择第二个自由度(缩放、旋转、纵横比、倾斜以及平移)。
可在通信管理添加通信设备,全局触发建立触发事件,实现机械手通信触发视觉流程。
3.3.1 机械臂带动相机按照参数设定的移动方向及步长移动,每次移动触发标定流程。九点标定移动九次,十二点标定需先按九点移动最后三点在第五点的基础上按参数设置的角度旋转三次。
3.3.2 标定结果查看(出现异常需从新标定)
标定轨迹:如图所示为标定轨迹,查看标定轨迹中的X轴和Y轴是否垂直,轨迹是否存在波动(X/Y三点是否共线)。
2) 标定状态:标定状态1表示成功,0表示失败需从新标定。评估标定误差状态:0表示误差在正常范围内,1表示不正常的标定结果,较长数字为状态码,分别对应不同的标定误差状态。
3) 像素精度:平移像素精度表示平移产生的平均像素误差,一般要求保证在一个像素以内。旋转像素精度表示旋转产生的平均像素误差,一般保证在0.5像素以内。
4) 旋转一致性:表示图像坐标系与机械手坐标系的旋转一致性,1表示旋转一致,-1表示旋转方向相反,需旋转机构查看旋转一致性是否判断准确,若判断错误需调整参数从新标定。
3.4.1 生产拍照位确认
1) 生产拍照位坐标最好与标定第五点拍照位一致,可产生X/Y偏移,但拍照姿态(相机旋转角度)必须保持不变。
2) 生产拍照位与标定时的工作距离必须保持不变。
3.4.2 示教
1) 手动移动机械手至工具能抓到物料的姿态,记录此时的机械手坐标(示教位坐标:TeachPosX,TeachPosY)。
2) 保持物料不动机械手回到第五点拍照位,拍下此时物料图片(基准位图片)。
3.4.3 生产方案搭建:如图所示为生产流程,左侧为加载示教图像流程(提取物料图像特征点并经过标定转换转至物理坐标);右侧为实时获取相机的运行图像点流程需保证提取的特征点与示教图像特征点一致。
3.4.4 脚本模块:脚本参数如图所示,(TeachPosX,TeachPosX)为示教位物理坐标;(markWorldX,markWorldY,markWorldR)为基准图像点标定转换坐标及角度;(runWorldX,runWorldY,runWorldR)为运行图像点标定转换坐标及角度;(calibSnapX,calibSnapY)为拍照位物理坐标。输出参数为坐标偏差值及角度偏差值;IsRightCoor为右手坐标系标识符(右手坐标系为1,左手坐标系为-1); IsRelationshipSame为旋转一致性标识符(根据标定结果的旋转一致性填写)。
3.4.5 偏差结果:使用格式化模块订阅脚本输出的偏差值,然后使用发送数据模块将结果发送给机械手。
附录:十二点偏差
C#
using
System;
using System.Text;
using System.Windows.Forms;
using Script.Methods;
class UserScript:ScriptMethods,IProcessMethods
{
//the count of process
//执行次数计数
int processCount
;
float
TeachPosX,TeachPosY,markWorldX,markWorldY,markWorldR,runWorldX,runWorldY,runWorldR;
float
calibSnapX,calibSnapY,snapX,snapY,IsRightCoor,IsRelationshipSame;
/// <summary>
/// Initialize the field's value when compiling
/// 预编译时变量初始化
/// </summary>
public void Init()
{
//You
can add other global fields here
//变量初始化,其余变量可在该函数中添加
processCount = 0;
}
///旋转公式
public void rotateMethod(float dr, float
runPointx, float runPointy, float centerPointx, float
centerPointy, out float rotatex, out
float rotatey)
{
rotatex = 0f;
rotatey = 0f;
float
drRad = (float)(dr / 180.0 * Math.PI);
rotatex = (float)((runPointx - centerPointx) * Math.Cos(drRad) - (runPointy - centerPointy) *
Math.Sin(drRad) + centerPointx);
rotatey = (float)((runPointx - centerPointx) * Math.Sin(drRad) + (runPointy - centerPointy) *
Math.Cos(drRad) + centerPointy);
}
/// <summary>
/// Enter the process function when running code once
/// 流程执行一次进入Process函数
/// </summary>
/// <returns></returns>
public bool Process()
{
//You
can add your codes here, for realizing your desired function
//每次执行将进入该函数,此处添加所需的逻辑流程处理
GetFloatValue
("TeachPosX",ref TeachPosX); //机械手示教抓取位X
GetFloatValue
("TeachPosY",ref TeachPosY); //机械手示教抓取位Y
GetFloatValue
("markWorldX",ref markWorldX); //基准图像点标定转换物理坐标X
GetFloatValue
("markWorldY",ref markWorldY); //基准图像点标定转换物理坐标Y
GetFloatValue
("markWorldR",ref markWorldR); //基准图像点角度R
GetFloatValue
("runWorldX",ref runWorldX); //运行图像点标定转换物理坐标X
GetFloatValue
("runWorldY",ref runWorldY); //运行图像点标定转换物理坐标Y
GetFloatValue
("runWorldR",ref runWorldR); //运行图像点角度R
GetFloatValue
("calibSnapX",ref calibSnapX); //标定第五点拍照位X
GetFloatValue
("calibSnapY",ref calibSnapY); //标定第五点拍照位Y
GetFloatValue
("snapX",ref
snapX); //生产实际拍照位X
GetFloatValue
("snapY",ref
snapY); //生产实际拍照位Y
GetFloatValue
("IsRightCoor",ref IsRightCoor);//是否右手坐标系
GetFloatValue("IsRelationshipSame",ref IsRelationshipSame);//旋转一致性
//角度偏差
float
dr = IsRelationshipSame*(runWorldR - markWorldR);
//1.计算平移偏差
float
moveoffsetX = runWorldX - markWorldX;
float
moveoffsetY = runWorldY - markWorldY;
//2.计算旋转偏差
float
basicWorldX = markWorldX + calibSnapX;
float
basicWorldY = markWorldY + calibSnapY;
float
rotatedX,rotatedY;
rotateMethod(IsRightCoor*dr,TeachPosX,TeachPosY,basicWorldX,basicWorldY,out rotatedX,out
rotatedY);
float
rotateoffsetX = rotatedX - TeachPosX;
float
rotateoffsetY = rotatedY - TeachPosY;
float
x1 = TeachPosX - basicWorldX;
float
y1 = TeachPosY - basicWorldY;
float
distance = (float)Math.Sqrt(x1 * x1 + y1 * y1);
float
offsetX = moveoffsetX+rotateoffsetX ;
float
offsetY = moveoffsetY+rotateoffsetY ;
SetFloatValue("offsetX", offsetX);
SetFloatValue("offsetY", offsetY);
SetFloatValue("offsetR", dr);
return
true;
}
}
//2.计算旋转偏差
float basicWorldX = markWorldX + calibSnapX;
float basicWorldY = markWorldY + calibSnapY;
大佬(basicWorldX,basicWorldY )这个点是旋转中心吗?怎么计算来的啊,理解不了。
看你在public void rotateMethod这个方法里当机构旋转中心使用的。
假如标定完后,建图像基准的时候,机械手当前值不是标定第五点的拍照位 那么公式里的这个calibSnapX,calibSnapY 是否要替换成 建图像基准时的当前拍照位机械坐标xy?
大佬,我们在做视觉标定的时候,应该首先把机械手放到哪个位置呢,如果放到5号位置,1号、2号和3号位置我们是不是做一个等步长的距离就可以了呢,最终回到5号原位置。
GetFloatValue ("calibSnapX",ref calibSnapX); //标定第五点拍照位X
GetFloatValue ("calibSnapY",ref calibSnapY); //标定第五点拍照位Y
请问,这两个参数,是做12点标定的时候,第五点拍照位的机械手坐标值,是两个固定的值,对吗?
谢谢!