Coder Social home page Coder Social logo

xiaogongwei / mg_app Goto Github PK

View Code? Open in Web Editor NEW
91.0 13.0 48.0 369.65 MB

MG-APP (https://link.springer.com/article/10.1007/s10291-020-00976-1);

Home Page: https://xiaogongwei10.blog.csdn.net/

C++ 81.64% QMake 0.04% CMake 2.04% C 0.13% Shell 0.17% Fortran 15.25% Python 0.09% JavaScript 0.08% CSS 0.05% MATLAB 0.47% Mercury 0.03% Objective-C 0.01%
ppp gps gnss gps-location positioning location multi gpt2 filtering-methods kalman-filter

mg_app's Introduction

MG-APP (Multi-GNSS-Automatic Precise Positioning software)

Author: Gongwei Xiao

Version : 1.0
Date : 26 Apr 2019
Download link (The GPS Toolbox): https://www.ngs.noaa.gov/gps-toolbox/
Old version (contains resources you may need): https://github.com/XiaoGongWei/PPP
Qt online installers: http://download.qt.io/archive/online_installers/
Qt install executable (in china): http://mirrors.ustc.edu.cn/qtproject/official_releases/qt/
Temporary link to Online MG-APP: https://13018096950.hskyun.com

If you would like to join this repository, please contact us after registering with Github.
Please use git clone or git pull to keep MG-APP up to date.

Main Window

English:

Aiming at the current multi-system combined multi-frequency observation data,
the MG-APPS precise single-point positioning software is developed.
Using C++ language based on cross-platform Qt framework, it has high cohesion
and low coupling characteristics. It provides a rich and friendly function
library which is easy to transplant for secondary development. It can run in
UNIX/Linux, Windows and other operating systems. MG-APPS can process GPS,
GLONASS, BDS and Galileo system data by using the combination of deionospheric
PPP mode. MG-APPS can deal with static data and real dynamic observation data.
A variety of commonly used tropospheric estimation models can be selected:
UNB3m, Saastamoinen (GPT2), Hopfield (GPT2), to study the effects of different
tropospheric models on PPP location (Hopfield 1971; Saastamoinen 1972; Leandro
et al. 2007; Lagler et al. 2013). Various filtering methods can be selected to
process data: Kalman filtering, Square Root Information Filter (SRIF), and the
effect of different filtering methods is studied. It can be used to fuse
multi-system data to study the precision effect of multi-system combination and
single-system model. Phase smoothing pseudorange is used in MG-APPS software,
which can improve the accuracy of pseudorange positioning. PPP mode based on
precision products can be selected, and single Point Positioning (SPP) mode of
broadcast ephemeris can also be selected. Automatic discrimination of
observation data (Rinex 3.x and Rinex 2.x) and navigation ephemeris type (N file,
P file). Users do not need to care about the underlying data format. If the
observation data lacks the necessary products for positioning, the software can
automatically download the products for solution and also automatically batch
processing observation data. In data processing, only the observation information
of two adjacent epochs is needed. According to the filtering algorithm, real-time
data processing mode is adopted. Forward filtering can be used to study the
convergence process of PPP, and reverse filtering can be used to provide precise
coordinates and high resolution tropospheric products.

Have fun,

Xiaogongwei

RTPPP:

We also developed RTMG-PPP based on MG-APP. Below is the main window and the result of processing 10 hours of GNSS observations.

Main Window RTPPP
Main Window Results

Appendix A:

MG-APP are distributed under the terms of the version 3 of the GNU General
Public License (GPLv3). See the file COPYING.
Copyright (C) 2016-2020 XiaoGongWei
Special licenses for commercial and other applications which
are not willing to accept the GNU General Public License
are available by contacting the author.

mg_app's People

Contributors

xiaogongwei avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mg_app's Issues

请问怎样可以使用MG-APP获取PPP中的rms和收敛时间数据。

通常情况下当NEU三个方向都小于0.1m认为收敛了,此时刻就是收敛时间。你说的PPP中的RMS是指的多个O文件求解坐标的统计精度吧。假如你处理了100个O文件,每个O文件都有一个最终的坐标,这个坐标和真值(IGS发布的.snx文件)做差,即可统计坐标的RMS。

[QReadAnt] How to use QReadAnt class!

Example

QString AntFileName = "D:\igs14_2035.atx", AntType = "ASH700936B_M SNOW";//1. Class initialization
double ObsJD = 2455296.50;// start time (approximately) Julian day
QReadAnt readAnt(AntFileName,AntType,ObsJD); // or QReadAnt readAnt(AntFileName); readAnt.setObsJD(AntType,ObsJD);

readAnt.getAllData();// 2. Read data files

double E = 0.7,A = 0.3;// altitude Angle and azimuth Angle
double L1Offset = 0, L2Offset = 0;// save the correction of L1 and L2 line of sight (unit m)
QVector FrqFlag;//
FrqFlag.append("C1C"); FrqFlag.append("L1C"); FrqFlag.append("C1W"); FrqFlag.append("L1W");
readAnt.getRecvL12(E,A,&L1Offset,&L2Offset, FrqFlag);// 3. Function call method (unit m)

int Year = 2010,Month = 4,Day = 10,Hours = 0,Minuts = 0,PRN = 32;
double Seconds = 0.0;
double StaPos[3] = {9999,999,9999},RecPos[3] = {9999,9999,9999};
double L12OffSet[2] = {0};
QVector FrqFlag;
FrqFlag.append("C1C"); FrqFlag.append("L1C"); FrqFlag.append("C1W"); FrqFlag.append("L1W");
readAnt.getSatOffSet(Year,Month,Day,Hours,Minuts,Seconds,PRN,StaPos,RecPos, L12OffSet, FrqFlag);

abort for a assert

assert_test_case.zip

With the attach test case the program MG_APP abort with a assert.
The options used are:
TropDeal=Hopfield(GPT2)
Method=Kalman
Cut-off Angle=0
Kinemati Yes
Satellite system GPS
PPP NoSmooth
PPP Back Yes
run PPP
The program exit with the following error message:

MG_APP: ../MG_APP/resources/myeigen/Eigen/src/Core/ProductBase.h:102: Eigen::ProductBase<Derived, Lhs, Rhs>::ProductBase(const Lhs&, const Rhs&) [with Derived = Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1>, Eigen::Matrix<double, -1, -1>, 5>; Lhs = Eigen::Matrix<double, -1, -1>; Rhs = Eigen::Matrix<double, -1, -1>]: Assertion `a_lhs.cols() == a_rhs.rows() && "invalid matrix product" && "if you wanted a coeff-wise or a dot product use the respective explicit functions"' failed.

When the error is raise, the program backtrace is:

#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007ffff53ef801 in __GI_abort () at abort.c:79
#2 0x00007ffff53df39a in __assert_fail_base (fmt=0x7ffff7fb3b03 "%s%s%s:%u: %s%sasserzione "%s" non riuscita.\n%n",
assertion=assertion@entry=0x555555768020 "a_lhs.cols() == a_rhs.rows() && "invalid matrix product" && "if you wanted a coeff-wise or a dot product use the respective explicit functions"",
file=file@entry=0x555555767fe0 "../MG_APP/resources/myeigen/Eigen/src/Core/ProductBase.h", line=line@entry=102,
function=function@entry=0x5555557715c0 <Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, 5>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >::ProductBase(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&)::PRETTY_FUNCTION> "Eigen::ProductBase<Derived, Lhs, Rhs>::ProductBase(const Lhs&, const Rhs&) [with Derived = Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1>, Eigen::Matrix<double, -1, -1>, 5>; Lhs = Eigen::Matrix<d"...) at assert.c:92
#3 0x00007ffff53df412 in __GI___assert_fail (
assertion=0x555555768020 "a_lhs.cols() == a_rhs.rows() && "invalid matrix product" && "if you wanted a coeff-wise or a dot product use the respective explicit functions"", file=0x555555767fe0 "../MG_APP/resources/myeigen/Eigen/src/Core/ProductBase.h",
line=102,
function=0x5555557715c0 <Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, 5>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >::ProductBase(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&)::PRETTY_FUNCTION> "Eigen::ProductBase<Derived, Lhs, Rhs>::ProductBase(const Lhs&, const Rhs&) [with Derived = Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1>, Eigen::Matrix<double, -1, -1>, 5>; Lhs = Eigen::Matrix<d"...) at assert.c:101
#4 0x00005555555f7e0b in Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, 5>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >::ProductBase (
this=0x7fffffffb850, a_lhs=..., a_rhs=...) at ../MG_APP/resources/myeigen/Eigen/src/Core/ProductBase.h:100
#5 0x00005555555f702f in Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, 5>::GeneralProduct (this=0x7fffffffb850, lhs=..., rhs=...)
at ../MG_APP/resources/myeigen/Eigen/src/Core/products/GeneralMatrixMatrix.h:393
#6 0x00005555555f66cf in Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::operator*<Eigen::Matrix<double, -1, -1, 0, -1, -1> > (this=0x7fffffffb9d0, other=...) at ../MG_APP/resources/myeigen/Eigen/src/Core/GeneralProduct.h:598
#7 0x00005555555f2d8c in QKalmanFilter::KalmanforStatic (this=0x7fffffffca40, Bk=..., Lk=..., F=..., Qwk=..., Rk=..., tXk_1=...,
tPk_1=...) at ../MG_APP/QKalmanFilter.cpp:269
#8 0x00005555555f5899 in QKalmanFilter::filter (this=0x7fffffffca40, preEpoch=..., currEpoch=..., X=..., P=...)
at ../MG_APP/QKalmanFilter.cpp:675
#9 0x00005555555f4933 in QKalmanFilter::KalmanforStatic (this=0x7fffffffca40, preEpoch=..., currEpoch=...,
m_ApproxRecPos=0x7fffffffbe20, X=..., P=...) at ../MG_APP/QKalmanFilter.cpp:541
#10 0x0000555555730a3e in QPPPBackSmooth::Run (this=0x7fffffffbf30, isDisplayEveryEpoch=true) at ../MG_APP/QPPPBackSmooth.cpp:633
#11 0x00005555557116a9 in MainWindow::RunPPP (this=0x7fffffffdbe0) at ../MG_APP/mainwindow.cpp:303
#12 0x000055555574ef0e in MainWindow::qt_static_metacall (_o=0x7fffffffdbe0, _c=QMetaObject::InvokeMetaMethod, _id=2,
_a=0x7fffffffcf00) at moc_mainwindow.cpp:89
#13 0x00007ffff6398555 in QMetaObject::activate(QObject*, int, int, void**) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#14 0x00007ffff7564ba2 in QAbstractButton::clicked(bool) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#15 0x00007ffff7564dba in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#16 0x00007ffff756619a in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#17 0x00007ffff756638d in QAbstractButton::mouseReleaseEvent(QMouseEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#18 0x00007ffff74b2048 in QWidget::event(QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#19 0x00007ffff747383c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#20 0x00007ffff747b65f in QApplication::notify(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#21 0x00007ffff63698d8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#22 0x00007ffff747a632 in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer&, bool) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#23 0x00007ffff74cd16b in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#24 0x00007ffff74cf7da in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#25 0x00007ffff747383c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#26 0x00007ffff747b104 in QApplication::notify(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#27 0x00007ffff63698d8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#28 0x00007ffff6cb7583 in QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) ()
from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#29 0x00007ffff6cb9055 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) ()
from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#30 0x00007ffff6c902eb in QWindowSystemInterface::sendWindowSystemEvents(QFlagsQEventLoop::ProcessEventsFlag) ()
from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#31 0x00007fffefbde260 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
#32 0x00007ffff38de417 in g_main_context_dispatch () from /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#33 0x00007ffff38de650 in ?? () from /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#34 0x00007ffff38de6dc in g_main_context_iteration () from /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#35 0x00007ffff63c288f in QEventDispatcherGlib::processEvents(QFlagsQEventLoop::ProcessEventsFlag) ()
from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#36 0x00007ffff636790a in QEventLoop::exec(QFlagsQEventLoop::ProcessEventsFlag) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#37 0x00007ffff63709b4 in QCoreApplication::exec() () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#38 0x0000555555605dc5 in main (argc=1, argv=0x7fffffffddb8) at ../MG_APP/main.cpp:18

The last normal output in the backward filter is:

Epoch: 1216
GPST: 10:08:00
Sat. Number: 5
Valid Sat. Number: 5
Estimated coordinates: [ 4696989.2124,723994.9939,4239678.8065 ]

assert out of range

The program is exit with an assert error.
The code throw the assert to the line 549 of the file QPPPBackSmooth.cpp

    for(int i = forWard_epoch_len - 1; i >=0; i++)
    {
        last_fillter_X = last_allSolverX.at(i); // <------ the assert is throw here
        if(last_fillter_X[0] != 0)
        {
            last_fillter_X = last_allSolverX.at(i);
            last_fillter_Q = last_allSolverQ.at(i);
            break;
        }
    }

The i variable in for cycle is increased for error. The possible correct code is:

    for(int i = forWard_epoch_len - 1; i >=0; i--)
    {
        if(last_allSolverX.at(i)[0] != 0)
        {
            last_fillter_X = last_allSolverX.at(i);
            last_fillter_Q = last_allSolverQ.at(i);
            break;
        }
    }

AR

你好,请问MG_APP支持模糊度固定解吗?

problem when the filter fail at an epoch

Thank you for the your attention to my issues.
If you try to use the attach test case with the options:
TropDeal=Hopfield(GPT2)
Method=Kalman
Cut-off Angle=0
Kinemati Yes
Satellite system GPS
PPP NoSmooth
PPP Back Yes
run PPP
at the Epoch Number: 1844 of the backward filter are visible 5 satellites.
The Kalman filter fail because one satellite has bad measure
and it is not possible to calculate a solution with 4 satellites.
The function m_KalmanClass.KalmanforStatic at row 662 of the
file QPPPBackSmooth.cpp return false.
So it is executed the following statement
memset(spp_pos, 0, 3*sizeof(double));
which set to zero the current position.

file QPPPBackSmooth.cpp
function void QPPPBackSmooth::Run(bool isDisplayEveryEpoch)
659         if (!m_Solver_Method.compare("SRIF", Qt::CaseInsensitive))
                is_filter_good = m_SRIFAlgorithm.SRIFforStatic(prevEpochSatlitData,epochSatlitData,spp_pos,X,P);
            else
                is_filter_good = m_KalmanClass.KalmanforStatic(prevEpochSatlitData,epochSatlitData,spp_pos,X,P);
//Save the last epoch satellite data
            if(is_filter_good)
            {
                prevEpochSatlitData = epochSatlitData;
                continue_bad_epoch = 0;
            }
            else
            {
                continue_bad_epoch++;
                memset(spp_vct, 0, 3*sizeof(double));
                memset(spp_pos, 0, 3*sizeof(double)); <---- With an error in filter the position is set to zero, but it is again used in next epoch in the filter
                X.setZero();
675         }

From this moment the position remains equal to zero,
until the end of data elaboration.
This because the current position (zero) is used in next epoch
and the Kalman filter produce wrong data that are delete at
the quality control.

To avoid the problem I see the following possibilities:

  • use the position calculate with SPP;
  • use the last PPP correct position (my favourite);
  • initialize again the Kalman filter.
    testdata.zip

关于QReadAnt中函数的输出值问题

1.getRecvL12函数中输出的L1Offset和L2Offset的意义?如何利用?
2.getSatOffSet函数中输出的L12Offset的意义?
3.分析L12Offset[0]和L12Offset[1]数值相近或相同的原因?
初学疑惑,谢谢解答

一些问题的回答

1.MG_APP能不能处理动态PPP的数据啊?
2.“back”模式,是可以后向滤波吗?类似于RTKLIB里面的forward backword combined模型。
3.在处理北二的时候,我看很多论文都说要对北斗多路径进行更改,代码里面暂时还没有进行修改?
4.北斗现在有很多频点,目前程序处理的好像还是双频IF组合,北三用的是C2I和C6I,那么还有其他频点怎么利用啊?
5. 您之前说MG_APP2.0支持非差非组合了,这部分代码是不是还没开源?
6.最后必须的感叹您的代码确实比RTKLIB清晰好读多了,RTKLIB相对来说难读很多!
OtherQuestion.docx

精密的电离层和对流层模型到底能不能加速PPP收敛?

问题:精密的电离层和对流层模型到底能不能加速PPP收敛?

理解:

  1. PPP收敛过程属于PPP前期,PPP前期影响收敛误差主要来源于伪距(3m误差),当前对流层估计模型误差在0.1-0.3m左右的常偏差(2小时)。对流层误差相对于伪距误差较小,对收敛影响不大。当然把对流层改正到cm或者mm级别有助于PPP收敛(快2分钟,乃至5分钟),这种提高并不会有很大的应用意义。能够提高10min以上才能有较大的意义。

  2. 前期伪距精度的提高才是关键。假如伪距是cm或者mm级别,那么PPP收俩就会很快了。或者知道精度较高的参数也可以极大加快收敛速度。

RTK

你好,请问一下后续有做RTK的打算吗?

采样率越高精度越高吗?

您好,为什么同样都是1个小时的数据,一个是30秒历元间隔,一个是1秒的历元间隔,1秒的计算出来的误差比30秒的误差还大呢?

答复:你这是1h数据对比不同分辨率下PPP精度,差异10mm很正常。此时PPP没收敛完全,就算完全收敛,受到质量控制差异10mm也正常。如果没有质量影响,历元间隔越小(采样率过大),精度就会更高。

new abort with an assert

I find an new assert with the attach test case.
I use this options:
TropDeal=UNB3m
Method=Kalman
Cut-off Angle=0
Kinematic No
Satellite system GPS
PPP NoSmooth
PPP Back Yes
run PPP

The assert is:
MG_APP: ../MG_APP/resources/myeigen/Eigen/src/Core/ProductBase.h:102: Eigen::ProductBase<Derived, Lhs, Rhs>::ProductBase(const Lhs&, const Rhs&) [with Derived = Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1>, Eigen::Matrix<double, -1, 1>, 4>; Lhs = Eigen::Matrix<double, -1, -1>; Rhs = Eigen::Matrix<double, -1, 1>]: Assertion `a_lhs.cols() == a_rhs.rows() && "invalid matrix product" && "if you wanted a coeff-wise or a dot product use the respective explicit functions"' failed.

For use clk_30s files with backward filter and avoid the download of clk files, I changed the code like this:

diff --git a/QPPPBackSmooth.cpp b/QPPPBackSmooth.cpp
--- a/QPPPBackSmooth.cpp
+++ b/QPPPBackSmooth.cpp
@@ -42,6 +42,13 @@ QPPPBackSmooth::QPPPBackSmooth(QString files_path,  QTextEdit *pQTextEdit, QStri
     tempFilters.clear();
     tempFilters.append("*.clk");
     ClkFileNamesList = searchFilterFile(m_run_floder, tempFilters);
+    // if not find clk try clk_*
+    if(ClkFileNamesList.isEmpty())
+    {
+        tempFilters.clear();
+        tempFilters.append("*.clk_*");
+        ClkFileNamesList = searchFilterFile(m_run_floder, tempFilters);
+    }
     // find erp files
     tempFilters.clear();
     tempFilters.append("*.erp");

testassert_2.zip

使用MG-APP处理北斗三数据

1、首先需要下载最新的atx文件igs14.atx(ftp://ftp.igs.org/pub/station/general/igs14.atx),与BDS-III数据O文件放在同一个文件夹。
2、看了一下采集的数据,2I6I频点数据较多,BDS-III竟然没有7I,数据如下:
观测类型:C1X C2I C5X C6I C7I C7Z
BDS
3、将MG-APP代码处理BDS优先级2->7->6更改成2->6->7,更改后的代码如下:
BDS_type
4、注意你的sp3clk文件也要有BDS-III的产品才可以定位,要不然BDS-III卫星没有轨道和钟差还会剔除了。
然后调试QPPPModel::Run函数的循环,看看能不能定位。由于我没有BDS-III的产品,因此没有测试。有问题可以在这里提交

使用GBM产品对BDS-III数据进行了静动态PPP定位,效果可以参考 我的CSDN

使用VS开发MG-APP说明

使用VS开发需要下载VS和Qt,我目前用的是VS2017+Qt5.14.0,Qt安装的时候可能需要注册个账户,必须选中MSVC 2017 64(32)-bit ,如下图。然后再VS2017安装Qt add-in,然后再option设置Qt路径D:\Qt\Qt5.14.1\5.14.1\msvc2017_64, 信息内容参考说明书。
VS2017_1
VS2017

说明书文档用的是VS2015配置类似:https://github.com/XiaoGongWei/MG_APP/tree/master/resources/doc
国内(China) Qt5.14.0下载链接:http://mirrors.ustc.edu.cn/qtproject/official_releases/qt/5.14/5.14.0/qt-opensource-windows-x86-5.14.0.exe
Qt官方下载链接:http://download.qt.io/archive/qt/5.14/

Some questions about the function of 'reciveClkRapaire'.

对receiver clock repair 有以下三点疑惑,还请帮忙接解答一下:

  1. 函数中,‘M_IR’,以及'jump_pro > 0.8'里面的 ‘M_IR’和0.8的阈值为什么这么选取,有什么依据么?

2.函数中,dP3 = epochData.PP3 - preEpochData.PP3; 及 dL3 = epochData.LL3 - preEpochData.LL3;这里的’PP3‘,’LL3‘感觉不是原始观测值的历元差,看代码是做了各种改正,这样做的好处是什么呢?
eg:
LL3 = alph1*(L1 + L1Offset + SatL1Offset - AntWindup) Lamta1- alph2(L2+ L2Offset + SatL2Offset - AntWindup)*Lamta2;
顺便问一句,可否解释一下receiver ant number correction(Cycle)和satellite ant weeks correction(weeks)的意义,就是以周为单位的接收机和卫星的天线PCO,对吗
另外.请问一下,钟跳修复对PPP的影响感觉不是很大,测试也很少发现全部卫星初始化的情况,那这个钟跳修复的实际作用如何呢?

How to use clock data in sp3 file in PPP forward filtering

Sometimes we want to use clock data in sp3 (such as igu products).

  • You need to turn it on QPPPModel::SimpleSPP Line 400 and QPPPModel::Run Line 720.(The code is tempSatlitData.StaClock = sp3Clk;).
    A comparison of QPPPModel::Run before and after modification is shown below.The same is true for the QPPPModel::SimpleSPP modification
    Before:
    2
    After:
    12

  • Note that even you changed code and use the clock data in sp3. Also, you need to put an *.clk file in the project directory (The directory in which the observation data files are located) to ensure that the MG-APP software can execute.

Problem in QTideEffect::readOCEANFile

The function QTideEffect::readOCEANFile cannot read the coefficients from blq file.
The function not find the station name in the blq file.
In the following block of code I explain the problem:

....
308   while (!m_readOCEANClass.atEnd())
	{
		//2-6 per line is empty, it means the data will start "$$" and the length is 4
		while (4 != tempLine.length()) //<--- The program exit of this cycle only at end of file. The lines length is always different from 4.
		{
			tempLine = m_readOCEANClass.readLine();
			if (m_readOCEANClass.atEnd()) 
			{
				isOCEANTide = false;
				oceaData.isRead = false;
				break;	
			}
		}
			
		//Read station data
		tempLine = m_readOCEANClass.readLine();//Read header file line
		if (m_readOCEANClass.atEnd()) 
		{
			isOCEANTide = false;
			oceaData.isRead = false;
			break;	
		}
		tempStationName = tempLine.mid(2,4).trimmed().toUpper();
		if (tempStationName != StationName) continue;
               //Find the station
  	       tempOCEANData.StationName = tempStationName;
		//Skip comments (can read station BLH, not read here)
		tempLine = m_readOCEANClass.readLine();//Read comment
		while (tempLine.mid(0,2).contains("$"))
337			tempLine = m_readOCEANClass.readLine();//Read comment
....

Here how I would have built the block of code:

...
	while (!m_readOCEANClass.atEnd())
	{
		// Skip comments
		while (tempLine.startsWith("$$"))
		{
			tempLine = m_readOCEANClass.readLine();
			if (m_readOCEANClass.atEnd())
			{
				isOCEANTide = false;
				oceaData.isRead = false;
				break;
			}
		}

		// Possible line with station name
		tempStationName = tempLine.mid(2,4).trimmed().toUpper();
		if (tempStationName != StationName) {
			tempLine = m_readOCEANClass.readLine();
			if (m_readOCEANClass.atEnd())
			{
				isOCEANTide = false;
				oceaData.isRead = false;
				break;
			}
			continue;
		}
		//Find the station
		tempOCEANData.StationName = tempStationName;
		//Skip comments
		tempLine = m_readOCEANClass.readLine();//Read comment
		while (tempLine.startsWith("$$"))
			tempLine = m_readOCEANClass.readLine();//Read comment
...

关于Ver2.0.2读取O文件的bug

在用MG_APP处理测站ULAB观测数据时,会出现提示如下错误:
Please check>>>SYS/#/OBS TYPES<<<in Observation file.
You select system maybe single frequence!
System (C) maybe single frequence错误

test ultra rapid

Thank you, for last commit that it has fixed the abort.
I try at use ultra rapid orbits and clocks for an PPP solution.
The output position is almost always zero.
Is it the quality of the orbits and clocks that determines the result?

I attached the test case and here are show the options used:
TropDeal=UNB3m
Method=Kalman
Cut-off Angle=0
Kinematic No
Satellite system GREC
PPP NoSmooth
PPP Back No
run PPP
test_ultrarapid.zip

运行MG_APP出现读取文件失败的处理

克隆库到本地文件夹
1、使用Qt打开.pro文件之前,建议删掉.user文件和类似.user.13511这种文件,否则会一直卡在reading project,网上说可能是.user默认打开方式为VS
image1

2、运行软件处理数据之前,将resource/CopyData文件夹中所有文件,拷贝到生成的 /build-MG_APP-Desktop_Qt_5_8_0_MinGW_32bit-Debug/debug/ 文件夹中
image2

image3
image4

详细内容请参考:https://github.com/XiaoGongWei/MG_APP/tree/master/resources/doc

关于SRIF时间更新

经与作者询问该问题,现将作者的回复回答写下,供大家参考。
|Rwk_1 0 0 | QR | Rwk Rwx Zw|
|-RpPhi_InvG Rp*Phi_Inv Zp] | -> | 0 Rp Zp|
上述0在Bierman书中为Zw。这是因为在PPP数据处理中,转移噪声没有观测值,均值认为是0,故作者直接将此处赋值为0。

关于钟差输出的疑问

四系统的时候,钟差输出有四列,分别代表什么意思,系统差,相对于GPST吗,假设以GPST为参考,要知道BeiDou钟差,那就是加上GPST+ISB(BDS)

How to open MG-APP using Qt Creator.

Possible solutions:
Use Qt Creator to open the .pro project file (See the attachment).

1.In Windows should delete C:\Users\Administrator\AppData\Roaming\QtProject folder, and then open Qt Creator.
In Linux, ~ is /home/yourusername/QtProject

  1. Set Qt Creator using an integrated video card in the Nvidia video card control panel.

  2. if according to the above delete a file or can not open the UI file, it is only a possibility, your computer's graphics driver is the latest version, the QT is not compatible with the UI display, it is recommended to uninstall the latest board driver installed stable version......This problem has been bothering me for 2 weeks, reloading in the middle. Or for countless versions of QT also according to the upstairs said to delete the file is not good, so into the debugging mode to debug the program, read the newspaper after the error check is. Show the problem, so uninstall and reinstall the driver. Then I had to open it. Write down the method for future generations to see

If it still cannot be opened, you can install the latest version of Qt5.15.1(online install in attachmen).

关于MG-APP的改正模型和单位说明 (Correction model and unit description of MG-APP)

[中文]
关于MG-APP的改正模型和单位说明:
1、所有的改正模型都是改正到观测值上面(倾斜的改正项);
2、返回改正项的单位都是米;

[English]
Correction model and unit description of MG-APP:

  1. All correction models are corrected to the observed values (slant correction items);
  2. All correction items are returned in meters;

实现单天多站的批量处理?

目前看到当前版本实现的是单天单个站点的处理,软件实现的数据和产品下载的过程中,是建立单个站点的产品,数据的文件夹。如何实现单天多个站点的处理,以及多天多个站点的处理?

在MG-APP输入已知参数(坐标,对流层)

想改MG-APP代码,固定坐标(已经知道)或者对流层参数(已经从其他渠道获取),不想大改,去调整矩阵结构去少估计参数。是不是可以在每次更新的时候,将对应位置过程噪声设为0,以及同时给想固定参数赋值,即可达到相应效果。是否从理论上可行。

new assert out of range

Again the program ends with an assert.
The code throw the assert in the function SRIFAlgorithm::changeSRIFPara to the line 207 of the file SRIFAlgorithm.cpp when the program attempts to access beyond the size of the variable tempXk_1

198 VectorXd tempXk_1 = m_Xk;
    m_Xk.resize(epochLenLB+m_const_param);
    m_Xk.setZero();
    //Xk.resize(epochLenLB+5);
    for (int i = 0;i < m_const_param;i++)
        m_Xk(i) = tempXk_1(i);
    for (int i = 0;i<epochLenLB;i++)
    {
        if (oldPrnFlag.at(i)!=-1)//Save the old satellite ambiguity
            m_Xk(m_const_param+i) = tempXk_1(oldPrnFlag.at(i)+m_const_param); // <------ the assert is throw here
        else
        {//New satellite ambiguity calculation
            SatlitData oneStalit = epochSatlitData.at(i);
            m_Xk(m_const_param+i) = (oneStalit.PP3 - oneStalit.LL3)/M_GetLamta3(oneStalit.Frq[0],oneStalit.Frq[1]);
        }
213  }

The local variable tempXk_1 is equal to SRIFAlgorithm::m_Xk variable.
I looked where the size of the variable m_Xk change.
m_Xk is resize with an incorrect size in the function SRIFAlgorithm::SRIFforStatic at line 651.

646 if(gross_LC)
    {
        // restore filter state
        m_Rp = temp_Rp; m_Zp = temp_Zp; m_Phi_Inv = temp_Phi_Inv; m_G = temp_G;
        m_Phi = temp_Phi; m_Rwk = temp_Rwk; m_Q = temp_Q;
        m_Xk = temp_Xk; // <--- Here change the size of m_Xk
        memcpy(m_SPP_Pos, temp_SPP_POS, 3*sizeof(double));
        X.setZero();
        P.setIdentity();
        P = P * 1e10;
656 }

The assert happens when in function SRIFAlgorithm::SRIFforStatic gross_LC = true and epochLenLB - del_len > 5 is false and epochLenLB=6 and del_len=1

600     if(epochLenLB - del_len > 5)
        {
            for(int i = 0; i < del_len;i++)
                currEpoch.remove(del_flag[i]);
            epochLenLB = currEpoch.length();// update epochLenLB

            // restore filter state
            m_Rp = temp_Rp; m_Zp = temp_Zp; m_Phi_Inv = temp_Phi_Inv; m_G = temp_G;
            m_Phi = temp_Phi; m_Rwk = temp_Rwk; m_Q = temp_Q;
            m_Xk = temp_Xk;
            memcpy(m_SPP_Pos, temp_SPP_POS, 3*sizeof(double));
            filter(preEpoch, currEpoch, X, P);
        }
        else
        {
            break;  // <----- when the assert is throw the program pass here
616     }

This in my opinion is the cause of the error.
I don't know how to change the code to correct the error.

I think that the line 600 in the file SRIFAlgorithm.cpp can be changed like this:
if((epochLenLB - del_len) >= 5)
Even with 5 satellites it is possible to calculate the position.

use of COD sp3 files

To compile on my platform (Ubuntu 18.04) I had to modify the code like this:

diff --git a/QtMyTest.cpp b/QtMyTest.cpp
--- a/QtMyTest.cpp
+++ b/QtMyTest.cpp
@@ -44,7 +44,7 @@ void testSplash()
 #ifdef _WIN32
         #include <windows.h>
         Sleep(1000);
-#elif
+#else
         sleep(1000);
 #endif
     }
@@ -87,7 +87,11 @@ void testFtpClient()
     for(int i = 0;i < 0;i++)
     {
         m_FtpClient.pushData2Http("http://127.0.0.1/testJSON.php", "{\"firstName\": \"Gongwei\", \"lastName\": \"Xiao\"}");
+#ifdef _WIN32
         Sleep(1000);
+#else
+       sleep(1000);
+#endif
     }
 
     int a = 0;

For use the program I had to modify the code like this:

diff --git a/main.cpp b/main.cpp
--- a/main.cpp
+++ b/main.cpp
@@ -10,7 +10,7 @@
 int main(int argc, char *argv[])
 {
     QApplication a(argc, argv);
-    testMain();// test some classes and functions
+    //testMain();// test some classes and functions
 
     MainWindow wnd;
     wnd.show();

Two subsequent sp3 files product of CODE centre have an epoch equal:
the last of first file and the first of second file. This produce an
problem in the program that it not find the correct epoch at boundary
of the files. To overcome the problem I made the following change:

diff --git a/QReadSP3.cpp b/QReadSP3.cpp
--- a/QReadSP3.cpp
+++ b/QReadSP3.cpp
@@ -260,7 +260,10 @@ void QReadSP3::readFileData2Vec(QStringList SP3FileNames)
                                }
                                tempLine = sp3file.readLine();//Read a row of coordinate data
                        }
-                       m_allEpochData.append(epochData);//Save a file data
+                        if (!m_allEpochData.empty() && m_allEpochData.back().GPSTime == epochData.GPSTime)
+                               m_allEpochData.back() = epochData;//Replace equal GPSTime data
+                       else
+                               m_allEpochData.append(epochData);//Save a file data
                }//End of reading file
                sp3file.close();
        }//for (int i = 0;i < SP3FileNames.length();i++)//Read multiple files at the end

I attach a test case with sp3 and clk CODE files.
test_data.zip

In the this test case the station geno have:
C 8 C2I L2I D2I S2I C7I L7I D7I S7I
observations for BeiDou costellation.
With the change from 2-7-6 to 2-6-7 in frequences selection the BeiDou observations
not are most used.

用户对代码的一些疑问

1.周跳探测问题
2.在SRIF设计中m_Rwk,比如观测11颗卫星,22个观测量,那R的大小是(22*22),为什么还要加入m_const_param?
3.没有使用多普勒观测量,那动态PPP里面速度量怎么办啊?
4.SRIF滤波的原理是什么,相关原理文献我没有找到讲得明白的,它相比标准Kalman滤波的优点是什么?
以上问题在下面的附件文件中。
几个小问题.docx

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.