Progreso julio 2024 - RoboticsURJC/tfg-dcampoamor GitHub Wiki

SEMANA 56 (01/07/2024-07/07/2024)
SEMANA 57 (29/07/2024-04/08/2024)
SEMANA 56 (01/07/2024-07/07/2024)
-
Detección de más de un objeto, proyección de sus centroides y cálculo de las distancias y coordenadas con pinhole.py
Dado que en con el programa pinhole.py únicamente se podía detectar un solo punto amarillo a la vez dentro de la escena (dado que las pruebas que se habían llevado a cabo estaban enfocadas a ver si el programa funcionaba y calculaba correctamente la ubicación en el plano y la distancia a la cámara web utilizada), por lo que si dentro del mismo encuadre se detectaban varios puntos amarillos únicamente se calculaba la distancia y posición de ese punto detectado, pudiendo variar la detección si estos puntos se encontraban muy próximos, pero siempre manteniendo esta única detección, se propuso cambiar esto.

Para que esto fuera posible, primero se cambiaron los filtros del programa para la detección de color, puesto que, al llevarse a cabo en un entorno en el que existían varios objetos de madera, al ejecutar el programa, se confundía el color de estos elementos con amarillo claro, teniendo falsas detecciones, por lo que se eligió el verde como nuevo color a detectar.

Después de realizar este cambio, y de pintar los trozos de post-it de verde para poder realizar las pruebas pertinentes, también se incluyeron otros, como por ejemplo, numerar las detecciones para identificarlas.

Esto se llevó a cabo, ya que, si se querían detectar varios puntos en un mismo escenario, a la hora de realizar el cálculo de distancia y ubicar el punto en el espacio, sería conveniente ubicar y relacionar a qué punto correspondería cada distancia y posición.

Las distancias y coordenadas que se pueden observar en la imagen no son reales, ya que se movió la cámara sin volver a ajustar los valores de altura y ángulo de inclinación o rotación dentro del programa modificado pinhole_deteccionmultiple.py, por lo que se ejecutó únicamente para comprobar que estos valores eran diferentes y variaban en función del punto detectado, tal y como se puede observar en el vídeo Detección múltiple pinhole.mp4.
-
Instalación del simulador del robot y pruebas de conexión
Dado que de esta manera las pruebas con robot son más seguras y se pueden llevar a cabo en cualquier momento y lugar sin necesidad de tener un robot físicamente cerca, se realizó la instalación de URSim, que es un en software de simulación que se utiliza para la programación offline y la simulación de programas de robot, y en el cual es posible simular entradas digitales en la página de E/S.
URsim está hecho para el sistema operativo Linux. Para ejecutar el simulador en otro sistema operativo, se necesita una máquina virtual, que es básicamente un programa en el que se pueden instalar varios sistemas operativos, incluido Linux. Por esto, se decidió instalarlo en Oracle VM VirtualBox.
Después de instalar URSim, teniendo en cuenta las limitaciones que presenta, donde la más importante de estas limitaciones es que no es posible simular entradas digital/analógica al robot, además de que la configuración de la pantalla táctil y de la red desde la interfaz gráfica de usuario no funcionará, sí que es posible que el robot puede comunicarse a través de TCP/IP si está configurado en la máquina anfitriona, por lo que se intentó probar esta configuración.
Para esto se buscó la dirección IP del simulador:

Después de esto, se puso la dirección IP Ethernet para VirtualBox en rango con la que se había obtenido de ursim. Sin embargo, existía un problema de conectividad.

A pesar de esto, se comprobó la conectividad de igual modo a través de SocketTest, obteniendo el mismo problema.

Después de esto, se volvió a crear desde cero una nueva máquina virtual con la versión 5.17.0 de Polyscope, y se revisó la configuración de red del simulador, cambiando la opción del adaptador a "Adaptador solo anfitrión" y volviendo a comprobar la conexión.

Tras comprobar que después de realizar estos cambios sí que existía conectividad e intercambio de paquetes de datos entre el simulador y el PC anfitrión del mismo, se quiso llevar a cabo la prueba de la funcionalidad de la comunicación del servidor mediante socket. Para esto, se utilizó SocketTest, probando el comando "power on" utilizando el servidor Dashboard, con las direcciones IPs del URSim y del adaptador Ethernet2 en rango y actualizadas, y utilizando el puerto 29999. Esta prueba se puede ver en el vídeo Prueba URSim socket.mp4.

