精华内容
下载资源
问答
  • 在航天领域的交会对接以及视觉SLAM(Simultaneous Localization and Mapping)项目中,都需要利用视觉成像技术来获取目标物与相机系统的位姿关系,而解算位姿需要得到目标体的特征点与相机系统的距离信息[1]。...

    在航天领域的交会对接以及视觉SLAM(Simultaneous Localization and Mapping)项目中,都需要利用视觉成像技术来获取目标物与相机系统的位姿关系,而解算位姿需要得到目标体的特征点与相机系统的距离信息[1]。目前,位姿测量时探测系统与目标物体的距离主要采用双目视觉和RGB-D两种方法[2-3]。双目视觉中是利用两台高分辨率相机形成的视差来估计目标到相机系统的距离,由于需要知道同一个目标点在两个相机成像的对应关系,计算量非常大,两台相机也使得体积变大。RGB-D相机向探测目标发出主动光,通过回波强度来计算距离。TOF(Time of Flight)相机利用飞行时间法原理测算距离,因其具有速度快、体积小、精度高、抗干扰性强的特性[4],受到人们关注。近年来,随着光敏感器技术的提高,利用TOF相机探测距离解算位姿优势愈加明显。

    徐文福[5]等人提出了立体视觉的非合作目标自主识别与位姿测量方法,利用双目视觉模型提取目标特征并进行3D重构,进一步计算位姿,此双目视觉系统体积大,计算量大。张旭东[6]等人提出了基于PMD相机的跟踪目标方法,利用深度相机直接提取深度信息,然后在图像中提取目标特征,实时计算目标的位姿,但是只进行了近距离实验,应用仍然受到限制。

    因此,本文设计了一套嵌入式TOF原理样机,该相机体积小,在实际应用时显得轻巧,而且采纳激光雷达作为主动光源能进行远距离测距并成像。利用此TOF相机对特定的合作靶标进行识别,计算靶标形心的三维坐标,并解算目标物体的位姿,验证激光雷达TOF相机在交会对接和SLAM中的可行性。

    1 系统总体设计

    1.1 系统结构与硬件组成

    本文设计的嵌入式TOF相机系统由靶标、TOF相机、电源和计算机组成。在实验室条件下将靶标设计为黑色图形,共计4个,组成“L”形状。常见的TOF相机是采用LED作为驱动光源,而本设计使用的TOF相机利用激光作为驱动光源,可以探测更远的距离。TOF相机可以工作在两种模式下,在灰度模式下时,与普通相机一样,接收被动光源成像即为灰度图;也可以在深度模式下,利用激光发出的主动光源直接获取深度数据,将数据按照图像矩阵排列即形成深度图,图像分辨率是320×240。采用24 V稳压电源给相机供电。而TOF相机模块内部含有嵌入ARM板,此芯片上安装Linux操作系统,接收上位机的指令后将图像数据通过网线传给计算机。系统总体框图如图1所示。

    ad38617e4f1c5b8acf1eb2ef4cd900e3.gif

    1.2 系统软件设计

    本文的系统软件是基于QT5.9.4开发的一个应用程序,程序主要包括获取TOF相机灰度和深度图像的驱动,图像数据处理,靶标的识别、匹配和位姿解算的算法,数据显示等。此外,为了方便调试算法,直接将灰度图和深度图显示在上位机界面上,可查看每个像素的深度值。

    为了描述靶标P的位置信息,需要确定坐标系,用 (X,Y,Z)表示出来。本文用到两个坐标系来描述靶标的位置信息,一个是物体坐标系Oc-XcYcZc,即目标物体的本体坐标系,原点设在目标物上;另一个是相机坐标系Oo-XoYoZo,即观察坐标系,原点设在相机的焦点上。坐标系如图2所示。

    f3d1fd0e2eb5cccf3405d45660cdc0e7.gif

    在解算位姿之前,需要先确定相机的内参数与畸变参数,这就要求相机标定。

    本文TOF相机在工作模式下,会交替给上位机传送灰度图和深度图。获取图像数据后,求解目标物体的位姿数据主要包括3个步骤。

    (1)靶标识别:对相机采集到的灰度图像进行畸变校正、降噪处理,利用阈值算法从灰度图中筛选靶标,提取靶标形心坐标,同时也从深度图中提取形心的深度信息。

    (2)靶标匹配:利用相机的内参矩阵、靶标形心的坐标和深度值,计算相机坐标系下靶标的三维坐标值,并求出靶标的相对距离矩阵。计算物体坐标系下相对矩阵。将两组相对距离矩阵作为匹配算法的输出,利用确定性退火算法找到靶标两个坐标系下的靶标序号对。

    (3)位姿计算:把正确匹配的靶标序号对应的三维坐标值作为输入,利用SVD算法,可以求出两个坐标系的旋转矩阵R和位移向量t。

    位姿测量的总体框图如图3所示。

    4c8726211ff6f68b38012c7c27b657cd.gif

    2 位姿测量系统原理与算法

    在位姿测量嵌入式系统中,从TOF相机获取图像矩阵后,最重要的是图像的算法处理,主要包括目标识别、靶标匹配和位姿解算。

    2.1 目标识别

    本文利用灰度图对靶标识别与筛选,并用靶标形心坐标去深度图像提取距离值,进一步计算靶标点的三维坐标。计算三维坐标点需要知道相机的参数矩阵和畸变参数,因此要标定相机。

    2.1.1 相机标定

    使用针孔模型来描述相机成像,以相机光轴作为Z方向,目标物在像平面形成的像与目标物成相似关系,但由于透镜的存在致使图像会产生畸变,即成像点偏离针孔模型下的投影点。

    相机参数矩阵包括焦距和主点坐标,当知道目标点P在像平面的坐标(u,v)时,就利用式(1)推导出三维点坐标。参数矩阵方程如下所示:

    式中,K为相机的参数矩阵,P(X,Y,Z)为相机观察坐标系下实际物体的坐标,fx、fy分别为x轴和y轴方向的焦距,cx、cy是相平面主点坐标。

    由透镜形状引起的畸变是径向畸变,因相机安装时镜头与成像敏感期不平行会引起切向畸变。这些畸变在数学上可以用多项式函数来表示,如式(2)所示,k1、k2、k3描述径向畸变,p1、p2描述切向畸变。当确定畸变参数,就可以对图像进行畸变校正。

    式中,x、y为畸变前的坐标点,xd、yd是畸变后的坐标点,r表示离图像中心点的距离。

    为了确定这些参数,本文用TOF相机在灰度模式下对黑白棋格标定板拍摄多幅图片,然后利用MATLAB的图像标定库函数得到相机的内参数。

    2.1.2 靶标识别

    本文采用TOF相机拍摄的灰度图来识别靶标。为了在实验室条件下更容易识别出靶标,选用具有漫反射特性材质的靶标,表面涂黑,靶标背景板颜色为白色,这样做的好处是提高了深度数据的准确性。

    先通过畸变矫正消除畸变带来的影响。对矫正过图像矩阵用5×5的LOG滤波卷积核做卷积,既对采集的灰度图像进行了降噪,又提高了图像的对比度,利于筛选靶标。经过二值化并统计连通域,对疑似靶标标签化,设计数据结构存储疑似的像平面下坐标点,根据区域靶标的成像大小以及圆心率进一步筛选存储的疑似靶标。对于TOF相机采集到的深度图像运用递归时域中值法得到的深度值更具稳定性,如式(3)所示:

    式中,dk(u,v)表示第k帧深度图在像素坐标(u,v)的深度值。

    2.2 靶标匹配

    确定性退火算法是Rose博士于1990年首次提出的,该算法将极小化问题看作是能量极小化状态,当系统达到平衡态时,所设定的自由能函数达到极小[7]。本文利用确定性退火算法来解决靶标匹配问题。

    在物体坐标系下,靶标坐标为C(X,Y,Z),则相对距离矩阵为C_relative。在相机坐标系下,疑似靶标的三维坐标O=(X,Y,Z),相对距离矩阵O_relative。

    式中,Ci、Cj表示靶标在物体坐标系下的坐标,Oi、Oj表示靶标在相机坐标系下的坐标。

    于是计算得到两组三维坐标相对距离矩阵,而两组三维坐标构成两个集合。给定初始状态,将三维坐标相对距离矩阵嵌入到退火算法中,在自由能函数中引入相对距离差(C_relativeij-O_relativeij),通过最小化自由能函数得到两个坐标系下靶标匹配序号,存储到匹配成功变量中[8]

    靶标匹配的过程中,为了避免匹配时间过长,需要设定两个参数作为终止条件。一个是退火的迭代次数,另一个是退火算法中条件概率矩阵二范数的变化量。当条件概率二范数的变化量小于0.001时,认为匹配过程结束,退出迭代过程。

    2.3 位姿解算

    待求解的位姿数据实际上是两个坐标系的平移和旋转,可通过旋转矩阵R(3×3)和平移向量t(1×3)来表示。为了直观地表示姿态,将旋转矩阵转化为欧拉角。从靶标匹配中计算的序号对中,得到两组来自不同坐标系的三维坐标集合。同一点P坐标系Oc-XcYcZc下的三维坐标定义为p,坐标系Oo-XoYoZo下的三维坐标定义为q,那么:

    71b00b758debe876b4487ef47c9ea1eb.gif

    式中,xi表示靶标在物体坐标系下的中心向量,yi表示靶标在相机坐标系下的中心向量。中心向量矩阵X=(x1,x2,…,xn),中心向量矩阵 Y=(y1,y2,…,yn),W是由wi组成的对角矩阵,有:

    cee51b3189607ee72af41526468d6ef4.gif

    3 系统测试结果

    在实验中,采用固定相机、移动靶标的测量方法。旋转平台有6自由度,位置精度是0.01 mm,角度精度为0.01°。测量时,只保持一个自由度的变化,对平移距离的实验结果见表1,对旋转角度的实验结果见表2,位姿数据是在距离目标5 m左右测量得出的。

    a9732959d1e9fd089b694ef61c40897d.gif3c840acb23ceab36a9f6e2ad7b9ed256.gif

    从实验结果可以看出,平移误差精度在0.6%误差水平,角度误差在0.13°内,尤其在远距离(5 m以外)测量时,仍然达到较高的精度。

    在调试过程中,在上位机界面中,可以对TOF相机手动设置参数,同时显示灰度图和深度图,并给出目标位姿信息,如图4所示。

    d9a42140d24fe0992c8cea2ad5ff1aaa.gif

    4 结论

    本文基于一套基于TOF相机的嵌入式系统,设计了特定的合作靶标,利用相机拍摄的灰度图识别靶标,提取靶标形心,利用相机拍摄的深度图来获取靶标的三维坐标信息,完成了目标物的识别及其位姿解算,验证了激光雷达作为驱动光源的TOF 相机在交会对接的可行性与可靠性。

    为了提高计算速度与精确度,需要进一步研究深度图识别、卡尔曼滤波跟踪等方法。

    参考文献

    [1] 初广丽,王延杰,邸男,等.复杂场景中航天器靶标的快速识别[J].光学精密工程,2016,24(4):865-872.

    [2] 徐培智,徐贵力,王彪,等.基于立体视觉的非合作目标位姿测量[J].计算机与现代化,2013(8):85-91.

    [3] 时建奇,许林.基于PMD相机的位姿测量方法研究[J].电脑知识与技术,2016,12(10):269-271.

    [4] 梁斌,何英,邹瑜,等.ToF相机在空间非合作目标近距离测量中的应用[J].宇航学报,2016,37(9):1080-1088.

    [5] 徐文福,刘宇,梁斌,等.非合作航天器的相对位姿测量[J].光学精密工程,2009,17(7):1570-1581.

    [6] 张旭东,李文龙,胡良梅,等.基于PMD相机的特征跟踪位姿测量方法[J].电子测量与仪器学报,2013,27(7):640-646.

    [7] 孙冬梅,裘正定.基于确定性退火技术的鲁棒性的点匹配算法[J].计算机学报,2002,25(6):606-611.

    [8] CHRISTIAN J A,ROBINSON S B,D′SOUZA C N,et al.Cooperative relative navigation of spacecraft using flash light detection and ranging sensors[J].Journal of Guidance Control & Dynamics,2014,37(2):452-465.

    [9] SORKINE O.Least-squares rigid motion using SVD[Z].Technical notes,2009.

    作者信息:

    赵树磊,刘敬猛,张 慧,吕志宇

    (北京航空航天大学 自动化与电气工程学院,北京100083)

    展开全文
  • 在航天领域的交会对接以及视觉SLAM(Simultaneous Localization and Mapping)项目中,都需要利用视觉成像技术来获取目标物与相机系统的位姿关系,而解算位姿需要得到目标体的特征点与相机系统的距离信息[1]。...

    在航天领域的交会对接以及视觉SLAM(Simultaneous Localization and Mapping)项目中,都需要利用视觉成像技术来获取目标物与相机系统的位姿关系,而解算位姿需要得到目标体的特征点与相机系统的距离信息[1]。目前,位姿测量时探测系统与目标物体的距离主要采用双目视觉和RGB-D两种方法[2-3]。双目视觉中是利用两台高分辨率相机形成的视差来估计目标到相机系统的距离,由于需要知道同一个目标点在两个相机成像的对应关系,计算量非常大,两台相机也使得体积变大。RGB-D相机向探测目标发出主动光,通过回波强度来计算距离。TOF(Time of Flight)相机利用飞行时间法原理测算距离,因其具有速度快、体积小、精度高、抗干扰性强的特性[4],受到人们关注。近年来,随着光敏感器技术的提高,利用TOF相机探测距离解算位姿优势愈加明显。

    徐文福[5]等人提出了立体视觉的非合作目标自主识别与位姿测量方法,利用双目视觉模型提取目标特征并进行3D重构,进一步计算位姿,此双目视觉系统体积大,计算量大。张旭东[6]等人提出了基于PMD相机的跟踪目标方法,利用深度相机直接提取深度信息,然后在图像中提取目标特征,实时计算目标的位姿,但是只进行了近距离实验,应用仍然受到限制。

    因此,本文设计了一套嵌入式TOF原理样机,该相机体积小,在实际应用时显得轻巧,而且采纳激光雷达作为主动光源能进行远距离测距并成像。利用此TOF相机对特定的合作靶标进行识别,计算靶标形心的三维坐标,并解算目标物体的位姿,验证激光雷达TOF相机在交会对接和SLAM中的可行性。

    1 系统总体设计

    1.1 系统结构与硬件组成

    本文设计的嵌入式TOF相机系统由靶标、TOF相机、电源和计算机组成。在实验室条件下将靶标设计为黑色图形,共计4个,组成“L”形状。常见的TOF相机是采用LED作为驱动光源,而本设计使用的TOF相机利用激光作为驱动光源,可以探测更远的距离。TOF相机可以工作在两种模式下,在灰度模式下时,与普通相机一样,接收被动光源成像即为灰度图;也可以在深度模式下,利用激光发出的主动光源直接获取深度数据,将数据按照图像矩阵排列即形成深度图,图像分辨率是320×240。采用24 V稳压电源给相机供电。而TOF相机模块内部含有嵌入ARM板,此芯片上安装Linux操作系统,接收上位机的指令后将图像数据通过网线传给计算机。系统总体框图如图1所示。

    3aea725ef410fd3ff036b1c767bb61ea.gif

    1.2 系统软件设计

    本文的系统软件是基于QT5.9.4开发的一个应用程序,程序主要包括获取TOF相机灰度和深度图像的驱动,图像数据处理,靶标的识别、匹配和位姿解算的算法,数据显示等。此外,为了方便调试算法,直接将灰度图和深度图显示在上位机界面上,可查看每个像素的深度值。

    为了描述靶标P的位置信息,需要确定坐标系,用 (X,Y,Z)表示出来。本文用到两个坐标系来描述靶标的位置信息,一个是物体坐标系Oc-XcYcZc,即目标物体的本体坐标系,原点设在目标物上;另一个是相机坐标系Oo-XoYoZo,即观察坐标系,原点设在相机的焦点上。坐标系如图2所示。

    3fbd122cdf64ed685646ee4ed01ee455.gif

    在解算位姿之前,需要先确定相机的内参数与畸变参数,这就要求相机标定。

    本文TOF相机在工作模式下,会交替给上位机传送灰度图和深度图。获取图像数据后,求解目标物体的位姿数据主要包括3个步骤。

    (1)靶标识别:对相机采集到的灰度图像进行畸变校正、降噪处理,利用阈值算法从灰度图中筛选靶标,提取靶标形心坐标,同时也从深度图中提取形心的深度信息。

    (2)靶标匹配:利用相机的内参矩阵、靶标形心的坐标和深度值,计算相机坐标系下靶标的三维坐标值,并求出靶标的相对距离矩阵。计算物体坐标系下相对矩阵。将两组相对距离矩阵作为匹配算法的输出,利用确定性退火算法找到靶标两个坐标系下的靶标序号对。

    (3)位姿计算:把正确匹配的靶标序号对应的三维坐标值作为输入,利用SVD算法,可以求出两个坐标系的旋转矩阵R和位移向量t。

    位姿测量的总体框图如图3所示。

    25be47943f8cd2c977edef1deaedbb32.gif

    2 位姿测量系统原理与算法

    在位姿测量嵌入式系统中,从TOF相机获取图像矩阵后,最重要的是图像的算法处理,主要包括目标识别、靶标匹配和位姿解算。

    2.1 目标识别

    本文利用灰度图对靶标识别与筛选,并用靶标形心坐标去深度图像提取距离值,进一步计算靶标点的三维坐标。计算三维坐标点需要知道相机的参数矩阵和畸变参数,因此要标定相机。

    2.1.1 相机标定

    使用针孔模型来描述相机成像,以相机光轴作为Z方向,目标物在像平面形成的像与目标物成相似关系,但由于透镜的存在致使图像会产生畸变,即成像点偏离针孔模型下的投影点。

    相机参数矩阵包括焦距和主点坐标,当知道目标点P在像平面的坐标(u,v)时,就利用式(1)推导出三维点坐标。参数矩阵方程如下所示:

    式中,K为相机的参数矩阵,P(X,Y,Z)为相机观察坐标系下实际物体的坐标,fx、fy分别为x轴和y轴方向的焦距,cx、cy是相平面主点坐标。

    由透镜形状引起的畸变是径向畸变,因相机安装时镜头与成像敏感期不平行会引起切向畸变。这些畸变在数学上可以用多项式函数来表示,如式(2)所示,k1、k2、k3描述径向畸变,p1、p2描述切向畸变。当确定畸变参数,就可以对图像进行畸变校正。

    式中,x、y为畸变前的坐标点,xd、yd是畸变后的坐标点,r表示离图像中心点的距离。

    为了确定这些参数,本文用TOF相机在灰度模式下对黑白棋格标定板拍摄多幅图片,然后利用MATLAB的图像标定库函数得到相机的内参数。

    2.1.2 靶标识别

    本文采用TOF相机拍摄的灰度图来识别靶标。为了在实验室条件下更容易识别出靶标,选用具有漫反射特性材质的靶标,表面涂黑,靶标背景板颜色为白色,这样做的好处是提高了深度数据的准确性。

    先通过畸变矫正消除畸变带来的影响。对矫正过图像矩阵用5×5的LOG滤波卷积核做卷积,既对采集的灰度图像进行了降噪,又提高了图像的对比度,利于筛选靶标。经过二值化并统计连通域,对疑似靶标标签化,设计数据结构存储疑似的像平面下坐标点,根据区域靶标的成像大小以及圆心率进一步筛选存储的疑似靶标。对于TOF相机采集到的深度图像运用递归时域中值法得到的深度值更具稳定性,如式(3)所示:

    式中,dk(u,v)表示第k帧深度图在像素坐标(u,v)的深度值。

    2.2 靶标匹配

    确定性退火算法是Rose博士于1990年首次提出的,该算法将极小化问题看作是能量极小化状态,当系统达到平衡态时,所设定的自由能函数达到极小[7]。本文利用确定性退火算法来解决靶标匹配问题。

    在物体坐标系下,靶标坐标为C(X,Y,Z),则相对距离矩阵为C_relative。在相机坐标系下,疑似靶标的三维坐标O=(X,Y,Z),相对距离矩阵O_relative。

    式中,Ci、Cj表示靶标在物体坐标系下的坐标,Oi、Oj表示靶标在相机坐标系下的坐标。

    于是计算得到两组三维坐标相对距离矩阵,而两组三维坐标构成两个集合。给定初始状态,将三维坐标相对距离矩阵嵌入到退火算法中,在自由能函数中引入相对距离差(C_relativeij-O_relativeij),通过最小化自由能函数得到两个坐标系下靶标匹配序号,存储到匹配成功变量中[8]

    靶标匹配的过程中,为了避免匹配时间过长,需要设定两个参数作为终止条件。一个是退火的迭代次数,另一个是退火算法中条件概率矩阵二范数的变化量。当条件概率二范数的变化量小于0.001时,认为匹配过程结束,退出迭代过程。

    2.3 位姿解算

    待求解的位姿数据实际上是两个坐标系的平移和旋转,可通过旋转矩阵R(3×3)和平移向量t(1×3)来表示。为了直观地表示姿态,将旋转矩阵转化为欧拉角。从靶标匹配中计算的序号对中,得到两组来自不同坐标系的三维坐标集合。同一点P坐标系Oc-XcYcZc下的三维坐标定义为p,坐标系Oo-XoYoZo下的三维坐标定义为q,那么:

    d8614b51c25fbf060b8ab84e83d6d715.gif

    式中,xi表示靶标在物体坐标系下的中心向量,yi表示靶标在相机坐标系下的中心向量。中心向量矩阵X=(x1,x2,…,xn),中心向量矩阵 Y=(y1,y2,…,yn),W是由wi组成的对角矩阵,有:

    d12cb301a9a66ac25d4f86a9f8ef97a2.gif

    3 系统测试结果

    在实验中,采用固定相机、移动靶标的测量方法。旋转平台有6自由度,位置精度是0.01 mm,角度精度为0.01°。测量时,只保持一个自由度的变化,对平移距离的实验结果见表1,对旋转角度的实验结果见表2,位姿数据是在距离目标5 m左右测量得出的。

    33308f5066de2caac980ff70a5e53e92.gif0c7f169f80bc9f30037f1562ac288d60.gif

    从实验结果可以看出,平移误差精度在0.6%误差水平,角度误差在0.13°内,尤其在远距离(5 m以外)测量时,仍然达到较高的精度。

    在调试过程中,在上位机界面中,可以对TOF相机手动设置参数,同时显示灰度图和深度图,并给出目标位姿信息,如图4所示。

    7a86ec553698a7d9e6dd64f6cef4cf04.gif

    4 结论

    本文基于一套基于TOF相机的嵌入式系统,设计了特定的合作靶标,利用相机拍摄的灰度图识别靶标,提取靶标形心,利用相机拍摄的深度图来获取靶标的三维坐标信息,完成了目标物的识别及其位姿解算,验证了激光雷达作为驱动光源的TOF 相机在交会对接的可行性与可靠性。

    为了提高计算速度与精确度,需要进一步研究深度图识别、卡尔曼滤波跟踪等方法。

    参考文献

    [1] 初广丽,王延杰,邸男,等.复杂场景中航天器靶标的快速识别[J].光学精密工程,2016,24(4):865-872.

    [2] 徐培智,徐贵力,王彪,等.基于立体视觉的非合作目标位姿测量[J].计算机与现代化,2013(8):85-91.

    [3] 时建奇,许林.基于PMD相机的位姿测量方法研究[J].电脑知识与技术,2016,12(10):269-271.

    [4] 梁斌,何英,邹瑜,等.ToF相机在空间非合作目标近距离测量中的应用[J].宇航学报,2016,37(9):1080-1088.

    [5] 徐文福,刘宇,梁斌,等.非合作航天器的相对位姿测量[J].光学精密工程,2009,17(7):1570-1581.

    [6] 张旭东,李文龙,胡良梅,等.基于PMD相机的特征跟踪位姿测量方法[J].电子测量与仪器学报,2013,27(7):640-646.

    [7] 孙冬梅,裘正定.基于确定性退火技术的鲁棒性的点匹配算法[J].计算机学报,2002,25(6):606-611.

    [8] CHRISTIAN J A,ROBINSON S B,D′SOUZA C N,et al.Cooperative relative navigation of spacecraft using flash light detection and ranging sensors[J].Journal of Guidance Control & Dynamics,2014,37(2):452-465.

    [9] SORKINE O.Least-squares rigid motion using SVD[Z].Technical notes,2009.

    作者信息:

    赵树磊,刘敬猛,张 慧,吕志宇

    (北京航空航天大学 自动化与电气工程学院,北京100083)

    展开全文
  • 通过双目相机生成不同位姿下的目标物体点云以便快速提取靶标角点的世界坐标,不同于常用的点云配准位姿估计,本文取对应点坐标差的均值表示平移向量;然后,求取靶标角点所在切面的法向量,组成目标在不同位姿坐标系下的...
  • 缺点:缺点也十分明显,圆点靶标摆放的位姿在与相机光轴不垂直的情况下,特征点的中心拍摄图像的特征点的中心(或者说是重心)这个时候不论用Steger方法提取光点中心,还是用OpenCV原生的blob方法获取斑点中心,效果...
  • Intel realsense T265双目+IMU传感器使用方法介绍,以及如何快速上手编写realsense的代码,进行简单地开发,积分出位姿,使用opencv显示双目图像 一点儿也不萌的萌萌 2020-05-29 19:37:51 753 收藏 分类专栏...

    摘自:https://blog.csdn.net/u011341856/article/details/106430940/

    Intel realsense T265双目+IMU传感器使用方法介绍,以及如何快速上手编写realsense的代码,进行简单地开发,积分出位姿,使用opencv显示双目图像

    realsense T265是一款很不错的双目+IMU传感器。体积非常小巧,而且IMU精度表现还挺不错的。

    在这里插入图片描述
    阅读本篇内容你将学会使用realsense T265传感器,而且还能学会使用它进行简单的程序开发。

    1.realsense T265传感器输出的数据

    • 双目摄像头可以采集到848X800分辨率下30FPS的鱼眼图像数据;
    • IMU数据(包括6DoF的Pose,3DoF的加速度计,3DoF的陀螺仪)

    而且以上数据的出厂时全都进行了标定,并且都保存在传感器中,你可以通过传感器的输出很容易获得内部的标定数据。

    2.安装和使用方法

    安装方法有两种,一种是源码安装,另一种是使用DKMS包进行安装。

    如果英语还不错的话,也可以参考官网上的方法:Installing the packages. 我下面的方法就是从官方文档中提取出来的。

    这里我强烈推荐第二种,因为这种方法就像你在电脑上安装软件一样简单。我下面介绍的也就是这种方法。

    • 第一步注册服务器的公钥
    sudo apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
    
    • 第二步将服务器添加到存储库列表(根据你的电脑版本选择)

    (1)Ubuntu 16 LTS:

    sudo add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial main" -u
    

    (2)Ubuntu 18 LTS:

    sudo add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo bionic main" -u
    
    • 第三步安装库文件(两个都要安装)
    sudo apt-get install librealsense2-dkms
    sudo apt-get install librealsense2-utils
    
    • 第四步选择安装开发人员和调试软件包(推荐安装第一个)
    sudo apt-get install librealsense2-dev
    
    sudo apt-get install librealsense2-dbg
    
    • 第五步安装成功了,将你的realsense T265连接到电脑USB(至少USB3.0)口上,然后终端中输入以下命令就能看到传感器输出的数据了。
    realsense-viewer
    

    你可以左右移动移动它,带着它走一圈,看看它的轨迹准不准。你可以疯狂的抖它,我相信结果肯定出乎你的意料,自己去试试吧。

    3. 编程使用realsense T265

    3.1 通过IMU积分出位姿

    当你按照上述2中的方法进行了必要程序安装之后,你就已经成功的把realsense T265传感器所要用的库文件和头文件都安装到系统中了。所以我们直接编程使用就行了。

    下面我向你介绍一下如何通过传感器输出的IMU信息,计算传感器运动的轨迹。其实就是通过IMU的速度和加速度信息积分产生位姿(位置和角度)信息。不废话,直接上代码。

    // License: Apache 2.0. See LICENSE file in root directory.
    // Copyright(c) 2019 Intel Corporation. All Rights Reserved.
    #include <librealsense2/rs.hpp>
    #include <iostream>
    #include <iomanip>
    #include <chrono>
    #include <thread>
    #include <mutex>
    
    #include <math.h>
    #include <float.h>
    
    //欧拉角转四元数,两种不同的旋转表示方法之间转换
    //(如果你不懂的话,不必深究,这里慢慢来,你一时半会估计很难理解啥是四元数)
    inline rs2_quaternion quaternion_exp(rs2_vector v)
    {
        float x = v.x/2, y = v.y/2, z = v.z/2, th2, th = sqrtf(th2 = x*x + y*y + z*z);
        float c = cosf(th), s = th2 < sqrtf(120*FLT_EPSILON) ? 1-th2/6 : sinf(th)/th;
        rs2_quaternion Q = { s*x, s*y, s*z, c };
        return Q;
    }
    
    //两个四元素之间进行“乘法”,相当于是旋转之后再旋转
    inline rs2_quaternion quaternion_multiply(rs2_quaternion a, rs2_quaternion b)
    {
        rs2_quaternion Q = {
            a.x * b.w + a.w * b.x - a.z * b.y + a.y * b.z,
            a.y * b.w + a.z * b.x + a.w * b.y - a.x * b.z,
            a.z * b.w - a.y * b.x + a.x * b.y + a.w * b.z,
            a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z,
        };
        return Q;
    }
    
    //通过离散欧拉积分计算出位姿(旋转和位置)
    rs2_pose predict_pose(rs2_pose & pose, float dt_s)
    {
        rs2_pose P = pose;
        P.translation.x = dt_s * (dt_s/2 * pose.acceleration.x + pose.velocity.x) + pose.translation.x;
        P.translation.y = dt_s * (dt_s/2 * pose.acceleration.y + pose.velocity.y) + pose.translation.y;
        P.translation.z = dt_s * (dt_s/2 * pose.acceleration.z + pose.velocity.z) + pose.translation.z;
        rs2_vector W = {
                dt_s * (dt_s/2 * pose.angular_acceleration.x + pose.angular_velocity.x),
                dt_s * (dt_s/2 * pose.angular_acceleration.y + pose.angular_velocity.y),
                dt_s * (dt_s/2 * pose.angular_acceleration.z + pose.angular_velocity.z),
        };
        P.rotation = quaternion_multiply(quaternion_exp(W), pose.rotation);
        return P;
    }
    
    int main(int argc, char * argv[]) try
    {
      	//声明一个realsense传感器设备
        rs2::pipeline pipe;
        // 创建一个配置信息
        rs2::config cfg;
        //告诉配置信息,我需要传感器的POSE和6DOF IMU数据
        cfg.enable_stream(RS2_STREAM_POSE, RS2_FORMAT_6DOF);
    
        
        std::mutex mutex;
        //回调函数
        auto callback = [&](const rs2::frame& frame)
        {
            std::lock_guard<std::mutex> lock(mutex);
            if (rs2::pose_frame fp = frame.as<rs2::pose_frame>()) {
                rs2_pose pose_data = fp.get_pose_data();
                auto now = std::chrono::system_clock::now().time_since_epoch();
                double now_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now).count();
                double pose_time_ms = fp.get_timestamp();
                float dt_s = static_cast<float>(std::max(0., (now_ms - pose_time_ms)/1000.));
                rs2_pose predicted_pose = predict_pose(pose_data, dt_s);
                std::cout << "Predicted " << std::fixed << std::setprecision(3) << dt_s*1000 << "ms " <<
                        "Confidence: " << pose_data.tracker_confidence << " T: " <<
                        predicted_pose.translation.x << " " <<
                        predicted_pose.translation.y << " " <<
                        predicted_pose.translation.z << " (meters)   \r";
            }
        };
    
        //开始接收数据,接收数据之后进入回调函数进行处理
        rs2::pipeline_profile profiles = pipe.start(cfg, callback);
        std::cout << "started thread\n";
        while(true) {
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }
    
        return EXIT_SUCCESS;
    }
    catch (const rs2::error & e)
    {
        std::cerr << "RealSense error calling " << e.get_failed_function() << "(" << e.get_failed_args() << "):\n    " << e.what() << std::endl;
        return EXIT_FAILURE;
    }
    catch (const std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }
    
    

    源文件中牵扯到一些数学,不必深究看过就算过。有了源文件我们还需要CMakeLists.txt文件,这里你直接复制我写的就可以运行。

    cmake_minimum_required(VERSION 3.1.0)
    project(test)
    set(CMAKE_BUILD_TYPE "release")
    
    add_executable(test main.cpp) #通过main.cpp编译生成可执行文件test
    target_link_libraries(test realsense2) #将realsense2的库文件链接给test
    

    将源文件main.cppCMakeLists.txt放在同一个文件夹下,然后顺序执行以下命令就可以编译生成可执行文件了。

    mkdir build
    cd build
    cmake ..
    make 
    

    最后将realsense T265连接上电脑(至少USB3.0),然后运行刚刚生成的程序test,移动移动传感器,就可以得到位姿信息了。

    如果你运行的时候报错:error while loading shared libraries: librealsense2.so.2.34: cannot open shared object file: no such file or directory,那你需要将CMakeLists.txt中的librealsense2的链接方式改为如下方式:

    find_package(realsense2 REQUIRED)
    include_directories(  ${realsense2_INCLUDE_DIR} )
    target_link_libraries(test ${realsense2_LIBRARY} )
    

    3.2 用opencv显示双目摄像头的数据

    有了3.1的基础,这里我就直接上代码了。

    #include <librealsense2/rs.hpp>
    #include <opencv2/opencv.hpp>
    
    int main(){
    
        rs2::config cfg;
        cfg.enable_stream(RS2_STREAM_FISHEYE,1, RS2_FORMAT_Y8);
        cfg.enable_stream(RS2_STREAM_FISHEYE,2, RS2_FORMAT_Y8);
        rs2::pipeline pipe;
        pipe.start(cfg);
    
        rs2::frameset data;
    
        while (1){
            data = pipe.wait_for_frames();
            rs2::frame image_left = data.get_fisheye_frame(1);
            rs2::frame image_right = data.get_fisheye_frame(2);
    
            if (!image_left || !image_right)
                break;
    
            cv::Mat cv_image_left(cv::Size(848, 800), CV_8U, (void*)image_left.get_data(), cv::Mat::AUTO_STEP);
            cv::Mat cv_image_right(cv::Size(848, 800), CV_8U, (void*)image_right.get_data(), cv::Mat::AUTO_STEP);
    
            cv::imshow("left", cv_image_left);
            cv::imshow("right", cv_image_right);
            cv::waitKey(1);
        }
    
        return 0;
    }
    

    对应的CMakeLists.txt文件内容如下:

    cmake_minimum_required(VERSION 3.1.0)
    project(test)
    set(CMAKE_BUILD_TYPE "release")
    
    find_package(OpenCV)
    
    include_directories(${OpenCV_INCLUDE_DIRS})
    
    add_executable(test main.cpp)
    target_link_libraries(test
            realsense2
            ${OpenCV_LIBS}
    )
    
    

    编译成功之后,连接上摄像头你就能看到实时的双目图像了。

    4.更多有趣的玩法

    上面这部分的代码来源于官方文档,我稍作修改。官方提供了很多有趣例子,你可以在下面这个网站中看到更多有趣的玩法,包括测距,简单的AR等等。

    T265 Tracking Camera
    https://github.com/IntelRealSense/librealsense/blob/master/doc/t265.md

    实际上这些例子,都已经在上文中的2步骤中全部成功安装到我们的电脑里面了,我们只需要打开一个终端输入rs-,然后按一下Tab键所有的例子都出来了,尽情享用吧!

    如果你想知道他们是怎么实现的,你只需要看下面这个网址就可以。
    https://github.com/IntelRealSense/librealsense/tree/master/examples

    温馨提示,哈哈,上面的一些例子不是每一个都能正常运行的,因为有些还依赖于别的传感器,所以如果有些不能运行也不要感到奇怪。

    展开全文
  • 简单介绍,采用双目结构光相机,利用拍摄的点云数据和CAD模型点云进行ICP配准,获取物体在相机坐标系下的位姿(R,t) 2.手眼标定 本文采用的是Eye to Hand 方式,与opencv中讲解的Eye in Hand方式不同;因此

    1.位姿估计

    简单介绍,采用双目结构光相机,利用拍摄的点云数据和CAD模型点云进行ICP配准,获取物体在相机坐标系下的位姿(R,t)

    2.手眼标定

    本文采用的是Eye to Hand 方式,与opencv中讲解的Eye in Hand方式不同;因此花了点时间,首先还是先来看Opencv官方的手眼标定函数

    Opencv 手眼标定函数calibrateHandEye()

    先贴一个包含棋盘格检测的c++代码 github

    (1)Eye in Hand

    在opencv 3.4版本以上,提供了手眼标定函数,本文采用的是4.4版本,贴一个官方文档

    基本输入输出描述:
    在这里插入图片描述
    在这里插入图片描述
    看着这个旋转矩阵,有点迷,来看一下官方的图
    在这里插入图片描述
    在这里插入图片描述
    可以看出,官方求解的是相机到夹爪的变换矩阵:gTc;
    其两个输入:

    • 夹爪到机器人基座变换矩阵bTg
    • 目标物体(一般是棋盘格)到相机的变换矩阵cTt

    这就感觉很反人类,机器人每次运动读出来的坑定是基座到机械臂末端的变换矩阵,按照opencv的表示方法应该是gTb;然后pnp算法可以获取得到相机每次拍照相对于棋盘格的外参cTt(这个参数和opencv的是相符的);

    • 所以Eye in Hand相机标定使用opencv的标定函数,应该是要把机器人的位姿估计去逆????
    • 那为啥广大csdn朋友都是直接用的???纳闷 (看到最后)

    (1)Eye to Hand

    在这里插入图片描述

    这里我们还是按照opencv的定义吧;
    根据target到base从红色路径走和蓝色路径走,一次拍摄可以获得一个等式
    bTg · gTt = bTc · cTt

    两次拍摄,有
    bTg1 · gTt = bTc · cTt1 (1)
    bTg2 · gTt = bTc · cTt2 (2)

    用(1)消去(2)中的 gTt,有
    bTg2 · inv(bTg1 ) · bTc · cTt1 = bTc · cTt2

    挪一挪,成AX=XB的形式:
    bTg2 · inv(bTg1 ) · bTc = bTc · cTt2 · inv(cTt1)

    对比一下eye in hand:好像bTg逆了一下???在这里插入图片描述
    那根据opencv变换矩阵的定义,是不是对于eye to hand直接可以用机器人读出的基座到末端的矩阵???

    我怀着好奇试了一下,发现。。。。嘤嘤嘤,错了;
    几种情况都试了几下,发现需要求逆的是eye to hand中的bTg,也就是机器人末端位姿取个逆,或许这里能解释广大的csdn友eye in hand中机器人末端矩阵不取逆的原因???

    所以我感觉opencv的矩阵定义很迷。。。。。。。。不过反正是可以用了

    halcon 手眼标定

    由于上述方式计算出的手眼标定矩阵没有评价指标,然后看到51halcon上有人晒出具有评价指标的手眼标定,实验室有halcon的标定板,因此尝试了一下

    步骤:

    1. 下载halcon hdevelop软件,安装后使用试用许可证
    2. 官网看到eye to hand 手眼标定例程,原来csdn上抄的是halcon的图

    在这里插入图片描述

    在这里插入图片描述

    1. 打开对应标定的示例程序
      在这里插入图片描述
      代码里注释都很清楚了,主要是读取四部分数据:
    • 标定板描述文件
      CalTabFile := ‘caltab_100mm.descr’(包含圆形标定板尺寸信息);

    • 机械臂末端位姿文件
      这里例程一个pose一个.dat文件,
      在这里插入图片描述
      这里涉及到halcon的位姿表示类型,一般是采用2对应上面:f=2,zyx欧拉角方式,按照要求写之
      在这里插入图片描述

    • 图片文件
      读取的时候不用后缀,但是有可能检测不到标定板外框,圆形,需要调节算子find_calib_object [‘alpha’], [0.2]

    • 相机内参文件
      两种方式生成相机内参
      一个是读文件
      read_cam_par (DataNameStart + ‘start_campar.dat’, StartCamParam)
      一个是硬编码,有很多种参数类型,具体看文档
      gen_cam_par_area_scan_division (1.17685423e-002, -2.54169782e+003, 7.32908724e-006, 7.40000000e-006, 1.2433252307808543e+03, 1.0420874394843283e+03, 2448, 2048, StartCamParam)

    1. 根据程序提示运行就完事了:
      求解完了之后,可以用算子,pose_to_hom_mat3d把pose转mat;手眼标矩阵和opencv差不太多,但是实验中感觉精度也有问题
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    其他标定函数

    我自己用的是网上网友把opencv中的代码自己实现了一下

    另外还有一个github的matlab版本,这个没试过

    总之原理就这样

    3.机械臂运动

    我们设想的是去验证整个位姿估计框架的精度:
    包含了物体到相机,相机到机器人基座两部分变换关系

    实验方案:

    大概就这样,实际中B是一个框,A是中间那部分,初始状态就是A放在B中
    在这里插入图片描述

    零部件A固定在台面,零部件B使用机械臂夹持,初始

    机器人位姿校正推导:

    这里的坐标系我喜欢用自己的定义,不用opencv那里 的反人类定义

    在这里插入图片描述
    那么就有:
    在这里插入图片描述
    然后实验就是完事了

    展开全文
  • 众所周知,自动驾驶、动作捕捉等场景非常依赖双目立体相机采集图像、位姿信息的清晰度、丰富度,单位时间内双目相机提供的信息越多,越有利于相关场景的算法追踪及定位,降低算法开发难度。 正因如此,为了满足不同...
  • 项目实战——基于计算机视觉的物体位姿定位及机械臂矫正(一) ...在摄像机的使用上采用双目相机,而非单目相机; 开发环境,VS2015,C++,使用Opencv3(其实我更擅长Matlab,但是这个目前更加普...
  • ’工欲善其事必先利其器‘’我们先从能够获取RGBD数据的相机开始谈起。首先我们来看一看其分类。 一、根据其工作原理主要分为三类: 1. 双目方案: (1) 原理:...
  • 本文涉及很多代码及文字,排版、...它联合优化了所有模型参数(相机位姿、内参矩阵、几何参数、逆深度值)的直接法模型,并在优化过程中用滑动窗口对旧的相机位姿以及离开相机视野的点进行边缘化。但它不是完整的...
  • 文章目录基本步骤相机标定图像采集立体校正匹配算法三维重构...每个相机单独标定,之后再标定双目相机位姿 标定单目时需要选择畸变个数,一般如果不是鱼眼镜头,只需要标定两个径向畸变、两个切向畸变。 图像采集,
  • LM算法在相机标定的应用共有三处。 (1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参。...(3)双目标定中,在左右相机的内外参及左右相机位姿都不固定的情况下,计算最佳的左右相机的内
  • 在我们的双目相对位姿测量系统中,世界坐标系一般定义与左相机的摄像机坐标系重合,这样的话左相机的R为单位矩阵,T为零向量 双目视觉中一般将世界坐标系原点定在左相机或者右相机或者二者X轴方向的中点 相机标定 ...
  • 文章目录13.1 立体视觉的基础知识13.1.1 三维空间坐标13.1.2 3D位姿13.2 相机标定13.2.1 相机标定的目的和意义13.2.2 标定的参数13.2.3 准备标定板13.2.4 采集标定图像过程中与操作细节13.2.5 使用Halcon标定助手...
  • LM算法在相机标定的应用共有三处。(1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参。...(3)双目标定中,在左右相机的内外参及左右相机位姿都不固定的情况下,计算最佳的左右相机的内外参及最佳的...
  • 由于相机标定易受靶标自身和外界环境因素的干扰,且相机标定精度直接影响双目视觉或三维重建等计算机视觉领域的结果,因此,在标定过程中要尽可能提高相机的标定精度。相机标定过程中的精度影响因素主要为靶标自身的...
  • 位姿的计算方面,则通过RANSAC迭代的方式,每次迭代随机抽取3个点,根据这三个点,用高斯牛顿法计算出一个RT矩阵,表示两帧图像之间,相机的姿态变换。而位姿的计算也是libviso 中较为抽象的一部分,接下来,本文...
  • 单目相机如何的到深度

    千次阅读 2018-04-03 12:54:33
    双目可以通过标定(几何)或实时匹配(视觉匹配)得到相机的(一般为相对的)位姿 (稀疏点云)再通过匹配同名点,前方交会,得到深度。 (摄影测量)根据核线和匹配代价,交会所有点,得到所有点深度。 (密集...
  • 单目/双目与imu的融合(一) 目前单目slam存在初始化的尺度问题和追踪的尺度漂移问题,而双目也存在精度不高和鲁棒性不好的问题。针对这些问题,人们提出了融合imu的想法。 那么imu的作用是什么呢? 单目 (1)...
  • 文章目录1 单个特征对单个双目的...考虑一个特征点fjf_jfj​被位置在(GCiq,GpCi)(^{C_i}_Gq,{^{G}p}_{C_i})(GCi​​q,GpCi​​)的双目相机观测到。双目的左右相机位姿可以表示为(GCi,1q,GpCi,1)(^{C_{i,1}}_Gq,{^{...
  • 双目相机内参,基线 双目观测到的对应的landmark像素坐标 求解: 相机位姿 landmark的坐标 头文件 #include <gtsam/geometry/Pose3.h> #include <gtsam/geometry/Cal3_S2Stereo.h> #include <...
  • 视觉SLAM综述

    千次阅读 2018-06-25 17:28:04
    1.视觉SLAM基本原理视觉SLAM的基本原理为多视图几何,通过连续帧间的特诊匹配,求解相机位姿,从而恢复相机运动。只使用一个摄像头的被称为单目SLAM,使用两个摄像头的为双目SLAM,使用RGBD摄像头的被称为RGBD-SLAM...
  • Intel Realsense T265使用教程

    万次阅读 2020-11-09 14:47:42
    T265采用了Movidius Myriad 2视觉处理单元(VPU),V-SLAM算法都直接在VPU上运行 可直接输出6DOF相机位姿 T265使用了双目鱼眼相机 分辨率848X800分辨率 30HZ 单色图像 相机与IMU的参数都保存在了传感器中,可通过...
  • 视觉SLAM笔记(六)-PnP

    2019-08-17 17:02:49
    PnP算法是在已知nnn个特征点像素位置及其对应的3D空间点位置时估计相机位姿的方法。在两张图像中,若其中一张图像的特征点的3D位置已知,则可以使用PnP方法估计相机运动,特征点的3D位置可由三角测量或RGBD/双目相机...
  • III ORB-SLAM2 ...tracking跟踪 通过寻找和局部地图的特征匹配以及应用纯运动BA最小化重投影误差,利用每帧图像定位相机位姿; Local mapping局部建图 执行局部BA,管理局部地图并优化局部地图; loop clo...
  • 运行msckf_vio

    2019-09-25 11:34:01
    其中多状态约束是指将多帧图像的相机位姿加入卡尔曼状态向量中,在进行卡尔曼增益之前通过多帧图像之间的约束进行最小二乘优化来估计特征点的空间位置,然后根据优化后的特征点空间位置来约束状态向量。其中,多帧...
  • 在三维重建过程中,如果使用了IMU-惯导系统,一般可以得到一个大致可信的相机位姿转换。基于IMU短时间可信的原则,重建问题着重在地图的构建问题,即根据图像来获取点集的空间位置(六自由度),重要的一点的是获取...
  • 2020-11-18

    2020-11-18 21:01:11
    本文提出一种实时的基于特征的SLAM系统,采用多线程并行的策略:tracking来估计相机位姿,mapping来更新关键帧地图。双目来进行初始化避免了单目初始化的难点。本文基于ros系统。 introduction 相机的优点、单目与...
  • 主要内容面向动态环境基于点的语义SLAM系统。ORB-SLAM2的动态环境扩展版本,面向单目,双目和RGB-D相机。...只使用静态区域且非动态物体掩膜边缘的ORB特征点进行相机位姿估计。使用历史观测进行背景填充。缺...

空空如也

空空如也

1 2 3 4
收藏数 66
精华内容 26
关键字:

双目相机位姿