4 minute read

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
  1. Cámara con una posición y orientación fija.
  2. Cámara posicionada tras el coche en todo momento.
  3. Cámara en primera persona.
  • Sensor
  1. Cámara en primera persona. No se trata de la cámara infrarroja.
  2. 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:

  1. Ubicación del robot (terrestre vs aereo)
  2. 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:

  1. tickCounter
  2. getTickCounter
  3. setTickCounter

Hemos de registrarlo como un componente Aframe. ¿Dónde se encuentra ubicado?

  1. 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

  2. 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:

  1. 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);

  2. 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.