Semana 34. Concluyendo el Trabajo
La tarea principal de esta semana era finalmente terminar el TFG completo, es decir, finalizar la memoria y la aplicación para poder concluir el trabajo y saltar a la presentación.
Finalicé la primera versión de la memoria completa, a falta de un par de vídeos y el extracto de código de la aplicación para el capítulo 4, ya que necesitaba concluir la aplicación para adjuntarlos. Subí esta primera versión al repositorio para también dejar el README.md del proyecto más actualizado.
En cuanto a la aplicación, mi trabajo seguía dónde se quedó la semana anterior, refinando los parámetros del suelo para que NAO no resbalase en sus movimientos y pudiera hacer su trabajo correctamente
Después de un tiempo probando rozamientos y más cosas, descubría que si bubía todo el escenario 0.1 unidades más, el comportamiento era mejor, sin embargo, los cuadrados del suelo ya no se veían. Pero como esos cuadradon no son muy importantes, lo dejé así.
También estuve probando nuevos rozamientos, y miré en el repositorio original del modelo a ver qué rozamiento tenía el suelo del mundo utilizado, sin embargo, el mundo que los creadores del modelo utilizaron no tenia especificado rozamiento, así que eliminé los coeficientes del mundo invernadero, cosa que mejoró muchísimo el comportamiento, además, haciendo unas cuantas pruebas, dejé el roamiento estático distinto que el dinámico (más bajo), y optimicé el mundo para que el porcentaje de realismo que se muestra en la esquinna inferior derecha de gazebo variase lo menos posible, consiguiendo al final un 99% estable, aunque variaban los decimales, pero me quedé satisfecha con eso porque el comportamiento no era malo.
Tras un par de pruebas, llegué al siguiente resultado de la aplicación:
Que cómo se puede ver, no está completa, pero ya es un resultado mucho mejor que el que se tenía anteriormente, ya que NAO no tomaba la taryectoria recta. Y además la segunda mesa se quedaba lejos, pero se podía arreglar poniendo más pasos a la vuelta.
Tras otro buen rato de pruebas, se llegó a lo siguiente:
Que, como podemos apreciar, mejora un poco el resultado anterior, pero aún no es lo suficientemente bueno.
Tras un buen tiempo de pruebas, llegué a que el rozamiento adecuado es de 1.5 en estático y de 3.157 en dinámico para ambos pies, obteniendo un buen resultado, sin embargo, tras probar unas cuantas veces la aplicación entera, decidí ejecutarla por trozos, a ver si seguía funcionando mal.
Cuando lo hice, obtuve lo siguiente:
Que no es un mal resultado, ni tampoco bueno, pero me hizo darme cuenta de algo: Al llamar a las funciones de mi librería seguidas no funcionaba bien porque no se esperaban a liberear los recursos correctamente, por lo que, en cada función “llamadora” de nodo, añadí los siguientes cambios:
def Interpreter(file_name: str, printable=True):
rclpy.init()
node = Interpreter_class(file_name, printable)
try:
rclpy.spin_once(node, timeout_sec=2)
finally:
node.destroy_node()
rclpy.shutdown()
Cosa que hace que se espere siempre a que termine la ejecución, ya sea de forma natiral o por algún error. En este caso, cómo los errores no se darían por la naturaleza del código a usar, venía perfecto. El resultado no variaba mucho del anterior.
Por lo que, para que funcionase correctamente, decidí crear un script de bash que llamase a cada uno de los programas independientes de python creados, para ir ejecutando la aplicación poco a poco, pero también “de una sola vez”:
#!/bin/bash
python3 ~/Desktop/2024-tfg-eva-fernandez/CoordMoves/coordmoves/coordmoves/GreenNao_approach.py
sleep 3
python3 ~/Desktop/2024-tfg-eva-fernandez/CoordMoves/coordmoves/coordmoves/GreenNao_grab.py
sleep 3
python3 ~/Desktop/2024-tfg-eva-fernandez/CoordMoves/coordmoves/coordmoves/GreenNao_return.py
sleep 3
python3 ~/Desktop/2024-tfg-eva-fernandez/CoordMoves/coordmoves/coordmoves/GreenNao_release.py
De esta manera, aunque yo pensaba que sí, tampoco mejoró el comportamiento.
Tras demasiados intentos de desarrollar la aplicación. y ver que el problema está en el paso de acercarse a la caja, decidí eliminarlo por completo, haciendo que la mesa con la caja comience justo delante de NAO, para que simplemnete sea cogerla, girarse y dejarla en la mesa de detrás, la cualhice más larga para paliar el error de la caminata:
Y, después de un par de pruebas, por fin obtuve el resultado esperado, por lo que la parte de programación de mi TFG concluye aquí. En cuanto al código de la aplicación, quedó de la siguiente manera:
import CoordMovesLib
import time
time.sleep(5)
CoordMovesLib.grab_box()
time.sleep(3)
for i in range(3):
CoordMovesLib.turn("L", 60)
CoordMovesLib.turn("L", 40)
CoordMovesLib.setArc(1, 0)
time.sleep(3)
CoordMovesLib.release_box()
print("Terminado")
Y, dejo a continuación una demostración del funcionamiento:
Después de esto, introduje los cambios necesarios en la memoria oficial y el README.md del proyecto, y envíe el vídeo final a mi tutor para que lo validase.
También decidí comenzar a hacer la presentación, para adelantar un poco de tiempo, aunque fuera sólo la estructura.