ABB机械臂手眼协作--空间点的坐标转换

2023-11-06 10:20

本文主要是介绍ABB机械臂手眼协作--空间点的坐标转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在做钢筋捆扎的机器人,涉及到如何将相机中空间点的坐标转换到机械臂base坐标系下实现捆扎。

场景描述

我们采用eyeInhand的手眼方式,设置ABB机械臂的base坐标系与大地坐标系重合,钢筋捆扎操作面(竖直放置)与机械臂base坐标系的YOZ平面平行。机械臂工作场景示意图如下图

待求问题详细描述

已知空间中一点P,点P在3D点云相机坐标系中的坐标为Pc,拍照点机械臂的位姿为Tbg(x,y,z,q1,q2,q3,q4),手眼标定的结果(相机在机械臂末端法兰坐标系下的位姿)Tgc(x,y,z,q1,q2,q3,q4),会用到中间变量P在机械臂末端法兰坐标系中的坐标记为Pg,求P在机械臂base坐标系下的坐标Pb(x,y,z)。

求解过程中关键点记录

  • 问:ABB机械臂位姿(x,y,z,q1,q2,q3,q4)这7个数的含义?

答:xyz表示机械臂末端法兰中心在机械臂base坐标系下的位置;q1,q2,q3,q4为四元数的形式,表示机械臂base到机械臂末端法兰中心的旋转关系;手眼标定结果同理

  • 问:机械臂位姿中四元数描述的旋转是遵循左手旋转法则顺时针旋转还是遵循右手旋转法则逆时针旋转?(因为旋转方向同坐标旋转矩阵不同,坐标变换的公式不同)

答:机械臂位姿表示中的四元数遵循右手旋转法则为逆时针旋转(空间坐标系的旋转一般都遵循右手法则),手眼标定结果中的四元数也遵循右手法则。

  • 问:四元数表示的坐标系的旋转为顺时针旋转和逆时针旋转时,旋转矩阵和坐标变换分别是什么?有何不同?

答:参考博客https://blog.csdn.net/weixin_44010117/article/details/107207731,和《摄影测量学基础》中的内容如下图,详细还是要去补数学中空间坐标系的旋转空间点的坐标变化,以及四元数,欧拉角,旋转矩阵,坐标变换之间的复杂关系。。。总之有点复杂,,在此暂不一一叙述。。。

问:将ABB机械臂位姿,手眼标定结果转换为变换矩阵并进行坐标变换(Pc-->Pb)python代码实现?

答:如下代码实现将位姿(x,y,z,q1,q2,q3,q4)转为变换矩阵,并将Pc-->Pb

from scipy.spatial.transform import Rotation as R#四元数转旋转矩阵
def get_matrix_quate(x, y, z,q1,q2,q3,q4):Rq = [q2,q3,q4,q1]Rm = R.from_quat(Rq)Rm = Rm.as_matrix()Rm2 = tfs.affines.compose(np.squeeze(np.asarray((x, y, z))), Rm, [1, 1, 1])return Rm2,RmPc=[72.323,171.863,1022.452]
Tgb =[850.08,-64.82,760.68,0.48883,-0.50049,0.46997,-0.53822]
Tcg = [184.324,-261.431,182.170,0.998517,0.012349,-0.038843,0.036090]
#四元数-->旋转矩阵(scipy)
qm_cg,Rmcg = get_matrix_quate(Tcg[0], Tcg[1], Tcg[2], Tcg[3], Tcg[4], Tcg[5], Tcg[6])
qm_gb,Rmgb = get_matrix_quate(Tgb[0],Tgb[1],Tgb[2],Tgb[3],Tgb[4],Tgb[5],Tgb[6])
print('位姿四元数转旋转矩阵:\n',qm_gb)
Pc = Pc+[1]
Pc = np.array(Pc)
Pg = np.dot(qm_cg,Pc)
Pb = np.dot(qm_gb,Pg)
print('Pb:',Pb)

 

这篇关于ABB机械臂手眼协作--空间点的坐标转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/356046

相关文章

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

【高等代数笔记】线性空间(一到四)

3. 线性空间 令 K n : = { ( a 1 , a 2 , . . . , a n ) ∣ a i ∈ K , i = 1 , 2 , . . . , n } \textbf{K}^{n}:=\{(a_{1},a_{2},...,a_{n})|a_{i}\in\textbf{K},i=1,2,...,n\} Kn:={(a1​,a2​,...,an​)∣ai​∈K,i=1,2,...,n

SW - 引入第三方dwg图纸后,修改坐标原点

文章目录 SW - 引入第三方dwg图纸后,修改坐标原点概述笔记设置图纸新原点END SW - 引入第三方dwg图纸后,修改坐标原点 概述 在solidworks中引入第三方的dwg格式图纸后,坐标原点大概率都不合适。 全图自动缩放后,引入的图纸离默认的原点位置差很多。 需要自己重新设置原点位置,才能自动缩放后,在工作区中间显示引入的图纸。 笔记 将dwg图纸拖到SW中

数据流与Bitmap之间相互转换

把获得的数据流转换成一副图片(Bitmap) 其原理就是把获得倒的数据流序列化到内存中,然后经过加工,在把数据从内存中反序列化出来就行了。 难点就是在如何实现加工。因为Bitmap有一个专有的格式,我们常称这个格式为数据头。加工的过程就是要把这个数据头与我们之前获得的数据流合并起来。(也就是要把这个头加入到我们之前获得的数据流的前面)      那么这个头是

win7系统中C盘空间缩水的有效处理方法

一、深度剖析和完美解决   1、 休眠文件 hiberfil.sys :   该文件在C盘根目录为隐藏的系统文件,隐藏的这个hiberfil.sys文件大小正好和自己的物理内存是一致的,当你让电脑进入休眠状态时,Windows 7在关闭系统前将所有的内存内容写入Hiberfil.sys文件。   而后,当你重新打开电脑,操作系统使用Hiberfil.sys把所有信息放回内存,电脑

有关机械硬盘的基础知识

1,机械硬盘的品牌   目前市场中常见的笔记本电脑的机械硬盘品牌主要有希捷、西部数据、三星等。   2,机械硬盘的容量   硬盘容量,即硬盘所能存储的最大数据量。虽然笔记本电脑硬盘的容量会因单位密度的提升而增加,不过和台式电脑的大容量比起来,笔记本电脑硬盘的容量仍然落后许多。笔记本电脑的硬盘除了对磁盘有体积较小和数量较少的要求之外,对功耗、耐用程度、抗震性及成本等的考虑,也让笔记

求空间直线与平面的交点

若直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z): 将直线方程写成参数方程形式,即有: x = m1+ v1 * t y = m2+ v2 * t

[Linux]:环境变量与进程地址空间

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 环境变量 1.1 概念 **环境变量(environment variables)**一般是指在操作系统中用来指定操作系统运行环境的一些参数,具有全局属性,可以被子继承继承下去。 如:我们在编写C/C++代码的时,在链接的时候,我们并不知

【编程底层原理】方法区、永久代和元空间之间的关系

Java虚拟机(JVM)中的内存布局经历了几个版本的变更,其中方法区、永久代和元空间是这些变更中的关键概念。以下是它们之间的关系: 一、方法区: 1、方法区是JVM规范中定义的一个概念,它用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据。 3、它是JVM运行时数据区的一部分,与堆内存一样,是所有线程共享的内存区域。 二、永久代(PermGen): 1、在Java SE 7之前,