Panoramica sulla simulazione GNSS
La simulazione del sistema globale di navigazione satellitare (GNSS) genera stime della posizione del ricevitore. Queste stime della posizione del ricevitore provengono dai modelli di sensori GPS e GNSS come oggetti gpsSensor
e gnssSensor
. Monitorare lo stato della stima della posizione in gnssSensor
utilizzando la diluizione degli output di precisione e confrontare il numero di satelliti disponibili.
Parametri di simulazione
Specificare i parametri da utilizzare nella simulazione GNSS:
Frequenza di campionamento del ricevitore GNSS
Sistema di riferimento per la navigazione locale
Posizione sulla Terra in coordinate di latitudine, longitudine e altitudine (LLA)
Numero di campioni da simulare
Fs = 1;
refFrame = "NED";
lla0 = [42.2825 -71.343 53.0352];
N = 100;
Creare una traiettoria per un sensore stazionario.
pos = zeros(N, 3); vel = zeros(N, 3); time = (0:N-1) ./ Fs;
Creazione del modello del sensore
Creare gli oggetti di simulazione GNSS, gpsSensor
e gnssSensor
, utilizzando gli stessi parametri iniziali per ciascuno.
gps = gpsSensor("SampleRate", Fs, "ReferenceLocation", lla0, ... "ReferenceFrame", refFrame); gnss = gnssSensor("SampleRate", Fs, "ReferenceLocation", lla0, ... "ReferenceFrame", refFrame);
Simulazione con gpsSensor
Generare output da un ricevitore stazionario utilizzando il sensore GPS. Visualizza la posizione in coordinate LLA e la velocità in ciascuna direzione.
% Generate outputs. [llaGPS, velGPS] = gps(pos, vel); % Visualize position. figure subplot(3, 1, 1) plot(time, llaGPS(:,1)) title('Latitude') ylabel('degrees') xlabel('s') subplot(3, 1, 2) plot(time, llaGPS(:,2)) title('Longitude') ylabel('degrees') xlabel('s') subplot(3, 1, 3) plot(time, llaGPS(:,3)) title('Altitude') ylabel('m') xlabel('s')
% Visualize velocity. figure plot(time, velGPS) title('Velocity') legend('X', 'Y', 'Z') ylabel('m/s') xlabel('s')
Simulazione con gnssSensor
Generare output da un ricevitore stazionario utilizzando il sensore GNSS. Visualizza la posizione e la velocità e nota le differenze nella simulazione.
% Generate outputs. [llaGNSS, velGNSS] = gnss(pos, vel); % Visualize positon. figure subplot(3, 1, 1) plot(time, llaGNSS(:,1)) title('Latitude') ylabel('degrees') xlabel('s') subplot(3, 1, 2) plot(time, llaGNSS(:,2)) title('Longitude') ylabel('degrees') xlabel('s') subplot(3, 1, 3) plot(time, llaGNSS(:,3)) title('Altitude') ylabel('m') xlabel('s')
% Visualize velocity. figure plot(time, velGNSS) title('Velocity') legend('X', 'Y', 'Z') ylabel('m/s') xlabel('s')
Diluizione della precisione
L'oggetto gnssSensor
ha una simulazione più fedele rispetto a gpsSensor
. Ad esempio, l'oggetto gnssSensor
utilizza posizioni satellitari simulate per stimare la posizione del ricevitore. Ciò significa che la diluizione orizzontale della precisione (HDOP) e la diluizione verticale della precisione (VDOP) possono essere riportate insieme alla stima della posizione. Questi valori indicano il grado di precisione della stima della posizione in base alla geometria del satellite. Valori più piccoli indicano una stima più precisa.
% Set the RNG seed to reproduce results. rng('default') % Specify the start time of the simulation. initTime = datetime(2020, 4, 20, 18, 10, 0, "TimeZone", "America/New_York"); % Create the GNSS receiver model. gnss = gnssSensor("SampleRate", Fs, "ReferenceLocation", lla0, ... "ReferenceFrame", refFrame, "InitialTime", initTime); % Obtain the receiver status. [~, ~, status] = gnss(pos, vel); disp(status(1))
SatelliteAzimuth: [7x1 double] SatelliteElevation: [7x1 double] HDOP: 1.1290 VDOP: 1.9035
Visualizzare l'HDOP durante la simulazione. Si verifica una diminuzione dell'HDOP. Ciò significa che la geometria del satellite è cambiata.
hdops = vertcat(status.HDOP); figure plot(time, vertcat(status.HDOP)) title('HDOP') ylabel('m') xlabel('s')
Verificare che la geometria del satellite sia cambiata. Trova l'indice in cui l'HDOP è diminuito e verifica se ciò corrisponde a una variazione nel numero di satelliti in vista. La variabile numSats
aumenta da 7 a 8.
% Find expected sample index for a change in the % number of satellites in view. [~, satChangeIdx] = max(abs(diff(hdops))); % Visualize the satellite geometry before the % change in HDOP. satAz = status(satChangeIdx).SatelliteAzimuth; satEl = status(satChangeIdx).SatelliteElevation; numSats = numel(satAz); skyplot(satAz, satEl); title(sprintf('Satellites in View: %d\nHDOP: %.4f', ... numSats, hdops(satChangeIdx)))
% Visualize the satellite geometry after the % change in HDOP. satAz = status(satChangeIdx+1).SatelliteAzimuth; satEl = status(satChangeIdx+1).SatelliteElevation; numSats = numel(satAz); skyplot(satAz, satEl); title(sprintf('Satellites in View: %d\nHDOP: %.4f', ... numSats, hdops(satChangeIdx+1)))
I valori HDOP e VDOP possono essere utilizzati come elementi diagonali nelle matrici di covarianza delle misurazioni quando si combinano le stime della posizione del ricevitore GNSS con altre misurazioni del sensore utilizzando un filtro di Kalman.
% Convert HDOP and VDOP to a measurement covariance matrix.
hdop = status(1).HDOP;
vdop = status(1).VDOP;
measCov = diag([hdop.^2/2, hdop.^2/2, vdop.^2]);
disp(measCov)
0.6373 0 0 0 0.6373 0 0 0 3.6233