mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-11-15 22:34:58 +00:00
MOD: reference use of Vtl_data
This commit is contained in:
parent
f716b04002
commit
f14e1bfa28
@ -1102,65 +1102,66 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
|
||||
/* satellite positions, velocities and clocks */
|
||||
satposs(d_rtk.sol.time, d_obs_data.data(), valid_obs + glo_valid_obs, &d_nav_data, opt->sateph, rs, dts, var, svh.data());
|
||||
|
||||
Vtl_Data new_vtl_data;
|
||||
new_vtl_data.init_storage(n_sats);
|
||||
new_vtl_data.epoch_tow_s = gnss_observables_map.cbegin()->second.RX_time;
|
||||
new_vtl_data.sample_counter = gnss_observables_map.cbegin()->second.Tracking_sample_counter; // TODO: check if the different tracking instants (different sample_counters) affect the VTL commands
|
||||
new_vtl_data.sat_number = n_sats;
|
||||
//Vtl_Data vtl_data;
|
||||
vtl_data.init_storage(n_sats);
|
||||
vtl_data.epoch_tow_s = gnss_observables_map.cbegin()->second.RX_time;
|
||||
vtl_data.sample_counter = gnss_observables_map.cbegin()->second.Tracking_sample_counter; // TODO: check if the different tracking instants (different sample_counters) affect the VTL commands
|
||||
vtl_data.sat_number = n_sats;
|
||||
for (int n = 0; n < n_sats; n++)
|
||||
{
|
||||
new_vtl_data.sat_p(n, 0) = rs[0 + 6 * n];
|
||||
new_vtl_data.sat_p(n, 1) = rs[1 + 6 * n];
|
||||
new_vtl_data.sat_p(n, 2) = rs[2 + 6 * n];
|
||||
new_vtl_data.sat_v(n, 0) = rs[3 + 6 * n];
|
||||
new_vtl_data.sat_v(n, 1) = rs[4 + 6 * n];
|
||||
new_vtl_data.sat_v(n, 2) = rs[5 + 6 * n];
|
||||
vtl_data.sat_p(n, 0) = rs[0 + 6 * n];
|
||||
vtl_data.sat_p(n, 1) = rs[1 + 6 * n];
|
||||
vtl_data.sat_p(n, 2) = rs[2 + 6 * n];
|
||||
vtl_data.sat_v(n, 0) = rs[3 + 6 * n];
|
||||
vtl_data.sat_v(n, 1) = rs[4 + 6 * n];
|
||||
vtl_data.sat_v(n, 2) = rs[5 + 6 * n];
|
||||
|
||||
new_vtl_data.sat_dts(n, 0) = dts[0 + 2 * n];
|
||||
new_vtl_data.sat_dts(n, 1) = dts[1 + 2 * n];
|
||||
new_vtl_data.sat_var(n) = var[n];
|
||||
new_vtl_data.sat_health_flag(n) = svh.at(n);
|
||||
new_vtl_data.sat_CN0_dB_hz(n) = d_obs_data.at(n).SNR[0];
|
||||
vtl_data.sat_dts(n, 0) = dts[0 + 2 * n];
|
||||
vtl_data.sat_dts(n, 1) = dts[1 + 2 * n];
|
||||
vtl_data.sat_var(n) = var[n];
|
||||
vtl_data.sat_health_flag(n) = svh.at(n);
|
||||
vtl_data.sat_CN0_dB_hz(n) = d_obs_data.at(n).SNR[0];
|
||||
// TODO: first version of VTL works only with ONE frequency band (band #0 is L1)
|
||||
//To.Do: check it VTL uses all the information as in rtklib rescode function: v[nv] = P - (r + dtr - SPEED_OF_LIGHT_M_S * dts[i * 2] + dion + dtrp);
|
||||
//corrected pr with code bias, iono and tropo. Still needs the dtr(rx clock bias) and satellite clock bias (dts)
|
||||
new_vtl_data.pr_m(n) = pr_corrected_code_bias_vec[n] - tropo_vec[n] - iono_vec[n]+SPEED_OF_LIGHT_M_S * dts[n * 2];
|
||||
new_vtl_data.doppler_hz(n) = d_obs_data.at(n).D[0];
|
||||
new_vtl_data.carrier_phase_rads(n) = d_obs_data.at(n).L[0];
|
||||
new_vtl_data.pr_res(n) = pr_residual_vec[n];
|
||||
vtl_data.pr_m(n) = pr_corrected_code_bias_vec[n] - tropo_vec[n] - iono_vec[n]+SPEED_OF_LIGHT_M_S * dts[n * 2];
|
||||
vtl_data.doppler_hz(n) = d_obs_data.at(n).D[0];
|
||||
vtl_data.carrier_phase_rads(n) = d_obs_data.at(n).L[0];
|
||||
vtl_data.pr_res(n) = pr_residual_vec[n];
|
||||
}
|
||||
//VTL input data extraction from rtklib structures
|
||||
/* Receiver position, velocity and clock */
|
||||
/* position/velocity (m|m/s):{x,y,z,vx,vy,vz} or {e,n,u,ve,vn,vu} */
|
||||
new_vtl_data.rx_p(0) = pvt_sol.rr[0];
|
||||
new_vtl_data.rx_p(1) = pvt_sol.rr[1];
|
||||
new_vtl_data.rx_p(2) = pvt_sol.rr[2];
|
||||
new_vtl_data.rx_v(0) = pvt_sol.rr[3];
|
||||
new_vtl_data.rx_v(1) = pvt_sol.rr[4];
|
||||
new_vtl_data.rx_v(2) = pvt_sol.rr[5];
|
||||
vtl_data.rx_p(0) = pvt_sol.rr[0];
|
||||
vtl_data.rx_p(1) = pvt_sol.rr[1];
|
||||
vtl_data.rx_p(2) = pvt_sol.rr[2];
|
||||
vtl_data.rx_v(0) = pvt_sol.rr[3];
|
||||
vtl_data.rx_v(1) = pvt_sol.rr[4];
|
||||
vtl_data.rx_v(2) = pvt_sol.rr[5];
|
||||
/* Receiver position, velocity and clock variances*/
|
||||
new_vtl_data.rx_pvt_var[0] = pvt_sol.qr[0];
|
||||
new_vtl_data.rx_pvt_var[1] = pvt_sol.qr[1];
|
||||
new_vtl_data.rx_pvt_var[2] = pvt_sol.qr[2];
|
||||
vtl_data.rx_pvt_var[0] = pvt_sol.qr[0];
|
||||
vtl_data.rx_pvt_var[1] = pvt_sol.qr[1];
|
||||
vtl_data.rx_pvt_var[2] = pvt_sol.qr[2];
|
||||
//TODO: get direct estimations for V T variances, instead:
|
||||
new_vtl_data.rx_pvt_var[3] = pvt_sol.qr[0] * 0.1; //in general minor than position.
|
||||
new_vtl_data.rx_pvt_var[4] = pvt_sol.qr[1] * 0.1;
|
||||
new_vtl_data.rx_pvt_var[5] = pvt_sol.qr[2] * 0.1;
|
||||
new_vtl_data.rx_pvt_var[6] = pvt_sol.qr[0]; //time
|
||||
new_vtl_data.rx_pvt_var[7] = pvt_sol.qr[0]; //doppler
|
||||
vtl_data.rx_pvt_var[3] = pvt_sol.qr[0] * 0.1; //in general minor than position.
|
||||
vtl_data.rx_pvt_var[4] = pvt_sol.qr[1] * 0.1;
|
||||
vtl_data.rx_pvt_var[5] = pvt_sol.qr[2] * 0.1;
|
||||
vtl_data.rx_pvt_var[6] = pvt_sol.qr[0]; //time
|
||||
vtl_data.rx_pvt_var[7] = pvt_sol.qr[0]; //doppler
|
||||
//receiver clock offset and receiver clock drift
|
||||
new_vtl_data.rx_dts(0) = rx_position_and_time[3];
|
||||
new_vtl_data.rx_dts(1) = pvt_sol.dtr[5] / 1e6; // [ppm] to [s]
|
||||
vtl_data.rx_dts(0) = rx_position_and_time[3];
|
||||
vtl_data.rx_dts(1) = pvt_sol.dtr[5] / 1e6; // [ppm] to [s]
|
||||
|
||||
//new_vtl_data.debug_print();
|
||||
double PVT[6]={0};
|
||||
vtl_engine.vtl_loop(new_vtl_data, PVT);
|
||||
// pvt_sol.rr[0]=PVT[0];
|
||||
// pvt_sol.rr[1]=PVT[1];
|
||||
// pvt_sol.rr[2]=PVT[2];
|
||||
// pvt_sol.rr[3]=PVT[3];
|
||||
// pvt_sol.rr[4]=PVT[4];
|
||||
// pvt_sol.rr[5]=PVT[5];
|
||||
//vtl_data.kf_state.print("kf_state_input");
|
||||
vtl_engine.vtl_loop(vtl_data);
|
||||
//vtl_data.kf_state.print("kf_state_output");
|
||||
// pvt_sol.rr[0] = vtl_data.kf_state[0];
|
||||
// pvt_sol.rr[1] = vtl_data.kf_state[1];
|
||||
// pvt_sol.rr[2] = vtl_data.kf_state[2];
|
||||
// pvt_sol.rr[3] = vtl_data.kf_state[3];
|
||||
// pvt_sol.rr[4] = vtl_data.kf_state[4];
|
||||
// pvt_sol.rr[5] = vtl_data.kf_state[5];
|
||||
}
|
||||
else{
|
||||
//MAGL: the code should not enter here once the vtl has started
|
||||
|
@ -21,6 +21,8 @@ Vtl_Data::Vtl_Data()
|
||||
{
|
||||
epoch_tow_s = 0;
|
||||
sample_counter = 0;
|
||||
kf_state = arma::mat(8,1);
|
||||
kf_P = arma::mat(8,8);
|
||||
}
|
||||
|
||||
void Vtl_Data::init_storage(int n_sats)
|
||||
@ -44,8 +46,7 @@ void Vtl_Data::init_storage(int n_sats)
|
||||
rx_dts = arma::mat(1, 2);
|
||||
rx_var = arma::vec(1);
|
||||
rx_pvt_var = arma::vec(8);
|
||||
kf_state = arma::mat(8,1);
|
||||
kf_P = arma::mat(8,8);
|
||||
|
||||
epoch_tow_s = 0;
|
||||
sample_counter = 0;
|
||||
}
|
||||
@ -59,7 +60,7 @@ void Vtl_Data::debug_print()
|
||||
// sat_var.print("VTL Sat clock variances");
|
||||
// sat_health_flag.print("VTL Sat health");
|
||||
//sat_LOS.print("VTL SAT LOS");
|
||||
// kf_state.print("EKF STATE");
|
||||
kf_state.print("EKF STATE");
|
||||
|
||||
//pr_m.print("Satellite Code pseudoranges [m]");
|
||||
//doppler_hz.print("satellite Carrier Dopplers [Hz]");
|
||||
|
@ -28,7 +28,7 @@ Vtl_Engine::~Vtl_Engine()
|
||||
{
|
||||
}
|
||||
|
||||
bool Vtl_Engine::vtl_loop(Vtl_Data new_data, double PVT_out[6])
|
||||
bool Vtl_Engine::vtl_loop(Vtl_Data& new_data)
|
||||
{
|
||||
//TODO: Implement main VTL loop here
|
||||
using arma::as_scalar;
|
||||
@ -60,10 +60,9 @@ bool Vtl_Engine::vtl_loop(Vtl_Data new_data, double PVT_out[6])
|
||||
|
||||
// ################## Kalman Tracking ######################################
|
||||
static uint32_t counter=0; //counter
|
||||
static double prueba[6]={0}; //counter
|
||||
counter = counter+1; //uint64_t
|
||||
cout << "counter" << counter<<endl;
|
||||
|
||||
//new_data.kf_state.print("new_data kf initial");
|
||||
if(counter<3000){ //
|
||||
// receiver solution from rtklib_solver
|
||||
kf_x(0) = new_data.rx_p(0);
|
||||
@ -74,16 +73,17 @@ bool Vtl_Engine::vtl_loop(Vtl_Data new_data, double PVT_out[6])
|
||||
kf_x(5) = new_data.rx_v(2);
|
||||
kf_x(6) = new_data.rx_dts(0);
|
||||
kf_x(7) = new_data.rx_dts(1);
|
||||
}
|
||||
else{
|
||||
kf_x(0)=prueba[0];
|
||||
kf_x(1)=prueba[1];
|
||||
kf_x(2)=prueba[2];
|
||||
kf_x(3)=prueba[3];
|
||||
kf_x(4)=prueba[4];
|
||||
kf_x(5)=prueba[5];
|
||||
} else {
|
||||
// receiver solution from previous KF step
|
||||
kf_x(0) = new_data.kf_state[0];
|
||||
kf_x(1) = new_data.kf_state[1];
|
||||
kf_x(2) = new_data.kf_state[2];
|
||||
kf_x(3) = new_data.kf_state[3];
|
||||
kf_x(4) = new_data.kf_state[4];
|
||||
kf_x(5) = new_data.kf_state[5];
|
||||
kf_x(6) = new_data.rx_dts(0);
|
||||
kf_x(7) = new_data.rx_dts(1);
|
||||
|
||||
kf_P_x=new_data.kf_P;
|
||||
}
|
||||
// State error Covariance Matrix Q (PVT)
|
||||
@ -101,12 +101,6 @@ bool Vtl_Engine::vtl_loop(Vtl_Data new_data, double PVT_out[6])
|
||||
}
|
||||
|
||||
// Kalman state prediction (time update)
|
||||
kf_x.print(" KF RTKlib STATE");
|
||||
// cout<<"state_fed"<<endl;
|
||||
// for(int i=0;i<6;i++){
|
||||
// cout<<prueba[i]<<endl;
|
||||
// }
|
||||
|
||||
new_data.kf_state=kf_x;
|
||||
kf_x = kf_F * kf_x; // state prediction
|
||||
kf_P_x= kf_F * kf_P_x * kf_F.t() + kf_Q; // state error covariance prediction
|
||||
@ -166,7 +160,6 @@ bool Vtl_Engine::vtl_loop(Vtl_Data new_data, double PVT_out[6])
|
||||
kf_yerr(i+new_data.sat_number)=(new_data.doppler_hz(i)*Lambda_GPS_L1+cdeltatDot_u)-rhoDot_pri(i);
|
||||
|
||||
}
|
||||
kf_yerr.print("KF innovation");
|
||||
|
||||
// DOUBLES DIFFERENCES
|
||||
// kf_yerr = arma::zeros(2*new_data.sat_number, 1);
|
||||
@ -183,37 +176,28 @@ bool Vtl_Engine::vtl_loop(Vtl_Data new_data, double PVT_out[6])
|
||||
kf_S = kf_H * kf_P_x* kf_H.t() + kf_R; // innovation covariance matrix (S)
|
||||
kf_K = (kf_P_x * kf_H.t()) * arma::inv(kf_S); // Kalman gain
|
||||
kf_xerr = kf_K * (kf_yerr); // Error state estimation
|
||||
//kf_xerr.print(" kf_xerr");
|
||||
kf_x = kf_x + kf_xerr; // updated state estimation (a priori + error)
|
||||
//kf_x = kf_x + kf_xerr; // updated state estimation (a priori + error)
|
||||
kf_P_x = (arma::eye(size(kf_P_x)) - kf_K * kf_H) * kf_P_x; // update state estimation error covariance matrix
|
||||
kf_x.print(" KF STATE");
|
||||
new_data.kf_state=kf_x; //updated state estimation
|
||||
//new_data.kf_state.print("computed kf_state");
|
||||
// TODO: compare how KF state diverges from RTKLIB solution!
|
||||
|
||||
fstream dump_vtl_file;
|
||||
dump_vtl_file.open("dump_vtl_file.csv", ios::out|ios::app);
|
||||
dump_vtl_file.precision(15);
|
||||
if (!dump_vtl_file) {
|
||||
cout << "File not created!";
|
||||
}
|
||||
else {
|
||||
dump_vtl_file << "kf_state"<< ","<<kf_x(0)<< ","<<kf_x(1)<< ","<<kf_x(2)<< ","<<kf_x(3)<< ","<<kf_x(4)<< ","<<kf_x(5)<< ","<<kf_x(6)<< ","<<kf_x(7)<<endl;
|
||||
dump_vtl_file << "rtklib_state"<< ","<<new_data.rx_p(0)<< ","<< new_data.rx_p(1)<<","<< new_data.rx_p(2)<<","<< new_data.rx_v(0)<<","<< new_data.rx_v(1)<<","<< new_data.rx_v(2)<<","<< new_data.rx_dts(0)<<","<< new_data.rx_dts(1)<<endl;
|
||||
dump_vtl_file << "kf_xerr"<< ","<<kf_xerr(0)<< ","<<kf_xerr(1)<< ","<<kf_xerr(2)<< ","<<kf_xerr(3)<< ","<<kf_xerr(4)<< ","<<kf_xerr(5)<< ","<<kf_xerr(6)<< ","<<kf_xerr(7)<<endl;
|
||||
dump_vtl_file << "kf_state"<< ","<<new_data.kf_state(0)<< ","<<new_data.kf_state(1)<< ","<<new_data.kf_state(2)<< ","<<new_data.kf_state(3)<< ","<<new_data.kf_state(4)<< ","<<new_data.kf_state(5)<< ","<<new_data.kf_state(6)<< ","<<new_data.kf_state(7)<<endl;
|
||||
dump_vtl_file << "rtklib_state"<< ","<<new_data.rx_p(0)<< ","<< new_data.rx_p(1)<<","<< new_data.rx_p[2]<<","<< new_data.rx_v(0)<<","<< new_data.rx_v(1)<<","<< new_data.rx_v(2)<<","<< new_data.rx_dts(0)<<","<< new_data.rx_dts(1)<<endl;
|
||||
dump_vtl_file.close();
|
||||
}
|
||||
|
||||
PVT_out[0]=kf_x(0);
|
||||
PVT_out[1]=kf_x(1);
|
||||
PVT_out[2]=kf_x(2);
|
||||
PVT_out[3]=kf_x(3);
|
||||
PVT_out[4]=kf_x(4);
|
||||
PVT_out[5]=kf_x(5);
|
||||
|
||||
|
||||
// States related tu USER clock adjust from m/s to s (by /SPEED_OF_LIGHT_M_S)
|
||||
prueba[0]=kf_x(0);
|
||||
prueba[1]=kf_x(1);
|
||||
prueba[2]=kf_x(2);
|
||||
prueba[3]=kf_x(3);
|
||||
prueba[4]=kf_x(4);
|
||||
prueba[5]=kf_x(5);
|
||||
// kf_x(6) =kf_x(6) /SPEED_OF_LIGHT_M_S;
|
||||
// kf_x(7) =kf_x(7) /SPEED_OF_LIGHT_M_S;
|
||||
|
||||
@ -222,7 +206,7 @@ bool Vtl_Engine::vtl_loop(Vtl_Data new_data, double PVT_out[6])
|
||||
|
||||
//new_data.pr_res.print(" pr RESIDUALS");
|
||||
//!new_data.kf_state.print(" KF RTKlib STATE");
|
||||
cout << " KF posteriori STATE diference %100" << (kf_x-new_data.kf_state)/new_data.kf_state*100;
|
||||
// cout << " KF posteriori STATE diference %100" << (kf_x-new_data.kf_state)/new_data.kf_state*100;
|
||||
|
||||
// // ################## Geometric Transformation ######################################
|
||||
|
||||
@ -286,7 +270,6 @@ bool Vtl_Engine::vtl_loop(Vtl_Data new_data, double PVT_out[6])
|
||||
trk_cmd.enable_code_nco_cmd = true;
|
||||
trk_cmd.sample_counter = new_data.sample_counter;
|
||||
trk_cmd_outs.push_back(trk_cmd);
|
||||
new_data.debug_print();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -42,7 +42,7 @@ public:
|
||||
void configure(Vtl_Conf config_); //set config parameters
|
||||
|
||||
//TODO: output functions here (output for tracking KF updates, VTL computed user PVT, etc...)
|
||||
bool vtl_loop(Vtl_Data new_data, double PVT_out[6]);
|
||||
bool vtl_loop(Vtl_Data& new_data);
|
||||
void reset(); // reset all internal states
|
||||
void debug_print(); // print debug information
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user