From e3b7e7124db8fbb490ce54ad08b9467236897818 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joan=20Vallv=C3=A9=20Navarro?= <jvallve@iri.upc.edu>
Date: Wed, 26 Oct 2022 16:46:13 +0200
Subject: [PATCH] ouptut covariance on clock bias

---
 include/gnss_utils/gnss_utils.h | 20 ++++++++++----------
 src/utils/rcv_position.cpp      | 23 ++++++++++++-----------
 2 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/include/gnss_utils/gnss_utils.h b/include/gnss_utils/gnss_utils.h
index c00bf50..f00d1be 100644
--- a/include/gnss_utils/gnss_utils.h
+++ b/include/gnss_utils/gnss_utils.h
@@ -52,16 +52,16 @@ struct ComputePosOutput
 {
   time_t          time;
   double          sec;
-  Eigen::Vector3d pos;        // position (m)
-  Eigen::Vector3d vel;        // velocity (m/s)
-  Eigen::Matrix3d pos_covar;  // position covariance (m^2)
-                              // {c_xx,c_yy,c_zz,c_xy,c_yz,c_zx}
-  Eigen::VectorXd rcv_bias;   // receiver clock bias to time systems (s) 0: receiver clock bias (s), 1: glo-gps time offset (s), 2: gal-gps time offset (s), 3: bds-gps time offset (s)
-  int             type;       // coordinates used (0:xyz-ecef,1:enu-baseline)
-  int             stat;       // solution status (SOLQ_???)
-  int             ns;         // number of valid satellites
-  double          age;        // age of differential (s)
-  double          ratio;      // AR ratio factor for valiation
+  Eigen::Vector3d pos;          // position (m)
+  Eigen::Vector3d vel;          // velocity (m/s)
+  Eigen::Matrix4d sol_cov;      // solution covariance [x, y, z, dt] (m², s²)
+  Eigen::Vector4d rcv_bias;     // receiver clock bias to time systems (s) 0: receiver clock bias (s), 1: glo-gps time offset (s), 2: gal-gps time offset (s), 3: bds-gps time offset (s)
+  Eigen::Vector4d rcv_bias_var; // receiver clock bias variances 0: receiver clock bias (s), 1: glo-gps time offset (s), 2: gal-gps time offset (s), 3: bds-gps time offset (s)
+  int             type;         // coordinates used (0:xyz-ecef,1:enu-baseline)
+  int             stat;         // solution status (SOLQ_???)
+  int             ns;           // number of valid satellites
+  double          age;          // age of differential (s)
+  double          ratio;        // AR ratio factor for valiation
 
   bool            success;   // return from pntpos true/false
   std::string     msg;       // message returned (in case of error)
diff --git a/src/utils/rcv_position.cpp b/src/utils/rcv_position.cpp
index b354333..77e66b7 100644
--- a/src/utils/rcv_position.cpp
+++ b/src/utils/rcv_position.cpp
@@ -72,20 +72,21 @@ ComputePosOutput computePos(const GnssUtils::Observations& _observations,
   output.sec  = sol.time.sec;
   output.pos  = Eigen::Vector3d(sol.rr);
   output.vel  = Eigen::Vector3d(&sol.rr[3]);
-  output.pos_covar << sol.qr[0], sol.qr[3], sol.qr[5], sol.qr[3], sol.qr[1], sol.qr[4], sol.qr[5], sol.qr[4], sol.qr[2];
+  output.sol_cov << sol.qr[0],   sol.qr[3],   sol.qr[5],   sol.qdtr[4],
+                    sol.qr[3],   sol.qr[1],   sol.qr[4],   sol.qdtr[5], 
+                    sol.qr[5],   sol.qr[4],   sol.qr[2],   sol.qdtr[6],
+                    sol.qdtr[4], sol.qdtr[5], sol.qdtr[6], sol.qdtr[0];
   // std::cout << "Compute pos:  " << output.pos.transpose() << "\n";
   // std::cout << "Covariance:\n" << output.pos_covar << "\n";
 
-  if (sol.dtr != NULL)
-    output.rcv_bias =
-        (Eigen::Matrix<double, 6, 1>() << sol.dtr[0], sol.dtr[1], sol.dtr[2], sol.dtr[3], sol.dtr[4], sol.dtr[5])
-            .finished();
-  output.type    = sol.type;
-  output.stat    = sol.stat;
-  output.ns      = sol.ns;
-  output.age     = sol.age;
-  output.ratio   = sol.ratio;
-  output.lat_lon = ecefToLatLonAlt(output.pos);
+  output.rcv_bias     = Eigen::Vector4d(sol.dtr); // all 4 elements
+  output.rcv_bias_var << sol.qdtr[0], sol.qdtr[1], sol.qdtr[2], sol.qdtr[3]; // cannot use constructor from reference because it is float)
+  output.type         = sol.type;
+  output.stat         = sol.stat;
+  output.ns           = sol.ns;
+  output.age          = sol.age;
+  output.ratio        = sol.ratio;
+  output.lat_lon      = ecefToLatLonAlt(output.pos);
 
   for (auto i = 0; i < _observations.size(); i++)
     output.sat_azel.emplace(_observations.getObservationByIdx(i).sat,
-- 
GitLab