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

** 以下只针对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,一经查实,立即删除!

相关文章

QContextMenuEvent 是 Qt 框架中的一个类,用于表示上下文菜单事件

QContextMenuEvent 是 Qt 框架中的一个类&#xff0c;用于表示上下文菜单事件。 上下文菜单事件&#xff08;Context Menu Event&#xff09;在用户右击部件时触发&#xff0c;通常用于显示上下文菜单。这些菜单可以包含与所选部件相关的操作和选项。 QContextMenuEvent 类提…

C语言重点编程题——1-10

目录 1.编一个程序,输入10个整数,统计并输出其中正数、负数和零的个数。 2.编程序,按下列公式计算e的值(精度为1e-6)e=1+1/1!+1/2!+1/3!.......1/n! 3.编程,输入n个整数,求这n个数的偶数平均值,并输出。 4.若一个3位整数的各位数字的立方和等于这个整数,则称之为“水…

美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…

Java编译过程中的JVM

流程 源代码编写&#xff1a; 首先&#xff0c;开发者使用Java编程语言编写源代码。这些源代码通常保存在扩展名为.java的文件中。 编译源代码&#xff1a; 使用Java编译器&#xff08;例如javac&#xff09;&#xff0c;这些.java文件被编译成Java字节码。字节码是一种中间形…

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;如头发、眼睛…

HarmonyOS共享包以及跨模块引用

跨模块引用文件时遇到了一个问题&#xff1a; Importing ArkTS files to JS and TS files is not allowed. <ArkTSCheck>参照官方文档使用&#xff1a;Index.ets作为导出配置文件&#xff0c;在另一个库中使用遇到此问题 重读官方文档得到解决方法&#xff1a;重新创建:…

CAN总线星型连接器及特点

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

Android WMS——客户端输入事件处理(十九)

前面的文章我们介绍了 WMS 中的输入服务的启动及事件处理,这一篇我们来看一下客户端对输入事件的处理。 一、事件初始化 事件的初始化就是在添加窗口的过程。 1、ViewRootImpl 源码位置:/frameworks/base/core/java/android/view/ViewRootImpl.java public void setView(…

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

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

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

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

并行查询的超时时间设置

众所周知&#xff0c;并行查询可以提高程序运行效率。主线程需要等待所有子线程把数据查询出结果&#xff0c;如果没有设置超时时间&#xff0c;就需要主线程就会一直阻塞到那里&#xff0c;从而占用服务器资源&#xff0c;那么如何设置超时时间呢? 1.在SpringBoot项目中引入线…

第二十三章 解析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. 文…

selenium报错:element not interact

文章目录 报错分析解决办法 报错分析 报错&#xff1a; selenium.common.exceptions.ElementNotInteractableException: Message: element not interactableElementNotInteractableException异常表示无法与元素交互&#xff0c;通常是由于该元素不可见、被其他元素遮挡或者需…

【高效开发工具系列】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…