发明名称 基于机械臂末端单目视觉的动态目标位置和姿态测量方法
摘要 本发明涉及一种基于机械臂末端单目视觉的动态目标位置和姿态测量方法,属于视觉测量领域。该方法首先进行摄像机标定和手眼标定;然后用摄像机拍摄两幅图像,利用尺度不变特征提取方法,提取图像中目标区域的空间特征点并进行特征点匹配;利用对极几何约束方法,求解两幅图像之间的基础矩阵,得到本质矩阵,进而求解摄像机的旋转变换矩阵和位移变换矩阵;之后对特征点进行三维重构和尺度校正;最后利用重构后的特征点构建目标坐标系,获得目标相对摄像机的位置和姿态。本发明方法采用单目视觉,简化计算过程,使用了手眼标定,可简化摄像机位姿信息测量过程中错误解的剔除。本方法适用于测量静止目标和低动态目标的相对位姿。
申请公布号 CN103759716B 申请公布日期 2016.08.17
申请号 CN201410016272.0 申请日期 2014.01.14
申请人 清华大学 发明人 刘华平;陈杰;孙富春;卢山;刘宗明;张宇
分类号 G01C11/08(2006.01)I 主分类号 G01C11/08(2006.01)I
代理机构 北京清亦华知识产权代理事务所(普通合伙) 11201 代理人 罗文群
主权项 一种基于机械臂末端单目视觉的动态目标位置和姿态测量方法,其特征在于该方法包括以下步骤:(1)设摄像机拍摄图像的平面坐标系为(u,v),采用张正友棋盘格标定法,得到摄像机的内参数矩阵M,<img file="FDA0000960176180000011.GIF" wi="425" he="399" />以及摄像机的径向畸变参数k<sub>1</sub>和k<sub>2</sub>以及切向畸变参数k<sub>3</sub>和k<sub>4</sub>,其中,f为摄像机焦距,<img file="FDA0000960176180000012.GIF" wi="66" he="119" />为摄像机在图像平面坐标系的u轴上的归一化焦距,<img file="FDA0000960176180000013.GIF" wi="65" he="127" />为摄像机在图像平面坐标系的v轴上的归一化焦距,(u<sub>0</sub>,v<sub>0</sub>)为摄相机光轴与摄像机拍摄图像平面交点的像素坐标;(2)利用手眼标定法,得到机械臂末端和摄像机之间的旋转变换矩阵,记为<img file="FDA0000960176180000014.GIF" wi="91" he="71" />以及机械臂末端和摄像机之间的位移变换矩阵,记为<img file="FDA0000960176180000017.GIF" wi="75" he="63" /><img file="FDA0000960176180000018.GIF" wi="65" he="63" />为3×3矩阵,<img file="FDA0000960176180000016.GIF" wi="43" he="61" />为3×1矩阵;(3)在目标上设置两个标记点,利用机械臂末端摄像机,在两个不同位置拍摄到该目标的两幅图像,从两幅图像中区分出目标区域和背景区域,利用尺度不变特征提取方法,分别从两幅图像中提取出目标区域的空间特征点,该空间特征点包括目标上的两个标记点;(4)根据上述空间特征点,对两幅图像中目标区域的空间特征点进行匹配,得到初始匹配结果,并根据初始匹配结果,对步骤(3)的尺度不变特征提取方法中的参数进行调整,以获得两幅图像之间有8对以上匹配特征点,匹配特征点中包括目标上的两个标记点;(5)根据步骤(4)的两幅图像之间8对以上匹配特征点,利用对极几何约束方法,求解两幅图像之间的基础矩阵F;(6)根据上述步骤(1)的摄像机内参数矩阵M和步骤(5)的基础矩阵F,求解摄像机在拍摄目标的两幅图像时的两个不同位置之间的本质矩阵E,利用本质矩阵E,求解摄像机在拍摄目标的两幅图像时的两个不同位置之间的旋转变换矩阵<img file="FDA0000960176180000021.GIF" wi="59" he="62" />和物理位移变换矩阵<img file="FDA0000960176180000022.GIF" wi="67" he="61" />得到四组候选解,具体过程如下:(6‑1)利用如下公式,根据步骤(5)的基础矩阵F和步骤(1)的摄像机内参数矩阵M,计算摄像机在拍摄目标的两幅图像时的两个不同位置之间的本质矩阵E:E=M<sup>T</sup>FM,其中M<sup>T</sup>为矩阵M的转置矩阵;(6‑2)利用特征值分解方法,对上述本质矩阵E进行分解,E=Udiag(s,s,0)V<sup>T</sup>,得到四组候选解:<img file="FDA0000960176180000023.GIF" wi="662" he="303" />其中<img file="FDA0000960176180000024.GIF" wi="707" he="223" />(7)根据机械臂的控制参数和上述步骤(2)得到的机械臂末端和摄像机之间的旋转变换矩阵<img file="FDA0000960176180000025.GIF" wi="67" he="63" />和位移变换矩阵<img file="FDA0000960176180000026.GIF" wi="83" he="71" />计算得到摄像机在拍摄目标的两幅图像时的两个不同位置之间的旋转初值<img file="FDA0000960176180000027.GIF" wi="73" he="55" />和位移初值<img file="FDA0000960176180000028.GIF" wi="75" he="55" />根据旋转初值<img file="FDA0000960176180000029.GIF" wi="67" he="62" />和位移初值<img file="FDA00009601761800000210.GIF" wi="74" he="55" />得到步骤(6)中的四组候选解中的摄像机旋转变换矩阵<img file="FDA00009601761800000211.GIF" wi="67" he="70" />和摄像机的位移变换矩阵<img file="FDA00009601761800000212.GIF" wi="74" he="70" />具体过程如下:(7‑1)根据机械臂的控制参数得到机械臂末端的旋转变换矩阵<img file="FDA00009601761800000213.GIF" wi="72" he="71" />和位移变换矩阵<img file="FDA00009601761800000214.GIF" wi="75" he="71" />根据上述步骤(2)得到的机械臂末端和摄像机之间的旋转变换矩阵<img file="FDA00009601761800000215.GIF" wi="70" he="63" />和位移变换矩阵<img file="FDA00009601761800000216.GIF" wi="78" he="71" />通过下式计算摄像机在拍摄目标的两幅图像时的两个不同位置之间的旋转初值<img file="FDA00009601761800000217.GIF" wi="70" he="63" />和位移初值<img file="FDA00009601761800000218.GIF" wi="82" he="63" /><maths num="0001" id="cmaths0001"><math><![CDATA[<mrow><msub><mmultiscripts><mi>R</mi><mprescripts/><mi>c</mi><mi>c</mi></mmultiscripts><mn>0</mn></msub><mo>=</mo><mmultiscripts><mi>R</mi><mprescripts/><mi>e</mi><mi>c</mi></mmultiscripts><mmultiscripts><mi>R</mi><mprescripts/><mi>e</mi><mi>e</mi></mmultiscripts><msup><mmultiscripts><mi>R</mi><mprescripts/><mi>e</mi><mi>c</mi></mmultiscripts><mrow><mo>-</mo><mn>1</mn></mrow></msup></mrow>]]></math><img file="FDA00009601761800000219.GIF" wi="422" he="87" /></maths><maths num="0002" id="cmaths0002"><math><![CDATA[<mrow><msub><mmultiscripts><mi>t</mi><mprescripts/><mi>c</mi><mi>c</mi></mmultiscripts><mn>0</mn></msub><mo>=</mo><mmultiscripts><mi>R</mi><mprescripts/><mi>e</mi><mi>c</mi></mmultiscripts><mmultiscripts><mi>t</mi><mprescripts/><mi>e</mi><mi>e</mi></mmultiscripts><mo>+</mo><mmultiscripts><mi>t</mi><mprescripts/><mi>e</mi><mi>c</mi></mmultiscripts><mo>-</mo><msub><mmultiscripts><mi>R</mi><mprescripts/><mi>c</mi><mi>c</mi></mmultiscripts><mn>0</mn></msub><mmultiscripts><mi>t</mi><mprescripts/><mi>e</mi><mi>c</mi></mmultiscripts></mrow>]]></math><img file="FDA00009601761800000220.GIF" wi="573" he="79" /></maths>(7‑2)分别计算上述步骤(6)得到的旋转矩阵候选解与旋转初值<img file="FDA00009601761800000221.GIF" wi="74" he="62" />之间的旋转矩阵,得到该旋转矩阵的范数,将与该旋转矩阵范数中最小范数值相对应的候选解作为摄像机旋转变换矩阵<img file="FDA0000960176180000031.GIF" wi="91" he="70" />(7‑3)分别计算上述步骤(6)得到的位移矩阵候选解与位移初值<img file="FDA0000960176180000032.GIF" wi="51" he="62" />之间的夹角,将与该夹角中最小夹角相对应的候选解作为摄像机位移变换矩阵<img file="FDA0000960176180000033.GIF" wi="51" he="70" />的正解;(8)根据上述步骤(7)中得到的摄像机旋转变换矩阵<img file="FDA0000960176180000034.GIF" wi="67" he="70" />和摄像机位移变换矩阵<img file="FDA0000960176180000035.GIF" wi="74" he="69" />对上述步骤(4)得到的两幅图像之间的匹配特征点进行特征点三维重构,根据目标上的两个标记点之间的距离,对摄像机的位移变换和三维重构的特征点进行尺度校正,包括以下步骤:(8‑1)利用三角测量方法,得到步骤(4)的两幅图像之间所有匹配特征点在摄像机坐标系中的三维坐标P′;(8‑2)从上述所有匹配特征点的三维坐标中,得到目标上两个标记点之间的计算距离d;(8‑3)根据目标上的两个标记点之间的物理距离D,得到该物理距离与上述计算距离之间的比值<img file="FDA0000960176180000036.GIF" wi="139" he="117" />(8‑4)根据上述比值b,对上述摄像机位移变换矩阵<img file="FDA0000960176180000037.GIF" wi="51" he="71" />和特征点在摄像机坐标系中的三维坐标,根据下式进行尺度校正,得到尺度校正后的摄像机在拍摄目标的两幅图像时所在的两个不同位置之间的物理位移变换矩阵<img file="FDA0000960176180000038.GIF" wi="42" he="55" />以及三维重构特征点的物理坐标P:<img file="FDA0000960176180000039.GIF" wi="142" he="70" />P=bP′(9)构建目标坐标系,求解目标的相对摄像机的位置和姿态,具体过程如下:(9‑1)根据上述步骤(8)得到的三维重构特征点的物理坐标,构建目标坐标系,以目标上3个特征点为例构建目标坐标系,i,j,k分别为目标坐标系XYZ坐标轴的单位向量,坐标原点为点A,AB为X轴,以ABC平面中垂直AB的方向为Y轴,然后依据右手法则得到Z轴,设P<sub>a</sub>,P<sub>b</sub>,P<sub>c</sub>为3特征点在摄像机坐标系下的坐标,各坐标轴的单位向量计算如下:<img file="FDA0000960176180000041.GIF" wi="909" he="310" />(9‑2)依据如下公式计算任意目标特征点在目标坐标系中的坐标<sub>o</sub>P<sub>i</sub>:<sub>o</sub>P<sub>i</sub>=[i j k](P<sub>i</sub>‑P<sub>a</sub>)其中,P<sub>i</sub>为任意特征点的重构坐标;(9‑3)利用坐标系转换方法或基于点特征定位的方法,根据任意目标特征点在目标坐标系中的坐标<sub>o</sub>P<sub>i</sub>和重构坐标P<sub>i</sub>,计算目标的相对摄像机的位置<img file="FDA0000960176180000042.GIF" wi="42" he="55" />和相对旋转矩阵<img file="FDA0000960176180000043.GIF" wi="82" he="55" />(9‑4)根据上述相对旋转矩阵<img file="FDA0000960176180000044.GIF" wi="82" he="60" />计算目标的相对姿态,以欧拉角XYZ顺序表示目标姿态(α,β,γ),则相对旋转矩阵<img file="FDA0000960176180000045.GIF" wi="59" he="61" />表示如下:<maths num="0003" id="cmaths0003"><math><![CDATA[<mfenced open = "" close = ""><mtable><mtr><mtd><mrow><mmultiscripts><mi>R</mi><mprescripts/><mi>c</mi><mi>o</mi></mmultiscripts><mo>=</mo><mi>R</mi><mrow><mo>(</mo><mrow><mi>&alpha;</mi><mo>,</mo><mi>&beta;</mi><mo>,</mo><mi>&gamma;</mi></mrow><mo>)</mo></mrow><mo>=</mo><msub><mi>R</mi><mi>x</mi></msub><msub><mi>R</mi><mi>y</mi></msub><msub><mi>R</mi><mi>z</mi></msub></mrow></mtd></mtr><mtr><mtd><mrow><mo>=</mo><mfenced open = "[" close = "]"><mtable><mtr><mtd><mn>1</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mrow><mi>cos</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mrow><mi>sin</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow></mrow></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mrow><mo>-</mo><mi>sin</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mrow><mi>cos</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow></mrow></mtd></mtr></mtable></mfenced><mfenced open = "[" close = "]"><mtable><mtr><mtd><mrow><mi>cos</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mn>0</mn></mtd><mtd><mrow><mo>-</mo><mi>sin</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow></mrow></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mrow><mi>sin</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mn>0</mn></mtd><mtd><mrow><mi>cos</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow></mrow></mtd></mtr></mtable></mfenced><mfenced open = "[" close = "]"><mtable><mtr><mtd><mrow><mi>cos</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mrow><mi>sin</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mrow><mo>-</mo><mi>sin</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mrow><mi>cos</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd></mtr></mtable></mfenced></mrow></mtd></mtr><mtr><mtd><mrow><mo>=</mo><mfenced open = "[" close = "]"><mtable><mtr><mtd><mrow><mi>cos</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow><mi>cos</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mrow><mi>cos</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow><mi>sin</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mrow><mo>-</mo><mi>sin</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow></mrow></mtd></mtr><mtr><mtd><mrow><mi>sin</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mi>sin</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow><mi>cos</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow><mo>-</mo><mi>cos</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mi>sin</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mrow><mi>sin</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mi>sin</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow><mi>sin</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow><mo>+</mo><mi>cos</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mi>cos</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mrow><mi>sin</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mi>cos</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow></mrow></mtd></mtr><mtr><mtd><mrow><mi>cos</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mi>sin</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow><mi>cos</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow><mo>+</mo><mi>sin</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mi>sin</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mrow><mi>cos</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mi>sin</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow><mi>sin</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow><mo>-</mo><mi>sin</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mi>cos</mi><mrow><mo>(</mo><mi>&gamma;</mi><mo>)</mo></mrow></mrow></mtd><mtd><mrow><mi>cos</mi><mrow><mo>(</mo><mi>&alpha;</mi><mo>)</mo></mrow><mi>cos</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow></mrow></mtd></mtr></mtable></mfenced></mrow></mtd></mtr></mtable></mfenced>]]></math><img file="FDA0000960176180000046.GIF" wi="1854" he="533" /></maths>从上述相对旋转矩阵<img file="FDA00009601761800000410.GIF" wi="59" he="59" />中,得到目标的相对摄像机的姿态为:<maths num="0004" id="cmaths0004"><math><![CDATA[<mrow><mi>&beta;</mi><mo>=</mo><mi>a</mi><mi>s</mi><mi>i</mi><mi>n</mi><mrow><mo>(</mo><mo>-</mo><mmultiscripts><mi>R</mi><mprescripts/><mi>c</mi><mi>o</mi></mmultiscripts><mo>(</mo><mrow><mn>1</mn><mo>,</mo><mn>3</mn></mrow><mo>)</mo><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000960176180000047.GIF" wi="463" he="83" /></maths><maths num="0005" id="cmaths0005"><math><![CDATA[<mrow><mi>&gamma;</mi><mo>=</mo><mi>a</mi><mi>s</mi><mi>i</mi><mi>n</mi><mrow><mo>(</mo><mfrac><mrow><mmultiscripts><mi>R</mi><mprescripts/><mi>c</mi><mi>o</mi></mmultiscripts><mrow><mo>(</mo><mn>1</mn><mo>,</mo><mn>2</mn><mo>)</mo></mrow></mrow><mrow><mi>c</mi><mi>o</mi><mi>s</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow></mrow></mfrac><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000960176180000048.GIF" wi="467" he="170" /></maths><maths num="0006" id="cmaths0006"><math><![CDATA[<mrow><mi>&alpha;</mi><mo>=</mo><mi>a</mi><mi>s</mi><mi>i</mi><mi>n</mi><mrow><mo>(</mo><mfrac><mrow><mmultiscripts><mi>R</mi><mprescripts/><mi>c</mi><mi>o</mi></mmultiscripts><mrow><mo>(</mo><mn>2</mn><mo>,</mo><mn>3</mn><mo>)</mo></mrow></mrow><mrow><mi>c</mi><mi>o</mi><mi>s</mi><mrow><mo>(</mo><mi>&beta;</mi><mo>)</mo></mrow></mrow></mfrac><mo>)</mo></mrow><mo>.</mo></mrow>]]></math><img file="FDA0000960176180000049.GIF" wi="518" he="161" /></maths>
地址 100084 北京市海淀区清华园1号