breaking change - add weeknumber to RF measuremetns
parent
26ce29bcfd
commit
0e93701b20
14
README.md
14
README.md
|
@ -10,9 +10,11 @@ Tooling:
|
|||
frames & metadata
|
||||
* navtrans: transmits GNSS NAV frames emitted by ubxtool to a collector.
|
||||
Performs some best effort buffering & will reconnect if needed.
|
||||
UPDATE -> will be part of ubxtool
|
||||
* navrecv: receives GNSS NAV frames and stores them on disk, split out per
|
||||
sender
|
||||
* navstore: tails the file stored by navrecv, puts them in LMDB
|
||||
sender. UPDATE -> part of navnexus
|
||||
* navstore: tails the file stored by navrecv, puts them in LMDB.
|
||||
UPDATE -> part of navnexus
|
||||
* navstream: produces a stream of NAV updates from all sources, with a few
|
||||
seconds delay so all data is in. Does this with queries to LMDB
|
||||
* navweb: consumes these ordered nav updates for a nice website
|
||||
|
@ -32,6 +34,14 @@ The magic value is there to help us resync from partially written data.
|
|||
The whole goal is that we can continue to rebuild the database by
|
||||
rerunning 'navstore' and 'navinflux'.
|
||||
|
||||
Big TODO
|
||||
--------
|
||||
|
||||
* Oddity of ephemeris age in doppler graph (possibly wider)
|
||||
* Navnexus permanence
|
||||
* Semantics definition for output of Navnexus
|
||||
* Idempotency and retransmit by ubxtool
|
||||
|
||||
ubxtool
|
||||
-------
|
||||
* Will also spool raw serial data to disk (in a filename that includes the
|
||||
|
|
20
navmon.proto
20
navmon.proto
|
@ -34,15 +34,17 @@ message NavMonMessage {
|
|||
|
||||
message RFData {
|
||||
required double rcvTow = 1;
|
||||
required uint32 gnssID =2;
|
||||
required uint32 gnssSV =3;
|
||||
required double doppler =4;
|
||||
required double carrierphase = 5;
|
||||
required double pseudorange = 6;
|
||||
required double locktimeMS = 7;
|
||||
required double doStd = 8;
|
||||
required double cpStd = 9;
|
||||
required double prStd = 10;
|
||||
required uint32 rcvWn = 2;
|
||||
required uint32 gnssID =3;
|
||||
required uint32 gnssSV =4;
|
||||
required double doppler =5;
|
||||
required double carrierphase = 6;
|
||||
required double pseudorange = 7;
|
||||
required double locktimeMS = 8;
|
||||
required double doStd = 9;
|
||||
required double cpStd = 10;
|
||||
required double prStd = 11
|
||||
;
|
||||
}
|
||||
|
||||
message ObserverPosition {
|
||||
|
|
|
@ -52,16 +52,19 @@ void recvSession(int s, ComboAddress client)
|
|||
if(nmm.type() == NavMonMessage::GalileoInavType) {
|
||||
std::lock_guard<std::mutex> lg(g_dedupmut);
|
||||
if(g_dedup.count({nmm.gi().gnssid(), nmm.gi().gnsssv(), nmm.gi().gnsswn(), nmm.gi().gnsstow()})) {
|
||||
cerr<<"Dedupped message from "<< nmm.sourceid()<<" "<< fmt::format("{0} {1} {2} {3}", nmm.gi().gnssid(), nmm.gi().gnsssv(), nmm.gi().gnsswn(), nmm.gi().gnsstow()) << endl;
|
||||
// cerr<<"Dedupped message from "<< nmm.sourceid()<<" "<< fmt::format("{0} {1} {2} {3}", nmm.gi().gnssid(), nmm.gi().gnsssv(), nmm.gi().gnsswn(), nmm.gi().gnsstow()) << endl;
|
||||
continue;
|
||||
}
|
||||
cerr<<"New message from "<< nmm.sourceid()<<" "<< fmt::format("{0} {1} {2} {3}", nmm.gi().gnssid(), nmm.gi().gnsssv(), nmm.gi().gnsswn(), nmm.gi().gnsstow()) << endl;
|
||||
// cerr<<"New message from "<< nmm.sourceid()<<" "<< fmt::format("{0} {1} {2} {3}", nmm.gi().gnssid(), nmm.gi().gnsssv(), nmm.gi().gnsswn(), nmm.gi().gnsstow()) << endl;
|
||||
g_dedup.insert({nmm.gi().gnssid(), nmm.gi().gnsssv(), nmm.gi().gnsswn(), nmm.gi().gnsstow()});
|
||||
}
|
||||
else
|
||||
; // cerr<<"Not an inav message "<< (int) nmm.type()<<endl;
|
||||
|
||||
g_history.insert({{nmm.localutcseconds(), nmm.localutcnanoseconds()}, out});
|
||||
if(write(g_store, out.c_str(), out.size()) != out.size()) {
|
||||
cerr<<"Failed to store message in buffer"<<endl;
|
||||
}
|
||||
for(const auto& fd : g_clients) {
|
||||
SWrite(fd, out);
|
||||
}
|
||||
|
|
50
navparse.cc
50
navparse.cc
|
@ -851,31 +851,33 @@ try
|
|||
Point sat;
|
||||
Point us=g_ourpos;
|
||||
|
||||
// be careful with time here - we need to evaluate at the timestamp of this RFDataType update
|
||||
// which might be newer than .tow in g_svstats
|
||||
getCoordinates(nmm.rfd().rcvwn(), nmm.rfd().rcvtow(), g_svstats[sv].liveIOD(), &sat);
|
||||
Point core;
|
||||
Vector us2sat(us, sat);
|
||||
Vector speed;
|
||||
getSpeed(nmm.rfd().rcvwn(), nmm.rfd().rcvtow(), g_svstats[sv].liveIOD(), &speed);
|
||||
cout<<sv<<" radius: "<<Vector(core, sat).length()<<", distance: "<<us2sat.length()<<", orbital velocity: "<<speed.length()/1000.0<<" km/s, ";
|
||||
|
||||
getCoordinates(g_svstats[sv].wn, nmm.rfd().rcvtow(), g_svstats[sv].liveIOD(), &sat);
|
||||
Point core;
|
||||
Vector us2sat(us, sat);
|
||||
Vector speed;
|
||||
getSpeed(g_svstats[sv].wn, nmm.rfd().rcvtow(), g_svstats[sv].liveIOD(), &speed);
|
||||
cout<<sv<<" radius: "<<Vector(core, sat).length()<<", distance: "<<us2sat.length()<<", orbital velocity: "<<speed.length()/1000.0<<" km/s, ";
|
||||
|
||||
Vector core2us(core, us);
|
||||
Vector dx(us, sat); // = x-ourx, dy = y-oury, dz = z-ourz;
|
||||
// double elev = acos ( core2us.inner(dx) / (core2us.length() * dx.length()));
|
||||
//double deg = 180.0* (elev/M_PI);
|
||||
// cout <<"elev: "<<90 - deg<< " ("<<g_svstats[sv].el<<")\n";
|
||||
|
||||
us2sat.norm();
|
||||
double radvel=us2sat.inner(speed);
|
||||
double c=299792458;
|
||||
double galileol1f = 1575.42 * 1000000; // frequency
|
||||
double preddop = -galileol1f*radvel/c;
|
||||
|
||||
double ephage = ephAge(g_svstats[sv].tow, g_svstats[sv].liveIOD().t0e*60);
|
||||
cout<<"Radial velocity: "<< radvel<<", predicted doppler: "<< preddop << ", measured doppler: "<<nmm.rfd().doppler()<<endl;
|
||||
dopplercsv << std::fixed << utcFromGST(g_svstats[sv].wn, nmm.rfd().rcvtow()) <<" " << nmm.rfd().gnssid() <<" " <<sv<<" "<<nmm.rfd().pseudorange()<<" "<< nmm.rfd().carrierphase() <<" " << nmm.rfd().doppler()<<" " << preddop << " " << Vector(us, sat).length() << " " <<radvel <<" " << nmm.rfd().locktimems()<<" " <<ephage << " " << nmm.rfd().prstd() << " " << nmm.rfd().cpstd() <<" " <<
|
||||
nmm.rfd().dostd() << endl;
|
||||
}
|
||||
Vector core2us(core, us);
|
||||
Vector dx(us, sat); // = x-ourx, dy = y-oury, dz = z-ourz;
|
||||
// double elev = acos ( core2us.inner(dx) / (core2us.length() * dx.length()));
|
||||
//double deg = 180.0* (elev/M_PI);
|
||||
// cout <<"elev: "<<90 - deg<< " ("<<g_svstats[sv].el<<")\n";
|
||||
|
||||
us2sat.norm();
|
||||
double radvel=us2sat.inner(speed);
|
||||
double c=299792458;
|
||||
double galileol1f = 1575.42 * 1000000; // frequency
|
||||
double preddop = -galileol1f*radvel/c;
|
||||
|
||||
// be careful with time here -
|
||||
double ephage = ephAge(nmm.rfd().rcvtow(), g_svstats[sv].liveIOD().t0e*60);
|
||||
cout<<"Radial velocity: "<< radvel<<", predicted doppler: "<< preddop << ", measured doppler: "<<nmm.rfd().doppler()<<endl;
|
||||
dopplercsv << std::fixed << utcFromGST(g_svstats[sv].wn, nmm.rfd().rcvtow()) <<" " << nmm.rfd().gnssid() <<" " <<sv<<" "<<nmm.rfd().pseudorange()<<" "<< nmm.rfd().carrierphase() <<" " << nmm.rfd().doppler()<<" " << preddop << " " << Vector(us, sat).length() << " " <<radvel <<" " << nmm.rfd().locktimems()<<" " <<ephage << " " << nmm.rfd().prstd() << " " << nmm.rfd().cpstd() <<" " <<
|
||||
nmm.rfd().dostd() << endl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -421,7 +421,8 @@ int main(int argc, char** argv)
|
|||
else if(msg.getClass() == 0x02 && msg.getType() == 0x15) { // RAWX
|
||||
// cerr<<"Got "<<(int)payload[11] <<" measurements "<<endl;
|
||||
double rcvTow;
|
||||
memcpy(&rcvTow, &payload[0], 8);
|
||||
memcpy(&rcvTow, &payload[0], 8);
|
||||
uint16_t rcvWn = payload[8] + 256*payload[9];
|
||||
for(int n=0 ; n < payload[11]; ++n) {
|
||||
double prMes;
|
||||
double cpMes;
|
||||
|
@ -449,6 +450,7 @@ int main(int argc, char** argv)
|
|||
nmm.mutable_rfd()->set_gnssid(gnssid);
|
||||
nmm.mutable_rfd()->set_gnsssv(sv);
|
||||
nmm.mutable_rfd()->set_rcvtow(rcvTow);
|
||||
nmm.mutable_rfd()->set_rcvwn(rcvWn);
|
||||
nmm.mutable_rfd()->set_doppler(doppler);
|
||||
nmm.mutable_rfd()->set_carrierphase(cpMes);
|
||||
nmm.mutable_rfd()->set_pseudorange(prMes);
|
||||
|
|
Loading…
Reference in New Issue