-
Pruebas de comunicación de listas dinámicas al robot mediante el método de llamada de procedimiento remoto XML-RPC
Tras solucionar los problemas relacionados con el simulador y dejarlo operativo, se probó a continuar en este con las pruebas de la SEMANA 55 (24/06/2024-30/06/2024) e intentar que en vez de repetir tres posiciones de manera continua en bucle, se vaya una única vez, como si se tratase de una lista dinámica, de tal manera que, aunque de manera consecutiva según su ubicación en esta lista, no se vuelva a repetir el movimiento hacia estos puntos una vez ya alcanzados y siempre y cuando no se volviera a realizar una hipotética detección en exactamente alguno de los puntos ya alcanzados.

Este proceso puede apreciarse en el video XMLRPC URSim Lista dinamica OK.mp4. Sin embargo, en este vídeo no se aprecian las últimas modificaciones que se aplicaron, donde en el programa en python se añadió información sobre el estado del robot en ese momento en función de las posiciones detectadas que se incluían en la lista tales como "Moviendo a la posición: {pose}" si el robot se encuentra yendo a esa posición o "Esperando siguiente posición..." en caso de estar esperando una posición nueva. Estas modificaciones se incluyen en el programa en python xmlrpc_server_listadinamica_OK.py junto con el programa de robot xmlrpc_example_listadinamica_OK.urp.

SEMANA 57 (29/07/2024-04/08/2024)
-
Generación de figuras geométricas en OpenGL a partir de los puntos detectados por el programa pinhole.py
Después de lo conseguido con Detección de más de un objeto, proyección de sus centroides y cálculo de las distancias y coordenadas con pinhole.py, se probó a modificar el programa pinhole_deteccionmultiple.py para que, el programa resultante capturase y procesase los puntos detectados y los mostrase en una ventana distinta utilizando OpenGL, en la que se utilizasen las capacidades de navegación, funciones y funcionalidades del programa scene_navigation.py.
Ejecutar ambas funcionalidades de manera simultánea (captura de cámara y visualización con OpenGL), fue posible gracias al threading. El threading es un concepto en la programación que permite que un programa ejecute múltiples operaciones dentro de un solo proceso, siendo una forma de realizar multitarea dentro de una aplicación, aprovechando el paralelismo en la ejecución de tareas. Basándome en esto, y tras probar diferentes formas de poder incluir las funciones de un programa en otro y hacerlos funcionar de manera simultánea, se llegó a conseguir que la detección de cuatro puntos verdes se vieran en la ventana con OpenGL de la siguiente manera:


Donde se pueden apreciar que los puntos detectados mediante la cámara, se reflejan en una ventana paralela utilizando OpenGL en color rojo, tal y como se señalan en la siguiente imagen (estos círculos rojos se han añadido a posterior con otro programa diferente para poder marcar los puntos detectados y representados en esa ventana).

Sin embargo, para hacer que estos puntos fueran más grandes y de un color con mayor contraste sobre el fondo de color negro, se ajustó el tamaño de los puntos y el color en la función
draw_pointsdentro del código OpenGL. Estas modificaciones fueron las siguientes:- glPointSize(5.0): Esta línea establece el tamaño de los puntos en 5.0, haciéndolos más grandes.
- glColor3f(0.0, 1.0, 0.0): Esta línea cambia el color de los puntos a verde, que tiene un mayor contraste con el fondo negro.

Se puede ver el proceso completo de la detección y representación de los puntos en el vídeo pinhole_openGL puntos.mp4 y pinhole_openGL OK.mp4, en los cuales se ha utilizado el programa pinhole_openGL.py. En este último vídeo puede apreciarse de manera dinámica como da igual el número de puntos detectados cuando se ejecuta el programa, puesto que, incluso al variar este número, la representación con OpenGL varía de igual modo, representando la figura geométrica correspondiente al número de puntos detectados, siempre que este sea igual o superior a tres (se puede apreciar que se detectan cuatro puntos y se representa un cuadrado con OpenGL pero se retira uno, detectando tres, y representando un triángulo).