Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

Simule los efectos de trayectorias múltiples de GNSS en vuelos de VANT no tripulados en entornos urbanos

Este ejemplo muestra cómo simular el ruido del sistema global de navegación por satélite (GNSS), como el ruido del receptor del Sistema de Posicionamiento Global (GPS) debido a obstrucciones locales en el entorno del receptor.

Un receptor GNSS estima su posición actual a partir de las señales que obtiene de los satélites a la vista. Cuando un receptor se encuentra en una ubicación con muchas obstrucciones locales, puede sufrir trayectorias múltiples. Multipath se produce cuando las señales de un satélite llegan a dos o más rutas. Como máximo, una de estas rutas es una línea de visión directa (LOS) desde el satélite al receptor. Las rutas indirectas restantes son reflejos de las obstrucciones locales.

Cada señal de satélite contiene una marca de tiempo de transmisión que puede usar con el reloj del receptor para calcular el pseudodistancia entre el satélite y el receptor. Una señal de satélite que llega por una ruta indirecta da como resultado un pseudoalcance incorrecto que es mayor que el pseudoalcance de una ruta directa. La pseudodistancia incorrecta degrada la precisión de la posición estimada del receptor.

Esta imagen muestra un VANT volando sobre una calle en un escenario de VANT en la ciudad de Nueva York, con edificios altos a ambos lados de la calle. Mientras el VANT vuela, puede ver un skyplot a la derecha que muestra los satélites a la vista del receptor.

testAnimated.gif

Cree un escenario de VANT con edificios y terreno

El escenario de este ejemplo contiene un entorno urbano con edificios altos, centrado en la ciudad de Nueva York.

Cree un escenario de VANT con la ubicación de referencia establecida en la ciudad de Nueva York y luego agregue una malla de terreno utilizando el modelo de terreno GMTED2010 del Servicio Geológico de los Estados Unidos (USGS) y la Agencia Nacional de Inteligencia Geoespacial (NGA). Debe tener una conexión a Internet activa para acceder a estos datos del terreno.

referenceLocation = [40.707088 -74.012146 0];
stopTime = 100;
scene = uavScenario(ReferenceLocation=referenceLocation,UpdateRate=10,StopTime=stopTime);
xTerrainLimits = [-200 200];
yTerrainLimits = [-200 200];

color = [0.6 0.6 0.6];
addMesh(scene,"terrain",{"gmted2010" xTerrainLimits yTerrainLimits},color)

Agregue mallas de construcción desde un archivo OSM de la ciudad de Nueva York, manhattan.osm. El archivo OSM se descargó de https://www.openstreetmap.org, que proporciona acceso a datos de mapas de todo el mundo. Los datos están bajo la licencia Open Data Commons Open Database License (ODbL), https://opendatacommons.org/licenses/odbl/.

xBuildingLimits = [-150 150];
yBuildingLimits = [-150 150];
color = [0.6431 0.8706 0.6275];

addMesh(scene,"buildings",{"manhattan.osm" xBuildingLimits yBuildingLimits,"auto"},color)

Cree una plataforma VANT que vuele entre los edificios y agregue un generador de mediciones GNSS a la plataforma VANT .

uavTrajectory = waypointTrajectory([-100 -150 140; 60 120 140],TimeOfArrival=[0 stopTime],ReferenceFrame="ENU");

plat = uavPlatform("UAV",scene,Trajectory=uavTrajectory,ReferenceFrame="ENU");
updateMesh(plat,"quadrotor",{1},[1 0 0],eye(4));

gnss = uavSensor("GNSS",plat,gnssMeasurementGenerator(ReferenceLocation=referenceLocation));

Visualice el escenario y la trayectoria del VANT .

fig = figure;
ax = show3D(scene);
uavPosition = uavTrajectory.lookupPose(linspace(0,stopTime,100));
hold on
uavTrajectoryLine = plot3(uavPosition(:,1),uavPosition(:,2),uavPosition(:,3),"--",LineWidth=1.5,Color="cyan");
legend(uavTrajectoryLine,"Trajectory",Location="northeast")

% Update axis plot settings for better readability.
helperUpdateScenarioView(ax)

Ejecutar escenario y visualizar rutas múltiples

Configure un gráfico de arriba hacia abajo y un gráfico del cielo para visualizar el escenario utilizando show3D (UAV Toolbox) y skyplot, respectivamente.

El gráfico de arriba hacia abajo representa la plataforma del VANT como un punto azul y muestra las obstrucciones locales que interfieren con las señales del satélite GPS.

El gráfico del cielo muestra todos los satélites GPS que se encuentran actualmente a la vista de la plataforma VANT . Cada satélite se encuentra en una de estas categorías, dependiendo de su visibilidad desde la plataforma VANT :

  • Bloqueado: el receptor GPS no detecta ninguna señal del satélite.

  • Ruta múltiple: el receptor GPS detecta señales del satélite, pero con uno o más reflejos.

  • Visible: el receptor GPS detecta una señal y tiene línea de visión directa (LOS) con el satélite.

