1. 三条路线怎么选:先想清楚你要的是玩具、工具还是平台
很多人一上来就问“扫地机器人怎么做”,其实这个问题问错了。真正该先问的是:你想让它干什么。是想花一个周末拼个能满地乱跑的小车,还是想做一个能自动建图、规划路径、真正扫干净一个房间的实用设备,又或者你压根就是想拿它当机器人操作系统和导航算法的练手平台。目标不同,路线完全不一样,投入的时间、金钱和踩坑数量能差出十倍。
我把常见做法归成三条路线,你可以对号入座。
路线一:成品改装路线。买一台便宜的入门扫地机,拆开它的主控,用单片机或者树莓派接管电机和传感器。优点是底盘、电机、电池、充电座、尘盒这些机械结构全都现成的,省掉大量结构设计和采购的麻烦。缺点是原厂主板往往高度集成,电机驱动、传感器接口都是定制的,逆向成本不低,而且不同批次硬件还可能不一样。这条路适合动手能力强、想快速看到效果、对“从零造轮子”没执念的人。
路线二:套件组装路线。市面上有不少机器人底盘套件,带电机、编码器、轮子、驱动板,甚至带激光雷达支架。你只需要加上主控和雷达,就能拼出一台能跑的车。这条路线的核心价值在于机械和电气部分已经被验证过,你的精力可以集中在软件上。对于想学机器人操作系统、建图和导航的人来说,这是性价比最高的选择。
路线三:全自研路线。从底盘结构、电机选型、驱动电路、电源管理到主控固件、上位机软件全部自己做。这条路最硬核,也最容易烂尾。我见过太多人兴致勃勃买了电机和雷达,结果卡在电源噪声导致雷达掉线,或者卡在轮式里程计标定不准,最后车在墙角打转。如果你没有至少一次完整的嵌入式项目经验,我不建议一上来就走这条。
那为什么标题里要提“攒机路线图”?因为不管你选哪条路线,最终都会收敛到同一套分层架构:底层运动控制 + 中层传感器与里程计 + 上层建图导航。区别只是每一层你是买现成的还是自己做。下面这张表可以帮你快速判断。
| 路线 | 机械部分 | 电控部分 | 上位机 | 适合人群 | 典型周期 |
|---|---|---|---|---|---|
| 成品改装 | 现成 | 部分自制 | 自制 | 有嵌入式基础 | 2-4周 |
| 套件组装 | 现成 | 现成+自制 | 自制 | 想学软件 | 1-3周 |
| 全自研 | 全自制 | 全自制 | 自制 | 全栈老手 | 2个月起 |
我个人的建议是:第一次做,选路线二;想做产品化验证,选路线一;只想学算法,甚至可以直接用仿真,连车都不用买。后面我会重点围绕路线二展开,因为它的知识密度最高,而且每一步都能讲清楚“为什么”。
2. 攒机路线图:从一堆零件到能跑能扫的完整分层
2.1 硬件分层:别把电机和雷达接在同一块板上
扫地机器人的硬件可以粗暴分成三层:执行层、感知层、决策层。
执行层就是电机和轮子。常见方案是两轮差速加一个万向轮,或者两轮差速加两个辅助轮。电机选直流减速电机带编码器,编码器用来做轮式里程计。这里有个坑:很多便宜电机自带的霍尔编码器分辨率很低,一圈只有十几个脉冲,算出来的里程计噪声大得没法用。我一般建议选每圈至少390个脉冲的编码器电机,配合减速比,实际分辨率能到每转几千个脉冲,建图时才不会飘。
感知层包括激光雷达、惯性测量单元、碰撞传感器、悬崖传感器、超声波等。激光雷达是建图和导航的核心,常见的有二维单线雷达和三维雷达。二维雷达便宜、数据轻、适合室内平面建图;三维雷达信息丰富,但对算力要求高,导航栈的配置也复杂得多。新手先用二维雷达把流程跑通,再考虑升级。
决策层就是上位机,通常是一台跑机器人操作系统的计算机,比如树莓派、香橙派或者小型工控机。它负责接收雷达和里程计数据,运行建图和导航算法,然后下发速度指令给下位机。
关键原则:电机驱动和雷达供电要分开,或者至少加足够的滤波。电机启动瞬间的电流波动会通过电源线传导到雷达,导致雷达数据丢包甚至重启。我实测过,同一块电池直接给电机和雷达供电,雷达每隔几秒就报一次通信错误;加了一个独立的降压模块和LC滤波之后,问题消失。
2.2 通信分层:下位机只管实时,上位机只管算法
下位机和上位机之间需要一条稳定的通信链路。常见方案是串口或者USB转串口。下位机跑实时性要求高的任务:读取编码器、执行速度闭环、读取碰撞传感器、控制电机。上位机跑计算密集的任务:建图、定位、路径规划。
通信协议我推荐用简单的定长帧或者带校验的变长帧。比如每帧包含帧头、左右轮目标速度、左右轮实际速度、传感器状态、校验和。下位机收到目标速度后,用PID闭环控制电机;上位机收到实际速度和传感器状态后,更新里程计和状态机。
这里有个经验:不要在上位机做电机闭环。上位机的操作系统不是实时系统,调度延迟可能几十毫秒,电机闭环会抖得厉害。下位机用单片机跑裸机或者实时操作系统,控制周期稳定在1毫秒到5毫秒,电机才顺滑。
2.3 软件分层:建图、定位、导航各司其职
软件层面,机器人操作系统提供了现成的建图和导航框架。建图负责把雷达数据拼成地图,定位负责在地图中找到自己,导航负责规划路径并输出速度指令。
建图常用的是SLAM算法,二维场景下最成熟的是基于粒子滤波或者图优化的方案。导航框架通常包含全局规划器和局部规划器。全局规划器根据地图和目标点算出一条大致路径,局部规划器根据当前雷达数据避障并跟踪路径。
这三者之间的关系是:建图产生地图,定位消耗地图并输出位姿,导航消耗位姿和地图并输出速度。任何一个环节出问题,车都跑不起来。比如建图飘了,定位就会跳,导航就会画龙。
3. 核心细节解析:从电机选型到雷达配置的实操要点
3.1 电机与编码器:为什么你的里程计总是不准
轮式里程计是扫地机器人最基础也最容易出问题的传感器。它的原理很简单:根据左右轮转过的圈数,结合轮径和轮距,推算出车的位置和朝向。但实际中,轮径误差、轮距误差、打滑、地面不平都会导致累积误差。
我踩过的坑:一开始用卷尺量轮径,量出来65毫米,结果跑一圈下来位置偏了十几厘米。后来才发现,轮子外面包了一层橡胶,受压后实际有效半径变小了。正确做法是让车直线走一段已知距离,反推有效轮径。比如让车走3米,编码器读数换算出走了3.2米,那有效轮径就是测量值乘以3除以3.2。
轮距的标定更麻烦。方法是让车原地转一圈,记录左右轮编码器差值,反推轮距。具体公式是:轮距等于左右轮走过的弧长差除以转过的角度。实际操作中,让车转十圈取平均,精度会好很多。
还有一个隐藏问题:编码器方向。左右轮编码器装反了,车会原地打转或者走反方向。调试时先单独给一个轮子正转指令,看编码器计数是增加还是减少,确认方向后再做闭环。
3.2 激光雷达:安装高度和倾角决定建图质量
激光雷达的安装位置直接影响建图效果。理想情况下,雷达应该安装在车体最高点附近,且扫描平面水平。如果雷达太低,会被地上的拖鞋、电线挡住;如果雷达倾斜,扫出来的墙面会变成斜线,建图直接废掉。
我见过有人把雷达装在车头最下方,结果建出来的地图全是桌腿和椅子腿的碎片,因为雷达只能扫到低处。正确的做法是让雷达扫描平面在离地20到30厘米左右,这个高度能扫到大部分家具的轮廓,又不会被地面杂物干扰。
另外,雷达的安装要尽量靠近车体旋转中心。如果雷达偏前或者偏后,车旋转时雷达数据会有额外的位移,定位算法需要额外补偿。虽然现代算法能处理,但会增加计算量和不稳定性。
3.3 下位机固件:用单片机把实时性做到极致
下位机我选的是常见的32位单片机,跑裸机或者轻量级实时操作系统。核心任务有三个:电机闭环、传感器采集、通信。
电机闭环用增量式PID,控制周期1毫秒。PID参数先调比例,再调积分,最后加微分。比例太大电机会啸叫,积分太大响应会滞后,微分太大对噪声敏感。我的经验是:先把积分和微分置零,慢慢加比例直到电机能快速响应但不振荡,然后加一点点积分消除稳态误差,微分一般给很小或者不给。
传感器采集包括编码器、碰撞开关、悬崖传感器。编码器用定时器的编码器模式读取,硬件自动计数,不占CPU。碰撞开关用外部中断,触发时立即停车。悬崖传感器用ADC读取红外测距模块的模拟量,判断是否悬空。
通信协议我用的是变长帧加校验和。帧头两个字节,长度一个字节,命令一个字节,数据若干字节,校验和两个字节。下位机收到完整帧后解析,校验失败直接丢弃。上位机同样处理。这样即使偶尔丢字节,也不会解析错乱。
3.4 上位机环境:机器人操作系统安装与配置
上位机我推荐用Ubuntu加机器人操作系统。安装方式有两种:二进制包和源码编译。新手直接用二进制包,一条命令搞定。但要注意版本匹配:操作系统版本和机器人操作系统版本必须对应,否则依赖会出问题。
安装完成后,先跑一个简单的例子验证环境。比如启动一个话题发布者和订阅者,看看能不能通信。然后安装建图和导航相关的功能包。这些包通常包含雷达驱动、建图算法、导航框架、可视化工具。
可视化工具很重要,它能把雷达数据、地图、路径、车的位置都画出来。调试时盯着可视化工具看,能快速定位问题。比如雷达数据不动,说明驱动没起来;地图不更新,说明建图节点没收到数据;路径画不出来,说明全局规划器失败。
4. 实操过程:从零到一让车自己跑起来
4.1 第一步:让电机转起来并读回编码器
先不要接雷达,不要接上位机,只写下位机固件,让电机能正反转,编码器能读数。
具体步骤:
- 配置定时器输出PWM,频率建议10kHz到20kHz,太高驱动板发热,太低电机会啸叫。
- 配置定时器编码器模式,读取左右轮编码器计数。
- 写一个简单的串口命令解析,收到指令后设置PWM占空比。
- 用串口助手发送指令,观察电机转向和编码器计数。
这一步的验收标准是:发送正转指令,两个轮子都向前转,编码器计数增加;发送反转指令,两个轮子都向后转,编码器计数减少。如果某个轮子方向反了,交换电机线或者修改固件里的方向标志。
注意:第一次测试时把车架空,不要让轮子着地,防止车突然冲出去。
4.2 第二步:闭环控制与里程计计算
电机开环能转之后,加上编码器反馈做闭环。同时在下位机计算里程计:根据左右轮编码器差值,算出车的前进距离和旋转角度。
里程计计算周期建议10毫秒到20毫秒,太快没必要,太慢会丢细节。计算出来的里程计通过串口发给上位机,格式包含时间戳、左右轮位置、前进距离、旋转角度。
这一步的验收标准是:用手挡住一个轮子,另一个轮子转,里程计应该显示车在旋转;两个轮子同速转,里程计应该显示车在直行。如果旋转方向反了,检查轮距符号或者编码器方向。
4.3 第三步:接入雷达并验证数据
雷达通常通过USB或者串口连接上位机。安装雷达驱动后,启动驱动节点,用可视化工具查看雷达数据。
验收标准:可视化工具里能看到一圈点云,转动雷达或者移动车,点云应该跟着变化。如果点云不动,检查雷达是否在转,驱动是否收到数据。如果点云形状奇怪,检查雷达安装是否水平。
我遇到过雷达数据里全是噪点,后来发现是雷达旁边有个强反光物体,导致激光回波异常。把雷达挪开一点就好了。所以雷达周围不要放镜面或者高反光的东西。
4.4 第四步:建图
建图节点订阅雷达数据和里程计,输出地图。启动建图后,用手推着车慢慢走一圈,或者用遥控器控制车走一圈。可视化工具里会逐渐显示出地图轮廓。
建图时的技巧:
- 走慢一点,让雷达有足够的数据。
- 不要原地快速旋转,旋转太快会导致雷达数据匹配失败。
- 走闭合回路,回到起点时地图应该闭合,如果明显错开,说明里程计或者建图参数有问题。
建图完成后保存地图,通常保存为图片加配置文件。图片是占据栅格地图,配置文件记录分辨率和原点。
4.5 第五步:定位与导航
定位节点加载保存的地图,结合雷达数据和里程计,输出车在地图中的位姿。导航节点接收目标点,规划路径并输出速度指令。
导航配置的关键参数:
- 全局规划器的膨胀半径:根据车体大小设置,太小会蹭墙,太大会卡住。
- 局部规划器的最大速度:根据电机能力设置,太快会撞,太慢效率低。
- 局部规划器的避障距离:根据雷达盲区和刹车距离设置。
验收标准:在可视化工具里点一个目标点,车应该能规划出路径并沿着路径走,遇到障碍物能绕开或者停下。
注意:第一次导航测试时,把最大速度设得很低,比如0.1米每秒,确认路径跟踪正常后再逐步提高。
5. 常见问题与排查技巧实录
5.1 雷达数据丢包或者延迟
现象:可视化工具里点云断断续续,或者车动的时候点云滞后。
排查思路:
- 检查雷达供电是否和电机共用。如果是,分开供电或者加滤波。
- 检查USB线是否松动或者太长。换一根短的、带屏蔽的线。
- 检查上位机CPU占用率。如果建图或者导航占满CPU,雷达驱动可能被饿死。
我的经验:雷达和电机共用电源是九成以上丢包问题的根源。加一个独立的降压模块,成本几块钱,能省几天调试时间。
5.2 建图飘移或者地图重影
现象:走一圈回来,地图上的墙变成两条,或者地图整体歪斜。
排查思路:
- 检查里程计标定。让车直线走3米,看里程计读数是否也是3米。
- 检查雷达安装是否水平。倾斜的雷达会导致扫描平面和地面不平行。
- 检查建图参数。有些建图算法对旋转的权重设置敏感,需要调整。
我的经验:先标定里程计,再调建图参数。里程计不准,建图算法再强也救不回来。
5.3 导航时车画龙或者撞墙
现象:车沿着路径走,但左右摇摆,或者贴着墙走然后撞上去。
排查思路:
- 检查局部规划器参数。最大角速度太大,车会画龙;膨胀半径太小,车会蹭墙。
- 检查定位是否跳变。如果定位偶尔跳一下,导航会突然转向。
- 检查雷达盲区。如果雷达扫不到正前方低矮障碍,车会撞上去。
我的经验:画龙通常是角速度控制太激进。把最大角速度降到一半,画龙明显改善。撞墙通常是膨胀半径不够,把膨胀半径加到车体半径加5厘米。
5.4 下位机通信断连
现象:上位机偶尔收不到下位机数据,或者下位机收不到指令。
排查思路:
- 检查串口线是否接触不良。
- 检查波特率是否匹配。
- 检查是否有电磁干扰。电机线远离信号线。
我的经验:串口线用带磁环的,能明显减少干扰。另外,通信协议加心跳包,上位机超过一定时间没收到心跳就停车,防止失控。
5.5 常见问题速查表
| 现象 | 可能原因 | 快速验证 | 解决方向 |
|---|---|---|---|
| 雷达丢包 | 电源干扰 | 单独给雷达供电 | 分离供电加滤波 |
| 建图重影 | 里程计不准 | 直线走3米对比 | 标定轮径轮距 |
| 导航画龙 | 角速度过大 | 降低最大角速度 | 调局部规划器参数 |
| 通信断连 | 串口干扰 | 换屏蔽线 | 加磁环加心跳 |
| 电机啸叫 | PWM频率低 | 提高PWM频率 | 改到15kHz以上 |
| 定位跳变 | 雷达数据差 | 看可视化点云 | 检查雷达安装 |
6. 后续扩展:从能跑到好用还差什么
车能自己跑起来之后,你会发现离“好用”还有距离。比如它不会自动回充,不会识别地毯,不会绕过电线,不会在卡住时自救。这些功能每一个都是一个小项目。
自动回充需要红外或者视觉引导,加上充电座通信。识别地毯需要额外的传感器或者电流检测。绕过电线需要视觉或者更精细的雷达。卡住自救需要电流检测加策略。
我的建议是:先把建图和导航跑稳,再一个一个加功能。每加一个功能,都要保证不影响已有的稳定性。我见过有人一口气加了回充、摄像头、机械臂,结果系统复杂度爆炸,最后连最基本的导航都跑不起来。
另外,仿真环境是个好东西。在仿真里调算法,比在真车上调快十倍。真车用来验证最终效果,仿真用来做参数搜索和回归测试。仿真里跑通了,再上真车,能省大量时间和零件损耗。
最后分享一个小技巧:给车加一个物理急停开关。软件急停可能因为程序卡死而失效,物理开关直接切断电机电源,是最可靠的保险。我每次调试新功能之前,都会确认急停开关在手边。这个习惯救过我好几次,尤其是调导航参数的时候,车突然加速冲向墙,一把拍下急停,避免了一次撞车。