From 40215027c3860c831c84492bb42b30edd963e70b Mon Sep 17 00:00:00 2001 From: joanvallve <jvallve@iri.upc.edu> Date: Wed, 28 Apr 2021 14:45:43 +0200 Subject: [PATCH] wip --- .../gnss/processor/processor_tracker_gnss.h | 2 + src/processor/processor_tracker_gnss.cpp | 44 +++++++++++++------ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/include/gnss/processor/processor_tracker_gnss.h b/include/gnss/processor/processor_tracker_gnss.h index ab710f73b..5a544d800 100644 --- a/include/gnss/processor/processor_tracker_gnss.h +++ b/include/gnss/processor/processor_tracker_gnss.h @@ -25,6 +25,7 @@ struct ParamsProcessorTrackerGnss : public ParamsProcessorTrackerFeature bool init_frames, pseudo_ranges, fix; double enu_map_fix_dist; int min_sbas_sats; + bool detect_cycle_slips; ParamsProcessorTrackerGnss() = default; ParamsProcessorTrackerGnss(std::string _unique_name, const ParamsServer& _server): @@ -39,6 +40,7 @@ struct ParamsProcessorTrackerGnss : public ParamsProcessorTrackerFeature fix = _server.getParam<bool> (prefix + _unique_name + "/fix"); pseudo_ranges = _server.getParam<bool> (prefix + _unique_name + "/pseudo_ranges"); min_sbas_sats = _server.getParam<int> (prefix + _unique_name + "/gnss/min_sbas_sats"); + detect_cycle_slips = _server.getParam<bool> (prefix + _unique_name + "/detect_cycle_slips"); // GNSS OPTIONS (see rtklib.h) gnss_opt.sateph = _server.getParam<int> (prefix + _unique_name + "/gnss/sateph"); // satellite ephemeris option: EPHOPT_BRDC(0):broadcast ephemeris, EPHOPT_PREC(1): precise ephemeris, EPHOPT_SBAS(2): broadcast + SBAS, EPHOPT_SSRAPC(3): broadcast + SSR_APC, EPHOPT_SSRCOM(4): broadcast + SSR_COM, EPHOPT_LEX(5): QZSS LEX ephemeris, EPHOPT_SBAS2(6):broadcast + SBAS(sats with SBAS corr and sats with BRDC eph), EPHOPT_SBAS3(7):broadcast + SBAS(EPHOPT_SBAS if possible, otherwise EPHOPT_SBAS2), EPHOPT_SBAS4(8):broadcast + SBAS(EPHOPT_SBAS if possible, otherwise EPHOPT_BRDC) diff --git a/src/processor/processor_tracker_gnss.cpp b/src/processor/processor_tracker_gnss.cpp index 7687491ba..23d4ab9a8 100644 --- a/src/processor/processor_tracker_gnss.cpp +++ b/src/processor/processor_tracker_gnss.cpp @@ -214,6 +214,8 @@ unsigned int ProcessorTrackerGnss::trackFeatures(const FeatureBasePtrList& _feat assert(_capture == incoming_ptr_); int common_sats = 0; + int wrong_carrier = 0; + int cycle_slips = 0; for (auto feat_in : _features_in) { @@ -224,29 +226,45 @@ unsigned int ProcessorTrackerGnss::trackFeatures(const FeatureBasePtrList& _feat WOLF_DEBUG("tracking " , feat_in->trackId() , ", sat number ", sat_num); + // satellite exists if (untracked_incoming_features_.count(sat_num) != 0) + { common_sats++; - if (untracked_incoming_features_.count(sat_num) != 0 and - std::abs(untracked_incoming_features_.at(sat_num)->getObservation().L[0]) > 1e-12) // Track only carrier phase valid - { - auto ftr = untracked_incoming_features_[sat_num]; - untracked_incoming_features_.erase(sat_num); - _features_out.push_back(ftr); - _feature_correspondences[ftr] = std::make_shared<FeatureMatch>(FeatureMatch({feat_in,0})); + // valid carrier phase data + if (std::abs(untracked_incoming_features_.at(sat_num)->getObservation().L[0]) > 1e-12) + { + // cycle slip + if (params_tracker_gnss_->detect_cycle_slips and + std::abs(untracked_incoming_features_.at(sat_num)->getRange().L - feat_in_gnss->getRange().L) > 0.1) + { + cycle_slips++; + WOLF_DEBUG("\tnot tracked, cycle slip detected" ); + continue; + } + + auto ftr = untracked_incoming_features_[sat_num]; + untracked_incoming_features_.erase(sat_num); + _features_out.push_back(ftr); + _feature_correspondences[ftr] = std::make_shared<FeatureMatch>(FeatureMatch({feat_in,0})); - WOLF_DEBUG("\ttracked: " , feat_in->trackId() , " last: " , feat_in->id() , " inc: " , ftr->id() , " !" ); + WOLF_DEBUG("\ttracked: " , feat_in->trackId() , " last: " , feat_in->id() , " inc: " , ftr->id() , " !" ); + } + else + { + wrong_carrier++; + WOLF_DEBUG("\tnot tracked, wrong carrier phase value" ); + } } else - { - WOLF_DEBUG_COND(untracked_incoming_features_.count(sat_num) == 0, "\tnot tracked, missing satellite" ); - WOLF_DEBUG_COND(untracked_incoming_features_.count(sat_num) == 1, "\tnot tracked, wrong carrier phase value" ); - } + WOLF_DEBUG("\tnot tracked, missing satellite" ); } WOLF_WARN_COND(_features_out.empty() and _features_out.begin() == known_features_incoming_.begin(), "ProcessorTrackerGnss::trackFeatures: LOST TRACK OF ALL SATELLITES of ", _features_in.size(), - " - ", common_sats, " due to wrong Carrier Phase data."); + " - common sats: ", common_sats, + " - wrong carrier data: ", wrong_carrier, + " - cycle slips: ", cycle_slips); WOLF_DEBUG_COND(_features_out.begin() == new_features_incoming_.begin(), "ProcessorTrackerGnss::trackFeatures: tracked " , _features_out.size(), " new features (of ", _features_in.size(), ")"); -- GitLab