Implementación en Matlab de sistemas de control de vuelo on-line para FlightGear

De ISAwiki


En esta página se describe cómo diseñar un sistema de control de vuelo on-line para el simulador de vuelo de código abierto FlightGear.

Tabla de contenidos

Habilitación del acceso a las variables de vuelo

Para poder diseñar sistemas de control de vuelo es necesario tener acceso (de lectura y/o escritura) a variables del simulador. Esto es posible a través del árbol de propiedades de FlightGear, que es accesible a través del localhost en el puerto que se especifica a través de la instrucción en línea de comandos. Por ejemplo, puede habilitarse en el puerto 5400 invocando a FlightGear con las siguientes opciones:

Opciones en FlightGear

Una vez ejecutado, el árbol de propiedades estará accesible vía http (con cualquier navegador) en localhost el en el puerto seleccionado

Acceso al arbol de propiedades de FlightGear desde un navegador

Acceso a las variables de vuelo desde Matlab

Acceso de lectura

Aunque existen procedimientos más eficientes, una vez habilitado el acceso vía http se puede acceder desde matlab (versión 7) a cualquier propiedad utilizando la función urlread(url) para leer la página dinámica generada por el simulador y luego "parseándola" mediante expresiones regulares para quedarnos con el valor de la variable. Por ejemplo, para leer el valor y de la altitud

function v = fg_leer(url)
% FG_LEER Lee una variable del árbol de variables de FlightGear
%
%
% ENTRADAS
%    url: Dirección url de la variable (string)
%
% SALIDAS
%      v: Valor de la variable tras la consulta (float)
%
% DESCRIPCION
% Lee una variable de FlightGear a partir de la
% dirección url de la variable en el árbol de propiedades (disponible en
% localhost en el puerto que se haya indicado en la opcion de línea de
% comandos del programa principal de FlightGear). 
%
%
% Algunas URL típicas (usando como opción '--httpd=5400' al llamar a
% FlightGear)
%
%   http://localhost:5400/orientation/roll-deg
%   http://localhost:5400/controls/flight/aileron
%   http://localhost:5400/controls/flight/elevator
%   http://localhost:5400/position/altitude-ft
%
%
% La estructura completa del árbol de propiedades puede consultarse en:
% 
%    http://wiki.flightgear.org/flightgear_wiki/index.php?title=Property_Tree  
%
% Copyright (c) 2007 Ignacio Diaz Blanco
% Contributed files may contain copyrights of their own.
% 
%     This function is free software; you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation; either version 2 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%     GNU General Public License for more details

s = urlread(url);
[ini,fin]=regexp(s,'value="-?\d+.?\d+"');
v = str2num(s(ini+7:fin-1));

Acceso de escritura

El acceso de escritura puede hacerse utilizando la sintaxis del protocolo http. Por ejemplo, para asignar un valor u a la posición del elevador

function fg_escribir(url,v)
% FG_LEER Escribe una variable del árbol de variables de FlightGear
%
%
% ENTRADAS
%    url: Dirección url de la variable (string)
%      v: Valor de la variable que se quiere escribir (float)
%
%
% DESCRIPCION
% Escribe una variable de FlightGear dada la
% dirección url de la variable en el árbol de variables (disponible en
% localhost en el puerto que se haya indicado en la opcion de línea de
% comandos del programa principal de FlightGear). 
%
%
% Algunas URL típicas (usando como opción '--httpd=5400' al llamar a
% FlightGear)
%
%   http://localhost:5400/orientation/roll-deg
%   http://localhost:5400/controls/flight/aileron
%   http://localhost:5400/controls/flight/elevator
%   http://localhost:5400/position/altitude-ft
%
% La estructura completa del árbol de propiedades puede consultarse en:
% 
%    http://wiki.flightgear.org/flightgear_wiki/index.php?title=Property_Tree  
%
%
% Copyright (c) 2007 Ignacio Diaz Blanco
% Contributed files may contain copyrights of their own.
% 
%     This function is free software; you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation; either version 2 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%     GNU General Public License for more details.

s = [url '?value=' num2str(v)];
urlread(s);

Control

(thumbnail)
Pantallazo del sistema de control de vuelo de un F16 en funcionamiento

