发明名称 基于光束和三角面片求交的激光扫描成像快速仿真方法
摘要 本发明公开了基于光束和三角面片求交的激光扫描成像快速仿真方法,它首先绘制目标空间三角网格模型。然后根据激光扫描结构推导激光光束方程、角度分辨率和视场;导入目标模型,将目标几何变换至成像系统视场范围内。最后基于光束和三角面片求交法,引入局部搜索技术,缩小遍历范围,加速各激光光束与目标三角网格模型相交情况求解过程,求取各交点与激光出射点的距离,快速仿真出目标距离图像。本发明仿真方法简单、速度快,可用于激光扫描成像样机设计验证和目标三维成像、识别、跟踪等算法测试,缩短系统研发周期。
申请公布号 CN105844057A 申请公布日期 2016.08.10
申请号 CN201610236472.6 申请日期 2016.04.15
申请人 中国科学院上海技术物理研究所 发明人 岳娟;李范鸣;葛军;刘士建;李明
分类号 G06F17/50(2006.01)I 主分类号 G06F17/50(2006.01)I
代理机构 上海新天专利代理有限公司 31213 代理人 郭英
主权项 基于光束和三角面片求交的激光扫描成像快速仿真方法,其特征在于包括以下步骤:步骤1:使用三维绘图软件3DMax,绘制目标空间三角网格模型,以OBJ等文件格式导出,导出文件中包含三角网格模型顶点位置、面片顶点序号等信息;步骤2:根据激光扫描结构推导激光扫描方程<img file="FDA0000966185920000011.GIF" wi="651" he="79" /><img file="FDA0000966185920000012.GIF" wi="334" he="78" />其中i是激光光束行编号,i=1,2..m,m是激光扫描行数;j是激光光束列编号,j=1,2..n,n是激光扫描列数。<img file="FDA0000966185920000013.GIF" wi="262" he="79" />表示m×n阵列扫描光束出射方向的单位方向矢量;根据激光扫描方程,分析激光行扫描方向上的角度分辨率α,演算激光光束参数方程;根据激光光束参数方程,仿真出激光扫描光束在测量装置正前方指定距离处墙面上的扫描轨迹,将其扫描范围具象化。激光扫描成像系统在y=D墙面上的扫描轨迹仿真步骤如下:(2‑1):根据激光扫描方程,分析激光行扫描方向上的角度分辨率α,演算激光光束参数方程<img file="FDA0000966185920000014.GIF" wi="171" he="75" />具体公式如下:<maths num="0001" id="cmaths0001"><math><![CDATA[<mfenced open = "" close = ""><mtable><mtr><mtd><mrow><mi>&alpha;</mi><mo>=</mo><mo>&lt;</mo><mrow><mo>&lsqb;</mo><mrow><msub><mover><mi>x</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mo>)</mo></mrow><mo>,</mo><msub><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mo>)</mo></mrow><mo>,</mo><msub><mover><mi>z</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mo>)</mo></mrow></mrow><mo>&rsqb;</mo></mrow><mo>,</mo><mrow><mo>&lsqb;</mo><mrow><msub><mover><mi>x</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo>,</mo><msub><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo>,</mo><msub><mover><mi>z</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mo>&rsqb;</mo></mrow><mo>&gt;</mo></mrow></mtd></mtr><mtr><mtd><mrow><mo>=</mo><mi>arccos</mi><mrow><mo>(</mo><mrow><msub><mover><mi>x</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mo>)</mo></mrow><msub><mover><mi>x</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo>+</mo><msub><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mo>)</mo></mrow><msub><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo>+</mo><msub><mover><mi>z</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mo>)</mo></mrow><msub><mover><mi>z</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mo>)</mo></mrow></mrow></mtd></mtr></mtable></mfenced>]]></math><img file="FDA0000966185920000015.GIF" wi="1717" he="207" /></maths><maths num="0002" id="cmaths0002"><math><![CDATA[<mfenced open = "{" close = ""><mtable><mtr><mtd><mrow><mover><mi>x</mi><mo>&CenterDot;</mo></mover><mo>=</mo><msub><mover><mi>x</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mo>.</mo><mo>*</mo><mover><mi>R</mi><mo>&CenterDot;</mo></mover><mo>+</mo><msub><mi>x</mi><mi>o</mi></msub></mrow></mtd></mtr><mtr><mtd><mrow><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mo>=</mo><msub><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mo>.</mo><mo>*</mo><mover><mi>R</mi><mo>&CenterDot;</mo></mover><mo>+</mo><msub><mi>y</mi><mi>o</mi></msub></mrow></mtd></mtr><mtr><mtd><mrow><mover><mi>z</mi><mo>&CenterDot;</mo></mover><mo>=</mo><msub><mover><mi>z</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mo>.</mo><mo>*</mo><mover><mi>R</mi><mo>&CenterDot;</mo></mover><mo>+</mo><msub><mi>z</mi><mi>o</mi></msub></mrow></mtd></mtr></mtable></mfenced>]]></math><img file="FDA0000966185920000016.GIF" wi="406" he="294" /></maths>其中(x<sub>o</sub>,y<sub>o</sub>,z<sub>o</sub>)为激光出射点O空间三维坐标,<img file="FDA0000966185920000017.GIF" wi="54" he="79" />为m×n阵列激光光束末端与激光出射点的距离图像,其尺寸为m×n,.*表示矩阵点乘运算;(2‑2):激光成像系统在目标表面留下的扫描痕迹,是扫描光束与目标表面交点的集合。激光扫描光束若与墙面相交,则其参数坐标满足y=D,由此可得该光束与激光出射点的距离大小为:<maths num="0003" id="cmaths0003"><math><![CDATA[<mrow><mover><mi>R</mi><mo>&CenterDot;</mo></mover><mo>=</mo><mrow><mo>(</mo><mi>D</mi><mo>-</mo><msub><mi>y</mi><mi>o</mi></msub><mo>)</mo></mrow><mo>&CenterDot;</mo><mo>/</mo><msub><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub></mrow>]]></math><img file="FDA0000966185920000021.GIF" wi="406" he="150" /></maths>其中·/表示矩阵点除运算,将距离<img file="FDA0000966185920000022.GIF" wi="46" he="86" />代入激光光束参数方程,可得激光光束与墙面交点坐标如下式所示:<maths num="0004" id="cmaths0004"><math><![CDATA[<mfenced open = "{" close = ""><mtable><mtr><mtd><mrow><mi>x</mi><mo>=</mo><msub><mover><mi>x</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mo>&times;</mo><mrow><mo>(</mo><mi>D</mi><mo>-</mo><msub><mi>y</mi><mi>o</mi></msub><mo>)</mo></mrow><mo>&CenterDot;</mo><mo>/</mo><msub><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mo>+</mo><msub><mi>x</mi><mi>o</mi></msub></mrow></mtd></mtr><mtr><mtd><mrow><mi>y</mi><mo>=</mo><mi>D</mi></mrow></mtd></mtr><mtr><mtd><mrow><mi>z</mi><mo>=</mo><msub><mover><mi>x</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mo>&times;</mo><mrow><mo>(</mo><mi>D</mi><mo>-</mo><msub><mi>y</mi><mi>o</mi></msub><mo>)</mo></mrow><mo>&CenterDot;</mo><mo>/</mo><msub><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mo>+</mo><msub><mi>z</mi><mi>o</mi></msub></mrow></mtd></mtr></mtable></mfenced>]]></math><img file="FDA0000966185920000023.GIF" wi="678" he="406" /></maths>上式中代入激光扫描方程<img file="FDA0000966185920000024.GIF" wi="254" he="78" />即可得到y=D墙面上完整的激光扫描轨迹,具象地表达出该扫描成像系统在y=D处的扫描范围;步骤3:在仿真环境Matlab中,导入目标模型文件,读取目标空间三角网格模型顶点坐标node_xyz和面片信息face_node,其中node_xyz为3×num_node矩阵,矩阵每列存放一个顶点的空间三维坐标,num_node为顶点总数,face_node为3×num_face矩阵,矩阵的每列存放一个三角面片的三个有序顶点的顶点索引值,num_face为三角面片总数;计算目标包围球球心位置C和半径大小r;估算激光光束在目标表面行扫描方向上的线分辨率l=r+α×dist ance(C,O),其中distance(C,O)表示目标包围球球心C和激光光束出射位置O两点间欧氏距离;将目标几何变换至成像系统视场范围内,其几何变换矩阵根据目标包围球位置、半径大小以及成像系统扫描范围确定;步骤4:基于光束和三角面片求交法,在遍历激光扫描光束求解其与目标三角模型各面片的相交情况时,引入局部搜索技术,加速仿真成像过程,生成目标距离图像,结合激光光束方程即可获得扫描阵列点云。其具体方法步骤如下:(4‑1):遍历激光扫描光束,在遍历每一行激光光束前将“脱靶”标记state复位,即state=0,后续激光光束根据该标志是否置位决定是否进入局部搜索过程;(4‑2):对于第i行第j列激光光束,首先判断该激光光束是否与球心位置为(x<sub>c</sub>,y<sub>c</sub>,z<sub>c</sub>)、半径为r的包围球相交,若相交,则继续步骤(4‑3),判断该光束是否与目标三角模型相交;否则表明该激光光束“脱靶”,即没有照射在目标上,记录<img file="FDA0000966185920000033.GIF" wi="267" he="79" />不改变state值,j++,跳转至步骤(4‑1),遍历至下一激光光束;若光束与包围球相交,则将光束参数方程代入包围球方程后所得一元二次方程有解。包围球方程为:<maths num="0005" id="cmaths0005"><math><![CDATA[<mrow><msup><mrow><mo>(</mo><mover><mi>x</mi><mo>&CenterDot;</mo></mover><mo>-</mo><msub><mi>x</mi><mi>c</mi></msub><mo>)</mo></mrow><mn>2</mn></msup><mo>+</mo><msup><mrow><mo>(</mo><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mo>-</mo><msub><mi>y</mi><mi>c</mi></msub><mo>)</mo></mrow><mn>2</mn></msup><mo>+</mo><msup><mrow><mo>(</mo><mover><mi>z</mi><mo>&CenterDot;</mo></mover><mo>-</mo><msub><mi>z</mi><mi>c</mi></msub><mo>)</mo></mrow><mn>2</mn></msup><mo>=</mo><msup><mi>r</mi><mn>2</mn></msup></mrow>]]></math><img file="FDA0000966185920000031.GIF" wi="862" he="79" /></maths>将第i行第j列激光光束参数方程代入包围球方程,整理所得一元二次方程为:<maths num="0006" id="cmaths0006"><math><![CDATA[<mfenced open = "" close = ""><mtable><mtr><mtd><mrow><mover><mi>R</mi><mo>&CenterDot;</mo></mover><msup><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mo>)</mo></mrow><mn>2</mn></msup><mo>+</mo><mn>2</mn><mrow><mo>(</mo><mrow><msub><mover><mi>x</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mo>)</mo></mrow><mrow><mo>(</mo><mrow><msub><mi>x</mi><mi>o</mi></msub><mo>-</mo><msub><mi>x</mi><mi>c</mi></msub></mrow><mo>)</mo></mrow><mo>+</mo><msub><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mo>)</mo></mrow><mrow><mo>(</mo><mrow><msub><mi>y</mi><mi>o</mi></msub><mo>-</mo><msub><mi>y</mi><mi>c</mi></msub></mrow><mo>)</mo></mrow><mo>+</mo><msub><mover><mi>z</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mo>)</mo></mrow><mrow><mo>(</mo><mrow><msub><mi>z</mi><mi>o</mi></msub><mo>-</mo><msub><mi>z</mi><mi>c</mi></msub></mrow><mo>)</mo></mrow></mrow><mo>)</mo></mrow><mover><mi>R</mi><mo>&CenterDot;</mo></mover><mrow><mo>(</mo><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow><mo>)</mo></mrow></mrow></mtd></mtr><mtr><mtd><mrow><mo>+</mo><msup><mrow><mo>(</mo><mrow><msub><mi>x</mi><mi>o</mi></msub><mo>-</mo><msub><mi>x</mi><mi>c</mi></msub></mrow><mo>)</mo></mrow><mn>2</mn></msup><mo>+</mo><msup><mrow><mo>(</mo><mrow><msub><mi>y</mi><mi>o</mi></msub><mo>-</mo><msub><mi>y</mi><mi>c</mi></msub></mrow><mo>)</mo></mrow><mn>2</mn></msup><mo>+</mo><msup><mrow><mo>(</mo><mrow><msub><mi>z</mi><mi>o</mi></msub><mo>-</mo><msub><mi>z</mi><mi>c</mi></msub></mrow><mo>)</mo></mrow><mn>2</mn></msup><mo>-</mo><msup><mi>r</mi><mn>2</mn></msup><mo>=</mo><mn>0</mn></mrow></mtd></mtr></mtable></mfenced>]]></math><img file="FDA0000966185920000032.GIF" wi="1758" he="199" /></maths>所以该激光光束与包围球是否相交,等价于上述一元二次方程Δ值是否大于等于0;(4‑3):判断该激光光束是否与目标三角模型相交。根据“脱靶”标志state的值决定是否引入局部搜索技术;若state=0,进入步骤(4‑4),遍历目标三角网格模型所有三角面片,基于光束和三角面片求交法,求解交点位置;若state=1,跳转至步骤(4‑5),遍历位于上一激光光束与目标模型交点搜索半径内的三角面片,基于光束和三角面片求交法,求解交点位置;(4‑4):遍历目标三角网格模型三角面片,基于光束和三角面片求交法,依次求解该激光光束与各三角面片所在平面的交点P=O+tD<sub>ij</sub>,其中t是交点P与激光出射点O的距离,<img file="FDA0000966185920000041.GIF" wi="750" he="78" />是该激光光束方向。若交点P位于相应的三角面片内部,则P为该激光光束与目标空间三角网格模型的相交位置,记录R(i,j)=t,置位state=1,j++,跳转至步骤(4‑1),遍历至下一激光光束;否则,继续遍历下一个三角面片。若遍历模型所有三角面片后,交点均不位于相应的三角面片内部,则表明该激光光束“脱靶”,记录R(i,j)=0,不改变state值,j++,跳转至步骤(4‑1),遍历至下一激光光束;(4‑5):首先将搜索半径设置成激光行扫描方向上的线分辨率wr=l,搜索出与上一交点P距离小于wr的顶点,将顶点序号记录在集合PC中;若集合PC为空集合,则扩大搜索半径wr=1.5×wr再次进行顶点搜索,直至PC非空;搜索出包含PC中顶点的三角面片,将面片序号记录在集合FC中;遍历FC中三角面片,基于光束和三角面片求交法,依次求解该激光光束与各三角面片所在平面的交点P=O+tD<sub>ij</sub>;若交点P位于相应的三角面片内部,则记录R(i,j)=t,置位state=1,j++,跳转至步骤(4‑1),遍历至下一激光光束;否则,继续遍历下一个三角面片;若遍历FC中所有三角面片后,交点均不位于相应的三角面片内部,则记录<img file="FDA0000966185920000042.GIF" wi="259" he="79" />复位state=0,j++,跳转至步骤(4‑1),遍历至下一激光光束;(4‑6):激光扫描光束遍历结束,输出m×n距离图像<img file="FDA0000966185920000043.GIF" wi="82" he="79" />结合激光光束方程即可获得扫描阵列点云,具体公式如下:<maths num="0007" id="cmaths0007"><math><![CDATA[<mfenced open = "{" close = ""><mtable><mtr><mtd><mrow><mover><mi>P</mi><mo>&CenterDot;</mo></mover><msub><mi>t</mi><mi>x</mi></msub><mo>=</mo><msub><mover><mi>x</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mo>.</mo><mo>*</mo><mover><mi>R</mi><mo>&CenterDot;</mo></mover><mo>+</mo><msub><mi>x</mi><mi>o</mi></msub></mrow></mtd></mtr><mtr><mtd><mrow><mover><mi>P</mi><mo>&CenterDot;</mo></mover><msub><mi>t</mi><mi>y</mi></msub><mo>=</mo><msub><mover><mi>y</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mo>.</mo><mo>*</mo><mover><mi>R</mi><mo>&CenterDot;</mo></mover><mo>+</mo><msub><mi>y</mi><mi>o</mi></msub></mrow></mtd></mtr><mtr><mtd><mrow><mover><mi>P</mi><mo>&CenterDot;</mo></mover><msub><mi>t</mi><mi>z</mi></msub><mo>=</mo><msub><mover><mi>z</mi><mo>&CenterDot;</mo></mover><mi>d</mi></msub><mo>.</mo><mo>*</mo><mover><mi>R</mi><mo>&CenterDot;</mo></mover><mo>+</mo><msub><mi>z</mi><mi>o</mi></msub></mrow></mtd></mtr></mtable></mfenced>]]></math><img file="FDA0000966185920000051.GIF" wi="462" he="294" /></maths>其中<img file="FDA0000966185920000052.GIF" wi="294" he="86" />分别表示阵列点云在x,y,z轴向上的坐标。
地址 200083 上海市虹口区玉田路500号