07_kfinit_153 逐行注释 Wiki (PSINS)¶
配套源码: kfinit.m 关联源码: kfhk.m / kfinit0.m / kfsetting.m / etm.m 所属层级: L3 组合导航 SINS/GPS松组合 前置依赖: 00_glvf / 03_insupdate / 08_kffk / 09_kfupdate 学习目标: 读完回答3个问题
- 15状态向量 \(\boldsymbol{X}=[\phi^T,\delta v_n^T,\delta p^T,\varepsilon_b^T,\nabla_b^T]^T\) 的索引编号1~15分别对应什么?etm.m 的F阵分块与此顺序如何对应?
- P0对角线上
10″²、(0.1m/s)²、(0.01°/h)²这些量级的工程依据是什么?单位如何从 deg/arcsec/°/h 换算到 SI 单位 rad/(rad/s)/(m/s²)?- 对于 case 153,kf.Hk 为什么是
[zeros(3,6), eye(3), zeros(3,6)]?如果把第7~9列与第1~3列写反了,会出现什么现象?
🧩 函数作用一句话¶
根据 psinsdef.kfinit 标志位(153=15状态+3位置观测)对 SINS/GPS 松组合卡尔曼滤波器进行初始化:设定系统噪声协方差 Qt、观测噪声协方差 Rk、初始均方误差阵 Pxk、观测矩阵 Hk,并调用 kfinit0 填充所有其余 KF 结构字段(Pmin/Pmax、adaptive、pconstrain等开关)。
📐 数学原理 / 物理意义¶
1. 15状态定义(状态顺序编号表)¶
PSINS 中 SINS/GPS 松组合 15 维误差状态向量严格定义为:
| 编号 | 符号 | 物理量 | 单位(SI) | 典型初值σ(P0对角线开平方) | etm.m F阵分块行/列 |
|---|---|---|---|---|---|
| 1 | \(\phi_E\) | 东向姿态误差角(俯仰绕E轴) | rad | \(10″ \approx 4.85\times10^{-5}\) rad | 第1行:Maa块(φ→φ) |
| 2 | \(\phi_N\) | 北向姿态误差角(滚转绕N轴) | rad | \(10″ \approx 4.85\times10^{-5}\) rad | 第2行:Maa块 |
| 3 | \(\phi_U\) | 天向(方位)姿态误差角 | rad | \(30″ \approx 1.45\times10^{-4}\) rad(航向通常较松) | 第3行:Maa块 |
| 4 | \(\delta v_E\) | 东向速度误差 | m/s | 0.1 m/s | 第4行:Mva块(φ→δv) |
| 5 | \(\delta v_N\) | 北向速度误差 | m/s | 0.1 m/s | 第5行:Mva块 |
| 6 | \(\delta v_U\) | 天向速度误差 | m/s | 0.1 m/s | 第6行:Mva块 |
| 7 | \(\delta L\) | 纬度误差 | rad | \(10m/R_M \approx 1.57\times10^{-6}\) rad | 第7行:O33+Mpv块(δv→δp) |
| 8 | \(\delta \lambda\) | 经度误差 | rad | \(10m/(R_N\cos L) \approx 1.57\times10^{-6}\) rad | 第8行:Mpv块 |
| 9 | \(\delta h\) | 高度误差 | m | 10 m(直接米) | 第9行:Mpv块(3,3)=1 |
| 10 | \(\varepsilon_{b,x}\) | 陀螺x轴零偏(b系) | rad/s | \(0.01°/h \approx 4.85\times10^{-8}\) rad/s | 第10行:zeros + diag(-1/τG) |
| 11 | \(\varepsilon_{b,y}\) | 陀螺y轴零偏 | rad/s | \(0.01°/h \approx 4.85\times10^{-8}\) rad/s | 第11行 |
| 12 | \(\varepsilon_{b,z}\) | 陀螺z轴零偏 | rad/s | \(0.01°/h \approx 4.85\times10^{-8}\) rad/s | 第12行 |
| 13 | \(\nabla_{b,x}\) | 加计x轴零偏(b系) | m/s² | \(10\mu g \approx 9.8\times10^{-5}\) m/s² | 第13行:diag(-1/τA) |
| 14 | \(\nabla_{b,y}\) | 加计y轴零偏 | m/s² | \(10\mu g \approx 9.8\times10^{-5}\) m/s² | 第14行 |
| 15 | \(\nabla_{b,z}\) | 加计z轴零偏 | m/s² | \(10\mu g \approx 9.8\times10^{-5}\) m/s² | 第15行 |
etm.m 分块对应(见 etm.m:67-70):
行/列的大顺序:姿态φ(3) → 速度δv(3) → 位置δp(3) → 陀螺零偏εb(3) → 加计零偏∇b(3)。顺序错任何一个都会导致 F×P、P×Fᵀ、H×P、K×残差 全部维度对不上。
2. P0 初值为什么是这些量级?¶
初始协方差阵 \(P_0 = diag(\sigma_1^2, \sigma_2^2, \dots, \sigma_{15}^2)\) 的每条对角线工程含义:
| 状态组 | 典型σ | 工程依据 |
|---|---|---|
| φ (1-3) | \(10″ \sim 30″\) | SINS初始对准精度:惯导精对准后水平姿态≈10″,方位≈30″;粗对准更差 |
| δv (4-6) | 0.1 m/s | 初始速度来自 DVL/GPS 测速或静基座清零,量级约 0.05~0.2 m/s |
| δp (7-9) | 10 m | GPS单点定位(C/A码)典型水平精度 ~10m (CEP),高度~15m |
| εb (10-12) | \(0.01°/h\) | 光纤/激光陀螺中等精度:战术级 0.01~1°/h;导航级 0.001~0.01°/h |
| ∇b (13-15) | \(10\mu g\) | 石英加计典型零偏:战术级 10~1000μg;导航级 1~50μg |
3. Q 阵驱动噪声:ARW/VRW 的量级换算¶
SINS 的连续系统噪声 \(w(t)\) 来自陀螺角度随机游走(ARW)和加计速度随机游走(VRW):
常用单位换算表(使用 glv 常量):
| 随机游走类型 | 工程常用单位 | glv常量 | 换算到SI单位 | 公式 \(Q = \sigma^2 \cdot \Delta t\) |
|---|---|---|---|---|
| ARW(角度随机游走) | \(°/\sqrt{h}\) | glv.dpsh | rad/√s | \(Q_{\phi\phi} = \left(\frac{0.1°/\sqrt{h} \times glv.dpsh}{1°/\sqrt{h}}\right)^2 \times \Delta t\) |
| VRW(速度随机游走) | \(m/s/\sqrt{h}\) 或 \(\mu g/\sqrt{Hz}\) | glv.ugpsHz, glv.mpspsh | m/s²/√Hz → (m/s²)²·s | \(Q_{\delta v \delta v} = (10\mu g/\sqrt{Hz} \times glv.ugpsHz)^2 \times \Delta t\) |
| 陀螺零偏激励 | \((°/h)/\sqrt{h}\) | glv.dphpsh | (rad/s)/√s | Gauss-Markov 模型 \(\dot{\varepsilon}_b = -\varepsilon_b/\tau_G + w_G\),\(Q_{GG} = \sigma_G^2 / \tau_G\) 或 PSINS 中直接写在 Qt 对角线上 |
| 加计零偏激励 | \(\mu g/\sqrt{h}\) | glv.ugpsh | (m/s²)/√s | 同上,\(\dot{\nabla}_b = -\nabla_b/\tau_A + w_A\) |
PSINS kfinit(153)中具体写法:
即只在前6个驱动噪声口(φ的3个ARW + δv的3个VRW)输入非零白噪声,后9个状态(δp, εb, ∇b)在连续系统模型里由F阵耦合,不在Qt上直接加驱动。4. Rk 观测噪声:GPS位置各向不同¶
松组合位置观测模型 \(\boldsymbol{Z}_k = \boldsymbol{p}_{SINS} - \boldsymbol{p}_{GPS}\),其协方差:
工程依据: - 水平方向 GPS C/A 码单点定位 ≈ 3~5m (1σ);DGPS/SBAS ≈ 0.5~1m;RTK ≈ 1~5cm - 高度方向 GDOP 放大 ≈ 1.5~2×,所以 5m 对应水平 3m - 如果第7~8状态(δL, δλ)用 rad,而 GPS 观测给的是米,需要先通过 poserrset 把米转成 rad(除 RMh/RNhcosL),kfsetting.m 第51行 Rk(4:5) = Rk(4:5)/glv.Re 就是这个处理。
📝 逐行注释 (4列: 行号 / 原代码 / 中文注释 / 公式备注)¶
| 行号 | 原代码 | 中文注释 | 公式备注 |
|---|---|---|---|
| 1 | function kf = kfinit(ins, varargin) | KF初始化函数入口,输入SINS结构ins+可变参数 | ins可以是struct或标量nts;varargin按kfinit标志不同解析 |
| 2 | % Kalman filter initializes for structure array 'kf', this precedure | 说明:KF结构初始化,通常设置Qt、Rk、Pxk、Hk | — |
| 3 | % usually includs the setting of structure fields: Qt, Rk, Pxk, Hk. | 四个核心字段 | 连续噪声强度Qt→离散Qk=Qt×nts;Rk直接是离散观测协方差 |
| 4 | % | 空 | — |
| 5 | % Prototype: kf = kfinit(ins, varargin) | 原型 | — |
| 6 | % Inputs: ins - SINS structure array, if not struct then nts=ins; | ins=结构体取ins.nts,否则ins直接当作nts(采样总时间) | — |
| 7 | % varargin - if any other parameters | 可变参数:按分支解析davp/imuerr/rk/lever/dT等 | — |
| 8 | % Output: kf - Kalman filter structure array | 输出完成初始化的KF结构 | — |
| 9 | % | 空 | — |
| 10 | % See also kfinit0, kfsetting, kffk, kfkk, kfupdate, kffeedback, psinstypedef. | 相关函数:kfinit0=补齐剩余字段,kfsetting=直接设定P0/Q0/R0 | psinstypedef 设置 psinsdef.kfinit=153等标志 |
| 11 | |||
| 12 | % Copyright(c) 2009-2014, by Gongmin Yan, All rights reserved. | 版权 | — |
| 13 | % Northwestern Polytechnical University, Xi An, P.R.China | 单位 | — |
| 14 | % 09/10/2013 | 日期 | — |
| 15 | global glv psinsdef | 声明全局变量:glv单位常量;psinsdef模式标志 | psinsdef.kfinit=153/156/183/...;psinsdef.kffk=状态维度;psinsdef.kfhk=观测模式 |
| 16 | [Re,deg,dph,ug,mg] = ... % just for short | 提取常用单位简写 | 原代码只取了前5,后续ug=glv.ug |
| 17 | setvals(glv.Re,glv.deg,glv.dph,glv.ug,glv.mg); | 按顺序赋值 Re,deg,dph,ug,mg | Re≈6378137m; deg=π/180; dph=deg/3600≈4.848e-6 rad/s; ug=1e-6×g0≈9.81e-6 m/s²; mg=1e-3g0 |
| 18 | o33 = zeros(3); I33 = eye(3); | 预分配常用3×3零/单位阵(虽然本函数未直接用) | etm.m和kffk中大量用到 |
| 19 | kf = []; | 先置空结构体,避免上次残留值 | — |
| 20 | if isstruct(ins), nts = ins.nts; | 若ins是SINS结构体→取其累积时间nts=ins.nts | 153组合通常ins是struct,kffk需要ins做F阵 |
| 21 | else nts = ins; | 否则ins是标量,直接作为nts | 常用于纯仿真无SINS结构的场景 |
| 22 | end | if结束 | — |
| 23 | switch(psinsdef.kfinit) | 按psinsdef.kfinit标志分发到不同分支 | psinstypedef(153) 会把 psinsdef.kfinit 设为 kfinit153 |
| 24 | case psinsdef.kfinit153 | ★分支:15状态 + 3位置观测(SINS/GPS松组合位置-only) | kffk=15, kfhk=153 |
| 25 | psinsdef.kffk = 15; psinsdef.kfhk = 153; psinsdef.kfplot = 15; | 设置3个配套标志:状态数15、观测153、画图维度15 | kffk=15→kffk.m里F阵出15×15;kfhk=153→kfhk出3×15的H;kfplot=15→kfplot按15组分图 |
| 26 | [davp, imuerr, rk] = setvals(varargin); | 解析varargin 3个入参:davp=avp初误差;imuerr=IMU误差参数;rk=观测噪声 | 顺序必须对:调用方式 kf = kfinit(ins, davp0, imuerr, rk) |
| 27 | kf.Qt = diag([imuerr.web; imuerr.wdb; zeros(9,1)])^2; | ★连续系统噪声强度矩阵Qt(15×15)对角:前3=ARW(φ驱动),4-6=VRW(δv驱动),后9状态不直接驱动 | imuerr.web=3×1 陀螺白噪声σ(°/√h→SI);imuerr.wdb=3×1加计白噪声σ(μg/√Hz→SI);平方是因为Qt=diag(σ)²;后9项靠F阵传递噪声 |
| 28 | kf.Rk = diag(rk)^2; | ★观测噪声Rk(3×3)对角:rk是各观测量σ,平方后成方差 | rk通常=rk = poserrset([3;3;5])→先把米转rad/m,Rk对应 δL², δλ², δh² 的协方差 |
| 29 | kf.Pxk = diag([davp; imuerr.eb; imuerr.db]*1.0)^2; | ★初始协方差P0(15×15)对角:davp=[φ;δv;δp]9个 + imuerr.eb陀螺零偏σ3个 + imuerr.db加计零偏σ3个 = 正好15个 | 乘以1.0确保double类型;开平方=σ矢量;davp常由avperrset([10;10;30]glv.sec, 0.1, 10)生成;eb常由gabias(0.01glv.dph, 10*glv.ug)生成 |
| 30 | kf.Hk = kfhk(0); | ★观测矩阵Hk(3×15):调用kfhk(153分支) | kfhk.m第16-17行:case153 → Hk = [zeros(3,6), eye(3), zeros(3,6)]。含义:观测值Zk只对7-9号位置状态敏感,H=[0¦0¦I3¦0¦0] |
| 31 | case psinsdef.kfinit156 | 分支:15状态+6观测(位置+速度),见test_SINS_GPS_156 | 非本wiki重点,略 |
| 32 | psinsdef.kffk = 15; psinsdef.kfhk = 156; psinsdef.kfplot = 15; | 同上,Hk是6×15(取4-9号状态δv+δp) | — |
| 33 | [davp, imuerr, rk] = setvals(varargin); | 同153 | — |
| 34 | kf.Qt = diag([imuerr.web; imuerr.wdb; zeros(9,1)])^2; | 同153 | — |
| 35 | kf.Rk = diag(rk)^2; | 观测6维Rk | — |
| 36 | kf.Pxk = diag([davp; imuerr.eb; imuerr.db]*1.0)^2; | 同153 | — |
| 37 | kf.Hk = kfhk(0); | Hk= [zeros(6,3), eye(6), zeros(6,6)] (kfhk:18-19行) | — |
| 38 | case psinsdef.kfinit183 | 分支:15+3杠杆臂=18状态,3位置观测(SINS/GPS杆臂补偿) | 非重点 |
| 39-67 | (183,186,193,196,246分支...) | 含杆臂(18)、杆臂+钟差(19)、安装矩阵(24)等组合 | 非153重点,快速跳过 |
| 68 | case psinsdef.kfinit246 | 24状态=15+9安装误差矩阵dKga(9) | 246=24状态+6观测 |
| 69-82 | (303, 331, 333分支...) | 30+状态(高阶误差模型:Ka2二次项等) | — |
| 83-131 | (343, 346, 373, 376分支...) | 34=15+3+1+15(杠杆+钟差+Kg);37=34+3速度额外状态 | — |
| 132 | otherwise | 以上都不匹配→通过feval扩展 | — |
| 133 | kf = feval(psinsdef.typestr, psinsdef.kfinittag, [{ins},varargin]); | 用户自定义kfinit回调:在自定义typestr类型文件中实现kfinittag方法 | 扩展接口 |
| 134 | end | switch分支结束 | — |
| 135 | kf = kfinit0(kf, nts); | ★★★调用kfinit0:补齐KF结构中所有默认值,这是最容易漏看的一行 | 见下方kfinit0关键作用:Qk=Qt×nts离散化;Pmax/Pmin默认值;adaptive/pconstrain开关;xk初值0;Kk/Hk尺寸;fading/xtau/coef_fb反馈系数等 |
附:kfinit0.m 中的关键字段(由第135行自动设置)¶
| 字段 | 来源行 | 默认值/公式 | 含义 |
|---|---|---|---|
kf.nts | kfinit0:5 | 输入nts | 离散KF时间步长,Qk=Qt×nts |
kf.xk | kfinit0:13 | zeros(n,1) | 初始状态误差估计全部为0(误差状态定义下,初始估计为"无误差") |
kf.Qk | kfinit0:14 | kf.Qt*kf.nts | ★离散化系统噪声:\(Q_k = Q_c \cdot \Delta t\)(白噪声Euler积分近似) |
kf.Pmax | kfinit0:34 | (diag(Pxk)+1)×1e10 | P上界:默认极大≈1e10倍P0,等价于无约束;若在kfsetting中显式设则覆盖 |
kf.Pmin | kfinit0:35 | 全0 | P下界:默认不收缩;kfsetting会重写为P0×1e-3左右,防止P太小时KF不信观测 |
kf.adaptive | kfinit0:20 | 0(关);kfsetting:60设1 | Sage-Husa自适应:adaptive=1时,在线调整Q/R阵;b=0.5遗忘因子,beta=1偏置 |
kf.pconstrain | kfinit0:33 | 0(关);kfsetting:61设1 | P协方差约束:pconstrain=1时,每次更新后将Pxk夹在[Pmin, Pmax]之间,防止数值发散 |
kf.fading | kfinit0:19 | 1(无遗忘) | 渐消因子:fading>1时旧数据权重降低 |
kf.xconstrain | kfinit0:32 | 0 | 状态硬约束开关 |
kf.T_fb / coef_fb | kfinit0:30,42 | T_fb=1秒 | 状态反馈时间常数:kffeedback不是一步全反馈,而是 coef_fb = T_fb / max(xtau, T_fb) 渐进反馈(防超调) |
🔍 断点调试建议¶
调试1:初始化后P对角线单位是否正确¶
- 在
/workspace/psins/demos/test_SINS_GPS_153_kfstat.m第18行kf = kfinit(...)后立即打断点; - 命令窗口执行:
- 预期结果:
- phi_sigma ≈ 10 arcsec,即约 4.848e-5 rad;
- eb_sigma ≈ 0.01 deg/h,即约 4.848e-8 rad/s;
- db_sigma ≈ 10 ug;
- 若差一个 3600、180/π、或 1e6 的倍数,说明 avperrset / gabias 调用时单位没乘 glv.sec / glv.dph / glv.ug。
调试2:第一次时间更新后 P(1,1) 增量量级验证¶
- 在第30行
kf = kfupdate(kf);第1次执行完后断点; - 比较
kf.Pxk(1,1)前后差值 ΔP11; - 预期量级:
若 ARW=0.1°/√h = 0.1×glv.dpsh rad/√s,则 Qt(1,1)=(0.1dpsh)²≈(4.85e-8)²≈2.35e-15 rad²/s;乘以nts=0.02s得 ΔP≈4.7e-17,所以 P(1,1) 从 (10″)²=2.35e-9 增加约 4.7e-17,增量是P0的~5e-8倍,几乎不变。 4. 如果发现 P(1,1) 一跳变几倍,那就是 Qt 里 ARW 单位换算错了(比如写成 0.1 dph 而非 0.1 dpsh,差 √3600≈60 倍 → 平方差3600倍)。
调试3:Hk矩阵的位置列是否真在第7~9列¶
断点下执行 spy(kf.Hk) 看稀疏图:3行×15列矩阵的第(1,7)(2,8)(3,9)位置必须是1,其余为0。如果发现1出现在(1,1)(2,2)(3,3),说明状态顺序与Hk错位了(比如误以为φ是第7~9),那观测残差会直接把姿态当位置观测,KF会完全失效。
❌ 初学者最容易踩的坑¶
坑1:15状态顺序搞混(φ/εb混序 或 δp与δv颠倒)¶
现象:kfupdate运行不报错,但kf.xk(1:3)姿态估计极大(几十度),位置误差几十km不收敛,残差 Z-Hk*xk 一开始就是巨大值。 典型错误顺序: - ❌ 错误:[φ(3); εb(3); δv(3); δp(3); ∇b(3)] → 后12号状态全错位 - ✅ 正确:[φ(3); δv(3); δp(3); εb(3); ∇b(3)] → etm.m分块顺序严格对应 验证方式:第1次kffk后,size(kf.Phikk_1)=15×15,且 sum(diag(kf.Phikk_1)) ≈15(F阵对角≈I,短Δt下离散化Φ≈I+FΔt对角≈15+trace(F)Δt)。
坑2:Pmin 设置太高(≥P0)导致 P 永远缩不下去¶
现象:KF跑很久后 sqrt(diag(kf.Pxk)) 基本不变,和P0一样大,状态估计xk虽然小但不是靠观测收的,而是"盲猜"。 原因:kfsetting里Pmin默认值如果写得和P0同量级(或者pconstrain=1时设置错),每次更新完 Pxk = max(Pxk, Pmin) 会把刚被观测缩小的P又"顶回去"。 正确范围:通常 Pmin ≈ P0 × 1e-3 ~ 1e-2。比如P0(φ)=10″,则Pmin(φ)=0.01″~0.1″,是物理上能收敛到的极限。
坑3:KF状态维度15与etm.m的F阵维度不一致¶
现象:kffk返回时直接报错 Inner matrix dimensions must agree,或者 Matrix dimensions must agree。 排查步骤: 1. 检查 psinsdef.kffk 是否=15(kfinit:25设了,但之前如果跑过别的demo可能还留18/19等); 2. etm.m 第16行默认 n=15,但kffk如果显式传n=18等就不对; 3. kf.Hk 维度:3×15对,但 Hk×Pxk×Hk' 报错说明 Pxk 不是15×15 → 往回找 Pxk 初始化错在哪。
坑4:观测噪声Rk单位没把"米"换成"rad"对经纬度¶
现象:纬度/经度误差收敛极慢(比预期慢1e6倍),高度正常。 原因:δL和δλ的单位是rad,而rk输入是米,需要 rk(1:2) = rk(1:2)/Re 预处理。kfsetting.m第51行 Rk(4:5) = Rk(4:5)/glv.Re 就是干这个。而 poserrset 函数也会自动转。如果手动写 rk=[3;3;5] 忘了除Re,Rk(1,1)=9 rad²≈(1000km)²,GPS观测几乎被KF"完全不信"。
坑5:adaptive=1开启但初始Q/R数量级差太远¶
现象:KF前几十秒Q阵或R阵被Sage-Husa自适应"跑飞",变成0或Inf。 原因:Sage-Husa自适应需要初始Q、R是同一量纲体系下大致正确的,否则Q太小→自适应补Q但一步调太大;R太大→自适应把R调0→残差=0→增益无穷大。 稳妥使用:前100秒 kf.adaptive=0 让P先自然收敛到合理值,之后再 kf.adaptive=1 开启自适应。
🎯 配套练习¶
练习1:把P0(1:3)从10″改到10°,观察收敛速度变慢多少¶
- 打开
/workspace/psins/demos/test_SINS_GPS_153_kfstat.m; - 第14行改为:
- 第17-18行保持rk不变,跑完整仿真;
- 对比原版(10″初误差)和修改版(10°初误差):
- 画出 φ_x(1号状态) vs t 两条曲线同一图上;
- 原版可能在前10秒φ就被观测拉到<1′;
- 修改版因为P0的φ分量大10⁸倍,KF前几秒几乎完全相信模型而非观测(因为 K=PHᵀ(HPHᵀ+R)⁻¹,H对应φ的部分=0,只能通过F阵耦合到δp才能被位置观测修正),可能要 300~1000秒 才能把10°误差逐步"传"到位置再收回来。
- 思考题:如果把GPS位置观测换成156速度+位置双观测,收敛速度会加快多少倍?(提示:Hk的δv对应位置非零,F中φ→δv是直接耦合Mva,比φ→δp快一个积分阶次)。
练习2:改变Rk量级观测权值,画出位置误差 vs Rk的曲线¶
- 固定P0和Qt,分别设
rk = poserrset([1;1;2])、[3;3;5]、[10;10;20]、[30;30;50]共4组; - 每组跑完取最后60s内位置RMSE平均
mean(sqrt(sum(xkpk(end-600:end,7:9).^2,2)))(注意xkpk里是xk还是diag(Pxk),看列索引); - 理论预期:当Rk≥P0×(HPHᵀ)量级后,KF"不信观测"→误差趋近纯SINS发散值;当Rk→0时,误差≈纯GPS精度+系统不可观部分(姿态/零偏由耦合定),不会随Rk减小继续下降。把4个(Rk_水平, RMSE_水平)点画在loglog图上,看是否存在一个"拐点"对应 Rk≈1~3m 正好是GPS单点精度区间。