diff --git a/include/gnss_utils/tdcp.h b/include/gnss_utils/tdcp.h index dadb9384f8786ac3d2f135e5016eceec55cfd0d2..7005a84596a41a9fb6a4cd491b8d7b6f546f1111 100644 --- a/include/gnss_utils/tdcp.h +++ b/include/gnss_utils/tdcp.h @@ -44,6 +44,15 @@ TdcpOutput Tdcp(SnapshotPtr snapshot_r, const TdcpBatchParams& tdcp_params, const Options& opt); +TdcpOutput Tdcp(SnapshotPtr snapshot_r, + SnapshotPtr snapshot_k, + const Eigen::Vector3d& x_r, + const Eigen::Vector4d& d_0, + const std::set<int>& discarded_sats, + const std::set<int>& tracked_sats, + const TdcpBatchParams& tdcp_params, + const Options& opt); + TdcpOutput Tdcp(SnapshotPtr snapshot_r, SnapshotPtr snapshot_k, const Eigen::Vector3d& x_r, diff --git a/src/tdcp.cpp b/src/tdcp.cpp index ad76131b3d47f4ce0db4e67a8a3e898d05ec3cd2..995489cf4b66e4d75ea5f19127e7ec269133cd13 100644 --- a/src/tdcp.cpp +++ b/src/tdcp.cpp @@ -31,12 +31,30 @@ TdcpOutput Tdcp(SnapshotPtr snapshot_r, tdcp_params, opt); } +TdcpOutput Tdcp(SnapshotPtr snapshot_r, + SnapshotPtr snapshot_k, + const Eigen::Vector3d& x_r, + const Eigen::Vector4d& d_0, + const std::set<int>& discarded_sats, + const TdcpBatchParams& tdcp_params, + const Options& opt) +{ + return Tdcp(snapshot_r, + snapshot_k, + x_r, + d_0, + discarded_sats, + std::set<int>({}), + tdcp_params, + opt); +} TdcpOutput Tdcp(SnapshotPtr snapshot_r, SnapshotPtr snapshot_k, const Eigen::Vector3d& x_r, const Eigen::Vector4d& d_0, const std::set<int>& discarded_sats, + const std::set<int>& tracked_sats, const TdcpBatchParams& tdcp_params, const Options& opt) { @@ -63,12 +81,23 @@ TdcpOutput Tdcp(SnapshotPtr snapshot_r, if (not snapshot_r->rangesComputed()) snapshot_r->computeRanges(x_r, opt); if (not snapshot_k->rangesComputed()) - snapshot_k->computeRanges(x_r, opt); // the x_r is only used to compute Azels -> corrections + snapshot_k->computeRanges(x_r, opt); // the x_r is only used to compute Azels -> iono&tropo corrections // FIND COMMON SATELLITES std::set<int> common_sats = Range::findCommonSatellites(snapshot_r->getRanges(), snapshot_k->getRanges()); + // FILTER OUT SATELLITES NOT IN tracked_sats (if not empty) + if (not tracked_sats.empty()) + { + auto com_sat_it = common_sats.begin(); + while (com_sat_it != common_sats.end()) + if (tracked_sats.count(*com_sat_it) == 0) + com_sat_it = common_sats.erase(com_sat_it); + else + com_sat_it++; + } + if (common_sats.empty()) { TdcpOutput output; @@ -141,16 +170,34 @@ TdcpOutput Tdcp(SnapshotPtr snapshot_r, auto&& range_k = snapshot_k->getRanges().at(sat); // Carrier phase - // L1/E1 - if (std::abs(range_r.L_corrected) > 1e-12 and std::abs(range_k.L_corrected) > 1e-12) - row_2_sat_freq[row++] = std::make_pair(sat, 0); + // corrected + if (tdcp_params.tdcp.corr_iono or tdcp_params.tdcp.corr_tropo) + { + // L1/E1 + if (std::abs(range_r.L_corrected) > 1e-12 and std::abs(range_k.L_corrected) > 1e-12) + row_2_sat_freq[row++] = std::make_pair(sat, 0); + + if (!tdcp_params.tdcp.multi_freq) + continue; + + // L2 (GPS/GLO/QZS) / E5 (GAL) + if (std::abs(range_r.L2_corrected) > 1e-12 and std::abs(range_k.L2_corrected) > 1e-12) + row_2_sat_freq[row++] = std::make_pair(sat, 1); + } + // not corrected + else + { + // L1/E1 + if (std::abs(range_r.L) > 1e-12 and std::abs(range_k.L) > 1e-12) + row_2_sat_freq[row++] = std::make_pair(sat, 0); - if (!tdcp_params.tdcp.multi_freq) - continue; + if (!tdcp_params.tdcp.multi_freq) + continue; - // L2 (GPS/GLO/QZS) / E5 (GAL) - if (std::abs(range_r.L2_corrected) > 1e-12 and std::abs(range_k.L2_corrected) > 1e-12) - row_2_sat_freq[row++] = std::make_pair(sat, 1); + // L2 (GPS/GLO/QZS) / E5 (GAL) + if (std::abs(range_r.L2) > 1e-12 and std::abs(range_k.L2) > 1e-12) + row_2_sat_freq[row++] = std::make_pair(sat, 1); + } } int n_differences = row_2_sat_freq.size(); @@ -183,10 +230,21 @@ TdcpOutput Tdcp(SnapshotPtr snapshot_r, s_r.col(row) = snapshot_r->getSatellites().at(sat_number).pos; s_k.col(row) = snapshot_k->getSatellites().at(sat_number).pos; - if (freq == 0) - drho_m(row) = range_k.L_corrected - range_r.L_corrected; + // time differenced carrier phase measurements + if (tdcp_params.tdcp.corr_iono or tdcp_params.tdcp.corr_tropo) + { + if (freq == 0) + drho_m(row) = range_k.L_corrected - range_r.L_corrected; + else + drho_m(row) = range_k.L2_corrected - range_r.L2_corrected; + } else - drho_m(row) = range_k.L2_corrected - range_r.L2_corrected; + { + if (freq == 0) + drho_m(row) = range_k.L - range_r.L; + else + drho_m(row) = range_k.L2 - range_r.L2; + } #if GNSS_UTILS_TDCP_DEBUG == 1 std::cout << "\tsat " << sat_number; @@ -194,8 +252,16 @@ TdcpOutput Tdcp(SnapshotPtr snapshot_r, << "\tpositions:" << std::endl << "\t\ts_r: " << s_r.col(row).transpose() << std::endl << "\t\ts_k: " << s_k.col(row).transpose() << std::endl; - std::cout << "\trange_r.L: " << (freq == 0 ? range_r.L_corrected : range_r.L2_corrected) << std::endl; - std::cout << "\trange_k.L: " << (freq == 0 ? range_k.L_corrected : range_k.L2_corrected) << std::endl; + if (tdcp_params.tdcp.corr_iono or tdcp_params.tdcp.corr_tropo) + { + std::cout << "\trange_r.L: " << (freq == 0 ? range_r.L_corrected : range_r.L2_corrected) << std::endl; + std::cout << "\trange_k.L: " << (freq == 0 ? range_k.L_corrected : range_k.L2_corrected) << std::endl; + } + else + { + std::cout << "\trange_r.L: " << (freq == 0 ? range_r.L : range_r.L2) << std::endl; + std::cout << "\trange_k.L: " << (freq == 0 ? range_k.L : range_k.L2) << std::endl; + } std::cout << "\tdrho_m: " << drho_m(row) << std::endl; #endif diff --git a/test/gtest_tdcp.cpp b/test/gtest_tdcp.cpp index 1338b7e09879b6d6ae93c551a52f6165e34f0112..cdb90c91ac14a642e40a7a3f75cd8c549cc1de2e 100644 --- a/test/gtest_tdcp.cpp +++ b/test/gtest_tdcp.cpp @@ -133,9 +133,11 @@ TEST(Tdcp, Tdcp) // Range r Range range_r; range_r.sat = j; - range_r.L_corrected = range + CLIGHT * clock_r; + range_r.L = range + CLIGHT * clock_r; + range_r.L_corrected = range_r.L; range_r.L_var = 1; - range_r.L2_corrected = range_r.L_corrected; + range_r.L2 = range_r.L; + range_r.L2_corrected = range_r.L; range_r.L2_var = range_r.L_var; snapshot_r->getRanges().emplace(j, range_r); @@ -154,9 +156,11 @@ TEST(Tdcp, Tdcp) // Range k Range range_k; range_k.sat = j; - range_k.L_corrected = range + CLIGHT * clock_k; + range_k.L = range + CLIGHT * clock_k; + range_k.L_corrected = range_k.L; range_k.L_var = 1; - range_k.L2_corrected = range_k.L_corrected; + range_k.L2 = range_k.L; + range_k.L2_corrected = range_k.L; range_k.L2_var = range_k.L_var; snapshot_k->getRanges().emplace(j, range_k); @@ -265,9 +269,11 @@ TEST(Tdcp, Tdcp_raim) // Range r Range range_r; range_r.sat = j; - range_r.L_corrected = range + CLIGHT * clock_r; + range_r.L = range + CLIGHT * clock_r; + range_r.L_corrected = range_r.L; range_r.L_var = 1; - range_r.L2_corrected = range_r.L_corrected; + range_r.L2 = range_r.L; + range_r.L2_corrected = range_r.L; range_r.L2_var = range_r.L_var; snapshot_r->getRanges().emplace(j, range_r); @@ -286,9 +292,11 @@ TEST(Tdcp, Tdcp_raim) // Range k Range range_k; range_k.sat = j; - range_k.L_corrected = range + CLIGHT * clock_k; + range_k.L = range + CLIGHT * clock_k; + range_k.L_corrected = range_k.L; range_k.L_var = 1; - range_k.L2_corrected = range_k.L_corrected; + range_k.L2 = range_k.L; + range_k.L2_corrected = range_k.L; range_k.L2_var = range_k.L_var; snapshot_k->getRanges().emplace(j, range_k); @@ -300,8 +308,10 @@ TEST(Tdcp, Tdcp_raim) // Distort 2 ranges -> to be detected by RAIM int wrong_sat1 = i % N_sats; snapshot_k->getRanges().at(wrong_sat1).L_corrected += 20; + snapshot_k->getRanges().at(wrong_sat1).L += 20; int wrong_sat2 = (i + N_sats / 2) % N_sats; snapshot_r->getRanges().at(wrong_sat2).L_corrected -= 10; + snapshot_r->getRanges().at(wrong_sat2).L -= 10; // TDCP