赛前最崩溃的画面是什么?车已经调好了,绕第一根桩都精准得不行,结果到了第二圈GPS突然跳了2米,车一头扎进桩桶里。这不是个别现象,是轮腿穿越组用GPS导航绕桩最常遇到的“日常”。我在这件事上栽了好几次跟头,也把GPS+IMU导航绕桩这套东西从硬件选型到算法调试完整趟过一遍,今天把实战技巧和踩过的坑一次性写清楚,给正在备赛的兄弟队伍一点参考。
这篇内容围绕智能车竞赛轮腿穿越组的绕桩赛题,讲GPS和IMU怎么配合才能真正跑稳,重点拆解误差来源、数据融合思路、桩点路径生成,以及现场调试的完整流程。无论你是刚拿到赛题还没定方案,还是已经能跑但总在绕桩时失控,这篇都有能直接抄作业的部分。
1. 绕桩赛题的技术本质:别把它当单纯的竞速
1.1 规则拆解:导航绕桩到底考什么
轮腿穿越组是第二十一届智能车竞赛的新组别,赛题核心是让车沿着规划路径绕行若干指定桩点,完成穿越任务。表面看是竞速,实际上比的是“定位精度+路径跟踪+整车姿态控制”这三个能力的综合水平。
绕桩赛道的桩点通常是在开阔室外场地按一定规则摆放,车要从起点出发,按照规定方向依次绕过障碍桩。如果赛道是固定物理赛道,那用光电循迹就够了;但轮腿穿越组把桩点信息给了GPS坐标,意味着车必须依赖全球定位系统来确定自己在场地里的绝对位置,再结合航向和速度控制实现绕行。这就把纯机械调校的比赛变成了传感器融合和路径跟踪的算法对抗。
我在第一轮方案评审时犯过一个误区——以为绕桩就是快,让车全速冲。结果车到了桩点附近转向来不及,直接偏出去。后来想明白,穿越组的评分不是单纯看谁先到终点,而是看是否按规定绕过每一个桩、是否碰桩、是否漏桩。稳和准是第一优先级,快是在这个基础上的加分项。
1.2 为什么选GPS+IMU而不是激光雷达或视觉
这届的场地是室外大场地,视觉方案受光照和场地环境影响很大,激光雷达本身成本高、计算量大,而GPS+IMU方案在室外空旷场地下性价比极高。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分钟):
| 方案 | 水平误差范围(米) | 重复性 | 动态下表现 |
|---|---|---|---|
| 普通单频GPS | 1.2~3.5 | 差,每次都不一样 | 转弯时定位明显滞后 |
| 双频GPS | 0.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_xy=True) 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,噪声大时会抖;过程噪声太小,滤波结果偏向IMU,GPS的修正作用变弱,长时间会漂。实际调的时候没有捷径,只能把车放在场地里跑,把滤波后的轨迹和RTK真实轨迹对比,反复调两个噪声参数。
如果你不想上卡尔曼,可以用一个更轻量的方案:互补滤波。IMU短时间积分精确,GPS长时间稳定,互补滤波在频域上做加权。但轮腿车动态变化快,简单的互补滤波在急转弯时位置滞后会比较明显。我自己的经验是:赛前调试时间紧张可以先上互补滤波跑通流程,后续再换成EKF提升绕桩的精准度。
3.3 绕桩路径生成和目标点切换策略
GPS+IMU融合后得到了车的实时位置和航向,接下来要回答“往哪开”的问题。绕桩的路径可以拆成一串目标点,车按顺序追逐目标点,到达后切换下一个。每个桩点并不是要车碾过去,而是要绕到桩的外侧。实际操作中,我会对每个桩点生成两个关键点:入桩点和出桩点。入桩点让车从上一段路径驶入,绕到桩的外侧;出桩点让车驶离并朝向下一个桩。
目标点切换是最容易翻车的地方。如果用“距离小于阈值”来判断到达,车速快了容易冲过头,车速慢了又浪费时间。一个稳妥方案是“动态切换”:预估车在当前速度下的刹车距离,如果车在刹车距离内能到达目标点,就提前切换下一个目标点。同时设定最小距离阈值,防止车速极低时迟迟不切换。
路径规划时还要考虑车的最小转弯半径。轮腿车本身通过左右轮差速转向,转弯半径可以很小,但速度越快,转向能力限制越明显。如果桩点距离近,速度就得降下来;相邻两桩间距大,中间可以维持高速。我们当时的做法是给每段路径设一个最大安全速度,用当前航向和目标点的夹角动态调节:夹角大就降速,夹角小就提速。这个策略简单、响应快,绕桩的丝滑程度比固定速度好很多。
3.4 横向跟踪控制:纯跟踪和PID怎么取舍
目标点确认后,需要把“当前位置到目标点”的关系转换为转向指令。常用的方法有两种:纯跟踪(Pure Pursuit)和PID航向控制。
纯跟踪算法通过拟合一条弧线从当前点到达前方预瞄点,输出一个曲率半径。预瞄距离是核心参数,预瞄远了,路径跟踪平滑但会切弯;预瞄近了,跟踪精确但转向抖动。我用下来的感受是:绕桩场景预瞄距离取车体长度的2~3倍比较合适,桩点密集时适当缩短。
PID航向控制更直观:计算目标航向和当前航向的差值,经过PID输出转向角速度。这个方法在小偏差时效果不错,但大偏差时容易超调。我最终用的是两者的结合:横向偏差较大时用纯跟踪快速拉回,横向偏差小时切换到PID做稳定跟踪。切换逻辑要做好滞回处理,防止在两个控制器之间来回跳。
这部分的调参经验是:先让车低速跑,观察它是否能稳定到达每个目标点;再逐步提高目标速度,观察转弯处是否出现超调或切弯。每次只改一个参数,记录日志,不要一次改三个参数然后摸不着头脑。
4. 实操全过程:从硬件装车到绕桩跑通
4.1 硬件清单和安装位置
以我们车为例,导航系统硬件的核心配置如下:
| 硬件 | 型号/规格 | 作用 |
|---|---|---|
| 主控MCU | STM32H750 | 采集传感器、运行融合和控制算法 |
| 轮腿底盘 | 自研双轮轮腿 | 负责运动和平衡 |
| GPS模块 | RTK移动站(固定解) | 提供厘米级绝对位置 |
| IMU | ICM-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接收的影响是实打实的。调试时如果定位飘忽,试着把天线馈线与电机线拉开距离,有时比调半天参更有用。
GPS+IMU导航绕桩这套组合,本质上是在精度和实时性之间找平衡。不要追求某一个传感器做到极致,关键是让系统在误差存在的情况下依然能完成绕行任务。我个人的体会是,每次把车放到场地里跑,都会发现一些自己没预料到的问题,这正是这套方案的魅力所在。备赛路上没有轻松时刻,但把这些问题提前踩一遍,到了赛场心里才真正有底。