mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-26 04:57:40 +00:00 
			
		
		
		
	First working version of a complete 5 state Kalman filter for both carrier and code tracking, tested with GPS L1 CA 1ms integration.
This commit is contained in:
		
							
								
								
									
										227
									
								
								conf/gnss-sdr_labsat_kf_vtl.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										227
									
								
								conf/gnss-sdr_labsat_kf_vtl.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,227 @@ | |||||||
|  | ; This is a GNSS-SDR configuration file | ||||||
|  | ; The configuration API is described at https://gnss-sdr.org/docs/sp-blocks/ | ||||||
|  |  | ||||||
|  | ; You can define your own receiver and invoke it by doing | ||||||
|  | ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf | ||||||
|  | ; | ||||||
|  |  | ||||||
|  | [GNSS-SDR] | ||||||
|  |  | ||||||
|  | ;######### GLOBAL OPTIONS ################## | ||||||
|  | GNSS-SDR.internal_fs_sps=5456000 | ||||||
|  | ;GNSS-SDR.internal_fs_sps=16368000 | ||||||
|  | GNSS-SDR.use_acquisition_resampler=true | ||||||
|  |  | ||||||
|  | ;######### SIGNAL_SOURCE CONFIG ############ | ||||||
|  | SignalSource.implementation=Labsat_Signal_Source | ||||||
|  | SignalSource.selected_channel=1 | ||||||
|  | ;#filename: path to file with the captured GNSS signal samples to be processed | ||||||
|  | ;# Labsat sile source automatically increments the file name when the signal is split in several files | ||||||
|  | ;# the adapter adds "_0000.LS3" to this base path and filename. Next file will be "_0001.LS3" and so on | ||||||
|  | ;# in this example, the first file complete path will be ../signals/GPS_025_ | ||||||
|  | ;SignalSource.filename=/media/javier/WDNASNTFS/satgen_30mins/output/output | ||||||
|  | SignalSource.filename=/home/javier/signals/satgen_30mins/output/output | ||||||
|  | ;SignalSource.filename=/home/javier/signals/dupli/dupli/dupli | ||||||
|  | SignalSource.item_type=gr_complex | ||||||
|  | SignalSource.sampling_frequency=16368000 | ||||||
|  | SignalSource.samples=0 | ||||||
|  | SignalSource.repeat=false | ||||||
|  | SignalSource.dump=false | ||||||
|  | SignalSource.dump_filename=./out.dat | ||||||
|  | SignalSource.enable_throttle_control=false | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;######### SIGNAL_CONDITIONER CONFIG ############ | ||||||
|  | SignalConditioner.implementation=Signal_Conditioner | ||||||
|  |  | ||||||
|  | ;######### DATA_TYPE_ADAPTER CONFIG ############ | ||||||
|  | DataTypeAdapter.implementation=Pass_Through | ||||||
|  | DataTypeAdapter.item_type=gr_complex | ||||||
|  |  | ||||||
|  | ;######### INPUT_FILTER CONFIG ############ | ||||||
|  | InputFilter.implementation=Freq_Xlating_Fir_Filter | ||||||
|  | InputFilter.dump=false | ||||||
|  | InputFilter.dump_filename=/media/javier/WDNASNTFS/output_5.456Msps_gr_complex.dat | ||||||
|  |  | ||||||
|  | InputFilter.input_item_type=gr_complex | ||||||
|  | InputFilter.output_item_type=gr_complex | ||||||
|  | InputFilter.taps_item_type=float | ||||||
|  | InputFilter.number_of_taps=5 | ||||||
|  | InputFilter.number_of_bands=2 | ||||||
|  |  | ||||||
|  | InputFilter.band1_begin=0.0 | ||||||
|  | InputFilter.band1_end=0.45 | ||||||
|  | InputFilter.band2_begin=0.55 | ||||||
|  | InputFilter.band2_end=1.0 | ||||||
|  |  | ||||||
|  | InputFilter.ampl1_begin=1.0 | ||||||
|  | InputFilter.ampl1_end=1.0 | ||||||
|  | InputFilter.ampl2_begin=0.0 | ||||||
|  | InputFilter.ampl2_end=0.0 | ||||||
|  |  | ||||||
|  | InputFilter.band1_error=1.0 | ||||||
|  | InputFilter.band2_error=1.0 | ||||||
|  |  | ||||||
|  | InputFilter.filter_type=lowpass | ||||||
|  | InputFilter.grid_density=16 | ||||||
|  | InputFilter.sampling_frequency=16368000 | ||||||
|  | InputFilter.IF=0 | ||||||
|  | InputFilter.decimation_factor=3 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;######### CHANNELS GLOBAL CONFIG ############ | ||||||
|  | Channels_1C.count=6 | ||||||
|  | Channels_1B.count=0 | ||||||
|  | Channels_L5.count=0 | ||||||
|  | Channels_5X.count=0 | ||||||
|  |  | ||||||
|  | Channels.in_acquisition=1 | ||||||
|  |  | ||||||
|  | ;Channel0.satellite=3 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;#signal: | ||||||
|  | ;# "1C" GPS L1 C/A | ||||||
|  | ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) | ||||||
|  | ;# "1G" GLONASS L1 C/A | ||||||
|  | ;# "2S" GPS L2 L2C (M) | ||||||
|  | ;# "5X" GALILEO E5a I+Q | ||||||
|  | ;# "L5" GPS L5 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;######### GPS ACQUISITION CONFIG ############ | ||||||
|  | Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition | ||||||
|  | Acquisition_1C.item_type=gr_complex | ||||||
|  | Acquisition_1C.threshold=3.0 | ||||||
|  | Acquisition_1C.use_CFAR_algorithm=false | ||||||
|  | Acquisition_1C.blocking=true | ||||||
|  | Acquisition_1C.doppler_max=5000 | ||||||
|  | Acquisition_1C.doppler_step=125 | ||||||
|  | Acquisition_1C.dump=false | ||||||
|  | Acquisition_1C.dump_filename=./acq_dump.dat | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;######### GALILEO ACQUISITION CONFIG ############ | ||||||
|  | Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition | ||||||
|  | Acquisition_1B.item_type=gr_complex | ||||||
|  | Acquisition_1B.threshold=2.8 | ||||||
|  | Acquisition_1B.use_CFAR_algorithm=false | ||||||
|  | Acquisition_1B.blocking=false | ||||||
|  | Acquisition_1B.doppler_max=5000 | ||||||
|  | Acquisition_1B.doppler_step=125 | ||||||
|  | Acquisition_1B.dump=false | ||||||
|  | Acquisition_1B.dump_filename=./acq_dump.dat | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;######### TRACKING GPS CONFIG ############ | ||||||
|  | ;Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking | ||||||
|  | ;Tracking_1C.item_type=gr_complex | ||||||
|  | ;Tracking_1C.dump=false | ||||||
|  | ;Tracking_1C.dump_filename=./tracking_ch_ | ||||||
|  | ;Tracking_1C.pll_bw_hz=35.0; | ||||||
|  | ;Tracking_1C.dll_bw_hz=1.5; | ||||||
|  | ;Tracking_1C.pll_bw_narrow_hz=2.5; | ||||||
|  | ;Tracking_1C.dll_bw_narrow_hz=0.2; | ||||||
|  | ;Tracking_1C.extend_correlation_symbols=1; | ||||||
|  | ;Tracking_1C.dll_filter_order=2; | ||||||
|  | ;Tracking_1C.pll_filter_order=3; | ||||||
|  | ;Tracking_1C.early_late_space_chips=0.5; | ||||||
|  | ;Tracking_1C.early_late_space_narrow_chips=0.15 | ||||||
|  |  | ||||||
|  | ;### KF tracking | ||||||
|  | Tracking_1C.implementation=GPS_L1_CA_KF_VTL_Tracking | ||||||
|  | Tracking_1C.item_type=gr_complex | ||||||
|  | Tracking_1C.dump=true | ||||||
|  | Tracking_1C.dump_filename=./tracking_ch_ | ||||||
|  | Tracking_1C.extend_correlation_symbols=1; | ||||||
|  | Tracking_1C.early_late_space_chips=0.5; | ||||||
|  | Tracking_1C.early_late_space_narrow_chips=0.15 | ||||||
|  |  | ||||||
|  | Tracking_1C.expected_cn0_dbhz=45.0; | ||||||
|  | Tracking_1C.enable_dynamic_measurement_covariance=false; | ||||||
|  | Tracking_1C.use_estimated_cn0=false; | ||||||
|  | Tracking_1C.carrier_aiding=true; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Tracking_1C.code_phase_sd_chips=0.01; | ||||||
|  | Tracking_1C.code_rate_sd_chips_s=0.001; | ||||||
|  |  | ||||||
|  | Tracking_1C.carrier_phase_sd_rad=0.001; | ||||||
|  | Tracking_1C.carrier_freq_sd_hz=0.01; | ||||||
|  | Tracking_1C.carrier_freq_rate_sd_hz_s=0.1; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Tracking_1C.init_code_phase_sd_chips=1; | ||||||
|  | Tracking_1C.init_code_rate_sd_chips_s=10; | ||||||
|  |  | ||||||
|  | Tracking_1C.init_carrier_phase_sd_rad=1; | ||||||
|  | Tracking_1C.init_carrier_freq_sd_hz=10; | ||||||
|  | Tracking_1C.init_carrier_freq_rate_sd_hz_s=10; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;######### TRACKING GALILEO CONFIG ############ | ||||||
|  | Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking | ||||||
|  | Tracking_1B.item_type=gr_complex | ||||||
|  | Tracking_1B.pll_bw_hz=15.0; | ||||||
|  | Tracking_1B.dll_bw_hz=0.75; | ||||||
|  | Tracking_1B.early_late_space_chips=0.15; | ||||||
|  | Tracking_1B.very_early_late_space_chips=0.5; | ||||||
|  | Tracking_1B.early_late_space_narrow_chips=0.10; | ||||||
|  | Tracking_1B.very_early_late_space_narrow_chips=0.5; | ||||||
|  | Tracking_1B.pll_bw_narrow_hz=2.5 | ||||||
|  | Tracking_1B.dll_bw_narrow_hz=0.2 | ||||||
|  | Tracking_1B.extend_correlation_symbols=5 | ||||||
|  | Tracking_1B.track_pilot=true | ||||||
|  | Tracking_1B.enable_fll_pull_in=true; | ||||||
|  | ;Tracking_1B.pull_in_time_s=60 | ||||||
|  | Tracking_1B.enable_fll_steady_state=false | ||||||
|  | Tracking_1B.fll_bw_hz=10 | ||||||
|  | Tracking_1B.dump=false | ||||||
|  | Tracking_1B.dump_filename=tracking_ch_ | ||||||
|  |  | ||||||
|  | ;######### TELEMETRY DECODER GALILEO CONFIG ############ | ||||||
|  | TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder | ||||||
|  | TelemetryDecoder_1B.dump=false | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;######### TELEMETRY DECODER GPS CONFIG ############ | ||||||
|  | TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder | ||||||
|  | TelemetryDecoder_1C.dump=false | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;######### OBSERVABLES CONFIG ############ | ||||||
|  | ;#implementation: | ||||||
|  | Observables.implementation=Hybrid_Observables | ||||||
|  | Observables.dump=false | ||||||
|  | Observables.dump_filename=./observables.dat | ||||||
|  | Observables.enable_carrier_smoothing=false | ||||||
|  | Observables.smoothing_factor=200 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;######### PVT CONFIG ############ | ||||||
|  | PVT.implementation=RTKLIB_PVT | ||||||
|  | PVT.positioning_mode=Single  ; options: Single, Static, Kinematic, PPP_Static, PPP_Kinematic | ||||||
|  | PVT.enable_rx_clock_correction=false | ||||||
|  | PVT.iono_model=Broadcast ; options: OFF, Broadcast, SBAS, Iono-Free-LC, Estimate_STEC, IONEX | ||||||
|  | PVT.trop_model=Saastamoinen ; options: OFF, Saastamoinen, SBAS, Estimate_ZTD, Estimate_ZTD_Grad | ||||||
|  | PVT.output_rate_ms=1000; | ||||||
|  | PVT.rinexobs_rate_ms=1000; | ||||||
|  | PVT.display_rate_ms=1000; | ||||||
|  | PVT.elevation_mask=15; | ||||||
|  | PVT.flag_rtcm_server=false | ||||||
|  | PVT.flag_rtcm_tty_port=false | ||||||
|  | PVT.rtcm_dump_devname=/dev/pts/1 | ||||||
|  | PVT.dump=false | ||||||
|  | PVT.dump_filename=./PVT | ||||||
|  | PVT.enable_monitor=false | ||||||
|  | PVT.monitor_udp_port=1337 | ||||||
|  | PVT.monitor_client_addresses=127.0.0.1 | ||||||
|  |  | ||||||
|  | ;######### MONITOR CONFIG ############ | ||||||
|  | Monitor.enable_monitor=false | ||||||
|  | Monitor.decimation_factor=1 | ||||||
|  | Monitor.client_addresses=127.0.0.1 | ||||||
|  | Monitor.udp_port=1234 | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -52,6 +52,7 @@ | |||||||
| #include "rinex_printer.h" | #include "rinex_printer.h" | ||||||
| #include "rtcm_printer.h" | #include "rtcm_printer.h" | ||||||
| #include "rtklib_solver.h" | #include "rtklib_solver.h" | ||||||
|  | #include "trackingcmd.h" | ||||||
| #include <boost/any.hpp>                   // for any_cast, any | #include <boost/any.hpp>                   // for any_cast, any | ||||||
| #include <boost/archive/xml_iarchive.hpp>  // for xml_iarchive | #include <boost/archive/xml_iarchive.hpp>  // for xml_iarchive | ||||||
| #include <boost/archive/xml_oarchive.hpp>  // for xml_oarchive | #include <boost/archive/xml_oarchive.hpp>  // for xml_oarchive | ||||||
| @@ -126,6 +127,8 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels, | |||||||
| { | { | ||||||
|     // Send feedback message to observables block with the receiver clock offset |     // Send feedback message to observables block with the receiver clock offset | ||||||
|     this->message_port_register_out(pmt::mp("pvt_to_observables")); |     this->message_port_register_out(pmt::mp("pvt_to_observables")); | ||||||
|  |     // Experimental: VLT commands from PVT to tracking channels | ||||||
|  |     this->message_port_register_out(pmt::mp("pvt_to_trk")); | ||||||
|     // Send PVT status to gnss_flowgraph |     // Send PVT status to gnss_flowgraph | ||||||
|     this->message_port_register_out(pmt::mp("status")); |     this->message_port_register_out(pmt::mp("status")); | ||||||
|  |  | ||||||
| @@ -2143,6 +2146,13 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item | |||||||
|  |  | ||||||
|                     if (flag_pvt_valid == true) |                     if (flag_pvt_valid == true) | ||||||
|                         { |                         { | ||||||
|  |                             //experimental VTL tests | ||||||
|  |                             // send tracking command | ||||||
|  |                             const std::shared_ptr<TrackingCmd> trk_cmd_test = std::make_shared<TrackingCmd>(TrackingCmd()); | ||||||
|  |                             trk_cmd_test->carrier_freq_hz = 12345.4; | ||||||
|  |                             trk_cmd_test->sample_counter = d_gnss_observables_map.begin()->second.Tracking_sample_counter; | ||||||
|  |                             this->message_port_pub(pmt::mp("pvt_to_trk"), pmt::make_any(trk_cmd_test)); | ||||||
|  |  | ||||||
|                             // initialize (if needed) the accumulated phase offset and apply it to the active channels |                             // initialize (if needed) the accumulated phase offset and apply it to the active channels | ||||||
|                             // required to report accumulated phase cycles comparable to pseudoranges |                             // required to report accumulated phase cycles comparable to pseudoranges | ||||||
|                             initialize_and_apply_carrier_phase_offset(); |                             initialize_and_apply_carrier_phase_offset(); | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ set(GNSS_SPLIBS_SOURCES | |||||||
|     gnss_sdr_create_directory.cc |     gnss_sdr_create_directory.cc | ||||||
|     geofunctions.cc |     geofunctions.cc | ||||||
|     item_type_helpers.cc |     item_type_helpers.cc | ||||||
|  |     trackingcmd.cc | ||||||
| ) | ) | ||||||
|  |  | ||||||
| set(GNSS_SPLIBS_HEADERS | set(GNSS_SPLIBS_HEADERS | ||||||
| @@ -59,6 +60,7 @@ set(GNSS_SPLIBS_HEADERS | |||||||
|     gnss_circular_deque.h |     gnss_circular_deque.h | ||||||
|     geofunctions.h |     geofunctions.h | ||||||
|     item_type_helpers.h |     item_type_helpers.h | ||||||
|  |     trackingcmd.h | ||||||
| ) | ) | ||||||
|  |  | ||||||
| if(ENABLE_OPENCL) | if(ENABLE_OPENCL) | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								src/algorithms/libs/trackingcmd.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/algorithms/libs/trackingcmd.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | /* | ||||||
|  |  * trackingcmd.cc | ||||||
|  |  * | ||||||
|  |  *  Created on: 20 ago. 2020 | ||||||
|  |  *      Author: javier | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "trackingcmd.h" | ||||||
|  |  | ||||||
|  | TrackingCmd::TrackingCmd() | ||||||
|  | { | ||||||
|  |     // TODO Auto-generated constructor stub | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								src/algorithms/libs/trackingcmd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/algorithms/libs/trackingcmd.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | /* | ||||||
|  |  * trackingcmd.h | ||||||
|  |  * | ||||||
|  |  *  Created on: 20 ago. 2020 | ||||||
|  |  *      Author: javier | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef SRC_ALGORITHMS_LIBS_TRACKINGCMD_H_ | ||||||
|  | #define SRC_ALGORITHMS_LIBS_TRACKINGCMD_H_ | ||||||
|  |  | ||||||
|  | #include <cstdint> | ||||||
|  |  | ||||||
|  | class TrackingCmd | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     TrackingCmd(); | ||||||
|  |  | ||||||
|  |     bool enable_carrier_nco_cmd; | ||||||
|  |     bool enable_code_nco_cmd; | ||||||
|  |     double code_freq_chips; | ||||||
|  |     double carrier_freq_hz; | ||||||
|  |     double carrier_freq_rate_hz_s; | ||||||
|  |     uint64_t sample_counter; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif /* SRC_ALGORITHMS_LIBS_TRACKINGCMD_H_ */ | ||||||
| @@ -142,8 +142,8 @@ hybrid_observables_gs::hybrid_observables_gs(const Obs_Conf &conf_) : gr::block( | |||||||
|     d_T_rx_TOW_set = false; |     d_T_rx_TOW_set = false; | ||||||
|     d_T_status_report_timer_ms = 0; |     d_T_status_report_timer_ms = 0; | ||||||
|     // rework |     // rework | ||||||
|     d_Rx_clock_buffer.set_capacity(10);  // 10*20 ms = 200 ms of data in buffer |     d_Rx_clock_buffer.set_capacity(5);  // 10*20 ms = 200 ms of data in buffer | ||||||
|     d_Rx_clock_buffer.clear();           // Clear all the elements in the buffer |     d_Rx_clock_buffer.clear();          // Clear all the elements in the buffer | ||||||
|  |  | ||||||
|     d_channel_last_pll_lock = std::vector<bool>(d_nchannels_out, false); |     d_channel_last_pll_lock = std::vector<bool>(d_nchannels_out, false); | ||||||
|     d_channel_last_pseudorange_smooth = std::vector<double>(d_nchannels_out, 0.0); |     d_channel_last_pseudorange_smooth = std::vector<double>(d_nchannels_out, 0.0); | ||||||
|   | |||||||
| @@ -53,6 +53,7 @@ set(TRACKING_ADAPTER_SOURCES | |||||||
|     glonass_l2_ca_dll_pll_c_aid_tracking.cc |     glonass_l2_ca_dll_pll_c_aid_tracking.cc | ||||||
|     beidou_b1i_dll_pll_tracking.cc |     beidou_b1i_dll_pll_tracking.cc | ||||||
|     beidou_b3i_dll_pll_tracking.cc |     beidou_b3i_dll_pll_tracking.cc | ||||||
|  |     gps_l1_ca_kf_vtl_tracking.cc | ||||||
|     ${OPT_TRACKING_ADAPTERS_SOURCES} |     ${OPT_TRACKING_ADAPTERS_SOURCES} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -72,6 +73,7 @@ set(TRACKING_ADAPTER_HEADERS | |||||||
|     glonass_l2_ca_dll_pll_c_aid_tracking.h |     glonass_l2_ca_dll_pll_c_aid_tracking.h | ||||||
|     beidou_b1i_dll_pll_tracking.h |     beidou_b1i_dll_pll_tracking.h | ||||||
|     beidou_b3i_dll_pll_tracking.h |     beidou_b3i_dll_pll_tracking.h | ||||||
|  |     gps_l1_ca_kf_vtl_tracking.h | ||||||
|     ${OPT_TRACKING_ADAPTERS_HEADERS} |     ${OPT_TRACKING_ADAPTERS_HEADERS} | ||||||
| ) | ) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										142
									
								
								src/algorithms/tracking/adapters/gps_l1_ca_kf_vtl_tracking.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								src/algorithms/tracking/adapters/gps_l1_ca_kf_vtl_tracking.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | |||||||
|  | /*! | ||||||
|  |  * \file gps_l1_ca_kf_vtl_tracking.h | ||||||
|  |  * \brief  Interface of an adapter of a code + carrier Kalman Filter tracking loop with VTL capabilities block | ||||||
|  |  * for GPS L1 C/A to a TrackingInterface | ||||||
|  |  * \author  Javier Arribas, 2020. jarribas(at)cttc.es | ||||||
|  |  * | ||||||
|  |  * | ||||||
|  |  * | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2010-2020  (see AUTHORS file for a list of contributors) | ||||||
|  |  * | ||||||
|  |  * GNSS-SDR is a software defined Global Navigation | ||||||
|  |  *          Satellite Systems receiver | ||||||
|  |  * | ||||||
|  |  * This file is part of GNSS-SDR. | ||||||
|  |  * | ||||||
|  |  * SPDX-License-Identifier: GPL-3.0-or-later | ||||||
|  |  * | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "gps_l1_ca_kf_vtl_tracking.h" | ||||||
|  | #include "GPS_L1_CA.h" | ||||||
|  | #include "configuration_interface.h" | ||||||
|  | #include "display.h" | ||||||
|  | #include "gnss_sdr_flags.h" | ||||||
|  | #include "kf_conf.h" | ||||||
|  | #include <glog/logging.h> | ||||||
|  | #include <array> | ||||||
|  |  | ||||||
|  | GpsL1CaKfVtlTracking::GpsL1CaKfVtlTracking( | ||||||
|  |     const ConfigurationInterface* configuration, const std::string& role, | ||||||
|  |     unsigned int in_streams, unsigned int out_streams) : role_(role), in_streams_(in_streams), out_streams_(out_streams) | ||||||
|  | { | ||||||
|  |     Kf_Conf trk_params = Kf_Conf(); | ||||||
|  |     DLOG(INFO) << "role " << role; | ||||||
|  |     trk_params.SetFromConfiguration(configuration, role); | ||||||
|  |  | ||||||
|  |     const auto vector_length = static_cast<int>(std::round(trk_params.fs_in / (GPS_L1_CA_CODE_RATE_CPS / GPS_L1_CA_CODE_LENGTH_CHIPS))); | ||||||
|  |     trk_params.vector_length = vector_length; | ||||||
|  |     if (trk_params.extend_correlation_symbols < 1) | ||||||
|  |         { | ||||||
|  |             trk_params.extend_correlation_symbols = 1; | ||||||
|  |             std::cout << TEXT_RED << "WARNING: GPS L1 C/A. extend_correlation_symbols must be bigger than 1. Coherent integration has been set to 1 symbol (1 ms)" << TEXT_RESET << '\n'; | ||||||
|  |         } | ||||||
|  |     else if (trk_params.extend_correlation_symbols > 20) | ||||||
|  |         { | ||||||
|  |             trk_params.extend_correlation_symbols = 20; | ||||||
|  |             std::cout << TEXT_RED << "WARNING: GPS L1 C/A. extend_correlation_symbols must be lower than 21. Coherent integration has been set to 20 symbols (20 ms)" << TEXT_RESET << '\n'; | ||||||
|  |         } | ||||||
|  |     trk_params.track_pilot = configuration->property(role + ".track_pilot", false); | ||||||
|  |     if (trk_params.track_pilot) | ||||||
|  |         { | ||||||
|  |             trk_params.track_pilot = false; | ||||||
|  |             std::cout << TEXT_RED << "WARNING: GPS L1 C/A does not have pilot signal. Data tracking has been enabled" << TEXT_RESET << '\n'; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     trk_params.system = 'G'; | ||||||
|  |     const std::array<char, 3> sig_{'1', 'C', '\0'}; | ||||||
|  |     std::memcpy(trk_params.signal, sig_.data(), 3); | ||||||
|  |  | ||||||
|  |     // ################# Make a GNU Radio Tracking block object ################ | ||||||
|  |     if (trk_params.item_type == "gr_complex") | ||||||
|  |         { | ||||||
|  |             item_size_ = sizeof(gr_complex); | ||||||
|  |             tracking_ = kf_vtl_make_tracking(trk_params); | ||||||
|  |         } | ||||||
|  |     else | ||||||
|  |         { | ||||||
|  |             item_size_ = sizeof(gr_complex); | ||||||
|  |             LOG(WARNING) << trk_params.item_type << " unknown tracking item type."; | ||||||
|  |         } | ||||||
|  |     channel_ = 0; | ||||||
|  |     DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")"; | ||||||
|  |     if (in_streams_ > 1) | ||||||
|  |         { | ||||||
|  |             LOG(ERROR) << "This implementation only supports one input stream"; | ||||||
|  |         } | ||||||
|  |     if (out_streams_ > 1) | ||||||
|  |         { | ||||||
|  |             LOG(ERROR) << "This implementation only supports one output stream"; | ||||||
|  |         } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void GpsL1CaKfVtlTracking::stop_tracking() | ||||||
|  | { | ||||||
|  |     tracking_->stop_tracking(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void GpsL1CaKfVtlTracking::start_tracking() | ||||||
|  | { | ||||||
|  |     tracking_->start_tracking(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Set tracking channel unique ID | ||||||
|  |  */ | ||||||
|  | void GpsL1CaKfVtlTracking::set_channel(unsigned int channel) | ||||||
|  | { | ||||||
|  |     channel_ = channel; | ||||||
|  |     tracking_->set_channel(channel); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void GpsL1CaKfVtlTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) | ||||||
|  | { | ||||||
|  |     tracking_->set_gnss_synchro(p_gnss_synchro); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void GpsL1CaKfVtlTracking::connect(gr::top_block_sptr top_block) | ||||||
|  | { | ||||||
|  |     if (top_block) | ||||||
|  |         { /* top_block is not null */ | ||||||
|  |         }; | ||||||
|  |     // nothing to connect, now the tracking uses gr_sync_decimator | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void GpsL1CaKfVtlTracking::disconnect(gr::top_block_sptr top_block) | ||||||
|  | { | ||||||
|  |     if (top_block) | ||||||
|  |         { /* top_block is not null */ | ||||||
|  |         }; | ||||||
|  |     // nothing to disconnect, now the tracking uses gr_sync_decimator | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | gr::basic_block_sptr GpsL1CaKfVtlTracking::get_left_block() | ||||||
|  | { | ||||||
|  |     return tracking_; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | gr::basic_block_sptr GpsL1CaKfVtlTracking::get_right_block() | ||||||
|  | { | ||||||
|  |     return tracking_; | ||||||
|  | } | ||||||
							
								
								
									
										93
									
								
								src/algorithms/tracking/adapters/gps_l1_ca_kf_vtl_tracking.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								src/algorithms/tracking/adapters/gps_l1_ca_kf_vtl_tracking.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | |||||||
|  | /*! | ||||||
|  |  * \file gps_l1_ca_kf_vtl_tracking.h | ||||||
|  |  * \brief  Interface of an adapter of a code + carrier Kalman Filter tracking loop with VTL capabilities block | ||||||
|  |  * for GPS L1 C/A to a TrackingInterface | ||||||
|  |  * \author  Javier Arribas, 2020. jarribas(at)cttc.es | ||||||
|  |  * | ||||||
|  |  * | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2010-2020  (see AUTHORS file for a list of contributors) | ||||||
|  |  * | ||||||
|  |  * GNSS-SDR is a software defined Global Navigation | ||||||
|  |  *          Satellite Systems receiver | ||||||
|  |  * | ||||||
|  |  * This file is part of GNSS-SDR. | ||||||
|  |  * | ||||||
|  |  * SPDX-License-Identifier: GPL-3.0-or-later | ||||||
|  |  * | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef GNSS_SDR_GPS_L1_CA_kf_vtl_TRACKING_H | ||||||
|  | #define GNSS_SDR_GPS_L1_CA_kf_vtl_TRACKING_H | ||||||
|  |  | ||||||
|  | #include "kf_vtl_tracking.h" | ||||||
|  | #include "tracking_interface.h" | ||||||
|  | #include <string> | ||||||
|  |  | ||||||
|  | class ConfigurationInterface; | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |  * \brief This class implements a code + carrier Kalman Filter tracking loop with VTL capabilities | ||||||
|  |  */ | ||||||
|  | class GpsL1CaKfVtlTracking : public TrackingInterface | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GpsL1CaKfVtlTracking( | ||||||
|  |         const ConfigurationInterface* configuration, | ||||||
|  |         const std::string& role, | ||||||
|  |         unsigned int in_streams, | ||||||
|  |         unsigned int out_streams); | ||||||
|  |  | ||||||
|  |     ~GpsL1CaKfVtlTracking() = default; | ||||||
|  |  | ||||||
|  |     inline std::string role() override | ||||||
|  |     { | ||||||
|  |         return role_; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     //! Returns "GPS_L1_CA_kf_vtl_Tracking" | ||||||
|  |     inline std::string implementation() override | ||||||
|  |     { | ||||||
|  |         return "GPS_L1_CA_KF_VTL_Tracking"; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     inline size_t item_size() override | ||||||
|  |     { | ||||||
|  |         return item_size_; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void connect(gr::top_block_sptr top_block) override; | ||||||
|  |     void disconnect(gr::top_block_sptr top_block) override; | ||||||
|  |     gr::basic_block_sptr get_left_block() override; | ||||||
|  |     gr::basic_block_sptr get_right_block() override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Set tracking channel unique ID | ||||||
|  |      */ | ||||||
|  |     void set_channel(unsigned int channel) override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Set acquisition/tracking common Gnss_Synchro object pointer | ||||||
|  |      * to efficiently exchange synchronization data between acquisition and tracking blocks | ||||||
|  |      */ | ||||||
|  |     void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) override; | ||||||
|  |  | ||||||
|  |     void start_tracking() override; | ||||||
|  |  | ||||||
|  |     /*! | ||||||
|  |      * \brief Stop running tracking | ||||||
|  |      */ | ||||||
|  |     void stop_tracking() override; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     kf_vtl_tracking_sptr tracking_; | ||||||
|  |     size_t item_size_; | ||||||
|  |     unsigned int channel_; | ||||||
|  |     std::string role_; | ||||||
|  |     unsigned int in_streams_; | ||||||
|  |     unsigned int out_streams_; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif  // GNSS_SDR_GPS_L1_CA_kf_vtl_TRACKING_H | ||||||
| @@ -41,6 +41,7 @@ set(TRACKING_GR_BLOCKS_SOURCES | |||||||
|     glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc |     glonass_l2_ca_dll_pll_c_aid_tracking_cc.cc | ||||||
|     glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc |     glonass_l2_ca_dll_pll_c_aid_tracking_sc.cc | ||||||
|     dll_pll_veml_tracking.cc |     dll_pll_veml_tracking.cc | ||||||
|  |     kf_vtl_tracking.cc | ||||||
|     ${OPT_TRACKING_BLOCKS_SOURCES} |     ${OPT_TRACKING_BLOCKS_SOURCES} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -55,6 +56,7 @@ set(TRACKING_GR_BLOCKS_HEADERS | |||||||
|     glonass_l2_ca_dll_pll_c_aid_tracking_cc.h |     glonass_l2_ca_dll_pll_c_aid_tracking_cc.h | ||||||
|     glonass_l2_ca_dll_pll_c_aid_tracking_sc.h |     glonass_l2_ca_dll_pll_c_aid_tracking_sc.h | ||||||
|     dll_pll_veml_tracking.h |     dll_pll_veml_tracking.h | ||||||
|  |     kf_vtl_tracking.h | ||||||
|     ${OPT_TRACKING_BLOCKS_HEADERS} |     ${OPT_TRACKING_BLOCKS_HEADERS} | ||||||
| ) | ) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										2056
									
								
								src/algorithms/tracking/gnuradio_blocks/kf_vtl_tracking.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2056
									
								
								src/algorithms/tracking/gnuradio_blocks/kf_vtl_tracking.cc
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										236
									
								
								src/algorithms/tracking/gnuradio_blocks/kf_vtl_tracking.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										236
									
								
								src/algorithms/tracking/gnuradio_blocks/kf_vtl_tracking.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,236 @@ | |||||||
|  | /*! | ||||||
|  |  * \file kf_vtl_tracking.cc | ||||||
|  |  * \brief Implementation of a Kalman filter based tracking with optional Vector Tracking Loop message receiver block. | ||||||
|  |  * \author Javier Arribas, 2020. jarribas(at)cttc.es | ||||||
|  |  * | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2010-2020  (see AUTHORS file for a list of contributors) | ||||||
|  |  * | ||||||
|  |  * GNSS-SDR is a software defined Global Navigation | ||||||
|  |  *          Satellite Systems receiver | ||||||
|  |  * | ||||||
|  |  * This file is part of GNSS-SDR. | ||||||
|  |  * | ||||||
|  |  * SPDX-License-Identifier: GPL-3.0-or-later | ||||||
|  |  * | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef GNSS_SDR_kf_vtl_TRACKING_H | ||||||
|  | #define GNSS_SDR_kf_vtl_TRACKING_H | ||||||
|  |  | ||||||
|  | #include "cpu_multicorrelator_real_codes.h" | ||||||
|  | #include "exponential_smoother.h" | ||||||
|  | #include "kf_conf.h" | ||||||
|  | #include <boost/circular_buffer.hpp> | ||||||
|  | #include <gnuradio/block.h>                   // for block | ||||||
|  | #include <gnuradio/gr_complex.h>              // for gr_complex | ||||||
|  | #include <gnuradio/types.h>                   // for gr_vector_int, gr_vector... | ||||||
|  | #include <pmt/pmt.h>                          // for pmt_t | ||||||
|  | #include <volk_gnsssdr/volk_gnsssdr_alloc.h>  // for volk_gnsssdr::vector | ||||||
|  | #include <cstddef>                            // for size_t | ||||||
|  | #include <cstdint>                            // for int32_t | ||||||
|  | #include <fstream>                            // for ofstream | ||||||
|  | #include <string>                             // for string | ||||||
|  | #include <typeinfo>                           // for typeid | ||||||
|  | #include <utility>                            // for pair | ||||||
|  | #if GNURADIO_USES_STD_POINTERS | ||||||
|  | #include <memory> | ||||||
|  | #else | ||||||
|  | #include <boost/shared_ptr.hpp> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <armadillo> | ||||||
|  |  | ||||||
|  | class Gnss_Synchro; | ||||||
|  | class kf_vtl_tracking; | ||||||
|  |  | ||||||
|  | #if GNURADIO_USES_STD_POINTERS | ||||||
|  | using kf_vtl_tracking_sptr = std::shared_ptr<kf_vtl_tracking>; | ||||||
|  | #else | ||||||
|  | using kf_vtl_tracking_sptr = boost::shared_ptr<kf_vtl_tracking>; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | kf_vtl_tracking_sptr kf_vtl_make_tracking(const Kf_Conf &conf_); | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |  * \brief This class implements a code DLL + carrier PLL tracking block. | ||||||
|  |  */ | ||||||
|  | class kf_vtl_tracking : public gr::block | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     ~kf_vtl_tracking(); | ||||||
|  |  | ||||||
|  |     void set_channel(uint32_t channel); | ||||||
|  |     void set_gnss_synchro(Gnss_Synchro *p_gnss_synchro); | ||||||
|  |     void start_tracking(); | ||||||
|  |     void stop_tracking(); | ||||||
|  |  | ||||||
|  |     int general_work(int noutput_items, gr_vector_int &ninput_items, | ||||||
|  |         gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); | ||||||
|  |  | ||||||
|  |     void forecast(int noutput_items, gr_vector_int &ninput_items_required); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     friend kf_vtl_tracking_sptr kf_vtl_make_tracking(const Kf_Conf &conf_); | ||||||
|  |     explicit kf_vtl_tracking(const Kf_Conf &conf_); | ||||||
|  |  | ||||||
|  |     void init_kf(double acq_code_phase_chips, double acq_doppler_hz); | ||||||
|  |  | ||||||
|  |     void msg_handler_telemetry_to_trk(const pmt::pmt_t &msg); | ||||||
|  |     void msg_handler_pvt_to_trk(const pmt::pmt_t &msg); | ||||||
|  |     void do_correlation_step(const gr_complex *input_samples); | ||||||
|  |     void run_Kf(); | ||||||
|  |     void check_carrier_phase_coherent_initialization(); | ||||||
|  |     void update_tracking_vars(); | ||||||
|  |     void clear_tracking_vars(); | ||||||
|  |     void save_correlation_results(); | ||||||
|  |     void log_data(); | ||||||
|  |     bool cn0_and_tracking_lock_status(double coh_integration_time_s); | ||||||
|  |     bool acquire_secondary(); | ||||||
|  |     int32_t save_matfile() const; | ||||||
|  |  | ||||||
|  |     Cpu_Multicorrelator_Real_Codes d_multicorrelator_cpu; | ||||||
|  |     Cpu_Multicorrelator_Real_Codes d_correlator_data_cpu;  // for data channel | ||||||
|  |  | ||||||
|  |     Kf_Conf d_trk_parameters; | ||||||
|  |  | ||||||
|  |     Exponential_Smoother d_cn0_smoother; | ||||||
|  |     Exponential_Smoother d_carrier_lock_test_smoother; | ||||||
|  |  | ||||||
|  |     Gnss_Synchro *d_acquisition_gnss_synchro; | ||||||
|  |  | ||||||
|  |     volk_gnsssdr::vector<float> d_tracking_code; | ||||||
|  |     volk_gnsssdr::vector<float> d_data_code; | ||||||
|  |     volk_gnsssdr::vector<float> d_local_code_shift_chips; | ||||||
|  |     volk_gnsssdr::vector<gr_complex> d_correlator_outs; | ||||||
|  |     volk_gnsssdr::vector<gr_complex> d_Prompt_Data; | ||||||
|  |     volk_gnsssdr::vector<gr_complex> d_Prompt_buffer; | ||||||
|  |  | ||||||
|  |     boost::circular_buffer<std::pair<double, double>> d_code_ph_history; | ||||||
|  |     boost::circular_buffer<std::pair<double, double>> d_carr_ph_history; | ||||||
|  |     boost::circular_buffer<gr_complex> d_Prompt_circular_buffer; | ||||||
|  |  | ||||||
|  |     const size_t int_type_hash_code = typeid(int).hash_code(); | ||||||
|  |  | ||||||
|  |     //Kalman Filter class variables | ||||||
|  |     arma::mat F; | ||||||
|  |     arma::mat H; | ||||||
|  |     arma::mat R; | ||||||
|  |     arma::mat Q; | ||||||
|  |     arma::mat P_old_old; | ||||||
|  |     arma::mat P_new_old; | ||||||
|  |     arma::mat P_new_new; | ||||||
|  |     arma::vec x_old_old; | ||||||
|  |     arma::vec x_new_old; | ||||||
|  |     arma::vec x_new_new; | ||||||
|  |  | ||||||
|  |     //nominal signal parameters | ||||||
|  |     double d_signal_carrier_freq; | ||||||
|  |     double d_code_period; | ||||||
|  |     double d_code_chip_rate; | ||||||
|  |  | ||||||
|  |     //acquisition | ||||||
|  |     double d_acq_code_phase_samples; | ||||||
|  |     double d_acq_carrier_doppler_hz; | ||||||
|  |     double d_current_correlation_time_s; | ||||||
|  |  | ||||||
|  |     //carrier and code discriminators output | ||||||
|  |     double d_carr_phase_error_disc_hz; | ||||||
|  |     double d_carr_freq_error_disc_hz; | ||||||
|  |     double d_code_error_disc_chips; | ||||||
|  |  | ||||||
|  |     //estimated parameters | ||||||
|  |     //code | ||||||
|  |     double d_code_error_kf_chips; | ||||||
|  |     double d_code_freq_kf_chips_s; | ||||||
|  |     //carrier | ||||||
|  |     double d_carrier_phase_kf_rad; | ||||||
|  |     double d_carrier_doppler_kf_hz; | ||||||
|  |     double d_carrier_doppler_rate_kf_hz_s; | ||||||
|  |  | ||||||
|  |     double d_acc_carrier_phase_rad; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     double d_T_chip_seconds; | ||||||
|  |     double d_T_prn_seconds; | ||||||
|  |     double d_T_prn_samples; | ||||||
|  |     double d_K_blk_samples; | ||||||
|  |     double d_carrier_lock_test; | ||||||
|  |     double d_CN0_SNV_dB_Hz; | ||||||
|  |     double d_carrier_lock_threshold; | ||||||
|  |  | ||||||
|  |     //carrier NCO | ||||||
|  |  | ||||||
|  |     double d_carrier_phase_step_rad; | ||||||
|  |     double d_carrier_phase_rate_step_rad; | ||||||
|  |  | ||||||
|  |     //code NCO | ||||||
|  |     double d_code_phase_step_chips; | ||||||
|  |     double d_code_phase_rate_step_chips; | ||||||
|  |     double d_rem_code_phase_chips; | ||||||
|  |     double d_rem_code_phase_samples; | ||||||
|  |  | ||||||
|  |     gr_complex *d_Very_Early; | ||||||
|  |     gr_complex *d_Early; | ||||||
|  |     gr_complex *d_Prompt; | ||||||
|  |     gr_complex *d_Late; | ||||||
|  |     gr_complex *d_Very_Late; | ||||||
|  |  | ||||||
|  |     gr_complex d_VE_accu; | ||||||
|  |     gr_complex d_E_accu; | ||||||
|  |     gr_complex d_P_accu; | ||||||
|  |     gr_complex d_P_accu_old; | ||||||
|  |     gr_complex d_L_accu; | ||||||
|  |     gr_complex d_VL_accu; | ||||||
|  |     gr_complex d_P_data_accu; | ||||||
|  |  | ||||||
|  |     std::string d_secondary_code_string; | ||||||
|  |     std::string d_data_secondary_code_string; | ||||||
|  |     std::string d_systemName; | ||||||
|  |     std::string d_signal_type; | ||||||
|  |     std::string d_signal_pretty_name; | ||||||
|  |     std::string d_dump_filename; | ||||||
|  |  | ||||||
|  |     std::ofstream d_dump_file; | ||||||
|  |  | ||||||
|  |     uint64_t d_sample_counter; | ||||||
|  |     uint64_t d_acq_sample_stamp; | ||||||
|  |  | ||||||
|  |     float *d_prompt_data_shift; | ||||||
|  |     float d_rem_carr_phase_rad; | ||||||
|  |  | ||||||
|  |     int32_t d_symbols_per_bit; | ||||||
|  |     int32_t d_preamble_length_symbols; | ||||||
|  |     int32_t d_state; | ||||||
|  |     int32_t d_correlation_length_ms; | ||||||
|  |     int32_t d_n_correlator_taps; | ||||||
|  |     int32_t d_current_prn_length_samples; | ||||||
|  |     int32_t d_extend_correlation_symbols_count; | ||||||
|  |     int32_t d_current_symbol; | ||||||
|  |     int32_t d_current_data_symbol; | ||||||
|  |     int32_t d_cn0_estimation_counter; | ||||||
|  |     int32_t d_carrier_lock_fail_counter; | ||||||
|  |     int32_t d_code_lock_fail_counter; | ||||||
|  |     int32_t d_code_samples_per_chip;  // All signals have 1 sample per chip code except Gal. E1 which has 2 (CBOC disabled) or 12 (CBOC enabled) | ||||||
|  |     int32_t d_code_length_chips; | ||||||
|  |  | ||||||
|  |     uint32_t d_channel; | ||||||
|  |     uint32_t d_secondary_code_length; | ||||||
|  |     uint32_t d_data_secondary_code_length; | ||||||
|  |  | ||||||
|  |     bool d_pull_in_transitory; | ||||||
|  |     bool d_corrected_doppler; | ||||||
|  |     bool d_interchange_iq; | ||||||
|  |     bool d_veml; | ||||||
|  |     bool d_cloop; | ||||||
|  |     bool d_secondary; | ||||||
|  |     bool d_dump; | ||||||
|  |     bool d_dump_mat; | ||||||
|  |     bool d_acc_carrier_phase_initialized; | ||||||
|  |     bool d_enable_extended_integration; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif  // GNSS_SDR_kf_vtl_TRACKING_H | ||||||
| @@ -21,6 +21,7 @@ set(TRACKING_LIB_SOURCES | |||||||
|     tracking_FLL_PLL_filter.cc |     tracking_FLL_PLL_filter.cc | ||||||
|     tracking_loop_filter.cc |     tracking_loop_filter.cc | ||||||
|     dll_pll_conf.cc |     dll_pll_conf.cc | ||||||
|  |     kf_conf.cc | ||||||
|     bayesian_estimation.cc |     bayesian_estimation.cc | ||||||
|     exponential_smoother.cc |     exponential_smoother.cc | ||||||
| ) | ) | ||||||
| @@ -38,6 +39,7 @@ set(TRACKING_LIB_HEADERS | |||||||
|     tracking_FLL_PLL_filter.h |     tracking_FLL_PLL_filter.h | ||||||
|     tracking_loop_filter.h |     tracking_loop_filter.h | ||||||
|     dll_pll_conf.h |     dll_pll_conf.h | ||||||
|  |     kf_conf.h | ||||||
|     bayesian_estimation.h |     bayesian_estimation.h | ||||||
|     exponential_smoother.h |     exponential_smoother.h | ||||||
| ) | ) | ||||||
|   | |||||||
							
								
								
									
										151
									
								
								src/algorithms/tracking/libs/kf_conf.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								src/algorithms/tracking/libs/kf_conf.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | |||||||
|  | /*! | ||||||
|  |  * \file Kf_conf.cc | ||||||
|  |  * \brief Class that contains all the configuration parameters for generic | ||||||
|  |  * tracking block based on a DLL and a PLL. | ||||||
|  |  * \author Javier Arribas, 2018. jarribas(at)cttc.es | ||||||
|  |  * | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2010-2020  (see AUTHORS file for a list of contributors) | ||||||
|  |  * | ||||||
|  |  * GNSS-SDR is a software defined Global Navigation | ||||||
|  |  *          Satellite Systems receiver | ||||||
|  |  * | ||||||
|  |  * This file is part of GNSS-SDR. | ||||||
|  |  * | ||||||
|  |  * SPDX-License-Identifier: GPL-3.0-or-later | ||||||
|  |  * | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "kf_conf.h" | ||||||
|  | #include "gnss_sdr_flags.h" | ||||||
|  | #include "item_type_helpers.h" | ||||||
|  | #include <glog/logging.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Kf_Conf::Kf_Conf() | ||||||
|  | { | ||||||
|  |     /*KF tracking configuration */ | ||||||
|  |     high_dyn = false; | ||||||
|  |     smoother_length = 10; | ||||||
|  |     fs_in = 2000000.0; | ||||||
|  |     vector_length = 0U; | ||||||
|  |     dump = false; | ||||||
|  |     dump_mat = true; | ||||||
|  |     dump_filename = std::string("./Kf_dump.dat"); | ||||||
|  |  | ||||||
|  |     pull_in_time_s = 10; | ||||||
|  |     bit_synchronization_time_limit_s = pull_in_time_s + 60; | ||||||
|  |     early_late_space_chips = 0.25; | ||||||
|  |     very_early_late_space_chips = 0.5; | ||||||
|  |     early_late_space_narrow_chips = 0.15; | ||||||
|  |     very_early_late_space_narrow_chips = 0.5; | ||||||
|  |     slope = 1.0; | ||||||
|  |     spc = 0.5; | ||||||
|  |     y_intercept = 1.0; | ||||||
|  |     carrier_aiding = true; | ||||||
|  |     extend_correlation_symbols = 1; | ||||||
|  |     cn0_samples = FLAGS_cn0_samples; | ||||||
|  |     cn0_smoother_samples = 200; | ||||||
|  |     cn0_smoother_alpha = 0.002; | ||||||
|  |     carrier_lock_test_smoother_alpha = 0.002; | ||||||
|  |     carrier_lock_test_smoother_samples = 25; | ||||||
|  |     cn0_min = FLAGS_cn0_min; | ||||||
|  |     max_carrier_lock_fail = FLAGS_max_carrier_lock_fail; | ||||||
|  |     max_code_lock_fail = FLAGS_max_lock_fail; | ||||||
|  |     carrier_lock_th = FLAGS_carrier_lock_th; | ||||||
|  |     track_pilot = true; | ||||||
|  |     enable_doppler_correction = false; | ||||||
|  |     system = 'G'; | ||||||
|  |     signal[0] = '1'; | ||||||
|  |     signal[1] = 'C'; | ||||||
|  |     signal[2] = '\0'; | ||||||
|  |     item_type = "gr_complex"; | ||||||
|  |  | ||||||
|  |     expected_cn0_dbhz = 0; | ||||||
|  |     //System covariances (Q) | ||||||
|  |     code_phase_sd_chips = 0; | ||||||
|  |     code_rate_sd_chips_s = 0; | ||||||
|  |     carrier_phase_sd_rad = 0; | ||||||
|  |     carrier_freq_sd_hz = 0; | ||||||
|  |     carrier_freq_rate_sd_hz_s = 0; | ||||||
|  |     //initial Kalman covariance matrix (P) | ||||||
|  |     init_code_phase_sd_chips = 0; | ||||||
|  |     init_code_rate_sd_chips_s = 0; | ||||||
|  |     init_carrier_phase_sd_rad = 0; | ||||||
|  |     init_carrier_freq_sd_hz = 0; | ||||||
|  |     init_carrier_freq_rate_sd_hz_s = 0; | ||||||
|  |  | ||||||
|  |     enable_dynamic_measurement_covariance = false; | ||||||
|  |     use_estimated_cn0 = false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void Kf_Conf::SetFromConfiguration(const ConfigurationInterface *configuration, | ||||||
|  |     const std::string &role) | ||||||
|  | { | ||||||
|  |     item_type = configuration->property(role + ".item_type", item_type); | ||||||
|  |     if (!item_type_valid(item_type)) | ||||||
|  |         { | ||||||
|  |             LOG(WARNING) << "Unknown item type: " + item_type << ". Set to gr_complex"; | ||||||
|  |             item_type = "gr_complex"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     double fs_in_deprecated = configuration->property("GNSS-SDR.internal_fs_hz", fs_in); | ||||||
|  |     fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); | ||||||
|  |     high_dyn = configuration->property(role + ".high_dyn", high_dyn); | ||||||
|  |     dump = configuration->property(role + ".dump", dump); | ||||||
|  |     dump_filename = configuration->property(role + ".dump_filename", dump_filename); | ||||||
|  |     dump_mat = configuration->property(role + ".dump_mat", dump_mat); | ||||||
|  |  | ||||||
|  |     pull_in_time_s = configuration->property(role + ".pull_in_time_s", pull_in_time_s); | ||||||
|  |     bit_synchronization_time_limit_s = pull_in_time_s + 60; | ||||||
|  |     early_late_space_chips = configuration->property(role + ".early_late_space_chips", early_late_space_chips); | ||||||
|  |     early_late_space_narrow_chips = configuration->property(role + ".early_late_space_narrow_chips", early_late_space_narrow_chips); | ||||||
|  |     very_early_late_space_chips = configuration->property(role + ".very_early_late_space_chips", very_early_late_space_chips); | ||||||
|  |     very_early_late_space_narrow_chips = configuration->property(role + ".very_early_late_space_narrow_chips", very_early_late_space_narrow_chips); | ||||||
|  |     extend_correlation_symbols = configuration->property(role + ".extend_correlation_symbols", extend_correlation_symbols); | ||||||
|  |     track_pilot = configuration->property(role + ".track_pilot", track_pilot); | ||||||
|  |     cn0_samples = configuration->property(role + ".cn0_samples", cn0_samples); | ||||||
|  |     cn0_min = configuration->property(role + ".cn0_min", cn0_min); | ||||||
|  |     max_code_lock_fail = configuration->property(role + ".max_lock_fail", max_code_lock_fail); | ||||||
|  |     max_carrier_lock_fail = configuration->property(role + ".max_carrier_lock_fail", max_carrier_lock_fail); | ||||||
|  |     carrier_lock_th = configuration->property(role + ".carrier_lock_th", carrier_lock_th); | ||||||
|  |     carrier_aiding = configuration->property(role + ".carrier_aiding", carrier_aiding); | ||||||
|  |  | ||||||
|  |     // tracking lock tests smoother parameters | ||||||
|  |     cn0_smoother_samples = configuration->property(role + ".cn0_smoother_samples", cn0_smoother_samples); | ||||||
|  |     cn0_smoother_alpha = configuration->property(role + ".cn0_smoother_alpha", cn0_smoother_alpha); | ||||||
|  |     smoother_length = configuration->property(role + ".smoother_length", smoother_length); | ||||||
|  |     if (smoother_length < 1) | ||||||
|  |         { | ||||||
|  |             smoother_length = 1; | ||||||
|  |             LOG(WARNING) << "smoother_length must be bigger than 0. It has been set to 1"; | ||||||
|  |         } | ||||||
|  |     carrier_lock_test_smoother_samples = configuration->property(role + ".carrier_lock_test_smoother_samples", carrier_lock_test_smoother_samples); | ||||||
|  |     carrier_lock_test_smoother_alpha = configuration->property(role + ".carrier_lock_test_smoother_alpha", carrier_lock_test_smoother_alpha); | ||||||
|  |  | ||||||
|  |     // Kalman filter covariances | ||||||
|  |  | ||||||
|  |     //Measurement covariances (R) | ||||||
|  |     expected_cn0_dbhz = configuration->property(role + ".expected_cn0_dbhz", 42.0); | ||||||
|  |     enable_dynamic_measurement_covariance = configuration->property(role + ".enable_dynamic_measurement_covariance", false); | ||||||
|  |     use_estimated_cn0 = configuration->property(role + ".use_estimated_cn0", false); | ||||||
|  |  | ||||||
|  |     //System covariances (Q) | ||||||
|  |     code_phase_sd_chips = configuration->property(role + ".code_phase_sd_chips", 0.001); | ||||||
|  |     code_rate_sd_chips_s = configuration->property(role + ".code_rate_sd_chips_s", 0.001); | ||||||
|  |  | ||||||
|  |     carrier_phase_sd_rad = configuration->property(role + ".carrier_phase_sd_rad", 0.001); | ||||||
|  |     carrier_freq_sd_hz = configuration->property(role + ".carrier_freq_sd_hz", 0.1); | ||||||
|  |     carrier_freq_rate_sd_hz_s = configuration->property(role + ".carrier_freq_rate_sd_hz_s", 1); | ||||||
|  |  | ||||||
|  |     //initial Kalman covariance matrix (P) | ||||||
|  |     init_code_phase_sd_chips = configuration->property(role + ".init_code_phase_sd_chips", 1); | ||||||
|  |     init_code_rate_sd_chips_s = configuration->property(role + ".init_code_rate_sd_chips_s", 100); | ||||||
|  |  | ||||||
|  |     init_carrier_phase_sd_rad = configuration->property(role + ".init_carrier_phase_sd_rad", 10); | ||||||
|  |     init_carrier_freq_sd_hz = configuration->property(role + ".init_carrier_freq_sd_hz", 1000); | ||||||
|  |     init_carrier_freq_rate_sd_hz_s = configuration->property(role + ".init_carrier_freq_rate_sd_hz_s", 1000); | ||||||
|  | } | ||||||
							
								
								
									
										91
									
								
								src/algorithms/tracking/libs/kf_conf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								src/algorithms/tracking/libs/kf_conf.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | |||||||
|  | /*! | ||||||
|  |  * \file Kf_conf.h | ||||||
|  |  * \brief Class that contains all the configuration parameters for generic tracking block based on a Kalman Filter. | ||||||
|  |  * \author Javier Arribas, 2020. jarribas(at)cttc.es | ||||||
|  |  * | ||||||
|  |  * Class that contains all the configuration parameters for generic tracking block based on a DLL and a PLL. | ||||||
|  |  * | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2010-2020  (see AUTHORS file for a list of contributors) | ||||||
|  |  * | ||||||
|  |  * GNSS-SDR is a software defined Global Navigation | ||||||
|  |  *          Satellite Systems receiver | ||||||
|  |  * | ||||||
|  |  * This file is part of GNSS-SDR. | ||||||
|  |  * | ||||||
|  |  * SPDX-License-Identifier: GPL-3.0-or-later | ||||||
|  |  * | ||||||
|  |  * ----------------------------------------------------------------------------- | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef GNSS_SDR_Kf_CONF_H | ||||||
|  | #define GNSS_SDR_Kf_CONF_H | ||||||
|  |  | ||||||
|  | #include "configuration_interface.h" | ||||||
|  | #include <cstdint> | ||||||
|  | #include <string> | ||||||
|  |  | ||||||
|  | class Kf_Conf | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     Kf_Conf(); | ||||||
|  |     void SetFromConfiguration(const ConfigurationInterface *configuration, const std::string &role); | ||||||
|  |  | ||||||
|  |     std::string item_type; | ||||||
|  |     std::string dump_filename; | ||||||
|  |     double fs_in; | ||||||
|  |     double carrier_lock_th; | ||||||
|  |     float early_late_space_chips; | ||||||
|  |     float very_early_late_space_chips; | ||||||
|  |     float early_late_space_narrow_chips; | ||||||
|  |     float very_early_late_space_narrow_chips; | ||||||
|  |     float slope; | ||||||
|  |     float spc; | ||||||
|  |     float y_intercept; | ||||||
|  |     float cn0_smoother_alpha; | ||||||
|  |     float carrier_lock_test_smoother_alpha; | ||||||
|  |     uint32_t pull_in_time_s; | ||||||
|  |     uint32_t bit_synchronization_time_limit_s; | ||||||
|  |     uint32_t vector_length; | ||||||
|  |     uint32_t smoother_length; | ||||||
|  |     int32_t extend_correlation_symbols; | ||||||
|  |     int32_t cn0_samples; | ||||||
|  |     int32_t cn0_smoother_samples; | ||||||
|  |     int32_t carrier_lock_test_smoother_samples; | ||||||
|  |     int32_t cn0_min; | ||||||
|  |     int32_t max_code_lock_fail; | ||||||
|  |     int32_t max_carrier_lock_fail; | ||||||
|  |     char signal[3]{}; | ||||||
|  |     char system; | ||||||
|  |     bool track_pilot; | ||||||
|  |     bool enable_doppler_correction; | ||||||
|  |     bool carrier_aiding; | ||||||
|  |     bool high_dyn; | ||||||
|  |     bool dump; | ||||||
|  |     bool dump_mat; | ||||||
|  |  | ||||||
|  |     //KF statistics | ||||||
|  |     //states: code_phase_chips, carrier_phase_rads, carrier_freq_hz, carrier_freq_rate_hz_s, code_freq_rate_chips_s | ||||||
|  |     //Measurement covariances (R) | ||||||
|  |     double expected_cn0_dbhz; | ||||||
|  |     //System covariances (Q) | ||||||
|  |     double code_phase_sd_chips; | ||||||
|  |     double code_rate_sd_chips_s; | ||||||
|  |  | ||||||
|  |     double carrier_phase_sd_rad; | ||||||
|  |     double carrier_freq_sd_hz; | ||||||
|  |     double carrier_freq_rate_sd_hz_s; | ||||||
|  |     //initial Kalman covariance matrix (P) | ||||||
|  |     double init_code_phase_sd_chips; | ||||||
|  |     double init_code_rate_sd_chips_s; | ||||||
|  |  | ||||||
|  |     double init_carrier_phase_sd_rad; | ||||||
|  |     double init_carrier_freq_sd_hz; | ||||||
|  |     double init_carrier_freq_rate_sd_hz_s; | ||||||
|  |  | ||||||
|  |     bool enable_dynamic_measurement_covariance; | ||||||
|  |     bool use_estimated_cn0; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif | ||||||
| @@ -70,6 +70,7 @@ | |||||||
| #include "gnss_sdr_make_unique.h" | #include "gnss_sdr_make_unique.h" | ||||||
| #include "gps_l1_ca_dll_pll_tracking.h" | #include "gps_l1_ca_dll_pll_tracking.h" | ||||||
| #include "gps_l1_ca_kf_tracking.h" | #include "gps_l1_ca_kf_tracking.h" | ||||||
|  | #include "gps_l1_ca_kf_vtl_tracking.h" | ||||||
| #include "gps_l1_ca_pcps_acquisition.h" | #include "gps_l1_ca_pcps_acquisition.h" | ||||||
| #include "gps_l1_ca_pcps_acquisition_fine_doppler.h" | #include "gps_l1_ca_pcps_acquisition_fine_doppler.h" | ||||||
| #include "gps_l1_ca_pcps_assisted_acquisition.h" | #include "gps_l1_ca_pcps_assisted_acquisition.h" | ||||||
| @@ -1080,6 +1081,12 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetBlock( | |||||||
|                 out_streams); |                 out_streams); | ||||||
|             block = std::move(block_); |             block = std::move(block_); | ||||||
|         } |         } | ||||||
|  |     else if (implementation == "GPS_L1_CA_KF_VTL_Tracking") | ||||||
|  |         { | ||||||
|  |             std::unique_ptr<GNSSBlockInterface> block_ = std::make_unique<GpsL1CaKfVtlTracking>(configuration, role, in_streams, | ||||||
|  |                 out_streams); | ||||||
|  |             block = std::move(block_); | ||||||
|  |         } | ||||||
|     else if (implementation == "GPS_L1_CA_TCP_CONNECTOR_Tracking") |     else if (implementation == "GPS_L1_CA_TCP_CONNECTOR_Tracking") | ||||||
|         { |         { | ||||||
|             std::unique_ptr<GNSSBlockInterface> block_ = std::make_unique<GpsL1CaTcpConnectorTracking>(configuration, role, in_streams, |             std::unique_ptr<GNSSBlockInterface> block_ = std::make_unique<GpsL1CaTcpConnectorTracking>(configuration, role, in_streams, | ||||||
| @@ -1505,6 +1512,12 @@ std::unique_ptr<TrackingInterface> GNSSBlockFactory::GetTrkBlock( | |||||||
|                 out_streams); |                 out_streams); | ||||||
|             block = std::move(block_); |             block = std::move(block_); | ||||||
|         } |         } | ||||||
|  |     else if (implementation == "GPS_L1_CA_KF_VTL_Tracking") | ||||||
|  |         { | ||||||
|  |             std::unique_ptr<TrackingInterface> block_ = std::make_unique<GpsL1CaKfVtlTracking>(configuration, role, in_streams, | ||||||
|  |                 out_streams); | ||||||
|  |             block = std::move(block_); | ||||||
|  |         } | ||||||
|     else if (implementation == "GPS_L1_CA_TCP_CONNECTOR_Tracking") |     else if (implementation == "GPS_L1_CA_TCP_CONNECTOR_Tracking") | ||||||
|         { |         { | ||||||
|             std::unique_ptr<TrackingInterface> block_ = std::make_unique<GpsL1CaTcpConnectorTracking>(configuration, role, in_streams, |             std::unique_ptr<TrackingInterface> block_ = std::make_unique<GpsL1CaTcpConnectorTracking>(configuration, role, in_streams, | ||||||
|   | |||||||
| @@ -674,6 +674,16 @@ void GNSSFlowgraph::connect() | |||||||
|                 { |                 { | ||||||
|                     top_block_->connect(observables_->get_right_block(), i, pvt_->get_left_block(), i); |                     top_block_->connect(observables_->get_right_block(), i, pvt_->get_left_block(), i); | ||||||
|                     top_block_->msg_connect(channels_.at(i)->get_right_block(), pmt::mp("telemetry"), pvt_->get_left_block(), pmt::mp("telemetry")); |                     top_block_->msg_connect(channels_.at(i)->get_right_block(), pmt::mp("telemetry"), pvt_->get_left_block(), pmt::mp("telemetry")); | ||||||
|  |                     //experimental VTL | ||||||
|  |                     //TODO: It is currently implemented only in dll_pll_veml_tracking, other configs will fail! | ||||||
|  |                     try | ||||||
|  |                         { | ||||||
|  |                             top_block_->msg_connect(pvt_->get_left_block(), pmt::mp("pvt_to_trk"), channels_.at(i)->get_left_block_trk(), pmt::mp("pvt_to_trk")); | ||||||
|  |                         } | ||||||
|  |                     catch (std::exception& ex) | ||||||
|  |                         { | ||||||
|  |                             LOG(WARNING) << "pvt_to_trk message not implemented in " << channels_.at(i)->implementation(); | ||||||
|  |                         } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|             top_block_->msg_connect(observables_->get_right_block(), pmt::mp("status"), channels_status_, pmt::mp("status")); |             top_block_->msg_connect(observables_->get_right_block(), pmt::mp("status"), channels_status_, pmt::mp("status")); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Javier Arribas
					Javier Arribas