Proyecto Robot bipedo

Hola amigos!
Estoy haciendo un proyecto de robotica, por lo que vi con arduino parecia ser mas fácil ya que necesito mover 6 servomotores, por lo cual me aventure a usar arduino Mega 2650 y estoy aprendiendo a programar, sin embargo tengo un problema, ya que eh podido mover los servos con for, pero no pude hacerlo con 4 servos a la vez(que es lo que necesito para que camine), asi que lo hice con if, y usando do while, de lo cual logre que el bipedo diera el primer paso, movimiento de los dos servos de los pies y luego los servos de las rodillas y caderas.
El problema es que no puedo salir del do while para seguir programando y asi camine el robot :/
Ojala me puedan ayudar, muchas gracias!

Código:
#include <Servo.h>

Servo pieizq;Servo pieder;Servo rodillaizq;Servo rodillader;Servo caderaizq;Servo caderader;
int uno=90;int dos=90;int tres=90;int cuatro=96;int cinco=95;int seis=86;

 
void setup(){
 
 pieizq.attach(2); pieder.attach(3); rodillaizq.attach(7); rodillader.attach(5); caderaizq.attach(6); caderader.attach(4);
 pieizq.write(90); pieder.write(90); rodillaizq.write(90); rodillader.write(96); caderaizq.write(95); caderader.write(86);//posicion del robot para que quede parado derecho
}

void loop(){
if(uno>70){
  do{
 if(uno<=100){pieizq.write(uno);delay(30);uno++;}//movimiento de pie

 if(dos<=120){pieder.write(dos);delay(30);dos++;}//movimiento de pie
 }
  while(dos<121);
 if(tres>70){rodillaizq.write(tres);delay(10);tres--;}
 
 if(cuatro>76){rodillader.write(cuatro);delay(10);cuatro--;}

 if(cinco>75){caderaizq.write(cinco);delay(10);cinco--;}

 if(seis>66){caderader.write(seis);delay(10);seis--;}

}

}
/////

el robot bipedo ya esta armado y listo para moverse. De hecho lo eh hecho caminar, pero queda inestable ya que use servo.write(grado) por lo que arduino determina la velocidad y el robot necesita caminar con menos velocidad.///
nota:no pude subir imagenes, lo hare mas adelante ya que no me lo permite el foro. ...
 

Adjuntos

  • do-while.rar
    8.5 KB · Visitas: 20
Última edición por un moderador:
Ok, ahí pude, gracias!
Aun no eh podido solucionar el problema...espero puedan darme una mano...
Saludos!



probando el bipedo...:)
 

Adjuntos

  • 20140906_130926.jpg
    20140906_130926.jpg
    31.6 KB · Visitas: 99
  • 20140903_163312.jpg
    20140903_163312.jpg
    175.6 KB · Visitas: 73
Última edición:
Una posibilidad consiste en dividir las tareas principales en tareas secundarias, y éstas en movimientos más finos.

Por ejemplo: para ir del punto A al punto B, hay que dar una serie de pasos. Y cada paso requiere un conjunto de movimientos (no tenemos en cuenta los imprevistos que nos lleguen desde los sensores, en este ejemplo).

Y aquí es donde nos encontramos con el problema planteado: ¿cómo realizar varios movimientos al mismo tiempo?

Veámoslo con un gráfico:

Código:
          |
músculo A |  10 20 30 40 50 60 70 60 50 40 30 20 10
          |
músculo B |        10 15 20 25 30 35 40 45 50 45 40 35 30 25 20 15 10 
          |
músculo C |      -10         0         10         0         -10        0
          +----+----+----+----+----+----+----+----+----+----+----+----+---> t
Una posible solución es la tener una pila donde podemos agregar los movimientos que queremos hacer. Esos movimientos tendrán una serie de componentes como: largo del movimiento (en el tiempo), forma de variación de los valores (linealmente, ajustados a una curva, etc.), inicio (programar un movimiento en un determinado tiempo, o como resultado de un movimiento anterior de otro músculo, o si es el propio músculo, volver al estado inicial), y algún valor más.

