mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2025-01-22 15:07:23 +00:00
[TAS-145][Feat][PVT] Implement PVT logic for osnma data
* Created a map with PRN-> set<IOD_nav> * osnma transmits every 30 s the list of authenticated PRNs along with the IOD authenticated * PVT takes this into account to consider the observable valid (only strict mode) * ""successfully"" tested. Osnma first tag authenticated: 1:36, TTFAF 2:06 => most of the time the PVT has authenticated solution, except two 30s gaps in which there is no PVT computed. (3-4' firs gap and second from 13:30-14:06) * TODOs: find out reason and improve size management of the maps.
This commit is contained in:
parent
2e867f2dac
commit
092a78f580
@ -1658,13 +1658,10 @@ void rtklib_pvt_gs::msg_handler_osnma(const pmt::pmt_t& msg)
|
||||
// so with ADKD0 and ADKD12 validated), their corresponding TOW at the beginning
|
||||
// of the authenticated subframe, and maybe the COP.
|
||||
const size_t msg_type_hash_code = pmt::any_ref(msg).type().hash_code();
|
||||
if (msg_type_hash_code == typeid(std::shared_ptr<OSNMA_data>).hash_code())
|
||||
if (msg_type_hash_code == typeid(std::shared_ptr<OSNMA_NavData>).hash_code())
|
||||
{
|
||||
// Act according to NMA data
|
||||
if (d_osnma_strict)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
const auto osnma_data = wht::any_cast<std::shared_ptr<OSNMA_NavData>>(pmt::any_ref(msg));
|
||||
d_auth_nav_data_map[osnma_data->get_prn_d()].insert(osnma_data->get_IOD_nav());
|
||||
}
|
||||
}
|
||||
catch (const wht::bad_any_cast& e)
|
||||
@ -2051,7 +2048,14 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item
|
||||
if (d_osnma_strict && ((std::string(in[i][epoch].Signal, 2) == std::string("1B")) || ((std::string(in[i][epoch].Signal, 2) == std::string("7X")))))
|
||||
{
|
||||
// Pick up only authenticated satellites
|
||||
// TODO
|
||||
auto IOD_nav_list = d_auth_nav_data_map.find(tmp_eph_iter_gal->second.PRN);
|
||||
if (IOD_nav_list != d_auth_nav_data_map.cend())
|
||||
{
|
||||
if (IOD_nav_list->second.find(tmp_eph_iter_gal->second.IOD_nav) != IOD_nav_list->second.cend())
|
||||
{
|
||||
store_valid_observable = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "gnss_block_interface.h"
|
||||
#include "gnss_synchro.h"
|
||||
#include "gnss_time.h"
|
||||
#include "osnma_data.h"
|
||||
#include "rtklib.h"
|
||||
#include <boost/date_time/gregorian/gregorian.hpp>
|
||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||
@ -203,6 +204,7 @@ private:
|
||||
std::map<int, Gnss_Synchro> d_gnss_observables_map;
|
||||
std::map<int, Gnss_Synchro> d_gnss_observables_map_t0;
|
||||
std::map<int, Gnss_Synchro> d_gnss_observables_map_t1;
|
||||
std::map<uint32_t, std::set<uint32_t>> d_auth_nav_data_map;
|
||||
|
||||
std::queue<GnssTime> d_TimeChannelTagTimestamps;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user