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.

isStateValid

Comprobar si el estado es válido

Desde R2019b

Descripción

ejemplo

isValid = isStateValid(validator,states) comprueba si un conjunto de estados determinados son válidos.

Ejemplos

contraer todo

Este ejemplo muestra cómo validar rutas a través de un entorno.

Cargar mapas de ejemplo. Utilice el mapa simple para crear un mapa de ocupación binario.

load exampleMaps.mat
map = occupancyMap(simpleMap);
show(map)

Figure contains an axes object. The axes object with title Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains an object of type image.

Especifique una ruta aproximada a través del mapa.

path = [2 2 pi/2; 10 15 0; 17 8 -pi/2];
hold on
plot(path(:,1),path(:,2),"--o")

Figure contains an axes object. The axes object with title Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 2 objects of type image, line.

Cree un validador de estado utilizando la definición stateSpaceSE2 . Especifique el mapa y la distancia para interpolar y validar segmentos de ruta.

validator = validatorOccupancyMap(stateSpaceSE2);
validator.Map = map;
validator.ValidationDistance = 0.1;

Compruebe que los puntos de la ruta sean estados válidos. Los tres puntos están en el espacio libre, por lo que se consideran válidos.

isValid = isStateValid(validator,path)
isValid = 3x1 logical array

   1
   1
   1

Verifique el movimiento entre cada estado de ruta secuencial. La función isMotionValid interpola a lo largo de la ruta entre estados. Si un segmento de ruta no es válido, trace el último punto válido a lo largo de la ruta.

startStates = [path(1,:);path(2,:)];
endStates = [path(2,:);path(3,:)];
    for i = 1:2
        [isPathValid, lastValid] = isMotionValid(validator,startStates(i,:),endStates(i,:));
        if ~isPathValid
            plot(lastValid(1),lastValid(2),'or')
        end
    end
hold off

Figure contains an axes object. The axes object with title Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 3 objects of type image, line. One or more of the lines displays its values using only markers

Este ejemplo muestra cómo validar rutas a través de un entorno.

Cargar mapas de ejemplo. Utilice el mapa simple para crear un mapa de costes de vehículos. Especifique un radio de inflación de 1 metro.

load exampleMaps.mat
map = vehicleCostmap(double(simpleMap));
map.CollisionChecker = inflationCollisionChecker("InflationRadius",1);
plot(map)

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 2 objects of type image, patch. This object represents Inflated Areas.

Especifique una ruta aproximada a través del mapa.

path = [3 3 pi/2; 8 15 0; 17 8 -pi/2];
hold on
plot(path(:,1),path(:,2),"--o")

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 3 objects of type image, patch, line. This object represents Inflated Areas.

Cree un validador de estado utilizando la definición stateSpaceSE2 . Especifique el mapa y la distancia para interpolar y validar segmentos de ruta.

validator = validatorVehicleCostmap(stateSpaceSE2);
validator.Map = map;
validator.ValidationDistance = 0.1;

Compruebe que los puntos de la ruta sean estados válidos. Los tres puntos están en el espacio libre, por lo que se consideran válidos.

isValid = isStateValid(validator,path)
isValid = 3x1 logical array

   1
   1
   1

Verifique el movimiento entre cada estado de ruta secuencial. La función isMotionValid interpola a lo largo de la ruta entre estados. Si un segmento de ruta no es válido, trace el último punto válido a lo largo de la ruta.

startStates = [path(1,:);path(2,:)];
endStates = [path(2,:);path(3,:)];
    for i = 1:2
        [isPathValid, lastValid] = isMotionValid(validator,startStates(i,:),endStates(i,:));
        if ~isPathValid
            plot(lastValid(1),lastValid(2),'or')
        end
    end
hold off

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 4 objects of type image, patch, line. One or more of the lines displays its values using only markers This object represents Inflated Areas.

Cree un mapa de ocupación tridimensional y un validador de estado asociado. Planifique, valide y visualice una ruta a través del mapa de ocupación.

Cargar y asignar mapa al validador de estado

Cargue un mapa de ocupación tridimensional de una manzana de la ciudad en el espacio de trabajo. Especifique un umbral para qué celdas se considerarán libres de obstáculos.

mapData = load('dMapCityBlock.mat');
omap = mapData.omap;
omap.FreeThreshold = 0.5;

Infle el mapa de ocupación para agregar una zona de amortiguamiento para una operación segura alrededor de los obstáculos.

inflate(omap,1)

Cree un objeto de espacio de estados SE(3) con límites para las variables de estado.

ss = stateSpaceSE3([-20 220;
    -20 220;
    -10 100;
    inf inf;
    inf inf;
    inf inf;
    inf inf]);

Cree un validador de estado de mapa de ocupación 3D utilizando el espacio de estado creado.

sv = validatorOccupancyMap3D(ss);

Asigne el mapa de ocupación al objeto validador de estado. Especifique el intervalo de distancia de muestreo.

sv.Map = omap;
sv.ValidationDistance = 0.1;

Planificar y visualizar la ruta

Cree un planificador de rutas con una distancia máxima de conexión aumentada. Reducir el número máximo de iteraciones.

planner = plannerRRT(ss,sv);
planner.MaxConnectionDistance = 50;
planner.MaxIterations = 1000;

Cree una función de evaluación definida por el usuario para determinar si la ruta alcanza la meta. Especifique la probabilidad de elegir el estado objetivo durante el muestreo.

planner.GoalReachedFcn = @(~,x,y)(norm(x(1:3)-y(1:3))<5);
planner.GoalBias = 0.1;

Establezca los estados de inicio y objetivo.

start = [40 180 25 0.7 0.2 0 0.1];
goal = [150 33 35 0.3 0 0.1 0.6];

Planifique una ruta utilizando el inicio, el objetivo y el planificador especificados.

[pthObj,solnInfo] = plan(planner,start,goal);

Compruebe que los puntos de la ruta sean estados válidos.

isValid = isStateValid(sv,pthObj.States)
isValid = 7x1 logical array

   1
   1
   1
   1
   1
   1
   1

Compruebe que el movimiento entre cada estado de ruta secuencial sea válido.

isPathValid = zeros(size(pthObj.States,1)-1,1,'logical');
for i = 1:size(pthObj.States,1)-1
    [isPathValid(i),~] = isMotionValid(sv,pthObj.States(i,:),...
        pthObj.States(i+1,:));
end
isPathValid
isPathValid = 6x1 logical array

   1
   1
   1
   1
   1
   1

Visualiza los resultados.

show(omap)
hold on
scatter3(start(1,1),start(1,2),start(1,3),'g','filled') % draw start state
scatter3(goal(1,1),goal(1,2),goal(1,3),'r','filled')    % draw goal state
plot3(pthObj.States(:,1),pthObj.States(:,2),pthObj.States(:,3),...
    'r-','LineWidth',2) % draw path

Figure contains an axes object. The axes object with title Occupancy Map, xlabel X [meters], ylabel Y [meters] contains 4 objects of type patch, scatter, line.

Argumentos de entrada

contraer todo

Objeto validador de estado, especificado como un objeto de subclase de nav.StateValidator. Estos son los objetos del validador de estado predefinidos:

Posiciones estatales, especificadas como un vector fila de elementos n o una matriz m-por- n . n es la dimensión del espacio de estados especificado en validator. m es el número de estados a validar.

Tipos de datos: single | double

Argumentos de salida

contraer todo

Estados válidos, devueltos como un vector columna lógica de elemento m .

Tipos de datos: logical

Historial de versiones

Introducido en R2019b