之前在玩网上看到有大佬自己做三维建模的东西,就学习了一下自己也来做一个,造价不到200的成品如下,扫描出来出来的样子大概能看。。。接下来分享下怎么做的。
平面测距
首先我们要了解一下激光雷达怎么做到平面测距,现在激光平面测距主要有相位测距,TOF测距和三角测距,我选择的是三角测距,因为对于3D的环境用相位和TOF的话要对多点同时进行激光的控制,或多或少用上振镜,调制器什么的,时间和财力有限就没选这两条路。
红色的是光路,CG是摄像头里面的CMOS成像镜面,AF就是最开始的图中的白色架子,F是镜头的焦点,简而言之一束光打到B反射后成像在D,是要得到CD的长度就可以算出距离q。下面上公示:
- 其实AB和CF是平行的,所以才有第一个公式的比例关系
- f是镜头的焦距,在选镜头的时候就知道了,这是个已知数
- s是支架的长度,就是开头图片中白色支架的长度,这个也是自己设计的是已知数
- x是CD的距离 = 像素点个数x像素点宽度,只要能在软件中读出来像素个数,算出x也不难
- β是激光出射光路和支架的角度,这个也是实现设计好的,打个比方焦距是3.6mm,CMOS镜面是一行1280个点,一个点3um的宽度,CMOS镜面一般的宽度就是1.92mm,那这个角度就是61.93°
有了这么多变量算距离应该不是什么难事了,公式里的f是镜头的焦距,选镜头的时候就知道了是个已知数,距离表述里L和q是两种表述距离的方法,一个是物体到激光器的距离,一个是物体到支架的垂直距离,二选一即可,最后一个公式测距精度和测量距离的关系,测量距离越远精度越差,这个公式是用来选择器件用的。
三维测量
通过平面测量我们可以知道CH或者CE的长度,激光用的是线激光,打出去是一条AD的线,我们需要测量线上每一个点到ε平面的距离,比如B点,同样用等腰三角形的原理在成像图片上算出B’C’就行。
算出线激光上每个点到ε平面的距离,在让这条激光扫过房间就可以建模了。
器件选择
支架长度和镜头焦距
这两个参数的放在一起说,他们是一对对的,一组参数就确定了一组精度,可视角度,可视距离以及。。。颜值。支架的间距太宽的话真的太丑了。
我列了一个表有关不同参数搭配时的系统性能,间距就是上一节的S,角度是上一节中的β。我自己看了一下钱包选择了选中的那行参数O(∩_∩)O哈哈~我们可以看到图中有些搭配在5cm出的精度非常高甚至可以用于简单的工业检测,事实也确实是这样,我在后期改造已个一个近程扫描的设备确实可以达到这个精度。
这里还要注意镜头的选择不能一味追求精度,还要考虑垂直可视角度,不然选了16mm的镜头,5米处的垂直测量范围只够扫一个垃圾桶。
超薄步进电机
这个玩意儿淘宝随便选一个,不多介绍。
光源
淘宝50的808nm红外一字线激光emmm,就这个,记得给镜头贴个808nm的滤光片就行了
硬件电路
这边板子的外形是根据三脚架的台面设计的,还有四个螺丝孔固定,中间的孔是过步进电机的转轴的。
这边其实考虑过上FPGA不过PCB空间有限,还是把图像处理交给了电脑。如果用FPGA onboard处理图像,直接把距离数据给电脑,扫描速度至少能快3倍。
软件
软件这边的框架是VS的MFC+OpenCV+PCL,opencv负责处理图像,PCL负责点云显示,还有一个Matlab用来矫正摄像头畸变。算法用的是插值和灰度重心法找点,这边代码较多不可能贴上来了。
调试的时候就是这个样子的。
200¥扫描仪总成
总结
把大概的制作流程介绍了一下,没有附上全部的代码和细节,白嫖党可能要自行脑补补全细节了。也是给有兴趣的人提供一点思路,可以在这个基础上做一个同时采集点的颜色的功能。我这个做的也有很多弊端,没有上FPGA是一个遗憾,只能扫描180°也是个遗憾,应为一些走线问题不能360转,也曾想过用解除铜片的方式传数据,但是没有时间做可靠性验证就没有上。光源亮度不能调也是个败笔,极大地影响了测量精度。
最短测量距离附近的精度很高,改进后真的可以工业用。
文中所有图片和文字都是自己写的自己拍的,如果大家有在正规论文中看到一模一样的图不要慌不要说我侵权,那就是我自己写的o( ̄︶ ̄)o,请各位转载或引用时注意相关规范。