Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

kalman

Diseñar un filtro de Kalman para la estimación de estados

    Descripción

    ejemplo

    [kalmf,L,P] = kalman(sys,Q,R,N) crea un filtro de Kalman dado el modelo de planta sys y de los datos de covarianza de ruido Q, R y N. La función calcula un filtro de Kalman para utilizar en un estimador de Kalman con la configuración que se muestra en el siguiente diagrama.

    Kalman estimator including plant sys and Kalman filter kalmf. The plant has input u, noise input w, and output yt. The Kalman filter takes as inputs w and noisy plant output y = yt + v. The filter outputs are y-hat, the estimated true plant output, and x-hat, the estimated state values.

    Puede generar el modelo sys con las entradas conocidas u y las entradas de ruido blanco de proceso w, de forma que w consta de las últimas Nw entradas en sys. La salida de la planta "verdadera" yt consta de todas las salidas de sys. También puede proporcionar los datos de covarianza de ruido Q, R y N. El filtro de Kalman devuelto kalmf es un modelo de espacio de estados que toma las entradas conocidas u y las mediciones con ruido y, y genera una estimación y^ de la salida de la planta verdadera y una estimación x^ de los estados de la planta. kalman también devuelve las ganancias de Kalman L y la matriz de covarianzas de error de estado estacionario P.

    ejemplo

    [kalmf,L,P] = kalman(sys,Q,R,N,sensors,known) calcula un filtro de Kalman cuando existe una de las siguientes condiciones o ambas.

    • No se miden todas las salidas de sys.

    • Las entradas de perturbación w no son las últimas entradas de sys.

    El vector índice sensors especifica qué salidas de sys se miden. Estas salidas generan y. El vector índice known especifica qué entradas son conocidas (determinístico). Las entradas conocidas generan u. El comando kalman toma las entradas restantes de sys como entradas estocásticas w.

    [kalmf,L,P,Mx,Z,My] = kalman(___) también devuelve las ganancias de innovación Mx y My y las covarianzas de error en estado estacionario P y Z para un valor sys en tiempo discreto. Puede utilizar esta sintaxis con cualquiera de las combinaciones de argumentos de entrada anteriores.

    [kalmf,L,P,Mx,Z,My] = kalman(___,type) especifica el tipo de estimador para un valor sys en tiempo discreto.

    • type = 'current': calcula las estimaciones de salida y^[n|n] y las estimaciones de estado x^[n|n] utilizando todas las mediciones disponibles hasta y[n].

    • type = 'delayed': calcula las estimaciones de salida y^[n|n1] y las estimaciones de estado x^[n|n1] utilizando solo las mediciones hasta y[n1]. El estimador con retardo es más fácil de implementar dentro de los lazos de control.

    Puede utilizar el argumento de entrada type con cualquiera de las combinaciones de argumentos de entrada anteriores.

    Ejemplos

    contraer todo

    Diseñe un filtro de Kalman para una planta con ruido blanco aditivo w en la entrada y v en la salida, como se muestra en el siguiente diagrama.

    kalman4.png

    Supongamos que la planta tiene las siguientes matrices de espacio de estados y es una planta en tiempo discreto con un tiempo de muestreo no especificado (Ts = -1).

    A = [1.1269   -0.4940    0.1129 
         1.0000         0         0 
              0    1.0000         0];
    
    B = [-0.3832
          0.5919
          0.5191];
    
    C = [1 0 0];
    
    D = 0;
    
    Plant = ss(A,B,C,D,-1);
    Plant.InputName = 'un';
    Plant.OutputName = 'yt';

    Para utilizar kalman, debe proporcionar un modelo sys que tenga una entrada para el ruido w. De este modo, sys no es igual a Plant, ya que Plant toma la entrada un = u + w. Puede generar sys creando una unión de suma para la entrada de ruido.

    Sum = sumblk('un = u + w');
    sys = connect(Plant,Sum,{'u','w'},'yt');

    De manera equivalente, puede utilizar sys = Plant*[1 1].

    Especifique las covarianzas de ruido. Puesto que la planta tiene una entrada de ruido y una salida, estos valores son escalares. En la práctica, estos valores son propiedades de las fuentes de ruido en su sistema, que se determina midiendo el sistema o por otros medios. En este ejemplo, supongamos que ambas fuentes de ruido tienen la misma covarianza unitaria y no están correlacionadas (N = 0).

    Q = 1;
    R = 1;
    N = 0;

    Diseñe el filtro.

    [kalmf,L,P] = kalman(sys,Q,R,N);
    size(kalmf)
    State-space model with 4 outputs, 2 inputs, and 3 states.
    

    El filtro de Kalman kalmf es un modelo de espacio de estados que tiene dos entradas y cuatro salidas. kalmf toma como entradas la señal de entrada de la planta u y la salida de la planta con ruido y=yt+v. La primera salida es la salida de la planta verdadera estimada yˆ. Las tres salidas restantes son las estimaciones de estado xˆ. Examine los nombres de entrada y salida de kalmf para ver cómo kalman los etiqueta en consecuencia.

    kalmf.InputName
    ans = 2x1 cell
        {'u' }
        {'yt'}
    
    
    kalmf.OutputName
    ans = 4x1 cell
        {'yt_e'}
        {'x1_e'}
        {'x2_e'}
        {'x3_e'}
    
    

    Examine las ganancias de Kalman L. En una planta SISO con tres estados, L es un vector columna de tres elementos.

    L
    L = 3×1
    
        0.3586
        0.3798
        0.0817
    
    

    Para ver un ejemplo que muestra cómo usar kalmf para reducir el error de medición debido al ruido, consulte Filtro de Kalman.

    Considere una planta con tres entradas, una de las cuales represente el ruido de proceso w y dos salidas medidas. La planta tiene cuatro estados.

    kalman5.png

    Suponiendo las siguientes matrices de espacio de estados, cree sys.

    A = [-0.71  0.06 -0.19 -0.17;
          0.06 -0.52 -0.03  0.30;
         -0.19 -0.03 -0.24 -0.02;
         -0.17  0.30 -0.02 -0.41];
    
    B = [ 1.44  2.91   0;
         -1.97  0.83 -0.27;
         -0.20  1.39  1.10;
         -1.2   0    -0.28];
    
    C = [ 0    -0.36 -1.58 0.28;
         -2.05  0     0.51 0.03];
    
    D = zeros(2,3);
    
    sys = ss(A,B,C,D);
    sys.InputName = {'u1','u2','w'};
    sys.OutputName = {'y1','y2'};

    Puesto que la planta solo tiene una entrada de ruido de proceso, la covarianza Q es un escalar. En este ejemplo, asuma que el ruido de proceso tiene covarianza unitaria.

    Q = 1;

    kalman utiliza las dimensiones de Q para determinar qué entradas son conocidas y cuáles son las entradas de ruido. Para el escalar Q, kalman asume una entrada de ruido y utiliza la última entrada, a menos que especifique lo contrario (consulte Planta con salidas no medidas).

    Para el ruido de medición en las dos salidas, especifique una matriz de covarianzas de ruido de 2 por 2. En este ejemplo, utilice una varianza unitaria para la primera salida y una varianza de 1.3 para la segunda salida. Establezca los valores fuera de la diagonal en cero para indicar que los dos canales de ruido no están correlacionados.

    R = [1 0;
         0 1.3];

    Diseñe el filtro de Kalman.

    [kalmf,L,P] = kalman(sys,Q,R);

    Examine las entradas y las salidas. kalman utiliza las propiedades InputName, OutputName, InputGroup y OutputGroup de kalmf para ayudar a recordar qué representan las entradas y las salidas de kalmf.

    kalmf.InputGroup
    ans = struct with fields:
         KnownInput: [1 2]
        Measurement: [3 4]
    
    
    kalmf.InputName
    ans = 4x1 cell
        {'u1'}
        {'u2'}
        {'y1'}
        {'y2'}
    
    
    kalmf.OutputGroup
    ans = struct with fields:
        OutputEstimate: [1 2]
         StateEstimate: [3 4 5 6]
    
    
    kalmf.OutputName
    ans = 6x1 cell
        {'y1_e'}
        {'y2_e'}
        {'x1_e'}
        {'x2_e'}
        {'x3_e'}
        {'x4_e'}
    
    

    Así, las dos entradas conocidas u1 y u2 son las dos primeras entradas de kalmf y las dos salidas medidas y1 e y2 son las dos últimas entradas en kalmf. En las salidas de kalmf, las primeras dos son las salidas estimadas, y las cuatro restantes son las estimaciones de estado. Para usar el filtro de Kalman, conecte estas entradas con la planta y las señales de ruido de forma análoga a la que se muestra para una planta SISO en Filtro de Kalman.

    Considere una planta con cuatro entradas y dos salidas. La primera y la tercera entrada son conocidas, mientras que la segunda y la cuarta representan el ruido de proceso. La planta también tiene dos salidas, pero solo se mide la segunda.

    kalman6.png

    Utilice las siguientes matrices de espacio de estados para crear sys.

    A = [-0.37  0.14 -0.01  0.04;
         0.14 -1.89  0.98 -0.11;
        -0.01  0.98 -0.96 -0.14;
         0.04 -0.11 -0.14 -0.95];
    
    B = [-0.07 -2.32  0.68  0.10;
         -2.49  0.08  0     0.83;
          0    -0.95  0     0.54;
         -2.19  0.41  0.45  0.90];
    
    C = [ 0     0    -0.50 -0.38;
         -0.15 -2.12 -1.27  0.65];
    
    D = zeros(2,4);
    
    sys = ss(A,B,C,D,-1);    % Discrete with unspecified sample time
    
    sys.InputName = {'u1','w1','u2','w2'};
    sys.OutputName = {'yun','ym'};

    Para utilizar kalman para diseñar un filtro para este sistema, utilice los argumentos de entrada known y sensors para especificar qué entradas de la planta son conocidas y qué salida se mide.

    known = [1 3];
    sensors = [2];

    Especifique las covarianzas de ruido y diseñe el filtro.

    Q = eye(2);
    R = 1;
    N = 0;
    
    [kalmf,L,P] = kalman(sys,Q,R,N,sensors,known); 

    Al examinar las etiquetas de entrada y salida de kalmf se pueden observar las entradas que prevé el filtro y las salidas que devuelve.

    kalmf.InputGroup
    ans = struct with fields:
         KnownInput: [1 2]
        Measurement: 3
    
    
    kalmf.InputName
    ans = 3x1 cell
        {'u1'}
        {'u2'}
        {'ym'}
    
    

    kalmf toma como entrada las dos entradas conocidas de sys y las salidas medidas con ruido de sys.

    kalmf.OutputGroup
    ans = struct with fields:
        OutputEstimate: 1
         StateEstimate: [2 3 4 5]
    
    

    La primera salida de kalmf es la estimación del valor verdadero de la salida de la planta medida. Las salidas restantes son las estimaciones de estado.

    Argumentos de entrada

    contraer todo

    Modelo de planta con ruido de proceso, especificado como modelo de espacio de estados (ss). La planta tiene entradas conocidas u y entradas de ruido blanco de proceso w. La salida de la planta yt no incluye el ruido de medición.

    Diagram showing that sys includes plant dynamics and process noise inputs, but not the additive noise on the plant output.

    Puede escribir las matrices de espacio de estados de un modelo de planta de ese tipo como:

    A,[BG],C,[DH]

    kalman asume el ruido gaussiano v en la salida. De este modo, en tiempo continuo, las ecuaciones de espacio de estados con las que funciona kalman son:

    x˙=Ax+Bu+Gwy=Cx+Du+Hw+v

    En tiempo discreto, las ecuaciones de espacio de estados son:

    x[n+1]=Ax[n]+Bu[n]+Gw[n]y[n]=Cx[n]+Du[n]+Hw[n]+v[n]

    Si no utiliza el argumento de entrada known, kalman utiliza el tamaño de Q para determinar qué entradas de sys son entradas de ruido. En este caso, kalman trata las últimas entradas Nw = size(Q,1) como las entradas de ruido. Cuando las entradas de ruido w no son las últimas entradas de sys, puede utilizar el argumento de entrada known para especificar qué entradas de la planta son conocidas. kalman trata el resto de las entradas como estocásticas.

    Para ver otras restricciones de las propiedades de las matrices de la planta, consulte Limitaciones.

    Covarianza de ruido de proceso, especificada como escalar o matriz de Nw por Nw, donde Nw es el número de entradas de ruido de la planta. kalman utiliza el tamaño de Q para determinar qué entradas de sys son entradas de ruido, tomando las últimas entradas Nw = size(Q,1) para que sean las entradas de ruido a menos que especifique lo contrario con el argumento de entrada known.

    kalman asume que el ruido de proceso w es ruido gaussiano con covarianza Q = E(wwT). Cuando la planta solo tiene una entrada de ruido de proceso, Q es un escalar igual a la varianza de w. Cuando la planta tiene varias entradas de ruido no correlacionadas, Q es una matriz diagonal. En la práctica, se determinan los valores adecuados para Q midiendo o haciendo conjeturas fundamentadas sobre las propiedades del ruido del sistema.

    Covarianza de ruido de medición, especificada como escalar o matriz de Ny por Ny, donde Ny es el número de salidas de la planta. kalman asume que el ruido de medición v es ruido blanco con covarianza R = E(vvT). Cuando la planta solo tiene un canal de salida, R es un escalar igual a la varianza de v. Cuando la planta tiene varios canales de salida con ruido de medición no correlacionado, R es una matriz diagonal. En la práctica, se determinan los valores adecuados para R midiendo o haciendo conjeturas fundamentadas sobre las propiedades del ruido del sistema.

    Para ver otras restricciones de la covarianza de ruido de medición, consulte Limitaciones.

    Covarianza cruzada de ruido, especificada como escalar o matriz de Ny por Nw. kalman supone que el ruido de proceso w y el ruido de medición v satisfacen N = E(wvT). Si las dos fuentes de ruido no están correlacionadas, puede omitir N, lo que es equivalente a establecer N = 0. En la práctica, se determinan los valores adecuados para N midiendo o haciendo conjeturas fundamentadas sobre las propiedades del ruido del sistema.

    Salidas medidas de sys, especificadas como vector de índices que identifica qué salidas de sys se miden. Por ejemplo, supongamos que el sistema tiene tres salidas, pero solo se miden dos de ellas, que se corresponden con la primera y la tercera salida de sys. En este caso, establezca sensors = [1 3].

    Entradas conocidas de sys, especificadas como vector de índices que identifica qué entradas son conocidas (determinista). Por ejemplo, supongamos que el sistema tiene tres entradas, pero solo la primera y la segunda entrada son conocidas. En este caso, establezca known = [1 2]. kalman interpreta cualquier entrada restante de sys como estocástica.

    Tipo de estimador en tiempo discreto que se desea calcular, especificado como 'current' o 'delayed'. Esta entrada solo es pertinente para sys en tiempo discreto.

    • 'current': calcula las estimaciones de salida y^[n|n] y las estimaciones de estado x^[n|n] utilizando todas las mediciones disponibles hasta y[n].

    • 'delayed': calcula las estimaciones de salida y^[n|n1] y las estimaciones de estado x^[n|n1] utilizando solo las mediciones hasta y[n1]. El estimador con retardo es más fácil de implementar dentro de los lazos de control.

    Para obtener información sobre cómo calcula kalman las estimaciones actuales y con retardo, consulte Estimación en tiempo discreto.

    Argumentos de salida

    contraer todo

    Estimador de Kalman o filtro de Kalman, devuelto como modelo de espacio de estados (ss). El estimador resultante tiene entradas [u;y] y salidas [y^;x^]. Es decir, kalmf toma como entradas la entrada de la planta u y la salida de la planta con ruido y, y genera como salidas la salida de la planta estimada sin ruido y^ y los valores de estado estimados x^.

    Diagram showing Kalman filter with inputs u and y and outputs y-hat and x-hat.

    kalman establece automáticamente las propiedades InputName, OutputName, InputGroup y OutputGroup de kalmf para ayudar a recordar qué entradas y salidas se corresponden con cada señal.

    En el caso de las ecuaciones de estado y de salida de kalmf, consulte Estimación en tiempo continuo y Estimación en tiempo discreto.

    Ganancias de filtro, devueltas como arreglo de tamaño Nx por Ny, donde Nx es el número de estados en la planta y Ny es el número de salidas de la planta. En tiempo continuo, la ecuación de estado del filtro de Kalman es:

    x^˙=Ax^+Bu+L(yCx^Du).

    En tiempo discreto, la ecuación de estado es:

    x^[n+1|n]=Ax^[n|n1]+Bu[n]+L(y[n]Cx^[n|n1]Du[n]).

    Para obtener información sobre estas expresiones y sobre cómo se calcula L, consulte Estimación en tiempo continuo y Estimación en tiempo discreto.

    Covarianzas de error de estado estacionario, devueltas como Nx por Nx, donde Nx es el número de estados en la planta. El filtro de Kalman calcula las estimaciones de estado que minimizan P. En tiempo continuo, la covarianza de error de estado estacionario está dada por:

    P=limtE({xx^}{xx^}T).

    En tiempo discreto, las covarianzas de error de estado estacionario están dadas por:

    P=limnE({x[n]x^[n|n1]}{x[n]x^[n|n1]}T),Z=limnE({x[n]x^[n|n]}{x[n]x^[n|n]}T).

    Para obtener más información sobre estas cantidades y cómo las utiliza kalman, consulte Estimación en tiempo continuo y Estimación en tiempo discreto.

    Ganancias de innovación de los estimadores de estado para sistemas en tiempo discreto, devueltas como arreglo.

    Mx y My son pertinentes solo cuando type = 'current', que es el estimador predeterminado para sistemas en tiempo discreto. Para sys en tiempo continuo o type = 'delayed', Mx = My = [].

    En el caso del estimador de tipo 'current', Mx y My son las ganancias de innovación en las ecuaciones de actualización:

    x^[n|n]=x^[n|n1]+Mx(y[n]Cx^[n|n1]Du[n])

    y^[n|n]=Cx^[n|n1]+Du[n]+My(y[n]Cx^[n|n1]Du[n])

    Cuando no hay alimentación directa entre la entrada de ruido w y la salida de la planta y (es decir, cuando H = 0, consulte Estimación en tiempo discreto), My=CMx, y la estimación de salida se simplifica como y^[n|n]=Cx^[n|n]+Du[n].

    Las dimensiones de los arreglos Mx y My dependen de las dimensiones de sys de la siguiente forma.

    • Mx: Nx por Ny, donde Nx es el número de estados en la planta y Ny es el número de salidas.

    • My: Ny por Ny.

    Para obtener información sobre cómo kalman obtiene Mx y My, consulte Estimación en tiempo discreto.

    Limitaciones

    Los datos de la planta y de ruido deben satisfacer:

    • (C,A) es detectable, donde:

    • R¯>0 y [Q¯N¯;N¯R¯]0, donde

      [Q¯N¯N¯R¯]=[G0HI][QNNR][G0HI].

    • (AN¯R¯1C,Q¯N¯R¯1N¯T) no tiene ningún modo no controlable en el eje imaginario en tiempo continuo, o en el círculo unitario en tiempo discreto.

    Algoritmos

    contraer todo

    Estimación en tiempo continuo

    Considere una planta en tiempo continuo con las entradas conocidas u, el ruido blanco de proceso w y el ruido blanco de medición v:

    x˙=Ax+Bu+Gwy=Cx+Du+Hw+v

    Las señales de ruido w y v satisfacen:

    E(w)=E(v)=0,E(wwT)=Q,E(vvT)=R,E(wvT)=N

    El filtro de Kalman, o estimador de Kalman, calcula una estimación de estado x^(t) que minimiza la covarianza de error de estado estacionario:

    P=limtE({xx^}{xx^}T).

    El filtro de Kalman tiene las siguientes ecuaciones de estado y de salida:

    dx^dt=Ax^+Bu+L(yCx^Du)[y^x^]=[CI]x^+[D0]u

    Para obtener la ganancia del filtro L, kalman resuelve una ecuación algebraica de Riccati para obtener

    L=(PCT+N¯)R¯1

    donde

    R¯=R+HN+NTHT+HQHTN¯=G(QHT+N)

    P resuelve la ecuación algebraica de Riccati correspondiente.

    El estimador utiliza las entradas conocidas u y las mediciones y para generar las estimaciones de salida y de estado y^ y x^.

    Estimación en tiempo discreto

    La planta discreta está dada por:

    x[n+1]=Ax[n]+Bu[n]+Gw[n]y[n]=Cx[n]+Du[n]+Hw[n]+v[n]

    En tiempo discreto, las señales de ruido w y v satisfacen:

    E(w[n]w[n]T)=Q,E(v[n]v[n]T)=R,E(w[n]v[n]T)=N

    El estimador en tiempo discreto tiene la siguiente ecuación de estado:

    x^[n+1|n]=Ax^[n|n1]+Bu[n]+L(y[n]Cx^[n|n1]Du[n]).

    kalman resuelve una ecuación discreta de Riccati para obtener la matriz de ganancia L:

    L=(APCT+N¯)(CPCT+R¯)1

    donde

    R¯=R+HN+NTHT+HQHTN¯=G(QHT+N)

    kalman puede calcular dos variantes del estimador de Kalman en tiempo discreto, el estimador actual (type = 'current') y el estimador con retardo (type = 'delayed').

    • Estimador actual: genera las estimaciones de salida y^[n|n] y las estimaciones de estado x^[n|n] utilizando todas las mediciones disponibles hasta y[n]. Este estimador tiene la ecuación de salida

      [y^[n|n]x^[n|n]]=[(IMy)CIMxC]x^[n|n1]+[(IMy)DMyMxDMx][u[n]y[n]].

      donde las ganancias de innovación Mx y My se definen como:

      Mx=PCT(CPCT+R¯)1,My=(CPCT+HQHT+HN)(CPCT+R¯)1.

      De este modo, Mx actualiza la estimación de estado x^[n|n1] utilizando la nueva medición y[n]:

      x^[n|n]=x^[n|n1]+Mx(y[n]Cx^[n|n1]Du[n])

      Del mismo modo, My calcula la estimación de salida actualizada:

      y^[n|n]=Cx^[n|n1]+Du[n]+My(y[n]Cx^[n|n1]Du[n])

      Cuando H = 0, My=CMx, y la estimación de salida se simplifica como y^[n|n]=Cx^[n|n]+Du[n].

    • Estimador con retardo: genera las estimaciones de salida y^[n|n1] y las estimaciones de estado x^[n|n1] utilizando solo las mediciones hasta yv[n–1]. Este estimador tiene la ecuación de salida:

      [y^[n|n1]x^[n|n1]]=[CI]x^[n|n1]+[D000][u[n]y[n]]

      El estimador con retardo es más fácil de implementar dentro de los lazos de control.

    Historial de versiones

    Introducido antes de R2006a