我做这行也有年头了。看到“扫地机器人都能自己造”这句话,第一反应是标题党,第二反应是点进去看看,第三反应是——还真不是开玩笑。GitHub 上确实有人把一套相对完整的扫地机器人软硬件方案开源出来了,从机械结构、传感器布局到 SLAM 导航、App 控制,全都给了。把这件事拆开看,你会发现它根本不是“玩具级手工课”,而是一套能把产品级扫地机器人做出来的开源实践,只是以前这些能力散在好几个项目里,现在有人帮你整合好了。
这篇文章我想从一个做嵌入式、搞过机器人项目的人的角度,把“自己造一台扫地机器人”这件事从头到尾拆一遍。它不是写给纯小白的,也不是写给资深工程师的,而是写给那些想做、又怕做不成的人。到底难在哪、简单在哪、哪些钱不能省、哪些坑可以不踩,我今天一次说清楚。
1. 整体方案拆解:一台扫地机器人到底由哪几部分构成
1.1 导航闭环:SLAM、路径规划、运动控制是三条腿,缺一条都站不住
先解决一个认知问题:扫地机器人不是“一个吸尘器装在遥控车上”,它本质是移动机器人。一台能在家里自己跑完、自己回充、又不会把房间撞烂的机器,核心是一套导航闭环。
我习惯把这个闭环拆成三个部分:
- 感知:回答“我在哪”。常见手段是激光雷达扫描周围环境,配合编码器、IMU(惯性测量单元)、里程计信息做状态估计。目前主流的同步定位与建图方案(即 SLAM)有两种路线:一是基于滤波的 Gmapping,二是基于图优化的 Cartographer。家里结构固定、场景不复杂的话,Gmapping 就够用,计算量小,树莓派都能跑;要处理大户型、回环多的场景,Cartographer 的优势就体现出来了,它的回环检测能把“走了一圈发现起点不闭合”这种误差纠正掉。
- 规划:回答“怎么走”。扫地机器人并不是全屋无脑走满,而是先要构建一张栅格地图,然后对地图做分区,再在每个区域里生成弓字型覆盖路径。这里面涉及两个核心算法:全局路径规划(A*、Dijkstra 这类)负责从当前点到目标点的最优路径;局部路径规划(动态窗口法 DWA、TEB 这类)负责避开突然出现的障碍物。
- 控制:回答“走不走得准”。规划生成了轨迹,底盘得执行。这就要靠电机驱动和 PID 闭环了。轮子上的编码器读取实际转速,和期望转速做差,PID 计算输出 PWM,调节电机转速。控制周期一般要做到 50Hz 以上,否则实际轨迹会明显偏离规划轨迹。
很多人把扫地机器人看成“加了一个激光雷达的玩具车”,这是最大的误解。导航闭环里的每一个环节,都是一个值得单独做专项的技术点。开源方案的价值在于,它把 ROS(机器人操作系统)里现成的工具链串起来了,省掉你从零写 SLAM 和路径规划的功夫,但硬件层面的接线、电机调试、传感器标定,还是得自己一点一点攒经验。
1.2 机械与电气设计:风道、底盘、传感器布局直接决定能不能落地
我见过好几个 DIY 项目,软件跑通了,结果机器人放地上根本没法用——要么吸力不够,要么传感器装错位置,要么走起来像癫痫。机械和电气设计,才是扫地机器人真正接地气的地方。
先看风道结构。扫地机的吸力不是靠电机功率硬堆,而是靠风道密封性。尘盒、风机、吸口之间如果漏气,风压就起不来,地面灰尘根本吸不进去。开源方案一般会给 3D 打印的风道模型文件,但打印出来的件表面粗糙,接缝处推荐用软胶垫或硅胶密封,实测下来漏气对吸力的影响非常大。
再看底盘和轮组结构。翻看开源方案里的结构图纸,你大概率会遇到两种驱动布局:两轮差速加万向轮,或者四轮独立驱动。扫地机领域用两轮差速的占绝大多数,原因不是成本,而是控制简单可靠。两轮差速模型在做原地旋转、弓字路径时非常自然,而四个独立轮的底盘要做精确的运动学折算,控制周期稍微拉长,轨迹就会乱。万一你看到“四轮驱动”的方案,先别急着兴奋,先算算它的运动学有没有闭环验证过。
最后是传感器布局。扫地机上最容易被忽视的传感器是防跌落红外,专门检测机身下方距离地面高度。装的位置一般在底盘四个角的边缘,向地面斜照红外光,一旦测距值突变,说明到了台阶边缘。这个传感器一旦布局不对(比如离地角度太高、探测范围太窄),机器人在桌子边缘就会直接摔下去。我的经验是,所有传感器的测试用例里,防跌落应当最先做,因为它最容易造成物理损坏。
2. 核心硬件选型与参数参考
2.1 主控方案:STM32 加树莓派,嵌入式里常见的“双脑”结构
我在拆各类开源机器人项目时,最常看到的控制架构就是“双脑”:一颗 MCU 负责实时性要求高的底层控制,一颗高性能处理器负责计算和决策。
- 底层 MCU,一般用 STM32F103 或更高级别的 F4 系列,负责电机 PWM 输出、编码器计数、超声波或红外传感器读取、电池电压监测。
- 上层处理器,常用树莓派 4B 或 Jetson Nano,负责跑 Ubuntu + ROS、激光雷达驱动、SLAM、路径规划和 App 通信。
- 上下层通信,机器人里最短平快的方式是串口(UART),协议自行定义,比如帧头 + 数据长度 + 校验位 + 数据体。主控把里程计数据上报给上层,上层下发速度指令给主控,一来一回,控制闭环就通了。
这套双脑架构的好处有两个:一是职责清晰,底层控制不因为 ros 进程卡死而失灵——这一点很关键,树莓派上跑 SLAM 时 CPU 经常飙到 80% 以上,万一上层进程 OOM,底层还是能维持一个安全的停车动作;二是方便调试,激光雷达或导航节点的日志出问题,只需要看树莓派终端,不会影响电机驱动代码。
如果你预算有限,也可以尝试用单板机直接连接所有传感器,省掉 MCU 层。但我劝你别省,原因是底层控制代码必须放在不会崩溃的地方。F4 级别的 MCU 裸机或 FreeRTOS 跑起来非常稳定,树莓派哪怕是官方电源,也偶有欠压降频的情况,工业界做移动机器人基本都采用这种冗余分工策略。
2.2 传感器组合:激光雷达、IMU、防跌落、碰撞,各司其职
一个常见的传感器组合是这么搭的:
| 传感器 | 作用 | 选型建议 |
|---|---|---|
| 激光雷达 | 建图、定位、障碍物检测 | 市面上常见的高性价比雷达多为 360° 三角测距或 ToF 方案,测距半径 10 米左右即可 |
| IMU | 姿态估计、辅助里程计融合 | 低端方案 MPU6050 可用,高端用 ICM 系列,注意标定零偏 |
| 防跌落红外 | 检测台阶、边缘 | 使用定制的红外收发对管,需标定触发阈值 |
| 碰撞传感器 | 检测物理碰撞 | 一般用微动开关,布置在保险杠弹片上,触发可靠 |
| 编码器 | 轮速测量 | 霍尔编码器足够,光栅编码器更准但贵,DIY 推荐霍尔型 |
| 超声传感器 | 近距离避障 | 可作为激光雷达盲区补充,但选型时注意波束角问题 |
| 万向轮 | 支撑底盘 | 用牛眼轮还是普通万向轮,要看底盘的转弯半径和重心分布 |
激光雷达有必要多说一嘴。闲鱼上很多几十块钱的二手雷达,型号老旧、驱动不兼容,买回来你花在调驱动上的时间可能比机器本身还多。我建议直接选 ROS 社区支持良好的雷达,ROS 驱动节点稳定、话题格式标准,这样你在跑roslaunch的时候就能少踩很多坑。
IMU 的作用容易被低估。扫地机在光滑地板上空转、打滑时,轮式里程计的输出是会失真的,这时候 IMU 数据可以作为融合参考,把姿态变化修正回来。开源的 Cartographer 和机器人定位组件(如 robot_localization 包)都支持多传感器融合,你只需要把 IMU 的线性加速度和角速度发布成对应的 ROS 话题即可。不要嫌传感器多,后期调试时你就知道,多一个 IMU 数据源,机器人姿态的稳定性就高一个档次。
2.3 电源与调试供电:整机耗电怎么算、电池怎么选
电源方案是开源项目里被很多人随手糊弄、最后又不得不返工的部分。扫地机器人的负载是典型的高动态负载,风机启动和电机堵转瞬间电流会窜得很高,电源设计做不好,主控就会频繁复位。我建议用这个思路来算:
- 统计整机最大持续电流:两个驱动电机各 1.5A,风机 2A,树莓派 1.2A,传感器和 MCU 板 0.5A,合计约 6.7A。
- 预留 30% 裕量,电源设计目标就是至少 8A 的持续输出能力。
- 电池选用 3 串或者 4 串的锂聚合物或 18650 电芯,容量建议至少 3000mAh 以上,按 6A 平均电流估算,可以跑半小时左右。
- 底层加一块稳压模块或电源管理板,保证输出稳定在 5V/12V 两路。
一个要注意的问题是电机堵转。扫地机卡在床底缝隙时,电机不是不转,而是转不动,此时电流会迅速上升,轻则电源板保护,重则烧驱动。所以电机驱动选型时要带电流限制或过流保护,建议驱动芯片至少留 2 倍峰值电流余量。这一块绝不能省,我在实测中就烧过两次驱动板,原因都是堵转过流。
3. 实操过程与核心模块实现
3.1 底盘组装与电机驱动调试:先让机器人“站得稳”
这里假设你已经拿到了开源方案的模型文件和 PCB 文件,第一步是把底盘结构件装好。结构件不管是 3D 打印还是淘宝定制亚克力切割,组装时都要注意:
- 两个驱动轮要严格对称,轮距误差太大会导致机器人走直线时明显跑偏。
- 万向轮安装位置要落在底盘几何中心附近,否则转向时阻力不均匀,里程计读数会偏移。
- 电池尽量平放并靠近底盘中央,降低重心,防止过坎时侧翻。
电机驱动调试这块,我用的是一个很基础的闭环框架:读取编码器 → 计算当前转速 → 与目标转速做 PID 计算 → 输出 PWM。关键点在于 PID 参数整定。我一般先只调 P,从小往大加,让电机响应变快但不要振荡,等 P 到位后再加 I 消除稳态误差。D 项在大部分底盘上用不上,除非你的电机响应特别“冲”。
实际调试时可以写一个简单的测试脚本,让左轮和右轮分别以相同 PWM 运行,对比两个轮子的编码器读数。大多数代码里这步是通过串口命令行完成的,它会输出实实在在的编码器数值——如果左右差异超过 3%,请优先检查机械结构,而不是刷 PID 参数。轮子转得稳了,后面导航闭环才有基础。
3.2 激光雷达驱动与建图:从“能看到”到“能记地图”
雷达驱动在 ROS 下通常是现成的,你只需要安装对应驱动包、修改串口权限,启动后rostopic echo /scan就能看到原始扫描数据。拿到扫描数据后,第一步是雷达标定:让雷达匀速转一圈,检查数据里有没有明显缺口、噪点、畸变。激光雷达最怕反光和玻璃,家里的镜子、落地窗、亮面瓷砖都会造成测距异常,前期标定不解决,后面建图就会有一堆“幽灵墙”。
建图我用的是 Cartographer,原因很简单,它的回环检测能让我这种手残玩家少犯“地图没闭合”的错误。具体流程是:
- 启动机器人底盘节点,让底盘能接收
/cmd_vel速度指令。 - 启动雷达驱动,确认
/scan话题有数据。 - 启动 IMU 驱动(如果有),发布
/imu数据。 - 启动 Cartographer 建图节点,融合雷达和里程计/IMU 数据,实时生成地图。
- 手动遥控机器人缓慢走遍房间,建图完成。
- 运行地图保存命令,把地图发布出去。
建图时的“缓缓走”特别关键。新手最容易犯的错是推着遥控器猛走,一个急拐弯,扫描匹配就跟不上,地图直接糊掉。我的体会是,建图阶段按 0.1m/s 左右的速度走最简单,宁可慢一点多兜两圈,也比建完一张废图重来强。
3.3 导航与自动回充:让机器人为自己“找路回家”
建完图之后,导航是另外一套流程。在 ROS 里一般用move_base这个包,它负责接收地图、目标点和实时激光数据,然后输出速度指令给底盘。
导航的两个关键参数配置:
- 全局代价地图:由静态地图和膨胀层组成,膨胀半径要按机身宽度的一半来设置,否则机器人会撞墙。
- 局部代价地图:实时监测激光雷达看到的障碍物,用于局部避障,更新频率一定要远高于全局地图。
自动回充的核心不是“回到充电桩坐标”,而是“对准充电桩触点”。方法不复杂:在建图时把充电桩附近设为“回充点”,机器人完成清扫任务后先全局规划到回充点附近,然后低速前进,利用红外接收器寻找充电桩上的红外发射源,对准后缓慢倒车或直行,直到触碰到充电极片并检测到电流回路。这个方法看似简单,但在黑暗环境中特别依赖红外信号。实测下来回充的成功率在 90% 以上,如果失败了,大概率是回充路径上有个障碍物刚好在红外发射角边缘。
4. 常见问题与排查技巧实录
4.1 高频问题的排查清单
我把常见故障整理成表,方便你直接对着排查:
| 现象 | 可能原因 | 排查方法与解决方案 |
|---|---|---|
| 开机后系统反复重启 | 供电不足、电池电压过低 | 用万用表量主控供电电压,观察启动瞬间压降;更换电池或加大电源输出能力 |
| 雷达数据满屏噪声 | 雷达供电不稳、机械结构松动 | 检查雷达电源,必要时单独供电;重新固定雷达支架 |
| 建图时地图扭曲 | 里程计/IMU 未融合、轮子打滑 | 检查编码器是否装紧,重新标定 IMU,降低走速 |
| 收到速度指令但轮子不动 | 串口通信协议不匹配、电机驱动过流保护 | 用串口调试工具比对协议帧格式;复位驱动板并检查堵转电流 |
| 频繁撞击物体 | 碰撞传感器触发逻辑错误、代价地图膨胀半径太小 | 检查碰撞传感器接线和按键电平逻辑;增大膨胀半径 |
| 自动回充回不到充电桩 | 回充信标安装位置不佳、红外干扰 | 调整回充信标高度和角度,确保与机器人接收器平行;关闭附近红外干扰源 |
| 扫地机一边走一遍偏 | 左右轮轮速不一致、重心偏载 | 先检查机械对称性,再用 PID 补偿两个轮子的速度差 |
| 风机噪声大但仍吸不上灰 | 风道漏气、尘盒滤网堵塞 | 检查尘盒密封圈、风管接口是否松动;清理滤网 |
4.2 调试踩坑经验:别迷信“开源即能用”
开源方案给我的整体印象是:原理上通,工程上还得润。我见过很多人下载开源代码后直接编译,编译不过就觉项目是假的。其实开源项目最常见的问题就是依赖版本对不上,比如 ROS 版本、Python 版本、某个驱动库版本不一致。拿到一个项目,第一个动作不是编译,而是先看 README 里的环境要求,把这几个项逐一对齐:
- ROS 版本(ROS1 Noetic 还是 ROS2 Humble,差别很大,很多驱动包不能跨版用)
- 操作系统版本(Ubuntu 18.04 / 20.04 直接决定你该怎么设置依赖源)
- Python 版本(有的激光雷达驱动只兼容 Python2,放弃它,别和它杠)
- 底层 MCU 的编译环境(STM32 工程一般用 STM32CubeMX 生成或 Keil 打开,注意芯片型号和库版本要匹配)
另一个踩坑点是 USB 串口权限。树莓派上插雷达、插主控板、插 IMU,经常会遇到/dev/ttyUSB0不存在或者没有权限。这不是接线问题,是 Linux 用户组和 udev 规则的问题。通用做法是:
lsusb确认设备有没有被系统识别;ls /dev/tty*确认串口号;- 把当前用户加入
dialout组:sudo usermod -aG dialout $USER; - 有条件的话写好 udev 规则,把设备的串口号固定下来。
这个步骤看起来琐碎,但实际开发中 80% 的“连不上设备”问题都出在这。
4.3 如何验证自己搭的导航靠谱不靠谱
导航调完了,不能口说“能跑就算成功”,建议按以下步骤做验收测试:
- 直线测试:遥控机器人前进 2 米,测量实际偏移。左右偏差超过 10cm 就说明里程计有问题。
- 回环测试:让机器人走一个 2m×2m 的正方形回到起点,观察地图上足迹是否闭合。不闭合就查扫描匹配和 IMU 融合。
- 避障测试:在行进路线上放几个纸箱,机器人应能以合理路径绕开,而不是原地长时间旋转。
- 回充测试:连续执行 10 次回充任务,成功率至少要达到 8 次,否则说明回充的硬件安装或策略有问题。
- 续航测试:在中等吸力模式下跑完整机电池,记录可运行时间,判断电池容量匹配度。
这套测试方法不只是给开源项目用的,很多家用扫地机器人的验收测试也是类似思路。做完这几项,你才有底气说“我造出来了”。
5. 这个开源方案的价值边界与我的个人建议
说实话,自己做一台扫地机器人,成本其实不算低。买激光雷达、主控板、电机驱动、电池、结构件,零零总总加起来可能比一台入门级成品扫地机还贵。那为什么还要折腾?我的理解是,真正的产出不是那台机器,而是你把它跑通后建立起的系统认知。
造完这台机器后,你再回头看市面上的扫地机,就能看懂厂商宣传里的每一个词了。激光导航对应的是 SLAM 方案,断点续扫对应的是地图分区和路径规划,自动回充对应的是红外对准和电源管理。所有营销术语落到工程上,就是我在上面拆的那几条链路。
如果你想尝试,我给几个基于实操经验的建议:
- 先别急着下单所有硬件,先看方案文档的硬件清单和结构图,确认你有能力加工或买到对应结构件。
- 第一次弄推荐先采用双脑架构,哪怕多花一百块钱,调试体验完全不一样。
- 建图和导航阶段建议准备一个“测试跑道”,比如客厅里摆好固定障碍物,方便反复测试定位稳定性。
- 不要把电池安全当儿戏,锂电充电必须用带平衡充的保护板,充电时人要在旁边观察,防止意外。
最后分享一个小技巧:做底盘调试前,先把机器人想办法架起来,让轮子悬空。这样在调 PID 时既不会撞墙,也不会烧电机,还能随时观察编码器数值变化。等底层控制代码没问题了,再把机器人放到地上,让它在真实空间中接受导航和避障的考验。这个顺序看着简单,但能帮你省下大量折腾时间。
我自己折腾完这个项目之后最大的感受是:开源不是把答案摆在你面前,而是把“自己也配拥有问题”的这个资格变成了现实。扫地机器人这条开发路径上的每个坑,掉进去一次,爬起来一次,你对机器人的理解就会扎实一层。