NXT-G jump/land

Iniciado por Jetro, 02 de Octubre de 2007, 19:46:13 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Jetro

Trabajando con RoboLab aprendí a usar los iconos de 'jump' y 'land' para conseguir hacer bucles, pero en NXT-G estos iconos no paracen estar diponibles. Existe otro icono para bucle, pero no me permite hacer lo que quiero: saltar de una rama a otra.

Me explico: tengo montado el Alpha-Rex, he hecho los 'ejercicios' y ahora quiero algo mas. quiro que

1) camine sin parar
2) cuando encuentre un obstáculo con el sensor de ultrasonido (US) pare mientras siga allí el obstáculo
3) cuando le llamen la atención (micrófono: MIC) se pare, gire y siga su camino

De momento puedo hacer cada cosa por individual, o sequencialmente, pero no consigo que, después de ejecutar la subrutina del US o MIC vuelva al inicio del programa.

En NQC (aún no me he puesto con NXC) lo haría mas o menos así:

CitarTask main()
{
  start US_probe()
  start MIC_probe()
  start walk() // tres subroutines para tener cada tarea por separado
}

sub US_probe()
{
  while (SENSOR_1 > 40)
    {
    stop MIC_probe()
    stop walk() //parar las otras tareas para evitar interferencias
    }
  start walk()
  start MIC-probe() //reiniciarlas después de haber hecho la parada
}

sub walk()
{
  While (true)
  {
    OnFw (OUT_A+OUT_C)
  }
}
etc...

Koldo

El jump y land se sustituyen por el loop, de hecho, el salto de un bucle a otro es lago no permitido en programación, además  que rompe toda estructura. El que se haya transformado en el modelo actual facilita mucho la programación.
En tu programa deberías meter las tres tareas que comprende la task main en un bucle tipo

Task main()
{
  While (true)   
  {
    start US_probe()
    start MIC_probe()
    start walk() // tres subroutines para tener cada tarea por separado
   }
}

Porque sino el programa finaliza.

Y si lo que pretendes es que lo haga todo de modo simultaneo en lugar de subrutinas utiliza tareas que de ese modo se ejecutarán a la vez y controlará los dos sensores en paralelo

Jetro

gracias por el while (true), se me había pasado.

Lo que quiero conseguir es precisamente lo contrario. Quero evitar que, una vez iniciada una rutina por lectura de sensor otra lectura la pueda interrumpir. Y aunque lo puedo hacer en NQC (o NXC) quisiera saber como hacerlo en NXT-G.

Otra cosa que no acabo de pillar en NXT-G es como conseguir que dos motores hagan dos movimiento contrarios a la vez. Si pongo dos bloques de motor se ejecuta uno detras de otro, nunca de forma paralela, pero supón que quiro algo como

OnFwd (OUT_A, 75);
OnRev (OUT_C, 100);

¿como lo hago en NXT-G?

Koldo

Para lo primero desde una  tarea puedes  interrumpir otra con un stop task
y para lo  segundo, lo de los motores, hice un intento con tareas pero sin  mucho éxito

Jetro

Cita de: Jetro en 06 de Octubre de 2007, 00:00:44 AM
gracias por el while (true), se me había pasado.

Pensandolo bien el While(true) me sobra: cada tarea apaga las demaś y los vuelve a iniciar por lo que las tareas mismas proporcionan el bucle indefinido.

Voy a ver lo del 'Stop Task en NXT-G. Ya te contaré.