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 la 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 que se ha construido la hoja de ruta, puede consultar una ruta 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 con datos importados. Al muestrear nodos en el espacio libre de un mapa, PRM utiliza esta representación de rejilla de ocupación binaria para deducir el espacio libre. Además, PRM no tiene en cuenta la dimensión del robot mientras se computan un camino libre de obstáculos en un mapa. Por lo tanto, 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 representa el tamaño del robot y asegura la evasión de colisión para el robot real. Defina las ubicaciones de inicio y fin en el mapa para que el planificador de rutas de PRM encuentre una ruta libre de obstáculos.

Importar mapas de ejemplo para planificar una ruta

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 rejilla de ocupación utilizando la clase.simpleMaprobotics.BinaryOccupancyGrid Establezca la resolución en 2 celdas por metro para este mapa.

map = robotics.BinaryOccupancyGrid(simpleMap,2);

Visualice el mapa utilizando la función del objetoshowrobotics.BinaryOccupancyGrid

show(map)

Definir dimensiones del robot e inflar el mapa

Para asegurarse de que el robot no colisionará con ningún obstáculo, debe inflar el mapa por la dimensión del robot antes de suministrarlo al planificador de rutas 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 cota 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.robotics.PRM

prm = robotics.PRM;

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 usando un número determinado de nodos en el mapa dado. En función de la dimensión y la complejidad del mapa de entrada, este es uno de los atributos principales que se ajustan para obtener una solución entre dos puntos del mapa. Un gran número de nodos crea una hoja de ruta densa y aumenta la probabilidad de encontrar una ruta. Sin embargo, tener más nodos aumenta el tiempo de cálculo tanto para crear la hoja de ruta como para 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 distancia de conexión grande aumenta la conectividad entre los nodos para encontrar una trayectoria más fácil, pero puede aumentar el tiempo de cálculo de la creación del mapa de ruta.

prm.ConnectionDistance = 5;

Encontrar un camino factible en el PRM construido

Defina las ubicaciones de inicio y fin en el mapa para que las utilice el planificador de rutas.

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 de inicio hasta la ubicación final. Tenga en cuenta que la voluntad 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 rejilla de ocupación binaria con una resolución dada (1 célula por metro)complexMap

map = robotics.BinaryOccupancyGrid(complexMap,1);

Mostrar el mapa.

show(map)

Inflar el mapa basado en dimensión robot

Copiar e inflar el mapa para factorizar 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 el nuevo mapa y establezca los parámetros

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

prm.Map = mapInflated;

Establezca las propiedades y.NumNodesConnectionDistance

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

Mostrar gráfico PRM.

show(prm)

Encontrar un camino factible en el PRM construido

Defina la ubicación inicial y final en el mapa para encontrar un camino libre de obstáculos.

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

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

path = findpath(prm, startLocation, endLocation);

Puesto que está planeando una ruta en un mapa grande y complicado, es posible que se requiera 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 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
      ⋮

Visualice la solución PRM.

show(prm)

Utilice PRM con la rejilla de ocupación probabilística

Construya un objeto utilizando los datos importados.robotics.OccupancyGridternaryMap El representa un entorno que utiliza probabilidades, donde la probabilidad de ocupación para el espacio libre es 0, para el espacio ocupado es 1 y para el espacio desconocido es 0,5.ternaryMap Aquí, se utiliza la resolución de 20 celdas por metro.

map = robotics.OccupancyGrid(ternaryMap,20); show(map)

Inflar el mapa basado en dimensión robot

Copiar e inflar el mapa para factorizar 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 el nuevo mapa y establezca los parámetros

Actualice el objeto PRM con el mapa recién inflado y defina otros atributos. PRM utiliza en el objeto Ocuppancygrid para determinar el espacio libre de obstáculos y calcula una ruta dentro de este espacio libre de obstáculos.FreeThreshold El valor de las celdas desconocidas en el is 0,5, mientras que el predeterminado en el objeto Ocuppancygrid es 0,2.ternaryMapFreeThresholdmapInflated Como resultado, el PRM no planifican una ruta en la región desconocida.

prm.Map = mapInflated;

Establezca las propiedades y lasNumNodesConnectionDistance

prm.NumNodes = 60; prm.ConnectionDistance = 5; 

Mostrar gráfico PRM.

show(prm)

Encontrar un camino factible en el PRM construido

Defina la ubicación inicial y final en el mapa para encontrar un camino libre de obstáculos.

startLocation = [7 22]; endLocation = [15 5]; 

Busque una solución entre la ubicación inicial y final. Continúe añadiendo nodos hasta que se encuentra una ruta de acceso.

path = findpath(prm, startLocation, endLocation); while isempty(path)     prm.NumNodes = prm.NumNodes + 10;     update(prm);     path = findpath(prm, startLocation, endLocation); end

Ruta de visualización.

path
path = 10×2

    7.0000   22.0000
    7.9059   22.1722
   10.6881   22.3734
   11.7508   19.3716
   13.7982   17.1659
   17.5826   14.6769
   16.8227    9.9964
   15.1329    8.3100
   14.9489    5.7648
   15.0000    5.0000

Visualice la solución PRM.

show(prm)

Consulte también