1. udstate函数是什么?
**一句话:**
udstate() 本质上就是卡尔曼滤波的“时间更新(预测)步”,操作对象就是状态向量 rtk->x 和协方差 rtk->P。udstate() 做的事就是卡尔曼滤波的预测方程:

**更准确地说:**
- 状态向量 rtk->x:卡尔曼滤波的状态量,RTKLIB 按块排列(位置/速度/加速度、电离层、对流层、单差模糊度、GLONASS 硬件偏差)。
- 协方差 rtk->P:状态的不确定性。
**你应该看到了:**
udstate():不是状态向量本身,而是对状态向量和协方差执行预测的函数。
这句话可以这么理解:
函数 vs 数据
udstate() 是一个函数:一段可执行的代码,它做计算。
rtk->x 是一个数据结构:一个数组,存放在 rtk_t 结构体里,代表状态向量。
2. udstate() 的输出是什么?
严格来说,udstate() 没有返回值(返回类型是 void)。它不“输出”一个新的状态向量,而是就地修改已经存在的 rtk->x 和 rtk->P。

调用前后,rtk->x 这个数组一直存在,只是里面的数值被更新了。
所以更准确的说法是:
udstate() 是对已经存在的状态向量 rtk->x 和协方差 rtk->P 执行时间更新操作,就地修改它们的值。
3. 状态量(RTK->X)都包含什么?
卡尔曼滤波的状态量,RTKLIB 按块排列(位置/速度/加速度、电离层、对流层、单差模糊度、GLONASS 硬件偏差)。
1. udpos()
该函数主要为了更新位置/速度/加速度(由dynamics模型决定)。
如果dynamics==0:只使用位置(认为目标是静态);
如果dynamics== 1:位置+速度(认为目标是匀速运动);
如果dynamics== 2:位置+速度+加速度(认为目标是匀加速运动)。
2. udion()
该函数更新电离层状态量,根据配置决定。
3. udtrop()
该函数更新对流层状态量,根据配置决定。
4. udrcvbias()
该函数更新GLONASS 硬件偏差状态量,根据配置决定。
5. udbias()
该函数为状态量中单差模糊度更新。
为什么是“单差”模糊度? RTKLIB 选择估计站间单差模糊度作为状态量,而非双差模糊度。这样做的好处是避免参考星切换导致所有双差模糊度需要重新初始化的问题。当参考星发生变化时,单差模糊度依然保持连续。该部分以后再具体讲,要结合非差和双差一起说。
下面具体说一下状态量的整体结构。
rtk->x 的布局由宏定义决定,顺序如下:
x = [ 位置/速度/加速度 | 电离层 | 对流层 | 模糊度 | GLONASS硬件偏差 ]
对应的宏定义(位于 rtklib.h): 
| NP | 位置/速度/加速度 | 3 或 9 |
| NI | 电离层参数 | 0 或 MAXSAT |
| NT | 对流层参数 | 0、1 或 3 |
| NB | 模糊度参数 | 0 或 MAXSAT * NFREQ |
| NC | GLONASS 硬件偏差 | 0 或 MAXSAT |
| NR | 非 GLONASS 偏差部分总状态数 | — |
| NX | 状态向量总维数 | NR + NC |
4. 状态索引的实际使用
在 relpos() 和 ddres() 中,会通过上述宏来访问特定状态:
-
rtk->x[IB(i,f)]:第 i 颗卫星第 f 个频率的模糊度。
-
rtk->P[IB(i,f) + IB(i,f) * rtk->nx]:对应模糊度的方差。
-
H[IB(i,f)]:设计矩阵中该模糊度对应的系数。
ddres() 构建双差观测方程时,模糊度参数的系数就是通过 IB(i,f) 定位的。
5. 后续
在状态量定义中,udbias函数比较复杂,下一篇文章会具体说明几个问题:
1. /* temporal update of phase-bias */ 的意思是:相位偏差的时间更新,为啥不直接叫单差 模糊度。
2. udbias具体干了什么事?
网硕互联帮助中心


评论前必须登录!
注册