Semana 15. Kibotic-Websim
Nos adentramos en la decimoquinta semana del blog. Los retos indicados son:
Trastear con D1
Trastear con D1
Sensores
Sensor de posición
Obtenido a partir de la actualización del motor de físicas.
Sensor | Ubicación |
getPosition | robots\interfacesRobot.js |
Sensor de cámara
En la escena podemos encontrar cámaras que son consideradas sensores y otras que no.
- No sensor
- Cámara con una posición y orientación fija.
- Cámara posicionada tras el coche en todo momento.
- Cámara en primera persona.
- Sensor
- Cámara en primera persona. No se trata de la cámara infrarroja.
- Cámara que apunta al suelo. Se trata de la cámara infrarroja (IR).
Sensor | Ubicación |
getImageData_async() | robots\interfacesRobot.js |
getImageDataIR_async() | robots\interfacesRobot.js |
Sensor de distancia
Uso de raycasting. Basado en bigotes que permiten determinar la distancia entre el coche y el objeto en cuestión.
Sensor | Ubicación |
getDistance() | robots\robotAPI\HALRobotAPI.js |
Motores
Se han de tener en cuenta las maneras del manejo del robot. Por un lado, movimiento en velocidad y, por otro lado, movimiento en posición.
Movimiento en velocidad (investigar)
Determina las velocidades deseadas. Existen dos niveles por debajo.
- Controlador
Se tiene en cuenta la velocidad deseada y, en caso de no alcanzarla se aumenta la fuerza autónoma. Por tanto, traducción velocidad -> fuerza autónoma.
- Motor de físicas
Se trata de la combinación entre la fuerza autónoma del objeto y el motor de físicas de A-frame.
Por ejemplo: Avanza a X velocidad
Movimiento en posición (olvidar)
Tan sencillo como un bucle que busca la llegada a una posición concreta y en caso de que no se haya llegado a la misma se mantiene la velocidad.
Por ejemplo: Avanza X metros + Gira X grados
¿Por donde empezar?
Búsqueda de funciones robotAPI, las invoca el usuario, y búsqueda funciones tick. Por tanto, una vez tenido todo esto en cuenta iniciamos la búsqueda observando en github los motor interfaces.
Método | Descripción |
setV | Establece la velocidad linear |
setW | Establece la velocidad angular |
setL | Establece la velocidad de elevación |
move | Establece la velocidad linear y angular |
getV | Devuelve la velocidad linear dada |
getW | Devuelve la velocidad angular dada |
getL | Devuelve la velocidad de elevación dada |
getRotation | Devuelve la rotación en los ejes |
- robots\robotAPI\HALRobotAPI.js
Definición y exportación de las funciones mencionadas anteriormente.
¿Dónde son exportadas? Concretamente parecen ser exportadas a robots\interfacesRobot.js
robotI(objeto).prototype(permite heredar caracterísitcas).método
Por tanto, me parece que se llega a un camino sin salida.
Controlador
- robots\interfacesRobot.js
Existen 4 controladores PD que se ejecutan en función:
- Ubicación del robot (terrestre vs aereo)
- Movimiento del robot (avance lineal, giro, vuelo o suspensión en el aire)
Drone
- controllerPDVerticalVel
Toma la velocidad deseada y la velocidad entrante del plano vertical en ese instante para generar como salida la fuerza que se debe ejercer para alcanzar la velocidad objetivo.
¿De dónde proviene la velocidad entrante del plano vertical? Realmente no parece tomar una velocidad, ya que la función no tiene parámetros de entrada.
- controllerPDVerticalPos
Toma la componente vertical de posición en ese instante y genera como salida la fuerza que debe ejercer el robot para mantener la posición de referencia. Se usa cuando la velocidad deseada es cero.
Robot terrestre
- controllerPDHorizontal
Toma la velocidad deseada y la velocidad entrante del plano horizontal en ese instante para generar como salida la fuerza que se debe ejercer para alcanzar la velocidad objetivo.
¿De dónde proviene la velocidad entrante del plano horizontal?
- controllerPDAngular
Toma la velocidad deseada de guiñada y la velocidad angular entrante en este instante para generar como salida el torque que debe ejercer el robot para alcanzar la velocidad de giro objetivo.
Motor de físicas
- auxiliaryPhysics
Función que materializa el motor complementario y se ejecuta cada 20ms gracias al timeout que se añade al final de la misma.
¿Cúando se ejecuta el motor de CANNON?
Actualiza sus físicas en cada iteración del bucle de renderizado de Aframe. Se ha calculado el número de veces que se ejecuta el código CANNON entre dos iteraciones del motor de físicas complementario para poder realizar una correcta combinación entre ambos. El motor complementario deberá aplicar en cada iteración un aceleración X veces superior a la que corresponde, siendo X el número de veces que ha entrado CANNON desde la última vez que se ejecuto el motor complementario.
Aceleración aútonoma = iteracionesCANNON * aceleración calculada
El cómputo de las iteraciones de CANNON se ha realizado creando un nuevo componente auxiliar que hace incrementar un contador por cada tick de renderizado que ejecuta Aframe.
Variables y funciones añadidas para llevar a cabo lo anterior:
- tickCounter
- getTickCounter
- setTickCounter
Hemos de registrarlo como un componente Aframe. ¿Dónde se encuentra ubicado?
-
var interationsObj: se trata de un contador, pero no coincide con el código dado por Natalia en su TFG.Ubicado en simulation\aframe-components\renderInterationsCompone.js
-
function extendAframe: se trata del registro del componente. Ubicado en simulation\function.js
A parte de esto no encuentro otro punto en el que se hable de motor CANNON, quizás en la definición de la gravedad (encontrado en config_parser).
Sensores y actuadores
Una vez localizados los sensores y actuadores hemos de ser capaces de modificarlos y provocar cambios. Por ejemplo, el sensor getPosition otorga datos de posición a otras funciones encontradas en HALRobotAPI.js. Existe una función denominada printConsole(texto, robotI) encontrada en robots\robotAPI\consoleRobotAPI.js que me permitira observar los valores. ¿Cómo funciona? Existen dos modos de funcionamiento:
-
Indicar en el editor la función printConsole().
pos = await myRobot.getPosition();
await myRobot.printConsole(pos.x); await myRobot.printConsole(pos.y); await myRobot.printConsole(pos.z); await myRobot.printConsole(pos.theta); -
Uso de console.log() en el código fuente y llamar a la función printConsole() en el editor.
await myRobot.getPosition();
Tras modificar los valores que devuelve getPosition() he observado mediante los métodos anteriores que estos son recibidos por el resto de funciones, pero al no comprender exactamente como funcionan no puedo saber que esta ocurriendo.