Entorno de desarrollo Xfuzzy 3

Herramienta de simulación - Xfsim

La herramienta xfsim está dirigida a estudiar sistemas realimentados. Para ello la herramienta realiza la simulación del comportamiento del sistema difuso conectado a una planta o proceso externo. La herramienta puede ser ejecutada desde la línea de comandos mediante la expresión "xfsim file.xfl [file.cfg]", o desde la ventana principal del entorno con la opción "Simulation" del menú Verification.

La ventana principal de xfsim se muestra en la figura. La configuración del proceso de simulación se realiza en la parte izquierda de la ventana, mientras que la parte de la derecha muestra el estado del sistema realimentado. La parte inferior de la ventana contiene una barra de botones con las opciones "Load", "Save", "Run/Stop", "Reload" y "Close". La primera opción se utiliza para cargar una configuración para el proceso de simulación. La segunda salva la configuración actual en un fichero externo. La opción Run/Stop permite iniciar y parar el proceso de simulación. La opción Reload descarta la configuración actual y reinicia la herramienta. La última opción se emplea para salir de la herramienta.

La configuración del proceso de simulación se realiza seleccionando el modelo de la planta conectada al sistema difuso y sus valores iniciales, las condiciones de fin de simulación y la lista de las salidas que se desean obtener del proceso de simulación. Estas salidas pueden consistir en ficheros de log, para almacenar los valores de las variables seleccionadas, y representaciones gráficas de estas variables. La descripción del estado de la simulación contiene el número de iteraciones, el tiempo trascurrido desde el inicio de la simulación, los valores de las variables de entrada del sistema difuso (que representan el estado de la planta) y los valores de las variables de salida del sistema difuso (que representan la acción del sistema difuso sobre la planta).

La planta conectada al sistema difuso es descrita mediante un fichero con extensión '.class' que debe contener el código binario Java de una clase que describa el comportamiento de la planta. Esta clase debe implementar la interfaz xfuzzy.PlantModel cuyo código se muestra a continuación:

package xfuzzy;

public interface PlantModel {
 public void init() throws Exception;
 public void init(double[] state) throws Exception;
 public double[] state();
 public double[] compute(double[] x);
} 

La función init() se utiliza para inicializar la planta con sus valores por defecto. Debe generar una excepción cuando estos valores no están definidos o no pueden ser asignados a la planta. La función init(double[]) se emplea para fijar los valores iniciales del estado de la planta a los valores seleccionados. También debe generar una excepción cuando estos valores no puedan ser asignados a la planta. La función state() devuelve los valores del estado de la planta (que corresponden a las variables de entrada del sistema difuso). Por último, la función compute (double[]) modifica el estado de la planta según los valores de las variables de salida del sistema difuso. Es responsabilidad del usuario escribir y compilar esta clase Java.

La definición de una planta mediante una clase Java proporciona una gran flexibilidad para describir sistemas externos. El modo más simple consiste en describir un modelo matemático de la evolución de la planta a partir de su estado y de los valores de salida del sistema difuso. En este esquema, las funciones init y state asignan y devuelven, respectivamente, los valores de las variables de estado internas, mientras que la función compute implementa el modelo matemático. Un esquema más complejo consiste en usar una planta real conectada al ordenador (usualmente mediante una tarjeta de adquisición de datos). En este caso, la función init debe inicializar el sistema de adquisición de datos, la función state debe capturar el estado actual de la planta y la función compute debe escribir la acción de control en la tarjeta de adquisición de datos y capturar el nuevo estado de la planta.

La configuración del proceso de simulación también requiere la introducción de alguna condición de finalización. La ventana que permite seleccionar dichas condiciones contiene un conjunto de campos con los valores límite de las variables de estado de la simulación.

El estado inicial de la planta se describe usando la siguiente ventana que contiene el conjunto de campos relacionados con las variables de la planta.

Además de permitir almacenar los resultados de simulación en ficheros de log, la herramienta xfsim puede proporcionar representaciones gráficas de los procesos de simulación. Como es habitual, la tecla Insert se utiliza para introducir una nueva representación. Para ello se abre una ventana que pregunta por el tipo de representación: gráfica o fichero de log. La ventana para definir un fichero de log posee un campo para seleccionar el nombre del fichero y algunos botones para elegir las variables que serán almacenadas.

La ventana utilizada para definir una representación gráfica contiene dos listas desplegables para seleccionar las variables asignadas a los ejes X e Y, así como una serie de botones para elegir el estilo de representación.

La configuración del proceso de simulación puede ser salvada en un fichero externo y cargada desde un fichero previamente almacenado. El contenido de este fichero se compone de las siguientes directivas:

