diff --git a/include/gnss/processor/processor_tracker_gnss.h b/include/gnss/processor/processor_tracker_gnss.h index 768bc9c041be2571072fefaef30ea4b5caf7e526..ab710f73bb0b1a95461f035620ccdf0d42321a5e 100644 --- a/include/gnss/processor/processor_tracker_gnss.h +++ b/include/gnss/processor/processor_tracker_gnss.h @@ -22,7 +22,7 @@ struct ParamsProcessorTrackerGnss : public ParamsProcessorTrackerFeature double max_time_span; bool remove_outliers, remove_outliers_tdcp, remove_outliers_with_fix; double outlier_residual_th; - bool init_frames, pseudo_ranges; + bool init_frames, pseudo_ranges, fix; double enu_map_fix_dist; int min_sbas_sats; @@ -36,6 +36,7 @@ struct ParamsProcessorTrackerGnss : public ParamsProcessorTrackerFeature init_frames = _server.getParam<bool> (prefix + _unique_name + "/init_frames"); max_time_span = _server.getParam<double> (prefix + _unique_name + "/keyframe_vote/max_time_span"); enu_map_fix_dist = _server.getParam<double> (prefix + _unique_name + "/enu_map_fix_dist"); + 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"); diff --git a/src/processor/processor_tracker_gnss.cpp b/src/processor/processor_tracker_gnss.cpp index 02b8fcee394700e7a1277c2bf4ac59fa1ce87057..7687491ba6627ec90aa4424271efdc1382f97f08 100644 --- a/src/processor/processor_tracker_gnss.cpp +++ b/src/processor/processor_tracker_gnss.cpp @@ -2,9 +2,11 @@ #include "gnss/capture/capture_gnss.h" #include "gnss/feature/feature_gnss_tdcp.h" +#include "gnss/feature/feature_gnss_fix.h" #include "gnss/factor/factor_gnss_tdcp.h" #include "gnss/factor/factor_gnss_tdcp_3d.h" #include "gnss/factor/factor_gnss_pseudo_range.h" +#include "gnss/factor/factor_gnss_fix_3d.h" #include "gnss_utils/utils/rcv_position.h" #include "gnss_utils/tdcp.h" @@ -48,8 +50,7 @@ void ProcessorTrackerGnss::preProcess() // compute satellites positions inc_snapshot ->computeSatellites(copy_opt.sateph); - /* iono, tropo, eph and sbas options are the less restrictive to avoid RTKLIB to discard satellites - * corrections are applied in computeRanges, this fix is only used for: + /* this fix is used for: * - set ENU * - compute azimuths and elevations * - Take the eventual discarded sats by RAIM @@ -321,6 +322,28 @@ void ProcessorTrackerGnss::establishFactors() FactorBasePtrList new_factors; + // FIX FACTOR + if (params_tracker_gnss_->fix) + { + GnssUtils::SnapshotPtr last_snapshot = std::static_pointer_cast<CaptureGnss>(last_ptr_)->getSnapshot(); + + + auto fix = GnssUtils::computePos(*last_snapshot->getObservations(), + *last_snapshot->getNavigation(), + params_tracker_gnss_->gnss_opt); + if (fix.success) + { + FeatureBasePtr ftr = FeatureBase::emplace<FeatureGnssFix>(last_ptr_, fix); + + FactorBase::emplace<FactorGnssFix3d>(ftr, + ftr, + sensor_gnss_, + shared_from_this(), + params_tracker_gnss_->apply_loss_function, + FAC_ACTIVE); + } + } + // PSEUDO RANGE FACTORS (all sats) if (params_tracker_gnss_->pseudo_ranges) for (auto ftr : last_ptr_->getFeatureList()) @@ -411,17 +434,17 @@ void ProcessorTrackerGnss::establishFactors() common_sats.insert(std::static_pointer_cast<FeatureGnssSatellite>(match.second.first)->satNumber()); } WOLF_DEBUG("TDCP BATCH common_sats: ", common_sats.size()); - for (auto sat : common_sats) - std::cout << sat << " "; - std::cout << std::endl; + //for (auto sat : common_sats) + // std::cout << sat << " "; + //std::cout << std::endl; // DEBUG: FIND COMMON SATELLITES OBSERVATIONS std::set<int> common_sats_debug = GnssUtils::Observations::findCommonObservations(*ref_cap_gnss->getSnapshot()->getObservations(), *last_cap_gnss->getSnapshot()->getObservations()); WOLF_DEBUG("TDCP BATCH common_sats_debug: ", common_sats_debug.size()); - for (auto sat : common_sats_debug) - std::cout << sat << " "; - std::cout << std::endl; + //for (auto sat : common_sats_debug) + // std::cout << sat << " "; + //std::cout << std::endl; // reference ECEF position Eigen::Vector3d x_r = sensor_gnss_->computeFrameAntennaPosEcef(KF); @@ -440,14 +463,13 @@ void ProcessorTrackerGnss::establishFactors() // EMPLACE FEATURE auto ftr = FeatureBase::emplace<FeatureGnssTdcp>(last_cap_gnss, Eigen::Vector3d(tdcp_output.d.head<3>()), Eigen::Matrix3d(tdcp_output.cov_d.topLeftCorner<3,3>())); - //auto ftr = FeatureBase::emplace<FeatureGnssTdcp>(cap_gnss, tdcp_output.d, tdcp_output.cov_d); // EMPLACE FACTOR FactorBase::emplace<FactorGnssTdcp3d>(ftr, ftr, KF, sensor_gnss_, shared_from_this()); } else { - WOLF_WARN("TDCP BATCH failed with msg: ", tdcp_output.msg); + WOLF_DEBUG("TDCP BATCH failed with msg: ", tdcp_output.msg); } } }