
赛前最崩溃的画面是什么车已经调好了绕第一根桩都精准得不行结果到了第二圈GPS突然跳了2米车一头扎进桩桶里。这不是个别现象是轮腿穿越组用GPS导航绕桩最常遇到的“日常”。我在这件事上栽了好几次跟头也把GPSIMU导航绕桩这套东西从硬件选型到算法调试完整趟过一遍今天把实战技巧和踩过的坑一次性写清楚给正在备赛的兄弟队伍一点参考。这篇内容围绕智能车竞赛轮腿穿越组的绕桩赛题讲GPS和IMU怎么配合才能真正跑稳重点拆解误差来源、数据融合思路、桩点路径生成以及现场调试的完整流程。无论你是刚拿到赛题还没定方案还是已经能跑但总在绕桩时失控这篇都有能直接抄作业的部分。1. 绕桩赛题的技术本质别把它当单纯的竞速1.1 规则拆解导航绕桩到底考什么轮腿穿越组是第二十一届智能车竞赛的新组别赛题核心是让车沿着规划路径绕行若干指定桩点完成穿越任务。表面看是竞速实际上比的是“定位精度路径跟踪整车姿态控制”这三个能力的综合水平。绕桩赛道的桩点通常是在开阔室外场地按一定规则摆放车要从起点出发按照规定方向依次绕过障碍桩。如果赛道是固定物理赛道那用光电循迹就够了但轮腿穿越组把桩点信息给了GPS坐标意味着车必须依赖全球定位系统来确定自己在场地里的绝对位置再结合航向和速度控制实现绕行。这就把纯机械调校的比赛变成了传感器融合和路径跟踪的算法对抗。我在第一轮方案评审时犯过一个误区——以为绕桩就是快让车全速冲。结果车到了桩点附近转向来不及直接偏出去。后来想明白穿越组的评分不是单纯看谁先到终点而是看是否按规定绕过每一个桩、是否碰桩、是否漏桩。稳和准是第一优先级快是在这个基础上的加分项。1.2 为什么选GPSIMU而不是激光雷达或视觉这届的场地是室外大场地视觉方案受光照和场地环境影响很大激光雷达本身成本高、计算量大而GPSIMU方案在室外空旷场地下性价比极高。GPS提供全局位置IMU提供高频率的姿态和短时相对位移二者融合后既能保证长时间的绝对精度又能保证控制周期的实时性。有人会问轮腿车本身自带编码器里程计能不能替代IMU我测下来编码器在平整硬化地面对短距离相对位移计算很准但轮腿车重心高、过弯时存在侧倾和打滑轮子打滑时里程计会引入不可控的误差。IMU靠惯导积分虽然也会漂但在几秒到几十秒的时间尺度内比里程计稳定。所以比较合理的组合是GPS做长时绝对校正IMU做高频姿态反馈和短时推算编码器只在低速平地上作为辅助参考。1.3 轮腿底盘的特殊性你控制的不只是平面运动轮腿车相比普通四轮车最大的不同在于它有两个轮子通过调整身体姿态来维持平衡并实现运动。转弯时底盘会先倾斜再转向这个倾斜过程会显著影响GPS天线的水平投影位置也会让IMU测量的重力方向发生变化。如果你的算法只把车当二维质点去控制忽略轮腿车的侧倾动态绕桩时就会出现“入弯晚了半米”的错觉。实际好用的做法是整车控制用轮腿自身的平衡控制器保持稳定导航层只给速度指令和转向角速度指令不直接干涉底层平衡。导航算法输出的是目标速度和目标航向角变化率由底层的运动控制器去执行。这个分层设计在工程上最稳也最容易调试。2. GPS和IMU的误差真相绕桩最大的坑全在这里2.1 GPS误差从哪来为什么定位会“飘”一整米绕桩比赛要求车辆精准绕过直径可能只有几十厘米的桩桶但普通消费级GPS模块的精度在2.5米CEP左右意思是有一半的概率你的定位落在一个半径2.5米的圆内。用这种精度去绕桩大概率是还没到桩前就已经撞上了。GPS的误差来源主要有这几项卫星钟差和星历误差、电离层和对流层延迟、多路径效应、接收机噪声、以及卫星几何分布导致的DOP值变差。室外开阔场地能削弱多路径效应但场地旁边如果有机房、铁栏杆、观众席信号反射依然严重。我在测试时发现车靠近铁栅栏一侧时定位会明显向栅栏方向偏移这就是多路径误差在作怪。要解决精度问题最直接的办法是上RTK实时动态差分。RTK通过基准站和移动站观测同一组卫星求差后消除大部分公共误差可以达到厘米级精度。备赛中我们用的是带RTK的GPS模块固定解状态下精度实测在2厘米左右绕桩的富余量一下就大了。如果条件有限用不了RTK至少也要用双频GPS模块再配合IMU平滑能勉强维持不撞桩但每次过桩都会很紧张。2.2 IMU漂移航向角慢慢跑偏是绕桩大忌IMU的陀螺仪测量角速度积分一次就得到角度。问题在于陀螺仪存在零偏也就是静止时输出也不为零这个零偏会随着温度和时间变化。把这个微小偏差积分进去航向角就会一直慢慢漂移。我遇到过最典型的情况车启动后停着不动yaw角读数一分钟内从0漂到了15度肉眼可见的不靠谱。网上常有人问“基于IMU的位姿解算yaw仍会慢漂怎么回事”这个问题的根源其实有两个一是陀螺零偏没有被完全补偿二是只做纯积分没有任何外部观测来修正航向。轮腿组里如果GPS是单天线方案航向角的绝对来源几乎只能靠IMU自身纯积分漂移就无法避免。好在绕桩比赛通常几分钟内结束只要启动后先静态对齐航向再在运行中用GPS位置变化不断修正漂移的影响就能控制在可接受范围。我强烈建议做三件事芯片贴机前先做零偏标定软件里做上电静态对齐运行时用GPS轨迹方向持续修正航向。光有前两步、没有第三步车跑一圈后回来航向还是会偏。2.3 GPS陶瓷天线设计的几个注意细节热词里有个“gps陶瓷片设计注意事项”这确实是绕桩车上一个容易被轻视的地方。陶瓷天线是GPS信号接收的第一道关设计或安装不当再好的模块也白搭。天线要放在金属地平面的正中央地平面直径不小于天线尺寸的1.5倍这样能保证天线的方向图不被破坏。天线馈点要远离大电流走线和电机驱动线电机PWM的高频噪声很容易通过馈线耦合进接收链路造成定位毛刺。天线的净空区域不要被碳纤维板、金属支架遮挡尤其是上方180度半球范围遮挡会让搜星数量骤减。馈线尽量短馈线越长、弯折越多信号损耗越大。有一种情况我调了很久才发现天线放在车头、接收模块放在车尾中间一截长馈线从动力电池上方走过定位表现忽好忽坏。陶瓷天线本身是个无源器件但它的设计影响的是整个接收链路的信噪比。竞赛车上的空间本来就紧张天线安装必须提前规划别等装完其他东西再随便找位置贴。2.4 GPS误差量化拿数据说话为了让大家对普通GPS和RTK的差距有概念我贴一组自己实测的数据静止状态记录5分钟方案水平误差范围米重复性动态下表现普通单频GPS1.2~3.5差每次都不一样转弯时定位明显滞后双频GPS0.6~1.8一般稍微平滑但仍有跳变RTK固定解0.02~0.06很好转弯时依然稳定注意RTK有一个关键前提在移动过程中必须保持固定解状态。如果车走到树荫下、高墙边RTK容易降级为浮点解甚至单点解精度瞬间掉回米级。竞赛场地如果周边环境复杂这个风险一定要提前测试。我们当时专门绕着场地走了一圈把信号差的区域标记出来路径规划时尽量避开。3. 导航融合和绕桩算法从坐标换算到路径跟踪3.1 经纬度到平面坐标的转换别偷懒用二次近似GPS输出的原始数据是经纬度WGS84坐标系但控制算法需要的是米为单位的平面坐标。很多新手直接取场地中心点作为原点用经纬度差值乘以固定系数换算成米这在几百米范围内误差不大但有个细节必须注意经度方向的尺度系数要乘以纬度的余弦值纬度越高每度经度对应的实际距离越短。我推荐使用UTM投影或高斯-克吕格投影把WGS84经纬度转成平面坐标。Python里可以用pyproj库做这件事核心代码也就几行import pyproj # 定义WGS84经纬度坐标系 wgs84 pyproj.CRS(EPSG:4326) # 选择UTM投影例如北半球49带按实际场地所在区域选择 utm pyproj.CRS(EPSG:32649) transformer pyproj.Transformer.from_crs(wgs84, utm, always_xyTrue) lon, lat 117.123456, 31.654321 x, y transformer.transform(lon, lat) print(x, y) # 单位米转换后选一个参考点比如起点作为本地坐标系原点把UTM坐标做平移就行。注意UTM分带不同经度范围要选不同带号选错了坐标数值就是几万米的偏差。还有一个细节RTK输出的如果已经是平面坐标也要确认它的投影方式和原点别和WGS84混用。网上有搜“python将gps经纬度转换为高德经纬度”那是地图坐标转换跟导航控制不是一回事。地图坐标多一次GCJ-02加密偏移千万别用在地图上的转换算法去处理原始GPS数据否则场地坐标系会莫名偏移几百米。3.2 数据融合卡尔曼滤波和互补滤波怎么选GPS和IMU的融合核心思路就一句话用GPS的低频绝对位置修正IMU高频推算的累积误差用IMU的高频输出填补GPS两次更新之间的空白。实际工程中多数人用松耦合的扩展卡尔曼滤波EKF状态量一般是位置x、y、速度vx、vy、航向角yaw。IMU的加速度计积分给出高频预测GPS的位置观测用来纠正预测结果。这个思路简单有效关键是调好过程噪声和观测噪声两个矩阵。过程噪声太大滤波结果偏向GPS噪声大时会抖过程噪声太小滤波结果偏向IMUGPS的修正作用变弱长时间会漂。实际调的时候没有捷径只能把车放在场地里跑把滤波后的轨迹和RTK真实轨迹对比反复调两个噪声参数。如果你不想上卡尔曼可以用一个更轻量的方案互补滤波。IMU短时间积分精确GPS长时间稳定互补滤波在频域上做加权。但轮腿车动态变化快简单的互补滤波在急转弯时位置滞后会比较明显。我自己的经验是赛前调试时间紧张可以先上互补滤波跑通流程后续再换成EKF提升绕桩的精准度。3.3 绕桩路径生成和目标点切换策略GPSIMU融合后得到了车的实时位置和航向接下来要回答“往哪开”的问题。绕桩的路径可以拆成一串目标点车按顺序追逐目标点到达后切换下一个。每个桩点并不是要车碾过去而是要绕到桩的外侧。实际操作中我会对每个桩点生成两个关键点入桩点和出桩点。入桩点让车从上一段路径驶入绕到桩的外侧出桩点让车驶离并朝向下一个桩。目标点切换是最容易翻车的地方。如果用“距离小于阈值”来判断到达车速快了容易冲过头车速慢了又浪费时间。一个稳妥方案是“动态切换”预估车在当前速度下的刹车距离如果车在刹车距离内能到达目标点就提前切换下一个目标点。同时设定最小距离阈值防止车速极低时迟迟不切换。路径规划时还要考虑车的最小转弯半径。轮腿车本身通过左右轮差速转向转弯半径可以很小但速度越快转向能力限制越明显。如果桩点距离近速度就得降下来相邻两桩间距大中间可以维持高速。我们当时的做法是给每段路径设一个最大安全速度用当前航向和目标点的夹角动态调节夹角大就降速夹角小就提速。这个策略简单、响应快绕桩的丝滑程度比固定速度好很多。3.4 横向跟踪控制纯跟踪和PID怎么取舍目标点确认后需要把“当前位置到目标点”的关系转换为转向指令。常用的方法有两种纯跟踪Pure Pursuit和PID航向控制。纯跟踪算法通过拟合一条弧线从当前点到达前方预瞄点输出一个曲率半径。预瞄距离是核心参数预瞄远了路径跟踪平滑但会切弯预瞄近了跟踪精确但转向抖动。我用下来的感受是绕桩场景预瞄距离取车体长度的2~3倍比较合适桩点密集时适当缩短。PID航向控制更直观计算目标航向和当前航向的差值经过PID输出转向角速度。这个方法在小偏差时效果不错但大偏差时容易超调。我最终用的是两者的结合横向偏差较大时用纯跟踪快速拉回横向偏差小时切换到PID做稳定跟踪。切换逻辑要做好滞回处理防止在两个控制器之间来回跳。这部分的调参经验是先让车低速跑观察它是否能稳定到达每个目标点再逐步提高目标速度观察转弯处是否出现超调或切弯。每次只改一个参数记录日志不要一次改三个参数然后摸不着头脑。4. 实操全过程从硬件装车到绕桩跑通4.1 硬件清单和安装位置以我们车为例导航系统硬件的核心配置如下硬件型号/规格作用主控MCUSTM32H750采集传感器、运行融合和控制算法轮腿底盘自研双轮轮腿负责运动和平衡GPS模块RTK移动站固定解提供厘米级绝对位置IMUICM-20602或BMI088提供高频姿态和角速度数传模块2.4GHz无线串口调试时实时看数据机载日誌microSD记录原始数据供离线分析安装方面有几个硬性要求IMU要尽量靠近车的质心而且安装方向要与车体坐标系严格对齐误差超过一两度就会导致加速度分解出现横向偏差。GPS天线放在车的最高点天线正上方不能有遮挡。轮腿车跑起来会前后俯仰如果天线离质心太远俯仰会导致天线位置来回摆动定位数据会有周期性波动。给IMU供电建议用LDO稳压别直接并联在电机供电的电池电压上。电机启动时电压跌落严重IMU如果供电不稳输出数据会突然跳变。这个看似小问题实际排查起来很费时间。4.2 上电后的第一件事校准和静态测试每次上电后先别急着跑按这个顺序做校准IMU静止放置采集30秒数据计算陀螺零偏和加速度计零偏软件里做补偿。将车置于场地已知坐标点确认GPS解状态为固定解记录当前定位是否与真实位置一致。手动旋转车体90度、180度观察IMU航向输出是否正确同时观察GPS定位是否随天线移动而移动。静态保持30秒融合算法输出的位置应基本静止不动最多有小幅度扰动。这四步做完才能判断传感器链路是健康的。如果第2步就不对别急着调算法先检查GPS天线的安装和模块配置。这里特别提醒做日志系统。我们当时的代码里每个控制周期都会记录时间戳、融合位置、速度、航向、目标点索引、控制输出。出问题后回放日志能精确到是哪一个控制周期开始跑偏的。没有日志你就只能靠肉眼追着车跑效率极低。4.3 桩点坐标采集一次完成别反复补桩点坐标的采集质量直接决定绕桩效果。不要用一枚普通GPS手持机打完桩点了事那样误差有1米以上。最好用与车上同型号的RTK模块架在桩点位置静置一段时间取平均这样得到的位置可以跟车上定位保持在同一个误差源体系里。采集时记录每个桩点的编号和大致朝向即车应该从哪边绕过去然后按赛题要求的绕行顺序整理成路径文件。这些点直接以本地坐标系下的x、y保存。建议起点也采集一个点作为坐标原点这样实际运行的坐标系和规划时的坐标系完全一致。还有一个小细节赛前一天必须重新确认桩点坐标尤其是借用的场地桩点可能会被移动或者重新摆放。开赛前留出至少30分钟用车上RTK去对每个桩点的实际位置做复测发现偏差马上更新路径文件。4.4 绕桩调试先低速验证再逐步提速第一次跑通绕桩速度建议设置在0.5m/s左右给足算法反应时间。观察车内日志重点检查三个指标过桩时车与桩的横向距离是否满足要求每段目标点切换是否流畅融合位置轨迹是否存在明显跳变。这三个指标正常后再把速度加到0.8m/s、1.0m/s这样逐级往上提。提速过程中最容易出的问题是转弯切弯。原因是速度变快后预瞄距离和刹车距离都需要调整固定参数肯定跟不上。建议把预瞄距离和目标速度做一个线性映射速度越大预瞄点越远保证过弯轨迹一致性。横向PID的输出限幅也要随速度调整避免高速时猛打方向导致轮腿失衡。整个调试过程要有耐心。我记得有一次为了一个弯道的过弯曲线前后调整了预瞄系数和最大速度限制又配合改了加减速度反复跑了几十圈才达到理想效果。竞赛调试就是这样参数必须是“调出来的”不是“算出来的”。4.5 场地环境变化上午下午跑法都不一样室外场地有一个很容易忽略的变量GPS信号环境随时间变化。卫星的几何分布每一刻都在变上午定位精度好不代表下午也好。DOP值精度因子高的时候定位误差会比平时大很多。建议每轮调试前都记录一下当前搜星数和DOP值。如果同一天内DOP值变化明显比赛有多个赛程的话要把主控融合算法的噪声参数设成中等偏鲁棒的值别为了追求某一次的最高精度把参数逼到极限。跑过一次好成绩后后续赛程由于时段不同同样参数可能就失效了。这个坑不亲历很难体会但它真实存在。5. 常见问题与排查技巧实录5.1 故障速查表我把调试期间遇到的高频问题整理成了表格按排查的经验排序现象可能原因排查方法解决方案绕桩时车方向突然偏转低速下有GPS跳变回看日志定位是否突变GPS或RTK降级调整场地天线位置或改用抗差融合航向角缓慢漂移IMU零偏未补偿静态观察yaw角是否随时间变化上电做零偏标定运行时用GPS轨迹修正目标点反复切换不出目标点切换距离阈值过大打印目标点索引看是否切换缩小阈值结合车速动态判断过弯切弯严重预瞄距离太小或PID超调查看横向偏差曲线增大预瞄距离降低高速下的转向增益定位正常但车走不出直线GPS天线与车体坐标系没有对齐测量天线与质心的相对位置在软件中加入天线到质心的坐标换算信号土干扰时融合发散观测噪声设置过小查看EKF方差是否收敛增大GPS观测噪声系数5.2 一个典型的“幽灵跳变”排查案例有一次调试车在场地中某个区域反复出现位置跳变每次跳1.5米左右然后就恢复正常。日志回放发现跳变只发生在一个固定区域而且GPS原始数据也有一致跳变说明是GPS接收本身的问题不是融合或控制的问题。我们用RTK基准站自带的日志对比后发现那个区域正好在场地角落附近有一根金属旗杆多路径效应把反射信号当成直射信号参与了结算。解决方法是把融合算法里GPS观测的信噪比权重加了一点限制当卫星信噪比异常时降低权重同时路径规划中尽量让车不长时间停留在那个区域。这个经验告诉我们场地侦察和环境排查简直是绕桩调试里的必修课不能只闷头在算法上使劲。5.3 时间不多时怎么快速定位问题备赛后期时间紧一个问题可能叠加另一个问题快速定位就很重要。我这里有个自己总结的排查顺序先查传感器原始数据、再查融合输出、最后查控制回路。传感器原始数据不对后面全是白调融合输出平滑但没有贴合真实轨迹那就是融合参数问题融合正常但车不走那就是控制问题。另外凡是涉及到无线通信的GPS RTK信号、数传模块都要警惕挡和干扰。我一直建议车上所有模块在调试前先做一次“静态应力测试”车静止看所有传感器输出是否稳定。如果静止时都不稳定运动时只会更糟。6. 备赛避坑清单这些细节决定省不省心列一下我经过这一整轮备赛总结出的关键避坑点供有需要的队伍参考GPS模块务必留出固定解等待时间开赛前提前上电不要在发车前几秒才开机。锂电池电压变化会影响IMU供电稳定性如果定位数据在电量低于30%后变差优先检查电源。桩点坐标用RTK实时采集不要依赖地图工具取点。每次修完算法或结构都做一次静态校准再下场地。转向极限速度要提前测试避免比赛时首次触发出意外。赛前到场地后先跑一遍全图记录GPS信号弱区让算法避开这些地方。备件清单里一定要有备用IMU和GPS天线现场摔坏是常有的事。还有一个很多人忽略的问题GPS天线和电机驱动线之间的距离。电磁兼容在竞赛车上很少被人提但电机PWM大电流线对GPS接收的影响是实打实的。调试时如果定位飘忽试着把天线馈线与电机线拉开距离有时比调半天参更有用。GPSIMU导航绕桩这套组合本质上是在精度和实时性之间找平衡。不要追求某一个传感器做到极致关键是让系统在误差存在的情况下依然能完成绕行任务。我个人的体会是每次把车放到场地里跑都会发现一些自己没预料到的问题这正是这套方案的魅力所在。备赛路上没有轻松时刻但把这些问题提前踩一遍到了赛场心里才真正有底。