Mediante estos procedimientos es posible acceder, tanto para lectura como para escritura, a cientos de variables de vuelo disponibles en el árbol de propiedades. La principal limitación de esta forma de acceso es el tiempo de acceso. De forma orientativa, es posible conseguir dos lazos SISO independientes (leer dos variables y escribir otras dos) con periodos de muestreo del orden de 1 segundo. Esto es más que suficiente para desarrollar sistemas de control de altitud, inclinación, etc. ya que las dinámicas del avión son bastante más lentas.

A continuación un script de ejemplo que permite hacer dos lazos de control PID desacoplados de altitud y alabeo:

% EJEMPLO DE SISTEMA DE CONTROL DE ALTITUD E INCLINACIÓN LATERAL PARA FLIGHTGEAR
%
%
%
%
% Copyright (c) 2007 Ignacio Diaz Blanco
% Contributed files may contain copyrights of their own.
% 
%     This script is free software; you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation; either version 2 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%     GNU General Public License for more details.


% INICIALIZACIÓN DE LAS VARIABLES DE LOS LAZOS DE CONTROL
figure(1); 
y1 = zeros(1,1000);
e1 = zeros(1,1000);
u1 = zeros(1,1000);
r1 = zeros(1,1000);

y2 = zeros(1,1000);
e2 = zeros(1,1000);
u2 = zeros(1,1000);
r2 = zeros(1,1000);



combustible = zeros(1,1000);

% DIRECCIONES URL DE LAS VARIABLES DE VUELO
altitud  = 'http://localhost:5400/position/altitude-ft';
giro     = 'http://localhost:5400/orientation/roll-deg';
aleron   = 'http://localhost:5400/controls/flight/aileron';
elevador = 'http://localhost:5400/controls/flight/elevator';
propulsor= 'http://localhost:5400/controls/engines/engine/throttle';

fg_escribir(propulsor,1);


% REFERENCIAS
r1 = [1000*ones(1,100) 3000*ones(1,900)]; % (square(0.02*2*pi*(1:1000))+2)*1300;       % Referencia de altitud
r2 = [0*ones(1,200) 40*ones(1,800)];        % Referencia de inclinación

iy = 0;
t = 0;
tic;
for k = 2:1000,
    
    % ESTIMACIÓN DEL PERIODO DE MUESTREO 
    % Estimamos el periodo de muestreo real, ya que éste puede ser
    % variable.
    t_ = t;
    t  = toc;
    Tm = t-t_;
    
    % CONTROL DE ALTITUD
    Kp = 0.0002;
    Kd = 0.002;
    Ki = 0.00002;
    
    y1(k) = fg_leer(altitud);
    e1(k) = r1(k)-y1(k);
    dy    = (y1(k)-y1(k-1))/Tm;     % Derivada de la variable de salida 
                                    % (el derivador lo ponemos en la realimentación)
    iy    = iy + e1(k)*Tm;          % Integral del error
    
    u1(k) = Kp*e1(k) + Ki*iy - Kd*dy;    
    u1(k) = -satlins(u1(k));
    fg_escribir(elevador,u1(k));
    
    
    % CONTROL DE GIRO
    Kp = 0.003;
    Kd = 0.001;
    
    y2(k) = fg_leer(giro);
    e2(k) = r2(k)-y2(k);
    dy    = (y2(k)-y2(k-1))/Tm;
    u2(k) = Kp*e2(k) - Kd*dy;
    u2(k) = satlins(u2(k));
    fg_escribir(aleron,u2(k));

    
    % MONITORIZACIÓN
    subplot(411); 
    plot(r1(1:k)); hold on;
    plot(y1(1:k),'r:'); hold off;
    title('altitud (pies)');
    subplot(412);
    plot(u1(1:k));
    title('aleron');
    subplot(413); 
    plot(r2(1:k)); hold on;
    plot(y2(1:k),'r:'); hold off;
    title('inclinación lateral (º)');
    subplot(414);
    plot(u2(1:k));
    title('alerones');
    drawnow;
    
    % ALMACENAR EL CONSUMO DE COMBUSTIBLE PARA MONITORIZAR DESPUÉS SU EVOLUCIÓN
    combustible(k) = fg_leer('http://localhost:5400/consumables/fuel/tank/level-gal_us');
end;

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Tipos de páginas
Bloques temáticos
Herramientas