La idea del simulador es muy simple:
En función de la velocidad de los motores hay que calcular la trayectoria del robot.
Lo ideal sería poder calcular en cada instante de tiempo (un infinitésimo) pero en la realidad generalmente es suficiente con poder hacer el cálculo unas cuantas veces por segundo.
Cuantas mas veces por segundo, el movimiento visualizado va a ser mas suave y agradable a la vista. En cine se utlizan 24 cuadros por segundo. Otras frecuencias normalmente utilizadas para que sean agradables a la vista son 25 y 30 cuadros por segundo. Una cosa es que sea agradable a la vista y otra que sea matemáticamente exacto.
Como se trata de un simulador, no va a ser exactamente igual, pero si, bastante parecido.
En el post anterior, indiqué que yo pretendía llegar a 50 pasos de simulación por segundo.. pero mBlock parece tener su base de tiempos en el orden de los 30/31 pasos por segundo. No he podido ir más rápido que eso.
mBot no tiene las medidas que tiene por casualidad, la distancias entre las ruedas son dos veces su diámetro, y con estas medidas las ecuaciones que predicen su movimiento quedan muy simples:
Giro = vM1 - vM2
Desplazamiento = (vM1 + vM2)/2
Para ser más correcto deberían estar multiplicadas por dt (delta tiempo).
Como estas ecuaciones se calculan 30/31 veces por segundo nuestro dt es de aproximadamente 0.032 segundos.
vM1 y vM2 son las velocidades de los motores 1 y 2 (izquierdo y derecho respectivamente)
Un paso de simulación es realmente muy simple:

