Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

abort for a assert #20

Open
LucaFibbi opened this issue Apr 22, 2020 · 7 comments
Open

abort for a assert #20

LucaFibbi opened this issue Apr 22, 2020 · 7 comments
Labels
bug Something isn't working

Comments

@LucaFibbi
Copy link
Collaborator

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 ]

@XiaoGongWei
Copy link
Owner

Dear LucaFibbi ,

  • I have test MG-APP by your options, but no assert was found. Are you using the latest MG-APP?

1

  • I also tested some other options and found no assert. All the test is in Windows 10.

2

  • If you can't find the problem, I will debug the code again under Ubuntu (All MG-APP code is written in the Ubuntu environment).

@LucaFibbi
Copy link
Collaborator Author

I have used and use the latest version of MG-APP.
I have check which variables are the cause of the assert.
In function QKalmanFilter::KalmanforStatic(MatrixXd Bk,VectorXd Lk,MatrixXd F,MatrixXd Qwk,MatrixXd Rk,VectorXd &tXk_1,MatrixXd &tPk_1)
the abort is raise at the statment:
Kk = (Pkk_1Bk.transpose())((BkPkk_1Bk.transpose() + Rk).inverse());
The variable with wrong size is Pkk_1, that it is calculated from F, tPk_1 and Qwk:
Pkk_1 = FtPk_1F.transpose() + Qwk
To understand the origin of the problem I printed the values of the variable m_Fk_1
(m_Fk_1=F) in every place where a change in its size could take place. I used only
m_Fk_1 because the other variables have equal behavior.
Here the change at the code for print the debug messages:

