常规定位引导项目入门必看
本文主要介绍如何使用VM实现常规的定位引导项目。

1.   场景描述

适用场景:单相机拍物料的抓取场景。

标定方式:工具中心与旋转中心(一般为法兰中心)共轴的定位引导场景,此时可采用九点标定,即单相机与机构做平移标定(9点标定)。工具中心与旋转中心不共轴,此时可采用十二点标定,如图所示为不共轴示意图。


限制条件:不支持多相机联立坐标系、相机拍照位姿变化等场景。

2.   机构及成像质量调整

2.1  硬件安装要求

2.1.1.       机构应安装稳固,不能产生松动。

2.1.2.       调整相机应保持镜头平面与物料平面平行。

2.1.3.       网线接口要安装稳固应采用海康网线。

2.1.4.       电源线应采用高柔电缆。

2.1.5.       镜头光圈先拧到底再反拧半圈,保证既有一定的景深同时保持较好的图像锐利度。

2.2  系统安装要求

2.2.1.         Win系统要求:Win10 64bit。

2.2.2.         处理器要求:I5以上CPU。

2.3 成像质量要求

1)     调整相机焦距保证成像清晰(以图像边缘过渡带不超过两个像素为准)。

2)     保证待检测特征处于图像正中心(图像边缘容易产生径向畸变)。

2.4  机构精度要求

2.3.1.       静态测试:相机在拍照位与物料保持静止,连续拍照,保证图像特征点提取稳定在一个像素以内,特征点提取不稳定则需选取更为稳定的特征点。

2.3.2.       动态测试

1)  平移精度:物料保持不动,机械手分别沿X/Y正负方向等步长移动4次得到三组像素差,计算像素差是否相等(需控制在一个像素以内)。每次移动后回到原位,查看平移复位精度(即回原位查看物料图像特征点坐标必须在一个像素以内)。

2)  旋转精度:机械手分别沿正反方向旋转一定角度(与标定时的角度相当),查看图像特征角度是否等角度变化(一般需保证在0.1度以内),同时回原位查看复位精度(即回原位查看物料图像特征点坐标必须在一个像素以内)。

2.3.3.       点位移动测试:使用VM通讯发送绝对坐标给机械手,确保机械手能移动到指定点位。

3.   搭建定位引导视觉方案

3.1  搭建标定方案

如图所示为标定方案。


3.1.1         图像源模块:可根据实际情况选择相机或本地图像。一般情况配合机械手实时采图需选择相机并进行相机配置。

3.1.2        快速模板匹配:提取图像特征点,需保证在同一位置特征点定位精度保持在一个像素以内,同一位置模板匹配角度需稳定保持在0.1度以内。

3.1.3         N点标定模块

1)  标定基本参数设置如图所示:平移次数默认九次;旋转次数九点标定设为0,十二点标定设为3;偏移X/Y设置应使九点整个平移轨迹应尽量覆盖视野1/2以上;角度偏移应不小于10度。

1)  标定运行参数设置:相机模式根据实际场景选择,自由度一般情况建议选择第二个自由度(缩放、旋转、纵横比、倾斜以及平移)。

3.2  创建通讯设备及全局触发

可在通信管理添加通信设备,全局触发建立触发事件,实现机械手通信触发视觉流程。




3.3  标定

3.3.1         机械臂带动相机按照参数设定的移动方向及步长移动,每次移动触发标定流程。九点标定移动九次,十二点标定需先按九点移动最后三点在第五点的基础上按参数设置的角度旋转三次。

3.3.2         标定结果查看(出现异常需从新标定)

标定轨迹:如图所示为标定轨迹,查看标定轨迹中的X轴和Y轴是否垂直,轨迹是否存在波动(X/Y三点是否共线)。


2)     标定状态:标定状态1表示成功,0表示失败需从新标定。评估标定误差状态:0表示误差在正常范围内,1表示不正常的标定结果,较长数字为状态码,分别对应不同的标定误差状态。

3)     像素精度:平移像素精度表示平移产生的平均像素误差,一般要求保证在一个像素以内。旋转像素精度表示旋转产生的平均像素误差,一般保证在0.5像素以内。

4)  旋转一致性:表示图像坐标系与机械手坐标系的旋转一致性,1表示旋转一致,-1表示旋转方向相反,需旋转机构查看旋转一致性是否判断准确,若判断错误需调整参数从新标定。

3.4  示教及生产

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

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

从零开始:如何通过VM3.4二次开发进行手眼标定

下一篇

常规定位引导项目问题排查步骤

评论请先登录 登录
全部评论 14

有个报警

2024-06-05 20:30:11 重庆
回复

       //2.计算旋转偏差

        float basicWorldX = markWorldX + calibSnapX;
        float basicWorldY = markWorldY + calibSnapY;

大佬(basicWorldX,basicWorldY )这个点是旋转中心吗?怎么计算来的啊,理解不了。

看你在public void rotateMethod这个方法里当机构旋转中心使用的。

2024-04-19 16:16:46 安徽省
回复

能够提供一下标定结果文件或者数据测试一下吗

2024-04-19 11:47:51 广东省
回复

请问共轴的情况,角度偏移,怎么补正

2024-03-15 21:19:19 江苏省
回复

假如标定完后,建图像基准的时候,机械手当前值不是标定第五点的拍照位  那么公式里的这个calibSnapX,calibSnapY  是否要替换成 建图像基准时的当前拍照位机械坐标xy?

2024-01-04 08:37:57 浙江省
回复

请教一下,工具中心,法兰中心分别指的是什么?

2023-11-01 10:57:42 浙江省
回复

请问下:大幅面产品,需单相机拍照两次(左上,右下mark点),图片怎样缓存和调用呢?

2023-02-03 11:21:11 未知地区
回复

大佬,我们在做视觉标定的时候,应该首先把机械手放到哪个位置呢,如果放到5号位置,1号、2号和3号位置我们是不是做一个等步长的距离就可以了呢,最终回到5号原位置。

2022-09-08 08:53:52 未知地区
回复
请问下,拍照物理坐标的问题,如相机未挂在手臂上,而是固定不变的…这个参数需要怎么写…
2022-07-08 21:24:52 未知地区
回复

GetFloatValue ("calibSnapX",ref calibSnapX);  //标定第五点拍照位X
        GetFloatValue ("calibSnapY",ref calibSnapY);  //标定第五点拍照位Y

请问,这两个参数,是做12点标定的时候,第五点拍照位的机械手坐标值,是两个固定的值,对吗?

谢谢!

2022-06-24 14:41:31 未知地区
回复

标定时相机坐标系是否要与机械臂坐标系保持一致?

2022-05-18 11:53:25 未知地区
回复

非常全面非常棒  理论扎实 实践丰富  不可多得的好文章。干了七八年的工业相机了,很多知识还是在这第一次知道😅

2022-02-27 08:46:10 未知地区
回复

想咨询下,用了通用的FA的镜头按照这个进行标定的话,前面步骤就不需要畸变矫正了吗?

2022-02-19 13:47:07 未知地区
回复
  • 1
Lv.0
2
关注
73
粉丝
6
创作
134
获赞
相关阅读
  • 海康移动机器人技术资料目录
    2024-09-21 浏览 0
  • VM算法平台-PLCS7通讯-二维码字符串接收及发送至S7的string类型相关问题-二维码命名存图
    2024-09-13 浏览 0
  • usb共享网络更改路由
    2024-09-24 浏览 0
  • 【MVS4.0新功能一览】第三篇采集卡相关功能
    2024-08-29 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器