Skip to content
Snippets Groups Projects
Commit 04750da9 authored by Pep Martí Saumell's avatar Pep Martí Saumell
Browse files

Merge remote-tracking branch 'origin/devel' into 11-add-novatel-raw-data-stream

parents 65301d24 80e2e5ac
No related branches found
No related tags found
3 merge requests!20new tag,!19new tag,!11Resolve "Add Novatel raw data stream"
Subproject commit 5f9fc9b46abc503ab95b4b0ea10f3385d7560404 Subproject commit 8b97726deb3cb0597cffcd781db850a8b4c496a3
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
namespace GnssUtils namespace GnssUtils
{ {
class Observations class Observations
{ {
public: public:
...@@ -15,34 +14,26 @@ public: ...@@ -15,34 +14,26 @@ public:
~Observations(); ~Observations();
void clearObservations(); void clearObservations();
void addObservation(const obsd_t& obs); void addObservation(const obsd_t& obs);
void
loadFromRinex(const std::string& rnx_file, gtime_t t_start, gtime_t t_end, double dt = 0.0, const char* opt = "");
void removeObservationByIdx(const int& _idx); void removeObservationByIdx(const int& _idx);
void removeObservationBySat(const int& _sat); void removeObservationBySat(const int& _sat);
std::vector<obsd_t>& getObservations(); std::vector<obsd_t>& getObservations();
const std::vector<obsd_t>& getObservations() const; const std::vector<obsd_t>& getObservations() const;
obsd_t& getObservationBySat(const unsigned char& sat_number); obsd_t& getObservationBySat(const unsigned char& sat_number);
const obsd_t& getObservationBySat(const unsigned char& sat_number) const; const obsd_t& getObservationBySat(const unsigned char& sat_number) const;
obsd_t& getObservationByIdx(const int& idx); obsd_t& getObservationByIdx(const int& idx);
const obsd_t& getObservationByIdx(const int& idx) const; const obsd_t& getObservationByIdx(const int& idx) const;
obsd_t* data(); obsd_t* data();
const obsd_t* data() const; const obsd_t* data() const;
size_t size() const; size_t size() const;
bool hasSatellite(const unsigned char& i) const; bool hasSatellite(const unsigned char& i) const;
static void print(obsd_t& _obs); static void print(obsd_t& _obs);
void printBySat(const int& _sat); void printBySat(const int& _sat);
void printByIdx(const int& _idx); void printByIdx(const int& _idx);
void print(); void print();
// Filter observations // Filter observations
std::set<int> filterByEphemeris(const SatellitesPositions& sats_pos); std::set<int> filterByEphemeris(const SatellitesPositions& sats_pos);
...@@ -50,38 +41,35 @@ public: ...@@ -50,38 +41,35 @@ public:
std::set<int> filterByCode(); std::set<int> filterByCode();
std::set<int> filterByCarrierPhase(); std::set<int> filterByCarrierPhase();
std::set<int> filterByConstellations(const int& navsys); std::set<int> filterByConstellations(const int& navsys);
std::set<int> filterByElevationSnr(const Eigen::Vector3d& x_r, std::set<int> filterByElevationSnr(const Eigen::Vector3d& x_r,
const SatellitesPositions& sats_pos, const SatellitesPositions& sats_pos,
const snrmask_t& snrmask, const snrmask_t& snrmask,
const double& elmin); const double& elmin);
std::set<int> filter(const SatellitesPositions& sats_pos, std::set<int> filter(const SatellitesPositions& sats_pos,
const std::set<int>& discarded_sats, const std::set<int>& discarded_sats,
const Eigen::Vector3d& x_r, const Eigen::Vector3d& x_r,
const bool& check_code, const bool& check_code,
const bool& check_carrier_phase, const bool& check_carrier_phase,
const prcopt_t& opt); const prcopt_t& opt);
std::set<int> filter(const SatellitesPositions& sats_pos, std::set<int> filter(const SatellitesPositions& sats_pos,
const std::set<int>& discarded_sats, const std::set<int>& discarded_sats,
const Eigen::Vector3d& x_r, const Eigen::Vector3d& x_r,
const bool& check_code, const bool& check_code,
const bool& check_carrier_phase, const bool& check_carrier_phase,
const int& navsys, const int& navsys,
const snrmask_t& snrmask, const snrmask_t& snrmask,
const double& elmin); const double& elmin);
static std::set<int> findCommonObservations(const Observations& obs_1, static std::set<int> findCommonObservations(const Observations& obs_1, const Observations& obs_2);
const Observations& obs_2);
bool operator==(const Observations& other_obs) const; bool operator==(const Observations& other_obs) const;
bool operator !=(const Observations &other_obs) const; bool operator!=(const Observations& other_obs) const;
private: private:
// Private objects // Private objects
std::map<unsigned char, int> sat_2_idx_; //< key: corresponding sat number, value: idx in obs_ vector std::map<unsigned char, int> sat_2_idx_; //< key: corresponding sat number, value: idx in obs_ vector
std::vector<unsigned char> idx_2_sat_; //< key: idx in obs_ vector, value: corresponding sat number std::vector<unsigned char> idx_2_sat_; //< key: idx in obs_ vector, value: corresponding sat number
std::vector<obsd_t> obs_; //< vector of RTKLIB observations for a given epoch std::vector<obsd_t> obs_; //< vector of RTKLIB observations for a given epoch
// Private methods
}; };
} // namespace GnssUtils } // namespace GnssUtils
...@@ -92,7 +80,6 @@ private: ...@@ -92,7 +80,6 @@ private:
namespace GnssUtils namespace GnssUtils
{ {
inline const std::vector<obsd_t>& Observations::getObservations() const inline const std::vector<obsd_t>& Observations::getObservations() const
{ {
return this->obs_; return this->obs_;
...@@ -147,9 +134,9 @@ inline bool Observations::hasSatellite(const unsigned char& i) const ...@@ -147,9 +134,9 @@ inline bool Observations::hasSatellite(const unsigned char& i) const
return sat_2_idx_.count(i) != 0; return sat_2_idx_.count(i) != 0;
} }
inline bool Observations::operator !=(const Observations &other_obs) const inline bool Observations::operator!=(const Observations& other_obs) const
{ {
return !(*this == other_obs); return !(*this == other_obs);
} }
} // namespace GnssUtils } // namespace GnssUtils
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "gnss_utils/internal/config.h" #include "gnss_utils/internal/config.h"
#include "gnss_utils/gnss_utils.h" #include "gnss_utils/gnss_utils.h"
#include "gnss_utils/observations.h"
#define ARRAY_SIZE(arr) sizeof(arr) / sizeof(arr[0]) #define ARRAY_SIZE(arr) sizeof(arr) / sizeof(arr[0])
#define ARRAY2D_NROWS(arr) sizeof(arr) / sizeof(arr[0]) #define ARRAY2D_NROWS(arr) sizeof(arr) / sizeof(arr[0])
...@@ -17,10 +18,20 @@ ...@@ -17,10 +18,20 @@
namespace GnssUtils namespace GnssUtils
{ {
void print(std::string& _msg); void print(std::string& _msg);
void printArray(std::string _name, int* _array, int size);
void printArray(std::string _name, unsigned char* _array, int size); template <typename T, size_t size>
void printArray(std::string _name, double* _array, int size); void printArray(std::string name, T (&array)[size])
void printArray(std::string _name, float* _array, int size); {
std::cout << name << ": [";
for (int ii = 0; ii < size; ++ii)
{
std::cout << array[ii];
if (ii == size - 1)
std::cout << "] \n";
else
std::cout << ",";
}
}
template <typename T> template <typename T>
inline bool addToArray(const T& new_element, T*& array, int& n, int& nmax) inline bool addToArray(const T& new_element, T*& array, int& n, int& nmax)
...@@ -155,6 +166,9 @@ bool equalArray3d(const T* array_1, ...@@ -155,6 +166,9 @@ bool equalArray3d(const T* array_1,
return true; return true;
} }
std::vector<Observations>
loadObservationsFromRinex(const std::string& rnx_file, gtime_t t_start, gtime_t t_end, double dt, const char* opt);
} // namespace GnssUtils } // namespace GnssUtils
bool operator==(const gtime_t& time1, const gtime_t& time2); bool operator==(const gtime_t& time1, const gtime_t& time2);
......
#include "gnss_utils/observations.h" #include "gnss_utils/observations.h"
#include "gnss_utils/navigation.h" #include "gnss_utils/navigation.h"
#include "gnss_utils/utils/transformations.h" #include "gnss_utils/utils/transformations.h"
#include "gnss_utils/utils/utils.h"
#include <typeinfo> #include <typeinfo>
...@@ -33,14 +34,16 @@ int main(int argc, char* argv[]) ...@@ -33,14 +34,16 @@ int main(int argc, char* argv[])
const char* opt = ""; // only GPS | GPS+GAL: "-SYS=G,L" | ALL: "" const char* opt = ""; // only GPS | GPS+GAL: "-SYS=G,L" | ALL: ""
// load observations from RINEX file // load observations from RINEX file
observations.loadFromRinex("../src/examples/sample_data.obs", t_start, t_end, dt, opt); std::vector<Observations> obs_rinex =
loadObservationsFromRinex("../src/examples/sample_data.obs", t_start, t_end, dt, opt);
observations = obs_rinex[0];
observations.print(); observations.print();
// RTKLIB trace // RTKLIB trace
// char str_file[80]; char str_file[80];
// snprintf(str_file, sizeof str_file, "../src/examples/trace"); snprintf(str_file, sizeof str_file, "../src/examples/trace");
// tracelevel(5); tracelevel(5);
// traceopen(str_file); traceopen(str_file);
// load navigation from RINEX file // load navigation from RINEX file
navigation.loadFromRinex("../src/examples/sample_data.nav", t_start, t_end, dt, opt); navigation.loadFromRinex("../src/examples/sample_data.nav", t_start, t_end, dt, opt);
...@@ -89,15 +92,17 @@ int main(int argc, char* argv[]) ...@@ -89,15 +92,17 @@ int main(int argc, char* argv[])
char msg[128] = ""; char msg[128] = "";
stat = pntpos(observations.data(), observations.size(), &navigation.getNavigation(), &prcopt, &solb, NULL, NULL, msg); stat = pntpos(observations.data(), observations.size(), &navigation.getNavigation(), &prcopt, &solb, NULL, NULL,
msg);
std::cout << "msg: " << msg << std::endl; std::cout << "msg: " << msg << std::endl;
std::cout << "sol.stat: " << int(solb.stat) << std::endl; std::cout << "sol.stat: " << int(solb.stat) << std::endl;
std::cout << "Position: " << solb.rr[0] << ", " << solb.rr[1] << ", " << solb.rr[2] << std::endl; std::cout << "Position: " << solb.rr[0] << ", " << solb.rr[1] << ", " << solb.rr[2] << std::endl;
std::cout << "Position (GT): " << latLonAltToEcef(lla_gt).transpose() << std::endl; std::cout << "Position (GT): " << latLonAltToEcef(lla_gt).transpose() << std::endl;
std::cout << "Position LLA: " << ecefToLatLonAlt(Eigen::Vector3d(solb.rr[0], solb.rr[1], solb.rr[2])).transpose() std::cout << "Position LLA: " << ecefToLatLonAlt(Eigen::Vector3d(solb.rr[0], solb.rr[1],
solb.rr[2])).transpose()
<< std::endl; << std::endl;
std::cout << "Position LLA (GT): " << lla_gt.transpose() << std::endl; std::cout << "Position LLA (GT): " << lla_gt.transpose() << std::endl;
traceclose(); // traceclose();
} }
...@@ -74,41 +74,6 @@ void Observations::addObservation(const obsd_t& obs) ...@@ -74,41 +74,6 @@ void Observations::addObservation(const obsd_t& obs)
assert(sat_2_idx_.size() == obs_.size()); assert(sat_2_idx_.size() == obs_.size());
} }
void Observations::loadFromRinex(const std::string& rnx_file,
gtime_t t_start,
gtime_t t_end,
double dt,
const char* opt)
{
obs_t obs;
obs.data = (obsd_t*)malloc(sizeof(obsd_t) * MAXSAT);
obs.n = 0;
obs.nmax = MAXSAT;
// const char* opt = "";
auto stat = readrnxt(rnx_file.c_str(), 1, t_start, t_end, dt, opt, &obs, NULL, NULL);
if (stat == 1)
sortobs(&obs);
else
{
std::cout << "Observation: couldn't load provided observation file, reason: " << (stat == 0 ? "no data" : "error") << stat << std::endl;
return;
}
for (int i = 0; i < obs.n; i++)
{
// std::cout << "time: " << time_str(obs.data[i].time, 3) << " | sat: " << int(obs.data[i].sat) << " | rcv: " <<
// int(obs.data[i].rcv) <<
// " | SNR: " << int(obs.data[i].SNR[0]) << " | LLI: " << int(obs.data[i].LLI[0]) << " | code: " <<
// int(obs.data[i].code[0]) <<
// " | L: " << obs.data[i].L[0] << " | P: " << obs.data[i].P[0] << " | D: " << obs.data[i].D[0] <<
// std::endl;
addObservation(obs.data[i]);
}
free(obs.data);
}
void Observations::removeObservationByIdx(const int& _idx) void Observations::removeObservationByIdx(const int& _idx)
{ {
// std::cout << "removing observation of idx " << _idx << std::endl; // std::cout << "removing observation of idx " << _idx << std::endl;
...@@ -163,15 +128,15 @@ static void Observations::print(obsd_t& _obs) ...@@ -163,15 +128,15 @@ static void Observations::print(obsd_t& _obs)
GnssUtils::print(msg); GnssUtils::print(msg);
std::cout << "Time [s]: " << _obs.time.time << " + " << _obs.time.sec << "\n"; std::cout << "Time [s]: " << _obs.time.time << " + " << _obs.time.sec << "\n";
std::cout << "Time valid: " << _obs.timevalid << std::endl; std::cout << "Time valid: " << _obs.timevalid << std::endl;
printArray("SNR: ", _obs.SNR, ARRAY_SIZE(_obs.SNR)); printArray<unsigned char, ARRAY_SIZE(_obs.SNR)>("SNR: ", _obs.SNR);
printArray("LLI: ", _obs.LLI, ARRAY_SIZE(_obs.LLI)); printArray<unsigned char, ARRAY_SIZE(_obs.LLI)>("LLI: ", _obs.LLI);
printArray("code: ", _obs.code, ARRAY_SIZE(_obs.code)); printArray<unsigned char, ARRAY_SIZE(_obs.code)>("code: ", _obs.code);
printArray("code: ", _obs.qualL, ARRAY_SIZE(_obs.qualL)); printArray<unsigned char, ARRAY_SIZE(_obs.qualL)>("code: ", _obs.qualL);
printArray("code: ", _obs.qualP, ARRAY_SIZE(_obs.qualP)); printArray<unsigned char, ARRAY_SIZE(_obs.qualP)>("code: ", _obs.qualP);
printf("Freq. channel: %uc \n", _obs.freq); printf("Freq. channel: %uc \n", _obs.freq);
printArray("L: ", _obs.L, ARRAY_SIZE(_obs.L)); printArray<double, ARRAY_SIZE(_obs.L)>("L: ", _obs.L);
printArray("P: ", _obs.P, ARRAY_SIZE(_obs.P)); printArray<double, ARRAY_SIZE(_obs.P)>("P: ", _obs.P);
printArray("D: ", _obs.D, ARRAY_SIZE(_obs.D)); printArray<float, ARRAY_SIZE(_obs.D)>("D: ", _obs.D);
} }
void Observations::printBySat(const int& _sat_number) void Observations::printBySat(const int& _sat_number)
......
...@@ -9,56 +9,53 @@ void print(std::string& _msg) ...@@ -9,56 +9,53 @@ void print(std::string& _msg)
std::cout << msg << "\n"; std::cout << msg << "\n";
} }
void printArray(std::string _name, int* _array, int size) std::vector<Observations>
loadObservationsFromRinex(const std::string& rnx_file, gtime_t t_start, gtime_t t_end, double dt, const char* opt)
{ {
std::cout << _name << ": ["; obs_t obs;
for (int ii = 0; ii < size; ++ii) obs.data = (obsd_t*)malloc(sizeof(obsd_t) * MAXSAT);
{ obs.n = 0;
std::cout << _array[ii]; obs.nmax = MAXSAT;
if (ii == size - 1)
std::cout << "] \n";
else
std::cout << ",";
}
}
void printArray(std::string _name, unsigned char* _array, int size) // const char* opt = "";
{ auto stat = readrnxt(rnx_file.c_str(), 1, t_start, t_end, dt, opt, &obs, NULL, NULL);
std::cout << _name << ": ["; int n_epochs;
for (int ii = 0; ii < size; ++ii) if (stat == 1)
n_epochs = sortobs(&obs);
else
{ {
std::cout << (int)(_array[ii]); std::cout << "Observation: couldn't load provided observation file, reason: " << (stat == 0 ? "no data" : "error")
if (ii == size - 1) << stat << std::endl;
std::cout << "] \n"; return;
else
std::cout << ",";
} }
}
void printArray(std::string _name, double* _array, int size) std::vector<Observations> obs_vector;
{ obs_vector.reserve(n_epochs);
std::cout << _name << ": [";
for (int ii = 0; ii < size; ++ii)
{
std::cout << _array[ii];
if (ii == size - 1)
std::cout << "] \n";
else
std::cout << ",";
}
}
void printArray(std::string _name, float* _array, int size) Observations obs_epoch;
{ for (int i = 0; i < obs.n; i++)
std::cout << _name << ": [";
for (int ii = 0; ii < size; ++ii)
{ {
std::cout << _array[ii]; obs_epoch.addObservation(obs.data[i]);
if (ii == size - 1)
std::cout << "] \n"; bool last_obs_epoch = false;
if (i < obs.n - 1)
{
double tt = timediff(obs.data[i].time, obs.data[i + 1].time);
if (fabs(tt) > DTTOL)
{
obs_vector.push_back(obs_epoch);
obs_epoch.clearObservations();
}
}
else else
std::cout << ","; {
obs_vector.push_back(obs_epoch);
}
} }
free(obs.data);
return obs_vector;
} }
} // namespace GnssUtils } // namespace GnssUtils
......
...@@ -55,7 +55,9 @@ TEST(ObservationsTest, LoadFromRinex) ...@@ -55,7 +55,9 @@ TEST(ObservationsTest, LoadFromRinex)
// GnssUtils utilities // GnssUtils utilities
Observations observations; Observations observations;
observations.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
std::vector<Observations> obs_rinex = loadObservationsFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
observations = obs_rinex[0];
ASSERT_EQ(obs.n, 18); ASSERT_EQ(obs.n, 18);
...@@ -75,7 +77,9 @@ TEST(ObservationsTest, GetObservationBySat) ...@@ -75,7 +77,9 @@ TEST(ObservationsTest, GetObservationBySat)
loadRinex(obs); loadRinex(obs);
Observations observations; Observations observations;
observations.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
std::vector<Observations> obs_rinex = loadObservationsFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
observations = obs_rinex[0];
for (int ii = 0; ii < obs.n; ++ii) for (int ii = 0; ii < obs.n; ++ii)
{ {
...@@ -90,7 +94,9 @@ TEST(ObservationsTest, GetObservationByIdx) ...@@ -90,7 +94,9 @@ TEST(ObservationsTest, GetObservationByIdx)
loadRinex(obs); loadRinex(obs);
Observations observations; Observations observations;
observations.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
std::vector<Observations> obs_rinex = loadObservationsFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
observations = obs_rinex[0];
for (int ii = 0; ii < obs.n; ++ii) for (int ii = 0; ii < obs.n; ++ii)
{ {
...@@ -104,7 +110,9 @@ TEST(ObservationsTest, data) ...@@ -104,7 +110,9 @@ TEST(ObservationsTest, data)
loadRinex(obs); loadRinex(obs);
Observations observations; Observations observations;
observations.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
std::vector<Observations> obs_rinex = loadObservationsFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
observations = obs_rinex[0];
for (int ii = 0; ii < obs.n; ++ii) for (int ii = 0; ii < obs.n; ++ii)
{ {
...@@ -118,7 +126,9 @@ TEST(ObservationsTest, HasSatellite) ...@@ -118,7 +126,9 @@ TEST(ObservationsTest, HasSatellite)
loadRinex(obs); loadRinex(obs);
Observations observations; Observations observations;
observations.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
std::vector<Observations> obs_rinex = loadObservationsFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
observations = obs_rinex[0];
for (int ii = 0; ii < obs.n; ++ii) for (int ii = 0; ii < obs.n; ++ii)
{ {
...@@ -129,7 +139,10 @@ TEST(ObservationsTest, HasSatellite) ...@@ -129,7 +139,10 @@ TEST(ObservationsTest, HasSatellite)
TEST(ObservationsTest, FindCommonObservations) TEST(ObservationsTest, FindCommonObservations)
{ {
Observations observations1; Observations observations1;
observations1.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
std::vector<Observations> obs_rinex = loadObservationsFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
observations1 = obs_rinex[0];
Observations observations2(observations1); Observations observations2(observations1);
ASSERT_TRUE(observations1 == observations2); ASSERT_TRUE(observations1 == observations2);
...@@ -140,15 +153,17 @@ TEST(ObservationsTest, FindCommonObservations) ...@@ -140,15 +153,17 @@ TEST(ObservationsTest, FindCommonObservations)
ASSERT_TRUE(common_sats.size() == observations2.size()); ASSERT_TRUE(common_sats.size() == observations2.size());
for (auto sat : common_sats) for (auto sat : common_sats)
{ {
ASSERT_TRUE(observations1.hasSatellite(sat)); ASSERT_TRUE(observations1.hasSatellite(sat));
ASSERT_TRUE(observations2.hasSatellite(sat)); ASSERT_TRUE(observations2.hasSatellite(sat));
} }
} }
TEST(ObservationsTest, FindCommonObservationsRemoved) TEST(ObservationsTest, FindCommonObservationsRemoved)
{ {
Observations observations1; Observations observations1;
observations1.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
std::vector<Observations> obs_rinex = loadObservationsFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
observations1 = obs_rinex[0];
Observations observations2(observations1); Observations observations2(observations1);
// Remove first observation of observations2 // Remove first observation of observations2
...@@ -161,15 +176,18 @@ TEST(ObservationsTest, FindCommonObservationsRemoved) ...@@ -161,15 +176,18 @@ TEST(ObservationsTest, FindCommonObservationsRemoved)
ASSERT_TRUE(common_sats.size() == observations2.size()); ASSERT_TRUE(common_sats.size() == observations2.size());
for (auto sat : common_sats) for (auto sat : common_sats)
{ {
ASSERT_TRUE(observations1.hasSatellite(sat)); ASSERT_TRUE(observations1.hasSatellite(sat));
ASSERT_TRUE(observations2.hasSatellite(sat)); ASSERT_TRUE(observations2.hasSatellite(sat));
} }
} }
TEST(ObservationsTest, FindCommonObservationsChangeTime) TEST(ObservationsTest, FindCommonObservationsChangeTime)
{ {
Observations observations1; Observations observations1;
observations1.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
std::vector<Observations> obs_rinex = loadObservationsFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
observations1 = obs_rinex[0];
Observations observations2(observations1); Observations observations2(observations1);
// Change time // Change time
...@@ -184,8 +202,8 @@ TEST(ObservationsTest, FindCommonObservationsChangeTime) ...@@ -184,8 +202,8 @@ TEST(ObservationsTest, FindCommonObservationsChangeTime)
ASSERT_TRUE(common_sats.size() == observations2.size()); ASSERT_TRUE(common_sats.size() == observations2.size());
for (auto sat : common_sats) for (auto sat : common_sats)
{ {
ASSERT_TRUE(observations1.hasSatellite(sat)); ASSERT_TRUE(observations1.hasSatellite(sat));
ASSERT_TRUE(observations2.hasSatellite(sat)); ASSERT_TRUE(observations2.hasSatellite(sat));
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment