科协五分钟|用Matlab实现激光扫描测距绘制面型

这次给大家介绍以下如何用Matlab控制步进电机和激光器进行激光扫描,并且将采集的点转化为图像。PS:如果你是科创大佬,或是上过专业认知实践课程,请点击屏幕左上角的白色X

关于Matlab

各位大佬对于Matlab自然并不陌生,八字班的筒子们可能对它还并不太了解,这里简单叨唠叨唠。

Matlab是Matrix&laboratories的组合,是不是一看就充满了数学气息?没错,这就是一款“数学软件”!你还在为矩阵运算烦恼吗?你还在被线代行列式折磨吗?Matlab将解救你于苦海。详情请见精小仪历史记录

如何实现激光扫描

为了实现激光扫描,顾名思义,我们需要这几个步骤:有一个激光(feihua)、让激光动起来、接收反射信号、绘制面型。为此我们需要一个激光器、一个二维步进电机以及我们的计算机。由于要扫描得到一个3D的面型,因此我们想要得到的不仅是2维的平面位置信息,还需要有第三个方向,即深度的信息。为此,需要使用激光进行测距(这个数据是深度方向)

将激光器和步进电机连接到计算机上,理论上我们就完成了连接工作,但为了能够使用计算机控制设备工作,我们还差一步。

串口通信协议

就如同不同国家的人相互交流要用同一种语言,不同设备之间传递信息也必须要使用相同的语言。而串口就像我们的USB,是物理上的连接端口,而串口协议则是命令的语言规则。这里我们使用串口助手来传达命令

左边的端口用于设置USB接口,波特率则是传输信号的频率。重点关注发送区,可以看到我们发送的是一串字符串,而这些字符串的使用规则则由生产商规定,它们在传输时将会被转为一串高低电平,可以被设备识别并执行,我们称之为通信协议。例如:图中发送了一串字符“02 04 4E 43 97 03”,其中开头的02和末尾的03作为起始和截止信号,04代表中间信息长度,4E和43则是控制系统进行操作的指令,97是校验码。不同厂家的设备会有不同的协议,日后大家使用或者自己设计时,一定要注意。

当我们使用Matlab编写程序时,要注意将输出的内容转为通信协议规定的内容格式,否则设备是识别不了的哦。

如何实现扫描

使用信号接收装置如CCD等进行采样时,采集到的数据点是不同时刻激光点的位置。为了实现扫描,我们需要编写程序使电机按一定规律移动。这在Matlab上写出来是这个样子,我们这里写的扫描方式是逐行扫描,那其他的扫描方式呢?大家可以开动脑筋,设计出更加高效的扫描方式

这里的xnum和ynum分别是步进电机沿x轴和y轴方向的移动次数,而除此之外,我们还需要设置步进量,即每移动一次电机移动多远的距离。我们用xstep和ystep表示。

细心的同学应该可以发现,在设置upward等四个方向的步进时,输出的是一串字符,至于原因,还记得之前所说的串口通信协议吗?这是为了与协议的内容相对应

在扫描并采样数据后,我们将扫描测距得到的数据保存下来并绘图。这里我们扫描一个斜面

而绘制出的图像是这个样子

大家可能奇怪,为什一个斜面绘制出来是凹凸不平的?其实主要原因是我们的激光测距精度较高,而测量时又有振动,得到的点的深度信息往往和实际有一定差距。况且,即便是一张纸,它的表面的高低起伏在较高精度下还是很明显的。

PS:试想一下,如果我们使用的电机只能进行绕着x,y轴的转动,即光源位置固定,而不能沿两个xy轨道进行平移,我们要如何进行修正呢?

图形界面

关于图形界面,我们需要设计一个窗口,用于控制开关和输入参数,这里就不展开介绍了。有兴趣的同学可以自学Matlab教程或来参加科协举办的“Matlab教学”

关于Matlab写激光扫描测距的内容就简单介绍到这里,如果八字班的同学们对这类技术感兴趣,记得要选修下个学期的“测控技术与仪器专业认知实践”哦(憨厚的笑容)