其他分享
首页 > 其他分享> > GNSS速度解算的三种方法

GNSS速度解算的三种方法

作者:互联网

文章目录

位置差分

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

基于伪距率的速度估计

有没有更好的方法呢?接收机接收到的多普勒频移可以表示为以下公式。
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=fr​−ft​=−cft​​[(vs​−vu​)∙∣∣rs​−ru​∣∣rs​−ru​​]
其中 ∙ \bullet ∙为点乘,我们把上述公式两边都乘以载波的波长 λ \lambda λ,于是上边的公式变为,
ρ ˙ = ( v s − v u ) ∙ E \dot{\rho}=(v_s-v_u)\bullet E ρ˙​=(vs​−vu​)∙E
其中 E E E为视线向量 r s − r u ∣ ∣ r s − r u ∣ ∣ \frac{r_s-r_u}{||r_s-r_u||} ∣∣rs​−ru​∣∣rs​−ru​​,考虑接收机的钟漂 δ 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 ρ˙​=(vs​−vu​)∙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​˙​−vs​∙E
我们将其带入伪距率公式,
d s = − E ∙ v u + c δ t u ˙ + ξ d_s=-E\bullet v_u+c \delta \dot{t_u}+\xi ds​=−E∙vu​+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​=−E1​∙vu​+cδtu​˙​+ξds2​=−E2​∙vu​+cδtu​˙​+ξ...dsm​=−Em​∙vu​+cδtu​˙​+ξ

使用rtklib进行速度解算

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

标签:ru,bullet,rs,GNSS,三种,vu,速度,解算,dot
来源: https://blog.csdn.net/iceboy314159/article/details/117135770