首页 / 资讯中心 / 文章详情

GNSS欺骗检测与IMU融合:从原理到MATLAB实现

GNSS欺骗检测与IMU融合:从原理到MATLAB实现 ★ FEATURED ARTICLE
简介这份资源围绕全球导航卫星系统GNSS中的欺骗攻击与欺骗检测算法展开面向卫星导航安全方向的研究人员、工程师及定位技术开发者重点解决GNSS信号易被伪造、定位结果遭恶意操纵的问题。内容以IMU与GNSS融合定位为主线讲解如何借助惯性测量单元的连续性与卫星导航的全球覆盖能力在信号受扰或遮蔽时维持定位连续性并在此基础上设计欺骗检测算法涵盖信号特征检测、位置与速度一致性检测、统计方法以及支持向量机、随机森林、神经网络等机器学习手段同时兼顾融合系统对敏感性与鲁棒性的双重要求。资源包共30个文件以xml文档结构、png示意图与jpg配图为主另有rels关系文件压缩包约1.99MB图文并茂便于对照理解算法原理与结果分析。文档附有Matlab代码读者可据此在实际定位系统中复现并验证欺骗检测流程已有44人学习下载适合作为该方向入门与工程实践的参考材料。1. GNSS 欺骗检测与 IMU 融合为什么单靠卫星定位已经不够用了做导航定位的同行这两年应该有个共同感受GNSS 接收机在城市峡谷、隧道口、高架桥下越来越容易“飘”而比飘更麻烦的是——它可能不是飘是被人为欺骗了。全球导航卫星系统GNSS的民用信号落地功率极低L1 频段信号到达地面时大约只有 -160 dBW 量级这个强度连背景热噪声都压不住所以只要有一台几十块钱的 SDR 发射一个稍强的同频伪信号接收机就可能被牵着走。这就是 GNSS 欺骗spoofing的物理基础也是为什么“欺骗检测”从一个学术冷门话题变成了无人机、自动驾驶、授时系统都绕不开的工程问题。单靠 GNSS 自身做欺骗检测有个天然短板接收机看到的观测量伪距、多普勒、载噪比都是它自己算出来的欺骗信号如果做得足够“干净”这些量在统计上可以非常像真信号。这时候就需要引入一个独立的、不依赖卫星的参考源——IMU惯性测量单元。IMU 靠加速度计和陀螺仪积分推算位置和姿态短时精度高、完全自主不受外部信号干扰。把 GNSS 和 IMU 做融合定位再用融合结果反过来检验 GNSS 观测量的一致性就能把很多“看起来正常”的欺骗揪出来。这篇笔记就按这个思路从原理到 MATLAB 代码把一套可复现的欺骗检测方案讲清楚适合做组合导航、无人机飞控、车载定位的工程师照着搭一遍。2. 欺骗信号长什么样从观测量异常到融合残差2.1 欺骗的三种典型形态与它们留下的痕迹要检测欺骗先得知道对手怎么出招。工程上常见的欺骗分三类。第一类是压制式干扰jamming严格说不是欺骗但它会让载噪比 C/N0 骤降、接收机失锁检测相对容易看 C/N0 曲线就能发现。第二类是转发式欺骗meaconing把真实信号录下来延迟再发伪距会整体偏移但多普勒和载波相位可能还对得上隐蔽性中等。第三类是生成式欺骗spoofing用软件定义无线电直接合成与真实星座一致的信号逐步把接收机的定位点“拉”到攻击者想要的位置这种最危险因为它可以让接收机全程不失锁定位结果平滑地跑偏。这三类留下的痕迹不一样。压制式看 C/N0 和失锁标志转发式看伪距残差的突变生成式最难得看伪距率与多普勒的一致性、多星座之间的一致性以及和 IMU 推算轨迹的偏离。我一般会把检测分成两层第一层是 GNSS 内部一致性检测第二层是 GNSS/IMU 融合残差检测。前者快但容易被绕过后者慢但更难骗。2.2 用 IMU 做参考融合残差为什么能暴露欺骗核心思路一句话IMU 在短时间内几秒到几十秒推算的位移是可信的如果 GNSS 报出来的位置和 IMU 推算的位置差得离谱而 IMU 本身没坏那大概率是 GNSS 出了问题。数学上用一个松组合的卡尔曼滤波器状态量取位置、速度、姿态误差和 IMU 零偏GNSS 位置作为量测。滤波器正常收敛时新息innovation即量测减去预测应该是零均值白噪声一旦 GNSS 被欺骗新息会出现持续偏置。对这个新息做卡方检验就能给出欺骗告警。这里有个关键参数检测窗口长度。窗口太短虚警多窗口太长检测延迟大。经验上对生成式欺骗1 到 2 秒的滑动窗口配合 3 到 5 倍标准差的阈值比较稳。下面这张表是我在调参时常用的参考范围。检测量正常范围告警阈值说明位置新息归一化残差 2σ 3σ 持续 1s最灵敏但受 IMU 零偏影响速度新息残差 2σ 3.5σ对转发式欺骗敏感C/N0 均值35~50 dB-Hz突降 8 dB压制式干扰首选伪距率与多普勒差 1 m/s 3 m/s生成式欺骗的破绽2.3 最小可复现的融合框架搭建步骤动手之前先把框架定下来不然后面代码会乱。我一般按这五步走第一步准备 GNSS 观测量伪距、伪距率、位置解和 IMU 数据加速度、角速度时间对齐到同一频率通常 IMU 100 Hz、GNSS 10 Hz。第二步IMU 预积分得到相邻 GNSS 历元间的相对位移和速度增量。第三步卡尔曼滤波预测与更新GNSS 位置作为量测。第四步保存每个历元的新息和协方差。第五步对新息序列做滑动窗口卡方检验输出欺骗标志。这五步在 MATLAB 里用不到两百行就能跑通下面章节给关键代码。3. MATLAB 实现从 IMU 预积分到卡方检验的完整链路3.1 数据准备与时间对齐的代码骨架先把数据读进来并对齐。假设 GNSS 数据是 10 HzIMU 是 100 Hz用插值把 IMU 对齐到 GNSS 历元之间做预积分。下面这段是骨架实际数据字段名按自己的改。% 读取 GNSS 与 IMU 数据假设已存为结构体 gnss 和 imu % gnss.t 时间戳(s), gnss.pos Nx3 位置(ECEF, m), gnss.vel Nx3 速度 % imu.t 时间戳(s), imu.acc Nx3 比力(m/s^2), imu.gyro Nx3 角速度(rad/s) gnss.t gnss.t - gnss.t(1); imu.t imu.t - imu.t(1); % 以 GNSS 历元为节点找每个区间内的 IMU 样本做预积分 N length(gnss.t); dt_gnss median(diff(gnss.t)); % 通常 0.1 s preint struct(dpos, cell(N-1,1), dvel, cell(N-1,1)); for k 1:N-1 idx imu.t gnss.t(k) imu.t gnss.t(k1); acc_seg imu.acc(idx,:); gyro_seg imu.gyro(idx,:); dt_imu diff([imu.t(idx); gnss.t(k1)]); % 简化预积分忽略地球自转与哥氏项短时足够 dvel sum(acc_seg .* dt_imu, 1); dpos cumsum(acc_seg .* dt_imu, 1); preint(k).dvel dvel; preint(k).dpos dpos(end,:); end这段代码的逻辑是把两个 GNSS 历元之间的 IMU 数据积分成相对位移和相对速度增量作为卡尔曼预测的输入。参数上dt_gnss决定滤波更新频率idx的边界用左闭右开避免重复计入。注意这里做了简化没考虑地球自转和重力补偿短时1 s预积分误差在厘米级对欺骗检测够用如果要高精度得把重力向量和哥氏项补上。3.2 卡尔曼滤波预测与更新新息是怎么算出来的滤波器的状态取 15 维位置误差、速度误差、姿态误差、加速度零偏、陀螺零偏。预测用 IMU 预积分结果更新用 GNSS 位置。关键是保存新息nu和其协方差S后面卡方检验要用。% 状态: [dpos(3) dvel(3) datt(3) ba(3) bg(3)] nx 15; x zeros(nx,1); P diag([10^2*ones(1,3), 1^2*ones(1,3), (1*pi/180)^2*ones(1,3), ... 0.1^2*ones(1,3), (0.1*pi/180)^2*ones(1,3)]); Q diag([0.01^2*ones(1,3), 0.05^2*ones(1,3), (0.05*pi/180)^2*ones(1,3), ... 0.001^2*ones(1,3), (0.001*pi/180)^2*ones(1,3)]); R diag([2^2 2^2 2^2]); % GNSS 位置量测噪声约 2 m nu_log zeros(N-1,3); S_log zeros(3,3,N-1); for k 1:N-1 % 预测用预积分位移推进位置 x(1:3) x(1:3) preint(k).dpos; x(4:6) x(4:6) preint(k).dvel; F eye(nx); % 简化状态转移实际需按误差方程展开 P F*P*F Q; % 更新GNSS 位置作为量测 H [eye(3) zeros(3, nx-3)]; z gnss.pos(k1,:) - (gnss.pos(k,:) preint(k).dpos); nu z - H*x; S H*P*H R; K P*H/S; x x K*nu; P (eye(nx) - K*H)*P; nu_log(k,:) nu; S_log(:,:,k) S; end逻辑说明z是 GNSS 位置增量与 IMU 预积分增量的差nu是新息。S是新息协方差卡方统计量就是nu * inv(S) * nu。参数上R取 2 m 是普通单点定位的水平如果用了 RTK 可以降到 0.05 m检测灵敏度会明显提高Q里的零偏噪声决定滤波器对 IMU 漂移的容忍度调太小会导致虚警。3.3 卡方检验与滑动窗口把新息变成告警有了新息序列做滑动窗口卡方检验。窗口长度取 10 个历元1 秒统计量超过阈值就告警。win 10; % 1 秒窗口 thr chi2inv(0.999, 3*win); % 自由度 3*win 的卡方阈值 alarm false(N-1,1); for k win:N-1 nu_win nu_log(k-win1:k,:); S_win S_log(:,:,k-win1:k); stat 0; for j 1:win stat stat nu_win(j,:) * (S_win(:,:,j) \ nu_win(j,:)); end if stat thr alarm(k) true; end end fprintf(检测到欺骗历元数: %d / %d\n, sum(alarm), N-1);这里chi2inv(0.999, 3*win)是置信度 99.9% 的卡方阈值自由度是 3 乘窗口长度因为每个历元有 3 维位置新息。窗口越长阈值越高虚警越少但延迟越大。我一般先用 1 秒窗口跑一遍看虚警率如果虚警多就把置信度降到 0.99 或加长窗口。注意S_win(:,:,j) \ nu_win(j,:)用的是左除等价于乘逆数值上更稳。4. 避坑与排查调这套算法时最容易翻车的五个地方4.1 时间戳没对齐新息全程偏置现象滤波器一跑起来新息就很大卡方检验从头到尾告警但数据其实没被欺骗。原因GNSS 和 IMU 的时间戳基准不一致比如一个用 GPS 周内秒、一个用本地时钟差了几十毫秒预积分位移就对不上。解决先做时间对齐用互相关找两组数据的时间偏移或者直接用硬件 PPS 同步。我一般会在预处理里加一句检查median(diff(gnss.t))和median(diff(imu.t))是否符合预期频率。4.2 IMU 零偏没标定慢速欺骗被当成正常漂移现象生成式欺骗缓慢拉偏位置检测不出来。原因IMU 加速度零偏没标定滤波器把 GNSS 的偏移“解释”成了 IMU 漂移新息被吸收掉。解决上电后先静止 30 秒做零偏估计把ba、bg初值设准或者在滤波里给零偏加一个较强的先验约束。血泪经验是零偏没标定的 IMU做欺骗检测基本等于裸奔。4.3 量测噪声 R 设得太大检测灵敏度被吃掉现象欺骗已经让位置偏了十几米卡方统计量还是没过阈值。原因R设得过大新息协方差S被撑大统计量被压低。解决R要按实际 GNSS 精度设单点定位 2 到 5 mRTK 0.05 m 以内。可以先用一段无欺骗数据统计新息的实际方差反推R是否合理。这个参数是检测灵敏度的命门别拍脑袋。4.4 窗口长度和置信度不匹配虚警和漏检两头堵现象窗口取 5 个历元虚警一堆取 50 个历元欺骗都结束了才告警。原因窗口长度和卡方阈值没协同调。解决先固定置信度 0.99把窗口从 5 试到 20画 ROC 曲线看哪个点虚警和漏检平衡最好。工程上 1 到 2 秒窗口是甜点区。如果算力允许可以用 CUSUM 累积和替代固定窗口对缓慢欺骗更敏感。4.5 只做 GNSS 内部检测被生成式欺骗绕过现象C/N0 正常、伪距率一致内部检测全绿但位置已经偏了。原因生成式欺骗可以模仿真实信号的所有内部特征。解决必须上 IMU 融合残差这一层两层检测做与逻辑或加权。单靠 GNSS 内部量面对高质量欺骗就是黑匣子看不出问题。这也是这套方案存在的意义。5. 进阶技巧用残差序列做欺骗方向估计与验证检测出欺骗只是第一步能估计出“被往哪个方向拉”才是进阶。做法是对告警窗口内的新息序列做平均得到位置偏移向量再结合 IMU 推算的航向判断欺骗是往东、北还是某个斜方向拉。这个方向信息对后续的抗欺骗策略比如切换星座、剔除某颗星很有用。下面这段代码在告警历元上估计偏移方向。if any(alarm) idx_alarm find(alarm); nu_mean mean(nu_log(idx_alarm,:), 1); % 平均新息向量 dir nu_mean / norm(nu_mean); fprintf(欺骗偏移方向(ECEF单位向量): [%.3f %.3f %.3f]\n, dir); fprintf(偏移量级: %.2f m\n, norm(nu_mean)); end逻辑上nu_mean是告警期间新息的均值方向就是 GNSS 被拉偏的方向量级反映拉偏速度。参数上如果告警历元太少少于 3 个方向估计不稳可以扩大窗口或降低阈值先攒够样本。验证方法拿一段已知欺骗注入的数据跑看估计方向和注入方向是否一致误差在 30 度以内就算可用。再补一个验证习惯我一般会把检测结果和原始轨迹画在一张图上用不同颜色标出告警段肉眼确认告警是否对应轨迹的异常拐点。这一步能抓出很多参数没调好导致的误报。另外如果手头有双频或多星座数据可以加一个跨星座一致性检验作为第三层生成式欺骗很难同时骗过所有星座的所有频点。这套方案值不值得投入如果你的场景是无人机、自动驾驶或授时答案是值得因为 GNSS 被欺骗的代价远高于加一个 IMU 和几百行检测代码的成本。最后一句教训别等定位飘了才想起 IMU融合检测要一开始就设计进系统事后补的检测永远是后悔药。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站