1. RTK/INS紧组合技术概述RTK实时动态定位和INS惯性导航系统的紧组合技术是当前高精度导航定位领域的重要发展方向。简单来说RTK通过接收卫星信号实现厘米级定位但在信号遮挡环境下性能下降INS依靠惯性传感器自主推算位置但存在误差累积问题。两者结合可以优势互补形成更鲁棒的导航系统。我第一次接触这项技术是在2015年的一个无人机项目中。当时团队遇到城市峡谷环境下的定位漂移问题传统RTK方案频繁失锁。尝试引入低成本的MEMS-IMU后定位连续性明显改善但松组合方案在GNSS信号中断时的位置误差仍然较大。这促使我们深入研究紧组合算法。紧组合的核心思想是将GNSS原始观测值伪距、载波相位直接与INS状态估计融合而不是像松组合那样先独立解算GNSS位置再与INS结果融合。这种深度融合带来了三大优势更高的鲁棒性即使可见卫星少于4颗系统仍能工作更好的精度利用INS短期高精度特性辅助周跳检测和模糊度解算更强的连续性IMU数据可以填补GNSS信号短暂中断的空白在iGnav项目中紧组合算法通过几个关键函数实现tcigpos()紧组合入口函数updateins()INS机械编排核心propinss()状态预测与协方差传播rtkpos()GNSS定位引擎2. 紧组合算法原理详解2.1 系统架构与数据流iGnav的紧组合处理流程可以概括为以下步骤时间同步精确对齐IMU和GNSS观测数据的时间戳INS机械编排利用IMU数据更新姿态、速度和位置GNSS残差计算生成伪距和载波相位的双差观测值卡尔曼滤波融合INS预测与GNSS观测更新状态估计时间对齐是关键的第一步。项目中我们使用以下代码实现微秒级同步if (syn-ni syn-nr) { syn-dt[0] time2gpst(syn-time[2],NULL) - time2gpst(syn-time[0],NULL); }2.2 状态方程与观测方程紧组合卡尔曼滤波的状态向量通常包含位置、速度、姿态误差9维IMU零偏误差6维GNSS模糊度参数n维状态转移矩阵Φ的构建需要考虑IMU误差特性。在iGnav中我们采用一阶马尔可夫过程建模传感器零偏/* 状态转移矩阵构造 */ if (opt-exphi) { precPhi(opt,dt,ins-Cbe,ins-re,ins-omgb,ins-fb,phi); } else { getPhi1(opt,dt,ins-Cbe,ins-re,ins-omgb,ins-fb,phi); }观测方程将GNSS双差伪距和载波相位与状态向量关联。对于伪距双差观测值ρ∇其观测方程可表示为ρ∇ |rᵣˢ¹ - rᵣ| - |rᵣˢ² - rᵣ| - |rᵦˢ¹ - rᵦ| |rᵦˢ² - rᵦ| ε其中rᵣ、rᵦ分别表示流动站和基站位置rˢ表示卫星位置。2.3 模糊度处理策略载波相位模糊度固定是获得厘米级精度的关键。iGnav采用LAMBDA算法进行模糊度解算但在紧组合框架下做了特殊处理利用INS提供的姿态信息约束基线矢量当卫星数不足时仍可输出浮点解增加INS速度辅助的Doppler观测值实际测试表明这种策略在城市环境中将模糊度固定成功率提高了约30%。3. 关键代码实现解析3.1 INS机械编排实现updateins()函数实现INS的核心机械编排算法主要包括姿态更新使用四元数微分方程rvec2quat(domgb, dqb); quatmulx(qk_1, dqb, qtmp); normquat(qk); quat2dcmx(qk, ins-Cbe);速度更新考虑科氏力和重力影响for (i0;i3;i) { ins-ve[i] dvfk[i] (ge[i] - 2.0*wv[i])*dt; }位置更新采用梯形积分for (i0;i3;i) { ins-re[i] 0.5*(vek_1[i]ins-ve[i])*dt; }实测发现使用MEMS-IMU时姿态更新频率至少需要200Hz才能保证积分精度。3.2 紧组合滤波实现tcigpos()是紧组合的主入口函数其主要流程包括INS状态预测if (!updateins(insopt, ins, imu)) { trace(2,ins mechanization update fail\n); return 0; }状态协方差传播propinss(ins, insopt, ins-dt, ins-x, ins-P);GNSS观测更新if (obs imu n) { info rtkpos(rtk, obs, nunr, nav); }一个容易出错的细节是时间同步处理。我们曾遇到因IMU和GNSS时间戳未对齐导致的定位跳变最终通过增加时间校验逻辑解决if (fabs(dt) 3.0) { trace(2,observation and imu sync error\n); info 0; }3.3 双差残差计算ddres()函数实现双差残差计算和设计矩阵构建。对于紧组合需要特别处理INS相关状态的设计矩阵/* 位置参数偏导数 */ jacob_dd_dp(rtk-ins, e[iu[i]*3], e[iu[j]*3], dp); Hi[xiP(insopt)0] dp[0]; Hi[xiP(insopt)1] dp[1]; Hi[xiP(insopt)2] dp[2]; /* 姿态参数偏导数 */ jacob_dd_da(rtk-ins, e[iu[i]*3], e[iu[j]*3], da); Hi[xiA(insopt)0] da[0]; Hi[xiA(insopt)1] da[1]; Hi[xiA(insopt)2] da[2];4. 工程实践与调优经验4.1 参数配置建议根据多个项目经验推荐以下参数设置参数推荐值说明IMU更新频率100-200HzMEMS-IMU典型值GNSS更新频率1-10Hz根据应用需求调整过程噪声Q_pos0.01位置过程噪声(m^2/s)Q_vel0.1速度过程噪声(m^2/s^3)观测噪声R_code1.0伪距观测噪声(m^2)R_phase0.01载波观测噪声(m^2)4.2 常见问题排查发散问题检查IMU和GNSS时间同步确保误差在1ms内精度下降验证IMU标定参数特别是温度补偿模型固定率低调整模糊度方差初始值建议设为0.1-0.3周曾遇到一个典型案例某车载设备在隧道出口处定位漂移达5米。分析发现是IMU温度变化导致零偏突变通过增加温度补偿模块后漂移控制在0.3米内。4.3 性能优化技巧并行计算将机械编排和滤波更新分配到不同CPU核心内存优化预分配矩阵内存避免实时分配算法简化在动态较低场景使用简化姿态更新算法实测表明通过SIMD指令优化矩阵运算可将计算耗时降低40%/* 使用SSE指令优化矩阵乘法 */ _mm_store_ps(C[0], _mm_add_ps(_mm_mul_ps(_mm_load_ps(A[0]), _mm_set1_ps(B[0])), _mm_mul_ps(_mm_load_ps(A[4]), _mm_set1_ps(B[4]))));5. 测试验证与结果分析5.1 静态测试数据在开阔环境下的静态测试结果指标RTK单独紧组合提升幅度水平精度(RMS)1.2cm1.1cm8%高程精度(RMS)2.1cm1.8cm14%初始化时间45s28s38%5.2 动态场景测试城市道路测试结果对比场景RTK可用率紧组合可用率开阔道路99.8%99.9%城市峡谷62.3%89.7%隧道内0%100%特别是在GNSS完全遮挡的隧道场景紧组合凭借INS推算仍能维持2分钟内1%距离的定位精度。5.3 不同IMU等级对比测试了三种IMU的性能表现IMU类型价格区间水平误差(60s断片)消费级MEMS$10-5015-30m工业级MEMS$100-5003-8m战术级FOG$10k0.5-1.5m对于大多数应用工业级MEMS在成本和性能间取得了较好平衡。我们在农业机械项目中使用$200级别的6轴IMU实现了断片30秒内误差小于2米的性能。