
如果你是在做 ROS 小车自主导航仿真并且刚把 SLAM 建图和自主导航的流程图看明白那我要提醒你一句仿真跑得再顺回到实体车上第一个把你按在地上摩擦的几乎都是组装这一关。前面的文章里我们把激光雷达、IMU、电机驱动、底层运动控制板分别调通了。散在桌面上的时候每个模块都很乖数据该出的出PWM 该转的转。但一旦把这些零件装到同一台车体上就会开始出现各种玄学问题电机一转雷达点云就开始缺角轮子一加速IMU 数据就像喝了酒小车明明直行里程计却画弧线。这些事我见过太多次了而且九成以上的根因都埋在组装阶段。本文就是这套自主导航系列里的第 14 步专门讲组装。这里说的组装不只是拧螺丝和插线而是把机械结构、电源分配、信号走线、传感器朝向当作一个整体来设计。组装做得好不好直接决定后面建图、导航、避障环节的调试成本。下面这套流程用的是我实践下来最顺手的顺序你手上的硬件型号可能不同但检查思路和验收方法可以原样照搬。1. 作为系列第14步组装到底在解决什么问题1.1 当零件散在桌上时一切正常装上车后才问题爆发这是做机器人最容易产生挫败感的一段经历。单独测编码器的时候用电机驱动器把轮子转起来示波器或者串口监视器里的脉冲数整整齐齐单独接雷达的时候串口接收到的点云毫发无伤rviz 里一圈一圈扫得非常漂亮。于是你觉得万事俱备把板子、雷达、电机、电池全部往底盘上一塞接好线上电——乱套了。为什么会这样因为散在桌上时每个模块都有独立的电源、独立的地线、独立的空间。装上车之后大家开始共用一个电池、共享一块底盘、走同一个线束空间电磁干扰、地电位差、机械振动、传感器视场遮挡这些问题全部被同时激活。组装这步真正要解决的不是怎么把螺丝拧紧而是如何把多个独立系统集成成一个稳定系统。所以我会把这篇文章理解为一次物理层面的集成调试。所有系统联调的起点不在代码里而在车体的机械和电气布局里。凡是后面导航时出现的定位飘移、里程计失真、点云跳变、控制响应迟钝都要先回来检查组装阶段的决策。1.2 这步的验收标准不是装上能跑而是数据可信很多朋友组装完之后上车通个电看到轮子转了、雷达图标亮了就宣布组装成功。这个标准太浅了。真正合格的组装验收是在车完全静止的状态下检查每一个传感器数据是否干净可信。我给的验收标准是下面这几条建议你打印出来照着核对电机不转时IMU 静止输出的加速度模值应该在 9.8 m/s² 附近角速度零偏要小且稳定雷达开转之后rviz 里的点云要均匀连续不能出现固定的扇区缺失也不能出现一帧多一帧少的现象用手推车前进 1 米里程计读数也应该稳定地落在 1 米 ±2% 的范围内而且左右轮数据方向正确跑一下rqt_tf_tree从odom到base_link到各传感器坐标系的变换树要完整电机全速空转时IMU 和雷达数据不应该出现明显恶化。只要静态验收的结果不过关后面 SLAM 建图就是恶性循环地图歪了定位不准导航路径扭曲然后你还会以为是算法参数没调好。其实问题早在组装时就注定了。1.3 我沿用的那套入门级配置与整体布局为了避免全文空谈我这里明确一套常用的入门配置后续所有接线描述和验收命令都以它为例。你可以替换成同级别的其他产品但布局思路别动。底盘两轮差速结构两个主动轮在后前方一个万向从动轮电机带霍尔编码器的直流减速电机型号常写作 GB37-520 或类似规格电机驱动TB6612FNG双路驱动逻辑电压 3.3V底层运动控制板STM32F103 最小系统板负责采集编码器、输出 PWM、和主控通信主控树莓派 4B跑 ROS 框架后续如果要加视觉模型可以换成 Jetson Nano激光雷达RPLIDAR A1USB 接口IMUMPU6050I2C 接口电池3S 2200mAh 锂聚合物电池标称 11.1V峰值放电电流要超过电机总需求的两倍电源模块一路 DC-DC 降压到 5V/3A 给主控一路降压到 5V/1A 给雷达另外用 AMS1117-3.3 给 IMU。布局上电池放在底盘中央偏后的位置雷达支架安装在底盘正前方IMU 尽量靠近车体几何中心主控放在雷达后方。这个布局的核心原则是重心居中、传感器视场无遮挡、发热器件远离信号线。下面每个章节都会展开解释为什么这么排。2. 底盘与传感器安装把重心、水平、朝向三个硬指标一次做对2.1 底盘开孔和支撑先规划后动刀组装的第一步不是拿着螺丝刀直接干而是先在纸上把布局画出来。这一步虽然老套但真的是我踩过坑之后才悟出来的。早先我装配第一台车时拿着电钻在亚克力底盘上边想边钻孔结果雷达支架固定孔和电池绑带位置冲突只能把电池挪到一侧车体重心直接偏了直行时老往一边偏。正确的顺序是先确定传感器的安装位置再确定电池和主控的位置最后倒推开孔方案。具体来说底盘的每个开孔最好考虑三个功能固定作用、走线通道、散热空间。雷达要装在底盘前方雷达底座的三个安装孔必须放得下雷达本身IMU 的安装位置要注意周围不能有电机散热片或驱动板的大电感电池的固定位置要留出绑带或者魔术贴的区域不能只靠胶粘。还要注意底盘强度。很多亚克力底盘只有 3mm 厚安装柱和螺丝孔离边缘太近时稍微一拧紧就会裂。我的习惯是让孔中心与板材边缘保持至少 10mm 以上的距离关键的承重位置加尼龙柱和金属法兰加固。如果你用 3D 打印的底盘打印时要把填充率提高到 40% 以上不然主控安装柱很快会被震断。对于需要安装较高的雷达支架或摄像头支架还要检查底盘在行驶时的晃动。用手用力按压底盘四角看变形量是不是过大。如果按一下就明显下陷说明支撑强度不足行驶中的机械振动会让雷达点云变得模糊IMU 数据也会叠加振动噪声。这种问题不是靠算法滤波能完全消除的。2.2 电机与轮子对称性、轮径测量和轮距记录电机安装是整个底盘组装里最需要耐心的一步。直流减速电机通常用两块安装支架夹住再用螺丝锁到底盘上。这里最关键的是左右两个主动轮的轴线必须严格平行轮子安装好之后用手转动应该没有明显的周期性卡顿。如果左右轮轴线不平行直行时一边轮子在蠕行另一边轮子在硬推表现在里程计上就是直线走成弧线。轮子装好以后不要急着上车先测实际轮径。标称 80mm 的轮子装上轮胎、加上车重之后实际滚动半径会和空载状态差不少。最可靠的方式是把车放在地上在轮胎上做一个标记推动车走尽量长的距离比如 3 米数出轮子转了多少圈反推实际轮径。注意车轮花纹如果有方向性要按前进方向安装否则也会有微小但持续的打滑差异。同样重要的还有轮距也就是左右两轮中心线之间的距离。这个参数在差速模型里直接决定左右轮速度差换算成角速度的系数。用游标卡尺量的时候要以轮子的安装中心线为准不要量轮胎外侧。测量结果要立刻记到一张纸上后面写底层运动控制板固件和 ROS 参数时都要用到。组装阶段花五分钟记录这些参数能省掉后面两三个小时的调试时间。霍尔编码器的接线要特别小心。编码器通常有 5V 供电、GND、A 相、B 相四根线很多电机的编码器线是白色和黄色两根有些是绿色和蓝色颜色五花八门。接线之前一定要查对应电机的资料不要靠猜。接好之后用手慢慢转动轮子在串口监视器里看 A、B 相脉冲是否交替出现。如果 A、B 相同时为高或同时为低说明接线错误或者共地问题这时候不要在固件里偷偷交换 A/B 相那只能掩盖问题等电机正反转切换时又会暴露。2.3 激光雷达和IMU扫描平面、减震与安装方向激光雷达是自主导航车的眼睛安装位置直接决定建图质量。雷达的扫描平面必须水平。严格的做法是在雷达安装面上放一个小型水平尺检查前后左右四个方向。雷达扫描平面一旦倾斜近距离物体的点云会被压扁或者拉高SLAM 建图时房间的墙会变成斜的。雷达的安装高度也要想好。RPLIDAR A1 这类雷达的扫描光束会形成一个平面如果底盘上堆了线束、驱动板、主控板这些东西在这个平面高度以内的话就会被雷达当成障碍物地图里会一直出现一圈高墙。所以安装高度要超过底盘上所有器件的最高点。但也不能一味装高雷达支架升高后车体重心跟着上移转弯时容易侧倾。我的经验是入门小车雷达底部离地 15cm 到 20cm 足够下面只放低矮的电池和驱动板雷达后面原则上不放东西。IMU 的安装要求更精细。MPU6050 模块尽量用螺丝加橡胶垫圈固定在底盘上不要用双面胶。双面胶在温度变化或者受到横向冲击后会发生微小的形变让 IMU 基准方向慢慢改变这是陀螺仪零漂之外的一个隐性误差源。安装位置优先选择车体几何中心附近这个位置承受的旋转线加速度最小后期做运动学标定时也更容易建立坐标系。IMU 的朝向也很容易被忽略。绝大多数 MPU6050 模块的 PCB 上都会印 X、Y、Z 轴的方向箭头你要让 X 轴指向车头前进方向Z 轴垂直向上Y 轴自然指向左侧。如果实在因为结构限制装成了别的位置一定要在驱动代码里做坐标变换把原始数据变换到base_link坐标系不能将错就错。装完之后在模块上贴一个朝向箭头标签防止以后拆装后搞混。3. 电气接线动力、控制、传感三套系统分开走3.1 电源树怎么搭才不至于电机一转主控就重启电源系统是整个小车的心血管布局不到位的话后面所有问题都会在电机动作时集中爆发。先把概念理清楚电机是感性大功率负载启动瞬间电流可能是额定电流的好几倍而树莓派、雷达这些数字设备对电压跌落非常敏感只要电压跌到 4.8V 以下随时可能重启或者丢 USB 设备。所以绝对不能让 11.1V 电池直接给所有模块供电也不能让电机驱动板拿来给主控供 5V。正确的做法是搭一个电源树。电池正极出来先经过一个自恢复保险丝再接到总开关然后分两路。第一路直接进电机驱动板的 VM 或 VMOT 端子专门给电机供电第二路进 DC-DC 降压模块降压到稳定 5V给树莓派和雷达。IMU 如果要求 3.3V可以从树莓派或者单独的 3.3V LDO 模块取不要在 STM32 上顺便拉一根 3.3V 过去因为多个模块共用一个 LDO 时电流变化会互相干扰。共地是一个特别容易被新手忽略的问题。树莓派的 GND、STM32 的 GND、电机驱动板的 GND、降压模块的 GND、雷达的 GND 最终都要连到一起否则信号线没有统一参考点轻则读数异常重则烧接口。但共地也要讲究方式最好是树状共地每个子系统的地线独立地回到电池负极或者一个共地点不要在模块之间串成一条手拉手的地线链。我这里给一个参考的电源接线表你可以直接照着做模块供电输入电压要求地线去向电机驱动板 VM电池正极保险丝后6-12V回电池负极STM32 运动控制板DC-DC 5V5V回 DC-DC 地再汇总到电池负树莓派 4BDC-DC 5V5V/3A回 DC-DC 地RPLIDAR A1雷达接口供电5V/1A回 DC-DC 地MPU6050树莓派 3.3V 或独立 LDO3.3V回汇共地点接线时建议用不同颜色的线来区分红色正极、黑色负极、黄色信号线、蓝绿编码器。整台车的线色规则要统一以后排查故障能省一半时间。3.2 主控、运动控制板、电机驱动之间的信号接线如果你和我一样采用 STM32 做底层运动控制、树莓派做上层主控那信号接线就要分成两段看一段是 STM32 和 TB6612 之间的 PWM 控制信号另一段是树莓派和 STM32 之间的串口通信。TB6612FNG 的接口一般有 VM、VCC、GND、PWMA、AIN1、AIN2、PWMB、BIN1、BIN2、STBY 这几个引脚。STBY 是总使能脚很多朋友忘了接结果 STM32 输出的 PWM 驱动波形再正也没用电机纹丝不动。STBY 一定要接高电平或者接到 STM32 的一个 GPIO 上由程序控制。AIN1、AIN2 决定电机 A 的旋转方向PWMA 接 STM32 的定时器 PWM 输出通道注意选择 STM32 上支持 PWM 的引脚不是任意 GPIO 都能输出硬件 PWM。STM32 和树莓派的串口连接核心是交叉接线树莓派的 TX 接 STM32 的 RX树莓派的 RX 接 STM32 的 TXGND 接 GND。还有一个容易遗漏的点是接线顺序。组装阶段先不要接串口先把电机驱动和电机的供电调通确认电机能转再接串口通信最后再接雷达和 IMU。一步一测出了问题好定位。如果你不用 STM32而是直接用树莓派的 GPIO 控制电机驱动板同样要注意 PWM 引脚要选硬件 PWM 通道软件模拟 PWM 在 Linux 下时序不稳定会直接影响电机速度调节。编码器接入树莓派 GPIO 时还要注意电压匹配绝大部分编码器是 5V 输出树莓派 GPIO 是 3.3V 逻辑上拉和分压电路要做好直接接非常容易出隐患。3.3 雷达与IMU的连接以及串口设备名的固定RPLIDAR A1 默认是 USB 接口插到树莓派上会枚举成一个串口设备。组装阶段要专门处理一个问题USB 口的枚举顺序不可靠。树莓派重启后雷达可能从/dev/ttyUSB0变成了/dev/ttyUSB1如果雷达驱动里写死了设备名就会启动失败。解决办法是写 udev 规则根据 USB 设备的序列号或者厂商 ID 绑定一个固定的设备别名比如/dev/rplidar。这样系统重启后不管 USB 枚举顺序怎么变雷达始终指向同一个设备节点。我在组装阶段就顺手把它配置好后面 ROS launch 文件里直接填/dev/rplidar省了很多随机故障。MPU6050 用 I2C 接口连接树莓派时一般接四个脚VCC、GND、SDA、SCL。如果模块的 SDA 和 SCL 没有自带上拉电阻需要在 I2C 线上外接 4.7k 欧姆的上拉电阻到 3.3V。很多便宜的模块默认不带不接的话 I2C 扫描时有时能发现设备有时发现不了非常折磨。上电后用i2cdetect -y 1检查一下设备地址是否稳定出现出现0x68或者0x68附近就说明通信正常。串口设备连接上之后建议用dmesg | grep tty检查内核识别信息确认是不是 USB 转串口芯片被识别成了正确接口。如果你用的是 CH340 模块系统可能没有自带驱动需要先装上这个在组装环节就要确认好而不是等到跑 SLAM 时才临时装。4. 走线与抗干扰导航疑难杂症的七八成源头在这4.1 电机一启动IMU就飘先别怀疑算法我在调试过程中最常遇到的一个现象是电机不转时IMU 数据非常漂亮电机一启动加速度计数据就开始剧烈跳动陀螺仪零偏也变大。遇到这种情况多数人第一反应是算法滤波不够强于是把低通滤波的截止频率调低结果动态响应变差车一转弯 IMU 数据又严重滞后。其实根因往往是电机产生的电磁干扰串进了 IMU 的 I2C 线路。直流电机转动时电刷和换向器会不断通断产生的火花会在空间里辐射宽频噪声也会通过电源线和地线传导到其他模块。这个干扰非常顽固软件滤波只是掩盖症状。组装阶段要做的是把干扰源和敏感电路之间的耦合路径切断。最基础的手段就是走线分离电机电源线单独走一边IMU 和编码器信号线走另一边两者尽量远离如果不能远离就垂直交叉不要平行走长距离。电机驱动板到电机的两根线也尽量用双绞线让两根线上的差模噪声相互抵消。电机两端并联一个 104 陶瓷电容加一个大容量电解电容靠近电机引脚处焊接可以有效吸收换向火花产生的高频噪声。很多成品电机出厂时并不带这个电容需要自己加上。这个动作成本很低但效果非常明显。TB6612 驱动板的逻辑地、VM 电源地如果内部已经连通那么在布局时就要特别注意电源地回流路径。电机大电流会通过地线回流如果 IMU 的地线恰好走在电机大电流回流路径上地电位就会被抬高I2C 通信距离稍远就出错。我的处理方式是把 IMU 的地线单独引回共地点不要搭在电机驱动的接线端子上。4.2 编码器线、I2C线的处理方式编码器线属于低频脉冲信号但它在电机旁边走线时很容易受到电机线的干扰。霍尔编码器输出的脉冲幅度通常比较小干扰叠加上去后上升沿会出现抖动导致计数多跳或者少跳里程计就会慢慢积累误差。处理办法是多管齐下编码器线尽量使用屏蔽线屏蔽层单端接地如果手头没有屏蔽线就把编码器线的两根信号线绞合在一起信号线远离电机电源线至少 3cm。I2C 总线的处理更考验细节。MPU6050 的通信速率一般是标准模式 100kHz 或快速模式 400kHzI2C 这种开漏结构在长线传输时容易受到干扰。组装时 I2C 连线尽量短不要超过 20cm而且 SDA 和 SCL 从 IMU 模块出来之后就保持绞合减少回路面积。如果因为结构限制 I2C 线必须和电机线交叉尽量让它们成 90 度角把耦合面积压到最小。还有一个小坑是杜邦线。很多朋友的车上全是公对母杜邦线杜邦线插在端子上的接触面积本来就小车辆行驶震动后容易产生瞬断。编码器线和 I2C 这类对连续性要求高的信号最好用 XH2.54 端子或者直接焊接不要用杜邦线长距离跳接。如果你实在要用杜邦线也要用扎带把插头部位固定住防止震动松动。4.3 固定、标记与可维护性走线整理的意义不仅是为了好看更直接影响故障排查效率。我在第一版车上吃过亏线束全部用黑色扎带绑成一捆结果雷达不转时我为了排查只能一根根剪开扎带拆完再装花了一个下午。正确的做法是分束布线把电机动力线束、编码器线束、I2C 线束、串口线束分开走每束线外面套上蛇皮网或者尼龙编织网束与束之间用扎带固定在底盘边缘或筋板上。每个线束的两端贴标签比如左电机动力、左编码器、IMU-I2C、STM32-TX。标签可以用小标签机打印也可以用记号笔写在热缩管上但千万不要只靠线颜色记。还应该给每根线留出约 10% 的余量。底盘上一些活动部位比如雷达转盘、轮子附近线缆在车体运动时会有微小位移如果没有余量长期拉扯容易在焊点附近断线。余量留好之后再用扎带把线的固定点做死让线缆在插头端是固定的在活动端是松弛的这样即使车体晃动应力也会被扎带吸收而不是作用在端子上。线缆的固定件要选能够重复拆卸的。市面上那种一次性的尼龙扎带虽然便宜但每次拆装线束都要剪断维护成本高。更推荐用带卡扣的螺旋管和可重复开合的理线器。巡检时轻轻一拨就能翻开线束看到下面的板子排查效率高很多。5. 上电验收用静止数据给组装过程打分5.1 上电前的检查清单组装完之后千万不要急着把总开关推上去。先用万用表做一轮静态检查这轮检查能拦住大部分损坏硬件的低级错误。第一步断开电池用万用表电阻档量电池接口正负极之间的阻值如果阻值小于几个欧姆甚至接近 0说明电源网络里有短路绝对不能上电。第二步检查所有电容极性是否接反铝电解电容接反后会爆浆这是新手容易犯的低级错误。第三步检查电机驱动板的 VM 和 GND 之间、5V 降压模块输入输出端是否都正常最好在没接通负载时先测量空载输出电压确认在允许范围内。第四步检查每个信号线的插头有没有插反重点看 STBY 使能脚有没有接到高电平。这些检查完成后不要直接接树莓派和雷达只接电机驱动板和电机上电确认电机没有异常抖动、电流尖峰和异味再用遥控器或者串口命令让电机慢慢转起来。确认电机工作正常后再断电接上主控和传感器重新上电。这种分层上电的顺序能保证问题出现时影响范围最小排查时间最短。5.2 雷达、IMU、里程计和TF的静态验收全部上电后进入静态验收环节。这一步用 ROS 自带的工具就能完成不需要额外写代码。先启动雷达驱动节点roslaunch rplidar_ros rplidar.launch然后用rostopic echo /scan或者直接在 rviz 里查看点云。验收要点是小车静止不动时点云不能有明显的固定空洞如果是室内房间周围的墙和物体边界应该清晰半米外的墙面点应该密集均匀。如果有连续一段角度始终没有点出现大概率是雷达扫描平面上有物体遮挡优先检查雷达周围和下方有没有露出头的线束。IMU 验收用这个命令rostopic echo /imu/data注意看三轴加速度输出的模值是否接近 9.8角速度输出在静止时是否都在零附近小幅波动。如果加速度模值明显偏大或偏小可能是 IMU 坐标系方向不对也可能是机械安装面倾斜了。用手轻轻转动小车模拟偏航观察imu/data里 z 轴角速度是否对应变化验证安装方向是否与 ROS 坐标系一致。里程计和编码器验收用手推的方式。在启动底盘运动节点后用手将小车向前推动大约 1 米观察/odom话题里pose.position.x是否大约增加 1 米。再把小车原地左转 90 度看orientation.z的变化方向是否与预期一致。这个测试同时验证了电机方向、编码器相序和轮距参数。最后跑一下 TF 树rosrun tf view_frames生成的 frames 文件会展示从odom、base_link到laser、imu_link的完整变换链。如果有缺失的坐标变换说明对应的静态发布节点没有启动或者坐标系名字不匹配。这是组装阶段最容易忽略的问题但检查起来也最简单。5.3 常见组装问题速查我把自己和身边朋友在组装阶段高频遇到的问题整理成了下面的表格方便你对照处理现象可能原因检查建议电机完全不转STBY 未拉高PWM 引脚无输出共地缺失先量芯片使能脚电压再查驱动逻辑电平电机一启动主控就重启电池电压跌落严重动力电和逻辑电未分离检查电池健康度给主控单独加稳压模块雷达点云固定扇区缺失雷达扫描平面内有遮挡检查雷达下方和固定支架附近的线束雷达偶发断连USB 线质量差USB 口供电不足设备名漂移换短线用线径更粗的 5V 供电配置 udev 固定设备名IMU 数据电机启动后剧烈跳动电机电磁干扰耦合进 I2C 或电源检查电机两端滤波电容分离动力线和信号线直行时里程计走弧线左右轮轴线不平行实际轮径不同轮距参数错误重新调校轮轴平行度实测轮径并写入参数推车时里程计正负方向反了编码器 A/B 相接反或电机方向反了检查编码器接线确认 A/B 相顺序编码器数值跳变但不连续接线端子接触不良信号线受到干扰换成 XH2.54 端子信号线双绞检查插头松动TF 树缺少 laser 变换静态变换发布节点未启动检查 launch 文件里robot_state_publisher和静态坐标变换配置验收全部通过之后你的自主导航小车才算真正组装完成。这时候再回看热搜词里那些 ROS 小车自主导航仿真、SLAM 建图和自主导航的视频教程你会发现很多人栽过的坑其实都能在组装环节找到答案。我个人的体会是组装虽然没有算法那么高级但它决定了一台车的下限算法再强也得有一台数据可信的车体来做支撑。希望这份组装流程能帮你少走点弯路把更多时间留给后面真正有趣的建图和导航调试。