问题:观测数据质量很差
最近遇到一个难题,采集了500小时的数据,可是只有大约50%的的数据可以解算,呃~,基线长度大约5公里,也算不上长基线。对这批数据进行了初步的质量分析,结果很不乐观。下边两张图是用于周跳检测时的分析残差,上边的图是观测条件良好(其实也不理想)的分析结果,下边的图是现场数据,质量差了一个数量级。
从下边的结果也可以看出,无论是观测周跳比,还是数据完整度,现场的数据已经超级糟糕了。
使用基线约束后和约束前的结果对比
添加基线约束前,解算成功率大约为50.60 %
添加基线约束后,解算成功率提高为68.47 %
下边是解算结果的一个片段,每一行表示一个小时数据的解算结果,可以看出很多原来无法解算的数据,现在可以解算出结果了。当然,由于观测质量的原因ratio值都在3左右徘徊,但这已经不错了,可以部分满足需求。只要对基线进行更精确的观测,和对基线标准差进行合适的调试,相信可以得到更好的结果。
基线约束的原理
在之前的文章中写过rtklib浮点解算的原理,点击这里可查看 ,简要说来就是使用卡尔曼滤波,确切的说是扩展卡尔曼滤波(EKF)对移动站位置或者基线以及差分模糊度等进行估计。
而基线约束,就是在以上基础上添加一个观测值——基线长度,主要应用在基线长度已知的场景,其中姿态(航向)测量就是一个很典型的应用。这就是moving-base,基线作为一个整体在动,但是移动站始终在以基准站为球心的半径固定的球面上,如下图。 当然,无论是将基线向量还是移动站坐标作为状态,这个基线长度作为观测量时,都是一个非线性方程。
y
=
(
x
−
x
b
)
2
+
(
y
−
y
b
)
2
+
(
z
−
z
b
)
2
+
σ
y
y=\sqrt{(x-x_b)^2+(y-y_b)^2+(z-z_b)^2}+\sigma_y
y = ( x − x b ) 2 + ( y − y b ) 2 + ( z − z b ) 2
+ σ y
rtklib中这一部分的实现代码在函数constbl
中,其中v[index]
就是观测残差,if
中的部分,是将上述观测方程线性化得到观测矩阵,Rj
为观测方差。
/* constraint to baseline length */
v[ index] = rtk-> opt. baseline[ 0 ] - bb;
if ( H) {
for ( i= 0 ; i< 3 ; i++ ) H[ i+ index* rtk-> nx] = b[ i] / bb;
}
Ri[ index] = 0.0 ;
Rj[ index] = SQR ( rtk-> opt. baseline[ 1 ] ) ;