Luego, tenemos una variable que hace las funciones de tiempo, y va avanzando por la información de todos los músculos. Para cada uno de ellos, obtiene el siguiente valor que debe enviar a los servos. O si se ha llegado al final del movimiento o se ha producido un evento especial, sacarlo de la pila.

De alguna forma, estamos tratando de imitar la naturaleza de procesamiento en paralelo de nuestro cerebelo dentro de una ejecución lineal de un procesador. Para ello, dividimos las tareas en partes pequeñas, y luego las ejecutamos poco a poco. Exactamente a como se hace con el procesamiento en tiempo compartido en computación.

Esta sigue siendo la base de la animación por computador, en muchos software actuales: el sistema te permite programar los movimientos de los músculos y articulaciones del personaje mostrando una línea temporal, donde puedes indicar el comienzo, fin, y forma del movimiento (cambio de amplitud en los tres ejes o morphing a una posición final) a lo largo del tiempo. El ordenador creará los cuadros de animación intermedios ("fotogramas") calculando los deltas de cada uno de los movimientos solicitados, para formar un "gesto" dentro de un "plano" (dentro de un "clip", dentro de una "escena", dentro de una "película").

Hay otras soluciones, pero todas ellas se dirigen más a decidir el momento en que debe iniciarse un movimiento (agregar a la pila), en qué parte del movimiento (no necesariamente un músculo debe empezar a moverse siempre desde el mismo punto), velocidad (depende de los sensores, situación... si el robot se está cayendo hacia adelante, debe mover la pierna que en ese momento esté levantada mucho más deprisa que si fuera solo a andar), aceleración (las piernas, brazos y tronco tienen una masa, sometidas a la fuerza centrífuga, por lo que los movimientos no tienen velocidad uniforme -de ahí viene el baile robot: nosotros identificamos esos movimientos como los de un robot porque el artista imita el movimiento de un robot sencillo en que los músculos siguen trayectorias fijas a velocidades fijas, pero nosotros normalmente no nos movemos así: cuando el brazo se mueve hacia una dirección va acelerando, y en un punto tiene que empezar a desacelerar, para llegar a la posición final-), ruido (mientras que las piernas son vitales para moverse, los brazos tienen más libertad. Aplicando ruido aleatorio a las curvas de movimiento, les damos más sensación de libertad de movimiento al robot), restricción (un robot no debe volarse la cabeza con su propio brazo, así que es ideal que tenga un poco del sentido de propiocepción).

Otra solución sería la de asignar cada movimiento que queremos hacer en paralelo a un proceso del sistema. Hoy en día, la mayor parte de los sistemas operativos contemplan la posibilidad de la multitarea, así que solo tenemos que crear un nuevo proceso al que le pasaremos qué músculo y cómo y cuándo tiene que moverle. Cuando termine, el proceso terminará de forma normal. Será el propio planificador del sistema operativo el que vaya repartiendo la CPU entre los distintos procesos, dándonos la sensación de que todo se mueve a la vez.

Pero... me temo que el Arduino no viene equipado para eso.
 
Última edición por un moderador:
Otra opción...

De la misma manera que puedes tener un bucle que mueva dos motores para hacer el primer movimiento de las piernas, a continuación puede empezar otro bucle para hacer el segundo movimiento.

Entonces, la idea es meter en el mismo bucle el conjunto de músculos que se moverán a la vez.

¿Puedes detallarnos lo que son uno, dos, tres? ¿Son los valores de los servos, motores?
 
Última edición por un moderador:
Hola de nuevo! :)
Estuve programando y casi me doy por vencido, pero no. Logre que el Robot Bipedo caminara.
Le agradesco sus consejos, y si, claro que arduino no es una plataforma tan potente, pero de repente sorprende.
A continuación dejo el código con lo cual pude:
-Hacer caminar al bipedo(usando subrutinas)
-Mover cuatro servomotores a la vez, o los que me permita arduino, con velocidad variable, editando el delay puedo dejarlo mas lento o mas rapido(se que para muchos programadores el dalay es casi no usado por ser considerado inapropiado, ya que se puede sustituir POR otras variables que no afecten al arduino con pausas), pero en mi caso, no siendo un gran programador, vaya que me ah servido :)

Código:
#include <Servo.h>

Servo pieizq;Servo pieder;Servo rodillaizq;Servo rodillader;Servo caderaizq;Servo caderader;
int posicion;
int uno;int dos;int tres;int cuatro;int cinco;int seis; int cont;
void setup() { 
pieizq.attach(2); pieder.attach(3); rodillaizq.attach(7); rodillader.attach(5); caderaizq.attach(6); caderader.attach(4); 
pieizq.write(90); pieder.write(90); rodillaizq.write(90); rodillader.write(96); caderaizq.write(95); caderader.write(86);
uno=90; dos=90; tres=90; cuatro=96; cinco=95; seis=86;  cont=0;
} 
void loop() {            
  
 
 forward();             
     delay(500);
 forward2();
  delay(500);


////////////////////*******//////////////////////*******////////////////////////*******////////////////////////*******////////////////////////
}
void forward() {                      ////105=pieizq; (antes 105) 110=pieder (antes 120)
while(uno<105){
  uno++;
  dos=uno*1.0476;
  pieizq.write(uno);
  pieder.write(dos);
delay(30);
 }
while(tres>70 && cinco>75){           ////rodillaizq=70; rodillader=76; 
  tres--;
  cuatro=tres*1.0857;
  rodillaizq.write(tres);
  rodillader.write(cuatro);
  
                                      ////caderaizq=75; caderader=66;
   cinco--;
   seis=cinco*0.88;
   caderaizq.write(cinco);
   caderader.write(seis);
delay(25);
 }
////////////////////*******//////////////////////*******////////////////////////*******////////////////////////*******////////////////////////
 }
 void forward2(){
 while(uno>=75){                       //// pieizq(75); pieder(65)
  uno--; 
  dos=uno*1.1538;
  pieizq.write(uno);
  pieder.write(dos);
delay(30);
 }
while(tres<110 && cinco<116){         ////rodillaizq=110; rodillader=116; 
  tres++;
  cuatro=tres*1.0545;
  rodillaizq.write(tres);
  rodillader.write(cuatro);
  
                                     ////caderaizq=115; caderader=106;
   cinco++;
   seis=cinco*0.9217;
   caderaizq.write(cinco);
   caderader.write(seis);
delay(25);
}
////////////////////*******//////////////////////*******////////////////////////*******////////////////////////*******////////////////////////
 }
Con este programa, que es relativamente sencillo, el robot puede caminar sin problema, se mantiene estable, y por lo tanto es una de las tantas subrutinas a las que puedo llamar, y claro, esta era casi la mas importante, caminar xd...
En fin, no quiero contradecir sus opiniones ni nada por el estilo, porque me encantaria usar un ordenador para controlar algo mas grande, no lo hice ya que el proyecto debe ser con programación, y unico, no copiado ni editado. Sino que trato de comunicar a travéz de este foro que es posible con arduino ;)
Se preguntaran la multiplicacion de los numeros, extraños, en este caso dividi el valor del incremento de la variable por la variable a saber(grados a los que quiero que lleguen los servos), y el resultado lo multiplique por la variable del segundo servo.
En sintesis, me apoye en el movimiento de uno para hacer el otro, lo que no se realmente si estara correcto, pero lo dejo a sus opiniones.

Estare subiendo nuevos avances ya que falta la camara...esta en proceso y se aprecia en una imagen, matlab ah dado varios dolores de cabeza pero ya esta saliendo y se los mostrare. :)))
SALUDOS Y MUCHA SUERTE :):D;)
 
Última edición por un moderador:
Que tal amigos del foro, les escribo para dirigirme a ustedes con respeto y preguntarles si conocen como simular un robot bipedo en matlab , y realizar su modelo matemático.
El robot es este http://botscience.net/store/index.php?route=product/product&path=70&product_id=147.

Y la simulacion seria mas o menos asi
pero no se que temas de matlab estudiar para llegar a simular asi con movimiento. Sin mas me despido espero podamos compartir conocimiento gracias.
 
Atrás
Arriba