7 minute read

Para esta semana, simplemente tenía 2 tareas: Crear el escenario del invernadero y modificar el editor de moviemtnos para que éste sea capaz de crear la onda para caminar, en lugar de hacerlo por código cómo se mostró en la entrada anterior de este blog.

Creando el escenario para NAO

Para crear el escenario del invernadero, decidí utilizar Blander, ya que es una herramienta muy común y buena para el modelado 3D.

Cómo no estoy muy experimentada en Blender, decidí que para hacer el invernadero iba a coger modelos ya creados (y libres para usar) y colocarlos a mi gusto para poder crear nuestro entorno. Cosa que dividí en fases:

Primera fase: Construcción

En primer lugar, contruí lo que es la estructura del invernadero utilizando el siguiente modelo:

El cual copié y pegué otras 3 veces, y, borrando algunas paredes y colocando las “piezas” adecuadamente, llegué al siguiente resultado, el cual me gustó bastante, cabe destacar que tuve que añadir también un plano para que tuviese suelo:

Segunda fase: Decoración

Una vez construida la estructura, me dediqué a coger modelos de plantas y colocarlas por el lugar, para que se haga una idea, dejo por aquí el principio de esta fase:

Tras un buen rato de decoración del lugar, el invernadero donde trabajará nuestro robot es el siguiente:

Tercera fase: Hacer que funcione en Gazebo

Una vez terminado el modelo en blender, había que hacer que gazebo lo aceptase. Para hacerlo, seguí el siguiente tutorial, cosa que fue bastante tediosa porque el fichero .dae de mi mundo era demasiado pesado como para subirlo al repositorio, entonces tuve que recurrir a pasarlo al volumen de docker para tenerlo ahí copiado directamente.

Una vez solucionados todos esos problemas, el modelo daba error al abrir en gazebo por los nombres de las imágenes de las texturas (cosa que no dependía de mi), asi que tuve que ir cambiando los nombres de las que daban error una por una a mano hasta que llegué al siguiente resultado:

Que, como se puede ver, no tiene mucho que ver con el escenario en blender, y, además, da muchos errores que no entendía y no me permitía correr la simulación.

Por lo que decidí hacer otro invernadero desde cero para que fuera un modelo más sencillo y no tuviera tantos quebraderos de cabeza.

Para conseguir mi invernadero, lo primero que ihice fue exportar a .dae todos los modelos 3D que tenía en blender, analizando bien los nombres de las texturas, por si acaso, y los iba metiendo en un mundo de gazebo utilizando el siguiente código:

    <model name='nombre_del_objeto'>
      <link name='link'>
        <visual name='visual'>
          <geometry>
            <mesh>
              <uri>file:///<ruta al fichero .dae></uri>
            </mesh>
          </geometry>
        </visual>
        <collision name='collision'>
          <geometry>
            <mesh>
              <uri>file:///<ruta al fichero .dae></uri>
            </mesh>
          </geometry>
        </collision>
        <pose>0 0 0.01 0 0 0</pose>
        <enable_wind>false</enable_wind>
      </link>
      <pose>0 0 0.01 0 0 0</pose>
      <static>true</static>
      <self_collide>false</self_collide>
    </model>

Había varios que no funcionaban por razones que desconocía, así que decidí simplemente descartarlos y usar los que sí funcionaban. Una vez metidos todos en Gazebo, mi invernadero tenía esta pinta:

Después de eso, simplemente añadí paredes y moví los objetos desde el propio gazebo para que fuera más fácil conseguir lo que ahora mismo es la primera versión de mi invernadero:

Cosa que me costó muchísmas horas (aunque no lo parezca), ya que tuve muchísmos problemas a la hora de añadir las mallas al sdf del mundo, porque gazebo es muy “especial” para eso. NO fue hasta que me di cuenta de que se pueden importar mallas en dae desde el propio simulador, que pude escribir mis modelos en el sdf, y tardé muchísmo, no lo abría conseguido si no hubiera sido por este vídeo.

Después de eso, al cargarlo con ROS, las pardes salían negras, pero no le di importancia porque eso no era importante ahora mismo:

