lunes, 25 de abril de 2011

Cálculo de huecos para adelantamientos

Una de las últimas mejoras en las que he podido progresar ha sido la detección de la zona por la que hay hueco suficiente para poder adelantar.
Para diseñar esta mejora he necesitado aplicar bastante trigonometría:

En esta imagen he representado cómo se calcularía la distancia del oponente al borde izquierdo (para el cálculo al borde derecho sería similar). Supongamos que la zona negra de la imagen es una carretra recta, el rectángulo rojo nuestro vehículo, y el círculo rojo un oponente. Nuestro objetivo es calcular la distancia D_op_b (distancia desde el oponente al borde). Para calcular, básicamente lo que hay que hacer es hallar la diferencia entre D_total (distancia desde nuestro coche al borde) y D_op_x (distancia desde nuestro vehículo al oponente). El problema surge en el cálculo de cada distancia, ya que no es tan simple como pueda parecer, porque entra en juego la variable alpha (ángulo respecto al eje de la pista).
En primer lugar calculamos la D_total; para ello tomamos la distancia proporcionada por S0 (S18 en el caso del cálculo de la distancia del oponente al borde derecho) y la multiplicamos por el coseno de alpha: D_total=S0*cos(Cº). Notar que C=alpha. A continuación necesitamos calcular D_op_x, y para ello necesitamos el ángulo bº. Este ángulo se obtiene mediante la fórmula :

b=( (S_oponente*10) - s.getAngleToTrackAxis())-90

(suponiendo las unidades en grados y siendo S_oponente el índice del sensor que nos ha detectado un oponente).

Una vez que hemos calculado b, podemos cacular D_op_x.

D_op_x=abs( dist_op*cos(b) )

Finalmente, tenemos que calcular si el oponente está a nuestra derecha o izquierda, para sumar o restar el valor D_op_x a D_total. Para realizar este cálculo, previamente tenemos que saber cuál es nuestro "sensor de referencia", esto es, qué sensor está paralelo al eje de la carretera. Esto se calcula fácilmente con la fórmula

referencia=18-(int)(Math.toDegrees(s.getAngleToTrackAxis())/10);

Una vez que sabemos cual es este sensor de referencia, simplemente tenemos que comprobar si el sensor dónde está el oponente tiene un índice menor o mayor. Si el índice es menor, entonces el oponente está a nuestra izquierda, y si es mayor, está a nuestra derecha.

En el caso de que esté a la izquierda, D_op_b =D_total-d_op_x
En el caso de que esté a la derecha, D_op_b =D_total+d_op_x

Con esto, ya tenemos calculado el "hueco", dato que nos servirá para comprobar si nuestro coche es mayor que dicho hueco, y en caso de que sea el mayor hueco que se haya detectado, podríamos plantearnos adelantar si se dan las condiciones (por ejemplo, que nos de tiempo de adelantar antes de llegar a una curva).

En siguientes entradas continuaré ampliando los progresos y trataré con más detalle aspectos que se comentaron en entradas anteriores.

1 comentario:

  1. Llevo dándole vueltas un tiempo a esto... y la clave creo que está en este libro: "Vehicles: Experiments in Synthetic Psychology" de V. Braitenberg.

    Si quieres buscar algo en Google busca: vehículos de braitemberg

    En realidad es una simplificación del tema de "los potenciales". La idea es que la fuerza que se manda a cada rueda es una función directa de lo que perciben los sensores.
    Se puede hacer una primera composición de esa fuerza... y experimentar un poco!...

    Lo vemos más detenidamente el martes!
    Gonzalo

    ResponderEliminar