【解决视觉引导多个位置需要标定多个位置的问题】

** 以下只针对2D定位,就是只有X、Y、Rz三个自由度的情况。**

假设一种情况,当视觉给机器人做引导任务时,零件有多个,分布在料框里,视觉需要走多个位置去拍,那么只需要对第一个位置确定拍照位,确定试抓位,其余的拍照位置通过只平移XY,零件特征偏移归0的方式确定,这种方式当两垛零件方向不一样的时候就不得不单独走9点。
为了解决这个问题,提高调试效率,现在分享一种通过计算来偷懒的方法。
通过这种方式,只需要9点标定一次,然后通过告知机器人当前拍照位坐标,计算零件在Base下的坐标。

1. 数学原理:

坐标系ABC分别代表机器人基座、Tool、相机。
已知的有B_A:示教器上能看到。
已知的有C_B: 物体在相机坐标系位置。
求:C_A的位置= C_A = B_A * C_B
简单来说就是只要知道C_A和C_B相乘就能算出来C_A,矩阵公式我就不画了,相信大家都见过。。。

在这里插入图片描述

2. 直接本主题,上代码:

namespace Math_Matrix
{/// <summary>/// 已知B_A坐标系关系,C_B坐标关系,求C_A/// </summary>public static class Position{/// <summary>/// 机器人工具中心在Base的平移X坐标/// </summary>public static double ToolCenterInBaseX { get; set; }/// <summary>/// 机器人工具中心在Base的平移Y坐标/// </summary>public static double ToolCenterInBaseY { get; set; }/// <summary>/// 机器人工具中心在Base的旋转Z坐标/// </summary>public static double ToolCenterInBaseRz { get; set; }/// <summary>/// 物体在工具坐标系下的平移X坐标/// </summary>public static double ObjectInToolCenterX { get; set; }/// <summary>/// 物体在工具坐标系下的平移Y坐标/// </summary>public static double ObjectInToolCenterY { get; set; }/// <summary>/// 物体在工具坐标系下的旋转Z坐标/// </summary>public static double ObjectInToolCenterRz { get; set; }/// <summary>/// 计算物体在机器人底座的位置/// </summary>/// <returns>坐标XYR</returns>public static XYR CalculaterObjectInBaseXYR(){Matrix<double> OB = CalculateTransformationMatrix();double r00 = OB.At(0, 0);double r10 = OB.At(1, 0);double Tx = OB.At(0, 3);double Ty = OB.At(1, 3);double Rz = Math.Atan2(r10, r00) * 180 / Math.PI; return new XYR(Tx, Ty, Rz);}/// <summary>/// 矩阵相乘/// </summary>/// <returns>结果矩阵</returns>private static Matrix<double> CalculateTransformationMatrix(){Matrix<double> TW = DenseMatrix.OfArray(new double[,] {{ Math.Cos(ToolCenterInBaseRz*Math.PI/180), -Math.Sin(ToolCenterInBaseRz*Math.PI/180),0, ToolCenterInBaseX},{ Math.Sin(ToolCenterInBaseRz*Math.PI/180), Math.Cos(ToolCenterInBaseRz*Math.PI/180),0 ,ToolCenterInBaseY},{ 0, 0, 1 ,0},{ 0, 0, 0,1 }});Matrix<double> OT = DenseMatrix.OfArray(new double[,] {{ Math.Cos(ObjectInToolCenterRz*Math.PI/180), -Math.Sin(ObjectInToolCenterRz*Math.PI/180), 0,ObjectInToolCenterX},{ Math.Sin(ObjectInToolCenterRz*Math.PI/180), Math.Cos(ObjectInToolCenterRz*Math.PI/180),0, ObjectInToolCenterY},{ 0, 0, 1,0 },{ 0, 0, 0,1 }});return TW * OT;}}/// <summary>/// 记录坐标结果/// </summary>public struct XYR{/// <summary>/// 平移X坐标/// </summary>public double X { get; }/// <summary>/// 平移Y坐标/// </summary>public double Y { get; }/// <summary>/// Z轴旋转角度/// </summary>public double Rotation { get; }/// <summary>/// 构造的时候传入坐标值/// </summary>/// <param name="x">X</param>/// <param name="y">Y</param>/// <param name="rotation">Rz</param>public XYR(double x, double y, double rotation){X = x;Y = y;Rotation = rotation;}}
}

