Android手机上的3D激光扫描仪


我向您展示了基于Android智能手机的DIY扫描仪。

在设计和创建扫描仪时,首先,我对扫描大对象很感兴趣。 最小-一个人完全成长的身影-至少1-2毫米。

这些标准已经成功实现。 在自然光下(没有阳光直射)成功扫描物体。 扫描场由智能手机的摄像头的捕获角度以及激光束保持足够的亮度进行检测(在一天中的房间内)的距离确定。 这是一个人的身高(1.8米),工作宽度为1.2米的图。

该扫描仪的考虑因素是“以及在无事可做时是否应该做一些有用或有趣的事情”。 所有插图均基于“测试”对象的示例(上传人体扫描不正确)。

经验表明,对于这种软件的扫描仪来说,它是次要的,花费的时间最少(对于最终版本,除了实验和死胡同之外)。 因此,我将不涉及本文中软件的功能(本文结尾处的源代码链接)。

本文的目的是讨论死锁分支和在创建最终工作版本的过程中收集的问题。

对于扫描仪,最终版本使用:

  1. 三星S5手机
  2. 带透镜的红色和绿色激光器的玻璃线(90度线)的功率为30 mW(不是最便宜的)。
  3. 步进马达35BYGHM302-06LA 0.3A,0.9°
  4. A4988步进电机驱动器
  5. 蓝牙模块HC-05
  6. STM32F103C8t开发板

A4988驱动程序设置为半步,如果使用15-> 120变速箱,则每个PI的速度为400 * 2 * 8步。

扫描技术的选择。


考虑了以下各种选择。

LED投影仪。


对该选项进行了考虑和计算。 即使是昂贵的投影仪,也没有合适的分辨率来达到所需的精度。 而且甚至不值得谈论廉价的。

机械扫描结合衍射光栅的激光束。


这个想法已经过测试,被认为是合适的。 但不是出于DIY表现,原因如下:

  1. 我们需要一个足够强大的激光,以便衍射后的标记足够明亮(与智能手机镜头的距离为1..2米)。 我的眼睛很抱歉。 已经具有30mW的激光点没有用。
  2. 对于DIY性能,在2个平面上进行精确机械扫描的要求太高。

在固定的扫描对象上进行激光线的标准机械扫描。


最终,该选项是由两种不同颜色的激光器选择的。


  1. 不同颜色的激光使得可以在一帧中独立检测它们。
  2. 激光在相机相对两侧的位置使您可以一次通过两次扫描。
  3. 一次进行两次扫描,可以客观地评估扫描仪对齐的质量(扫描必须会聚和重叠)。

事实证明,最后一个标准是最重要的。 扫描质量完全取决于测量扫描仪的几何尺寸和角度的准确性。 而且来自两个激光器的两次扫描使您可以立即评估扫描的质量:
点云聚集。 即 由两个激光器捕获的平面会聚在整个表面上。

28BYJ-48上的机械零件版本不成功。



尽管从一开始我就认为这是一个死胡同,没有提供必要的准确性,但我仍然通过各种技巧对其进行了检查:

  1. 电动机的轴由轴承固定。
  2. 增加了摩擦元件和制动器,用于齿轮箱间隙采样。
  3. 尝试通过光电晶体管通过激光曝光确定“精确位置”

返回到激光线的同一位置的可重复性很低-在1.5米的距离处为2-3 mm。 在齿轮操作过程中,尽管表面很光滑,但在1.5米的距离上仍可看到1-3毫米的冲击。

即 28BYJ-48完全不适合或多或少准确的大型物体扫描仪。

根据我的经验扫描要求


扫频的必选元素必须是变速箱。

不要担心1 / x步长模式。 实验表明,在A4988上以1/16模式执行的微步距不均匀。 并且以1/8的比例在眼睛中明显可见。

变速箱的最佳解决方案是使用皮带轮。 尽管事实证明它很麻烦,但它易于创建且准确。
对于4米距离处的5mm激光线宽,激光的定位精度(更精确地,用于扫描的激光的初始位置的定位可重复性)变为约0.5mm。 即 在扫描距离(1.2-1.8米)处,通常很难测量。

定位-光耦合器(中文名称)在激光器下方的磁盘插槽中。

从电话向激光和步进电机的控制模块传输控制信号时出现问题


就扫描速度而言,控制通道成为瓶颈。 由于这是您自己的休闲DIY开发,因此尝试了所有与智能手机通信的方法。

通过音频插孔传输控制信号(电话音频插孔=>示波器)


实时传输数据的最具抑制性的方式。 是的,即使有浮动时间。 最长500毫秒(!),从软件激活音频数据传输到音频插孔中信号的实际出现。

