Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Planificación de rutas en entornos de diferente complejidad

En este ejemplo se muestra cómo calcular una ruta libre de obstáculos entre dos ubicaciones en un mapa determinado mediante el planificador de rutas de hoja de ruta probabilística (PRM). El planificador de rutas PRM construye una hoja de ruta en el espacio libre de un mapa determinado utilizando nodos muestreados aleatoriamente en el espacio libre y conectándolos entre sí. Una vez construida la hoja de ruta, puede consultar una ruta de acceso desde una ubicación de inicio determinada a una ubicación final determinada en el mapa.

En este ejemplo, el mapa se representa como un mapa de cuadrícula de ocupación utilizando datos importados. Al muestrear nodos en el espacio libre de un mapa, PRM utiliza esta representación de cuadrícula de ocupación binaria para deducir el espacio libre. Además, PRM no tiene en cuenta la dimensión del robot mientras se calcula una ruta libre de obstáculos en un mapa. Por lo tanto, usted debe inflar el mapa por la dimensión del robot, con el fin de permitir el cálculo de un camino libre de obstáculos que da cuenta del tamaño del robot y asegura la evitación de colisiones para el robot real. Defina las ubicaciones de inicio y fin en el mapa para que el planificador de rutas PRM encuentre una ruta libre de obstáculos.

Importar mapas de ejemplo para planificar una ruta de acceso

load exampleMaps.mat

Los mapas importados son : , y .simpleMapcomplexMapternaryMap

whos *Map*
  Name              Size               Bytes  Class      Attributes    complexMap       41x52                2132  logical                 emptyMap         26x27                 702  logical                 simpleMap        26x27                 702  logical                 ternaryMap      501x501            2008008  double                

Utilice los datos importados y construya una representación de cuadrícula de ocupación utilizando el objeto.simpleMapbinaryOccupancyMap Establezca la resolución en 2 celdas por metro para este mapa.

map = binaryOccupancyMap(simpleMap,2);

Mostrar el mapa utilizando la función en el objetoshowbinaryOccupancyMap

show(map)

Definir dimensiones del robot e inflar el mapa

Para asegurarse de que el robot no colisione con ningún obstáculo, debe inflar el mapa por la dimensión del robot antes de suministrarlo al planificador de caminos PRM.

Aquí se puede suponer que la dimensión del robot es un círculo con un radio de 0,2 metros. A continuación, puede inflar el mapa mediante esta dimensión utilizando la función.inflate

robotRadius = 0.2;

Como se mencionó anteriormente, PRM no tiene en cuenta la dimensión del robot, y por lo tanto proporcionar un mapa inflado al PRM tiene en cuenta la dimensión del robot. Cree una copia del mapa antes de utilizar la función para conservar el mapa original.inflate

mapInflated = copy(map); inflate(mapInflated,robotRadius);

Mostrar mapa inflado

show(mapInflated)

Construir PRM y establecer parámetros

Ahora necesita definir un planificador de rutas. Cree un objeto y defina los atributos asociados.mobileRobotPRM

prm = mobileRobotPRM;

Asigne el mapa inflado al objeto PRM

prm.Map = mapInflated;

Defina el número de nodos PRM que se utilizarán durante la construcción de PRM. PRM construye una hoja de ruta utilizando un número determinado de nodos en el mapa dado. Basado en la dimensión y la complejidad del mapa de entrada, éste es uno de los atributos principales para ajustar con el fin de obtener una solución entre dos puntos en el mapa. Un gran número de nodos crean una hoja de ruta densa y aumentan la probabilidad de encontrar una ruta de acceso. Sin embargo, tener más nodos aumenta el tiempo de cálculo para crear la hoja de ruta y encontrar una solución.

prm.NumNodes = 50;

Defina la distancia máxima permitida entre dos nodos conectados en el mapa. PRM conecta todos los nodos separados por esta distancia (o menos) en el mapa. Este es otro atributo para sintonizar en el caso de mapas de entrada más grandes y/o complicados. Una gran distancia de conexión aumenta la conectividad entre nodos para encontrar una ruta de acceso más fácil, pero puede aumentar el tiempo de cálculo de la creación de la hoja de ruta.

prm.ConnectionDistance = 5;

Encuentre un camino factible en el PRM construido

Defina las ubicaciones inicial y final en el mapa para que el planificador de rutas las utilice.

startLocation = [2 1]; endLocation = [12 10];

Busque una ruta entre las ubicaciones inicial y final mediante la función.findpath La solución es un conjunto de waypoints desde la ubicación inicial hasta la ubicación final. Tenga en cuenta que el será diferente debido a la naturaleza probabilística del algoritmo PRM.path

path = findpath(prm, startLocation, endLocation)
path = 7×2

    2.0000    1.0000
    1.9569    1.0546
    1.8369    2.3856
    3.2389    6.6106
    7.8260    8.1330
   11.4632   10.5857
   12.0000   10.0000

Visualice la solución PRM.

show(prm)

Utilice PRM para un mapa grande y complicado

Utilice los datos importados, que representa un plano de planta grande y complicado, y construya una representación de cuadrícula de ocupación binaria con una resolución determinada (1 celda por metro)complexMap

map = binaryOccupancyMap(complexMap,1);

Mostrar el mapa.

show(map)

Inflar el mapa basado en la dimensión del robot

Copiar e inflar el mapa para tener en cuenta el tamaño del robot para evitar obstáculos

mapInflated = copy(map); inflate(mapInflated, robotRadius);

Mostrar mapa inflado.

show(mapInflated)

Asocie el objeto PRM existente con los parámetros New Map y Set

Actualice el objeto PRM con el mapa recién inflado y defina otros atributos.

prm.Map = mapInflated;

Establezca las propiedades y las propiedades.NumNodesConnectionDistance

prm.NumNodes = 20; prm.ConnectionDistance = 15;

Mostrar gráfico PRM.

show(prm)

Encuentre un camino factible en el PRM construido

Defina la ubicación de inicio y fin en el mapa para encontrar una ruta libre de obstáculos.

startLocation = [3 3]; endLocation = [45 35];

Busque una solución entre la ubicación inicial y la ubicación final. Para mapas complejos, es posible que no haya una ruta de acceso factible para un número determinado de nodos (devuelve una ruta vacía).

path = findpath(prm, startLocation, endLocation);

Puesto que está planeando una ruta de acceso en un mapa grande y complicado, puede ser necesario un mayor número de nodos. Sin embargo, a menudo no está claro cuántos nodos serán suficientes. Ajuste el número de nodos para asegurarse de que hay una ruta de acceso factible entre la ubicación inicial y final.

while isempty(path)     % No feasible path found yet, increase the number of nodes     prm.NumNodes = prm.NumNodes + 10;          % Use the |update| function to re-create the PRM roadmap with the changed     % attribute     update(prm);          % Search for a feasible path with the updated PRM     path = findpath(prm, startLocation, endLocation); end

Ruta de visualización.

path
path = 12×2

    3.0000    3.0000
    4.2287    4.2628
    7.7686    5.6520
    6.8570    8.2389
   19.5613    8.4030
   33.1838    8.7614
   31.3248   16.3874
   41.3317   17.5090
   48.3017   25.8527
   49.4926   36.8804
      ⋮

Mostrar solución PRM.

show(prm)