做家庭服务机器人,很多人第一步就卡在“这玩意儿到底该做成什么样”。单一功能太浪费底盘,功能太多又容易变成堆料。这次分享的模块化家庭移动服务机器人“小明”,是我自己折腾了几个月的一套方案,定位很简单:一台能在家跑、能自己找充电桩、能驮着不同功能模块跑的移动平台。它的核心不是某个炫技功能,而是把移动充电、媒体播放和智能家居中枢这三种高频需求,收纳进一套模块化接口里。喜欢动手 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)负责构建二维栅格地图和实时定位,一个九轴 IMU(MPU9250)负责姿态解算和航向校正,底部还有三个红外传感器用来检测悬崖和台阶,正前方有一个超声波模块用来补盲区。摄像头我暂时只装在媒体模块上,底盘本身不跑视觉算法,省下来的算力都给了导航。
计算平台分两级。底层的 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 传感器和加湿功能的空气管理模块。取物模块的视觉抓取算法我已经在电脑上跑通了,接下来就是缩小体积搬到模块上去。空气管理模块则更偏实用,毕竟家里猫毛和灰尘一直是我的痛点。整套系统也会逐步往开源方向整理,把硬件图纸、固件和上层调度代码都放出来,让更多同好能一起玩。