运行验证图上红色ABC坐标系:

  static void Main(string[] args){Position.ToolCenterInBaseX = 6;Position.ToolCenterInBaseY = 8;Position.ToolCenterInBaseRz = -40;Position.ObjectInToolCenterX = 8.8;Position.ObjectInToolCenterY = 9.8;Position.ObjectInToolCenterRz = 150;XYR pos = Position.CalculaterObjectInBaseXYR();Console.WriteLine(pos.X);Console.WriteLine(pos.Y);Console.WriteLine(pos.Rotation);Console.ReadKey();}

结果:
在这里插入图片描述

运行验证图上红色A B’ C坐标系:

static void Main(string[] args){Position.ToolCenterInBaseX = 13;Position.ToolCenterInBaseY = 6;Position.ToolCenterInBaseRz = 0;Position.ObjectInToolCenterX = 6;Position.ObjectInToolCenterY = 4;Position.ObjectInToolCenterRz = 110;XYR pos = Position.CalculaterObjectInBaseXYR();Console.WriteLine(pos.X);Console.WriteLine(pos.Y);Console.WriteLine(pos.Rotation);Console.ReadKey();}

结果:
在这里插入图片描述

结尾发个广告,基于YOLO V8写的软件发布B站了,看到帮忙点个赞,过些天我会发源码给好朋友们!
链接:基于PySide6开发的YOLO V8视觉检测系统

拜了个拜。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/174801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美SEC与贝莱德,对比特币现货ETF申购方式产生分歧!

比特币现货ETF的通过时间是市场投资者密切关注的议题。虽然SEC最近推迟了Hashdex、富兰克林邓普顿&#xff08;Franklin Templeton&#xff09;和GlobalX申请的决议时间&#xff0c;但彭博ETF分析师James Seyffart对明年一月通过的机率持乐观态度&#xff0c;认为其通过的机会能…

Java - Stream Filter 多条件筛选过滤

Java Stream流中Filter用于通过设置的条件过滤出元素 &#xff0c;示例如下&#xff1a; List strings Arrays.asList(“abc”, “”, “bc”, “efg”, “abcd”,"", “jkl”);List filtered strings.stream().filter(string -> !string.isEmpty()).collect(C…

eclipse - jee 建立项目后没有 web.xml

eclipse -- jee 建立项目后没有 web.xml 处理它的方法是&#xff0c;点 File - New - Dynamic Web Project , 此时起一个项目名如M4 然后next 然后next 出现如此所示:

基于springboot实现农机电招平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现农机电招平台系统演示 摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算…

论文阅读:“Model-based teeth reconstruction”

文章目录 AbstractIntroductionTeeth Prior ModelData PreparationParametric Teeth Model Teeth FittingTeeth Boundary Extraction Reference Abstract 近年来&#xff0c;基于图像的人脸重建方法日趋成熟。这些方法可以捕捉整个面部或面部特定区域&#xff08;如头发、眼睛…

CAN总线星型连接器及特点

CAN总线星型连接特点 CAN总线是一种广泛应用于汽车、工业自动化、家庭等领域的现场总线技术。它具有高速度、高可靠性、灵活性等特点&#xff0c;被广泛应用于汽车电子、工业自动化、家庭自动化等领域。在CAN总线的实际应用中&#xff0c;其连接方式可以是星型或菊花型。本文将…

Leetcode—160.相交链表【简单】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—160.相交链表 算法思想 两个链表的节点之和是相等的 如果两个链表相交&#xff0c;那么相交点之后的长度是相同的 我们需要做的事情是&#xff0c;让两个链表从同距离末尾同等距离的位置开始遍历。这个位置只能是较短…

Linux系统编程:文件系统总结

目录和文件 获取文件属性 获取文件属性有如下的系统调用&#xff0c;下面逐个来分析。 stat:通过文件路径获取属性&#xff0c;面对符号链接文件时获取的是所指向的目标文件的属性 从上图中可以看到stat函数接收一个文件的路径字符串&#xff08;你要获取哪个文件的属性&a…

第二十三章 解析PR曲线、ROC曲线、AUC、AP(工具)

混淆矩阵Confusion Matrix 混淆矩阵定义 混淆矩阵是机器学习中总结分类模型预测结果的情形分析表&#xff0c;以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值&#xff0c;矩阵的列表示预测值&#xff0c;下面我…

file_get_contents() 函数详解与使用

概述 在PHP中&#xff0c;file_get_contents() 函数是一个强大的工具&#xff0c;它既可以用于读取本地文件的内容&#xff0c;也可以用于发起 HTTP 请求获取远程资源。本文将详细介绍 file_get_contents() 函数的两种主要用途&#xff0c;并探讨如何充分利用这个函数。 1. 文…

【高效开发工具系列】MapStruct入门使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

数据结构与算法编程题30

层次遍历二叉树(队列&#xff1a;先进先出) #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;BiTNode…

Sringboot3 讲解

文章目录 前言一、Springboot快速入门1.1 实例1.2 总结&#xff1a;1.2.1 什么是starter启动器1.2.2 SpringBootApplication注解的功效 二、springboot3 统一配置文件1.概述2、属性配置文件使用简单案例3、yaml配置介绍和说明4、批量配置文件的读取5、多环境配置和激活 三、spr…

Netty I/O模型和线程模型

目录 1.概述 1.1 为什么使用Netty 1.2 Netty的优势 1.3 Netty的常见使用场景 2.Netty高性能的原因 2.1 I/O模型 2.1.1 阻塞IO 2.1.2 IO复用模型 2.2 线程模型 2.2.1 线程模型1&#xff1a;传统阻塞 I/O 服务模型 2.2.2 线程模型2&#xff1a;Reactor 模式 2.2.2.1 …

Javaweb之Vue组件库Element之Dialog对话框的详细解析

4.3.3 Dialog对话框 4.3.3.1 组件演示 Dialog: 在保留当前页面状态的情况下&#xff0c;告知用户并承载相关操作。其企业开发应用场景示例如下图所示 首先我们需要在ElementUI官方找到Dialog组件&#xff0c;如下图所示&#xff1a; 然后复制如下代码到我们的组件文件的templ…

线程基本方法

1。设置线程名 继承Thread类的线程&#xff0c;可以直接使用.setName()方法&#xff0c;设置线程名。也可以使用构造方法&#xff0c;需要注意java默认不继承构造方法&#xff0c;所以需要自己调用下父类的构造方法。 public class Demo {public static void main(String[…

每日一题:LeetCode-202.快乐数(一点都不快乐)

每日一题系列&#xff08;day 06&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

基于 Python中的深度学习:神经网络与卷积神经网络

当下&#xff0c;深度学习已经成为人工智能研究和应用领域的关键技术之一。作为一个开源的高级编程语言&#xff0c;Python提供了丰富的工具和库&#xff0c;为深度学习的研究和开发提供了便利。本文将深入探究Python中的深度学习&#xff0c;重点聚焦于神经网络与卷积神经网络…

csgo/steam搬砖项目还能不能做,分享玩法思路

饰品市场持续下跌&#xff0c;CSGO搬砖还有搞头吗&#xff1f; CSGO是最具竞争力的第一人称射击游戏。玩这款游戏离不开里面的炫酷配件。Steam搬砖项目是基于CSGO游戏中的配件运动。蒸汽拆砖项目的原理是使用国外Steam平台的充值卡购买国际服务器的配件和设备&#xff0c;然后转…

【C++】继承(下) 单继承 | 多继承 | 菱形继承 | 继承和组合

一、单/多/菱形继承 1.单继承 当一个子类只有一个直接父类时&#xff0c;称这个继承关系为单继承。 2.多继承 一个子类有两个或以上直接父类时称这个继承关系为多继承。 举个实例&#xff1a;新老师进学校工作时&#xff0c;一般会作为助教老师&#xff0c;一边代课教书&am…