激光雷达(LiDAR)是激光探测及测距系统的简称,目前广泛应用在无人驾驶和扫地机器人等领域。这种广泛的应用一方面得益于激光雷达的性能提升,一方面也得益于其成本的下降。
根据扫描方式,激光雷达可分为 MEMS 型、Flash 型、相控阵型、机械旋转型;根据线数,可分为单线型和多线型:
话说回来,有没有可能自制一个激光雷达?B 站的一位硬核 UP 主「不想宅的技术宅」还真就把这个小目标实现了。
UP 主用了大半年的业余时间,用一个激光测距传感器整出了一个单线机械旋转式激光雷达,总共包括硬件设计、结构设计、FPGA 开发和 3D 打印几个步骤。对于 UP 主来说,这不算是新的挑战,只能算是「把以前学过的东西复习了一遍」:
虽然 UP 主很谦虚,但很多人播放完视频之后,只能表示「不懂,但受到震撼」:
做一个激光雷达,需要哪些基本部件?
UP 主选用了一款 FPGA 开发板,主芯片为 Xilinx ZYNQ7000,板上搭载了一个最高可输出 1080p60 帧视频的 HDMI 接口、32 个 GPIO(通用输入输出接口)等其他外设。在这块开发板上,将要完成雷达数据的采集、运算和显示。
此外还有一个直流减速机,额定电压为 12V,减速比为 1:30,最大输出转速为 300 转每分钟,电机尾部安装了 500 线的光电编码器,通过光电编码器可以获知输出轴的转动角度。
最后,还有一个激光测距传感器,测距精度为 1cm,量程为 12m,每秒钟可以测量 1000 次,输出接口为串口。
这些就是自制激光雷达所需要的基本部件,然后就是结构设计的问题了。
结构设计
UP 主表示,激光雷达在工作时,探头需要连续旋转,因此探头和底座的信号传输无法用导线连接,否则会引发缠绕问题,他通过导电滑环解决了这个问题。导电滑环内部是一组电刷,可以解决信号线在旋转情况下的缠绕问题:
如此,激光雷达就设计好了:
整个激光雷达分为底座和探头,探头和底座通过旋转轴进行连接,激光测距传感器通过螺丝固定在探头基座上。
探头基座内部还固定有转子 PCB,底座部分固定有导电滑环、电机和定子 PCB。
在实际装配时,电机输出轴和导电滑环和旋转中心因为误差关系大概率不会处于同一轴心上,这里使用了一个弹性连轴器来补偿轴向偏差:
探头和底座之间设计了一对红外对管,用来确定探头转动的初始位置:
至此,结构设计就完成了。随后将设计好的结构件在 3D 打印软件中添加支撑,然后切片,最后通过 3D 打印机打印出来。打印好的探头基座、探头盖和底座就是这样:
硬件电路设计
整体框架如图所示,包含定子 PCB 和转子 PCB:
下图是整个电源以及隔离设计的框图,整个电机控制部分和其他电路没有实际的连接,电机在工作时不会干扰其他电路:
再之后是 PCB 设计:
一番装配之后(此处省略一万个步骤),激光雷达就做好了:
激光雷达和 FGPA 之间通过排线进行通信。在软件设计上,分为两部分:PS 侧的嵌入式开发,以及 PL 侧的 FPGA 开发,相比之下,PL 侧的开发显得比较复杂。整体框图如下:
而主要的难度恰恰在于 FPGA 部分。UP 主表示:「要把雷达数据叠加在视频数据流上,费了我不少脑细胞。」
最后,看下实际运行效果
受限于激光测距传感器测量频率,探头转动一圈采集 500 个点的数据,所以激光雷达的扫描频率只能做到 2Hz 每秒。
为了视觉效果,UP 主加上了雷达扫描线,最终实现的效果还是不错的:
目前,UP 主已经把视频中激光雷达的结构和 pcb 设计文件上传到 Github 平台,想要做一个玩玩的小伙伴可以去下载。