上一回我跟朋友聊3D扫描,他说去打印店扫一个手办模型要两百多块,还得排队等好几天。我说你这两百多够我攒一台能反复用的扫描仪了,而且这台设备平时还能当网络摄像头用、当无线遥控手柄用。他不信,直到我把采购账单拍他面前——全部零件加一起没超过100块。核心硬件就是一块巴掌大的ESP32-CAM开发板,板载一颗200万像素的OV2640摄像头,自带WiFi,几十块钱,能拍照、能建站、能发蓝牙信号。这篇文章就把这套"一机三用"的玩法完整拆开,讲讲3D扫描怎么用照片堆出来、摄像头参数怎么调、以及控制器这个身份到底怎么落地。适合手里有3D打印机、想做逆向扫描、或者纯粹想在电子垃圾里折腾出花样的朋友。
1. 一机三用的整体设计思路
1.1 为什么是ESP32-CAM,而不是其他更贵的方案
做3D扫描,市面上的成熟方案不少:微软的Kinect、Intel的RealSense、苹果的LiDAR,随便一个都得几百上千块。它们用的是结构光或ToF(飞行时间)原理,直接拿深度信息,精度确实高,但对业余玩家来说有两个问题:一是贵,二是这些设备通常还要配一台性能不错的电脑来跑SDK。我需要的是"能扫描就行、精度够用就行、坏了不心疼"的方案,所以目光直接转向纯视觉路线——用普通2D摄像头拍多角度照片,再通过摄影测量软件重建3D模型。这条路线的硬件成本被压到了极致,一台能拍出清晰照片的相机就能干。
那为什么偏偏选ESP32-CAM而不是旧手机或者树莓派?旧手机画质确实更好,但要用它做自动化扫描,得装一堆App、处理电池供电、还有系统锁屏等问题,折腾成本高。树莓派Zero W加摄像头模块也能做,但整套下来150元以上,而且摄像头排线容易被静电打坏。ESP32-CAM最大的优势是"生来就是干这个的":它一路板载摄像头,一路WiFi天线,MCU主频240MHz,能跑TCP/IP协议栈,还能直接输出JPEG。在Arduino生态里,官方就有CameraWebServer例程,烧进去之后浏览器开个网页就能预览和拍照,几乎零门槛。这个条件对后面的扫描流程太关键了——自动化拍照时需要远程触发快门,ESP32-CAM天然支持HTTP请求控制,不用额外接线。
有朋友可能问,为什么不干脆买个便宜的网络摄像头加舵机?那样做也行,但网络摄像头一般不带GPIO,没法直接驱动舵机和步进电机,你还得再拖一块单片机。ESP32-CAM把这些事全包了:摄像头、WiFi、GPIO、蓝牙(部分型号)都在一块板子上,做一个3D扫描台,它既是眼睛又是大脑。这就是"一机三用"的硬件基础——一根USB线供电,一块板子干三份活。
1.2 "Controller"到底是哪个Controller
标题里这个Controller,很多人第一反应是别的。有人以为是Java后端那套Controller层,整天琢磨怎么防爬虫;有人以为是BIOS里的SATA控制器模式,在AHCI和RST之间来回切换;还有人以为是USB 3.0主控驱动,翻出瑞萨的驱动盘在装。这些全都不挨着。这里说的Controller是硬件层面的两类角色:第一类是"控制台",也就是通过网页或手机把云台、旋转台、拍照动作全部握在手里;第二类是"手柄",让ESP32-CAM化身一个无线游戏手柄,模拟Nintendo Switch Pro Controller这类设备,用来遥控电脑、手机或者游戏机。
为什么要把Controller和相机、扫描仪放在一起?因为三者的底层资源是重叠的。ESP32-CAM上的每个GPIO引脚,在扫描模式里是舵机PWM信号,在相机模式里是快门触发信号,在控制器模式里是按键状态输入。WiFi在扫描模式里传输图片流,在控制模式里传输指令和遥测数据。蓝牙(需要板载BLE的型号)则单独负责手柄这一路。说白了,这块板子的潜力远不止拍照记录,它本身就是一个完整的物联网控制器节点。省掉任何一块独立单片机,硬件成本就下来了。
1.3 三个角色如何共享一套硬件
这三个功能并不是"三选一",而是在同一套硬件上通过软件切换。我实际用的时候,平时它就是挂在书架上的一台WiFi相机,需要扫描时把物体放到旋转台上,手机打开控制页面,点一下按钮开始自动拍照。扫描完毕后切回正常模式,它又变成手柄连到电脑上打游戏。硬件不需要重新接线,固件里用模式变量做分发。启动后默认进入相机模式,收到特定路径的HTTP请求就进入扫描模式,再收到重置指令就退出。
这种共享设计有一个隐含的好处:三个功能互相成为对方的基础设施。扫描模式需要稳定拍照,相机模式本来就把拍照这条路打通了;控制器模式需要可靠的PWM输出,扫描模式里的云台控制恰好也在用同样的引脚。所以组装的时候,我优先把云台舵机、步进电机驱动、摄影机位这三套硬件同时布置好,一次接线,三个模式通吃。
2. 材料清单与组装细节
2.1 物料成本和采购建议
先上账单,我这边是按能买到的最低价格为标准件来算的:
| 物料 | 规格 | 大致价格 |
|---|---|---|
| ESP32-CAM开发板 | AI Thinker款,OV2640,带天线 | 25-30元 |
| FTDI(USB转TTL)下载器 | CP2102或CH340 | 8-12元 |
| 9g金属舵机 | SG90/MG90S,用于云台 | 8-12元 |
| 28BYJ-48步进电机 | 带ULN2003驱动板 | 12-15元 |
| 激光切割亚克力或3D打印支架 | 用自己打印机的话只算耗材 | 8-15元 |
| 杜邦线、面包板、电容 | 若干 | 5-10元 |
| USB供电头或充电宝 | 5V 2A即可 | 0-20元 |
总计在70到110元之间浮动。如果你手头已经有ESP32-CAM和3D打印机,实际新增开销可能不到50块。采购的时候注意两点:一是ESP32-CAM尽量选带IPEX天线的版本,板载PCB天线的信号在金属外壳里会被压得很惨;二是FTDI下载器别贪太便宜的,CH340芯片的稳定性口碑更好,刷机中途断开是最折磨人的事。
2.2 云台与旋转台:两种运动方案的取舍
3D扫描需要"相机动或者物体动",我选的是转台方案——物体转,相机不动。之所以不选云台扫拍,是因为物体旋转360度后,能稳定获得物体四周的完整外观,重建算法更容易收敛。旋转台用28BYJ-48步进电机驱动,它转速慢、扭矩足够支撑小物体,价格比42步进电机便宜一半还多。步进电机的转角精度高,配合ULN2003驱动板,可以用四个IO引脚控制脉冲,每转一圈需要2048个步进,标准半步步距0.0879度,够用了。
云台则是给相机用的,用两个9g舵机组成二轴云台,一个负责俯仰,一个负责水平。扫描过程中云台主要负责调整拍摄角度,比如从俯视45度拍一圈,再从平视拍一圈。舵机带的是角度控制,从0度到180度,精度约1度,配合固定机位做多高度扫描非常顺手。
旋转台和云台需要分开供电,这是最容易踩坑的点。ESP32-CAM在开WiFi传JPEG时峰值电流能到300mA以上,两个9g舵机堵转时电流更大,28BYJ-48电机单相驱动电流也在150mA左右。如果全挤在一个5V 1A的充电头上,电压一掉,摄像头画面就开始花屏,舵机也会疯狂抖动。我的做法是:ESP32-CAM和云台舵机共用一路5V 2A供电,步进电机驱动板单独用一路5V,两路电源共地但不共用输出。这样即使电机启动导致电压瞬时跌落,也不会把摄像头拉垮。
2.3 接线与供电:最容易翻车的环节
接线图我按自己的习惯整理一下。ESP32-CAM上可用的GPIO中,IO14接云台水平舵机信号线,IO12接俯仰舵机信号线,IO15、IO2、IO4、IO16分别接ULN2003驱动板的IN1、IN2、IN3、IN4。这样安排把PWM引脚和普通IO分开,不容易互相干扰。注意ESP32-CAM的IO0用于下载模式选择,别接到驱动板上,否则每次刷机都要拔线。
另外必须加两个100uF电解电容并联在舵机电源两端,一个靠近电机,一个靠近ESP32-CAM供电接口。这个细节是我实测出来的:不加电容,舵机一转,摄像头画面里就会出现横纹干扰,加了电容后画面立竿见影地干净了。原理很简单,舵机启动瞬间会拉低电源电压,电容相当于一个微型储能池,把瞬态波动吸收掉。
关于供电顺序,上电时先给驱动板和舵机供电,等1秒再给ESP32-CAM供电。如果反过来,舵机初始化时产生的毛刺可能会把ESP32-CAM的复位脚拉低,导致板子不断重启。我做的简单办法是用两个开关分别控制两路电源,或者给ESP32-CAM的供电线加一个串联二极管防倒灌。
3. 相机功能:把60块的模块调教成Web相机
3.1 烧录CameraWebServer固件
ESP32-CAM的相机功能,Arduino环境下直接改官方例程就能用。打开Arduino IDE,安装esp32开发板支持包,然后找到CameraWebServer这个例程。例程里需要填WiFi账号密码,默认分辨率设为UXGA(1600x1200),质量设为10左右。烧录前记得把ESP32-CAM的IO0和GND短接,进入下载模式。用FTDI连接时,FTDI的TX接ESP32-CAM的RX,RX接TX,5V接5V,GND共地。烧录完成后断开IO0的短接线,按复位键,串口监视器里会打印出分配到的IP地址。
很多人在这一步卡住,报错"Failed to connect to ESP32: Timed out",八成是没按住板上的复位键或者IO0没接GND。我的经验是:先把IO0接GND,再给板子上电,然后点击烧录按钮,看到"Connecting..."的时候按一下复位键,成功率会大幅提升。烧录成功一次之后,后续烧录就不需要再短接IO0了,除非你改了flash模式。这个小事值得记一下,不然每次都要拆线。
3.2 OV2640参数调优:曝光、白平衡、清晰度
网页端预览画面默认参数通常偏暗偏灰,需要手动调。在CameraWebServer的网页界面里,有亮度、对比度、饱和度、白平衡、曝光补偿、画面镜像等滑块。对扫描来说,最重要的是把曝光补偿降到-1到-2之间,因为扫描场景通常有补光灯,高曝光会让物体表面一片死白,特征点全丢了。白平衡建议锁定在晴天或荧光灯模式,不要用自动白平衡。自动白平衡会在物体旋转时不断调整色温,导致同一物体在不同拍照角度下颜色不一致,后续重建生成的纹理会花掉。
清晰度方面,OV2640这颗镜头本身素质一般,边缘画质衰减明显。我的做法是拍照时把物体放在画面中央约60%的区域,边缘留白。这样虽然浪费了部分像素,但避开了镜头边缘畸变最严重的地方。还有一个参数容易忽略:JPEG压缩质量。扫描拍照时把质量滑块调到最高(quality越小越清晰),但代价是单张照片体积变大、传输变慢。如果用的是28BYJ-48转台,拍摄间隔本来就有好几秒,完全来得及传完一张1600x1200的高质量照片。
3.3 定时拍照与局域网访问技巧
扫描模式下的自动拍照不能靠手动点网页按钮,我写了一段简单的Arduino逻辑:在相机模式下接收一个HTTP请求,比如GET /scanstart?interval=3000,程序就开始定时抓帧并保存到SD卡。如果板子没有SD卡槽(部分版本没有),就直接通过HTTP把JPEG发给局域网里的电脑。我喜欢用后者,因为免去拔卡导照片的麻烦,照片直接落在电脑上,马上就能丢进重建软件。
局域网的访问有个技巧:在浏览器地址栏输入http://192.168.x.x:81/,这是CameraWebServer的默认端口。如果手机也想控制,建议在路由器里给它绑定固定IP,免得每次重启后IP变了找不到板子。另外,在代码里加上 mbedtls 的禁用选项(关闭HTTPS),因为ESP32-CAM没有足够的算力跑TLS握手,开着TLS反而让网页加载慢半拍。本地局域网没有加密需求,直接明文传输就行。
4. 3D扫描:用摄影测量重建全流程
4.1 扫描原理:把钱花在算法上
3D扫描的底层逻辑其实不复杂。人眼判断深度靠双目视差,摄影测量软件用同样的思路——从多个角度拍同一个物体,找到这些照片上相互匹配的特征点,比如物体表面的纹理角点、斑点、边缘交点。算法先通过特征匹配估计出每张照片拍摄时的相机位置和姿态,这叫做稀疏重建(SfM,运动结构恢复)。有了相机位置之后,再利用多视角立体匹配(MVS)为每个像素估计深度,生成密集点云。最后把点云连接成三角网格,贴上纹理,就得到可以直接打印的3D模型了。
这个过程完全不需要激光、红外或者结构光,所以硬件成本可以压到几十块。相应的代价是它对拍摄条件敏感:物体表面必须有足够纹理,光照必须均匀,相邻照片之间的重叠度要高。如果物体是一个纯白色的光滑马克杯,摄影测量就会翻车,因为相机找不到足够多的可区分特征点。这解释了为什么扫描时要放标定纸、贴标记点——那都是给算法加地标。花几百块买扫描仪省掉的是这些操作麻烦,而DIY方案用更便宜的价格换来了同样的算法能力,只是需要你多上点心。
4.2 拍照规范:24张照片的讲究
我用这套设备扫描过不少东西,总结下来,一个小物体(拳头大小)的最佳拍照方案是:两圈,每圈12张,两圈间隔10度俯仰角。第一圈用平视角度拍12张,转台每次旋转30度;第二圈把云台俯仰角抬高到30度,再拍12张。这样总共24张照片,每张相邻照片的重叠度足够了,直角区域不会漏。对于表面细节多、形状复杂的物体,可以增加到三圈36张,但超过40张之后重建时间急剧上升,模型质量提升却很有限,性价比不高。
拍照时注意三件事:一是物体固定不动,转台的每个位置要稳定停住才能拍照,28BYJ-48在断电保持的时候是有自锁力的,但等待1秒让画面稳定更保险;二是补光要均匀,我用两盏白色LED台灯从左右45度照射,避免强烈的定向阴影;三是背景要干净,最好是一片纯色、最好是深色背景,这样算法不容易把背景当成物体的一部分。这些规范听起来琐碎,但每一条都会直接影响最终模型质量,比换一个更贵的摄像头提升明显得多。
4.3 重建流程:COLMAP与Meshroom实战
拍完24张照片,把它们放进一个文件夹,接下来交给开源软件。COLMAP是目前最主流的SfM+MVS工具,Windows和Linux都有编译好的版本。操作流程不复杂:
colmap feature_extractor --database_path project.db --image_path images/ colmap exhaustive_matcher --database_path project.db colmap mapper --database_path project.db --image_path images/ --output_path sparse/ colmap image_undistorter --image_path images/ --input_path sparse/0 --output_path undistorted/ colmap patch_match_stereo --workspace_path undistorted/ colmap stereo_fusion --workspace_path undistorted/ --output_path fused.ply前面两步提取并匹配特征,第三步做稀疏重建,判断相机位姿靠不靠谱。通常在还没来得及做密集重建时,就能在COLMAP的GUI里看到相机轨迹和稀疏点云,如果轨迹乱飞,说明拍照质量有问题,这时候别硬往下跑,回头补拍会更省时间。PatchMatch Stereo步骤最耗时,24张照片可能要跑半小时以上,期间CPU和内存占用都会拉满,建议用台式机处理。
不想敲命令的话,Meshroom是另一个选择,纯图形界面,节点式搭建流程。把24张照片拖进去,默认的相机定位、深度图计算、网格重建节点会自动串联,跑完直接输出OBJ模型。我的经验是Meshroom对新手更友好,COLMAP对参数控制更精细。两个软件跑出来的结果我都对比过,用同样的照片,COLMAP的密集点云密度一般更高,因为它的PatchMatch参数可以调得更激进;Meshroom胜在省心,不用建数据库。
4.4 质量优化:特征、光照与标定
扫描质量翻车最常见的原因是特征不足。处理办法有两个:一是给物体贴上一次性纸质的随机图案贴纸,等模型重建完再在软件里擦掉;二是在物体旁边放一张棋盘格标定板,标定板上的角点可以作为稳定特征,帮助算法确定相机位姿。棋盘格还有一个好处:COLMAP会用它来自动估计相机内参(焦距、主点、畸变系数),内参准确对重建精度影响很大。
光照优化上,我踩过一个坑:一开始用普通白炽灯,色温偏暖,摄像头白平衡锁定后拍出来的物体表面颜色偏黄,导致不同角度的纹理色差严重。后来换成色温5500K的LED灯,问题解决了大半。还有一点,曝光参数一旦调好,整个扫描过程就不要改。如果扫描中途改了曝光补偿,前后照片亮度不一致,特征匹配会变困难,密集重建阶段尤其明显,因为深度估计对亮度一致性非常敏感。
5. 控制器:云台遥控与蓝牙手柄模拟
5.1 网页控制台:手机就是遥控器
ESP32-CAM板载WiFi,天生适合做Web控制台。我的固件里集成了一个简单的控制页面,打开手机浏览器访问ESP32-CAM的IP,就能看到四个方向键控制云台舵机,加减号控制步进电机的正反转,还有拍照和开始扫描的按钮。这个功能在扫描时特别顺手,我可以站在物体旁边调整机位,不需要回电脑操作。
网页控制台的代码不复杂,核心就是HTTP服务器。我用ESP32WebServer库注册了几个端点:/pan?angle=90控制水平舵机,/tilt?angle=45控制俯仰舵机,/motor?dir=1&steps=100控制步进电机。浏览器发一次请求,程序解析参数后设置舵机角度或电机脉冲。为了搜索方便,我建议把控制页面放在HTTP根路径,这样浏览器地址栏输入http://IP/就能直接出界面,不用记路径。
这个控制台本质上就是一个可编程遥控器。把它放在其他场景里同样适用,比如用它控制智能家居里的灯光、风扇,甚至做一个简单的桌面机械臂。我后来扩展过几次,发现ESP32-CAM自带的SD卡槽可以用来存控制页面,把HTML/CSS/JS文件放SD卡里,扩展控制功能时不用重新刷固件,直接改SD卡里的文件就行。这个技巧省了我很多事。
5.2 模拟Switch Pro Controller手柄
Controller这个身份,还有另一种形态:蓝牙手柄。ESP32的SoC里附带BLE蓝牙模块,只需要加一个库就能模拟HID设备。网上有ESP32-BLE-Gamepad这样的开源库,它能把ESP32模拟成一个蓝牙游戏手柄,支持多按键、双摇杆、方向键。而且这个库默认支持模拟Switch Pro Controller的协议,可以直连Nintendo Switch主机、电脑或安卓设备,当作普通手柄使用。
我的做法是给ESP32-CAM扩展几个按钮,把IO25、IO26、IO27分别接三个按键,程序里监测按键状态,按下的瞬间通过BLE发送按键数据。虽然摄像头在这时没参与工作,但板子上的MCU和BLE硬件都闲着,这个"手柄"模式是纯分时复用的额外功能,硬件成本为零。如果你不需要Switch协议,也可以模拟成标准USB HID蓝牙键盘鼠标,用来远程翻PPT演示文稿或者控制智能电视,场景又多了一层。
不要小看这个功能,一套带键鼠模块的无线HID设备零售价也要几十块。ESP32-CAM顺手就把这钱省了。唯一的遗憾是,OV2640摄像头框架的板子没有内置电池管理,当手柄用的时候必须拖着USB线供电,便携性差。如果追求无线自由,可以在电池接口加一个3.7V锂电池加升压模块,重量增加大概10克,续航能到两小时。
5.3 舵机、步进电机与红外扩展
除了网页和蓝牙,控制器角色的第三块业务是物理世界的驱动。我在固件里预留了几个GPIO做双向控制:舵机抬头低头、转台旋转、甚至红外发射。红外需要额外接一个红外LED,GPIO输出38kHz载波就能模拟遥控器信号。这个功能让我把家里的老空调和电视都纳入了同一个控制面板,虽然ESP32-CAM的CPU不算强,但跑一个红外协议栈还是绰绰有余。
不需要所有功能都做进固件里。我的原则是:每个模式的入口尽量简单,例如进入扫描模式就一条HTTP请求,进入手柄模式就按一个物理按键切换。实际用下来,这个"一套固件多模式"的架构非常稳定,因为各模式之间共享的只有GPIO和WiFi/蓝牙资源,逻辑上完全隔离。如果你也想复刻,建议先从相机和网页控制两个模式开始,把底层通信摸熟了再加手柄模拟,否则调试时容易顾此失彼。
6. 完整实操流程与参数速查
6.1 从组装到出模型的步骤串联
如果你手头的零件齐了,整个项目落地大约需要一个周末。我习惯把流程拆成六步:
第一步组装硬件。先把ESP32-CAM刷好CameraWebServer基础固件,确认能出画面后再固定到云台上。第二步做转台,固定28BYJ-48电机,在电机轴上粘一个亚克力圆盘,作为置物台。第三步接线并测试三路电源是否独立稳定。第四步在固件里加入云台控制和转台控制代码,烧录后通过浏览器验证每一个GPIO动作是否正确。第五步做扫描测试,放一个表面纹理丰富的物体(玩具、钥匙串、纹理纸盒都可以),拍24张照片丢进COLMAP,跑通全流程。第六步调参优化,根据第一版模型的缺陷调整光照和拍照角度,直到模型满意。
第一次扫描我建议不要追求高质量,目标只是跑通流程。把重建软件每个步骤的报错截图存下来,回头对照着优化。因为摄影测量软件对输入照片的要求比硬件本身更严格,一张模糊的照片就会导致整个相机轨迹崩溃。跑通一次之后,你对错误信息的理解会完全不同,这就是最好的调试方法。
6.2 扫描参数速查表
参数这块我直接给一个保守的参考值,照抄能出活:
| 参数项 | 推荐值 | 说明 |
|---|---|---|
| 拍照分辨率 | 1600x1200(UXGA) | 低于这个分辨率,特征点数量会明显减少 |
| JPEG质量 | 90-95 | 质量越高越好,代价是文件大、传得慢 |
| 拍摄圈数 | 2圈(每圈12张) | 简单物体1圈,复杂物体3圈 |
| 转台步进角度 | 30度 | 对应每圈12张的间隔 |
| 云台俯仰角 | 0度和30度 | 覆盖侧面和斜上方视角 |
| 拍摄间隔 | 3-5秒 | 等转台稳定、画面静止再拍 |
| 补光方式 | 两盏LED台灯45度侧照 | 避免直射和硬阴影 |
| 物体纹理 | 自然纹理或贴纸标记 | 纯色物体需要添加标记 |
| 重建软件 | COLMAP或Meshroom | COLMAP更精确,Meshroom更省心 |
每台设备的镜头略有差异,这些参数不是金科玉律。我换了两个ORIGIN镜头后,同样光照下曝光补偿差了一档,所以扫描之前先用固定物体做一次快速标定,确认每张照片亮度一致、对焦清晰,再开始正式扫描。这套标定的成本只有10分钟,但能把后面几小时的重复劳动省掉。
7. 踩坑实录与排查思路
7.1 常见问题与解决方案表
这个项目里我踩过的坑可以单独开一篇了,挑几个典型问题整理成表:
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 网页预览画面花屏或雪花 | 供电电压不足 | 换一路独立5V 2A供电,加100uF电容在摄像头电源旁 |
| 舵机通电后疯狂抖动 | 舵机电源与摄像头共路 | 分离电源,共地但不共用输出;到舵机的线缩短 |
| 烧录时卡在"Connecting..." | IO0没有接GND | 按住复位键,在"Connecting"时松手;换更短的USB线 |
| 扫描重建时相机轨迹乱飞 | 照片模糊或特征不足 | 检查每张照片清晰度,补棋子标定板,增加纹理标记 |
| 密集点云稀疏有洞 | 相邻照片重叠度不足 | 缩小转台步进角度,从30度改为15度,增加一圈 |
| 重建纹理色差大 | 自动白平衡漂移 | 锁定白平衡,固定补光灯色温,扫描过程不改曝光 |
| 蓝牙手柄连不上 | 配对模式未正确进入 | 确认固件启用了BLE,重新上电进入配对模式 |
遇到花屏这类问题,第一反应不要怀疑摄像头模块坏了,先量电压。我那块ESP32-CAM被误插反过电源,烧过一次,从那以后我就老老实实每次都先量供电。这块板子便宜但不是金刚不坏,保护性设计和做工都比较基础,电源前加一个反接保护二极管是值得的。
7.2 我踩过的几个典型坑
第一个大坑是充电宝供电。我起初图省事用充电宝给整套设备供电,结果发现它有一个休眠机制:电流低于阈值自动断电。扫描过程中转台停转的间隙,电流掉下来,充电宝判定"设备已充满"就断电了,导致整个扫描中断。解决办法是改用USB充电头加插座,或者给转台电机加一个周期性小信号的"心跳"防止充电宝休眠。
第二个典型问题出现在Meshroom跑网格重建阶段。输入照片没问题,但重建出来的网格边缘参差不齐,底部多了一大块背景。原因是我拍照时背景里放了太多杂物,算法把背景也算进了场景。后来换成一块纯黑色绒布作为背景,问题就消失了。背景并非越亮越好,深色背景能够有效降低背景特征点的权重,因为深色区域本身特征少,算法里自动匹配的置信度也低。
第三个坑是关于步进电机丢步。28BYJ-48的驱动力矩不大,置物台上如果放超过500克的重物,转到某些角度时齿轮会打滑,导致物体实际角度偏差。这个问题很难发现,因为照片看起来都正常,重建时相机轨迹却在某个方向有微小的漂移。我的对策是扫描物体限制在300克以下,且置物台表面贴一块防滑垫或双面胶固定物体。重量超过这个标准的物体,建议换42步进电机加A4988驱动,成本多十几块,但稳定度高一个数量级。
在整个项目做完之后,我最想提醒后来者的一句话是:别一上来就买齐所有材料追求一步到位。先用你手头已有的零件搭一个最简陋的版本,哪怕转台是用一个纸盘子加电机凑合的,也先把24张照片的流程跑通。因为只有把全流程走一遍,你才真正知道自己的设备瓶颈出在哪——是镜头对焦不清,还是转台定位不准,还是补光不给力。这套"一台三用"设备的价值,恰恰就在这个从廉价零件到完整闭环的调试过程里。等你亲手把第一批还算看得过去的模型扫出来,再回头看这块几十块钱的开发板,会觉得它简直是个小钢炮。