Arbitrariamente, decidí que los obstáculos son de color Rojo, tanto para el sensor de ultrasonido como para el robot físico. Así, luego de calcular cuanto hay que mover el robot y cuanto hay que girarlo, si luego de este movimiento, el robot está tocando Rojo, deshago el movimiento.
Como consecuencia de esto, no vemos que el robot se mueva. Entonces, si en su trayectoria hay un elemento de color Rojo, se detiene, como si hubiera colisionado.
Si se desea, en vez de deshacer el movimiento, se podría aplicar alguna regla de física 2D para por ejemplo intentar simular el comportamiento de forma mas realista... pero, cualquier intento de realizar esto va a llevar a un código mas complejo y mi intención es mantener la simulación lo mas simple posible: KISS (keep it super simple
.
El paso de simulación que estoy utilizando, incluye contadores de pasos por segundo y llamados a la rutina de simulación, lo cual hace que aparente ser mas complejo:

Pero es idéntico al primero.
Con los bloques básicos del post anterior y este código ya tenemos lo fundamental del simulador en lo que a movimientos respecta.
Antes de invocar constantemente esté código hay que hacer una inicialización simple:

Por comodidad, he agregado funcionalidad a algunas teclas:

Movimiento:
flechas
arriba/abajo: avanzar/retroceder a velocidad 60
izquierda/derecha: girar a izquierda/derecha a velocidad 60
espacio: detener motores
teclas numéricas 1 y 2: fijan velocidad en un solo motor, razón por la cual el robot en vez de girar sobre su centro de eje, va a girar apoyado sobre la rueda de velocidad 0.
Tecal r: reposicionar el objeto mBot a las coordenadas 0,0 de pantalla (centro) y en dirección 0 (apuntando hacia arriba)
Tecla s: bascular la variable simActivo
Como he indicado, practicamente todos los bloques implementados tienen en cuenta si el simulador está o no activo. En caso de estarlo, se simula el movimiento y los sensores de siguelineas y ultrasonido, si el simulador no está activo, entonces, se envían los comandos al robot equivalentes.
Esto permitiría, simular y luego pulsando la tecla s, pasar a controlar al robot sin realizar ningún cambio en el programa.
Para finalizar esta breve descripción, si realizáramos el siguiente bucle:
Deberíamos poder mover el robot y ver el valor reportado por el siguelineas y el sensor de ultrasonido:

Los siguentes bloques son auxiliares: simReposicionar (invocado al pulsar la tecla r) y simEsperar, que debería utilizarce en vez del bloque esperar (naranja) de la paleta de control. Este bloque, realiza una espera, basada en el cronómetro y se encarga de continuar invocando los pasos de simulación mientras se espera:

Por ejemplo, para ralizar ciertos movimientos simples como avanzar, esperar, girar esperar etc, para que el simulador ralice su tarea, hay que utilizar simEsperar:

La descripción de la implementación de los sensores queda para un post próximo...
Juan Ignacio
La idea del simulador es muy simple:
````
En función de la velocidad de los motores hay que calcular la trayectoria del robot.
````
Lo ideal sería poder calcular en cada instante de tiempo (un infinitésimo) pero en la realidad generalmente es suficiente con poder hacer el cálculo unas cuantas veces por segundo.
Cuantas mas veces por segundo, el movimiento visualizado va a ser mas suave y agradable a la vista. En cine se utlizan 24 cuadros por segundo. Otras frecuencias normalmente utilizadas para que sean agradables a la vista son 25 y 30 cuadros por segundo. Una cosa es que sea agradable a la vista y otra que sea matemáticamente exacto.
Como se trata de un simulador, no va a ser exactamente igual, pero si, bastante parecido.
En el post anterior, indiqué que yo pretendía llegar a 50 pasos de simulación por segundo.. pero mBlock parece tener su base de tiempos en el orden de los 30/31 pasos por segundo. No he podido ir más rápido que eso.
mBot no tiene las medidas que tiene por casualidad, la distancias entre las ruedas son dos veces su diámetro, y con estas medidas las ecuaciones que predicen su movimiento quedan muy simples:
````
Giro = vM1 - vM2
Desplazamiento = (vM1 + vM2)/2
````
Para ser más correcto deberían estar multiplicadas por dt (delta tiempo).
Como estas ecuaciones se calculan 30/31 veces por segundo nuestro dt es de aproximadamente 0.032 segundos.
vM1 y vM2 son las velocidades de los motores 1 y 2 (izquierdo y derecho respectivamente)
Un paso de simulación es realmente muy simple:

Arbitrariamente, decidí que los obstáculos son de color Rojo, tanto para el sensor de ultrasonido como para el robot físico. Así, luego de calcular cuanto hay que mover el robot y cuanto hay que girarlo, si luego de este movimiento, el robot está tocando Rojo, deshago el movimiento.
Como consecuencia de esto, no vemos que el robot se mueva. Entonces, si en su trayectoria hay un elemento de color Rojo, se detiene, como si hubiera colisionado.
Si se desea, en vez de deshacer el movimiento, se podría aplicar alguna regla de física 2D para por ejemplo intentar simular el comportamiento de forma mas realista... pero, cualquier intento de realizar esto va a llevar a un código mas complejo y mi intención es mantener la simulación lo mas simple posible: KISS (keep it super simple :).
El paso de simulación que estoy utilizando, incluye contadores de pasos por segundo y llamados a la rutina de simulación, lo cual hace que aparente ser mas complejo:

Pero es idéntico al primero.
Con los bloques básicos del post anterior y este código ya tenemos lo fundamental del simulador en lo que a movimientos respecta.
Antes de invocar constantemente esté código hay que hacer una inicialización simple:

Por comodidad, he agregado funcionalidad a algunas teclas:

**Movimiento**:
flechas
**arriba/abajo**: avanzar/retroceder a velocidad 60
**izquierda/derecha**: girar a izquierda/derecha a velocidad 60
**espacio**: detener motores
**teclas numéricas 1 y 2**: fijan velocidad en un solo motor, razón por la cual el robot en vez de girar sobre su centro de eje, va a girar apoyado sobre la rueda de velocidad 0.
**Tecal r**: reposicionar el objeto mBot a las coordenadas 0,0 de pantalla (centro) y en dirección 0 (apuntando hacia arriba)
**Tecla s**: bascular la variable simActivo
Como he indicado, practicamente todos los bloques implementados tienen en cuenta si el simulador está o no activo. En caso de estarlo, se simula el movimiento y los sensores de siguelineas y ultrasonido, si el simulador no está activo, entonces, se envían los comandos al robot equivalentes.
Esto permitiría, simular y luego pulsando la tecla s, pasar a controlar al robot sin realizar ningún cambio en el programa.
Para finalizar esta breve descripción, si realizáramos el siguiente bucle:
Deberíamos poder mover el robot y ver el valor reportado por el siguelineas y el sensor de ultrasonido:

Los siguentes bloques son auxiliares: simReposicionar (invocado al pulsar la tecla r) y simEsperar, que debería utilizarce en vez del bloque esperar (naranja) de la paleta de control. Este bloque, realiza una espera, basada en el cronómetro y se encarga de continuar invocando los pasos de simulación mientras se espera:

Por ejemplo, para ralizar ciertos movimientos simples como avanzar, esperar, girar esperar etc, para que el simulador ralice su tarea, hay que utilizar simEsperar:

La descripción de la implementación de los sensores queda para un post próximo...
Juan Ignacio