Skip to content

Commit 32ab46a

Browse files
committed
更新 README、加 RTKLIB-Qt 工程结构图
1 parent e1f68f2 commit 32ab46a

File tree

391 files changed

+981
-60108
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

391 files changed

+981
-60108
lines changed

01-RTKLIB源码阅读/01-RTKLIB源码阅读(一)程序介绍、编译调试、核心代码库、学习建议.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ RTKLIB 可以初步实现以下功能,相对于商业软件,可靠性没那
4747

4848
---
4949

50-
**如果有 GNSS 模块和天线,通过串口或网口连接电脑、树莓派,可以用 RTKLIB 程序包实现以下操作:**
50+
** 如果有 GNSS 模块和天线,通过串口或网口连接电脑、树莓派,可以用 RTKLIB 程序包实现以下操作:**
5151

5252
* 你可以用 RTKNAVI 或 RTKRCV 进行实时定位解算,单 GNSS 一般只能进行 SPP 解算,米级精度;想提高精度:可以接入差分数据做 RTK(自己搭基准站或者买 CORS 账号);或者提前下载一些精密改正文件,并申请 IGS 账号,接入 SSR 改正数据,做实时 PPP。在进行实时解算的过程中,可以通过 LOG 把数据流的数据都都存下来。
5353
* 你可以通过 STRSVR 或 STR2STR 把数据存到文件里;或者通过 Ntrip、TCP 等协议把数据播发出去,进行远程解算;或者作为 Ntrip 数据源把数据挂载 NtripCaster 搭基准站。
@@ -343,9 +343,12 @@ rtkrcv 无法直接在 Windows 下编译调试,因为它依赖了一些 Linux
343343
DENAGAL
344344
DLL
345345
WIN32
346+
TRACE
346347
```
347348

348-
> 尤其主要加 WIN32,好多博客都没加这一项,加了这一项后 RTKLIB 就不会用 Linux 下的 <pthread.h> 和 <sys/select.h>,咱们项目要在 Windows 下编译运行的,不加会报 ”找不到 <pthread.h> 和 <sys/select.h>“ 的错。
349+
> * 尤其主要加 WIN32,好多博客都没加这一项,加了这一项后 RTKLIB 就不会用 Linux 下的 <pthread.h> 和 <sys/select.h>,咱们项目要在 Windows 下编译运行的,不加会报 ”找不到 <pthread.h> 和 <sys/select.h>“ 的错。
350+
>
351+
> * 不加 TRACE 没法输出 trace 文件。
349352
350353
4. 将常规中的目标文件名改为 rnx2rtkp 。
351354

01-RTKLIB源码阅读/11-RTKLIB源码阅读(十一)相对定位 RTK、PPK、RTD.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2733,7 +2733,7 @@ ratio-test用来验证整周模糊度;该值表示具有第二最佳整数向
27332733
- 基于整数变换的模糊度**降相关**——为了保证LAMBDA捜索的快捷性和准确性,需要首先对原始模糊度的协因数矩阵加以调整,使得原始模糊度间的相关性降低。
27342734
- 基于**序贯条件最小二乘**估计的整周捜索LAMBDA搜索是整个过程的关键和主体,其主要目的是通过连续的迭代找出最接近真的的模糊度整数值。
27352735
2736-
![](https://pic-bed-1316053657.cos.ap-nanjing.myqcloud.com/img/52c78060560c477689d8c4aaff88cfb6.png)
2736+
<img src="https://pic-bed-1316053657.cos.ap-nanjing.myqcloud.com/img/52c78060560c477689d8c4aaff88cfb6.png" style="zoom: 67%;" />
27372737
27382738
27392739
### 2、三种模糊度固定选项
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
> ppp_ar.c 的内容在最新版的 RTKLIB 被删除了。
2+
3+
[TOC]
4+
5+
6+
7+
<img src="https://pic-bed-1316053657.cos.ap-nanjing.myqcloud.com/img/image-20240622165232083.png" alt="image-20240622165232083" style="zoom:67%;" />
8+
9+
10+
11+
12+
13+
## 二、pppamb():PPP 模糊度固定入口函数
14+
15+
16+
17+
18+
19+
双频的宽巷就是两频率求和,窄向就是两频率做差。宽巷组合具有较长的波长和非常小的载波方差,有利于模糊度的求解,但是放大了测量噪声;窄巷组合具有较小的距离方差,有利于基线矢量的精度,但是波长短,载波方差较大,不利于模糊度的求解。所以先固定较容易的宽巷模糊度,再固定窄向模糊度以获得更高的精度。
20+
21+
22+
23+
24+
25+
## 三、average_LC():计算平均线性组合
26+
27+
L_LC()、P_LC()、var_LC()、Lam_LC() 是进行线性组合的基本函数,分别用于计算组合(三频或双频)后的载波、伪距、方差、波长。
28+
29+
30+
31+
32+
33+
34+
35+
36+
37+
## 四、fix_amb_WL():均值取整法固定宽巷模糊度
38+
39+
40+
41+
42+
43+
## 五、fix_amb_ROUND():取整法固定窄巷模糊度
44+
45+
46+
47+
48+
49+
## 六、fix_amb_ILS():整数最小二乘法固定窄向模糊度
50+
51+
52+
53+
54+
55+
## 七、lambda():最小二乘模糊度去相关法
56+
57+
**传入参数**
58+
59+
```c
60+
int n I number of float parameters //浮点解数量
61+
int m I number of fixed solutions //固定解数量
62+
double *a I float parameters (n x 1) //浮点参数向量
63+
double *Q I covariance matrix of float parameters (n x n) //浮点参数协方差阵
64+
double *F O fixed solutions (n x m) //固定解
65+
double *s O sum of squared residulas of fixed solutions (1 x m) //总固定残差向量
66+
```
67+
68+
**执行流程**:
69+
70+
- 调用`LD()`,首先对浮点协方差阵进行LD分解
71+
- 调用`reduction()`,lambda降相关性
72+
- z变换,将双差模糊度进行变换
73+
- 调用`search()`,mlambda search,结果存储在`E`和`s`中(整数解)
74+
- 调用`solve()`,逆Z变换,将在新空间中固定的模糊度逆变换回双差模糊度空间中,存储在`F`中
75+
76+
```c
77+
extern int lambda(int n, int m, const double *a, const double *Q, double *F,
78+
double *s)
79+
{
80+
int info;
81+
double *L,*D,*Z,*z,*E;
82+
83+
if (n<=0||m<=0) return -1;
84+
L=zeros(n,n); D=mat(n,1); Z=eye(n); z=mat(n,1); E=mat(n,m);
85+
86+
//调用LD(),首先对浮点协方差阵进行LD分解
87+
/* LD factorization */
88+
if (!(info=LD(n,Q,L,D))) {
89+
90+
//调用reduction(),lambda降相关性
91+
/* lambda reduction */
92+
reduction(n,L,D,Z);
93+
94+
// z变换,将双差模糊度进行变换
95+
matmul("TN",n,1,n,1.0,Z,a,0.0,z); /* z=Z'*a */
96+
97+
//调用search(),mlambda search,结果存储在E和s中(整数解)
98+
/* mlambda search */
99+
if (!(info=search(n,m,L,D,z,E,s))) {
100+
//逆Z变换,将在新空间中固定的模糊度逆变换回双差模糊度空间中,存储在F中
101+
info=solve("T",Z,E,n,m,F); /* F=Z'\E */
102+
}
103+
}
104+
free(L); free(D); free(Z); free(z); free(E);
105+
return info;
106+
}
107+
```
108+
109+
### 1、reduction():LAMBDA降相关
110+
111+
```c
112+
static void reduction(int n, double *L, double *D, double *Z)
113+
{
114+
int i,j,k;
115+
double del;
116+
117+
j=n-2; k=n-2; //调序变换
118+
119+
//对第0,1,...,k-1,k列进行降相关
120+
while (j>=0) {
121+
if (j<=k) for (i=j+1;i<n;i++) gauss(n,L,Z,i,j); //从最后一列开始,各列非对角线元素从上往下依次降相关
122+
del=D[j]+L[j+1+j*n]*L[j+1+j*n]*D[j+1];
123+
//检验条件,若不满足检验条件则开始进行调序变换
124+
if (del+1E-6<D[j+1]) { /* compared considering numerical error */
125+
perm(n,L,D,j,del,Z);
126+
k=j; j=n-2; //完成调序变换后重新从最后一列开始进行降相关及排序,k记录最后一次进行过调序变换的列序号
127+
}
128+
else j--;
129+
}
130+
}
131+
```
132+
133+
### 2、gauss():整数高斯变换
134+
135+
```c
136+
static void gauss(int n, double *L, double *Z, int i, int j)
137+
{
138+
int k,mu;
139+
140+
if ((mu=(int)ROUND(L[i+j*n]))!=0) {
141+
for (k=i;k<n;k++) L[k+n*j]-=(double)mu*L[k+i*n];
142+
for (k=0;k<n;k++) Z[k+n*j]-=(double)mu*Z[k+i*n];
143+
}
144+
}
145+
```
146+
147+
### 3、perm():条件方差重新排列
148+
149+
```c
150+
static void perm(int n, double *L, double *D, int j, double del, double *Z)
151+
{
152+
int k;
153+
double eta,lam,a0,a1;
154+
155+
eta=D[j]/del;
156+
lam=D[j+1]*L[j+1+j*n]/del;
157+
D[j]=eta*D[j+1]; D[j+1]=del;
158+
for (k=0;k<=j-1;k++) {
159+
a0=L[j+k*n]; a1=L[j+1+k*n];
160+
L[j+k*n]=-L[j+1+j*n]*a0+a1;
161+
L[j+1+k*n]=eta*a0+lam*a1;
162+
}
163+
L[j+1+j*n]=lam;
164+
for (k=j+2;k<n;k++) SWAP(L[k+j*n],L[k+(j+1)*n]);
165+
for (k=0;k<n;k++) SWAP(Z[k+j*n],Z[k+(j+1)*n]);
166+
}
167+
```
168+
169+
### 4、search():mlambda搜索
170+
171+
```c
172+
static int search(int n, int m, const double *L, const double *D,
173+
const double *zs, double *zn, double *s)
174+
{
175+
int i,j,k,c,nn=0,imax=0;
176+
double newdist,maxdist=1E99,y;
177+
double *S=zeros(n,n),*dist=mat(n,1),*zb=mat(n,1),*z=mat(n,1),*step=mat(n,1);
178+
179+
k=n-1; dist[k]=0.0; //k表示当前层,从最后一层(n-1)开始计算
180+
zb[k]=zs[k];//即zn
181+
z[k]=ROUND(zb[k]); y=zb[k]-z[k]; step[k]=SGN(y); //四舍五入取整;取整后的数与未取整的数作差;step记录z[k]是四舍还是五入
182+
for (c=0;c<LOOPMAX;c++) {
183+
newdist=dist[k]+y*y/D[k];
184+
if (newdist<maxdist) { //如果当前累积目标函数计算值小于当前超椭圆半径
185+
//情况1:若还未计算至第一层,继续计算累积目标函数值
186+
if (k!=0) {
187+
dist[--k]=newdist; //记录下当前层的累积目标函数值,dist[k]表示了第k,k+1,...,n-1层的目标函数计算和
188+
for (i=0;i<=k;i++)
189+
S[k+i*n]=S[k+1+i*n]+(z[k+1]-zb[k+1])*L[k+1+i*n];
190+
zb[k]=zs[k]+S[k+k*n]; //计算Zk,即第k个整数模糊度参数的备选组的中心
191+
z[k]=ROUND(zb[k]); y=zb[k]-z[k]; step[k]=SGN(y); //四舍五入取整;取整后的数与未取整的数作差;记录是四舍还是五入
192+
}
193+
//情况2:若已经计算至第一层,意味着所有层的累积目标函数值计算完毕
194+
else {
195+
//nn为当前候选解数,m为我们需要的固定解数,这里为2,表示需要一个最优解及一个次优解
196+
//s记录候选解的目标函数值,imax记录之前候选解中的最大目标函数值的坐标
197+
if (nn<m) { //若候选解数还没满
198+
if (nn==0||newdist>s[imax]) imax=nn; //若当前解的目标函数值比之前最大的目标函数值都大,那么更新imax使s[imax]指向当前解中具有的最大目标函数值
199+
for (i=0;i<n;i++) zn[i+nn*n]=z[i]; //zn存放所有候选解
200+
s[nn++]=newdist; //s记录当前目标函数值newdist,并加加当前候选解数nn
201+
}
202+
else { //若候选解数已满(即当前zn中已经存了2个候选解)
203+
if (newdist<s[imax]) { //若当前解的目标函数值比s中的最大目标函数值
204+
for (i=0;i<n;i++) zn[i+imax*n]=z[i]; //用当前解替换zn中具有较大目标函数值的解
205+
s[imax]=newdist; //用当前解的目标函数值替换s中的最大目标函数值
206+
for (i=imax=0;i<m;i++) if (s[imax]<s[i]) imax=i; //更新imax保证imax始终指向s中的最大目标函数值
207+
}
208+
maxdist=s[imax]; //用当前最大的目标函数值更新超椭圆半径
209+
}
210+
//在第一层,取下一个有效的整数模糊度参数进行计算(若zb为5.3,则z取值顺序为5,6,4,7,...)
211+
z[0]+=step[0]; y=zb[0]-z[0]; step[0]=-step[0]-SGN(step[0]);
212+
}
213+
}
214+
//情况3:如果当前累积目标函数计算值大于当前超椭圆半径
215+
else {
216+
if (k==n-1) break; //如果当前层为第n-1层,意味着后续目标函数各项的计算都会超出超椭圆半径,因此终止搜索
217+
else { //若当前层不是第n-1层
218+
k++; //退后一层,即从第k层退到第k+1层
219+
z[k]+=step[k]; y=zb[k]-z[k]; step[k]=-step[k]-SGN(step[k]); //计算退后一层后,当前层的下一个有效备选解
220+
}
221+
}
222+
}
223+
// 对s中的目标函数值及zn中的候选解进行排序(以s中目标函数值为排序标准,进行升序排序)
224+
// RTKLIB中最终可以得到一个最优解一个次优解,存在zn中,两解对应的目标函数值,存在s中
225+
for (i=0;i<m-1;i++) { /* sort by s */
226+
for (j=i+1;j<m;j++) {
227+
if (s[i]<s[j]) continue;
228+
SWAP(s[i],s[j]);
229+
for (k=0;k<n;k++) SWAP(zn[k+i*n],zn[k+j*n]);
230+
}
231+
}
232+
free(S); free(dist); free(zb); free(z); free(step);
233+
234+
if (c>=LOOPMAX) {
235+
fprintf(stderr,"%s : search loop count overflow\n",__FILE__);
236+
return -1;
237+
}
238+
return 0;
239+
}
240+
```
241+
242+
243+
238 KB
Loading
27.3 KB
Binary file not shown.

0 commit comments

Comments
 (0)