Después de terminar de editar el editor de movimientos (explicado a continuación), probé a editar los colores de las mallas directamente desde el fichero dae, cambiando los números dónde se mencionaba la palabra “color”, ya que los .dae no dejan de ser ficheros de texto.

Después de un buen rato cambiando colores, el invernadero quedó así:

Y, también, cambié de color las paredes, para que no fueran negras, directamente desde el sdf del mundo, ya que estas paredes eran cubos creados en sdf directamente:

Cosa que al final me dejó un buen sabor de boca, aunque pensaba que el mundo era demasiado simple.

Haciendo el editor de movimientos más sofisticado

Para esta tarea, lo primero que hice fue añadir 2 sliders más a mi editor de movimiwntos, uno para la amplitud del seno, y otra para su periodo, y, después, calcular el seno dado por esos 2 valores y que matplotlib me lo mostrase. UNa vez añadido eso, el editor se comportaba de esta forma:

Y, después de ver que funcionaba, decidí que esos 2 valores se guardasen en el json después de todos los datos de las posiciones:

Después de eso, faltaba hacer un programa que leyese eso y hiciera que NAO andase en funcion de lo dado en el json.

Para eso el código que hacía andar a NAO usando como datos del seno los argumentos pasados y le puse que, en lugar de leer argumentos, leyese los campos amplitud y periodo del json, además de ajustar los pasos a 50 siempre. El resto era todo igual.

Cuando terminé eso, la primera prueba que hoce fue la siguiente:

Cosa que me demostró que mi código funcionaba, pero que la amplitud y el periodo elegidos no eran muy buenos que digamos, aunque he de decir que lo shabí apuesto al azar.

EXTRA: Dando nombre a mi TFG

Como las tareas principales de estas semanas estaban completadas (a falta de resolver dudas), decidí hacer algo muy sencillo pero muy importante a la vez a la hora de hacer un TFG: Darle un nombre y algo para que se distinga mi TFG de otros que usen al NAO.

Para hacerlo, primero pensé que sería buena idea llamar a este proyecto “GreenNao”, ya que es NAO, trabajando en un invernadero, que en inglés es greenhouse. Me parecía que quedaba bien, así que me gustó la idea y pregunté a mi tutor al respecto, como me dijo que el nombre era una cosa secundaria y que no le disgustaba, asi que se llamará así a partir de ahora.

Después de eso, pasé a lo siguiente: Distinguir mi proyecto de otros. Para hacer eso, lo único que hice fue investigar el modelo, y descubrí la siguiente imagen:

Esto son las texturas de NAO, es decir, el cómo lo vemos nosotros:

Así que decidí trastear con ello a ver si podía hacer a mi NAO algo diferente. Dejo por aquí las pruebas que hice:

Después de un rato, también estuve investigando los colores reales de NAO, y no vi que existiera un modelo en verde, así que me pareció muy bien quedarme con ese color, además de por el nombre que le iba a dar. Tras unas cuantas pruebas:

Encontré al que sería mi NAO definitivo, el GreenNao:

EXTRA 2: Haciendo pruebas de caminata con el fichero JSON

Después de todo eso, lo que hice fue probar a ver si encontraba la caminata, pero, al hacer las pruebas, me di cuenta de que np había solcuionado el problema de tener muchísimos parámetros para empezar, ya que seguía necesitando modificar las articulaciones una por una para que NAO se moviese y, ademas, tenía que modificar la amplitud y la frecuencia.

Por suerte para mi, tenía el fichero caminata.json, que es el que tiene los movimientos de las piernas necesarios para andar, así que edité a mano la amplitud y la frecuencia a ver qué obtenía, aunque, es lo mismo que tenía la semana 13 del desarrollo del TFG, pero en lugar de un fichero, en otro. Por loque decidí esperar a la reunión para preguntar al respecto, ya que era algo que me confundía bastante.

AMPLITUD 0.1 PERIODO 0.3

AMPLITUD 0.01 PERIODO 0.3

AMPLITUD 0.05 PERIODO 0.2

AMPLITUD 0.05 PERIODO 0.3

EXTRA 3: Cambiado el editor para que sea realista

Como bien dice el título, también cambié el editor para que se mostrasen los movimientos de forma realista y poder usarlo más fácilmente: