开源扫地机器人全解析:SLAM建图、路径规划与硬件选型

发布时间:2026/9/8 17:33:14
开源扫地机器人全解析:SLAM建图、路径规划与硬件选型 说实话我第一次在 GitHub 刷到那套开源的扫地机器人方案时脑子里就俩字离谱。一个能建图、能规划路径、能自动回充的扫地机器人全套电路图纸、3D 打印件、固件源码和装配说明一口气扔在仓库里照着眼馋就能抄作业。更离谱的是真有人照着做出来了跑得还挺稳。这篇就聊聊我追了这套开源扫地机器人方案半个多月的收获仓库里到底有什么、硬件怎么选、SLAM 和路径规划是怎么跑通的、整套下来花了多少钱、又有哪些坑是只看 README 绝对发现不了的。不管你是想入门机器人、玩 ROS还是纯粹好奇扫地机内部原理这篇都能给你一些参考。1. 开源方案全景那些号称整套开源的仓库到底放了什么1.1 不是一张图纸而是一套完整工程体系我最早想当然地以为开源扫地机器人仓库里放的应该就是几个 STL 模型、一张接线图、一段 Arduino 代码属于给你个壳子剩下的自己悟。实际翻了几个比较热门的仓库之后发现方案完整度远超出预期。拿到了包括3D 打印结构件和底盘建模文件基本上主体结构不用额外开模电机、雷达、主控、传感器、电池、清扫机构的 BOM 清单且标注了大致价格和采购渠道底层固件负责电机驱动、编码器读取、碰撞/悬崖传感器处理上层算法包负责 SLAM 建图、定位、路径规划和清扫状态机详细的接线图和装配说明部分仓库还配了 YouTube/B站视频链接调参指南和常见问题解答包括雷达串口不通、地图漂移、轮速不一致等高频问题的处理办法。这套东西放到 GitHub 上意味着只要你有基本动手能力照着文档一步步来理论上能复现出一台可运行的扫地机。这和手工耿式造机器人完全是两码事——前者是工程复现后者是艺术创作。1.2 三种主流技术路线别一上来就冲 SLAMGitHub 上搜robot vacuum或ROS lidar vacuum会出现一批项目。我大致归成三类难度和体验完全不是一个量级。第一类纯 MCU 随机碰撞清扫用 ESP32 或 STM32 跑碰撞逻辑遇到障碍物转向加个防跌落传感器。成本可以压到 300-500 元但清扫覆盖率大概只有 60%-70%同一个地方反复扫另一边完全不去。适合入门单片机但不适合造一台真正能用的扫地机的目标。第二类MCU 陀螺仪 简单路径规划加了 IMU惯性测量单元之后可以做到直线行进和简单的弓字形比随机碰撞规整很多。不过因为没有绝对定位长时间运行依然会积累误差路径会逐渐歪斜。这类方案娱乐性大于实用性。第三类LiDAR ROS SLAM 全方案主控跑 ROS用激光雷达做实时建图和定位再用覆盖路径规划让扫地机像商用产品一样按S 形或弓字形清扫遇到障碍物会绕开扫完能回到充电桩。这才是能自己造的核心价值所在。缺点是成本高、调试周期长需要动手能力。我主要分享的就是第三类方案。只有它才撑得起整套方案开源这六个字。1.3 为什么主控一定要跑 ROS而不是靠单片机裸写很多人第一反应是扫地机算法也不复杂吧ESP32 跑得动吗答案是跑不动或者说能跑但体验极其痛苦。SLAM 建图需要处理激光雷达每秒上千个扫描点跑滤波、位姿图优化、回环检测路径规划要在栅格地图上做代价搜索状态机还要同时处理充电桩对接、悬崖检测、卡困恢复。这些任务对算力、内存和软件生态的要求远超单片机能承载的范围。ROS机器人操作系统在这类项目里其实是分布式通信框架 一堆现成算法库的组合。它不需要你从零写粒子滤波不需要自己实现 A* 寻路只需要把传感器的数据发布出去然后订阅现成算法模块的输出就行。所以那套方案的软件栈是树莓派主控跑 ROS Cartographer 算法包STM32 只负责最底层的电机控制和传感器读取。两者通过串口通信STM32 把编码器数据发给树莓派树莓派算好速度指令再发回 STM32 执行。这种上层算法 底层实时控制的分离架构既是开源扫地机方案的通用做法也是很多工业机器人实际采用的架构学到的知识是能迁移的。2. 硬件选型拆解扫地机器人最核心的六个部件2.1 主控算力平台树莓派 4B 是默认答案这套方案的主控基本都是树莓派 4B或者性能相近的香橙派等国产板子。4GB 内存版本就够用了没必要上 8GB。跑 Ubuntu Server ROS Noetic Cartographer内存占用大概在 1.5GB 左右4GB 版本余量充足。为什么不推荐 Jetson Nano因为价格被炒得虚高而且对于 2D SLAM 来说 GPU 根本派不上用场功耗还比树莓派大一截。扫地机不比自动驾驶不需要视觉模型推理老老实实 CPU 跑激光 SLAM 就够了。也有人用 x86 小主机比如 J4125/N5105 软路由同款主板来做性能和散热更好但体积和功耗偏大装到扫地机里会比较挤。树莓派 4B 在体积、性能、生态之间最平衡。2.2 激光雷达扫地机定位的眼睛但别迷信 TOF激光雷达是这套 DIY 方案里成本最高、也最不能省的传感器。市面上一颗 TOF飞行时间法雷达动不动一两千其实完全没必要。开源方案里最常用的是 RPLIDAR A1M8 这类三角测距雷达价格大概 700-800 元。用生活化的方式解释两种测距原理区别TOF 雷达像用秒表测光往返的时间精度高但贵三角测距雷达像拿一根棍子斜着戳出去根据棍子影子位置算距离原理更简单成本更低在家庭短距离场景下精度完全够用。RPLIDAR A1M8 的扫描半径大概 8-12 米测量频率 5.5Hz 或 10Hz 可选这个参数对扫一个 100 平的房子来说绰绰有余。记得装雷达的时候把扫描平面调平否则建出来的地图会有重影。2.3 驱动电机与编码器没有编码器一切算法都是空中楼阁很多新手在选电机时容易忽略编码器Encoder只看扭矩和转速。但编码器恰恰是扫地机能知道自己走了多远、转了多少度的关键。带霍尔编码器的减速电机比如常见的 GA25 系列工作过程中会输出 A/B 两路脉冲信号主控通过统计脉冲数就能推算车轮转速和位移。这就是轮式里程计Odometry。Cartographer 进行位姿估计时主要靠轮式里程计 IMU 激光雷达三者融合。没有轮式里程计光靠雷达扫描匹配扫地机在空旷走廊里非常容易把自己跑丢。选电机时要注意减速比和转速。用于扫地机的驱动轮减速比一般在 30:1 到 50:1 之间空载转速 100-200 RPM 比较合适速度太快会在转弯时甩尾太慢则清扫效率太低。2.4 IMU、碰撞传感器和悬崖传感器SLAM 之外的物理安全兜底IMU 负责测量角速度和加速度在 ROS 里一般用 MPU6050 或 ICM20948十几块钱就能买到走 I2C 接口作为航向参考和雷达数据融合。碰撞传感器用的是微动开关或压力传感器装在机器人的前弧形外壳上撞到障碍物时产生中断信号STM32 第一时间让驱动轮停止或后退。为什么有了激光雷达还要装碰撞传感器因为激光雷达只能扫描一个平面沙发脚、椅子腿等细障碍物的中低位置经常在扫描平面之外。物理碰撞是最后一层兜底必须放在底层固件里直接处理不允许走雷达发现障碍 - 决策 - 执行这种长链路。悬崖传感器一般用红外对射或 ToF 测距传感器装在机器人底部前侧检测到台阶边缘时立即制动。这个逻辑同样必须放在 STM32 底层因为 SLAM 算法的响应速度是毫秒级还好但真到楼梯边缘每一毫秒都在救命。2.5 清扫执行机构风机、滚刷、边刷缺一不可底盘和算法搞定之后很多人会忘记扫地机器人本质是个吸尘器。清扫机构通常由三部分构成滚刷装在机器人底部中间把地面的灰尘、碎屑卷起来。材质有胶刷、毛刷、混合刷毛刷对付灰尘效果好但容易缠头发胶刷不容易缠绕但对小颗粒清扫能力稍弱。边刷装在机身侧边负责把贴墙的死角垃圾扫向滚刷区域。边刷转速不宜太高否则会把垃圾甩飞一般 120-180 转/分钟比较合适。风机产生负压把垃圾吸进尘盒。DIY 方案一般用无刷涵道风扇静压是关键指标别只看风量。实测下来好风机的吸力比看起来风量很大但静压不足的风机强得多。尘盒需要带 HEPA 滤网或者海绵滤网否则风道容易堵塞而且大颗粒垃圾进不去。2.6 电池与电源管理别把 18650 电池包当充电宝用开源方案里电池组一般用 3 节 18650 串联11.1V或 4 节串联14.8V配合 BMS 保护板使用。注意DIY 电池 Pack 绝对不能用拆机杂牌电池也绝对不能省略保护板。扫地机工作电流在 1.5-3A 之间瞬间堵转电流可以达到 5A 甚至更高低质量电池在大电流下发热明显有安全风险。供电设计上要区分电机和风机直接用电池电压比如 12V驱动树莓派需要 5V 稳定供电建议用 DC-DC 降压模块比如 MP1584而不是把 5V 从 STM32 板上飞线出来STM32 和传感器用 3.3V 逻辑但部分传感器支持 5V 供电接线时务必确认电平。充电桩对接用的是底部两个金属触点配合红外接收头对桩。充电电流控制在 1A 左右即可防止触点接触不良导致打火。3. 软件架构与算法SLAM、覆盖路径和避障是怎么跑通的3.1 gmapping 还是 Cartographer开源方案为什么默认选后者搞 ROS 的人应该都听过 gmapping它是最经典的 2D 激光 SLAM 算法基于粒子滤波实现简单教学示例一大堆。但如果你真的把它放到扫地机上长时间运行就会发现一个问题当机器人回到曾经经过的地方时gmapping 不擅长修正历史轨迹时间长了地图会歪掉。Cartographer 是 Google 开源的 SLAM 库核心杀手锏是回环检测。扫地机转了一圈回到起点时Cartographer 能识别出当前场景之前见过然后基于这个约束把累积漂移修正掉。这就保证了长时间、大面积清扫时地图不会越来越歪。代价是计算量更大、参数更多。早期版本在树莓派 4B 上跑 CartographerCPU 占用经常直接拉满后来通过调整参数合理调度可以把建图节点控制在 60%-80% 占用清扫过程中偶尔会有卡顿但不影响使用。如果觉得卡得难受可以降低雷达扫描频率到 5.5Hz或者缩短建图窗口长度。3.2 弓字形覆盖为什么看起来没乱扫其实背后有一套状态机商用扫地机的规整感来自一条简单的覆盖策略弓字形清扫。具体到这套开源方案里实现思路是这样的机器人沿着当前直线往前走同时把已经扫过的区域标记到代价地图上走到地图边界或撞到障碍物时掉头横移一个机器人宽度 一点重叠的距离再沿反方向直线走重复以上过程就形成了从一边到另一边的弓字形轨迹。这个逻辑看起来简单但真正写到状态机里需要考虑的事情不少。比如遇到障碍物时是绕行还是回头重新规划弓字形扫到一半电量不足怎么保存当前清扫进度一张 100 平米的房子被墙体自然分割成几个区域是先扫完客厅再进卧室还是硬闯过去有多余空间时如何决定下一行从哪开始扫最优开源方案通常会在 ROS 节点里维护一个 清扫进度地图用栅格填充率判断当前行是否扫完。当一行被障碍物阻断时节点会调用 move_base 的路径规划把机器人导航到障碍物另一侧继续扫。很多 DIY 新手跑通 SLAM 之后就开始庆祝结果发现扫地机在房间里像个无头苍蝇乱转就是因为没写覆盖策略。这一步的代码工作量通常比 SLAM 还大。3.3 避障策略三层保护不能只靠一层完整的避障体系分三层第一层是底层 MCU 即时响应。碰撞开关触发、悬崖传感器触发、堵转电流超标这些全部在 STM32 固件里直接处理不等树莓派决策。第二层是 SLAM/路径规划层的避障。Cartographer 建好的地图会转换成代价地图costmap激光雷达扫到的障碍物会膨胀一圈路径规划时不允许路径穿过膨胀区域这决定了机器人会不会撞到墙。第三层是清扫状态机里的特殊处理。比如边刷被线缆缠住导致堵转状态机检测到电流异常后会停止清扫、后退并尝试换一个角度继续。又比如被困在椅子腿之间状态机会尝试原地旋转 90 度摆脱。这些逻辑其实就是商用产品里所谓的智能脱困本质一点都不玄乎。3.4 自动回充与多区域清扫让整套方案真正闭环自动回充是区分能用和好用的分水岭。开源方案里普遍的做法是充电桩放一个红外发射器扫地机底部装红外接收器同时充电桩有专门的 ArUco 标记或反光条供激光雷达识别。当电量低于阈值比如 20%时状态机切换到回充模式在地图中找到充电桩的已知坐标调用 move_base 导航到充电桩附近开启红外引导缓慢接近充电桩触点接通后检测充电电流确认对接成功充电完成后自动断电等待下次清扫指令。多区域清扫通常用一个简单技巧解决通过墙体的地图拓扑把房间划分为多个子地图或兴趣区域清扫时按照区域列表依次处理。部分开源方案做了全自动分割但八成以上的方案是半自动的需要你在第一次建图时手动标注区域边界。虽然不够全自动但实际用起来体验并没有差很多。4. 从零搭建的完整实操接线、刷机、建图、扫起来4.1 底盘装配与电机驱动接线先把电机驱动板和 STM32 最小系统板装到底盘上。电机驱动板我建议用 TB6612FNG比老掉牙的 L298N 体积小、效率高逻辑电压兼容性也好。接线方面有几个容易踩坑的点电机电源VM接电池正极但逻辑电源VCC要接 3.3V 或 5V两者千万别接反接反轻则芯片发烫重则烧板编码器 A/B 相分别接 STM32 的两个外部中断引脚光接一个方向引脚不完整会丢脉冲编码器 GND 必须和 STM32 共地否则脉冲信号是悬浮的读数会乱跳驱动板的 PWM 引脚要选硬件 PWM 通道不要随便用普通 GPIO 模拟否则电机噪音大且控制不精确。TB6612 的输出峰值电流可以到 1.2A 每通道扫地机的直流减速电机工作电流一般在 300-800mA足够用了。4.2 主控环境搭建Ubuntu Server ROS Noetic树莓派 4B 的安装顺序建议是先用官方烧录工具烧好 Ubuntu Server 20.04然后安装 ROS Noetic。这里有一个重要的系统配置要给树莓派分配足够大的 swap 分区至少到 2GB。编译 Cartographer 时如果内存只有 4GB不开 swap 极容易 OOM内存耗尽实测会编译到一半直接被杀掉进程。安装完 ROS 后需要把底层固件接上让 STM32 和树莓派通过串口通信。记得把用户加入 dialout 组sudo usermod -a -G dialout $USER树莓派的 UART 默认被系统日志占用需要在/boot/config.txt里加enable_uart1不然串口是死的。4.3 雷达驱动与建图调试RPLIDAR 的 ROS 驱动是现成的clone 下来编译之后通过 launch 文件启动雷达节点再用 RViz 看看扫描波形是否正常。注意雷达的串口是 USB 转 TTL 的插上之后通常是/dev/ttyUSB0权限问题同样要先解决。第一次建图建议手动遥控机器人在房间里慢慢走一圈速度不要超过 0.15m/s转弯尽量在原地完成方便 Cartographer 扫描匹配。走一圈下来看地图效果墙线应该是笔直的不该有大量重影或锯齿。如果地图出现重影两条墙线叠在一起优先检查雷达是否装平扫描平面是否和地面平行轮式里程计的 wheel_base 参数是否填对电机左右轮是否有明显转速差异。4.4 覆盖清扫模式调通建图没问题后启动清扫节点先在一个 2m x 2m 的围栏区域里测试看机器人是否真的在同一平面内做弓字形运动。我当时调通后做的第一件事是铺了几张白纸在地面上面撒上面粉和碎纸屑观察扫地机扫过去的路径是否覆盖到纸面所有区域。结果发现重叠率设到 10% 时弓字形相邻行之间确实会留下一条细细的未清扫缝隙。这个缝隙在视觉上不明显但对于强迫症来说特别折磨人。把重叠率调到 15%-20% 之后问题解决代价是清扫时间增加了一些。4.5 轮速标定让地图正起来的隐藏关卡轮速标定是新手最容易忽略、却直接影响建图质量的一步。实现方法是让机器人以固定 PWM 直行 2 米用卷尺量好对比编码器测得的里程和实际距离。如果编码器读数比实际距离大说明轮径设置太小或者码盘齿数设置错误如果读数比实际小则相反。反复调整里程计 scale 参数直到误差小于 1%。还有一个更隐蔽的坑左右轮 PWM 相同不代表转速相同。受电池电压下降、电机个体差异、地面摩擦阻力不均等影响左右轮经常跑出不同距离导致机器人走弧线。方法是在程序里给左右轮做一次 PID 闭环控制把编码器采集到的实时转速作为反馈让左右轮转速稳定在目标值附近。跑完这一轮标定再建图地图质量会有质的提升。5. 花多少钱、做到什么水平我的成本与效果实测5.1 成本清单一个能扫能建图能回充的方案多少钱以下是我个人搭建这套方案时的实际成本供参考。如果你手里已经有树莓派等设备成本还能进一步压缩。部件型号/说明大致价格元主控树莓派 4B 4GB450激光雷达RPLIDAR A1M8750底盘/减速电机铝合金底盘 GA25编码电机 x2180电机驱动TB6612FNG 模块15底层控制板STM32F103C8T6 最小系统板20IMUMPU6050 模块12碰撞传感器微动开关 x26悬崖传感器红外对射模块 x320清扫机构滚刷组件 边刷 无刷风机90电池18650 3S BMS 保护板150充电桩红外发射器 充电触点30结构件3D 打印件 螺丝铜柱100其他线材、降压模块、胶枪耗材50合计约 1870如果手头有旧树莓派、旧雷达成本可以压到 1200-1500 元。5.2 和市售 1500 元级商用扫地机的差距直接说结论清扫效率和路径规整度不输千元机但在体验细节上差了一大截。优点集中在算法可控性上。你可以随时改代码让机器人扫地扫得更密、速度更慢甚至可以给它加一条只扫卧室的指令。商用产品的清扫策略是黑盒你没法自定义。差距主要在这几方面噪音DIY 方案的风机和电机没有经过降噪设计噪音大概在 70-80 分贝开着比说话声还大。我在测试时全家人都嫌吵。边角覆盖商用扫地机有圆润的边角设计和贴边传感器贴墙清扫距离可以控制到 2cm 以内。DIY 方案通常只能做到 5-8cm墙根会剩一条细灰线最终还是得手动拖把补刀。脱困能力商用机的脱困逻辑经过大量测试和优化被困在桌椅腿之间时基本能自己绕出来。DIY 方案的脱困逻辑足够对付简单被卡遇到复杂的桌椅环境还是会频繁求救。自动集尘、拖地、自清洁这些功能开源方案基本没有或者实现得非常简陋。拖地模块目前的开源方案成熟度很低不建议 DIY。5.3 现阶段值不值得做说实话如果你的需求是家里缺一台扫地机想省钱自己造那我劝你直接买成品。省心、安静、售后有保障而且轻微灰尘清扫效果比 DIY 方案好得多。但如果你是硬件爱好者、ROS 学习者或者单纯想搞清楚扫地机为什么知道哪里扫过了那这套方案绝对值回票价。它比任何仿真环境 ROS教程都更接近真实产品传感器噪声、轮子打滑、电池压降这些问题在纯仿真里一辈子都学不到。6. 踩坑记录DIY 扫地机让我头疼的五个问题6.1 地图漂移最折磨人的建图故障建图跑了两分钟地图已经歪得不能看了。排查下来的原因是轮式里程计没有做好标定——左右轮实际转速相差 0.5%看似不多几分钟后累计下来就是十几度的偏航误差。Cartographer 默认比较信任里程计里程计错了雷达匹配再准也会被带偏。解决方式是先做轮速标定和 PID再用参数配置文件里的pose_publication_period调整 TF 发布频率让 Cartographer 有更充足的数据做扫描匹配。6.2 边刷打滑和线缆缠绕边刷电机本身扭矩不大遇到地毯或者插线板线缆时特别容易堵转。堵转后边刷停止转动但状态机不知道还以为自己还在清扫。后来我在固件里加了电流采样当边刷电机电流超过 500mA 且持续时间超过 2 秒时状态机判定为堵转执行停止边刷 - 后退 - 旋转 30 度 - 恢复边刷的脱困动作。线缆缠绕则要靠物理设计解决边刷安装高度不要太低刷毛伸进地毯几毫米就够了否则容易把线缆卷进去。6.3 续航不足标称 3000mAh实际跑 40 分钟就没电电池标称容量和实际可用容量差距很大。3S 18650 电池组标称 3000mAh但扫地机峰值电流接近 3A加上风机、主控、雷达都在跑平均功率不小。实测充满电只能跑 40 分钟左右扫完一个 80 平的房子要中间回充一次。后来换了四块松下 18650 电芯并联提高容量续航提升到 70 分钟代价是机身更重、底盘高度更高通过性下降。建议在续航和通过性之间做一个平衡别一味加大电池。6.4 充电桩对接失败触点对不齐是最常见原因第一次调试自动回充导航到了充电桩附近但机器人撞来撞去就是接不上触点。排查下来是充电桩的红外发射角度太窄机器人从侧面靠近时接收不到信号而如果走直路靠近又因为导航到位精度不够最后一步会冲出几厘米。解决办法是在代码里加入红外信号强度引导先让导航把机器人送到充电桩正前方 0.3 米处然后切到红外归航模式根据红外接收强度的差值控制左右轮以低速缓慢逼近充电桩。同时把充电桩的外壳做了一点倾斜导向即使有偏差也能被结构件推回正确位置。6.5 传感器标定IMU 数据不准建图就晕MPU6050 刚上电时的数据漂移非常严重尤其陀螺仪零偏可以达到每秒好几度。如果不做校准Cartographer 收到的是严重偏差的 IMU 数据即便激光雷达扫描匹配得再好机器人转弯时地图也会出现明显扭曲。解决方式是启动 IMU 后先静止采集 50-100 帧数据算平均零偏运行时把这个零偏减掉。在代码里维护一组传感器偏差校准参数每次开机自动执行比每次手动调参省事得多。6.6 雷达低速运行时扫描畸变RPLIDAR 在机器人快速旋转时扫描点会因为雷达自身的旋转和机器人运动产生轻微畸变。Cartographer 在处理时可以通过里程计数据补偿但补偿效果取决于里程计精度。实测下来机器人原地转弯速度超过 30 度/秒时地图边角会出现小波浪形畸变。所以在清扫节点的状态机里我把转弯速度限制在 20 度/秒以内地图质量立刻稳定了。最后分享一个小体会这套开源方案带给我的最大收获不是真的省下了买扫地机的钱而是理解了工业级产品是怎么一层层堆出来的。SLAM 不是魔法覆盖路径不是玄学回充对接也只不过是传感器和状态机的组合。所有看起来智能的能力拆到代码层面都是可以一步步推理、测试、修正的工程问题。如果你也想试建议别一上来就追求全屋智能清扫先搭个能跑的最小系统一个底盘、一个雷达、一块主控跑通建图你就已经超过了绝大多数纯看教程的人。后续再慢慢加避障、加覆盖、加回充每一步都是新收获。祝你能装出一台比我的稳的扫地机器人到时候记得在 GitHub 把自己的经验也开源回去。