# Planificación de movimiento

El término planificación de movimiento (del inglés motion planning) es aplicado para describir un conjunto de problemas que están relacionados con mover un objeto (robot) de un punto inicial a un punto final evitando colisionar con los posibles obstáculos del entorno.
Para el análisis de estos problemas suele utilizarse el espacio euclidiano en dos dimensiones y en ocasiones se considera que la colisión con un obstáculo sólo ocurre con los puntos internos de este (asumiendo a los obstáculos como polígonos simples) y no con la frontera, aunque en términos prácticos puede no resultar seguro que un robot pase tan cerca de un obstáculo.

## Algoritmos
### Basados en trayectoria
#### Grafo de visibilidad

Este algoritmo se apoya en el uso del grafo de visibilidad para obtener todas las trayectorias posibles que pasan por los vértices de los polígonos (obstáculos). Una vez que se tiene el grafo de visibilidad se aplica un algoritmo para encontrar el camino más corto, dicho algoritmo puede ser el de Dijkstra.
* Algoritmo ObtenerCamino ($S,p_{inicio},p_{fina}l$)
* //$S$ Conjunto de polígonos disjuntos
* //$p_{inicio}$ Punto de partida del robot
* //$p_{final}$ Punto de llegada del robot
* $G$ ← CalcularGrafoVisibilidad($S,p_{inicio},p_{final}$)
* Asignar como peso de cada arista de $G$ la distancia euclidiana entre los vértices de la arista.
* $ShortestPath$ ← DijkstraShortestPath($G,p_{inicio},p_{final}$)
* return $ShortestPath$

##### Complejidad

La complejidad de calcular el grafo de visibilidad es $O(n^{2}log(n))$, y la complejidad del algoritmo de Dijkstra es $O(n^{2})$, por lo tanto la complejidad del algoritmo ObtenerCamino queda acotada por $O(n^{2}log(n))$.

### Basados en celdas
#### Descomposición en celdas exactas

La descomposición en celdas exactas es utilizada para representar el espacio libre de obstáculos, una vez que se conoce basta con calcular una ruta a través de este espacio. Para generar las celdas se usa un mapa trapezoidal. La construcción de un mapa trapezoidal se realiza tomando un conjunto de polígonos disjuntos, estos son encerrados en una caja para delimitar el espacio en que se crearán los trapezoides. A continuación se trazan líneas verticales en los vértices de cada polígono hasta que la línea alcanza algún obstáculo, ya sea la frontera de algún polígono o la «caja». Una vez que se tiene el mapa trapezoidal se deben calcular las celdas que representan al espacio libre, esto se puede hacer simplemente removiendo los trapezoides que se encuentran en el interior de los polígonos.
Para encontrar una trayectoria libre de obstáculos desde el punto inicial del robot hasta la meta se construye un grafo de trayectoria utilizando como nodos los puntos ubicados en los centros de los trapezoides y de las líneas verticales que constituyen el mapa, las aristas serán las semirrectas que conecten tales puntos únicamente en los casos en que un punto esté en el centro de un trapezoide y el otro en el centro de una línea vertical que constituya la frontera de dicho trapezoide.
Una vez que se tiene el grafo descrito anteriormente la construcción de un camino libre de obstáculos se puede hacer de acuerdo al siguiente algoritmo.
* Algoritmo ObtenerCamino ($M_{t},G,p_{inicio},p_{final}$)
* //$M_{t}$ Mapa trapezoidal del espacio libre de obstáculos
* //$G$ Grafo de trayectoria calculado a partir del mapa trapezoidal
* //$p_{inicio}$ Punto de partida del robot
* //$p_{final}$ Punto de llegada del robot
* Encontrar los trapezoides $t_{i},t_{f}$ que contienen a los puntos $p_{i},p_{f}$
* if $t_{i},t_{f}$ no existen
* return "camino inexistente"
* Obtener los vértices $v_{i},v_{f}$ que corresponden al centro de los trapezoides $t_{i},t_{f}$
* $Path$ ← BreadFirstSearch($G,p_{inicio},p_{final}$)
* if $Path$ no existe
* return "camino inexistente"
* return ${\overline {p_{inicio}v_{i}}}\cup Path\cup {\overline {v_{f}p_{final}}}$

#### Descomposición en celdas aproximadas

En este algoritmo las celdas corresponden a los elementos formados por una rejilla de tamaño fijo, en este caso los obstáculos son representados como celdas completamente ocupadas.
Dependiendo del tamaño de la rejilla puede pasar que algunos caminos libres sean marcados como ocupados, en estos casos una opción puede ser disminuir el tamaño de las celdas de la rejilla para aumentar la precisión.