Skip to content

Experimentos

jlopeza2020 edited this page Nov 7, 2024 · 11 revisions

Entorno ficticio

Para la realización de experimentos que simulen una carretera, se decidió usar un entorno ficticio.

Creación del entorno ficticio

Partiendo de medidas de carreteras de 2 carriles que no superen los 6.5 metros de ancho, siguiendo las medidas de esta web se ha podido conseguir lo siguiente:

Medidas reales:

Medidas a escala de la cartulina , un 7.69% de la realidad. Sin embargo, los baches serán a tamaño real.

Estas imágenes se han realizado con Canva y con Samsung Notes

Resultado final:

Se ha necesitado 4 cartulinas negras de 50x70 cm, un folio blanco y pegamento de barra.

Aquí se puede ver el entorno totalmente construido:

Teleoperado

Para conseguir el movimiento teleoperado se ha construido en la interfaz web, una botonera que permite mover al robot desde cualquier dispositivo.

Experimento 1

He tenido que cambiar el umbral a 0.6 y estoy en proceso de cambiar las ruedas.

Experimento 2

EN PROCESO

Autónomo

Para tener otra alternativa con respecto a la navegación de PiBotJ, se ha decidido implementar una lógica para que su movimiento sea autónomo.

Lo ideal para este caso es que PiBotJ fuera capaz de navegar autónomamente por el entorno ficticio/controlado.

Una vez definido el entorno donde se iba a trabajar, era el momento de definir la lógica a usar y se decidió unir un algoritmo de detección de lı́neas junto a la técnica de navegación local conocida como Virtual Force Field (VFF).

Detección de líneas

Es importante a tener en cuenta que este algoritmo se va a ejecutar únicamente cuando no haya bache en el entorno controlado. Para conseguirlo, es necesario procesar la imagen en escala de grises para detectar los contornos de las lı́neas, usando una umbralización adaptativa para destacar los bordes y una operación de apertura morfológica para eliminar pequeños puntos blancos que representan ruido en la imagen binaria.

# Convierte la imagen a escala de grises
gray = cv2.cvtColor(resized_frame, cv2.COLOR_BGR2GRAY)
# Aplica un umbral para destacar los bordes
th1 = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY,23,-50)
# Elimina ruido
kernel = np.ones((3, 3), np.uint8)
opened_th1 = cv2.morphologyEx(th1, cv2.MORPH_OPEN, kernel)

El resultado final queda reflejado a continuación y el código está plasmado en camera_dl_node.py

En la imagen de a continuación se puede ver los distintos tipos de situaciones a las que se enfrenta PiBotJ cuando detecta lı́neas y dependiendo de la situación, PiBotJ reaccionarı́a de una forma u otra. Cuando detecta las dos lı́neas, PiBotJ sigue recto mientras que si detecta únicamente una lı́nea, deberá avanzar hacia adelante y si dicha línea no se encuentra en el centro de la imagen, PiBotJ girarı́a hasta que se situase en el centro. Por otro lado, si no detecta lı́neas avanzarı́a recto durante 3 segundos y empezarı́a a girar.

Virtual Force Field (VFF)

Es un método de navegación local para que un robot autónomo evite obstáculos en su entorno. Este método se compone de una fuerza repulsiva para evitar el obstáculo y de una fuerza atractiva para alcanzar el destino objetivo131 . Estas fuerzas se suman vectorialmente para obtener una fuerza resultante, que indica la dirección y velocidad de movimiento del robot. Esta fuerza resultante se puede calcular siguiendo la siguiente Ecuación:

Fresultante = α · Fatractiva + β · Frepulsiva

El robot se mueve en la dirección de la fuerza resultante, ajustando su trayectoria en tiempo real según las posiciones del obstáculo y el objetivo. En este caso, se decidió fijar como objetivo, un punto siempre hacia adelante y como repulsión, el punto más cercano detectado del contorno al robot, en coordenadas del mundo real, y aplicar la fuerza repulsiva respecto a él. La Figura de a continuación, muestra la dirección de las distintas fuerzas. Todo está documentado en camera_vff_node.py

Experimento 1

EN proceso