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−1ru
(tk)−ru
(tk−1)
如下图,我们通过
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=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