多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

自适应卡尔曼滤波提升列车定位精度:SINS/GPS组合导航设计与仿真

自适应卡尔曼滤波提升列车定位精度:SINS/GPS组合导航设计与仿真 1. 项目缘起与整体设计思路1.1 列车定位为什么是个“硬骨头”先说说我为什么对这个问题感兴趣。列车定位和我们平时用手机导航完全不是一个量级的事情高铁、城际、地铁对定位精度的要求极高尤其在列车运行控制系统里位置信息直接关系到行车安全间隔和自动防护。平时大家开车用GPS觉得“差不多就行”但列车不行差个几十米就可能触发错误的路权判断甚至造成安全事故。列车运行环境本身就很不友好。隧道、城市峡谷、高架桥下、密集站房区域GPS信号被遮挡、被多径干扰、被反射污染都是家常便饭。GPS一旦失锁列车位置就只能靠“盲推”这是绝对不能接受的。所以业内普遍采用的思路是组合导航——用一个不依赖外部信号、完全自主的传感器系统和一个提供绝对位置参考的卫星系统两者互相取长补短。这个项目做的就是SINS和GPS的组合。SINS是捷联式惯性导航系统靠陀螺仪和加速度计积分出姿态、速度和位置短时精度极高但误差会随时间累积GPS则提供稳定的绝对位置但更新率低、易受遮挡。两者组合用卡尔曼滤波把数据融合到一起既保证连续性又保证长期不发散。不过做组合导航最头疼的其实是“噪声统计特性不确定”这个问题。传统卡尔曼滤波要求系统噪声和量测噪声的统计特性是已知且固定的但列车运行场景千变万化GPS信号质量时好时坏惯性器件误差随温度、时间漂移参数一成不变的结果就是滤波精度下降严重时直接发散。所以本项目的核心工作就是把标准卡尔曼滤波改成“自适应”的让滤波器根据运行工况自动调节噪声参数从而在复杂工况下维持稳定输出。1.2 组合方案选型松组合还是紧组合在研究初期我首先面临一个经典选型问题SINS和GPS的组合方式选哪种。业内主要有松组合、紧组合和深组合三种路线但考虑到算法验证阶段的可行性和工程转化难度我最终锁定了松组合方案。先简单梳理一下三者的区别组合方式组合深度核心思想优点缺点松组合较浅用GPS解算出的位置/速度作为量测融合SINS输出结构简单状态维数低可靠性高依赖GPS自身的定位结果GPS失锁时无观测可用紧组合较深用GPS原始伪距/伪距率作为量测直接与SINS预测的伪距比较GPS可用卫星数少时仍能工作抗干扰能力更强算法复杂状态维数高工程调试难度大深组合最深从接收机前端就与INS融合跟踪环路与导航解算一体化动态性能最好抗干扰最强需要访问接收机底层实现复杂、周期长我做松组合的主要原因有两个。第一本研究的核心是“自适应滤波”本身而不是组合导航结构创新。用松组合可以把研究焦点集中在滤波算法的改进上避免把时间耗费在GPS原始观测处理这类旁支问题上。第二松组合对硬件要求低常规导航级或战术级惯性器件配合普通测量型GPS接收机就能跑后续移植到列车车载平台也更方便。1.3 项目整体设计思路确立松组合路线后整个项目的架构就清晰了不少。整体框架分为四个层次第一层是传感器仿真层负责生成列车在不同轨迹下的姿态、速度和位置真值并在其上叠加惯性器件误差和GPS误差。第二层是SINS捷联解算层利用IMU数据完成姿态更新、速度更新和位置更新输出连续导航结果。第三层是组合滤波层把SINS解算结果与GPS量测结果输入自适应卡尔曼滤波器输出最优状态估计。第四层是评估仿真层通过设置不同场景对比标准卡尔曼滤波与自适应卡尔曼滤波在定位精度、稳定性和抗差性上的表现。整个流程中最关键的看点其实在第三层——我这里没有把滤波器当成一个“黑盒”直接用而是从算法底层重新审视了卡尔曼滤波器的假设条件在列车场景中的适用性并针对性地引入了自适应策略。这是我个人认为该项目最有价值的部分。2. 自适应卡尔曼滤波从原理到工程化改造2.1 标准卡尔曼滤波为什么会翻车很多刚接触组合导航的人会有个误区卡尔曼滤波不是有标准公式吗代入算不就行了理论上可以这么说但实际跑起来几乎必出问题。原因在于标准卡尔曼滤波的推导依赖于一套很强的假设系统模型和量测模型都精确已知过程噪声矩阵和量测噪声矩阵统计特性确定且恒定噪声均为零均值高斯白噪声。列车定位场景下这几个假设几乎全部站不住脚。列车在地下段运行时GPS量测噪声方差急剧增大甚至出现连续野值惯性器件受温度变化、振动环境影响随机游走系数漂移明显列车进出站时加加速度变化剧烈容易让简化运动模型产生“模型失配”。一句话噪声特性不是固定的而是时变的。标准卡尔曼滤波用固定的噪声参数去处理时变系统要么过度信任量测导致抖动放大要么过度信任预测导致导航结果慢慢漂走极端情况下协方差矩阵非正定滤波器直接报废。所以“自适应”三个字的本质是让滤波器有能力在实际运行中在线估计和修正噪声统计特性以及在线调整对预测和量测的信任权重从而适应环境变化。2.2 三条主流自适应路线对比在方案调研阶段我重点比较了三种自适应改进方向这也是目前业内讨论最多的三种路线。第一种是基于新息的自适应估计。新息Innovation是实际量测值与滤波器预测的量测值之差它里面天然携带了滤波器“预测能力好不好”以及“量测噪声估计准不准”的信息。这类方法的思路是用一段窗口内的新息序列来在线估计量测噪声协方差矩阵。好处是原理清晰实现简单窗口长度可以灵活调整缺点是过程噪声统计有偏差时该方法的修正能力有限而且新息序列需要满足零均值高斯假设遇到强非高斯噪声时性能打折扣。第二种是基于多模型交互的 IMM 方法。把列车的运行状态划分为匀速、加速、转弯等多个子模型每个模型独立配一个滤波器按模型概率加权融合输出。优点是适应强机动场景模式切换自然缺点是计算量大幅增加而且模型集的设计好坏直接影响结果工程调参成本高。第三种是基于强跟踪滤波的次优渐消方法。通过在预测协方差中引入渐消因子强迫滤波器在当前新息过大时主动降低对历史数据的信任把增益矩阵拉到合适位置。优点是算法结构极其紧凑对“滤波发散”的抑制效果立竿见影缺点是渐消因子的引入方法比较经验化参数不当时会牺牲稳态精度。我在这个项目里最终采取的是以第一种为主线、第三种为辅的混合策略。量测噪声协方差用新息序列在线估计同时在滤波器发散预警指标异常时自动引入渐消因子做紧急纠偏。这种组合方式兼顾了稳态精度和动态稳定性实测效果比单用任何一种都更稳妥。2.3 自适应策略的工程实现细节接下来是我认为最有实操参考价值的部分——自适应策略怎么具体落到程序里而不仅仅是停留在论文公式层面。新息序列在线估计量测噪声的核心公式是通过长度为N的滑动窗口计算新息序列的样本协方差然后反推量测噪声协方差矩阵的估计值。这里有几个工程要点第一个要点是滑动窗口长度N的选择。N太短统计结果抖动大滤波输出容易跟着跳变N太长统计结果平滑但响应环境变化慢在GPS突然失锁又恢复的瞬间会拖后腿。我做了多组对比实验窗口长度取10到20之间比较合适。列车运行环境变化一般以秒级为单位而滤波周期通常是100毫秒窗口10到20对应1到2秒的统计时间既能平滑瞬时波动又不至于反应迟钝。第二个要点是异常新息剔除。在实际数据里GPS偶尔会给出离群值如果不处理就进统计窗口协方差估计值会被一条野值“带偏”后面好几秒的滤波都会被污染。我的做法是引入卡方检验如果某一维新息值超出由理论协方差计算出的置信区间该采样点就不参与统计并且在滤波更新时直接降低该维度的信任度。听起来复杂其实代码量不大但效果极其明显。加了野值剔除后列车上跨桥梁、下穿隧道时位置输出平滑度提升非常显著。第三个要点是渐消因子的引入条件。我设计了一个发散判据当理论新息协方差与实际统计协方差的比值超过某阈值时判断滤波器存在发散趋势于是对预测协方差矩阵乘上一个大于1的渐消因子。这个因子的计算方式沿用了强跟踪滤波的思路但阈值和因子上限都是通过仿真参数整定出来的。特别注意渐消因子不能一直大于1否则滤波器的历史信息会被持续削弱稳态精度必然受损。我的做法是只有当发散判据连续触发达到一定次数才启用渐消并且在发散状态解除后立即恢复标准更新。3. 仿真系统搭建与算法性能验证3.1 SINS/GPS组合系统的数学模型建立做仿真验证的第一步是把物理系统翻译成数学方程。SINS的核心方程包括姿态微分方程、速度微分方程和位置微分方程。姿态微分方程描述载体坐标系相对于导航坐标系的旋转关系速度微分方程描述比力方程位置微分方程则对速度做积分得到经纬度和高度变化。状态向量的选取上经典做法是取15维三维姿态误差角、三维速度误差、三维位置误差、三轴陀螺漂移、三轴加速度计零偏。但考虑到列车运行场景速度变化平缓、姿态角变化有限同时为了降低状态估计的不可观性风险我最终将状态向量压缩为12维略去了加速度计零偏中的垂直方向分量。这一改动减小了计算量却没有明显牺牲精度在仿真实验对比中速度误差和位置误差几乎没有差别。量测方程相对简单。松组合模式下的量测更新直接用GPS输出的位置和速度与SINS预测值的差异构成量测向量。但在设计量测噪声协方差阵时我特意做成了时变的卫星数量好、几何分布理想时协方差取小型值卫星被遮挡导致精度因子PDOP变大时协方差自动放大。这个细节对算法发挥自适应能力至关重要——滤波器只有知道“GPS此刻到底靠不靠谱”才能正确决定该相信谁。3.2 仿真场景与关键参数配置为了让实验结果有说服力我设计了三类测试场景常规平直路段、进出站变速路段、以及地下与地面交替的复杂路段。常规平直路段考验滤波器在稳态下的位置精度进出站变速路段考验加速度突变下滤波器是否发散复杂路段的隧道部分模拟GPS失锁出隧道瞬间模拟GPS恢复时的冲击。列车运动轨迹的真值由设定的匀速段、匀加速段、转弯段和停车段拼接而成。惯性器件仿真参数参照战术级MEMS器件水平陀螺零偏稳定性为1度/小时角度随机游走0.1度/开方小时加速度计零偏稳定性为5毫克速度随机游走约0.05米每秒/开方小时。GPS量测误差设定为水平位置噪声标准差2米速度噪声标准差0.05米每秒。滤波器的初始参数设定有一套讲究。过程噪声协方差矩阵不能直接拍脑袋我按照陀螺和加速度计器件噪声的功率谱密度逐项填入再适当放大以覆盖未建模动态误差。量测噪声协方差的初始值设定为GPS标称指标对应的数值。初始状态协方差矩阵则根据SINS启动时的对准误差水平设定取值偏大会让滤波器在启动初期较快收敛取值偏小则容易导致前期数据被“锁死”在错误的初值附近。3.3 算法实现流程与性能对比这里给出算法主流程的框架型描述方便大家复现。主循环的每一步顺序执行以下操作读取IMU数据完成SINS捷联解算输出姿态、速度、位置读取GPS数据进行时间对齐计算量测向量执行卡尔曼滤波时间更新计算一步预测状态和协方差执行自适应量测噪声估计更新当前量测噪声协方差阵执行卡尔曼滤波量测更新计算增益矩阵和修正后的状态使用修正结果反馈校正SINS输出反馈校正方式为误差补偿法仿真结果对比中我记录了三组关键数据列车在平直路段匀速运行200秒后的水平定位误差均值进出站变速场景下的最大定位误差以及隧道场景GPS失锁期间的误差累积速度。对照组分别采用标准卡尔曼滤波、只含新息自适应的滤波方案、以及自适应加渐消因子的完整方案。标准卡尔曼滤波在平直路段表现尚可水平位置误差均值约为2.3米但在变速场景下最大误差冲到了6.8米隧道场景GPS失锁80秒时位置误差已经超过15米。只含新息自适应的方案在平直路段将位置误差均值压到了1.6米变速场景最大误差降到3.9米但隧道期间误差累积仍然较快说明自适应量测噪声估计解决不了“完全没有GPS量测时如何抑制纯惯性发散”的问题。完整方案在最关键的隧道场景中表现最好GPS失锁80秒时位置误差仍能控制在8米以内恢复GPS信号后约8秒内平滑收敛回到2米以内水平。从数据可以清楚看到自适应策略的主要贡献不仅在于提高GPS正常时的精度更在于提升系统在信号异常时的鲁棒性以及异常结束后的恢复速度。4. 仿真与工程实践中的常见问题排查实录4.1 滤波器初次运行即发散怎么定位问题第一次跑联合仿真时我的滤波器毫不客气地发散了输出位置直接以肉眼可见的速度飞走。排查后发现原因很经典初始状态协方差矩阵和过程噪声协方差矩阵的量级设置不匹配。SINS误差方程的状态量纲五花八门姿态角是弧度量级位置是米量级速度是米每秒量级协方差矩阵对角线元素直接从弧度换算成米差着好几个数量级。滤波器内部计算增益时各个维度之间的相对权重被完全带偏。解决办法是统一把状态量改成误差量然后按误差量级设置初始协方差而不是按状态量自身量级设置。姿态误差初始值按0.1度设置对应约0.0017弧度速度误差按0.1米每秒设置位置误差按5米设置。这样一换滤波器立即“听话”了。4.2 GPS失锁期间位置发散太快另一个棘手的问题出现在隧道仿真场景。尽管加入自适应策略GPS失锁80秒期间位置误差仍然会涨到10米量级这对于实际列控系统来说还是偏高。深挖原因后发现问题出在失锁期间的滤波器状态中水平速度误差和航向角误差之间的耦合关系加速度计的水平比力估计一旦受航向误差影响位置误差将以二次曲线的增速累积。单纯靠调小过程噪声不能解决问题反而会让滤波器对误差的估计变得迟钝。最终采用的一个有效补救措施是在GPS失锁期间利用列车动力学约束作为虚拟量测。列车沿轨道运行垂直于轨道方向的位移受约束这一约束可以作为等效的量测方程写入滤波器。同时列车的转向受最小转弯半径限制据此可以对航向变化率设定弱约束。加入虚拟约束后同样80秒的GPS失锁场景位置误差从无约束时的10米以上压到了6米以内。4.3 自适应窗口长度与GPS数据率的匹配问题在调试过程中我还发现一个细节滑动窗口长度必须和实际GPS数据率匹配而不是只看滤波周期。如果滤波器在100毫秒周期运行但GPS数据只有1赫兹更新那么一个长度为10的窗口实际覆盖的是10秒的数据而不是1秒。这会导致自适应估计响应极慢GPS信号质量突变后要花很久才能把噪声协方差调整过来。解决方法是把窗口统计的触发条件改为“仅在每次收到新GPS量测时才执行一次样本更新”并且窗口长度按GPS量测的点数计算。调整后自适应响应速度与GPS数据率挂钩问题迎刃而解。这套方案跑完我个人最大的体会是组合导航算法真正难的地方不在“推导公式”而在“让公式在工程条件下活下去”。自适应卡尔曼滤波并非什么高深莫测的魔法本质上是给标准滤波器加上了“感知环境变化”和“自我调整”的能力但每个策略背后都要付出额外参数整定的代价。做这个项目时我花在“调参”和“排查发散”上的时间远远多于写算法本身的时间。如果后续要继续深化一个很自然的方向是引入视觉或轨道地图匹配作为额外的量测源在GPS长时间失效时进一步约束SINS误差漂移。另外把自适应策略从松组合扩展到紧组合利用GPS原始伪距在卫星数不足场景下继续输出位置修正也是一个很值得尝试的升级路径。列车定位这件事永远都有从“9分好”做到“10分好”的空间而工程细节恰恰决定了那最后1分。
返回列表