Progreso agosto 2024 - RoboticsURJC/tfg-dcampoamor GitHub Wiki

Progreso agosto 2024

SEMANA 57 (29/07/2024-04/08/2024)

SEMANA 58 (05/07/2024-11/08/2024)

SEMANA 59 (12/08/2024-18/08/2024)

SEMANA 60 (26/08/2024-01/09/2024)

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:

    pinhole OpenGL

    representacion puntos rojos OpenGL

    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).

    Señalamiento puntos

    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_points dentro 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.

    pinhole_openGL puntos

    Se puede ver el proceso completo de la detección y representación de los puntos en el vídeo pinhole_openGL puntos.mp4.

SEMANA 58 (05/07/2024-11/08/2024

  • Generación de figuras geométricas en OpenGL a partir de los puntos detectados por el programa pinhole.py

    Después de conseguir representar los puntos detectados, para unir los puntos detectados y formar una figura geométrica en la ventana de OpenGL, se modificó la función draw_points para que dibujase líneas entre los puntos detectados. Esto se logró utilizando GL_LINES o GL_LINE_STRIP en lugar de GL_POINTS.

    pinhole_openGL ventana union lineas

    En esta versión del código, se ha añadido un bloque glBegin(GL_LINE_STRIP) y glEnd() dentro de la función draw_points para dibujar líneas que conectan los puntos detectados. Con esto, el código sigue dibujando los puntos con GL_POINTS para que los puntos individuales sean visibles, y luego se dibujan las líneas entre ellos para formar la figura geométrica. Sin embargo, con estas modificaciones, a pesar de conseguir que los puntos detectados se conectarán mediante líneas, formando una figura geométrica en la ventana de OpenGL, se unían sin formar una figura geométrica clara, tal y como se puede ver en la imagen anterior.

    Para asegurarnos de que la figura geométrica dibujada sea cerrada, se usó GL_LINE_LOOP en lugar de GL_LINE_STRIP. Esto conecta automáticamente el último punto con el primero, cerrando así la figura geométrica.

    pinhole_openGL ventana cuadrado openGL line loop

    El comportamiento que puede observarse, donde las líneas no forman una figura geométrica coherente, puede explicarse por varios factores relacionados con cómo OpenGL y los datos de los puntos están siendo manejados. Cuando detectas los puntos en la imagen y los usas directamente para dibujar una figura geométrica, el orden en el que los puntos se conectan es crucial. Si los puntos no están ordenados de una manera que represente una forma geométrica clara, como un cuadrado o triángulo, OpenGL simplemente conecta los puntos en el orden en el que se los das, lo que puede resultar en líneas cruzadas o formas inesperadas como se puede observar en la imagen anterior. De igual manera, los puntos detectados en la imagen son puntos en un espacio 2D que luego se transforman a coordenadas 3D, por lo que si estos puntos no están correctamente proyectados o si están muy cerca en el espacio 3D, cualquier pequeño error en la posición o perspectiva puede causar que las líneas dibujadas entre los puntos se crucen o no formen una figura cerrada. Esto, además de las transformaciones como rotaciones, escalados y traslaciones pueden amplificar los pequeños errores en las posiciones de los puntos, haciendo que una figura que parecía correcta en una vista específica se distorsione cuando cambias la perspectiva o aplicas zoom en la escena.

    Una vez conocido y sabido esto, para resolver el problema y garantizar que se dibuje una figura geométrica sólida como un cuadrado o un triángulo, se aseguraró que los puntos se ordenen correctamente antes de dibujarlos. Para esto, se utilizó el cálculo del centroide (el centro de todos los puntos) y luego se ordenararon los puntos por el ángulo que forman respecto al centroide.

    pinhole_openGL ventana cuadrado

    El cálculo del centroide (punto central) de todos los puntos detectados se realiza utilizando np.mean(detected_points, axis=0), que promedia las coordenadas X, Y y Z de todos los puntos, mientras que el ordenamiento de puntos según el ángulo se define con una función interna llamada angle_from_centroid que toma un punto y calcula el ángulo que forma con respecto al centroide usando la función np.arctan2 que devuelve el ángulo (en radianes) entre el eje X positivo y el punto (x, y) medido desde el origen, siendo este ángulo el utilizado para ordenar los puntos.

    codigo figura geometrica cerrada

    Tras solventar esto, también se llevaron a cabo pruebas con otras figuras geométricas, como triángulos, a partir de 3 puntos para probar la robustez del programa.

    pinhole_openGL triangulo

    El código utilizado para poder conseguir todo esto ha sido pinhole_openGL.py, además, se pueden ver ejemplos de este en los vídeos pinhole_openGL triangulos.mp4 y pinhole_openGL OK.mp4.

SEMANA 59 (12/08/2024-18/08/2024)

  • Elaboración de la memoria

    De manera paralela a la consecución de pruebas, se continuó con la elaboración de la memoria del trabajo.

SEMANA 60 (26/08/2024-01/09/2024)

  • Instalación de VNC en Ubuntu

    Debido a las dificultades de instalar el simulador URSim en la versión de Linux Ubuntu 22.04, tal y como se detalla en el documento Installing URSIM on ubuntu 22.04, ya que Ubuntu 22.04 ya no soporta lib32gcc1, siendo un requisito para instalar el simulador, y dado que instalar lib32gcc-s1 que reemplaza este paquete, no ayuda ya que libxmlrpc-c-ur depende del paquete antiguo, se decidió instalar RealVNC Viewer para Linux para poder hacer al menos pruebas con el robot y llevar a cabo pruebas con el programa pinhole_openGL.py, descargando para ello, el archivo DEB x 64 de la página de RealVNC Viewer.

    Debian

    Después de esto, se navegó hasta la carpeta de descargas y se instaló, arrancando el programa para comprobar que funcionase posteriormente.

    VNC terminal instalacion

    VNC Viewer Linux

  • Elaboración de la memoria

    De manera paralela a la consecución de pruebas, se continuó con la elaboración de la memoria del trabajo.