大家好,我是小鱼。上几期给大家分享了关于手眼标定的方法,如果还有不清楚如何让进行手眼标定的同学可以参考下面的文章:
机器人手眼标定都能搞不定?快戳,最好用的手眼标定库!!!
很多同学做完了手眼标定之后得到了手眼矩阵,但是不知道怎么用于程序当中去,还有很多同学搞不清楚各个坐标系之间的关系,今天小智就给大家讲讲手眼矩阵的使用问题。
一、手眼矩阵为什么会长的不一样?做完手眼标定,得到的手眼矩阵,有可能会长的不一样,这是因为旋转变换是有很多种表示方法的。
1.旋转的表示方式 1.1三个数字欧拉角(就是欧拉他家的墙角),欧拉角又分角度制和弧度制。通常使用英文:rx,ry,rz表示
1.2四个数字四元数,三个数字的欧拉角表示其实是有奇异性的(后面再和大家讲一讲旋转)所以四元数可以避免这个问题。四元数的常用英文符号:qx,qy,qz,qw
一定要注意四元数的顺序,qw在第一位还是最后一位,小智是吃过亏的。
1.3九个数字的旋转矩阵,使用九个数字表示旋转,是一个3×3的方阵。
2.手眼矩阵=机械臂末端到相机的平移+机械臂的末端到相机的旋转上面小智讲了如何表示旋转,那么手眼矩阵是到底是什么呢?
大家可以知道的是平移变换一定是3个数字,分表表示沿着原来的x,y,z轴进行的平移长度。
所以常见的手眼矩阵有三种表现形式:
2.1欧拉角版 [x,y,z,rx,ry,rz]
[x,y,z,qx,qy,qz,qw]
[
[r11,r12,r13,x],
[r21,r22,r23,y],
[r31,r32,r33,z]
]
为了方便运算,我们在旋转矩阵版本上增加一行[0,0,0,1]构成齐次矩阵,这个也是传说中的齐次矩阵
[
[r11,r12,r13,x],
[r21,r22,r23,y],
[r31,r32,r33,z],
[0, 0, 0, 1]
]
手眼矩阵有了,那么该怎么进行运算呢?
其实我们只需要用到两个运算即可,一个叫做乘法,一个叫做求逆。
1.乘法乘法运算其实就是转换变换:
比如:末端到相机的位姿矩阵表示为Tgc,相机识别到的工件位姿为Tct,那么末端到工件的位姿该如何计算呢?很简单,对他们做乘法运算
-
Tgt = Tgc*Tct
大家放心,一个4x4的矩阵乘以4x4的矩阵,最终结果还是一个4x4的矩阵。
2.求逆求逆运算是最神奇的,求逆其实就是置换坐标系。
已知相机中标记物的坐标系Tcm,那么标记物中相机的坐标系Tmc是多少呢?
其实很简单:
-
Tmc = Tcm.inverse() //就是求个逆即可
逆矩阵也是4X4的,且 Tmc*Tcm=I,I是单位矩阵
秀一波线性代数,回头给大家推荐一本书,讲线性代数的,后台回复线性代数即可获取哈~
C++版本当然推荐小智自己的开源库啦,详细请戳链接:
开源库推荐:C++坐标转换库TransForms3d_Cpp
输入base@grapper、grapper@camera、camera@marker,乘一下就完成了~
这个库有多牛我就不吹了,自己看下代码是多么的流畅
2.Python推荐库
Python版本的推荐的是transforms3d,这个是小智最喜欢的库了,安装使用都很简单,今天太晚了,明天给大家讲解一下。先留个小尾巴~
最后欢迎大家关注小鱼,后期将会有更多机器人相关的干货输出~