ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

开源扫地机器人全栈拆解:从STM32到SLAM的机器人工程课

开源扫地机器人全栈拆解:从STM32到SLAM的机器人工程课 一台会扫地的机器装着一整套机器人工程课程。这话不是我夸张前阵子把一个开源扫地机器人项目的代码仓库从头翻到尾顺手又拆了一台实物对照着看越看越觉得这东西像是有人把一门机器人工程专业的核心课程全部浓缩进了一台家电里。从STM32上的实时操作系统到激光雷达的SLAM建图再到App端的地图交互和云端的OTA升级每一层都是实打实的工业级方案而不是实验室里跑通就算完的demo。如果你正在找嵌入式或者机器人方向的学习项目又不想只点个LED灯、跑个电机空转那这种开源扫地机器人项目可能是你能接触到的最完整的全栈载体。我把整个系统的硬件选型、软件架构、通信协议、工程化管理逐个拆开讲一遍该给参数的地方给参数该说思路的地方说思路尽量让没有接触过机器人的朋友也能看明白每一层在干什么、为什么这么干。1. 为什么说扫地机器人是一套完整的机器人工程课很多人在入门嵌入式时会陷入一个尴尬单片机玩得挺溜GPIO、中断、定时器都会用但一说到“做机器人”就不知道从哪下手。原因很简单单个模块的驱动能力和把一堆模块组织成一个会自主运动的系统中间隔着一整个工程思维的距离。扫地机器人恰好把这个距离压缩成了一个可以完整走一遍的项目。先看一台标准扫地机器人里都有什么。主控芯片负责调度所有逻辑激光雷达或者视觉模组负责感知环境陀螺仪和加速度计感知姿态轮子里的编码器负责测距碰撞传感器、跌落传感器负责安全电机驱动板负责让轮子转起来电池管理系统负责供电Wi-Fi模块负责联网再加上一个App上位机和后端的云平台。这一套东西把嵌入式开发、传感器融合、自动控制、通信协议、移动端开发、服务端开发全部串在了一起。更关键的是扫地机器人的工作流程是一个非常典型的机器人闭环感知、决策、执行。传感器采集数据主控融合出位置和地图规划算法决定下一步去哪里电机驱动执行运动指令然后编码器反馈实际的运动距离闭环继续修正。这个流程和自动驾驶、仓储机器人、无人机飞控的逻辑完全一致只是规模小、成本低、可以在家里跑。所以我说它是一套课程不是因为功能花哨而是因为它完整覆盖了从底层寄存器到顶层业务逻辑的每一层。而且开源项目把这些层的代码全部摊开你能直接看到真实产品里每一层是怎么写的。这一点比很多教学项目价值大得多因为教学项目往往把每一层单独拿出来讲从不告诉你它们怎么拼在一起。另外还有一层意义扫地机器人是一个典型的软硬结合产品开发过程涉及PCB设计、结构装配、嵌入式开发、算法调参、App联调、服务器部署。你一个人走完这些环节基本等于把一个小型科技公司的产品研发流程过了一遍。很多人问“全栈开发怎么入门”其实硬件产品的全栈比纯软件全栈信息量更大因为它逼着你理解物理世界对代码的影响。2. 硬件层拆解一台扫地机的骨架和感官硬件是一台机器人最诚实的部分。代码写得再漂亮电机带不动、传感器数据不准一切都是白搭。所以拆解的第一步先把整个硬件架构看清楚。2.1 主控选型不是越贵越好开源扫地机器人项目里最常见的主控方案有两类一类是基于ARM Cortex-M系列的MCU比如STM32F4、STM32H7另一类是带Linux能力的SoC比如全志、瑞芯微的芯片有些项目还会用ESP32做Wi-Fi协处理器。我拆的这台采用的就是典型的双芯片方案一颗STM32做主控一颗ESP32做通信协处理器。为什么这么分因为扫地机器人的任务可以分成两类。一类是硬实时任务比如电机控制、编码器读取、传感器采样这些任务要求微秒级或毫秒级的确定性响应Linux跑不了这种活另一类是复杂计算任务比如SLAM建图、路径规划、网络通信这些任务计算量大、逻辑复杂用MCU跑会很吃力。所以直接把系统拆成两层MCU管实时控制SoC管智能计算中间用串口或者SPI通信。这个思路和汽车里ECU加域控制器的架构很像。选型上有一个重要的考量生态成熟度。STM32的HAL库和大量开源驱动让开发门槛低很多而全志、瑞芯微的方案通常要自己折腾BSP和交叉编译环境维护成本高一些。对于学习项目我更推荐STM32主控加一个Linux SoC的组合因为两边都有大量社区资料可查。如果预算有限一个ESP32也能跑起来只是SLAM这类计算密集的任务会非常吃力。2.2 传感器集群一台机器怎么“看”世界扫地机器人的传感器配置比很多人想象中丰富得多。激光雷达负责360度测距是建图的主力IMU惯性测量单元提供角速度和加速度用于姿态估计轮式编码器记录轮子转了多少圈推算行走距离沿墙传感器负责贴边清扫跌落传感器防止机器从台阶上掉下去碰撞传感器感知撞到障碍物陀螺仪辅助判断转向角度。这里最值得展开的是激光雷达。开源项目里常用的低成本方案是单线激光雷达比如思岚A系列或者镭神N10扫描频率通常在5到10Hz测距半径6到12米角度分辨率在0.9度到1度左右。这种雷达输出的原始数据本质上是一堆极坐标点每个点包含角度和距离。把一整个扫描周期内360度的点串在一起就形成了一帧激光数据SLAM算法就是靠这些帧来拼出房间的轮廓。IMU的作用经常被低估。激光雷达能测周围环境却测不了自身姿态变化。机器人在不平整的地面上跑坡道会让机身倾斜激光扫描平面会跟着倾斜直接导致建图扭曲。IMU通过加速度计和陀螺仪的融合输出稳定的姿态角可以在算法层面补偿这种倾斜。这就是为什么所有靠谱的机器人都会同时搭载激光雷达和IMU而不是只靠一个传感器打天下。传感器的数据质量差异也是一门学问。我见过很多初学者直接拿传感器裸数据用结果建图全是毛刺。比如激光雷达数据里会有一些飞点就是某个角度突然测出异常距离可能是玻璃反射或者灰尘干扰。正规项目里都会有一层数据预处理做孤立点过滤、扫描匹配、无效数据剔除处理过的数据再进SLAM算法。这一步看起来不起眼实际对建图质量的影响可能比换一颗更好的雷达还大。2.3 电机驱动与运动底盘机器人怎么走路扫地机器人的运动底盘分为两种主流方案两轮差速和四轮全驱。两轮差速是两个主动轮加一个万向轮靠左右轮的速度差实现转向成本低、控制简单是绝大多数家用扫地机的选择。四轮全驱的通过性更好但控制复杂度和功耗都显著上升多用在高端型号。电机选型直接影响控制精度。开源项目里常用的是带霍尔编码器的直流减速电机减速比通常在1:20到1:30之间编码器分辨率每圈几百线。编码器是机器人的“脚感”没有它你的机器人就不知道轮子实际转了多少也就谈不上闭环控制。每根轮轴上的编码器脉冲数通过定时器计数换算成轮子的行走距离这就是里程计数据的主要来源。这里要顺便提一下电机驱动的坑。很多开源项目用TB6612或者DRV8833这类电机驱动芯片优点是便宜、外围电路简单但持续电流能力有限一般在1.2A到2A左右。扫地机器人实际工作电流经常达到这个上限长时间运行芯片会烫得厉害。稍微讲究一点的项目会选用带电流检测的驱动方案比如DRV8701加外部MOS或者直接用集成式的无刷电机驱动。如果你只是学习用TB6612完全够但要在散热上做点功课别长时间满载跑。电池和电源管理是很多人忽略的部分。扫地机器人是电池供电设备整机电压通常在12V到14.4V也就是4串18650锂电池。MCU需要3.3V传感器有5V有3.3V电机直接吃电池电压。这就需要一个多路电源树电池电压先经过DC-DC降压到5V再经过LDO降到3.3V。设计的时候要注意电机启动瞬间的大电流会把电压拉低如果不做电源隔离或者加足够的滤波电容MCU可能直接复位。这个问题非常经典排查的时候如果机器一启动就重启先量一下电源纹波。2.4 结构设计藏在壳子里的机械课硬件拆解如果只看电路板就亏了。扫地机器人的结构设计也是全栈工程的一部分。外壳、尘盒、边刷、滚刷、驱动轮悬挂、雷达支架每一个结构件都关系到整机的性能。最典型的是主刷和边刷的配合逻辑。边刷负责把墙角的垃圾扫到主刷的清扫路径上主刷再通过滚刷把垃圾卷入尘盒。这中间涉及刷毛的材质、旋转方向、转速差都是经过测试调出来的。开源项目的结构图纸一般提供STEP或者STL格式你可以用FreeCAD或者Fusion 360打开甚至直接3D打印一套外壳来装配。我见过有人把整个外壳改成透明的就是为了观察垃圾是怎么从地面进入尘盒的这种做法很有学习价值。轮子的悬挂结构也值得注意。扫地机要能越过地板上的电线、门槛这类小障碍驱动轮需要有一定的浮动行程。多数开源项目的轮子模组是一个带弹簧的摇臂结构轮子可以上下浮动一段距离始终保持与地面的附着力。没有这个设计机器人过一个稍微高一点的障碍就会打滑里程计数据马上漂移。3. 嵌入式软件层让硬件听话的代码硬件只是躯壳这一层是扫地机器人的神经系统。嵌入式软件在整台机器里承担的任务非常重从底层驱动的字节操作到上层算法的任务调度都属于这一层。3.1 实时操作系统与状态机管理拆开源项目的代码你会发现主控端几乎都跑了一个RTOS最常见的是FreeRTOS国产项目里也有用RT-Thread的。为什么要用RTOS而不是裸机大循环因为扫地机需要同时处理的事情太多了激光雷达数据以10Hz频率持续进来编码器中断随时可能触发电池电压要周期性采样电机控制要以10kHz级别更新Wi-Fi通信数据不定时到达。如果用裸机的前后台架构任何一个阻塞操作都会让其他任务卡住。RTOS让每个任务拥有独立的执行上下文调度器按优先级去分配CPU时间系统整体的实时性和稳定性都会好很多。扫地机器人的行为逻辑非常典型是用一个状态机来管理的。初始化、待机、回充、清扫、暂停、异常处理每个状态对应一组行为和允许迁移的条件。比如清扫状态下接收到低电量事件就迁移到回充状态。这个状态机通常实现为一个大的switch-case或者一张迁移表是整个控制逻辑的主干看懂状态机就可以理解这台机器所有的行为。状态机本身不复杂但状态划分的粒度很有讲究。初学者容易把状态设计得太粗比如一个CLEANING状态里塞了找起点、弓字形清扫、沿墙清扫三种完全不同的行为逻辑代码会越来越难维护。开源项目里的做法通常是行为层再叠一层子状态机比如扫地状态下还有一个决定当前扫法弓字形还是沿墙的子状态这样逻辑清晰也方便单独调某一种行为。3.2 电机闭环控制从PID到实际调参扫地机的两个驱动轮需要精确的速度控制。控制目标是让两个轮子的速度精确等于设定值比如每秒0.5米。实现方式是PID控制器编码器测出实际速度和期望速度做差比例项P放大这个误差积分项I消除长期累积的稳态误差微分项D抑制速度的快速变化。输出值是施加在电机上的PWM占空比。PID调参是个很值得动手练的环节。我见过太多人照着网上教程抄PID代码然后发现机器人跑起来要么疯狂震荡要么慢吞吞地不动。原因很简单参数是靠现场环境调出来的不是抄来的。一个实用的调参步骤是先把I和D设成0只留P从小到大增加P直到轮子速度开始出现轻微震荡记下这个P值然后引入少量I来消除稳态误差最后加一点D让响应更平稳。需要注意PID输出的正负和限幅必须处理正确。扫地机需要前进和后退所以速度是有正负号的PWM输出需要对应正反转一般用两个引脚控制电机方向、一个引脚控制PWM占空比。PID输出超出PWM上限时要做饱和限幅同时积分项要防止积分饱和就是误差一直积累导致输出持续拉满等误差反转时又需要很长时间才恢复。工程上有一种简单的抗饱和办法只在输出没有超过限幅时才累加积分项。运动控制的另一个核心逻辑是里程计。通过左右轮的编码器脉冲数结合轮子直径和轴距可以直接累加计算出机器人在平面上的位置和朝向。公式不复杂脉冲数除以每米脉冲数得到轮子行走距离左右轮距离的平均值是机器人的位移左右轮距离差除以轴距得到转向角度。很多开源项目还会把陀螺仪的角速度和里程计推算的角速度做加权融合得到更准的朝向估计。3.3 SLAM建图与路径规划扫地机器人的“大脑”扫地机器人区别于普通遥控玩具的分水岭就是SLAM能力。SLAM的全称是同步定位与建图通俗地说就是在未知环境中一边确认自己在哪里一边把周围的地图构建出来。开源项目里用得最多的是基于粒子滤波的Gmapping算法以及谷歌出品的Cartographer。Gmapping原理上更适合小场景、计算压力小在单核处理器上也能跑实时Cartographer引入了回环检测大场景下表现更好但计算和内存开销更高。有些项目为了跑Cartographer专门需要一块带Linux的高性能主控低性能方案只能跑Gmapping。SLAM的输入是一帧一帧的激光数据但激光数据自带一个不确定性问题机器人一边动一边扫描雷达每一帧数据不是同一个位置采集的。所以算法的第一步通常是帧间匹配用里程计给出的粗略位姿作为初始猜测然后把当前帧激光和已有地图做配准优化出更精确的位姿。这个“先猜后校”的过程是整个SLAM的核心。路径规划逻辑里有个很有意思的地方就是扫地机的清扫路径不是随手画的。常见的规划策略叫弓字形全覆盖路径机器人先在地图上把区域栅格化然后沿着平行的弓字形路径一行一行清扫尽量覆盖所有可达区域避免重复和遗漏。遇到障碍物就围绕障碍物走一圈把障碍物边界记录下来然后回到弓字形路径上继续扫。在公开地图上做这种规划是搜索算法的应用场景有A*算法做全局路径规划也有Dijkstra做代价计算但到了局部避障往往直接用简单规则。地图在扫地机器人里通常是栅格地图的形式。整个房间划分成一个个小格子每个格子标记为空闲、占据或未知。这个表示方法天然适合做路径规划和碰撞检测。栅格的分辨率一般设在5厘米左右太细内存吃不消太粗边角扫不干净。4. 上位机与App层用户看到的“全栈”另一半很多人做嵌入式习惯了只看单片机端把上位机当成可有可无的附属品。但如果你想走完整条产品链路上位机是绕不开的。扫地机器人的用户体验几乎都集中在App里看地图实时构建、设置清扫区域、划禁区、一键回充、查看耗材寿命。这些功能背后的技术链路涉及通信协议、数据序列化、地图渲染、网络状态管理是典型的全栈知识集合。4.1 通信协议设计机器人怎么和设备对话机器人和App之间不是直接通信的中间至少隔了一层云服务和路由。数据流向大致是机器人主控通过串口把状态数据打包交给Wi-Fi模块Wi-Fi模块通过MQTT协议发布到云端的TopicApp从云端订阅这个Topic收到数据。反向控制指令则走另一条链路App把指令发到云端云端转发给机器人。为什么用MQTT而不直接搞一个TCP长连接因为MQTT是发布订阅模型设备端和服务端解耦。App上线不需要知道机器人此时此刻在不在线它只需要订阅对应Topic网关会自动把消息推给当前订阅者。这个机制处理设备掉线重连、多客户端同时在线这类问题都非常自然是物联网场景下的主流选择。通信协议的数据格式也有讲究。早期项目喜欢用JSON可读性好但解析效率低、流量占用大。正式一点的项目会使用protobuf定义一个.proto消息结构然后自动生成各端的序列化和反序列化代码。同一个proto文件生成C版本给嵌入式端用、Java/Kotlin版本给Android端用、Swift版本给iOS端用保证了所有端的通信字段定义一致。这个一套定义多处生成的做法正是全栈协作的标准姿势。4.2 地图可视化与交互操作App端最核心的功能是地图。地图数据从机器人端以栅格数组的形式传上来App拿到后逐格渲染成图像再叠加机器人的位置、清扫路径、禁区标记。这个渲染如果只用ImageView一张张塞像素性能会很差地图一刷新整个界面就卡住。实践中通常用SurfaceView或者自绘View把栅格数据转成Bitmap后局部更新或者干脆用OpenGL直接把栅格纹理贴到四边形上用GPU来完成缩放和平移。地图交互是另一个工程点。用户在屏幕上划一个矩形框这个框在屏幕坐标系里要转换成地图坐标系才能下发给机器人。中间涉及坐标归一化、旋转、缩放换算还要考虑地图的分辨率和原点偏移。很多项目会在这一层出错比如在横屏和竖屏切换时禁区坐标发生偏移就是因为没有把坐标转换逻辑统一封装。建议的做法是抽象一个地图坐标系转换器所有的屏幕触摸事件都通过它换算成地图坐标不要在其他地方散落着各自的转换代码。App端的全栈点还包括状态同步。机器人的状态包括电量、清扫模式、工作状态、当前坐标、错误码这些信息以高频比如每2秒一帧上报。App收到之后要决定哪些需要刷新UI哪些要触发本地通知哪些要做缓存。如果每次上报都重新渲染整个页面性能就崩了。所以正规项目会在App端做一层状态管理对比新旧状态差异只更新有变化的视图。5. 服务端与数据链路扫地机器人背后的“云端大脑”看到这里你会发现一台扫地机器人的链路其实是一个完整的IoT架构。服务端在这一链条中承担了设备管理、消息转发、数据存储和远程控制等核心职能。这一部分在全栈视角里属于后端的范畴对很多嵌入式出身的人来讲可能是最陌生的一环但恰恰是产品真正落地的关键。5.1 MQTT Broker与设备接入服务端的基础是MQTT Broker较为常用的开源方案是EMQX和Mosquitto。EMQX在集群扩展和规则引擎方面的能力更突出Mosquitto则轻量得多。做学习项目一台服务器用Mosquitto就足够了。设备接入不只是连上Broker那么简单。你要处理设备离线判定、重新连接时的session恢复、遗嘱消息——设备异常断开时由Broker代发一条离线消息。还有设备鉴权每一台机器人都应该有自己的ClientID和用户名密码防止别人伪造设备接入。有些项目会用TLS加密通信但MCU设备做TLS认证要额外消耗不少资源常见做法是设备端预置证书、Broker端开启双向认证。5.2 OTA升级一个完整的运维闭环OTA是所有联网硬件产品都必须有的能力扫地机器人也不例外。升级链路的完整流程是云端上传新固件版本App端提示用户有更新用户确认后设备下载固件包下载完成后校验摘要然后设备进入bootloader模式写入新固件写入完成重启回到正常模式。这套流程里最容易被忽视的是升级失败的恢复方案。如果设备下载到一半断网、写了半个固件就断电设备会变成砖。正规做法是bootloader里保留一份出厂固件或最少能进恢复模式的代码一旦检测到应用程序区校验失败就回滚或者等待重新升级。做这个功能的时候一定要反复模拟各种中断场景下载时断网、写入时断电、写入后启动失败。任何一个环节没有兜底用户手里的机器就可能变砖这是影响很大的事故。5.3 数据上报与远程诊断扫地机器人工作过程中会产生大量的运行数据清扫时长、清理面积、电机电流、风机转速、电池曲线、传感器异常记录。这些数据上报到云端之后可以形成两类价值一是用户画像比如这台机器在使用中经常卡在哪里二是远程诊断售后不用上门就能判断是传感器脏了还是电机坏了。上报数据的格式设计可以沿用protobuf也可以直接用JSON走HTTP接口看数据量和实时性要求。高频率的状态数据走MQTT实时消息低频率的日志和统计类数据走HTTP批量上报即可。云端的存储就可以用时序数据库或者直接用MySQL加定期归档学习项目用不到太重的方案。服务端还有一个功能是推送通知。扫地机在用户出门时清扫完毕或者清扫中途故障卡死都要通过推送告知用户。这一层可以接入移动平台自带的推送通道和App端协作完成。6. 工程化能力全栈拆解里最容易被忽略的隐形课程技术能力之外开源扫地机器人项目最大的价值在于它把工程化实践完整呈现了。很多人只看代码功能却忽视了这些项目在代码管理、文档规范、测试验证方面的沉淀。这部分对于未来真正参与商业项目很重要如果只关注具体的技术点其实损失了相当一部分价值。6.1 代码仓库结构与模块划分一个有分量的开源机器人项目代码仓库的目录结构本身就是一套设计语言。常见的做法是顶层按模块分目录hardware放原理图、PCB文件和BOM表firmware放嵌入式工程app放客户端代码server放云端服务代码docs放全量文档tools放调试工具和烧录脚本。硬件和软件同步管理是硬件全栈的一个特色。原理图改了和它配套的引脚定义、驱动代码需要同步修改这就需要在仓库的提交记录里看到硬件变更和软件变更的对应关系。有些项目会在提交说明里写关联硬件版本号这种做法很值得学习。还有一个细节是版本号管理。扫地机固件、App、服务端都有独立的版本号但在产品层面必须有一个整体版本清单标明哪个固件版本搭配哪个App版本、哪个服务端版本是经过联调验证的。不然就会出现用户App升级到新版旧固件兼容不了的情况。看起来是个流程问题实际上是个架构问题。6.2 调试手段串口日志不能解决所有事情做机器人项目和做纯软件调试方式很不一样。纯软件断点打在哪里都可以机器人跑起来很难打断点因为打断点意味着电机停转运动状态全变了。所以机器人的调试高度依赖日志和分析工具。日志系统要有等级划分错误、警告、信息、调试还要支持动态开关来避免日志占太多存储。每次运行的关键数据流包括里程计、IMU、控制输出、传感器原始值需要按不同模块打上明确的日志标签。调试的时候可以在日志里筛出某个标签来定位问题。还有一类工具是参数动态调试。机器人跑起来之后PID参数不合适不能每次改完参数就重新编译烧录这样迭代一次要几分钟。工程上通常会做一个参数服务让参数通过串口或Wi-Fi在线修改或者做一个参数文件放在SD卡里需要时热加载。我记得有次调一个转向过冲问题就是靠在线调参工具把I项参数从0.05一路试到0.02才找到合适的值要是每次重新烧录一下午可能只能调两个参数。6.3 测试与仿真在真实机器人上调试的成本很高扫地机器人的测试一个很大的问题就是不可控。家里每个房间的布局不一样地面材料不一样、光线条件不一样在真实环境里复现一个bug是很困难的。所以成熟的项目会引入仿真环境。比较常用的是Gazebo加ROS的仿真体系在仿真里搭一个虚拟房间把机器人的运动学模型放进去先验证算法逻辑再搬真实硬件。单元测试在嵌入式端容易被忽略但一些核心功能诸如状态机迁移、JSON解析、校验和计算等都是可以在PC上编译运行的。把这些逻辑从硬件依赖中抽离出来单独测试能省下很多对着硬件查bug的时间。集成测试则是把整机放在固定场景里跑一个标准的测试房间几个固定的障碍物跑同样的清扫任务对比前后修改对清扫覆盖率、耗时、卡困次数的影响。这种测试跑一次的时间成本很高所以记录要规范不然隔太久再看数据已经没有参考意义了。7. 实操复盘我在拆解和复现中踩过的坑最后分享一些实际动手过程中的体会。踩坑记录比功能代码更值钱因为这些都是查了很多资料、烧了好几块板子才总结出来的经验。第一个坑是编码器数据抖动导致的里程计漂移。我最初直接在每个编码器中断里累加计数值结果机器人走直线会越来越偏。原因很简单中断里的累加操作不是原子的两个轮的编码器中断可能发生竞争极端情况下计数丢失。解决办法是用定时器输入捕获模式替代外部中断让硬件自动计数定时器溢出时再同步读取。这个改动之后里程计精度明显提升说明能用硬件外设解决的事情就别用软件中断硬扛。第二个坑是电机PWM频率的选择。我用了一个常见的库默认PWM频率设置得比较低电机转起来发出很明显的啸叫声。查了资料才知道PWM频率低于人耳范围上限大约18kHz就会有可闻噪声而且频率太低会让电机电流纹波大电机发热也更严重。后来把PWM频率提到了20kHz以上噪声消失了电机温度也降了下来。第三个坑是SLAM建图时激光雷达的安装位置。我一开始装雷达的位置偏低结果扫地机运行时边刷会把细小灰尘卷起来恰好遮挡雷达扫描窗口导致地图上频繁出现一圈圈噪音。后来把雷达抬高了几毫米让扫描平面高过边刷扬尘高度建图稳定性明显好转。这种问题在文档里根本不会写只有实际跑起来才能发现。第四个坑是电源问题。四个电机同时启动的时候瞬间电流非常大我第一次做电源设计时电容容量没留够导致系统频繁重启。后来在电源总线上加大容量的电解电容并确保每个电机驱动芯片旁边有足够的高频去耦电容问题才解决。嵌入式系统90%的诡异问题最终都能追溯到电源质量上这句话在扫地机器人上体现得尤其明显。还有一个印象很深的经验是不要直接拿别人的全套代码烧录到自己的硬件上。开源项目的代码是配合他们自己的硬件设计的引脚定义、传感器型号、电机参数都不同直接烧录大概率跑不起来。正确的做法是先看代码理解它的架构和接口抽象然后对照自己的硬件逐层适配。这比花时间到处找可以直接用的代码库更有价值。如果你打算用这类项目来学习我的建议是不要追求把所有功能一次性跑通先做减法。比如先不管云平台让机器人能在本地用串口打印坐标和地图再不做App用手头上的电脑去接收地图数据。每一层都打通了再逐步往上加东西。这样遇到问题的时候定位范围更小学到的东西反而更多。至于接下来还能扩展什么我自己的计划是给这台机器人加一个视觉传感器尝试用深度学习做障碍物识别然后把感知结果融合到现有的路径规划里。你可以根据自己的兴趣在任意一层深挖开源项目的价值就在于每一层都留了扩展的接口。扫地机器人这台机器是真的能陪你从单片机一路走到人工智能的。
返回列表