- 04/26
- 2022
-
QQ扫一扫
-
Vision小助手
(CMVU)
在视觉技术尚未发展成熟且规模化应用之前,工业领域的自动化实现往往依赖于预编程的机械臂来完成重复机械化的劳动任务。但是随着场景的复杂度提高,预编程设定机械臂工作的模式越来越难以覆盖所有作业的场景,在产线上需要越来越多的人工介入操作机械臂才能完成,由此也产生了大量的人力成本。
因此,近十年来工业上逐渐出现了采用相机拍摄,图像处理的方式引导机械臂去完成各种非结构化场景的任务,由此来解放人工生产力,进一步实现24小时工业自动化的需求。而相机+机械臂的应用组合,我们称之为手眼系统。
一、手眼系统的组成及形式
相机+机械臂组成的手眼系统,如同人的眼睛和手,眼睛看到东西后,让手能够准确的移动到物体的位置并抓取。相机所能看到的图像是2D屏幕,而手的移动是在3D空间中,因此手眼系统的功能就是能够将相机所拍摄到的2D画面,转换为手所在的3D空间的坐标。
常见的手眼系统有两种安装形式:
图a)的安装方式,相机安装在机械臂上,称之为眼在手上(eye in hand);图b)的安装方式,相机固定在机械臂之外的安装架上,称之为眼在手外(eye to hand)。
无论是眼在手上还是眼在手外,本质上都是将相机图像中的像素坐标系,转换到机械臂所在的空间坐标系中。
手眼系统标定的意义就是找到从相机画面的像素坐标系转换到机械臂所在的三维空间的机械臂坐标系的变换过程,从而实现通过像素坐标以及到目标的距离可以准确的求解目标在机械臂坐标空间的三维坐标。
其中转换过程可以分为相机部分和机械臂部分,
相机部分包含:
· 像素坐标系;
· 图像坐标系;
· 相机坐标系;
机械臂部分包含:
· 基座坐标系;
· 末端坐标系;
· 夹具/工具坐标系;
由于相机部分的坐标转换具备相同的规律和方法,而机械臂坐标根据使用夹具/工具的不同可能会有不同的结果,所以我们在做手眼标定时,往往标定的是相机到机械臂末端(法兰盘)的变换关系,机械臂末端的坐标是可以直接读取并且保证精度。
我们接下来描述的机器人坐标都认为是机械臂末端法兰盘的坐标,机械臂基座坐标系、工具坐标系转换的这一部分通常由机器人集成商来完成,对于视觉应用我们先不讨论机器人坐标部分,我们先只关注相机部分。
所以,我们先来分析手眼系统中相机相关的坐标系概念与转换关系。
二、常见的相机模型
在讨论坐标系之前,我们先来了解一下相机模型。手眼系统的眼完成将二维平面(单位像素)映射到三维世界中的坐标点(单位为米),这个过程可以用一个相机模型来描述:
相机模型通常分为两类,一类是针孔模型,一类是鱼眼模型。
针孔模型:也叫小孔成像模型,是基于相机透镜畸变较小的情况下,物体的反射光经过透镜折射到图像传感器上,物和像之间的位置关系满足相似三角形的关系,即物体表面的坐标点和图像坐标点经过透镜后坐标之间为线性关系。
鱼眼模型:鱼眼镜头通常由多个不同的透镜组成,入射光经过多次折射投影到图像传感器上,鱼眼镜头因此可以获得更大范围的视角。因为多透镜的组合,鱼眼成像模型较为复杂,但是可以近似为单位球面的投影模型。
三、相机相关的坐标系
工业相机通常畸变程度较小,我们可以用针孔模型来计算,因此,按照针孔模型的小孔成像原理,手眼系统所涉及的相机各个坐标系表示如下图:
图中涉及到以下四个坐标系
uv:像素坐标系,原点为图像左上角,单位pixel
o-xy:图像坐标系,基于相机中感光元器件的现实平面空间,原点为成像平面中点,单位mm
Oc-XcYcZc:相机坐标系,光心为原点,单位m
Or-XrYrZr: 机器人坐标系,描述机械臂移动的位置,单位m
P:机器人坐标系中的一点,表示识别目标在机械臂三维空间中的位置
p:点p在图像中的成像点,在图像坐标系中的坐标为(x,y),在像素坐标系中的坐标为(u,v)
像素坐标系转换为图像坐标系
其中,O-uv是像素坐标系,O-xy是图像坐标系,要完成从pixel量纲到mm量纲的转换,就需要知道xy方向的像素尺寸dx和dy,单位mm,表示一个像素点的在传感器上的实际尺寸大小。设图像分辨率为1280x960,传感器尺寸为32mmx24mm,转换关系:
图像坐标系转换为相机坐标系
点p是图像坐标系上的一点,P是相机坐标系上的一点,f是相机焦距,O到Oc也就是传感器到光心的距离。由相似三角形可以计算:
Zc表示相机距离目标的距离,可以通过3D相机直接获取,因此可以转换为二维平面上的坐标计算。
相机坐标系转换为机器人坐标系
之所以是用Rz的逆矩阵表示,是因为诸如opencv的函数以及学术论文讨论,都是以机器人坐标系到像素坐标系的旋转矩阵作为R,这里我们是以像素坐标系到机器人坐标系变换来讨论,因此用Rz的逆矩阵来表示:
这里用-T表示是为了和Opencv的输出的tvecs区分,opencv输出平移矩阵是从机器人坐标系到像素坐标系,记为T。我们计算从像素坐标系到机器人坐标系时取反运算即可,记为-T
即:
最终变换
根据n元一次方程的求解要求,必须提供6组以上的非线性解才能确定方程的唯一系数。
因此,在求解过程中,至少需要机械臂移动6个非线性点,才能完全确定3D空间内像素坐标系到机器人坐标系的变换关系。
如果是2D平面,相当于去掉yaw和z的偏移,有4个未知量的线性方程,则需要至少4个点。
其实到这里,根据以上理论编码求解方程就能够实现求解。由于上述方程比较复杂,求解不是简单的事情,对于工程师来说没有必要把理论实践一遍,opencv已经给我们提供了封装好的接口,我们可以基于封装好的轮子快速得到我们需要的结果。
上面我们分析的是从像素坐标到机器人坐标的转换,但是在opencv提供的方法往往是按照机器人坐标(世界坐标系)到像素坐标转换的公式计算,得到的矩阵如下:
因此当我们使用opencv得到内参和外参矩阵时,还需要求解它的逆矩阵,才能通过像素坐标转换为机器人坐标。从上述分析已经知道了内参矩阵的逆矩阵,而至于外参矩阵,由于其本身是一个正交矩阵,所以,转置矩阵也是他的逆矩阵,我们只需要把opencv计算得到的外参矩阵转置即可,感兴趣的小伙伴可以自己去验证一下。
关于旋转角:以上得到的结果是按照x-roll,y-pitch,z-yaw来计算的,如果坐标系位置和定义关系不同,只需要把角度替换即可。如,上述我们定义绕y轴转是pitch,绕z转是yaw,如果你自己的坐标系定义是绕y转是yaw,绕x轴转是pitch,绕z轴旋转是roll,那么矩阵的[0][0]元素相应的变为cos(yaw)cos(roll),也就是矩阵的第一个元素是绕y轴旋转和绕z轴旋转角度的三角函数乘积,这一点是不变的。
三、相机畸变的两大类
前面分析的坐标变换都是没有考虑畸变的,各个坐标系之间满足线性变换,但实际上,相机镜头由于镜面曲率的关系导致放大率并一定是均匀的,所以相机在成像过程中会存在一定的畸变,相机的畸变通常分为两类:
径向畸变,通常因为镜头表面曲率不同产生的畸变,这种畸变是对称的。径向畸变根据放大率的不同又分为两类:
· 枕形畸变,视野中边缘区域的放大率远大于中心区域的放大率,常见于远摄摄像头(下图左)
· 桶形畸变,视野中中心区域的放大率远大于边缘区域的放大率,常见于广角摄像头和鱼眼摄像头(下图右)
切向畸变,通常是因为相机装配过程,透镜平面和CCD/CMOS传感器平面没有平行,这种畸变不对称,在图像区域表现为单侧畸变,类似透视畸变。
在相机中,比较常见的畸变类型为桶形畸变和切向畸变。
四、桶形畸变矫正
根据前面讨论,我们把手眼系统的相机坐标系看做小孔成像模型,认为他们坐标系之间满足线性变换的关系。但是由于畸变的存在,从相机坐标系到图像坐标系之间不满足线性关系,因此为了能够应用小孔成像模型对坐标系之间进行线性变换的计算,我们需要对相机成像后的图像坐标进行畸变矫正。
矫正的计算公式可以简化为(推导过程不赘述,感兴趣的可以自行查阅资料):
五、切向畸变矫正
切向畸变计算公式
总的畸变矫正公式为:
把畸变考虑进来,和前面线性变换的公式组合起来,一个相机系统从像素坐标到机器人的坐标变换过程。
· 畸变像素坐标->畸变图像坐标,参与计算的参数:(u,v)畸变像素坐标,内参矩阵;
· 畸变图像坐标->无畸变图像坐标,参与计算的计算参数:畸变系数;
· 无畸变图像坐标->相机坐标,参与计算的计算参数:Zc相机到目标的高度;
· 相机坐标->机器人坐标,参与计算的计算参数:旋转平移矩阵RT;
把畸变计算公式和坐标系变换公式合并:
六、Final
到这里我们详细了解了手眼系统的相机部分坐标变换过程,各个坐标系的理论计算,以及畸变矫正的理论计算,并且结合opencv初步展示了理论计算与实际工程如何去结合使用,通过计算我们了解到,在坐标系变换过程中产生了两个矩阵参数,分别是内参矩阵和外参矩阵,内参矩阵只与相机的内部构造和参数有关,外参矩阵只与相机、机械臂的安装位姿有关。
在手眼系统中计算求解相机内参、外参矩阵的过程我们称之为相机标定,当我们得到这两个矩阵参数时,就可以按照线性方程的格式通过像素坐标求解机械臂坐标。
虽然说网上存在很多的资料推导讲解,当然,这都是理论部分,准备哪些已知量,如何准备,得到之后如何按照理论公式计算,这是工程应用中需要真正解决的问题。很多资料并没有系统的讲解这些问题,这让很多人在明白理论后仍然无法下手去实践应用手眼标定。所以后续会根据眼在手上、眼在手外这两种安装方式,讨论手眼标定的实践方式以及工程实现。