康耐视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 中最简单的设计模式之一,此模式保证某个类在运行期间,只有一个实例对外提供服务,而这个类被称为单例类。 作用 保证一个类只有一个实例为该实例提供一个全…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