diff --git a/QKalmanFilter.cpp b/QKalmanFilter.cpp
--- a/QKalmanFilter.cpp
+++ b/QKalmanFilter.cpp
@@ -81,11 +81,13 @@ void QKalmanFilter::initKalman(QVector< SatlitData > &currEpoch,MatrixXd &B,Vect
     case KALMAN_MODEL::SPP_STATIC:
     case KALMAN_MODEL::SPP_KINEMATIC:
         m_Fk_1.resize(m_const_param, m_const_param);
+std::cout << "DEBUG QKalmanFilter::" << __func__ << ":"<< __LINE__ << " m_Fk_1 size " << m_Fk_1.rows()<<"x"<<m_Fk_1.cols() << std::endl;
         m_Fk_1.setIdentity(m_const_param, m_const_param);
         break;
     case KALMAN_MODEL::PPP_KINEMATIC:
     case KALMAN_MODEL::PPP_STATIC:
         m_Fk_1.resize(m_const_param+epochLenLB,m_const_param+epochLenLB);
+std::cout << "DEBUG QKalmanFilter::" << __func__ << ":"<< __LINE__ << " m_Fk_1 size " << m_Fk_1.rows()<<"x"<<m_Fk_1.cols() << std::endl;
         m_Fk_1.setIdentity(m_const_param+epochLenLB,m_const_param+epochLenLB);
         break;
     default:
@@ -168,6 +170,7 @@ void QKalmanFilter::changeKalmanPara( QVector< SatlitData > &epochSatlitData,QVe
        int epochLenLB = epochSatlitData.length();
 
     m_Fk_1.resize(m_const_param+epochLenLB,m_const_param+epochLenLB);
+std::cout << "DEBUG QKalmanFilter::" << __func__ << ":"<< __LINE__ << " m_Fk_1 size " << m_Fk_1.rows()<<"x"<<m_Fk_1.cols() << std::endl;
     m_Fk_1.setZero();
     m_Fk_1.setIdentity(m_const_param+epochLenLB,m_const_param+epochLenLB);
        //Fk_1(4,4) = 0;//Static PPP has only a clock difference of 0
@@ -266,6 +269,11 @@ void QKalmanFilter::KalmanforStatic(MatrixXd Bk,VectorXd Lk,MatrixXd F,MatrixXd
     VectorXd Xkk_1 = F*tXk_1,Vk;
     MatrixXd Pkk_1 = F*tPk_1*F.transpose() + Qwk,I,tempKB,Kk;
     //Calculated gain matrix
+std::cout << "DEBUG QKalmanFilter::" << __func__ << ":"<< __LINE__ << " Qwk size " << Qwk.rows() << "x" << Qwk.cols() << std::endl;
+std::cout << "DEBUG QKalmanFilter::" << __func__ << ":"<< __LINE__ << " F size " << F.rows() << "x" << F.cols() << std::endl;
+std::cout << "DEBUG QKalmanFilter::" << __func__ << ":"<< __LINE__ << " tPk_1 size " << tPk_1.rows() << "x" << tPk_1.cols() << std::endl;
+std::cout << "DEBUG QKalmanFilter::" << __func__ << ":"<< __LINE__ << " Pkk_1 size " << Pkk_1.rows() << "x" << Pkk_1.cols() << std::endl;
+std::cout << "DEBUG QKalmanFilter::" << __func__ << ":"<< __LINE__ << " Bk size " << Bk.rows() << "x" << Bk.cols() << std::endl;
     Kk = (Pkk_1*Bk.transpose())*((Bk*Pkk_1*Bk.transpose() + Rk).inverse());
     //Filter update
     Vk = Lk - Bk*Xkk_1;
@@ -580,6 +588,7 @@ bool QKalmanFilter::KalmanforStatic(QVector< SatlitData > &preEpoch,QVector< Sat
 
             // restore filter state
             m_Fk_1 = temp_Fk_1; m_Qwk_1 = temp_Qwk_1; m_Rk_1 = temp_Rk_1;
+std::cout << "DEBUG QKalmanFilter::" << __func__ << ":"<< __LINE__ << " m_Fk_1 size " << m_Fk_1.rows()<<"x"<<m_Fk_1.cols() << std::endl;
             m_Pk_1 = temp_Pk_1; m_Xk_1 = temp_Xk_1;
             memcpy(m_SPP_Pos, temp_SPP_POS, 3*sizeof(double));
 
@@ -621,6 +630,7 @@ bool QKalmanFilter::KalmanforStatic(QVector< SatlitData > &preEpoch,QVector< Sat
     {
         // restore filter state
         m_Fk_1 = temp_Fk_1; m_Qwk_1 = temp_Qwk_1; m_Rk_1 = temp_Rk_1;
+std::cout << "DEBUG QKalmanFilter::" << __func__ << ":"<< __LINE__ << " m_Fk_1 size " << m_Fk_1.rows()<<"x"<<m_Fk_1.cols() << std::endl;
         m_Pk_1 = temp_Pk_1; m_Xk_1 = temp_Xk_1;
         memcpy(m_SPP_Pos, temp_SPP_POS, 3*sizeof(double));
         X.setZero();

Here the output for the two last epoch before the assert:

Epoch: 1217
GPST: 10:08:30
Sat. Number: 6
Valid Sat. Number: 6
Estimated coordinates: [ 4696989.2124,723994.9939,4239678.8065 ]
DEBUG QKalmanFilter::changeKalmanPara:173 m_Fk_1 size 10x10   <--- correct change the satellite number change from 6 to 5
DEBUG QKalmanFilter::KalmanforStatic:272 Qwk size 10x10
DEBUG QKalmanFilter::KalmanforStatic:273 F size 10x10
DEBUG QKalmanFilter::KalmanforStatic:274 tPk_1 size 10x10
DEBUG QKalmanFilter::KalmanforStatic:275 Pkk_1 size 10x10
DEBUG QKalmanFilter::KalmanforStatic:276 Bk size 10x10
DEBUG QKalmanFilter::KalmanforStatic:633 m_Fk_1 size 11x11   <--- incorrect change of the matrix m_Fk_1 the satellite number not change
Epoch: 1216
GPST: 10:08:00
Sat. Number: 5
Valid Sat. Number: 5
Estimated coordinates: [ 4696989.2124,723994.9939,4239678.8065 ]
DEBUG QKalmanFilter::KalmanforStatic:272 Qwk size 11x11
DEBUG QKalmanFilter::KalmanforStatic:273 F size 11x11
DEBUG QKalmanFilter::KalmanforStatic:274 tPk_1 size 11x11
DEBUG QKalmanFilter::KalmanforStatic:275 Pkk_1 size 11x11
DEBUG QKalmanFilter::KalmanforStatic:276 Bk size 10x10
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>]: asserzione "a_lhs.cols() == a_rhs.rows() && "invalid matrix product" && "if you wanted a coeff-wise or a dot product use the respective explicit functions"" non riuscita.

From the previous output I understand.
The number of satellite for the epoch with the assert is 5
The Qwk, F e tPk_1 have size of 11x11 while the correct value
is 10x10 as Bk matrix. The Qwk, F e tPk_1 matrix takes 11x11 value
of the size at QKalmanFilter::KalmanforStatic:633.

@LucaFibbi
Copy link
Collaborator Author

I have used cut-of-angle = 0. In your image I see cut-of-ange = 10. Maybe it is the cause because you no assert was found.

@XiaoGongWei
Copy link
Owner

XiaoGongWei commented Apr 24, 2020

Yes, the cutoff height Angle of the satellite is usually set to something greater than 0 (it can set it to 0 ,and Satellites are not delete by height Angle), usually 7.5 degree or 10 degree. If you set it to zero then all satellites are involved in the calculation. It's reasonable to set it to zero degree.
I will debug this problem, thank you.
12

@LucaFibbi
Copy link
Collaborator Author

OK, can't be reasonable to set cut of angle to zero degree, but the program not ignore all satellites.
I did many tests with cut of angle equal to zero degree where MG_APP produced a result without the assert.

@XiaoGongWei
Copy link
Owner

XiaoGongWei commented Apr 24, 2020

You are right. I misunderstood. I will debug this problem, thank you.
12

@XiaoGongWei
Copy link
Owner

XiaoGongWei commented Apr 24, 2020

This bug has been fixed, the main problem is the following code. A new commit has been push. bf7405aadd8373e5318faa62e34abf2602c83d95

  1. Change if(epochSatlitData.length() < m_minSatFlag to if(epochSatlitData.length() < m_minSatFlag || temp_spp_pos[0] == 0) in QPPPBackSmooth::Run 615 line.

  2. add is_filter_good flag.
    // store spp position
    spp_vct[0] = temp_spp_pos[0]; spp_vct[1] = temp_spp_pos[1]; spp_vct[2] = temp_spp_pos[2];
    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, 3sizeof(double));
    memset(spp_pos, 0, 3
    sizeof(double));
    X.setZero();
    }

@XiaoGongWei XiaoGongWei added the bug Something isn't working label Apr 24, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants