Descargar Datos del Motor (CSV)

Práctica 6: Sensores Inteligentes

Motor de DC - Filtro de Kalman

Objetivo General:
Diseñar e implementar un sistema de estimación de estados basado en el Filtro de Kalman para un motor de CD no lineal (para un modelo linealizado a partir de este), capaz de inferir la posición y aceleración angular a partir de mediciones ruidosas de velocidad.
Objetivos especificos:
Motivación: En el campo de la Robótica y el Control Automático, la precisión del movimiento depende estrictamente de la calidad de la información disponible sobre el estado del sistema.
La motivación principal de este trabajo radica en superar las limitaciones del hardware físico mediante algoritmos de software avanzados. Mientras que la derivación numérica clásica falla ante la presencia de ruido eléctrico y mecánico, el uso de un Filtro de Kalman permite fusionar el conocimiento del modelo matemático (la física del sistema) con las mediciones reales. Esto no solo limpia la señal de velocidad, sino que permite inferir variables ocultas (aceleración y posición) con una precisión superior a la de los métodos deterministas.
Esta metodología es fundamental para la implementación de controladores avanzados (como LQR o MPC) y para la detección de fallas, permitiendo un desempeño de alto nivel sin incurrir en el costo de instrumentación adicional (como encoders absolutos de alta resolución o acelerómetros dedicados).
Planteamiento del problema: Esta práctica se basa en el análisis y extensión de los resultados obtenidos en la investigación "Data-driven modeling of DC motor dynamics: a benchmark experiment" de Maldonado-Uriostigue et al. Dicho trabajo se centra en un banco experimental de instrumentación y control para un motor de corriente directa Mod. TY36A/EV, el cual opera a y posee una velocidad máxima de . Este banco experimental, se muestra en la Figura 1.
Figura 1: Banco experimental presentado en [1]
Para el modelado, se utilizaron datos de entrada-salida adquiridos en una región acotada de operación, donde la entrada es el Voltaje de Armadura () y la salida es la Velocidad Angular ). A continuación se presentan las gráficas de los datos experimentales utilizados:
% Cargar datos
filename = 'DATA_MOTOR_N4SID2_4000.csv';
data = readtable(filename);
Warning: Column headers from the file were modified to make them valid MATLAB identifiers before creating variable names for the table. The original column headers are saved in the VariableDescriptions property.
Set 'VariableNamingRule' to 'preserve' to use the original column headers as table variable names.
 
% Parámetros
dt = 0.001; % tiempo de muestreo
 
% Cargar señales
Ts = data.Ts;
Varm = data.Varm;
AngularSpeed = data.("AngularSpeed");
 
% Conversión de los datos
Varmc = 22.18; Wc = 3.27; Wmax = 4000; Varmax = 24;
Varm = (Varmc / 870) * Varm;
mVarm = (Varmc / 870);
RPMc = Varmc * (Wmax / Varmax);
mAngularSpeed = 0.0049 * (RPMc / Wc);
AngularSpeed = 0.0049 * AngularSpeed * (RPMc / Wc);
AngularSpeed = AngularSpeed * (2 * pi / 60); % rad/s
 
% Graficar entradas suavizadas
% Gráfica 1: Voltaje de Armadura
fig1 = figure('Color', 'w');
plot(Varm, 'k-', 'LineWidth', 2); hold on;
xlabel('Muestras', 'Color', 'k');
ylabel('V_{arm} [V]', 'Color', 'k');
set(gca, 'XColor', 'k', 'YColor', 'k', 'GridColor', 'k', 'GridAlpha', 0.2, 'Color', 'w');
lgd1 = legend('Mediciones');
set(lgd1, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k');
grid on;
 
 
% Gráfica 2: Velocidad Angular
fig2 = figure('Color', 'w');
plot(AngularSpeed, 'k-', 'LineWidth', 2); hold on;
xlabel('Muestras', 'Color', 'k');
ylabel('Velocidad Angular [rad/s]', 'Color', 'k');
set(gca, 'XColor', 'k', 'YColor', 'k', 'GridColor', 'k', 'GridAlpha', 0.2, 'Color', 'w');
lgd2 = legend('Mediciones');
set(lgd2, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k');
grid on;
En el trabajo de referencia, se emplearon técnicas de modelado basadas en datos (Data-Driven), específicamente N4SID (lineal) y SINDy (no lineal), para obtener representaciones dinámicas del motor a partir de las mediciones experimentales. Siendo el modelo no lineal del motor, que se ajusta en toda la región de operación con un ajuste del 95.88%:
Cuyo desempeño se puede apreciar en la Figura 2
Figura 2: Comparación entre el modelo no lineal (SINDy), el modelo lineal (N4SID) y mediciones de la velocidad angular del motor de DC. Figura extraida de [1]
Esta práctica se centra en la linealización del modelo no lineal del motor. Tras comparar ambos modelos (lineal y no lineal), se implementará un filtro de Kalman para la estimación de estados, específicamente la posición y la aceleración, siendo capaz de dotar al sistema de la Figura [1], con el conocimiento de esos estos a los cuales no se tiene una medición directa, sin incluir más hardware ni elevar el costo del sistema de adquisición de datos.

Paso 1. Punto de Equilibrio/Operación.

En un sistema dinámico, un punto de equilibrio es un estado en el cual las variables del sistema permanecen constantes en el tiempo, es decir, el sistema no experimenta cambios cuando se encuentra en ese estado.
Para un sistema descrito por la ecuación diferencial , un punto de es de equilibrio si para todo tiempo [2]. Lo anterior cuando la entrada es cero, sin embargo en algunos textos, cuando existe una entrada de equilibrio, al punto de equilibrio para el cual para todo tiempo , es llamado punto de operación.
Por lo que obteniendo el punto de operación de la ecuación (1) para una entrada de . Comenzamos con cambiar las variables y , donde reemplazamos en la ecuación (1) por los valores de equilibrio:
Sustituyendo el valor de equilibrio de la entrada en la ecuación (2):
Para finalmente resolver la ecuación (3) para . Para esto, nos apoyaremos de MATLAB para resolver la ecuación cuadrática, la siguiente sección de código muestra el planteamiento completo para obtener el punto de equilibrio, este fragmento de código lo deberás trasncribir en tu archivo .mlx para responder las preguntas de la sección.
% 1. Definir la entrada de equilibrio.
Varm = 20;
 
% 2. Definir los coeficientes de la ecuación diferencial no lineal
% Modelo del motor: d_omega = c1*V + c2*w + c3*V^2 + c4*V*w + c5*w^2
c1 = -6.754; c2 = -1.721;
c3 = 5.204; c4 = -0.060;
c5 = -0.008;
 
% 3. Agrupar los términos para formar el polinomio aw^2 + bw + c = 0 para
% resolver la ecuación cuadrática
a = c5;
b = c2 + c4 * Varm;
c = c1 * Varm + c3 * (Varm^2);
coeficientes = [a, b, c];
puntos_operacion = roots(coeficientes);
 
% 4. Mostrar resultados
% Descomentar la siguiente sección de código para ver los posibles puntos
% de operación
%disp(puntos_operacion);
 
Preguntas de la sección:

Paso 2. Linealización.

Para linealizar el sistema, utilizaremos la expansión en Series de Taylor truncada en el primer término (derivadas parciales) [3]. Esto nos permite aproximar el comportamiento no lineal como una línea recta tangente al punto de operación que calculamos anteriormente.
Para linealizar alrededor del punto de equilibrio , definimos las variables de desviación (pequeñas perturbaciones):
El modelo linealizado en el espacio de estados resulta en:
Donde A y B son los Jacobianos evaluados en el punto de operación:
Donde A y B, son:
Trasncribe en tu archivo .mlx el siguiente código para corroborar la linealización del sistema y para responder las preguntas de la sección.
 
%% 5. Linealización (Cálculo de Jacobianos)
w_eq = max(puntos_operacion);
% A = df/dw = c2 + c4*V + 2*c5*w
A = c2 + (c4 * Varm) + (2 * c5 * w_eq);
% B = df/dV = c1 + 2*c3*V + c4*w
B = c1 + (2 * c3 * Varm) + (c4 * w_eq);
 
fprintf('Modelo Linealizado (dx = A*x + B*u):\n');
Modelo Linealizado (dx = A*x + B*u):
fprintf('A = %.4f\n', A);
A = -8.4155
fprintf('B = %.4f\n\n', B);
B = 180.8016
Es fundamental entender que la linealización solo es válida en una vecindad muy pequeña alrededor del punto de equilibrio. Matemáticamente, lo que hicimos fue aproximar una curva mediante una línea recta (la tangente en el punto de equilibrio). Por lo que:
Por lo que a continuación, se presenta un código que compara el modelo no lineal, con la aproximación lineal obtenida. Transcribir el código, y ejecutarlo, analizar las gráficas dadas por el código y responder las preguntas de la sección.
%% 6. Configuración de la Simulación
dt = 0.001; % Tiempo de muestreo [s]
t_step = 1.5; % Duración de cada voltaje [s]
voltajes = [10, 15, 20, 17, 23, 21, 13, 24, 19]; % Secuencia de entrada [V]
 
total_steps = length(voltajes);
t_total = total_steps * t_step;
time = 0:dt:t_total-dt;
 
% Vectores de almacenamiento
w_nl = zeros(size(time)); % Velocidad No Lineal
w_lin = zeros(size(time)); % Velocidad Lineal
V_in = zeros(size(time)); % Entrada de voltaje
 
% Condiciones iniciales = Punto de equilibrio
w_nl(1) = w_eq;
w_lin(1) = w_eq;
 
%% 7. Bucle de Simulación
idx_v = 1;
for i = 1:length(time)-1
% Determinar qué voltaje toca según el tiempo
current_step_index = floor(time(i) / t_step) + 1;
if current_step_index > length(voltajes)
current_step_index = length(voltajes);
end
V_act = voltajes(current_step_index);
V_in(i) = V_act;
% --- DINÁMICA NO LINEAL (SINDy)---
% dw/dt = f(w, V)
dw_nl = c1*V_act + c2*w_nl(i) + c3*V_act^2 + ...
c4*V_act*w_nl(i) + c5*w_nl(i)^2;
w_nl(i+1) = w_nl(i) + dw_nl * dt;
% --- DINÁMICA LINEAL (Aproximación realizada) ---
% dw_lin = A * (delta_w) + B * (delta_V)
% delta_w = w_lin - w_eq
% delta_V = V_act - V_eq
dw_l = A * (w_lin(i) - w_eq) + B * (V_act - Varm);
w_lin(i+1) = w_lin(i) + dw_l * dt;
end
V_in(end) = V_in(end-1); % Ajuste final para gráfica
error = abs(w_nl - w_lin);
%% 8. Gráficas y Análisis
fig = figure('Color', 'w', 'Position', [300, 300, 2600, 2200]);
% Subplot 1: Voltaje de Entrada
subplot(3,1,1);
plot(time, V_in, 'k-', 'LineWidth', 2); hold on;
yline(Varm, 'g--', 'LineWidth', 1.5);
title('Entrada', 'Color', 'k');
xlabel('Tiempo [s]', 'Color', 'k');
ylabel('V_{arm} [V]', 'Color', 'k');
set(gca, 'XColor', 'k', 'YColor', 'k', 'GridColor', 'k', 'GridAlpha', 0.2, 'Color', 'w');
lgd1 = legend('V_{entrada}', 'Entrada de Equilibrio (20V)');
set(lgd1, 'FontSize', 5, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k');
grid on;
% Subplot 2: Comparación de Velocidades
subplot(3,1,2);
plot(time, w_nl, 'b-', 'LineWidth', 2); hold on;
plot(time, w_lin, 'r--', 'LineWidth', 2);
 
title('Modelo No Lineal vs Modelo Linealizado', 'Color', 'k');
xlabel('Tiempo [s]', 'Color', 'k');
ylabel('Velocidad \omega [rad/s]', 'Color', 'k');
set(gca, 'XColor', 'k', 'YColor', 'k', 'GridColor', 'k', 'GridAlpha', 0.2, 'Color', 'w');
lgd2 = legend('Modelo No Lineal', 'Modelo Lineal');
set(lgd2, 'FontSize', 5, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k');
grid on;
 
% Subplot 3: Error
subplot(3,1,3);
area(time, error, 'FaceColor', [1 0.8 0.8], 'EdgeColor', 'r');
title('Error Absoluto (|Real - Aprox|)', 'Color', 'k');
xlabel('Tiempo [s]', 'Color', 'k');
ylabel('Error [rad/s]', 'Color', 'k');
set(gca, 'XColor', 'k', 'YColor', 'k', 'GridColor', 'k', 'GridAlpha', 0.2, 'Color', 'w');
grid on;
 
Preguntas de la sección:

Paso 3. Filtro de Kalman.

3.1. Expansión del modelo en espacio de estados.

El modelo en espacio de estados obtenido de la linealización, describe solo la velocidad. Sin embargo, para controlar o monitorear diferentes sistemas donde los motores de DC son el núcleo como robots [4], a menudo se requiere saber donde está el efector final (posición ) y que tán rápido cambia su velocidad (aceleración ). Para realizar lo anterior, en el espacio de estados, definimos un vector de estado que contiene todas las variables que necesitamos estimar. Pasamos de un estado escalar a un vector aumentado:
Esto crea un sistema de dos ecuaciones acopladas:
Matricialmente el modelo de espacio de estados extendido del motor de DC, es
Donde las matrices A y B, son las obtenidas de la ecuación (5).

3.2. Filtro de Kalman vs Enfoque Clásico (Derivadas e Integrales)

Desde un enfoque clásico, si se tiene la velocidad y, basta con simplemente derivarla para obtener la aceleración, calculandola como:
En la práctica, si se cálcula la aceleración de esta manera, se obtendra una señal prácticamente inutilizable llena de ruido, esto debido a que la señal de la velocidad esta contaminada con ruido, el ruido es generalmente de alta frecuencia. La operación derivada (8) amplifica el ruido proporcionalmente a su frecuencia.
Por otro lado, para obtener la posición, desde un enfoque clásico, la operación a realizar es la siguiente:
De realizar esta integral númerica, la posición calculada se aleja de la realidad con el tiempo debido al ruido, esto si el sensor tiene un error contante (bias) o simplemente ruido, la suma (9) acumula ese error.
La solución a estos problemas, es implementar en el sensor, un estimador. El Filtro de Kalman es un estimador óptimo recursivo, que:

3.3. Algoritmo del Filtro de Kalman

Como se podrá ver en la siguiente sección de código, dentro del for, se sigue el siguiente conjunto de instrucciones [5]:

Paso 1: Predicción

Antes de leer el sensor, se estima dónde se deberpia estar, basados en el estado anterior y la entrada u
Donde F es la matriz A discretizada, G es la matriz B discretizada, es la matriz de covarianza del error, Q es la matriz de covarianza del ruido del proceso, son los estados estimados, son las mediciones de la entrada.

Paso 2: Error

Comparamos la predicción con la lectura real del sensor :
Donde es el error o innovación y H es la matriz de observación que relaciona la lectura disponible del sensor.

Paso 3: Ganancia de Kalman

Calculamos un factor de ponderación K(ganancia de Kalman) basado en las matrices de ruido Q (confianza modelo) y R (confianza sensor).
Donde R es la matriz de covarianza del ruido de medición.

Paso 4: Corrección

Actualizamos el estado final sumando una fracción del error ponderada por K
 
%% 8. Filtro de Kalman
% Parámetros de simulación
c1 = -6.754; c2 = -1.721; c3 = 5.204; c4 = -0.060; c5 = -0.008; % Coeficientes modelo no lineal
V_eq = 20; w_eq = 343.41; % Punto de equilibrio
A_lin = -8.416; B_lin = 180.801; % Modelo linealizado
dt = 0.001; % Tiempo de muestreo [s]
t_step = 2; % Duracion de los escalones [s]
secuencia_voltajes = [20, 22, 19, 21, 18, 23, 20];
T_total = length(secuencia_voltajes) * t_step;
t = 0:dt:T_total-dt;
 
% Generacion de la señal de entrada
V_in = zeros(size(t));
for i = 1:length(t)
idx = floor(t(i)/t_step) + 1;
if idx > length(secuencia_voltajes), idx = length(secuencia_voltajes); end
V_in(i) = secuencia_voltajes(idx);
end
 
% Extendiendo el orden del modelo
% Estados: x = [theta; omega]
A_sys = [0, 1; 0, A_lin];
B_sys = [0; B_lin];
C_sys = [0, 1];
F = eye(2) + A_sys * dt; G = B_sys * dt; H = C_sys;
 
% ----- SECCIÓN A MODIFICAR -----
Q = diag([1e-4, 1]); % Q: Confianza en integración de theta y dinámica de w
R = 10; % R: Ruido del sensor de velocidad (ajustar si se ve muy sucio)
% ----- ----- ----- ----- -----
P = eye(2);
 
x_est = [0; w_eq];
affine_term = -A_lin*w_eq - B_lin*V_eq; % Con este término,
% el filtro sabe que el sistema está "centrado" alrededor de 20V y 343 rad/s.
 
% Almacenamiento
log_theta_real = zeros(size(t)); log_w_real = zeros(size(t));
log_alpha_real = zeros(size(t)); log_theta_est = zeros(size(t));
log_alpha_est = zeros(size(t)); log_y_meas = zeros(size(t));
 
theta_real = 0; w_real = w_eq;
 
% Bucle Principal
for k = 1:length(t)
u = V_in(k);
% --- Dinámica No lineal ---
d_omega_real = c1*u + c2*w_real + c3*u^2 + c4*u*w_real + c5*w_real^2;
theta_real = theta_real + w_real * dt;
w_real = w_real + d_omega_real * dt;
log_theta_real(k) = theta_real;
log_w_real(k) = w_real;
log_alpha_real(k) = d_omega_real;
% --- Sensor de VELOCIDAD ---
% *** LINEA DE RUIDO ***
ruido = 0;%% Cambiar a: 1.5 * randn(); para ver efecto ruidoso
y_meas = w_real + ruido; % Medimos w
log_y_meas(k) = y_meas;
% --- Kalman Filter ---
% Predicción
x_pred = F*x_est + G*u + [0; affine_term*dt];
P_pred = F * P * F' + Q;
% Corrección
y_tilde = y_meas - H * x_pred;
S = H * P_pred * H' + R;
K = P_pred * H' / S;
x_est = x_pred + K * y_tilde;
P = (eye(2) - K * H) * P_pred;
 
% Corrección de simetría numérica
P = (P + P')/2;
log_theta_est(k) = x_est(1);
log_alpha_est(k) = A_lin * x_est(2) + B_lin * u + affine_term;
end
 
% Cálculo de la Derivada Numérica de la Velocidad Medida (Aceleración Aprox)
accel_num = [0, diff(log_y_meas)/dt];
 
% GRÁFICAS
col_azul = [0 0.4470 0.7410];
col_rojo = [0.8500 0.3250 0.0980];
col_verde_claro = [0.5 0.8 0.5];
 
% --- FIGURA 1: Entrada y Salida ---
fig1 = figure('Color', 'w', 'Name', 'Entrada_Salida', 'Position', [50, 500, 700, 600]);
% Subplot 1
subplot(2,1,1);
stairs(t, V_in, 'k-', 'LineWidth', 2);
title('Entrada: Voltaje de Armadura', 'Color', 'k', 'FontWeight', 'bold');
ylabel('V_{arm} [V]', 'Color', 'k');
grid on; set(gca, 'XColor', 'k', 'YColor', 'k', 'GridAlpha', 0.3, 'Color', 'w');
% Subplot 2
subplot(2,1,2);
% 1. Velocidad Medida (Ruidosa)
plot(t, log_y_meas, 'Color', col_rojo, 'LineWidth', 2); hold on;
% 2. Velocidad Real
plot(t, log_w_real, 'Color', col_azul, 'LineWidth', 2, 'LineStyle', '--');
title('Salida: Velocidad Angular \omega', 'Color', 'k', 'FontWeight', 'bold');
ylabel('\omega [rad/s]', 'Color', 'k'); xlabel('Tiempo [s]', 'Color', 'k');
lgd1 = legend('Medición (Sensor+Ruido)', 'Real (Modelo NL)');
set(lgd1, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k');
grid on; set(gca, 'XColor', 'k', 'YColor', 'k', 'GridAlpha', 0.3, 'Color', 'w');
ylim([min(log_w_real)-20, max(log_w_real)+20]);
 
 
% --- FIGURA 2: Posición Estimada ---
fig2 = figure('Color', 'w', 'Name', 'Posicion', 'Position', [800, 500, 700, 800]);
% Subplot 1
subplot(3,1,1);
plot(t, log_theta_real, 'Color', col_azul, 'LineWidth', 2); hold on;
plot(t, log_theta_est, '--', 'Color', col_rojo, 'LineWidth', 2);
title('Posición Angular Acumulada \theta (Estimada vs Real)', 'Color', 'k', 'FontWeight', 'bold');
ylabel('\theta [rad]', 'Color', 'k');
lgd2 = legend('Real', 'Estimada (KF)');
set(lgd2, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k', 'Location', 'northwest');
grid on; set(gca, 'XColor', 'k', 'YColor', 'k', 'GridAlpha', 0.3, 'Color', 'w');
% Subplot 2
subplot(3,1,2);
plot(t, sin(log_theta_real), 'Color', col_azul, 'LineWidth', 1.5); hold on;
plot(t, sin(log_theta_est), '--', 'Color', col_rojo, 'LineWidth', 1.5);
title('Rotación Física (sin(\theta))', 'Color', 'k', 'FontWeight', 'bold');
ylabel('sin(\theta)', 'Color', 'k');
ylim([-1.5, 1.5]);
grid on; set(gca, 'XColor', 'k', 'YColor', 'k', 'GridAlpha', 0.3, 'Color', 'w');
% Subplot 3: ZOOM (3.8s a 4.2s)
subplot(3,1,3);
plot(t, sin(log_theta_real), 'Color', col_azul, 'LineWidth', 2); hold on;
plot(t, sin(log_theta_est), '--', 'Color', col_rojo, 'LineWidth', 2);
xlim([3.8, 4.2]);
title('Zoom (t = 3.8s a 4.2s)', 'Color', 'k', 'FontWeight', 'bold');
xlabel('Tiempo [s]', 'Color', 'k'); ylabel('sin(\theta)', 'Color', 'k');
ylim([-1.5, 1.5]);
grid on; set(gca, 'XColor', 'k', 'YColor', 'k', 'GridAlpha', 0.3, 'Color', 'w');
 
 
% --- FIGURA 3: Aceleración (Derivada del Sensor vs Estimada) ---
fig3 = figure('Color', 'w', 'Name', 'Aceleracion', 'Position', [50, 50, 700, 600]);
% Subplot 1:
subplot(2,1,1);
plot(t, log_alpha_real, 'Color', col_azul, 'LineWidth', 2); hold on;
plot(t, accel_num, ':', 'Color', [0 0.6 0], 'LineWidth', 1);
plot(t, log_alpha_est, '--', 'Color', col_rojo, 'LineWidth', 2);
title('Aceleración angular', 'Color', 'k', 'FontWeight', 'bold');
ylabel('\alpha [rad/s^2]', 'Color', 'k');
% Zoom
if max(abs(accel_num)) > 3*max(abs(log_alpha_real))
ylim([min(log_alpha_real)-300, max(log_alpha_real)+300]);
end
lgd3 = legend('Real', 'Derivada Numérica (d\omega_{med}/dt)', 'Estimada (KF)');
set(lgd3, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k');
grid on; set(gca, 'XColor', 'k', 'YColor', 'k', 'GridAlpha', 0.3, 'Color', 'w');
% Subplot 2
subplot(2,1,2);
plot(t, log_alpha_real, 'Color', col_azul, 'LineWidth', 2); hold on;
plot(t, log_alpha_est, '--', 'Color', col_rojo, 'LineWidth', 2);
title('Sin Derivada Numérica', 'Color', 'k', 'FontWeight', 'bold');
ylabel('\alpha [rad/s^2]', 'Color', 'k'); xlabel('Tiempo [s]', 'Color', 'k');
lgd3b = legend('Real', 'Estimada (KF)');
set(lgd3b, 'TextColor', 'k', 'Color', 'w', 'EdgeColor', 'k');
grid on; set(gca, 'XColor', 'k', 'YColor', 'k', 'GridAlpha', 0.3, 'Color', 'w');
 
 

Actividad

  1. Modificar la linea 243, del código referente al Filtro de Kalman. Cambiar el ruido de 0 a 1.5 * randn() para ver los cambios en las gráficas. Indicar sus observaciones.
  2. Mantener el ruido y cambiar el valor de Q de diag([1e-4, 1]) a diag([1e-4, 0.5]) e incrementar el valor de R a 20 y posteriormente a 50. Indicar sus observaciones.
  3. ¿Qué efectos hay en el incremento de y modificación de las matrices Q y R?.
  4. Investigue aplicaciones del Filtro del Kalman.
  5. Investigue el algoritmo del Filtro de Kalman como estimador de parámetros.

Referencias

[1] D. Y. Maldonado-Uriostigue, D. Martínez-Gutiérrez and R. G. Ramírez-Chavarría, "Data-driven modeling of DC motor dynamics: a benchmark experiment," en Proceeding of the XX Latin American Control Congress (LACC 2025), Cancún, México, Oct. 15-17, 2025: Springer, en prensa.
[2] P. J. Antsaklis y A. N. Michel, Linear Systems. Boston, MA: Birkhäuser, 2006.
[3] K. Ogata, Modern Control Engineering, 5th ed. Upper Saddle River, NJ, USA: Prentice Hall, 2010.
[4] S. Thrun, W. Burgard, and D. Fox, Probabilistic Robotics. Cambridge, MA, USA: MIT Press, 2005.
[5] D. Simon, Optimal State Estimation: Kalman, H Infinity, and Nonlinear Approaches. Hoboken, NJ, USA: Wiley-Interscience, 2006.