mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-11-15 06:14:58 +00:00
209 lines
6.8 KiB
Python
209 lines
6.8 KiB
Python
|
"""
|
||
|
plotPosition.py
|
||
|
|
||
|
plot_position(navSolutions)
|
||
|
Graph Latitude-Longitude and X-Y-X as a function of Transmit Time
|
||
|
Args:
|
||
|
navSolutions - A dictionary with the processed information in lists
|
||
|
|
||
|
plot_oneVStime(navSolutions, name)
|
||
|
Graph of a variable as a function of transmission time
|
||
|
Args:
|
||
|
navSolutions - A dictionary with the processed information in lists
|
||
|
name - navSolutions variable name that we want to plot
|
||
|
|
||
|
calcularCEFP(percentil, navSolutions, m_lat, m_long)
|
||
|
Calculate CEFP radio [m] for n percentil.
|
||
|
Args:
|
||
|
percentil - Number of measures that will be inside the circumference
|
||
|
navSolutions - A dictionary with the processed information in lists
|
||
|
m_lat - Mean latitude measures [º]
|
||
|
m_long - Mean longitude measures [º]
|
||
|
|
||
|
Modifiable in the file:
|
||
|
fig_path - Path where plots will be save
|
||
|
fig_path_maps - Path where the maps will be save
|
||
|
filename_map - Path where map will be save
|
||
|
filename_map_t - Path where terrain map will be save
|
||
|
|
||
|
Irene Pérez Riega, 2023. iperrie@inta.es
|
||
|
|
||
|
-----------------------------------------------------------------------------
|
||
|
|
||
|
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 math
|
||
|
import os.path
|
||
|
import webbrowser
|
||
|
import numpy as np
|
||
|
import matplotlib.pyplot as plt
|
||
|
import folium
|
||
|
|
||
|
|
||
|
def plot_position(navSolutions):
|
||
|
|
||
|
# ---------- CHANGE HERE:
|
||
|
fig_path = '/home/labnav/Desktop/TEST_IRENE/PLOTS/PlotPosition/'
|
||
|
fig_path_maps = fig_path + 'maps/'
|
||
|
filename_map = 'mapPlotPosition.html'
|
||
|
filename_map_t = 'mapTerrainPotPosition.html'
|
||
|
|
||
|
if not os.path.exists(fig_path_maps):
|
||
|
os.mkdir(fig_path_maps)
|
||
|
|
||
|
# Statics Positions:
|
||
|
m_lat = sum(navSolutions['latitude']) / len(navSolutions['latitude'])
|
||
|
m_long = sum(navSolutions['longitude']) / len(navSolutions['longitude'])
|
||
|
|
||
|
# CEFP_n -> Include the n% of the dots in the circle
|
||
|
r_CEFP_95 = calcularCEFP(95, navSolutions, m_lat, m_long)
|
||
|
r_CEFP_50 = calcularCEFP(50, navSolutions, m_lat, m_long)
|
||
|
|
||
|
# Generate and save html with the positions
|
||
|
m = folium.Map(location=[navSolutions['latitude'][0],
|
||
|
navSolutions['longitude'][0]], zoom_start=100)
|
||
|
c_CEFP95 = folium.Circle(location=[m_lat, m_long],
|
||
|
radius=r_CEFP_95, color='green', fill=True,
|
||
|
fill_color='green', fill_opacity=0.5)
|
||
|
c_CEFP50 = folium.Circle(location=[m_lat, m_long], radius=r_CEFP_50,
|
||
|
color='red', fill=True, fill_color='red',
|
||
|
fill_opacity=0.5)
|
||
|
|
||
|
# POP-UPs
|
||
|
popup95 = folium.Popup("(Green)CEFP95 diameter: {} "
|
||
|
"metres".format(2 * r_CEFP_95))
|
||
|
popup95.add_to(c_CEFP95)
|
||
|
popup50 = folium.Popup("(Red)CEFP50 diameter: {} "
|
||
|
"metres".format(2 * r_CEFP_50))
|
||
|
popup50.add_to(c_CEFP50)
|
||
|
|
||
|
c_CEFP95.add_to(m)
|
||
|
c_CEFP50.add_to(m)
|
||
|
|
||
|
# Optional: Plot each point ->
|
||
|
"""
|
||
|
for i in range(len(navSolutions['latitude'])):
|
||
|
folium.Marker(location=[navSolutions['latitude'][i],
|
||
|
navSolutions['longitude'][i]],
|
||
|
icon=folium.Icon(color='red')).add_to(m)
|
||
|
"""
|
||
|
|
||
|
m.save(fig_path_maps + filename_map)
|
||
|
webbrowser.open(fig_path_maps + filename_map)
|
||
|
|
||
|
# Optional: with terrain ->
|
||
|
"""
|
||
|
n = folium.Map(location=[navSolutions['latitude'][0],
|
||
|
navSolutions['longitude'][0]], zoom_start=100,
|
||
|
tiles='Stamen Terrain')
|
||
|
c_CEFP95.add_to(n)
|
||
|
c_CEFP50.add_to(n)
|
||
|
n.save(fig_path_maps + filename_map_t)
|
||
|
webbrowser.open(fig_path_maps + filename_map_t)
|
||
|
"""
|
||
|
|
||
|
# Plot ->
|
||
|
time = []
|
||
|
for i in range(len(navSolutions['TransmitTime'])):
|
||
|
time.append(round(navSolutions['TransmitTime'][i] -
|
||
|
min(navSolutions['TransmitTime']), 3))
|
||
|
|
||
|
plt.figure(figsize=(1920 / 120, 1080 / 120))
|
||
|
plt.clf()
|
||
|
plt.suptitle(f'Plot file PVT process data results')
|
||
|
|
||
|
# Latitude and Longitude
|
||
|
plt.subplot(1, 2, 1)
|
||
|
scatter = plt.scatter(navSolutions['latitude'], navSolutions['longitude'],
|
||
|
c=time, marker='.')
|
||
|
plt.grid()
|
||
|
plt.ticklabel_format(style='plain', axis='both', useOffset=False)
|
||
|
plt.title('Positions latitud-longitud')
|
||
|
plt.xlabel('Latitude º')
|
||
|
plt.ylabel('Longitude º')
|
||
|
plt.axis('tight')
|
||
|
|
||
|
# Colors
|
||
|
cmap = plt.get_cmap('viridis')
|
||
|
norm = plt.Normalize(vmin=min(time), vmax=max(time))
|
||
|
scatter.set_cmap(cmap)
|
||
|
scatter.set_norm(norm)
|
||
|
colors = plt.colorbar(scatter)
|
||
|
colors.set_label('TransmitTime [s]')
|
||
|
|
||
|
# X, Y, Z
|
||
|
ax = plt.subplot(1, 2, 2, projection='3d')
|
||
|
plt.ticklabel_format(style='plain', axis='both', useOffset=False)
|
||
|
ax.scatter(navSolutions['X'], navSolutions['Y'], navSolutions['Z'],
|
||
|
c=time, marker='.')
|
||
|
ax.set_xlabel('Eje X [m]')
|
||
|
ax.set_ylabel('Eje Y [m]')
|
||
|
ax.set_zlabel('Eje Z [m]')
|
||
|
ax.set_title('Positions x-y-z')
|
||
|
|
||
|
plt.tight_layout()
|
||
|
plt.savefig(os.path.join(fig_path, f'PVT_ProcessDataResults.png'))
|
||
|
plt.show()
|
||
|
|
||
|
|
||
|
def plot_oneVStime(navSolutions, name):
|
||
|
|
||
|
# ---------- CHANGE HERE:
|
||
|
fig_path = '/home/labnav/Desktop/TEST_IRENE/PLOTS/PlotPosition/'
|
||
|
if not os.path.exists(fig_path):
|
||
|
os.mkdir(fig_path)
|
||
|
|
||
|
time = []
|
||
|
for i in range(len(navSolutions['TransmitTime'])):
|
||
|
time.append(round(navSolutions['TransmitTime'][i] -
|
||
|
min(navSolutions['TransmitTime']), 3))
|
||
|
|
||
|
plt.clf()
|
||
|
plt.scatter(time, navSolutions[name], marker='.')
|
||
|
plt.grid()
|
||
|
plt.title(f'{name} vs Time')
|
||
|
plt.xlabel('Time [s]')
|
||
|
plt.ylabel(name)
|
||
|
plt.axis('tight')
|
||
|
plt.ticklabel_format(style='plain', axis='both', useOffset=False)
|
||
|
|
||
|
plt.tight_layout()
|
||
|
plt.savefig(os.path.join(fig_path, f'{name}VSTime.png'))
|
||
|
plt.show()
|
||
|
|
||
|
def calcularCEFP(percentil, navSolutions, m_lat, m_long):
|
||
|
|
||
|
r_earth = 6371000
|
||
|
lat = []
|
||
|
long = []
|
||
|
dlat = []
|
||
|
dlong = []
|
||
|
dist = []
|
||
|
|
||
|
m_lat = math.radians(m_lat)
|
||
|
m_long = math.radians(m_long)
|
||
|
|
||
|
for i in range(len(navSolutions['latitude'])):
|
||
|
lat.append(math.radians(navSolutions['latitude'][i]))
|
||
|
long.append(math.radians(navSolutions['longitude'][i]))
|
||
|
|
||
|
for i in range(len(lat)):
|
||
|
dlat.append(m_lat - lat[i])
|
||
|
dlong.append(m_long - long[i])
|
||
|
# Haversine:
|
||
|
a = (math.sin(dlat[i] / 2) ** 2 +
|
||
|
math.cos(lat[i]) * math.cos(m_lat) * math.sin(dlong[i] / 2) ** 2)
|
||
|
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
|
||
|
dist.append(r_earth * c)
|
||
|
|
||
|
# Radio CEFP
|
||
|
radio_CEFP_p = np.percentile(dist, percentil)
|
||
|
return radio_CEFP_p
|