这个异国情调得到了检查,因为在工作中,我不得不与移动芯片卡读取器打交道。

智能手机屏幕上的光电二极管(电话屏幕的片段=>光电晶体管+ STM32F103)


出于兴趣的考虑,甚至将这种奇异的方法也作为具有2x2矩阵且在屏幕上呈衣夹形的光电晶体管进行了测试。

尽管这种通过电话传输信息的方法是最快的,但是从根本上讲,它不比蓝牙快(10毫秒对50毫秒),而蓝牙可以弥补其缺点(屏幕上挂有衣夹)。

红外通道(电话=> TSOP1736-> STM32F103)


经过实际验证和通过红外通道传输的方法。 甚至必须完成数据传输协议的某些实现。

但是,IR也不是很方便(将光传感器安装在手机上很不方便),并且速度不比蓝牙快。

WiFi模块(电话=> ESP8266-RS232-> STM32F103)


检查该模块的结果被证明是完全令人沮丧的。 运行时请求响应(echo)意外地在20-300 ms(平均150 ms)的范围内浮动。 为什么和什么-不明白。 我仅碰到一篇文章,描述了使用ESP8266进行严格的请求/响应时间要求的实时数据交换的尝试失败。

即 具有“标准” TCP-> RS232固件的ESP8266不适合此类用途。

控制模块和信号传输的选定选项


最终,在所有实验之后,选择了蓝牙(HC-05模块)通道。 它提供了稳定的(这是最重要的)数据传输请求响应时间,为40ms。

时间相当长,并且极大地影响了扫描时间(占总时间的一半)。
但是没有实现最佳选择。

作为控制模块,广泛使用SM32F103C8T的板卡。


用于检测框架中线条的方法。


隔离框架中激光线的最简单方法是在关闭激光的情况下对框架进行减影,而在激光的情况下对框架进行减法。

原则上,逐帧搜索也可以不减法地工作。 但是在白天它的效果要差得多。 尽管此模式保留在软件中以进行比较测试(以下模式的照片。所有其他照片都具有帧减法模式)。


不减去帧的选项的实际价值很低。

有可能从该噪声信息中提取激光信号。 但是,他没有打扰。

带有帧减法的选项效果很好。

任何试图逼近直线并处理整个帧的实验都表明,算法越复杂,“出错”的可能性就越大,甚至会降低运行速度。 在水平线上找到激光(激光点)的最快(也是最简单)的算法是:

  • 对于该线的每个点,均应考虑配置中指定的窗口中激光色级(RGB)的平方和(13 px-该窗口的实验最佳值)
  • 激光点位于窗口的中间,具有“色”级总和的最大值。

通过搜索“绿线”和“红线”来处理一帧的时间为3ms。

红色和绿色激光的点云分别计算。 通过适当的机械调整,它们的精度将降低至<1 mm。

精度和对准


距离1.2米处的精度在1毫米以内。 主要原因是手机摄像头的分辨率(1920x1080)和激光束宽度。

获得正确的扫描以配置静态和动态非常重要。 在将两个点云都加载到MeshLab中时,可以清楚地看到准确性/不准确性。 理想情况下,点云应该会聚,彼此互补。

静态参数设置尽可能精确一次:

  1. 摄像机视角的切线。
  2. 激光“肩”的长度(从透镜中心到旋转轴)。

当然,在给定的扫描距离和激光线的“垂直度”下,激光透镜的最大聚焦。

当将电话混入安装座中时,必须再次调整激光器相对于框架虚拟平面的位置实际角度的动态参数。 为此,将在软件中进行配置模式。 通过将激光屏幕减小到中心并调整角度,有必要将两个激光的计算距离设置为尽可能接近真实(测量)距离。

进行微调之前:


调整后:


结论


也许任何人都可以重复这种设计。 我将所有细节从玻璃纤维切割到CNC。

当然,如果没有CNC铣床,很难在激光下制造皮带轮。 但是考虑到您需要最大90度的旋转角度并要有足够的耐心,滑轮也可以用锉刀切掉。

但是最好在CNC上进行。 旋转组件轴向游隙的要求很高。 扫描质量是100%,取决于制造和对齐的准确性。

扫描仪在后台运行。 有时会间歇性地几个月。 因此,我无法评估其创建的总体复杂性。

该结构的总成本不太高。 如我的实验所示,尽管它与大型物体的工业扫描仪相距甚远,但您可以获得相当不错的扫描结果。
扫描质量主要受机械零件精度的影响。 从这个意义上讲,在DIY中很难处理为工业扫描仪创建的机制。

源代码

Source: https://habr.com/ru/post/zh-CN412479/


All Articles