xfsim_plant("filename")
xfsim_init(value, value, ...)
xfsim_limit(limit & limit & ...)
xfsim_log("filename", varname, varname, ...)
xfsim_plot(varname, varname, style) 

La directiva xfsim_plant contiene el nombre del fichero que almacena el código binario Java que describe la planta. La directiva xfsim_init contiene los valores del estado inicial de la planta. Si esta directiva no aparece en el fichero de configuración se asume para el estado inicial los valores por defecto. La directiva xfsim_limit contiene la definición de las condiciones de fin de simulación, expresadas como un conjunto de límites separados por el carácter &. El formato de cada límite es "variable < valor" para los límites superiores y "variable > valor" para los inferiores. Los ficheros de log se describen mediante la directiva xfsim_log, que incluye el nombre del fichero de log y la lista de las variables que van a ser almacenadas. Las representaciones gráficas se definen mediante la directiva xfsim_plot, que incluye los nombres de las variables asignadas a los ejes X e Y y el estilo de representación. Un cero como valor de estilo significa gráfica con líneas; el valor 1 indica gráfica con puntos; el valor 2 hace que la gráfica utilice cuadrados; los valores 3, 4 y 5 indican el uso de círculos de diferentes tamaños.

La siguiente figura muestra un ejemplo de una clase Java que implementa el modelo de planta de un vehículo. Este modelo puede conectarse al sistema difuso Backward incluido entre los ejemplos de Xfuzzy. El estado del vehículo es almacenado en la variable interna state[]. La función init asigna los valores iniciales a los componentes del estado: la primera componente es la posición X; la segunda es la orientación del vehículo frente a una dirección de referencia (phi); la tercera es la posición Y; la última contiene el valor actual del ángulo de giro de las ruedas (gamma). Estas componentes corresponden a las variables de entrada del sistema difuso. La función state devuelve el valor de las variables internas. La dimánica del vehículo se describe mediante la función compute. Las entradas a esta función son las variables de salida del sistema difuso. val[0] contiene el valor objetivo de la variable gamma (gref), mientras que val[1] contiene el valor de la variable de salida de la primera base de reglas del sistema (alpha), que no es utilizado en el modelo. El cambio en el ángulo de giro del vehículo no se produce de forma instantánea, sino que presenta una cierta inercia caracterizada por una constante de tiempo definida en el modelo. En cada iteración, el nuevo valor de la variable gamma provoca un cambio en el ángulo de orientación y la posición del vehículo.

import xfuzzy.PlantModel;

public class RomeoModelBack implements PlantModel {
 private double x;
 private double y;
 private double phi;
 private double gamma;

 public RomeoModelBack() {
 }

 public void init() {
  x = 0;
  phi = 0;
  y = 0;
  gamma = 0;
 }

 public void init(double val[]) {
  x = val[0];
  phi = val[1]*Math.PI/180;
  y = val[2];
  gamma = val[3];
 }

 public double[] state() {
  double state[] = new double[4];
  state[0] = x;
  state[1] = phi*180/Math.PI;
  state[2] = y;
  state[3] = gamma;
  return state;
 }

 public double[] compute(double val[]) {
  double LAPSE = 0.1;
  double P_TAU = 0.5; 
  double v = -1.0;
  double t = 0.0;
  double gref = 1.0*val[0];
  double oldgamma = gamma;

  for(t=0.0; t <= LAPSE; t+=0.001) {
    x += v*Math.sin(phi)*0.001;
    y += v*Math.cos(phi)*0.001;
    phi += v*gamma*0.001;
    if( phi > Math.PI) phi -= 2*Math.PI;
    if( phi < -Math.PI) phi += 2*Math.PI;
    gamma = gref + (oldgamma-gref)*Math.exp(-t/P_TAU);
    if( gamma > 0.4) gamma = 0.4;
    if( gamma < -0.4) gamma = -0.4;
   }
  return state();
 }
} 

Una vez descrito el modelo de la planta, el usuario debe compilarlo para generar el fichero binario .class. Es necesario tener en cuenta que la variable de entorno CLASSPATH debe contener el camino (path) de la definición de la interfaz. Por tanto CLASSPATH debe incluir la ruta "base/xfuzzy.jar", donde base hace referencia al directorio de instalación de Xfuzzy. (Nota: en MS-Windows el path debe incluir la ruta "base\xfuzzy.jar").

Las siguientes gráficas muestran las trayectorias seguidas por el vehículo cuando inicia el aparcamiento con diferentes condiciones iniciales.

x = 0, y = 7, phi = 170

x = 6, y = 6, phi = -45

x = -10, y = 3, phi = 0

Para comentarios, sugerencias, notificación de bugs, etc. contacte con nosotros en:   xfuzzy-team@imse-cnm.csic.es

©IMSE-CNM 2018