当前位置:网站首页>GNSS速度解算的三种方法

GNSS速度解算的三种方法

2022-06-23 03:53:00 奔跑的橘子

位置差分

位置差分是速度估计的最简单粗暴的方法,我们只需要知道两个历元的位置估计 r u ⃗ \vec{r_u} ru和历元间隔 t k − t k − 1 t_k-t_{k-1} tktk1就可以通过下边的公式估计出接收机的速度。
v u ⃗ = r u ⃗ ( t k ) − r u ⃗ ( t k − 1 ) t k − t k − 1 \vec{v_u}=\frac{\vec{r_u}(t_k)-\vec{r_u}(t_{k-1})}{t_k-t_{k-1}} vu=tktk1ru(tk)ru(tk1)
如下图,我们通过 P 2 P_2 P2点和 P 1 P_1 P1点的位置可以对速度估计,但这种方法的缺点也显而易见,

  • 我们需要知道两个历元的位置信息
  • 计算结果并不是事实的速度,而是从 P 1 P_1 P1 P 2 P_2 P2的平均速度,所以说这个速度是有一定滞后的
  • 所以这种方法要考虑的是载体的动态和位置输出的频率,是否满足应用场景
  • 还有一个问题,这种方法得到的速度估计和位置估计不是独立不相关的
    在这里插入图片描述

基于伪距率的速度估计

有没有更好的方法呢?接收机接收到的多普勒频移可以表示为以下公式。
D o p p l e r = f r − f t = − f t c [ ( v s − v u ) ∙ r s − r u ∣ ∣ r s − r u ∣ ∣ ] Doppler=f_r-f_t=-\frac{f_t}{c}[(v_s-v_u)\bullet\frac{r_s-r_u}{||r_s-r_u||}] Doppler=frft=cft[(vsvu)rsrursru]
其中 ∙ \bullet 为点乘,我们把上述公式两边都乘以载波的波长 λ \lambda λ,于是上边的公式变为,
ρ ˙ = ( v s − v u ) ∙ E \dot{\rho}=(v_s-v_u)\bullet E ρ˙=(vsvu)E
其中 E E E为视线向量 r s − r u ∣ ∣ r s − r u ∣ ∣ \frac{r_s-r_u}{||r_s-r_u||} rsrursru,考虑接收机的钟漂 δ t u ˙ \delta \dot{t_u} δtu˙和测量噪声$\xi
$,上边的式子可以完整的写为,
ρ ˙ = ( v s − v u ) ∙ E + c δ t u ˙ + ξ \dot{\rho}=(v_s-v_u)\bullet E+c \delta \dot{t_u}+\xi ρ˙=(vsvu)E+cδtu˙+ξ

写到这里我们就可以进行接收机速度的估计了,我们简单看一下rtklib的源代码,关键的一行为vs[j]=rs[j+3+i*6]-x[j];,从这我们大致可以看出rtklib就是用的这种方法了。

// 以下代码位于pntpos.c 中的resdop 函数
 /* LOS (line-of-sight) vector in ECEF */
        cosel=cos(azel[1+i*2]);
        a[0]=sin(azel[i*2])*cosel;
        a[1]=cos(azel[i*2])*cosel;
        a[2]=sin(azel[1+i*2]);
        matmul("TN",3,1,3,1.0,E,a,0.0,e);
        
        /* satellite velocity relative to receiver in ECEF */
        for (j=0;j<3;j++) {
    
            vs[j]=rs[j+3+i*6]-x[j];
        }

这个方法也有一个问题,使用这一行代码vs[j]=rs[j+3+i*6]-x[j];求伪距率的时候,其中的x为未知数,所以必然这个方法同求解位置一样,是需要迭代的。我们可以看一下求解速度的函数验证一下。

// 以下代码来自pntpos.c estvel 函数
    for (i=0;i<MAXITR;i++) {
    
        
        /* range rate residuals (m/s) */
        if ((nv=resdop(obs,n,rs,dts,nav,sol->rr,x,azel,vsat,err,v,H))<4) {
    
            break;
        }

这个for循环就是用来迭代求解速度的,MAXITR就是最大迭代次数。

基于多普勒频移的速度估计

可不可以不迭代呢?答案是肯定的。
首先,某卫星的多普勒频移可以写成以下形式,
d s = ρ s ˙ − v s ∙ E d_s=\dot{\rho_s}-v_s\bullet E ds=ρs˙vsE
我们将其带入伪距率公式,
d s = − E ∙ v u + c δ t u ˙ + ξ d_s=-E\bullet v_u+c \delta \dot{t_u}+\xi ds=Evu+cδtu˙+ξ
我们已经通过位置解算得到卫星和接收机的位置,所以 E E E为已知量,而 d s d_s ds为观测量,那么我们将每颗卫星的观测方程放到一起,就得到了一个线性定常方程,直接可以通过最小二乘或者卡尔曼滤波求解了。
d s 1 = − E 1 ∙ v u + c δ t u ˙ + ξ d s 2 = − E 2 ∙ v u + c δ t u ˙ + ξ . . . d s m = − E m ∙ v u + c δ t u ˙ + ξ d_{s1}=-E_1\bullet v_u+c \delta \dot{t_u}+\xi \\ d_{s2}=-E_2\bullet v_u+c \delta \dot{t_u}+\xi \\ ... \\ d_{sm}=-E_m\bullet v_u+c \delta \dot{t_u}+\xi ds1=E1vu+cδtu˙+ξds2=E2vu+cδtu˙+ξ...dsm=Emvu+cδtu˙+ξ

使用rtklib进行速度解算

首先,我们下载rtklib的可执行文件,
在这里插入图片描述
运行rtkpost并输入星历文件和观测文件,点击Execute
在这里插入图片描述
好了,解算完成!
在这里插入图片描述

原网站

版权声明
本文为[奔跑的橘子]所创,转载请带上原文链接,感谢
https://xiaoqiang666.blog.csdn.net/article/details/117135770