模块化家庭服务机器人DIY:从移动底盘到智能中枢的完整实战

模块化家庭服务机器人DIY:从移动底盘到智能中枢的完整实战 做家庭服务机器人很多人第一步就卡在“这玩意儿到底该做成什么样”。单一功能太浪费底盘功能太多又容易变成堆料。这次分享的模块化家庭移动服务机器人“小明”是我自己折腾了几个月的一套方案定位很简单一台能在家跑、能自己找充电桩、能驮着不同功能模块跑的移动平台。它的核心不是某个炫技功能而是把移动充电、媒体播放和智能家居中枢这三种高频需求收纳进一套模块化接口里。喜欢动手 DIY 机器人、玩智能家居或者想给家里添一个实用“数字管家”的朋友可以重点参考这套思路。我做这套东西之前也纠结过市面上能买到的家用机器人要么是扫地机要么是带屏幕的固定音箱几乎没有能自由换模块的。所以干脆自己攒一台。整个项目最值钱的部分不是硬件多贵而是“模块化”这套设计逻辑——底盘只负责移动和供电上面的功能舱可以随时换。你不需要为每个新功能重做一台机器人拔掉旧模块、插上新模块任务就变了。这篇就把我踩过的坑、调过的参数、想明白的原理一次性讲清楚。1. 项目概述与设计思路1.1 小明是什么不只是一台“会跑的充电宝”“小明”这个名字起得很随意但它承担的职责一点也不随意。整台机器人的本体是一个直径约 35 厘米、高约 20 厘米的圆形移动底盘顶部预留了统一的模块化接口。没有安装任何模块时它就是一个能自主导航的 AGV 小车插上充电模块它能自动跑到手机、平板、扫地机器人旁边给设备补电插上媒体模块它就变成一个可以跟着人走的智能投影仪和音响插上中枢模块它就是全屋智能设备的本地控制中心。我见过很多人做机器人一上来就想着“我要做一个全能的”。全能本身没有错但落地困难。一台机器人要同时承担导航、抓取、交互、充电体积、功耗、成本和稳定性都会互相打架。模块化解决的是物理形态和软件功能之间的解耦底盘永远不变变化的是上面的“功能帽子”。这样每一层都可以单独优化出了问题也容易排查。1.2 为什么选模块化先解决“一台机器人干所有事”的坑第一个坑是迭代成本。如果做成一体机想加一个温湿度传感器就得拆开机身改 PCB、改结构、重新验证周期至少以周计。模块化之后我只需要做一个新的扩展模块插上去就能在系统里识别出来新功能当天就能完成原型验证。第二个坑是需求不确定性。家庭环境里今天可能想让机器人帮忙充电明天想让它投影追剧后天想让它当智能音箱。用模块化方案用户不用换机器人只需要换模块。就像相机换镜头机身不是瓶颈镜头才是。对于我这种喜欢长期迭代的人来说模块化等于给自己留了无限的后路。第三个坑是功耗匹配。移动底盘本身要持续给导航、避障、通信系统供电如果媒体音箱的大功率功放也焊死在底盘上电池续航会被严重拖累。模块化之后媒体模块自带电池底盘只提供信号和数据通道电源上各自独立互不干扰。这也是后来实测下来稳定性明显提升的关键设计。1.3 三个核心能力的协同逻辑小明的三大能力——移动充电、媒体、智能中枢看起来是三个独立功能实际上有一条清晰的协同链路。底盘负责“移动”也就是物理世界的执行智能中枢负责“决策”也就是理解任务并下发指令媒体模块负责“表达”也就是把信息和娱乐用声音、画面呈现给用户充电模块负责“能量”是移动性和长时间续航的保证。举个例子你对着小明说“帮我给手机充电”智能中枢模块先通过麦克风阵列识别语音指令然后调度底盘导航到沙发边上同时自动把充电模块切换成无线充电输出状态。手机放上充电板指示灯亮起来媒体模块同步播报“开始充电”。整个过程里每个模块只做自己最擅长的事通过标准的内部协议协作。这种分工明确的架构也让后面的软件调试变得非常舒服。2. 整体架构与关键硬件选型2.1 底盘与运动控制先想清楚“怎么跑”底盘是整个机器人的地基。我最终选择了双轮差速驱动加两个万向从动轮的四轮布局。双轮差速的好处是结构简单、控制成熟家里短毛地毯和瓷砖地面都能跑。相比麦克纳姆轮差速轮在家庭场景的通过性和成本上都更有优势——麦克纳姆轮虽然能横移但对地面平整度很挑剔家里一条地砖缝就可能让它姿态怪异。电机我用了带霍尔编码器的直流减速电机具体参数额定电压 12V减速比 1:30单轮最大输出扭矩约 5kg·cm。编码器精度直接决定了定位和回充对接的准确性所以我建议至少选 500 线以上的编码器。控制器用的是一块 STM32F407 开发板跑底层运动控制树莓派 4B 跑上层导航和业务逻辑。STM32 负责毫秒级的电机 PID树莓派负责 ROS 地图构建和任务调度分工很清晰。底盘的机械结构我用的是 3D 打印的 PLA 外壳加铝合金支撑板总重量控制在 4.5kg 左右。这个重量对家庭使用来说刚好——不会轻易被猫撞翻也不会重到搬不动。底部设计了三个充电触点和无线充电接收线圈方便机器人自己回桩充电。这个“机器人也需要充电”的细节是很多新手最容易忽略的。2.2 模块化接口机械、电气、通信一个都不能少模块化的灵魂在接口。机械上我设计了一圈六个 M3 螺纹孔加上两个定位销模块通过旋钮卡扣锁紧拆装一块模块大概五秒钟。电气上用的是 10 针 POGO 顶针连接器包含两组 12V 电源、一组 5V 电源、一组 I2C 总线、一个串口和一个 ID 识别引脚。这个 ID 引脚很关键——模块里放一个不同阻值的电阻底盘上电后通过 ADC 读电阻值就能判断插了什么模块。通信协议上我最初试过只用 I2C但后来发现媒体模块和中枢模块的数据量比较大光靠 I2C 会卡顿。最终改成了串口为主、I2C 为辅。每个模块内部都有一颗 STM32G0 单片机做协议转换和电源管理向上层树莓派上报模块类型、固件版本、温度和错误码。这样设计的好处是即使模块本身用的是不同芯片平台也能通过统一协议接入整个系统。这里有个容易被忽视的点接口的物理尺寸和防反插。我在接口周围加了非对称的导向结构模块只能按一个方向插入避免用户插错烧毁电路。电源引脚比信号引脚长 1 毫米这样插拔瞬间先接通电源再接信号减少热插拔对芯片的冲击。这些小细节量产产品里叫“人因工程”DIY 里叫“避免半夜炸板”。2.3 传感器与计算平台机器人靠什么感知世界导航系统用小面积家庭环境常见的方案一台 360 度激光雷达RPLiDAR A1负责构建二维栅格地图和实时定位一个九轴 IMUMPU9250负责姿态解算和航向校正底部还有三个红外传感器用来检测悬崖和台阶正前方有一个超声波模块用来补盲区。摄像头我暂时只装在媒体模块上底盘本身不跑视觉算法省下来的算力都给了导航。计算平台分两级。底层的 STM32F407 负责电机 PID、里程计解算、传感器采集运行频率 50Hz上层树莓派 4B 跑 ROS Noetic负责 SLAM 建图、AMCL 定位、Move Base 路径规划以及和各模块的通信。选择树莓派而不是 Jetson原因是家庭场景对低功耗和生态友好度要求更高而且我不需要跑重型神经网络树莓派的 CPU 做中小规模任务调度富余量是够的。电池我用的是 3S 锂电池标称 11.1V容量 10000mAh配合一个带电量计的电源管理板。底盘自己巡航大概能撑 2.5 小时如果只待机挂在中枢模式下可以到 6 小时以上。需要特别注意的是电池管理板必须有欠压保护和过流保护否则模块热插拔时的瞬间浪涌很容易把电源系统打挂。3. 三大核心功能实现解析3.1 移动充电模块从“自动回充”到“给设备送电”移动充电模块是我最常用也最得意的部分。模块本身做成了一个类似托盘的结构上面同时集成了无线充电板和两个有线输出口。无线充电板支持 Qi 协议最大 15W手机放上去就能充有线口支持 USB-PD 协议最高 45W可以给平板、笔记本电脑甚至扫地机器人充电。模块内部有一颗 10000mAh 的电池平时插在底盘上时会自动补充电能脱离底盘单独拿出去也可以当临时充电宝用。“移动充电”和“充电宝”最大的区别是机器人知道你需要充电的位置在哪里。手机放在茶几上忘了插线只要在小明的控制面板里点一下“给手机充电”它就会先通过智能中枢模块的语音确认位置语义然后导航到茶几。这个能力的底层依赖两个技术一是导航精度最终停靠位置误差必须控制在 5 厘米以内二是停靠姿态托盘边缘要对准茶几边缘否则手机没办法放上去。实际测试中我遇到最多的问题是激光雷达在低矮茶几腿附近定位漂移导致机器人停靠时角度偏差很大。解决办法是在导航目标点附近增加一个“视觉对齐”环节通过摄像头识别茶几边缘的 AprilTag 标签用 PID 闭环微调机器人位置。加了这个环节之后对接成功率从不到 70% 提升到了 98%。所以如果你也想复刻这个功能不要只依赖激光雷达。3.2 媒体模块让机器人长出眼睛和嘴巴媒体模块是我做的最“情绪价值”的一部分。它是一个直径和底盘完全一致、高约 15 厘米的圆柱体正面有一块 7 寸触摸屏两侧是 10W 立体声喇叭顶部隐藏了一个微型投影仪。合体状态下小明就是一台可以跟着人走的智能投影仪单独放在桌上它也可以当作一个智能音箱和电子相册。投影仪用的是小型 DLP 模组物理分辨率 854x480投射 30 寸画面大概需要 60 厘米距离亮度在暗光环境下足够用。虽然和家用大投影没法比但它的优势是移动和目标跟随。我在媒体模块里跑了简单的人脸检测算法通过摄像头识别家庭成员位置控制底盘跟着人转动方向保证画面始终对着人。周末晚上想躺在沙发上看视频我只需要对小明的触摸屏点一下它就会自动跑到沙发对面的茶几上固定位置然后投射画面。媒体模块内部也用了一块树莓派 CM4但和底盘的树莓派 4B 通过串口通信不共用系统。这样设计是防止媒体播放的高负载拖垮导航进程。两块树莓派之间传指令和状态流媒体直接在媒体模块上处理实际体验非常流畅。声音方面我加了简单的 DSP 均衡器因为家里空间小、回声重默认音效反而显得浑浊。3.3 智能中枢模块把全屋设备串起来智能中枢模块是小明的“大脑外挂”。它本质上是一个运行了 Home Assistant 和 Node-RED 的迷你主机带有麦克风阵列、红外发射器和 Zigbee 网关。插在底盘上时它可以跟机器人移动去不同房间执行场景联动拔下来放在电视柜上它就变成固定的家庭智能中枢两用设计很实用。语音交互我用了本地离线方案通过 openWakeWord 做唤醒词识别唤醒后通过 Whisper 小模型做离线语音转文字再通过 intent 匹配执行本地指令。为什么不直接用云端语音一是隐私二是延迟。家里有摄像头和房门锁我用小爱音箱总觉得每次说话都要上传数据不踏实离线方案虽然笨一点但胜在可控。智能中枢和家庭设备的联动走的是 MQTT 和红外双通道。有网协议的设备通过 Home Assistant 接入老式红外家电空调、电视就通过模块顶部的红外发射器控制。因为小明可以移动它能做到固定中枢做不到的事比如晚上十点它会自动跑到卧室门口通过热释电传感器检测到人进去就执行“睡觉模式”——关客厅灯、拉窗帘、打开卧室加湿器。这种“跟着人走”的场景逻辑需要移动底盘配合才能实现。3.4 软件调度与任务状态机设计多个模块协同工作时最怕的是“谁都觉得自己该做主”。我在树莓派上写了一个简单的中央调度器用状态机管理任务。状态分为待机、导航中、执行任务、回充和低电量保护。每个模块都通过串口向调度器注册自己的能力比如充电模块上报“我能提供 15W Qi”媒体模块上报“我能播放本地媒体”。当用户发出一个复合指令比如“把投影准备好然后去给手机充电”调度器会先解析这个指令发现有两个子任务。它会优先执行“去给手机充电”因为充电需要物理移动而投影准备只需要媒体模块启动。执行完充电后再导航到投影位置。这个优先级规则很简单但非常有效凡是涉及大量移动的任务优先涉及电力的任务优先于媒体任务。实际跑下来复合指令的完成率比一开始串行执行高很多。4. 从零搭建与调试的实操过程4.1 硬件装配与接口测试先说装配顺序避免返工。第一步把底盘电机、编码器、驱动板固定好先不装上层单独给电机上电测试轮子转动方向是否一致。第二步安装激光雷达和 IMU注意 IMU 一定要固定在底盘几何中心附近用减震泡棉贴住否则电机振动会让姿态数据漂移。第三步安装电池和电源管理板所有电源线用不同颜色区分。上电测试时不要急着装模块。先用万用表量一下每个 POGO 针脚电压是否正确尤其是电源和信号针脚确认没有短路后再插模块。我一开始因为模块接口焊反了两根线一插上模块底盘系统立刻黑屏查了好几个小时。后来在接口旁边加了 LED 指示灯正负极接对了才会亮之后再也没出过这种低级问题。模块识别测试也值得单独说。插上充电模块后树莓派通过串口读取 ID 电阻值显示“module: charger, battery: 82%”说明识别成功。如果识别不到先检查 ID 引脚接触是否良好再检查模块内单片机的固件是否在跑。这个测试看起来简单但实际遇到调试问题最频繁的就是这里建议做一个自动化自检脚本每次开机自动巡检所有模块状态。4.2 导航与避障配置导航系统我直接用的 ROS Navigation Stack没有自己写路径规划。建图阶段用手推着机器人走一遍全屋激光雷达频率设置 10Hz分辨率 0.05m建出来的地图够用。重点说一下两个参数代价地图膨胀半径我设成了 0.15m比机器人本体半径大一点这样墙角不容易被刮蹭最大线速度设 0.4m/s角速度 0.8rad/s这个速度在家庭环境既能保证效率又不会吓到猫。避障方面我加了超声波传感器作为激光雷达的补盲。原因是激光雷达平面扫描不到低于它安装高度的障碍比如地插、接线板、拖鞋。超声波固定在底盘前方检测距离 0.3-2m 的范围一旦发现障碍物就直接降低速度配合 DWA 局部规划器重新规划路径。实测下来加了超声波之后和桌椅腿的碰撞次数几乎降到了零。还有一个小技巧家里的镜子和大面积落地窗会让激光雷达出现“假墙”导致地图里莫名多出一堵墙。处理办法是在建图时用胶带贴住玻璃表面或者在建图工具里手动标定这些区域为未知区域。我偷懒没有绕开结果机器人每次到走廊镜子前都会突然原地转圈后来重新建了一次图才解决。4.3 移动充电对接调试移动充电是整个项目里精度要求最高的环节没有之一。底盘停在距离充电桩大约 20 厘米的粗定位点时先通过激光雷达粗定位然后切换到视觉精细对准。我在充电桩上贴了一个 5cm 见方的 AprilTag底盘前端的摄像头识别到 tag 后会计算相对位移P 控制机器人慢慢挪动直到 tag 正好处于摄像头画面中心。这里有个参数坑摄像头帧率不需要太高15fps 就够但 P 控制的增益一定要调小否则机器人会在目标点附近来回震荡。我调试时把最大修正步长限制在 1 厘米一次只挪动一小步虽然看起来慢但成功率极高。对接完成后底盘底部的充电触点和充电桩的电极相接充电电流设定为 5A充满后通过串联的继电器自动断开。如果你的充电桩是无线充电方案那精度要求可以放宽到 2 厘米因为线圈对准的容差更大。但无线充电效率低、发热大所以我最终选择了触点方案。触点方案的缺点是触点会氧化我用的是镀金 POGO 顶针配合防氧化硅脂目前用了三个月没出过接触不良。4.4 联调与整机续航测试所有模块都测试完把小明完整装起来做整机联调。联调时建议先关掉所有自动任务只做手工遥控确认底盘运动、模块识别、传感器数据都没有异常。然后再依次打开导航、语音、智能联动。我习惯用一组 20 项的冒烟测试脚本每项都在实际位置跑过了再进入日常使用。日常使用中有个很重要的策略——机器人保底电量。我在调度器里写了一条硬规则底盘电量低于 20% 时不管当前在做什么任务必须中断并返回充电桩。刚开始没有这条规则有次小明在客厅做媒体播放播到一半没电直接瘫在地毯上我下班回来才注意到。加了保底电量后再也没出现“机器人把机器人干没电”的尴尬。整机续航经过一周测试典型日常使用每天导航约 2 小时三天充一次电就够了。5. 常见问题与排查技巧实录5.1 模块识别失败与接触不良这是我在项目里遇到最多的一类问题。模块插上去系统里却显示“unknown module”或者直接没反应。排查时可以按三个步骤走先用万用表量 POGO 接触点确认模块侧电阻 ID 能正确读出再检查模块内的单片机程序是否正常启动这个可以在模块侧加一个 LED上电闪两下表示初始化完成最后抓串口日志看模块向上层发送的心跳包是否连续。另外POGO 顶针用久了会有触点污渍导致接触电阻变大。我家里有两只猫猫毛很容易落到接口上。建议每两周用酒精棉片清理一次电极并在接口上贴了一个磁吸盖板平时不插模块时盖住防止灰尘。如果你发现某个模块偶尔丢失又自动恢复大概率就是接触不良优先清污比换硬件更管用。5.2 导航漂移和充电桩对不准导航漂移的典型表现是机器人明明在地图上走直线实际却越走越偏。排查方向主要是三个轮子打滑、里程计标定不准、IMU 偏置。轮子打滑可以通过降低加速度解决我把电机加速度从 0.5m/s² 降到 0.2m/s²打滑明显减少。里程计标定则要找一个固定直线让机器人匀速跑几十次取里程计和实际距离的比值修正。如果粗定位到充电桩附近时角度偏了导致视觉对齐看不到 tag可以在粗定位点增加一个旋转搜索动作让底盘原地旋转 360 度扫描一次 tag。实测这个动作能将视觉对准成功率提升到接近 100%。还有一个思路是给充电桩加一个声呐信标通过超声测距辅助对准但精度不如视觉我没采用。5.3 电量管理异常有几天我发现小明的电池电量显示总是不准明明刚充满跑两分钟就掉到 60%然后又跳回 90%。这是因为电池管理板的库仑计和电池实际容量没有校准。解决办法是做一次完整校准把机器人放到低电量自动关机然后充满静置一小时重复两次。之后电量曲线就正常了。还有一种情况是模块在充电时底盘电池和模块电池互相倒灌。这是因为两个电池系统电压不一致当时我图省事把模块电池直接并联到了底盘电池上结果模块充满后开始反向回流给底盘两套系统互相拉扯。后来在模块电源入口加了一颗理想二极管防止反向电流问题彻底解决。如果你自己做扩展一定记得隔离电源方向。5.4 媒体模块卡顿与散热问题媒体模块跑到一半声音断续、屏幕掉帧一般是两个原因内存不足或过热。树莓派 CM4 播放 1080p 视频时如果不加硬件解码CPU 占用会飙到 90% 以上。解决办法是让播放器调用 GPU 硬解同时关闭桌面特效。散热方面我在媒体模块塑料外壳上开了几排散热孔内部加了一个 5V 静音风扇温度从 70 度降到 50 度以下卡顿基本消失。5.5 问题排查速查表现象可能原因快速处理模块识别不到触点氧化或 ID 电阻虚焊酒精清洁触点重新插拔模块导航走偏轮子打滑、里程计标定不准降低加速度重新标定里程计充电桩对不准视觉 tag 角度偏差粗定位后加旋转搜索动作电量显示跳变库仑计未校准低电量关机后充满静置校准模块电池倒灌电源未隔离加装理想二极管防反流媒体播访卡顿未开硬解或散热不良启用硬解加风扇改善散热语音唤醒无响应麦克风阵列距离过远靠近说话检查降噪算法激光雷达假墙玻璃镜子反射建图时重新标记玻璃区域6. 一点设计心得与接下来想做的事整个项目做下来我最深的体会是“模块化”不是一个技术名词而是一种思维方式。做第一版的时候我也沉迷于功能叠加想把摄像头机械臂全堆上去结果每样都做不好。后来逼着自己做了减法把不同功能拆成独立模块反而每条功能链路都能专注打磨。这也让我明白个人 DIY 项目最怕的不是能力不够而是战线拉太长。安全和可靠性方面我再多说两句。家里有小孩和宠物的话底盘运行一定要加防夹脚逻辑——我在底盘四周装了触碰条碰到东西立即停车并反向退 2 厘米。充电触点电压不高但也要设计成防水防异物短路的保护罩。这些都是看不见的工作但非常重要建议每位复刻的朋友都认真对待。接下来我想给小明增加两个新模块一个带小机械臂的取物模块一个带 PM2.5 传感器和加湿功能的空气管理模块。取物模块的视觉抓取算法我已经在电脑上跑通了接下来就是缩小体积搬到模块上去。空气管理模块则更偏实用毕竟家里猫毛和灰尘一直是我的痛点。整套系统也会逐步往开源方向整理把硬件图纸、固件和上层调度代码都放出来让更多同好能一起玩。