mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-10-29 22:26:22 +00:00
139 lines
4.3 KiB
Python
139 lines
4.3 KiB
Python
|
"""
|
||
|
hybrid_observables_plot_sample.py
|
||
|
|
||
|
Reads GNSS-SDR observables raw dump binary file using the provided function
|
||
|
and plots some internal variables
|
||
|
|
||
|
Irene Pérez Riega, 2023. iperrie@inta.es
|
||
|
|
||
|
Modifiable in the file:
|
||
|
sampling_freq - Sampling frequency [Hz]
|
||
|
channels - Number of channels to check if they exist
|
||
|
path - Path to folder which contains raw file
|
||
|
fig_path - Path where plots will be save
|
||
|
observables_log_path - Completed path to observables raw data file
|
||
|
|
||
|
-----------------------------------------------------------------------------
|
||
|
|
||
|
GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
|
||
|
This file is part of GNSS-SDR.
|
||
|
|
||
|
Copyright (C) 2022 (see AUTHORS file for a list of contributors)
|
||
|
SPDX-License-Identifier: GPL-3.0-or-later
|
||
|
|
||
|
-----------------------------------------------------------------------------
|
||
|
"""
|
||
|
|
||
|
import numpy as np
|
||
|
import matplotlib.pyplot as plt
|
||
|
from lib.read_hybrid_observables_dump import read_hybrid_observables_dump
|
||
|
import os
|
||
|
|
||
|
observables = {}
|
||
|
double_size_bytes = 8
|
||
|
bytes_shift = 0
|
||
|
|
||
|
# ---------- CHANGE HERE:
|
||
|
samplingFreq = 2000000
|
||
|
channels = 5
|
||
|
path = '/home/labnav/Desktop/TEST_IRENE/'
|
||
|
fig_path = '/home/labnav/Desktop/TEST_IRENE/PLOTS/HybridObservables/'
|
||
|
observables_log_path = path + 'observables.dat'
|
||
|
|
||
|
if not os.path.exists(fig_path):
|
||
|
os.makedirs(fig_path)
|
||
|
|
||
|
GNSS_observables = read_hybrid_observables_dump(channels,observables_log_path)
|
||
|
|
||
|
# Plot data
|
||
|
# --- optional: plot since it detect the first satellite connected
|
||
|
min_tow_idx = 1
|
||
|
obs_idx = 1
|
||
|
|
||
|
for n in range(0, channels):
|
||
|
|
||
|
idx = np.where(np.array(GNSS_observables['valid'][n])>0)[0][0]
|
||
|
# Find the index from the first satellite connected
|
||
|
if n == 0:
|
||
|
min_tow_idx = idx
|
||
|
if min_tow_idx > idx:
|
||
|
min_tow_idx = idx
|
||
|
obs_idx = n
|
||
|
|
||
|
# Plot observables from that index
|
||
|
# First plot
|
||
|
plt.figure()
|
||
|
plt.title('Pseudorange')
|
||
|
for i in range(channels):
|
||
|
plt.scatter(GNSS_observables['RX_time'][i][min_tow_idx:],
|
||
|
GNSS_observables['Pseudorange_m'][i][min_tow_idx:],s=1,
|
||
|
label=f'Channel {i}')
|
||
|
plt.xlim(GNSS_observables['RX_time'][obs_idx][min_tow_idx]-100,
|
||
|
GNSS_observables['RX_time'][obs_idx][-1]+100)
|
||
|
plt.grid(True)
|
||
|
plt.xlabel('TOW [s]')
|
||
|
plt.ylabel('Pseudorange [m]')
|
||
|
plt.legend()
|
||
|
plt.gcf().canvas.manager.set_window_title('Pseudorange.png')
|
||
|
plt.tight_layout()
|
||
|
plt.savefig(os.path.join(fig_path, 'Pseudorange.png'))
|
||
|
plt.show()
|
||
|
|
||
|
# Second plot
|
||
|
plt.figure()
|
||
|
plt.title('Carrier Phase')
|
||
|
for i in range(channels):
|
||
|
plt.scatter(GNSS_observables['RX_time'][i][min_tow_idx:],
|
||
|
GNSS_observables['Carrier_phase_hz'][i][min_tow_idx:],s=1,
|
||
|
label=f'Channel {i}')
|
||
|
plt.xlim(GNSS_observables['RX_time'][obs_idx][min_tow_idx]-100,
|
||
|
GNSS_observables['RX_time'][obs_idx][-1]+100)
|
||
|
plt.xlabel('TOW [s]')
|
||
|
plt.ylabel('Accumulated Carrier Phase [cycles]')
|
||
|
plt.grid(True)
|
||
|
plt.legend()
|
||
|
plt.gcf().canvas.manager.set_window_title('AccumulatedCarrierPhase.png')
|
||
|
plt.tight_layout()
|
||
|
plt.savefig(os.path.join(fig_path, 'AccumulatedCarrierPhase.png'))
|
||
|
plt.show()
|
||
|
|
||
|
# Third plot
|
||
|
plt.figure()
|
||
|
plt.title('Doppler Effect')
|
||
|
for i in range(channels):
|
||
|
plt.scatter(GNSS_observables['RX_time'][i][min_tow_idx:],
|
||
|
GNSS_observables['Carrier_Doppler_hz'][i][min_tow_idx:],s=1,
|
||
|
label=f'Channel {i}')
|
||
|
plt.xlim(GNSS_observables['RX_time'][obs_idx][min_tow_idx]-100,
|
||
|
GNSS_observables['RX_time'][obs_idx][-1]+100)
|
||
|
plt.xlabel('TOW [s]')
|
||
|
plt.ylabel('Doppler Frequency [Hz]')
|
||
|
plt.grid(True)
|
||
|
plt.legend()
|
||
|
plt.gcf().canvas.manager.set_window_title('DopplerFrequency.png')
|
||
|
plt.tight_layout()
|
||
|
plt.savefig(os.path.join(fig_path, 'DopplerFrequency.png'))
|
||
|
plt.show()
|
||
|
|
||
|
# Fourth plot
|
||
|
plt.figure()
|
||
|
plt.title('GNSS Channels captured')
|
||
|
for i in range(channels):
|
||
|
lab = 0
|
||
|
a = 0
|
||
|
while lab == 0:
|
||
|
lab = int(GNSS_observables["PRN"][i][min_tow_idx+a])
|
||
|
a += 1
|
||
|
plt.scatter(GNSS_observables['RX_time'][i][min_tow_idx:],
|
||
|
GNSS_observables['PRN'][i][min_tow_idx:], s=1,
|
||
|
label=f'PRN {i} = {lab}')
|
||
|
plt.xlim(GNSS_observables['RX_time'][obs_idx][min_tow_idx]-100,
|
||
|
GNSS_observables['RX_time'][obs_idx][-1]+100)
|
||
|
plt.xlabel('TOW [s]')
|
||
|
plt.ylabel('PRN')
|
||
|
plt.grid(True)
|
||
|
plt.legend()
|
||
|
plt.gcf().canvas.manager.set_window_title('PRNs.png')
|
||
|
plt.tight_layout()
|
||
|
plt.savefig(os.path.join(fig_path, 'PRNs.png'))
|
||
|
plt.show()
|