康耐视visionpro-机器视觉定位引导-经验总结-来自视觉人粉丝分享
1、机器人吸取电路板,移动到拍照位置,并在电路板上找一个标记点,并且,通过机器人示教把当前电路板能够准确的放入到目标位置。
2、机器人吸取电路板吸取电路板,在x,y方向进行移动,总共移动4个位置,记录4个位置的机器人的坐标,以及拍摄图像
3、使用vp的CogCalibNpointToNpoint工具,并在蓝框填入标志点的像素坐标,红框填入对应的机器人坐标。
4.点运行完成标定功能。
5、完成标定后,整个流程如下
在模板匹配中把模板中心进行记录。然后,调整标定工具的校正原点
使得模板匹配的模板中心x,y坐标输出为0,0,表示当前吸取的电路板能够准确的放入模板位置
下次,再吸取电路板时,执行模板匹配后,输出的x,y坐标就是机器人应当移动的x,y的偏移量
这样x y 就计算完成了。
但往往,因为还有旋转。所以还要计算角度
机器人不用旋转中心进行标定
旋转中心标定方式的说明
在下面的图例中,红色为相机视野(FOV),黄色为工件,五星为Mark点。
旋转中心方法用于所有机器人与视觉配合场景
方法 :计算工件实际发生的偏移量 和旋转,结合机器人的旋转中心进行二次补偿后 ,把补偿量 发送给机器人 ,然后机器人把补偿量进行抓取或放置即可。
计算 某个点绕另外一旋转定角度后的坐 标,如图 :A(x,y)绕 B(rx0 ,ry0) 旋转a度后的位置为 C(x0,y0 ),则有如 下关系式:
x0= cos (a) * (x -rx0) – sin (a) *(y-ry0) +rx0
y0= cos (a) * (y- ry0) + sin (a) (x-rx0) +ry0
下面的所有计算旋转与偏移量都是基于上面的公式。
{Cx,Cy } 旋转中心坐标; {Mx,My } 工件 Mark坐标。
{MDx,MDy},Mark偏移量。
{RDx,Rdy}, 发送给机器人的补偿量。
工件发生平移时,
在拍照位置进行拍照后 ,与开始训练标准位置时,Mark点成像会产生偏移。
Mark 偏移量 MDx =RDx;MDy =RDy ;
如上图即相机计算出的 Mark 点偏移量 ,可以直接补偿给机器人,然后进行抓取即可。
作为测试 ,可以机器人在拍照位置进行补偿后 ,Z轴不变然后再拍照 ,会获得和拍照位置一样的图像。
工件发生平移与旋转
工件发生平移和旋转时
在拍照位置进行后 ,与开始训练标准位置时 ,Mark 点成像会产生偏移;
Mark 偏移量 MDx #RDx, MDy#RDy ;如左上图即相机计算出的 MarkMark 点偏移量 ,不能直接补偿给机器人 ,需要计算出 RDx 和RDy,和RDr ,MDr 然后补偿给机器人 ,机器人补偿后才能进行抓取。
作为测试 ,可以机器人在拍照位置进行补偿后 ,Z轴不变然后再拍照 ,会获得和拍照位置一样的图像;
计算过程,旋转角度a
计算 CDx =Cx1– Cx0和 CDy =Cy1– Cy0
CDx = cos (a) * (Cx0 -X0) -sin (a) * Cy0-Y0) + X1 – Cx0
CDy = cos (a) * (Cy0 -Y0 ) + sin (a) * Cx0 -X0 ) + Y1– Cy0
从公式中可以看出,补给机器人的偿量由:
旋转中心坐标( Cx0,Cy0 )
标准的工件 (Mark) 坐标点( X0,Y0)
工件移动后新的(Mark)坐标点
工件 (Mark) 旋转角度 a
所以利用旋转中心方法计算给机器人的补偿量时,首先要中心坐标,
但是在很多场景下计算旋转中心坐标时要么出了视野,要么转的角度范围太小等,拟合旋中心都存在误差,
导致补偿精不够
一定要计算旋转中心坐标吗?其实不需要。
CDx,Cdy 计算过程 ,旋转角度 a
CDx = cos (a) * (Cx0 -X0) -sin (a) * (Cy0 -Y0) + X1 – Cx0
= ( cos (a) -1) * (Cx0-X0)-Sin(a)(Cy0 -Y0) + MDx
= (cos(a) -1) * StDx -sin (a) * StDy + MDx
CDy = cos ( a) * (Cy0 -Y0 ) + sin (a) * (Cx0 -X0 ) +y1 – Cy0
= ( cos (a) -1) * (Cy0 -Y0 ) + sin (a) * (Cx0 -X0 ) + Mdy
= (cos(a) -1) * StDy + sin (a) * StDx + Mdy
从公式中可以看出 StDx= Cx0-X0, StDy = Cy0 -Y0 是个常量, MDx 和Mdy是每次拍照是工件 (Mark )的坐标与准位置工件( Mark)的差值;
StDx 与StDy 怎么计算呢?蓝色的为一个二元次方程,我们需要旋转角度即可计算出;
如果 计算出 StDx 和StDy 则在运行时,直接带入上述公式,可以很快计算出 CDx,Cdy 这样给出Robot 的偏移量了,而不需要计算旋转中心确切坐标了
下面介绍如何求解 StDx和StDy
实际操作的时候,感觉上面的文章有点难理解,就还是老老实实去算了圆心,例如让机器人旋转正15度,和负15度,得到两个新的坐标。3点求圆心坐标。
点求圆心:
struct POINT
{ public double X;public double Y; } POINT RotateCenterCal(POINT p1, POINT p2, POINT p3, POINT ptCenter){//将三点代入圆的方程double a = 2 * (p2.X - p1.X);double b = 2 * (p2.Y - p1.Y);double c = p2.X * p2.X + p2.Y * p2.Y - p1.X * p1.X - p1.Y * p1.Y;double d = 2 * (p3.X - p2.X);double e = 2 * (p3.Y - p2.Y);double f = p3.X * p3.X + p3.Y * p3.Y - p2.X * p2.X - p2.Y * p2.Y;ptCenter.X = (b * f - e * c) / (b * d - e * a);ptCenter.Y = (d * c - a * f) / (b * d - e * a);return ptCenter;}
之后可以根据圆心 以及当前取得到的坐标以及旋转量,倒推得到要旋转多少角度和移动多少坐标才能回正。
CDx = cos (a) * (Cx0 -X0) -sin (a) * Cy0-Y0) + X1 – Cx0
CDy = cos (a) * (Cy0 -Y0 ) + sin (a) * Cx0 -X0 ) + Y1– Cy0
从公式中可以看出,补给机器人的偿量由:
旋转中心坐标( Cx0,Cy0 )
标准的工件 (Mark) 坐标点( X0,Y0)
工件移动后新的(Mark)坐标点
工件 (Mark) 旋转角度 a
代码: private void button3_Click(object sender, EventArgs e)
{ //根据圆心坐标 与角度, 以及原先的X,Y, 求旋转角度后的新坐标
POINT p1 = new POINT();
POINT p2 = new POINT();
POINT presult = new POINT();
p1.X = double.Parse(lastX.Text);p1.Y = double.Parse(lastY.Text);double jiaodu = double.Parse(lastjiaodu.Text);jiaodu = -jiaodu;// jiaodu = jiaodu * 180 / Math.PI; 无需转换成度数p2.X = double.Parse(centerX.Text);p2.Y = double.Parse(centerY.Text);presult = FindNEWXandY(p1, p2, presult, jiaodu);resultX.Text = presult.X.ToString();resultY.Text = presult.Y.ToString();}POINT FindNEWXandY(POINT p1, POINT p2,POINT presult,double jiaodu){//根据圆心坐标 与 原先的X,Y, 求旋转角度后的新坐标//jiaodu = (Math.PI *jiaodu/180);double mc = Math.Cos(jiaodu);double ma = Math.Sin(jiaodu);double a1 = (p1.X - p2.X) * mc;double b1 = (p1.Y - p2.Y) * ma;presult.X =Math.Round(a1 - b1 + p2.X,3);double a2= (p1.Y - p2.Y) * mc;double b2 = (p1.X - p2.X) * ma;presult.Y = Math.Round(a2 + b2 + p2.Y,3);return presult;}
因为当时使用的机器人精度较查,误差还是挺大的。如果项目成型,则会有最终解决方案,目前只是配合测试。先到此结束
相关文章:

康耐视visionpro-机器视觉定位引导-经验总结-来自视觉人粉丝分享
1、机器人吸取电路板,移动到拍照位置,并在电路板上找一个标记点,并且,通过机器人示教把当前电路板能够准确的放入到目标位置。 2、机器人吸取电路板吸取电路板,在x,y方向进行移动,总共移动4个位置ÿ…...
包管理工具npm
一:package.json 在某个文件路径下,执行 npm init。就会生成package.json文件。大致如下: {"name": "test","version": "1.0.0","description": "测试","main": &q…...

ChatGPT正进军各行各业,抓住机遇,拥有无限的可能性。
每一个新技术的出现都会对各行各业产生冲击,但关键在于如何抓住这个机遇。ChatGPT是一项非常具有前途的技术,它可以在许多领域为人们提供更好的服务和体验。这项技术的优势之一是它可以快速而准确地理解和解释自然语言,从而使人们可以更轻松地…...

Maven 多模块管理
多模块管理简单地理解就是一个 Java 工程项目中不止有一个 pom.xml 文件,会在不同的目录中有多个这样的文件,进而实现 Maven 的多模块管理 在多人使用Maven协作开发项目时,尤其是稍微上点规模的项目,每个RD的工作都细分到具体功能…...
crash 内核调试工具 ps 指令 显示的进程状态 RU, IN, UN, ZO, ST, TR, DE, SW, WA, PA 什么意思
crash> help ps | grep "the task state" 5. the task state (RU, IN, UN, ZO ,ST, TR, DE, SW, WA, PA, ID, NE) 参考linux-4.19.113内核源码(include/linux/sched.h),有如下定义 /** Task state bitmask. NOTE! These bits…...

Spring《二》bean的实例化与生命周期
🍎道阻且长,行则将至。🍓 上一篇:Spring《一》快速入门 下一篇:Spring《三》DI依赖注入 目录一、bean实例化🍍1.构造方法 ***2.静态工厂 *使用工厂创建对象实例化bean3.实例工厂 ***使用示例工厂创建对象实…...
java与kotlin 写法区别
原文链接:https://gitcode.net/mirrors/mindorksopensource/from-java-to-kotlin?utm_sourcecsdn_github_accelerator#assigning-the-null-value Print to Console 打印到控制台 Java System.out.print("Amit Shekhar"); System.out.println("Amit…...
服务器运行深度学习代码使用指南
该内容配置均在九天毕昇下配置。 当前系统使用的linux版本为:Ubuntu 18.04 LTS。 当前版本安装的是:cuda10.1。 九天毕昇平台:https://jiutian.10086.cn/edu/#/home 一、linux下运行python的操作 ls 为列出当前目录中的文件 cd 文件名 进入…...

计算机组成原理 - 2. 数据的表示和运算
整理自天勤高分笔记,购书链接: 24 天勤高分笔记 要记住的几个数字 📓: 215327682^{15} 3276821532768 216655362^{16} 6553621665536 23121474836482^{31} 21474836482312147483648 23242949672962^{32} 4294967296232429496…...
【js】基础知识点--语句,break和continue,switch,with,for..in,do-while,while
一、break和continue语句,常用 break 语句会立即退出循环,强制继续执行循环后面的语句。而 continue 语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行 var num 0; for (var i1; i < 10; i) {if (i % 5 0) {break;}num; …...

【C++】迭代器
内容来自《C Primer(第5版)》9.2.1 迭代器、9.2.3 begin和end成员、9.3.6 容器操作可能使迭代器失效、10.4.3 反向迭代器 目录 1. 迭代器 1.1 迭代器范围 1.2 使用左闭合范围蕴含的编程假定 2. begin和end成员 3. 容器操作可能使迭代器失效 3.1 编…...
数据可视化在前端中的应用
前端开发中,数据可视化是一种非常重要的技术。它可以将复杂的数据以图形化的方式展示出来,让用户更容易理解和分析数据。在前端中,VUE是一种非常流行的JavaScript框架,可以用来实现各种数据可视化效果。 首先,让我们来看看一些常见的数据可视化方式: 表格:表格是数据可…...
FFmpeg 合并视频文件没声音,不同步原因
查了不少帖子也没搞明白,可能懂的人不会遇到吧。 1 没声音是因为我几个视频文件中,有的没音轨,就是用文字生成了个视频,需要先给它加个dummy的音轨才行。 2 视频不同步是因为各个视频格式不一样,参数挺多我也不知道具…...

绕不开的“定位”
绕开“定位”这个词谈企业战略和品牌 相当于揪住头发离开地球 定位这个词,已经进入商业界的心智中去了 发明这个词的特劳特和里斯的思想有啥差异? 《定位屋》刨析的很到位 趣讲大白话:把握概念的源头,就理解对了大部分 【趣讲信息…...

《Effective Objective-C 2.0 》 阅读笔记 item12
第12条:理解消息转发机制 1. 消息转发机制 当对象接收到无法解读的消息后,就会启动“消息转发”机制,开发者可经由此过程告诉对象应该如何处理未知消息。 消息转发分为两大阶段 第一阶段:先征询接收者所属的类,看其…...

云原生计算能消除技术债务吗?
云原生计算可以将行业领域驱动的设计、GitOps和其他现代软件最佳实践汇总起来,如果企业实施得当,可以减少技术债务。 云原生计算是企业IT的一种新范式,它涉及现代技术的方方面面,从应用程序开发到软件架构,再到保持一…...
9. 回文数
题目 给你一个整数 xxx ,如果 xxx 是一个回文整数,返回 truetruetrue ;否则,返回 falsefalsefalse 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例子 输入&am…...
[SV]SystemVerilog线程之fork...join专题
SystemVerilog线程之fork...join专题 Q:fork-join_none开辟的线程在外部任务退出后也会结束吗? A:后台线程不会结束,任何由fork开辟的线程(join、join_any、join_none),无论其外部任务ÿ…...

你看这个spring的aop它又大又宽
aop🚓AOP 分类AspectJ | 高级但是难用Spring AOP | 易用但仅支持方法aop 原理明月几时有,把酒问青天。——唐代李白《将进酒》 AOP 分类 在 Spring Boot 中,AOP 的实现主要有以下几种: 基于 AspectJ 的 AOP:这是一种基…...

设计模式-创建-单例模式
4.1.1 模式介绍 定义 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,此模式保证某个类在运行期间,只有一个实例对外提供服务,而这个类被称为单例类。 作用 保证一个类只有一个实例为该实例提供一个全…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...