1. 从一堆散件到能跑的车自主导航小车组装阶段到底在装什么很多人做自主导航小车第一反应是先把代码写好、算法调通再考虑硬件。我一开始也是这个思路结果吃了大亏。实际做下来你会发现组装阶段决定了后面80%的调试难度——线束走得好不好、传感器装得正不正、供电稳不稳这些东西在代码层面是补不回来的。你算法再牛GPS天线被电机干扰了激光测距模块被阳光直射了照样歇菜。这一篇讲的是自主导航项目里第14个环节——组装。前面你可能已经搞定了STM32F103最小系统板的底层驱动、FreeRTOS的任务划分、RK3588上的视觉推理部署甚至GPS模块和激光测距的单独测试都跑通了。但把这些东西拼到一台车上让它们同时工作、互不干扰完全是另一回事。组装阶段的核心目标很明确把主控、传感器、执行器、供电系统整合到一个物理平台上保证机械结构稳固、电气连接可靠、信号完整、散热合理。听起来像废话但每一步都有坑。比如STM32F103的串口中断接收在电机启动后开始掉数据包比如RK3588的NPU跑YOLOv8时功耗飙升导致电压跌落比如GPS模块的陶瓷天线离电机驱动太近导致定位漂移。这些问题不会在单独测试时暴露只有装到一起才会出现。这篇文章适合谁看如果你正在做基于STM32F103和RK3588的自主导航小车已经完成了各模块的独立调试现在要把它们装到车上那这篇就是写给你的。我会按实际组装顺序从底盘布局、供电架构、主控与传感器接线、通信链路搭建、到首次上电检查把每个环节的决策逻辑和踩坑经验都摊开讲。2. 底盘布局与机械安装先定重心再谈走线2.1 为什么传感器位置比你想的更重要组装第一步不是拧螺丝是画布局图。我见过太多人把GPS模块随手粘在车顶激光测距装在前端RK3588板子塞在中间电池随便找个空位一放结果车跑起来要么转向迟钝要么GPS漂移要么激光测距数据跳变。布局的核心原则只有一条重心尽量低且靠近几何中心传感器远离干扰源。具体来说电池是最重的部件应该放在底盘最低处、靠近中心的位置。RK3588开发板和STM32F103最小系统板可以叠放在电池上方但要注意RK3588的散热别把发热大户闷在密闭空间里。GPS模块必须放在车顶最高处且远离电机、电调和任何高频开关电路因为GPS信号强度在室内环境下大约在-130dBm到-160dBm之间电机PWM噪声很容易把它淹没。激光测距模块装在前端注意避开阳光直射TOF传感器在强环境光下信噪比会急剧下降。我实际用的布局是这样的底盘是四轮差速结构电池用魔术贴固定在底板中央偏后位置RK3588用铜柱架在电池上方约2cm处STM32F103最小系统板用尼龙柱固定在RK3588旁边GPS模块用3D打印支架架在车顶最高点激光测距模块装在前保险杠位置。电机驱动板贴在底盘底部两侧尽量靠近电机以减少大电流走线长度。2.2 电机与轮系的安装细节电机安装看起来简单但有几个细节直接影响后面导航精度。首先是电机轴与轮子的同轴度如果轮子装歪了车走直线会跑偏你后面调PID会调到怀疑人生。我的做法是先把电机固定在支架上不拧紧螺丝把轮子套上后放在平整桌面上让轮子自然接触桌面再逐个拧紧螺丝。这样能保证四个轮子共面。其次是编码器的安装。如果你用的是带霍尔编码器的直流减速电机编码器码盘和传感器的间隙很关键一般0.5mm到1mm比较合适太近会摩擦太远信号弱。我用的电机编码器线是6根电机两根、编码器电源两根、AB相两根。这些线要单独走不要和电机动力线捆在一起否则编码器脉冲会被电机换向噪声干扰表现为速度反馈跳变。注意电机动力线建议用双绞线或者屏蔽线并且尽量短。如果电机线超过30cm建议在电机端子处焊接一个0.1uF的陶瓷电容到电机外壳能明显减少传导干扰。2.3 线束规划与固定线束是组装阶段最容易被忽视的部分。我第一版车装完后线束像蜘蛛网一样跑起来后线会晃动导致接触不良。后来我重新规划了线束按信号类型分了三类电源线粗、红黑、电机驱动线中等、成对、信号线细、按功能分色。走线原则是强电和弱电分开走模拟和数字分开走高频和低频分开走。具体到这台车电机驱动线沿着底盘边缘走信号线沿着车体中央走两者之间至少保持2cm间距。所有线束用扎带固定每隔5cm一个固定点接头处用热缩管保护。GPS天线馈线要远离电机线和RK3588的WiFi天线如果实在避不开交叉时尽量垂直交叉而不是平行走线。3. 供电架构设计别让RK3588和电机抢饭吃3.1 电压域划分与电流预算这台车上有三类用电设备电机大电流、高噪声、RK3588高功耗、对电压敏感、STM32F103和传感器低功耗、对噪声敏感。如果全部从一个电池直接供电电机会把电压拉低RK3588可能直接重启STM32F103的ADC参考电压也会波动。我的方案是两级供电第一级是3S锂电池11.1V标称满电12.6V直接给电机驱动板供电第二级是用两路独立的DC-DC降压模块一路降到5V给RK3588和激光测距模块另一路降到3.3V给STM32F103和GPS模块。两路降压模块的输入都从电池取电但输出完全隔离。电流预算方面我实测的数据是四个直流减速电机堵转电流合计约4A正常行驶约1.5ARK3588跑YOLOv8推理时功耗约8W到12W5V下电流约2A到2.4ASTM32F103加GPS加激光测距合计约200mA。所以5V那路DC-DC至少选3A输出能力的3.3V那路选1A就够了。电池选3S 5000mAh锂电正常跑40分钟没问题。3.2 DC-DC选型与滤波DC-DC模块我试过好几种最后用的是基于MP1584的降压模块输入4.5V到28V输出可调最大3A。这个模块便宜、体积小但有个问题开关频率约1.5MHz输出纹波在满载时约50mV。对于RK3588来说50mV纹波在允许范围内但如果你同时给GPS模块供电纹波会影响GPS接收灵敏度。我的做法是在每路DC-DC输出后面加一级LC滤波一个10uH电感串联后面跟一个470uF电解电容并联一个0.1uF陶瓷电容。这样能把纹波压到10mV以内。GPS模块的供电再单独加一个低压差线性稳压器比如AMS1117-3.3虽然效率低一点但输出干净。提示DC-DC模块的接地很重要。输入地和输出地要在模块端子处单点连接不要形成地环路。我第一版就是输入输出地随便接结果RK3588的USB摄像头画面有横纹干扰。3.3 电池管理与低压保护3S锂电池过放会永久损坏所以必须加低压保护。我用的方案是在电池输出端接一个电压检测模块设定截止电压为9.9V每节3.3V低于这个值就切断电机驱动供电但保留RK3588和STM32F103的供电让系统能优雅关机。这个逻辑可以用STM32F103的ADC检测电池电压通过一个分压电阻网络实现分压比选1:11这样12.6V对应ADC输入约1.15V在STM32F103的3.3V量程内。分压电阻选100k和10k精度1%。ADC采样时要注意STM32F103的ADC输入阻抗要求如果分压电阻太大采样保持电容充电不够读数会偏低。我实测100k10k的组合在采样时间设为239.5周期时读数稳定误差在±0.05V以内。4. 主控与传感器接线STM32F103和RK3588各管什么4.1 任务划分与通信接口选择这台车有两个大脑STM32F103负责实时控制——电机PID、编码器读取、激光测距数据采集、GPS数据解析RK3588负责高算力任务——YOLOv8目标检测、路径规划、人机交互。两者之间需要通信我选的是串口波特率921600用STM32F103的USART1接RK3588的UART。为什么不用USB或者SPIUSB虚拟串口在STM32F103上需要额外的USB库而且FreeRTOS下USB中断优先级和任务调度容易冲突。SPI虽然快但RK3588的SPI接口数量有限而且SPI是主从模式STM32F103作为从机时时序要求严格。串口最简单STM32F103标准库的UART DMA中断接收发送很成熟921600波特率下每字节约10.8us对于传输传感器数据包每包约50字节来说5.4ms一包完全够用。4.2 STM32F103的引脚分配与FreeRTOS任务映射STM32F103最小系统板引出所有GPIO但要注意有些引脚有特殊功能。我的分配是这样的PA9/PA10USART1接RK3588PA2/PA3USART2接GPS模块NEO-M8NPB6/PB7I2C1接MLX90614红外温度传感器用于电机温度监控PA0-PA3TIM2的四个通道接电机编码器AB相两个电机用TIM2两个用TIM3PB0/PB1TIM3通道接另外两个编码器PA8-PA11TIM1的四个通道输出PWM给电机驱动PC0-PC3ADC1的四个通道接电池电压检测和三个激光测距模块的模拟输出如果激光模块是模拟输出的话PB10/PB11I2C2接OLED显示屏调试用FreeRTOS任务划分电机控制任务优先级最高1kHz周期、传感器采集任务100Hz、GPS解析任务10Hz、通信任务50Hz、状态监控任务1Hz。注意FreeRTOS的任务优先级和中断优先级的区别中断优先级是硬件层面的任务优先级是软件调度层面的。STM32F103的NVIC中断优先级分组要设为4位抢占优先级FreeRTOS的configMAX_SYSCALL_INTERRUPT_PRIORITY要设为5这样高于5的中断不受FreeRTOS管理低于等于5的中断可以调用FreeRTOS的API。4.3 GPS模块接线与天线注意事项NEO-M8N模块接线很简单VCC接3.3VGND接地TX接STM32F103的RXPA3RX接STM32F103的TXPA2。但天线部分有讲究。NEO-M8N通常配陶瓷有源天线天线馈线要走50欧姆阻抗匹配。如果你自己焊接天线馈线长度要尽量短超过10cm就要考虑用同轴线。天线放置位置要远离RK3588的WiFi天线和电机。我实测GPS天线离电机驱动板10cm时定位精度从2.5m降到8m。另外GPS模块的接地要干净最好单独走一根地线到电池负极不要和电机共地。注意GPS冷启动时间约26秒热启动约1秒。如果你在室内测试GPS可能永远定不了位这是正常的。建议在室外空旷处测试或者用GPS信号转发器如果有的话。4.4 激光测距模块的接口与安装角度我用的是VL53L0X激光测距模块I2C接口量程2m精度±3%。接线是VCC 3.3V、GND、SCL、SDA。多个VL53L0X可以共用I2C总线但需要改地址每个模块的地址通过XSHUT引脚控制。我的做法是用STM32F103的四个GPIO分别控制四个模块的XSHUT上电后逐个拉高并改地址。安装角度方面激光测距模块的发射和接收窗口要平行于地面倾斜会导致测距值偏大。我用的3D打印支架有2度的俯角实际测下来对2m内的测距影响不大但如果你要测更远最好保持水平。另外VL53L0X的视场角是25度如果前方有多个障碍物它会返回最近的那个距离这个特性在避障时要注意。5. RK3588的部署与散热算力上去了散热别掉链子5.1 系统烧写与基础环境RK3588上我跑的是Ubuntu 20.04烧写到eMMC。烧写工具用瑞芯微官方的RKDevTool固件可以从讯为或者其他RK3588平台的资料里找。烧写时注意选对固件类型如果你是做视觉推理建议选带NPU驱动的固件否则后面部署YOLOv8时还要自己编译RKNN。烧写完成后第一件事是更新系统并安装基础依赖sudo apt update sudo apt upgrade然后装Python3、pip、opencv-python、numpy这些。RK3588的NPU推理需要RKNN-Toolkit2这个在PC上装用来把YOLOv8的onnx模型转成rknn格式。转换时要注意量化方式我用的int8量化精度损失约2%但推理速度从CPU的5fps提升到NPU的30fps。5.2 YOLOv8部署与NPU加速YOLOv8在RK3588上部署的流程是PC上训练或下载预训练模型导出onnx用RKNN-Toolkit2转rknn推到板子上用RKNN Runtime推理。转换时的关键参数是mean_values和std_values要和训练时一致。我用的YOLOv8n模型输入640x640转换后rknn模型约6MBNPU推理耗时约33ms加上前后处理总共约50ms20fps。部署时要注意RK3588的NPU驱动版本和RKNN-Toolkit2版本匹配。我一开始用RKNN-Toolkit2 1.4.0转的模型板子上驱动是1.3.0加载模型时报错。后来统一到1.5.0就好了。另外NPU推理时CPU占用率很低但内存带宽占用高如果同时跑其他大内存任务推理速度会下降。5.3 散热方案与功耗管理RK3588满载功耗约12W不加散热片的话芯片温度能到90度以上然后降频。我用的散热方案是一个40x40x10mm的铝散热片加一个5V 40mm风扇风扇从RK3588的5V引脚取电。实测满载时芯片温度稳定在55度左右。功耗管理方面如果小车不需要一直跑视觉推理可以用条件触发STM32F103检测到前方障碍物时通过串口通知RK3588启动推理否则RK3588进入低功耗模式。不过Ubuntu下低功耗模式配置比较麻烦我实际没做就是让RK3588一直跑电池续航少一点但省事。6. 首次上电与分阶段调试别一次全开6.1 上电前的静态检查所有线接完后不要直接上电。先用万用表测各路电源的对地电阻确认没有短路。特别是3.3V和5V轨对地电阻应该在几百欧姆以上。然后测电池电压3S锂电满电12.6V如果低于11V先充电。静态检查还包括确认所有接插件插紧确认电机线没有接反接反了电机会反转但不会烧只是方向不对确认GPS天线和WiFi天线没有短路。6.2 分阶段上电顺序我的上电顺序是先只接电池和DC-DC模块测各路输出电压正常然后接STM32F103看是否能正常下载程序、串口是否有输出接着接GPS和激光测距看I2C和UART是否能读到数据再接RK3588看系统是否能启动、NPU是否能加载模型最后接电机驱动但先不装轮子用调试模式让电机低速转一下确认方向正确。这个顺序的好处是如果某一步出问题你可以快速定位是哪部分引起的。我第一版就是全部接好一次上电结果RK3588不断重启查了半天才发现是电机驱动的地线干扰了DC-DC的反馈引脚。6.3 常见问题与排查问题一STM32F103串口中断接收掉数据包。这个我在FreeRTOS下遇到过原因是串口中断优先级低于FreeRTOS的configMAX_SYSCALL_INTERRUPT_PRIORITY导致中断被屏蔽。解决方法是把串口中断优先级设为5或更高数值越小优先级越高并且用DMA接收中断里只处理IDLE标志。问题二GPS定位漂移。除了天线位置还要检查GPS模块的接地。我后来在GPS模块的GND和电池负极之间加了一根粗线漂移从8m降到3m。另外GPS数据里的HDOP值可以判断定位质量HDOP小于2时定位较准。问题三RK3588的USB摄像头画面卡顿。这个通常是USB带宽不够或者CPU占用太高。我换成MIPI摄像头后就好了MIPI直接接RK3588的MIPI CSI接口不占USB带宽。问题四电机启动时STM32F103复位。这是电源跌落导致的。我在STM32F103的3.3V输入端加了一个1000uF电解电容并且把电机驱动的地线和STM32F103的地线在电池端子处单点连接问题解决。7. 组装完成后的验证与标定7.1 传感器标定组装完成后传感器需要标定。激光测距模块用已知距离的挡板标定比如放在50cm处读数值应该在50cm±1.5cm内。GPS模块在室外开阔处静置5分钟看定位漂移范围如果超过5m检查天线和接地。编码器标定让车走1米看编码器计数计算每米脉冲数用于后面的里程计。7.2 通信链路压力测试STM32F103和RK3588之间的串口通信要做压力测试。我写了一个测试程序STM32F103每10ms发一包50字节的数据连续发1小时看RK3588端是否有丢包。实测921600波特率下1小时丢包率小于0.01%。如果丢包率高检查串口线是否太长、是否有干扰源。7.3 整车联调最后是整车联调STM32F103跑电机控制和传感器采集RK3588跑视觉推理和路径规划两者通过串口交换数据。我实际跑下来从摄像头看到障碍物到电机停止延迟约120ms其中视觉推理50ms、串口传输5ms、STM32F103处理10ms、电机响应55ms。这个延迟对于低速小车0.5m/s来说够用高速的话需要优化。提示整车联调时建议先用遥控器手动控制确认底盘运动学模型正确再切换到自主导航模式。我第一版直接跑自主导航结果因为电机方向搞反了车直接冲出去撞墙。8. 个人经验组装阶段最值得花时间的三件事第一件是线束。我第一版车装完花了2小时后来重新做线束花了4小时但后面调试节省的时间至少20小时。线束做得好接触不良、信号干扰这些问题基本不会出现。第二件是供电。DC-DC模块别贪便宜选带反馈和保护的。我烧过两个RK3588的USB口就是因为DC-DC输出过冲。后来换了带软启动的模块再没出过问题。第三件是散热。RK3588的散热不是可选项是必选项。我见过有人不加散热片跑YOLOv8结果推理速度从30fps降到5fps就是因为芯片降频了。一个20块钱的散热片加风扇能让你省下几百块的调试时间。组装这件事看起来是体力活实际上是整个项目里最考验系统思维的部分。你需要在动手之前就想清楚电从哪来、信号怎么走、热往哪散。这些想明白了后面写代码调算法就是水到渠成的事。