Tenga en cuenta que el receptor actualmente puede detectar múltiples señales del mismo satélite.

Cambie el tamaño de la figura para que se ajuste a ambos gráficos.

clf(fig,"reset")
set(fig,Position=[400 458 1120 420])

Cree un panel de interfaz de usuario en el lado izquierdo de la figura y cree ejes para un gráfico de vista superior. Trazar un marcador para visualizar la posición del VANT durante la simulación.

hScenePlot = uipanel(fig,Position=[0 0 0.5 1]);
ax = axes(hScenePlot);
[~, pltFrames] = show3D(scene,Parent=ax);
hold(ax,"on")
uavMarker = plot(pltFrames.UAV.BodyFrame,0,0,Marker="o",MarkerFaceColor="cyan");
uavTrajectoryLine = plot3(uavPosition(:,1),uavPosition(:,2),uavPosition(:,3),"--",LineWidth=1.5,Color="cyan");
legend(ax,[uavMarker uavTrajectoryLine],["UAV","Trajectory"],Location="northeast")
view(ax,[0 90])
axis(ax,"equal")
hold(ax,"off")

Cree un panel de interfaz de usuario en el lado derecho de la figura y cree ejes para un gráfico del cielo para mostrar la visibilidad del satélite. Agregue un diagrama de cielo vacío al panel. Establezca el orden de los colores en gris, rojo y verde, que representan los estados de los satélites bloqueados, de rutas múltiples y visibles, respectivamente.

hSkyPlot = uipanel(fig,Position=[0.5 0 0.5 1]);
sp = skyplot(NaN,NaN,Parent=hSkyPlot);
title("GPS Satellites with LOS and Multipath Reception")
legend(sp)
colors = colororder(sp);
colororder(sp,[0.6*[1 1 1]; colors(7,:); colors(5,:)])

Configure y ejecute el escenario del VANT . En cada paso del escenario:

  1. Lea los pseudodistancias de los satélites.

  2. Obtenga los acimutes y elevaciones de los satélites a partir de las posiciones de los satélites.

  3. Clasifique los satélites según su estado (Blocked, Multipath o Visible).

  4. Configure diferentes tamaños de marcadores para poder ver múltiples mediciones del mismo satélite.

  5. Actualiza el gráfico del cielo.

currTime = gnss.SensorModel.InitialTime;
setup(scene)
while scene.IsRunning
    % Read the satellite pseudoranges.
    [~,~,p,satPos,status] = gnss.read();
    allSatPos = gnssconstellation(currTime);
    currTime = currTime + seconds(1/scene.UpdateRate);
    
    % Get the satellite azimuths and elevations from satellite positions.
    [~,trueRecPos] = plat.read;
    [az,el] = lookangles(trueRecPos,satPos,gnss.SensorModel.MaskAngle);
    [allAz,allEl,vis] = lookangles(trueRecPos,allSatPos,gnss.SensorModel.MaskAngle);
    allEl(allEl<0) = NaN;
    
    % Set categories of satellites based on the status (Blocked, Multipath, or Visible).
    groups = categorical([-ones(size(allAz)); status.LOS],[-1 0 1],["Blocked","Multipath","Visible"]); 
    
    % Set different marker sizes so that you can see the multiple measurements from the same satellite. 
    markerSizes = 100*ones(size(groups));
    markerSizes(groups=="Multipath") = 150;
    
    % Update the sky plot.
    set(sp,AzimuthData=[allAz; az],ElevationData=[allEl; el],GroupData=groups,MarkerSizeData=markerSizes);
    show3D(scene,Parent=ax,FastUpdate=true);
    drawnow

    % Advance the scene simulation time and update all sensor readings.
    advance(scene);
    updateSensors(scene)

end

Conclusión

Este ejemplo le ha mostrado cómo generar mediciones GNSS sin procesar afectadas por el ruido de trayectorias múltiples proveniente de obstrucciones locales. Puede utilizar estas mediciones para estimar la posición del receptor GPS o combinarlas con lecturas de otros sensores, como una unidad de medición inercial (IMU), para mejorar la estimación de la posición. Para obtener más información, consulte las Estimación de la pose del vehículo terrestre para IMU y GNSS estrechamente acoplados.

Determinar si una medición GNSS sin procesar contiene ruido de trayectorias múltiples puede resultar difícil, pero se pueden utilizar técnicas de detección como el filtrado innovador, también conocido como filtrado residual. Para obtener más información, consulte el ejemplo Detecte errores de lectura de GPS de rutas múltiples mediante filtrado residual en la fusión de sensores inerciales .

Funciones auxiliares

helperUpdateScenarioView actualiza las vistas del trazado del escenario para una mejor legibilidad.

function helperUpdateScenarioView(ax)
% Update the scenario view in axes handle AX.
meshes = findobj(ax,"type","patch");
for idx = 1:numel(meshes)
    meshes(idx).LineStyle = "none";
end
light(ax,"Position",[1 -5 6])
view(ax,[0 40])
end