@@ -15,7 +15,8 @@ namespace s2e::components {
15
15
16
16
GnssReceiver::GnssReceiver (const int prescaler, environment::ClockGenerator* clock_generator, const size_t component_id,
17
17
const AntennaModel antenna_model, const math::Vector<3 > antenna_position_b_m, const math::Quaternion quaternion_b2c,
18
- const double half_width_deg, const math::Vector<3 > position_noise_standard_deviation_ecef_m,
18
+ const double half_width_deg, const double pseudorange_noise_standard_deviation_m,
19
+ const math::Vector<3 > position_noise_standard_deviation_ecef_m,
19
20
const math::Vector<3 > velocity_noise_standard_deviation_ecef_m_s, const dynamics::Dynamics* dynamics,
20
21
const environment::GnssSatellites* gnss_satellites, const environment::SimulationTime* simulation_time)
21
22
: Component(prescaler, clock_generator),
@@ -32,11 +33,13 @@ GnssReceiver::GnssReceiver(const int prescaler, environment::ClockGenerator* clo
32
33
velocity_random_noise_ecef_m_s_[i].SetParameters (0.0 , velocity_noise_standard_deviation_ecef_m_s[i],
33
34
randomization::global_randomization.MakeSeed ());
34
35
}
36
+ pseudorange_random_noise_m_.SetParameters (0.0 , pseudorange_noise_standard_deviation_m, randomization::global_randomization.MakeSeed ());
35
37
}
36
38
37
39
GnssReceiver::GnssReceiver (const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const size_t component_id,
38
40
const AntennaModel antenna_model, const math::Vector<3 > antenna_position_b_m, const math::Quaternion quaternion_b2c,
39
- const double half_width_deg, const math::Vector<3 > position_noise_standard_deviation_ecef_m,
41
+ const double half_width_deg, const double pseudorange_noise_standard_deviation_m,
42
+ const math::Vector<3 > position_noise_standard_deviation_ecef_m,
40
43
const math::Vector<3 > velocity_noise_standard_deviation_ecef_m_s, const dynamics::Dynamics* dynamics,
41
44
const environment::GnssSatellites* gnss_satellites, const environment::SimulationTime* simulation_time)
42
45
: Component(prescaler, clock_generator, power_port),
@@ -53,6 +56,7 @@ GnssReceiver::GnssReceiver(const int prescaler, environment::ClockGenerator* clo
53
56
velocity_random_noise_ecef_m_s_[i].SetParameters (0.0 , velocity_noise_standard_deviation_ecef_m_s[i],
54
57
randomization::global_randomization.MakeSeed ());
55
58
}
59
+ pseudorange_random_noise_m_.SetParameters (0.0 , pseudorange_noise_standard_deviation_m, randomization::global_randomization.MakeSeed ());
56
60
}
57
61
58
62
void GnssReceiver::MainRoutine (const int time_count) {
@@ -64,6 +68,9 @@ void GnssReceiver::MainRoutine(const int time_count) {
64
68
math::Quaternion quaternion_i2b = dynamics_->GetAttitude ().GetQuaternion_i2b ();
65
69
CheckAntenna (position_true_eci, quaternion_i2b);
66
70
71
+ // Pseudorange calculation
72
+ SetGnssObservationList ();
73
+
67
74
if (is_gnss_visible_) {
68
75
// Antenna of GNSS-R can detect GNSS signal
69
76
position_ecef_m_ = dynamics_->GetOrbit ().GetPosition_ecef_m ();
@@ -179,6 +186,32 @@ void GnssReceiver::SetGnssInfo(const math::Vector<3> antenna_to_satellite_i_m, c
179
186
gnss_information_list_.push_back (gnss_info_new);
180
187
}
181
188
189
+ double GnssReceiver::CalcGeometricDistance_m (const size_t gnss_system_id) {
190
+ math::Vector<3 > gnss_satellite_position_ecef_m = gnss_satellites_->GetPosition_ecef_m (gnss_system_id);
191
+ math::Vector<3 > position_true_ecef_m = dynamics_->GetOrbit ().GetPosition_ecef_m ();
192
+ double geometric_distance_m = (gnss_satellite_position_ecef_m - position_true_ecef_m).CalcNorm ();
193
+ return geometric_distance_m;
194
+ }
195
+
196
+ double GnssReceiver::CalcPseudorange_m (const size_t gnss_system_id) {
197
+ // TODO: Add effect of radio wave propagation time
198
+ // TODO: Add effect of clock bias
199
+ // TODO: Add ionospheric delay
200
+ double geometric_distance_m = CalcGeometricDistance_m (gnss_system_id);
201
+ double pseudorange_m = geometric_distance_m + pseudorange_random_noise_m_;
202
+ return pseudorange_m;
203
+ }
204
+
205
+ void GnssReceiver::SetGnssObservationList () {
206
+ // TODO: Add carrier phase observation
207
+ pseudorange_list_m_.assign (kTotalNumberOfGnssSatellite , 0.0 );
208
+ for (size_t i = 0 ; i < gnss_information_list_.size (); i++) {
209
+ size_t gnss_system_id = gnss_information_list_[i].gnss_id ;
210
+ double pseudorange_m = CalcPseudorange_m (gnss_system_id);
211
+ pseudorange_list_m_[gnss_system_id] = pseudorange_m;
212
+ }
213
+ }
214
+
182
215
void GnssReceiver::AddNoise (const math::Vector<3 > position_true_ecef_m, const math::Vector<3 > velocity_true_ecef_m_s) {
183
216
for (size_t i = 0 ; i < 3 ; i++) {
184
217
position_ecef_m_[i] = position_true_ecef_m[i] + position_random_noise_ecef_m_[i];
@@ -217,6 +250,9 @@ std::string GnssReceiver::GetLogHeader() const // For logs
217
250
str_tmp += logger::WriteScalar (sensor_name + " measured_altitude" , " m" );
218
251
str_tmp += logger::WriteScalar (sensor_name + " satellite_visible_flag" );
219
252
str_tmp += logger::WriteScalar (sensor_name + " number_of_visible_satellites" );
253
+ for (size_t gps_index = 0 ; gps_index < kNumberOfGpsSatellite ; gps_index++) {
254
+ str_tmp += logger::WriteScalar (" GPS" + std::to_string (gps_index) + " _pseudorange" , " m" );
255
+ }
220
256
221
257
return str_tmp;
222
258
}
@@ -237,6 +273,9 @@ std::string GnssReceiver::GetLogValue() const // For logs
237
273
str_tmp += logger::WriteScalar (geodetic_position_.GetAltitude_m (), 10 );
238
274
str_tmp += logger::WriteScalar (is_gnss_visible_);
239
275
str_tmp += logger::WriteScalar (visible_satellite_number_);
276
+ for (size_t gps_index = 0 ; gps_index < kNumberOfGpsSatellite ; gps_index++) {
277
+ str_tmp += logger::WriteScalar (pseudorange_list_m_[gps_index], 16 );
278
+ }
240
279
241
280
return str_tmp;
242
281
}
@@ -259,6 +298,7 @@ typedef struct _gnss_receiver_param {
259
298
math::Vector<3 > antenna_pos_b;
260
299
math::Quaternion quaternion_b2c;
261
300
double half_width_deg;
301
+ double pseudorange_noise_standard_deviation_m;
262
302
math::Vector<3 > position_noise_standard_deviation_ecef_m;
263
303
math::Vector<3 > velocity_noise_standard_deviation_ecef_m_s;
264
304
} GnssReceiverParam;
@@ -287,6 +327,7 @@ GnssReceiverParam ReadGnssReceiverIni(const std::string file_name, const environ
287
327
gnssr_conf.ReadVector (GSection, " antenna_position_b_m" , gnss_receiver_param.antenna_pos_b );
288
328
gnssr_conf.ReadQuaternion (GSection, " quaternion_b2c" , gnss_receiver_param.quaternion_b2c );
289
329
gnss_receiver_param.half_width_deg = gnssr_conf.ReadDouble (GSection, " antenna_half_width_deg" );
330
+ gnss_receiver_param.pseudorange_noise_standard_deviation_m = gnssr_conf.ReadDouble (GSection, " white_noise_standard_deviation_pseudorange_m" );
290
331
gnssr_conf.ReadVector (GSection, " white_noise_standard_deviation_position_ecef_m" , gnss_receiver_param.position_noise_standard_deviation_ecef_m );
291
332
gnssr_conf.ReadVector (GSection, " white_noise_standard_deviation_velocity_ecef_m_s" , gnss_receiver_param.velocity_noise_standard_deviation_ecef_m_s );
292
333
@@ -299,8 +340,8 @@ GnssReceiver InitGnssReceiver(environment::ClockGenerator* clock_generator, cons
299
340
GnssReceiverParam gr_param = ReadGnssReceiverIni (file_name, gnss_satellites, component_id);
300
341
301
342
GnssReceiver gnss_r (gr_param.prescaler , clock_generator, component_id, gr_param.antenna_model , gr_param.antenna_pos_b , gr_param.quaternion_b2c ,
302
- gr_param.half_width_deg , gr_param.position_noise_standard_deviation_ecef_m , gr_param.velocity_noise_standard_deviation_ecef_m_s ,
303
- dynamics, gnss_satellites, simulation_time);
343
+ gr_param.half_width_deg , gr_param.pseudorange_noise_standard_deviation_m , gr_param.position_noise_standard_deviation_ecef_m ,
344
+ gr_param. velocity_noise_standard_deviation_ecef_m_s , dynamics, gnss_satellites, simulation_time);
304
345
return gnss_r;
305
346
}
306
347
@@ -313,8 +354,9 @@ GnssReceiver InitGnssReceiver(environment::ClockGenerator* clock_generator, Powe
313
354
power_port->InitializeWithInitializeFile (file_name);
314
355
315
356
GnssReceiver gnss_r (gr_param.prescaler , clock_generator, power_port, component_id, gr_param.antenna_model , gr_param.antenna_pos_b ,
316
- gr_param.quaternion_b2c , gr_param.half_width_deg , gr_param.position_noise_standard_deviation_ecef_m ,
317
- gr_param.velocity_noise_standard_deviation_ecef_m_s , dynamics, gnss_satellites, simulation_time);
357
+ gr_param.quaternion_b2c , gr_param.half_width_deg , gr_param.pseudorange_noise_standard_deviation_m ,
358
+ gr_param.position_noise_standard_deviation_ecef_m , gr_param.velocity_noise_standard_deviation_ecef_m_s , dynamics,
359
+ gnss_satellites, simulation_time);
318
360
return gnss_r;
319
361
}
320
362
0 commit comments