3 minute read

Esta semana, fue básicamente para ver a qué nivel era capaz de controlar y coordinar los movimientos de NAO.

Para esto, lo que tenía que hacer era comprobar a qué frecuencia se mandaban los mensajes de los topics al modelo para ver si el movimiento podía llegar a aser lo suficientemente fluido.

Para comprobar esto, observé el programa hecho la semana anterior, y vi que la respuesta era bastante rápida, por lo que consideré que sí que se podría hacer todo fluido. Dejo aquñi el vídeo de este programa para que se vea:

A continuación, lo que debía hacer era una aplicación que hiciese que NAO moviese los brazos como si estuviese nadando a mariposa, esto para probar a coordinar sus articulaciones antes de ponerlo a andar, para quitare el dolor de cabeza que supondrían las caídas.

Antes de ponerme a programar, decidí hacer un esquema de los nombres de los topics de NAO, para ayudarme a la hora de seleccionarlos y para que, más adelante, se ayude al lector a comprender cada topic.

El esquema es el siguiente:

esquema

Gracias a este esquema, podemos ver claramente qué articulacion controla cada topic (exceptuando la cabeza, que omite la “opción del lado”), por ejemplo: /LAnkleRoll/cmd_pos es el topic encargado de controlar el moviemiento roll (giro sobre el eje x) del tobillo izquierdo de NAO.

Una vez construido este esquema, me puse manos a la obra con la progamación del movimiento “mariposa”.

Para hacerlo, cree un nuevo fichero en la carpeta moving_nao, llamado butterfly_swim.py, programado en python, al igual que el ejercicio de mover la cabeza de la semana anterior. Al principio, lo que hice fue abrir el programa de simulación original, el que tenía los sliders para mover el nao, par aver los límites de las articulaciones, que en este caso serían RShoulder y LShoulder, controlados sólamente por su Pitch.

En base al programa original, dejo por aquí fotos para que se vean bien los límites de todos los topics:

límites_1 límites_2

Una vez vistos los límites, hice un programa exactamente igual que el de controlar la cabeza (nao_controller.py), pero, en lugar de eso, creamos 2 publicadores (uno para cada hombro), y vamos alternando entre los límites máximo y mínimo de los hombros cada segundo, obteniendo el siguiente resultado:

Cómo se puede ver, el moviemiento se queda corto, por lo que, edité el modelo para ponerle límites mayores, a ver qué pasaba:

Y, cómo el movimiento aún no era el esperado, busqué cómo podría hacerlo.

Tras un rato de investigación, descubrí que era mejor idea controlar a NAO por ángulo y quitar los límites de los hombros de NAO, en lugar de directamente por posición, así que, apliqué un ángulo que iba subiendo 0.1 cada iteración (cada segundo), y, cuando llegase a 6.28 (una vuelta completa) se reinciase, sin embargo, el resultado aún no era muy bueno:

Lo que me hizo darme cuenta de que 1 segundo era demasiado, ya que no se veía un movimiento fluido, además, cuando llega a la vuelta completa, en lugar de seguir “nadando”, que es lo que queríamos, vuelve atrás para recuperar la posición inicial.

Antes de arreglar el movimiento, decidí arreglar la fluidez, haciendo que las iteraciones fuesen cada 0.02 segundos, lo que resulta en un movimiento completamente fluido:

Y, por último, par arregalr el movimiento, decidí eliminar ese reseteo de ángulo al llegar a 2pi, ya que realmente no necesitábamos controlar eso, porque las vueltas que daban los brazos nos eran indiferentes y se pueden comprobar dividiendo el ángulo entre 6.28 en cualquier momento, lo que dejó un resultado bastante bueno: