VM实现定位引导方法

这篇具有很好参考价值的文章主要介绍了VM实现定位引导方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

VM实现定位引导项目的方法

一、 手眼标定抓取原理

1. 标定的本质
标定的目的是统一坐标系,将图像坐标系中的点转换到物理坐标系中,然后在物理坐标系中进行数值处理。图1为从数学角度来理解标定原理。
海康vm统一坐标系,Vision Master,1024程序员节,图像处理,计算机视觉
标定:已知像素坐标系A有一系列点Px1,Py1;物理坐标系B有一系列点Wx1,Wy1;通过标定运算获得坐标系A到坐标系B的转换关系Matrix,即生成的标定文件。
生产:已知坐标系A的一个点currentPtA;求解该点在坐标系B中的对应点currentPtAMapB。
求解公式:currentPtAMapB = currentPtAMatrix
2. 标定分类
标定的目的是统一坐标系,但是标定的过程不一样,标定的流程也会有所不同。如图2所示是外参标定的常用方法,本文以手眼标定中十二点标定为例讲解。
3.十二点标定
十二点标定是九点标定和旋转标定的总和。主要用于处理不共轴的问题。不共轴:即运行点和基准点不重合,当基准点发生旋转时,运行点会发生变化的现象。,图3为运行点与基准点不共轴示意图。
海康vm统一坐标系,Vision Master,1024程序员节,图像处理,计算机视觉
九标定的结果是个3×3的矩阵Matrix,旋转标定的结果是点Center,而十二点标定则是将前者统一起来,做了原点归一化,将旋转中心当做原点(零点)。将旋转中心(CenterX,CenterY)与12点标定矩阵相乘,即做标定转换,可发现输出结果为(0,0),由此可见十二点标定是将原点定在了旋转中心上,旋转中心即为零点,图4为标定矩阵统一过程。
海康vm统一坐标系,Vision Master,1024程序员节,图像处理,计算机视觉
注意:由上面的关系可知,当基准拍照位置变化后,需要重新做12点标定,因为旋转中心发生了移动。所以12点标定的拍照点必须与生产时的拍照点完全一致。
4. 十二点抓取定位算法原理
1)将图像转物理坐标:即将相机拍照经过算法提取得到的图像点坐标通过标定矩阵转换得到图像点对应的物理坐标点。
2)计算抓取偏差量:由于不共轴,若只是将运行图像转物理坐标-基准图像转物理坐标=机械手抓取偏差量,虽然吸嘴中心和物料特征对上,但一旦物料角度有变化,那么机械手旋转该角度后,吸嘴中心就不会再对上物料特征,导致定位失败。所以需要将机械手的抓取定位偏差量分解为平移偏差量和旋转偏差量两部分。
平移偏差量MoveOffset:运行图像转物理坐标-基准图像转物理坐标。
MoveOffsetX = runWorldX – markWorldX;
MoveOffsetX = runWorldY– markWorldY;
旋转偏差量RotateOffset:机械手旋转偏差角度DR后带来的坐标偏差量。机械手旋转量是示教位绕着基准位旋转的坐标变化量,其中示教位为TeachPos,基准位为BasicWorld(基准图像转物理坐标+拍照基准位(标定第五点拍照位))。
TR = DR / 180 * Math.PI;(根据机械手坐标系与图像坐标系手性相同或相反,可能需要乘以-1)
RotateX = (TeachPosX – BasicWorldX)
Cos(TR) – (TeachPosY – BasicWorldY)* Sin(TR);
RotateY = (TeachPosX – BasicWorldX)* Sin(TR) + (TeachPosY – BasicWorldY)* Cos(TR);
RotateOffsetX = RotateX – TeachPosX;
RotateOffsetY= RotateY – TeachPosY;
最终,机械手的抓取定位偏差量为:
OffsetX = MoveOffsetX + RotateOffsetX;
OffsetY = MoveOffsetY + RotateOffsetY;
OffsetR = DR;(根据机械手与图像旋转一致性相同或相反,可能需要乘以-1)
二、 基于VM搭建手眼标定与生产方案。
这里在VisionMaster例程中的N点标定方案的基础上进行修改,方案默认路径为C:\Program Files\VisionMaster3.4.0\Applications\Samples\CH\软件功能展示\标定\N点标定。
(一) 标定方案:
1.标定矩阵求解过程主要集成在N点标定模块中,输入12组对应的图像点与物理坐标点就可以自动求解标定矩阵。标定方案示例如图5所示。
海康vm统一坐标系,Vision Master,1024程序员节,图像处理,计算机视觉

图5 标定流程
2.方案模块讲解
快速匹配模块:用于提取图像特征点。
N点标定模块:订阅图像坐标和物理坐标(可以使用脚本模块或在N点标定模块中设置具体设置方式如图7所示,十二点标定基准点设置为第五点坐标)以及相关参数设置,达到输入次数(十二点标定为十二组对应的坐标值)即可完成标定计算。参数设置如图8所示。根据实际情况选取相机模式和自由度。
海康vm统一坐标系,Vision Master,1024程序员节,图像处理,计算机视觉

图7 物理坐标基准设置
海康vm统一坐标系,Vision Master,1024程序员节,图像处理,计算机视觉

图8 N点标定模块参数设置
3. 标定结果及标定矩阵保存
输入对应的标定参数后即完成标定过程,标定完成状态如图9所示。
海康vm统一坐标系,Vision Master,1024程序员节,图像处理,计算机视觉

图9 标定完成状态图
标定完成后在N点标定模块中点击生成标定文件,然后选择保存路径即可将标定结果保存。如图10所示为保存过程及结果。
海康vm统一坐标系,Vision Master,1024程序员节,图像处理,计算机视觉

图10 标定结果保存

  1. 示教
    示教过程:人工引导机械手到物料位置,使得机械手刚好抓取到物料,记下此时的机械手物理坐标和相机在基准位拍照得到的图像基准坐标。
    (二) 生产方案:
    1.实际生产过程只需计算出机械手到待抓取点的偏差量,然后控制机械手进行移动就可以实现抓取功能。这里的偏差计算可以根据上文提到的十二点抓取算法原理编写脚本实现,参考代码见附录。

2.方案模块讲解
标定转换模块:输入参数为图像坐标和标定文件,输出参数为经过标定转换后的物理坐标。具体配置如图13所示。
海康vm统一坐标系,Vision Master,1024程序员节,图像处理,计算机视觉

图13 标定转换模块参数配置
变量计算模块:根据机械手坐标系与图像坐标系手性相同或相反来判断角度值是否需要乘以负一。

  1. 偏差计算结果
    偏差计算结果如图15所示,偏差结果包含x轴偏移量、y轴偏移量和旋转角度偏移量。这里的偏移量是指运行图像到示教位的物理偏差,将偏差量加上示教位坐标就可以转换成机械手抓取移动的绝对坐标,然后通过通讯发送给机械手进行机械臂移动操作,就可以实现抓取任务。
    海康vm统一坐标系,Vision Master,1024程序员节,图像处理,计算机视觉

图15 偏差计算结果

附件:利用脚本实现偏差计算代码(GetFloatValue为需要配置的输入参数,均为物理坐标,SetFloatValue为需要配置的输出参数)文章来源地址https://www.toymoban.com/news/detail-608060.html

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;  
    
    /// <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
        //每次执行将进入该函数,此处添加所需的逻辑流程处理
        //MessageBox.Show("Process Success");
        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     
        
        //角度偏差
        float dr = runWorldR - markWorldR;
        
        //1.计算平移偏差
        float moveoffsetX = runWorldX - markWorldX;
        float moveoffsetY = runWorldY - markWorldY;
 
        //2.计算旋转偏差
        float basicWorldX = markWorldX + calibSnapX;
        float basicWorldY = markWorldY + calibSnapY;
        
        float rotatedX,rotatedY;
         rotateMethod(-1*dr,TeachPosX,TeachPosY,basicWorldX,basicWorldY,out rotatedX,out rotatedY);
        float rotateoffsetX = rotatedX - TeachPosX;
        float rotateoffsetY = rotatedY - TeachPosY;
        
        //3.计算拍照位偏差
        float snapoffsetX = snapX - calibSnapX;
        float snapoffsetY = snapY - calibSnapY;
        
        //4.计算机械手偏移量
        float offsetX = moveoffsetX + rotateoffsetX + snapoffsetX;
        float offsetY = moveoffsetY + rotateoffsetY + snapoffsetY;
        SetFloatValue("offsetX", offsetX);
        SetFloatValue("offsetY", offsetY);
        SetFloatValue("offsetR", dr);
      
        return true;
    }
}

到了这里,关于VM实现定位引导方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VM虚拟机运行的Ubuntu连入同一局域网,并实现双机方法

    环境: Windows 10 VMware Workstation Pro 16 Ubuntu 20.4 确保虚拟机处于关闭状态,在Vm中设置: 编辑-虚拟网络编辑器 如果你以前设置过,可以重置之。 重置之后,添加桥接模式: 确定并保存。 对虚拟机设置 如下设置 进入虚拟机,在设置中,创建一个新的wired 不用填写,直接可用。

    2024年02月07日
    浏览(48)
  • VM虚拟机Ubuntu设置静态IP方法

      如果是动态获取IP,那么在每次重启系统之后IP都有可能发生变化。以Ubuntu16.04为例设置静态IP。  1、首先打开VM界面,打开“编辑虚拟机设置--网络适配器--桥接模式”。将这里的网络连接改为桥接模式。  2、打开Ubuntu系统。  3、右上角连接刚刚配置的网络,连接名称为上

    2024年02月13日
    浏览(52)
  • 关于VM一启动虚拟机电脑就重启或蓝屏的几个解决方法

    最近在刚开始学习Linux在使用VMware创建新的虚拟机时只要一点启动虚拟机电脑就直接重启了,最开始以为是vm版本或者是Linux镜像的原因来来回回换了好几个vm和Linux,电脑重启了二三十次都没成功启动虚拟机。 最后来来回回换了几个方法终于把这个问题给解决了,现在就把这

    2024年01月21日
    浏览(43)
  • VM VirtualBox 实现 Hadoop 3.3.4集群搭建

    虚拟机:Oracle VM VirtualBox 操作系统: Centos8 Hadoop版本:3.3.4 JDK版本:1.8 免密登录(SSH协议):MobaXterm 打开Oracle VM VirtualBox并新建虚拟机 内存选择 选择现在创建虚拟硬盘 设置虚拟硬盘文件类型 建议动态分配 设置虚拟硬盘大小 注意:创建完先不要打开,先进行环境配置 设置

    2023年04月09日
    浏览(32)
  • VM中Linux虚拟机IP地址总是自动变化的一种解决方法

    一开始使用Xshell远程连接虚拟机中的CentOS 7.9系统时,在重启系统后主机地址总是变化,第一次是192.168.136.134,第二次变成192.168.136.135,,,,,这样非常麻烦,每次都要去修改会话属性或者新建会话,在进行以下操作后解决上述问题: 首先,分别使用ip a和ifconfig两个命令显

    2024年02月15日
    浏览(44)
  • pyautogui 配合 selenium 实现桌面坐标系定位元素坐标,模拟真实鼠标行为

    pyautogui 配合 selenium 实现桌面坐标系定位元素坐标,模拟真实鼠标行为。 场景:当我需要点击某个元素,或者触发浏览器的自动填充账号密码时,自动化点击无效。但是想要模拟真实鼠标点击又需要元素的坐标通过pyautogui来实现。通过selenium node.location获取的坐标是相当于浏览

    2024年02月13日
    浏览(41)
  • 康耐视visionpro定位引导标定简介及方法

    机器视觉康耐视智能相机Insight-产品缺陷检测 1.计算像素比 有些时候我们需要的检测数据并不需要特别准确,并且手边没有其它标定工具,可以使用这种方法大概算一算每个像素对应多大距离。 找一个知道距离的物体,测出它的像素距离,像素比例=被测物体距离÷像素大小

    2024年02月04日
    浏览(70)
  • 【FUSA笔记-001】TDA4VM安全手册:安全机制实现

    软件安全机制分类 1. 与软件本身、基础软件或者操作系统失效探测、指示和减轻有关的自检或监控功能 软件程序流监控 输入输出合理性检测:软件回读写入数据、软件回读传输数据等、传感器合理性检查 基础软件自检:软件自检 2. 与安全相关硬件要素故障探测、指示和减

    2024年02月03日
    浏览(33)
  • 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测

    分类效果 基本介绍 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 程序设计 完整源码和数据获取方式: 私信回复 MATLAB实现S4VM半监督支持向量机二分类预测 。 参考资料 [1] https://blog.csdn.net/kjm13182345320/article/details/116071412 [2] https://blog.csdn.net/kjm13182345320?spm=1010.2135.3001.

    2024年02月11日
    浏览(31)
  • 【OpenCV-Torch-dlib-ubuntu】Vm虚拟机linux环境摄像头调用方法与dilb模型探究

    随着金秋时节的来临,国庆和中秋的双重喜庆汇聚成一片温暖的节日氛围。在这个美好的时刻,我们有幸共同迎来一次长达8天的假期,为心灵充电,为身体放松,为未来充实自己。今年的国庆不仅仅是家国团聚的时刻,更是展现自我的舞台。我在这个特殊的假期里,决定探究

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包