He estado trabajando en mejorar el comportamiento de la dirección del vehículo. En las últimas entradas comenté que al modificar la velocidad máxima del cliente ya no funcioaba correctamente el control de dirección que venía por defecto, así que diseñé uno desde cero. Una buena solución fue aplicar un controlador P (controlador proporcional) en el vehículo, con lo que se se conseguía un nivel de giro proporcional a la distancia a los bordes:
giro=giro+Kp*error
Tomé como Kp -0.001, después de probar con varios valores. Aunque existen algunas técnicas, en algunas fuentes de bibliografía recomendaban ajustarla a ojo esta constante mediante pruebas.
Este controlador me proporcionaba unos resultados muy aceptables, pero el vehículo tendía a oscilar un poco rectas, y probé con un controlador PD, que estuve informandome sobre su comportamiento y era muy adcuado para suavizar las salidas del sistema (el giro de volante en nuestro caso).
giro=giro+Kp*error+Kd*(error-error_anterior)
En este caso tomé la misma Kp y como Kd -0.01, y los resultados han sido muy buenos, ya que el coche no se ha salido de la calzada en ningún momento en los circuitos probados (óvalos, ciudades y uno real de Montmeló), y no solo eso, sino que además el coche tiende a ir por el centro de la calzada. Y todo ello de forma suave.
domingo, 29 de mayo de 2011
domingo, 22 de mayo de 2011
Ajuste de reglas, corrección de errores y finalización del proyecto
Después de varios meses de desarrollo, ha comenzado la fase final del proyecto. En esta etapa mis objetivos serán los siguientes:
- Desarrollo de una máquina de estados, que nos permitirá seleccionar un conjunto de reglas apropiado a la situación del vehículo.
-------------------------------------------------------------------
En principio tendré 3 estados: Inicial, persecución y adelantamiento.
La transición persecución->adelantamiento se lanzará cuándo el vehículo alcance una buena posición para poder iniciar una maniobra de adelantamiento.
También se tendrá una transición persecución->Inicial si por algún motivo hay que desistir de buscar una posición para adelantar. Esto puede darse por ejemplo si se aproximan curvas cerradas.
La transición adelantamiento->Inicial se activará cuándo se rebase al rival en el adelantamiento.
La transición adelantamiento->persecución se acerca una curva mientras se está rebasando al rival.
Una posible mejora ( que de momento no se aplicará) sería tener distintos modos de conducción (modo conducción agresiva o conducción relajada) que nos permitiese o no hacer maniobras de adelantamiento en curvas.
Ajuste de reglas
--------------------------------------
Esta parte será la que más tiempo de desarrollo requerirá. Consistirá en diseñar el conjunto de reglas para cada uno de los estados.
Ejemplos:
ESTADO INICIAL
0 rival_frente(cerca)->cambio_estado(persecucion)
1 rival_frente(medio)->cambio_estado(persecucion)
ESTADO PERSECUCIÓN
0 huecoMayor(derecha)&posicion_pista(derecha)->cambio_estado(adelantar)
1 huecoMayor(derecha)&posicion_pista(izquierda)->direccion(-0.6)
2 huecoMayor(derecha)&posicion_pista(centro)->direccion(-0.4)
3 huecoMayor(izquierda)&posicion_pista(izquierda)->cambio_estado(adelantar)
4 huecoMayor(izquierda)&posicion_pista(derecha)->direccion(0.6)
5 huecoMayor(izquierda)&posicion_pista(centro)->direccion(0.4)
ESTADO ADELANTAMIENTO
0 entorno(recta)&tiempo_adel(si)->acelerar(1)
1 rival_atras(cerca)->cambio_estado(inicial)
2 rival_atras(medio)->cambio_estado(inicial)
3 entorno(curva)->cambio_estado(persecucion)
4 rival_derecha(si)-> acelerar(1)
5 rival_izquierda(si)-> acelerar(1)
Hay que señalar que estos conjuntos de reglas están diseñados pensando en un solo rival a batir.
En el caso de tener varios rivales, la complejididad del problema de adelantamiento se incrementa sustancialmente.
Finalización de representaciones gráficas
-------------------------------------------
Consistirá en terminar de representar las gráficas que faltan referentes a acciones (aceleración, freno, y marcha).
Corrección de bugs
-----------------------------------------
La aplicación actualmente tiene diversos fallos puntuales, principalmente son sobre refrescos de gráficos. Se hará todo lo posible por corregirlos.
Diseño de un controlador difuso para la tracción del vehículo
----------------------------------------
Si se tiene el suficiente tiempo antes de la finalización del PFC, se diseñará un controlador difuso para la tracción. En principio se iba a diseñar con controlador fuzzy para las marchas, pero no era adecuado este tipo de controlador para esta variable, ya que se trata de una variable discreta, y los sitemas fuzzy son adecuados para variables continuas. Por ello, se decidió que se podría realizar un controlador fuzzy para la tracción, tomando como entradas la velocidad del vehículo y la velocidad objetivo y como salida el nivel de aceleración a aplicar para evitar que patine el coche.
- Desarrollo de una máquina de estados, que nos permitirá seleccionar un conjunto de reglas apropiado a la situación del vehículo.
-------------------------------------------------------------------
En principio tendré 3 estados: Inicial, persecución y adelantamiento.
- El estado inicial será el estado básico, y estará asociado a un conjunto de reglas que se seleccionarán siempre que no haya rivales en un radio cercano.
- El estado persecución tendrá como objetivo buscar un hueco entre el rival y el borde de la calzada que sea mayor que la anchura de nuestro vehículo. El objetivo consistirá en posicionarse en paralelo a dicho hueco.
- El estado adelantamiento consistirá en realizar la maniobra de acelerar en paralelo al rival hasta rebasarlo. Esta maniobra se realizará si nos da tiempo antes de que llegue una curva.
La transición persecución->adelantamiento se lanzará cuándo el vehículo alcance una buena posición para poder iniciar una maniobra de adelantamiento.
También se tendrá una transición persecución->Inicial si por algún motivo hay que desistir de buscar una posición para adelantar. Esto puede darse por ejemplo si se aproximan curvas cerradas.
La transición adelantamiento->Inicial se activará cuándo se rebase al rival en el adelantamiento.
La transición adelantamiento->persecución se acerca una curva mientras se está rebasando al rival.
Una posible mejora ( que de momento no se aplicará) sería tener distintos modos de conducción (modo conducción agresiva o conducción relajada) que nos permitiese o no hacer maniobras de adelantamiento en curvas.Ajuste de reglas
--------------------------------------
Esta parte será la que más tiempo de desarrollo requerirá. Consistirá en diseñar el conjunto de reglas para cada uno de los estados.
Ejemplos:
ESTADO INICIAL
0 rival_frente(cerca)->cambio_estado(persecucion)
1 rival_frente(medio)->cambio_estado(persecucion)
ESTADO PERSECUCIÓN
0 huecoMayor(derecha)&posicion_pista(derecha)->cambio_estado(adelantar)
1 huecoMayor(derecha)&posicion_pista(izquierda)->direccion(-0.6)
2 huecoMayor(derecha)&posicion_pista(centro)->direccion(-0.4)
3 huecoMayor(izquierda)&posicion_pista(izquierda)->cambio_estado(adelantar)
4 huecoMayor(izquierda)&posicion_pista(derecha)->direccion(0.6)
5 huecoMayor(izquierda)&posicion_pista(centro)->direccion(0.4)
ESTADO ADELANTAMIENTO
0 entorno(recta)&tiempo_adel(si)->acelerar(1)
1 rival_atras(cerca)->cambio_estado(inicial)
2 rival_atras(medio)->cambio_estado(inicial)
3 entorno(curva)->cambio_estado(persecucion)
4 rival_derecha(si)-> acelerar(1)
5 rival_izquierda(si)-> acelerar(1)
Hay que señalar que estos conjuntos de reglas están diseñados pensando en un solo rival a batir.
En el caso de tener varios rivales, la complejididad del problema de adelantamiento se incrementa sustancialmente.
Finalización de representaciones gráficas
-------------------------------------------
Consistirá en terminar de representar las gráficas que faltan referentes a acciones (aceleración, freno, y marcha).
Corrección de bugs
-----------------------------------------
La aplicación actualmente tiene diversos fallos puntuales, principalmente son sobre refrescos de gráficos. Se hará todo lo posible por corregirlos.
Diseño de un controlador difuso para la tracción del vehículo
----------------------------------------
Si se tiene el suficiente tiempo antes de la finalización del PFC, se diseñará un controlador difuso para la tracción. En principio se iba a diseñar con controlador fuzzy para las marchas, pero no era adecuado este tipo de controlador para esta variable, ya que se trata de una variable discreta, y los sitemas fuzzy son adecuados para variables continuas. Por ello, se decidió que se podría realizar un controlador fuzzy para la tracción, tomando como entradas la velocidad del vehículo y la velocidad objetivo y como salida el nivel de aceleración a aplicar para evitar que patine el coche.
martes, 17 de mayo de 2011
Experimentos
Últimamente he estado realizando algunos experimentos para calcular la velocidad óptima de cambio de marcha, y también otros experimentos para comprobar que el circuito se reconocía adecuadamente.
El primer experimento consistió en partir de meta en el circuito Villarello Death (circuito tipo óvalo con rectas muy largas) en 1ª, 2ª, 3ª, 4ª , 5ª, 6ª y 7ª marcha y tomar los datos de como íba variando la aceleración. Se observa que inicialmente para cada marcha se tiene una aceleración creciente, luego estable y luego decreciente. La idea era observar el punto en el que se cruzan la aceleración decreciente de una marcha con la aceleración de la siguiente marcha, siendo ese punto la velocidad de cambio de marcha óptima.
Otro de los experimentos cosistió en representar gráficamente los radios de curvatura (calculados mediante geometría y álgebra -detallado hace varias entradas-) que se fuesen reconociendo durante la carrera. Exte experimento se realizó sobre el circuito F-speedway1. Se obtuvieron los siguientes resultados:


Se observa que se reconocieron hasta 3 tipos de curvatura para cada curva del circuito, siendo esto correcto, ya que comprobamos que en el fichero xml de definición del circuito, cada curva se componía de 3 subcurvas cada una en ese circuito. Además, el radio calculado era exactamente el reflejado el el fichero de XML, luego el sistema de detección estaba correctamente diseñado.
El primer experimento consistió en partir de meta en el circuito Villarello Death (circuito tipo óvalo con rectas muy largas) en 1ª, 2ª, 3ª, 4ª , 5ª, 6ª y 7ª marcha y tomar los datos de como íba variando la aceleración. Se observa que inicialmente para cada marcha se tiene una aceleración creciente, luego estable y luego decreciente. La idea era observar el punto en el que se cruzan la aceleración decreciente de una marcha con la aceleración de la siguiente marcha, siendo ese punto la velocidad de cambio de marcha óptima.Otro de los experimentos cosistió en representar gráficamente los radios de curvatura (calculados mediante geometría y álgebra -detallado hace varias entradas-) que se fuesen reconociendo durante la carrera. Exte experimento se realizó sobre el circuito F-speedway1. Se obtuvieron los siguientes resultados:


Se observa que se reconocieron hasta 3 tipos de curvatura para cada curva del circuito, siendo esto correcto, ya que comprobamos que en el fichero xml de definición del circuito, cada curva se componía de 3 subcurvas cada una en ese circuito. Además, el radio calculado era exactamente el reflejado el el fichero de XML, luego el sistema de detección estaba correctamente diseñado.
Suscribirse a:
Entradas (Atom)