
做RM那几年我调过最多的东西就是麦轮底盘。从第一台跑不直线的步兵到后期能稳定完成侧冲、小陀螺这类战术动作的底盘这中间踩过的坑比后来写的代码行数还多。麦轮底盘作为步兵、英雄这类地面单位的常见移动方案工程链路横跨机械装配、嵌入式开发和闭环控制对新手来说最难的不是某一环而是不知道整条线怎么串起来。这篇文章我就把自己从选轮子到PID调参的完整过程整理出来。内容包括麦克纳姆轮的运动学原理、四轮排布规范、STM32端CAN总线通信配置以及底盘速度环和位置环的串级PID调参步骤。通俗点说就是照着它你能把一台麦轮底盘从零件堆里组装出来并且调到一个能上场比赛的手感。适合准备校赛的新队员也适合被底盘“推偏”问题折磨的实验室老人。1. 内容整体设计与思路拆解1.1 RM机器人麦轮底盘到底在解决什么问题打个比方普通差速底盘像一辆超市购物车轮子只能前滚后滚想换方向必须拐弯。麦轮底盘则像一把可全向移动的“办公椅”前后左右、原地旋转可以独立控制车头朝向和移动方向完全解耦。这在RoboMaster赛场上是核心优势。步兵机器人在对抗中需要“侧身射击”车身横向移动的同时云台锁定对方或者“小陀螺”底盘高速旋转而云台反向补偿始终保持枪口朝向敌人。没有全向底盘这两种战术动作实现起来会非常别扭。麦轮底盘通过四个麦克纳姆轮的不同转速组合实现全向移动。麦克纳姆轮的外圈斜向排布着一圈辊子辊子轴线与轮子主轴呈45度角。轮子转动时地面的摩擦力会沿辊子方向产生一个分力四个轮子的分力叠加后就能合成出任意方向的驱动力。接下来要解决的事情就很清晰了先把四个轮子正确装到车身上再让主控芯片听懂遥控器的指令把“我要向右平移”翻译成四个轮子各自该转多快最后通过PID算法让轮子真的转到这个速度。三条线缺一不可。1.2 从零搭建的完整链路与能力要求底盘搭建可以拆成机械、电控、调试三个大阶段。机械阶段负责选轮、设计底盘结构件、装配和调整悬挂。看起来像是力气活但排布和重心一旦做错后面电控怎么调都救不回来。电控阶段负责主控选型、CAN总线配置、运动学解算和控制程序框架搭建。到这个阶段底盘已经能“动”了但一般动得很糙横移会斜着走启动会抖一下。调试阶段就是PID参数整定的主场这也是最耗时的一步。对刚接触RoboMaster的新队员我建议直接复用实验室之前的电控框架先跑通再优化不要一上来就自己从头写驱动。因为底盘的难点从来不是某一行代码而是整套系统的联调方式。2. 麦轮与底盘机械选型、原理与装配2.1 麦克纳姆轮全向移动的力学原理麦克纳姆轮和普通轮子的本质区别在于辊子。轮子主体转动时真正接触地面的不是轮毂而是一排排斜置的辊子。这些辊子可以自由转动因此轮子滚动时会在辊子轴线方向产生一个侧向滑移。把单个轮子的受力拆开看轮子转动产生沿轮子方向的驱动力同时辊子又在地面产生了垂直轮子方向的侧向力。每个轮子都同时输出这两个分力。四个轮子的分力方向不同通过调整每个轮子的转速和转向总合力就能指向任意方向。这里的关键是“转速组合”。后面代码部分会说怎么算但脑子里要先建立起这个直观图像横移时四个轮子的转向不是全同向的。举个例子向右平移时左侧两个轮子正转、右侧两个轮子反转四个辊子的侧向分力刚好都指向右边车就横着走了。2.2 轮组选型尺寸、辊子材质与适配电机RM底盘常用的麦轮有4寸、5寸、6寸这几个规格。选多大主要看底盘的整体尺寸规划和你用的电机。如果电机选的是M3508这类大功率无刷电机轮径太小容易因为扭矩过剩导致起步打滑操作手感会很“冲”。如果电机选的是小功率直流电机轮子选太大又会显得动力不足斜向爬坡时直接趴窝。6寸轮配M3508是RM步兵里比较成熟的组合机动性和爆发力做到了不错的平衡。辊子材质也要注意。常见的有硬质聚氨酯和软质橡胶两种。硬辊轮滚动阻力小适合平滑地板或铺有地毯的场地但接地面积小抓地力有限软辊轮抓地力强适合摩擦力较大的场地但磨损更快。比赛场地以地毯或EVA地垫为主我建议优先选硬度适中的聚氨酯轮既能保证速度又不容易甩尾。另外麦轮是要固定在外转子电机轴上的连接方式通常是通过一个法兰联轴器或者专用轮毂转接件。不同厂家的麦轮孔位和法兰规格不统一采购前一定先确认和电机轴型号匹配否则装不上才是真尴尬。2.3 四轮排布与X型装配法则麦轮底盘看起来就是四个轮子装在底盘四个角但轮子本身有严格的方向性。辊子朝向装反底盘表现会非常怪异。常见的正确排布是X型左侧前轮和右侧后轮的辊子“尖角”朝内右侧前轮和左侧后轮的辊子“尖角”朝外。怎么验证装没装对最有效的方法是推车测试。把底盘放在平整地面沿正前方推如果车头严格直线前进说明方位对了如果推着推着车开始斜着偏那就是有轮子装反了。有些麦轮外侧有标箭头指示旋转方向但这个方向只代表轮子转动方向不代表辊子的“尖角”方向。不要只依赖箭头务必以实地推车直线测试为准。还有一个小提示底盘两侧同侧的轮子辊子朝向是相反的不少新队员在这里被绕晕。2.4 悬挂与重心全向移动的手感基础麦轮底盘对地面贴合度要求极高四个轮子必须同时着地。任何一轮悬空底盘会变成三支点支撑横移时悬空轮一侧完全失去驱动力车身就会画着弧线走。所以底盘车架一定要有足够的刚性不能用轻薄的亚克力板直接铺。电控板、电池、发射机构这些较重部件安装时尽量沿底盘中心对称分布。重心过高横移时惯性侧倾会非常明显导致轮子瞬间离地打滑重心偏置则会让四个轮子的正压力不一致同样影响横移直线度。如果场地地面不太平整可以考虑加改悬挂。但要注意悬挂行程不宜过大否则急加速或急刹车时车体俯仰会把某个轮子“吊”起来。悬挂结构选择上优先考虑“四独立悬挂”或“摇摆桥”实际装好后要低速测试各个方向移动确认没有轮子离地才算合格。3. 电控系统搭建从STM32到CAN通信3.1 主控选型与系统框架RM底盘的主控芯片推荐STM32F405或F407。相比F103F407主频更高且带硬件浮点单元做运动学解算、PID运算、姿态解算这些浮点密集型操作时占用资源更少。底盘通常还要同时处理遥控器信号、裁判系统数据和若干传感器CPU占用预留空间大一点不吃亏。整个底盘的电控链路可以画成一条单向数据流遥控器/上位机发送目标速度 → 主控读取并解析 → 运动学逆解算到四个轮子的目标转速 → PID速度环计算输出 → 通过CAN总线发送到电调 → 电调驱动电机运转 → 编码器反馈实际转速回主控。这条链路里主控既是指挥官又是监督员。它负责下发指令也负责通过闭环实时修正。3.2 CAN总线的配置与电机ID管理RoboMaster官方的M3508电机配C620电调用的就是CAN总线通信。之所以选CAN而非串口是因为CAN是差分信号抗干扰强且一主多从的广播式通信非常适合一个主控带多个电机。CAN配置里有三个容易出错的地方。波特率必须和电调一致。M3508 C620的官方默认波特率是1Mbps在STM32的bxCAN初始化里要配置为1M否则通信直接失败。电调ID要与控制报文对应。C620电调的ID是可以通过按键手动配置的四个电调的ID分别设为1、2、3、4。主控发速度指令时帧ID为0x200数据中前两个字节对应ID1电机接着两个对应ID2以此类推。也就是说你向0x200发送的是一条包含四个电机目标值的广播指令而不是逐个发送。CAN终端电阻也很关键。CAN总线两端需要120欧的终端电阻。如果电调没有内置终端电阻需要在线缆两端并联120欧电阻否则长距离通信会出现偶发丢包表现就是电机偶尔抽搐一下很难排查。3.3 运动学逆解把目标速度变成四轮转速麦轮底盘的运动学逆解公式我直接给出来。设定车体坐标系x轴朝前y轴朝左逆时针旋转方向为正。设目标速度为vx前后、vy左右、omega旋转角速度四个轮子的目标线速度可以用下面这段C代码计算typedef struct { float lf; // 左前轮 float rf; // 右前轮 float lr; // 左后轮 float rr; // 右后轮 } motor_speed_t; void kinematic_inverse(float vx, float vy, float omega, float half_wheelbase, float half_track, motor_speed_t *out) { out-lf vx - vy - omega * (half_wheelbase half_track); out-rf vx vy omega * (half_wheelbase half_track); out-lr -vx - vy omega * (half_wheelbase half_track); out-rr -vx vy - omega * (half_wheelbase half_track); }// 假设旋转方向和坐标系与上述定义一致实际使用时需根据辊子朝向自行验证注意一个细节这个公式里的正负号和不同教程里的定义有关。比如把y方向定义为朝右或者旋转正方向定义为顺时针公式里所有的符号都会反转。这非常正常不要背公式拿一个方向的推导过程理解一遍然后以“底盘实际能走直线、横移、自转”为准来校准符号。另一个坑是轮速单位。M3508反馈的转速单位通常是RPM转/分钟而运动学解算得出的是线速度m/s或角速度。中间一定要做一层单位换算。我习惯在程序里统一把轮速转换成RPM再把运动学里的线速度项除以轮子周长角速度项乘以轮距系数统一成一个单位体系再进PID。3.4 速度反馈闭环控制的“眼睛”PID离不开反馈值。底盘的速度闭环反馈来自电机的磁编码器通过CAN总线每帧回传。这些反馈数据需要解析成实际的轮速RPM再参与PID计算。同时要注意M3508反馈的转速是16位有符号数有正负之分正负代表旋转方向。在代码里处理符号时一定要确保和运动学解算输出的方向一致。曾经遇到过反馈转速符号反了底盘一启动就开始自激振荡输出直接顶到限幅值电机嗡嗡作响。后来排查了很久才发现是解析时少取了一次反。控制频率建议设在1kHz也就是每1毫秒跑一次速度环PID。位置环可以稍微慢一点比如500Hz。保持固定的控制频率对PID参数的整定非常关键如果控制周期抖动同样的参数测试结果可能完全不同。4. PID调参全记录与实操要点4.1 底盘控制中的PID层级结构底盘控制不是简单把一个PID套在轮子上就行。完整的底盘控制至少要分两层速度环内环和位置环外环。速度环的目标是让实际轮速稳定在目标轮速附近它是整个底盘控制最核心的一环。位置环在速度环的外面输入是期望位置输出是目标速度。外环的输出作为内环的输入。这样嵌套的好处是外环看到了位置偏差后并不是直接输出一个“蛮力”值而是告诉内环“你现在应该以多快的速度靠近目标”。一旦内环有扰动比如轮子打滑、负载突变速度环能快速调整位置环不会受到影响。用开车来类比速度环是右脚踩油门的力度位置环是导航系统在不断告诉你还有多远、该开多快。没有速度环导航只能直接给一个油门值遇到上坡下坡就会忽快忽慢。在M3508 C620方案里电调内部已经做了一层电流环扭矩环所以单片机只需要实现速度环和位置环。如果是用普通无刷电调或者自己搭MOS驱动那电流环也要自己实现调参的复杂度和难度都会上一个台阶。4.2 速度环调参三部曲P、I、D先说结论底盘速度环调参核心是先P后ID能不用就不用。第一步关掉位置环只保留速度环。给一个固定的目标转速比如1000RPM然后从P0.1开始往上加。每次加完观察响应波形后面会说怎么看波形P太小启动肉肉的加速半天才到目标转速P过大电机出现高频啸叫底盘明显抖动。记住那个“刚好有点快要振荡但又没振荡”的P值这个临界值一般就是比较合适的P。第二步加I。纯P控制会有稳态误差电机在地面摩擦力的影响下实际转速和目标转速可能差那么几十上百RPM。但这个误差也不全是稳态误差轮子打滑、负载突变都会造成偏差I的作用就是把这些残留累计误差全部吃掉。I从0.01开始往上加加到“启动阶段没有明显过冲、静止时没有低频抖动”为止。I太大底盘静止时能听到电机嗡嗡响启动瞬间还会前冲一下这是积分饱和在作祟。第三步D。在速度环里微分项对噪声极其敏感。轮速反馈本身就是带高频抖动的数字量D会把这些抖动放大成控制输出的大幅波动反而劣化控制效果。所以我的经验是速度环默认D0。真正需要D的是位置环那里微分能起到“阻尼”作用减小超调。4.3 位置环调参及串级系统联动位置环的调参前提永远是内环已经稳定。位置环参数整定时先只用P控制目标位置设为一个较小的移动距离比如20cm。P增大到位置响应不超调或者轻微超调即可。位置环的P太大车会像弹簧一样来回振动甚至把速度环顶到饱和让车一顿一顿地走。位置环通常也只需要P控制。I会造成位置静差反复修正表现为车到位后还在原地小幅度来回磨蹭。D可以用来抑制高速运动下的超调但位置反馈值如果是通过积分轮速得到的本身就有累计误差D放大的往往是这个误差的高频成分。用小陀螺这类高速往复运动场景时可以少量加一点D但一定要在输出端加低通滤波。4.4 调参现场实操数据观测与触发方法不依赖人眼去“感觉”车快车慢不靠谱。正确做法是拉数据波形。将目标转速、实际转速、PID输出这三路数据通过串口或DAPLink实时打印再用串口绘图工具SerialPlot、Vofa都行画出曲线。我自己的调参流程是先把底盘架起来四个轮子悬空这一步安全第一。因为P没调好时输出可能顶满直接在地上跑会蹿出去撞东西。给底盘发一个阶跃目标速度比如从0直接跳到2000RPM。看实际转速曲线上升快不快、有没有超调、有没有振荡、稳定后有没有静差。根据曲线形态调P和I重复到速度曲线“快而稳、无超调、无振荡”。放到地上带载测试。空载和带载的惯量差别很大空载调好的P在地上可能还是会振动。带载后再微调一般P要适当降低一点。这个过程中有一个很容易被忽略的点PID的输出一定要限幅。电调的输入范围是-16384到16384如果不做输出限幅积分项在启动阶段可能会累加到一个巨大的值造成启动瞬间的猛冲和难以恢复的饱和。做限幅的时候也要同步做积分限幅防止积分项一直涨。4.5 从底盘PID到无人机PID的类比很多同学调完底盘PID之后再看无人机飞控的PID第一反应是“怎么这么多环”。其实层级逻辑是相同的。无人机飞控里有内环角速度环就相当于底盘的电机转速环外环姿态环就相当于底盘的位置环最外面还有位置环相当于云台或底盘导航。只是无人机的系统更复杂、耦合更严重一个油门变化会同时影响俯仰和翻滚。PID调参的核心思路在那里都一样从内到外先P后I再D用阶跃响应曲线来判断参数是否合适。这也是“PID调参”这个词在无人机圈同样很热的原因。调过底盘再上手无人机飞控的PID逻辑会快很多。5. 避坑指南与实战问题排查5.1 机械装配阶段的坑麦轮方向装反是新手第一大坑。前面讲了推车测试法这是最有效的检查方式。另外拆换轮子后一定要重新检查一遍因为装回时很容易顺手装反。电池安装位置也容易踩坑。RM比赛的电池普遍偏重如果装在底盘一侧重心偏移会导致对角线两个轮子压地不实高速横移时车身发飘。把电池放在底盘中心对称线上能明显改善横移手感。最后是轮组本身。新买的麦轮辊子转动可能比较紧正常跑几十米后辊子轴承磨开了才会顺滑。强烈建议比赛前至少做一次较长时间的磨合不要拿新轮子直接上场比赛否则低速时会一卡一卡的。5.2 电控代码阶段的坑CAN通信初始化顺序要留意。先初始化CAN再配置电机ID最后发送第一帧控制指令。如果顺序反了电调可能收不到正确的速度指令进入“刹车”状态也就是电机一直锁死。编码器反馈溢出处理也很关键。M3508的转速反馈值是16位有符号整数超过32767会回绕到负数。如果直接拿它当float用会发现转速突然从正数跳成负数PID输出直接震荡。正确做法是把16位有符号数转换成int32_t再做符号扩展。运动学解算的符号问题前面已经提到底盘如果横移时斜着走而不是正横移99%是公式里vy或omega的正负号不对。调这个的时候不要急着改一堆代码先固定其他变量单独测试“纯横向移动”看车实际运动方向和预期方向差多少再决定改哪个符号。5.3 PID调参阶段的环境因素PID参数不是一劳永逸的。场地地面摩擦系数变化、电池电压下降、轮胎磨损都会影响调试结果。最典型的是电池电压满电时电机响应快P值大一点也没关系快没电时电机的最大输出扭矩下降原有的P值就会显得“软”同样会有控制性能下降。所以正式比赛前要预留至少一次满电状态的完整调参时间并在低电量下做一次快速参考测试确认参数仍然稳定。如果比赛允许建议调参时保持和正式场地相同的地面和电量条件。5.4 常见问题速查表现象可能原因处理办法推车时斜着偏麦轮方向装反重新按X型排布安装推车测试横移时画弧运动学符号错 / 某轮悬空单独测横移方向检查悬挂压缩量电机高频啸叫速度环P过大降低P直到啸叫消失启动猛冲一下积分饱和 / 输出限幅不够加积分限幅和输出限幅静止时低频抖动I过大降低I检查积分项是否有波动