Contenido principal

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

Ajuste automático del filtro insfilterAsync

El objeto insfilterAsync es un filtro Kalman extendido complejo que estima la postura del dispositivo. Sin embargo, ajustar manualmente el filtro o encontrar los valores óptimos para los parámetros de ruido puede ser una tarea desafiante. Este ejemplo ilustra cómo utilizar la función tune para optimizar los parámetros del ruido del filtro.

Configuración de trayectoria y sensor

Para ilustrar el proceso de ajuste del filtro insfilterAsync, utilice una trayectoria de punto de referencia aleatorio simple. Los objetos imuSensor y gpsSensor crean entradas para el filtro.

% The IMU runs at 100 Hz and the GPS runs at 1 Hz.
imurate = 100;
gpsrate = 1;
decim = imurate/gpsrate;

% Create a random waypoint trajectory.
rng(1)
Npts = 4; % number of waypoints
wpPer = 5; % time between waypoints
tstart = 0;
tend = wpPer*(Npts -1);
wp = waypointTrajectory('Waypoints',5*rand(Npts,3), ...
        'TimeOfArrival',tstart:wpPer:tend, ...
        'Orientation',[quaternion.ones; randrot(Npts-1,1)], ...
        'SampleRate', imurate);

[Position,Orientation,Velocity,Acceleration,AngularVelocity] = lookupPose(...
    wp, tstart:(1/imurate):tend);

% Set up an IMU and process the trajectory.
imu = imuSensor('SampleRate',imurate);
loadparams(imu,fullfile(matlabroot, ...
    "toolbox","shared","positioning","positioningdata","generic.json"), ...
    "GenericLowCost9Axis");
[Accelerometer, Gyroscope, Magnetometer] = imu(Acceleration, ...
    AngularVelocity, Orientation);
imuData = timetable(Accelerometer,Gyroscope,Magnetometer,'SampleRate',imurate);

% Set up a GPS sensor and process the trajectory.
gps = gpsSensor('SampleRate', gpsrate,'DecayFactor',0.5, ...
    'HorizontalPositionAccuracy',1.6,'VerticalPositionAccuracy',1.6, ...
    'VelocityAccuracy',0.1);
[GPSPosition,GPSVelocity] = gps(Position(1:decim:end,:), Velocity(1:decim:end,:));
gpsData = timetable(GPSPosition,GPSVelocity,'SampleRate',gpsrate);

% Create a timetable for the tune function.
sensorData = synchronize(imuData,gpsData);

% Create a timetable capturing the ground truth pose.
groundTruth = timetable(Position,Orientation,'SampleRate',imurate);

Construir el filtro

El filtro insfilterAsync fusiona datos de múltiples sensores que operan de forma asincrónica.

filtUntuned = insfilterAsync;

Determinar las condiciones iniciales del filtro

Establezca los valores iniciales para las propiedades State y StateCovariance en función de la ground-truth. Normalmente, para obtener los valores iniciales, se utilizarían las primeras muestras de sensorData junto con rutinas de calibración. Sin embargo, en este ejemplo se utiliza groundTruth para establecer el estado inicial para la convergencia rápida del filtro.

idx = stateinfo(filtUntuned);
filtUntuned.State(idx.Orientation) = compact(Orientation(1));
filtUntuned.State(idx.AngularVelocity) = AngularVelocity(1,:);
filtUntuned.State(idx.Position) = Position(1,:);
filtUntuned.State(idx.Velocity) = Velocity(1,:);
filtUntuned.State(idx.Acceleration) = Acceleration(1,:);
filtUntuned.State(idx.AccelerometerBias) = imu.Accelerometer.ConstantBias;
filtUntuned.State(idx.GyroscopeBias) = imu.Gyroscope.ConstantBias;
filtUntuned.State(idx.GeomagneticFieldVector) = imu.MagneticField;
filtUntuned.State(idx.MagnetometerBias) = imu.Magnetometer.ConstantBias;
filtUntuned.StateCovariance = 1e-5*eye(numel(filtUntuned.State));

% Create a copy of the filtUntuned object for tuning later.
filtTuned = copy(filtUntuned);

Procesar sensorData con un filtro no sintonizado

Utilice la función tunernoise para crear ruidos de medición que también deben ajustarse. Para ilustrar la necesidad de realizar ajustes, primero utilice el filtro con sus parámetros predeterminados.

mn = tunernoise('insfilterAsync');
[posUntunedEst, orientUntunedEst] = fuse(filtUntuned, sensorData, mn);

Ajuste el filtro y procese sensorData

Utilice la función tune para minimizar el error cuadrático medio (RMS) entre groundTruth y las estimaciones de estado.

cfg = tunerconfig(class(filtTuned),'MaxIterations',15,'StepForward',1.1);
tunedmn = tune(filtTuned,mn,sensorData,groundTruth,cfg);
    Iteration    Parameter                 Metric
    _________    _________                 ______
    1            AccelerometerNoise        3.9157
    1            GyroscopeNoise            3.9157
    1            MagnetometerNoise         3.8618
    1            GPSPositionNoise          3.8162
    1            GPSVelocityNoise          3.6551
    1            QuaternionNoise           3.6522
    1            AngularVelocityNoise      3.4632
    1            PositionNoise             3.4632
    1            VelocityNoise             3.4632
    1            AccelerationNoise         3.4420
    1            GyroscopeBiasNoise        3.4420
    1            AccelerometerBiasNoise    3.4389
    1            GeomagneticVectorNoise    3.4389
    1            MagnetometerBiasNoise     3.4389
    2            AccelerometerNoise        3.4389
    2            GyroscopeNoise            3.4389
    2            MagnetometerNoise         3.3792
    2            GPSPositionNoise          3.3792
    2            GPSVelocityNoise          3.2526
    2            QuaternionNoise           3.2506
    2            AngularVelocityNoise      2.6514
    2            PositionNoise             2.6514
    2            VelocityNoise             2.6514
    2            AccelerationNoise         2.6514
    2            GyroscopeBiasNoise        2.6514
    2            AccelerometerBiasNoise    2.6496
    2            GeomagneticVectorNoise    2.6496
    2            MagnetometerBiasNoise     2.6386
    3            AccelerometerNoise        2.6351
    3            GyroscopeNoise            2.6351
    3            MagnetometerNoise         2.6165
    3            GPSPositionNoise          2.6165
    3            GPSVelocityNoise          2.5219
    3            QuaternionNoise           2.4994
    3            AngularVelocityNoise      2.4183
    3            PositionNoise             2.4183
    3            VelocityNoise             2.4183
    3            AccelerationNoise         2.4032
    3            GyroscopeBiasNoise        2.4032
    3            AccelerometerBiasNoise    2.3922
    3            GeomagneticVectorNoise    2.3922
    3            MagnetometerBiasNoise     2.3922
    4            AccelerometerNoise        2.3888
    4            GyroscopeNoise            2.3888
    4            MagnetometerNoise         2.3888
    4            GPSPositionNoise          2.3888
    4            GPSVelocityNoise          2.2745
    4            QuaternionNoise           2.2641
    4            AngularVelocityNoise      2.1749
    4            PositionNoise             2.1749
    4            VelocityNoise             2.1749
    4            AccelerationNoise         2.1628
    4            GyroscopeBiasNoise        2.1628
    4            AccelerometerBiasNoise    2.1624
    4            GeomagneticVectorNoise    2.1624
    4            MagnetometerBiasNoise     2.1589
    5            AccelerometerNoise        2.1587
    5            GyroscopeNoise            2.1587
    5            MagnetometerNoise         2.1587
    5            GPSPositionNoise          2.1573
    5            GPSVelocityNoise          2.0520
    5            QuaternionNoise           2.0518
    5            AngularVelocityNoise      2.0044
    5            PositionNoise             2.0044
    5            VelocityNoise             2.0044
    5            AccelerationNoise         2.0013
    5            GyroscopeBiasNoise        2.0013
    5            AccelerometerBiasNoise    1.9900
    5            GeomagneticVectorNoise    1.9900
    5            MagnetometerBiasNoise     1.9900
    6            AccelerometerNoise        1.9893
    6            GyroscopeNoise            1.9893
    6            MagnetometerNoise         1.9893
    6            GPSPositionNoise          1.9893
    6            GPSVelocityNoise          1.8894
    6            QuaternionNoise           1.8894
    6            AngularVelocityNoise      1.8273
    6            PositionNoise             1.8273
    6            VelocityNoise             1.8273
    6            AccelerationNoise         1.8189
    6            GyroscopeBiasNoise        1.8189
    6            AccelerometerBiasNoise    1.8189
    6            GeomagneticVectorNoise    1.8188
    6            MagnetometerBiasNoise     1.8188
    7            AccelerometerNoise        1.8188
    7            GyroscopeNoise            1.8188
    7            MagnetometerNoise         1.8177
    7            GPSPositionNoise          1.8157
    7            GPSVelocityNoise          1.7122
    7            QuaternionNoise           1.7122
    7            AngularVelocityNoise      1.6420
    7            PositionNoise             1.6420
    7            VelocityNoise             1.6420
    7            AccelerationNoise         1.6420
    7            GyroscopeBiasNoise        1.6420
    7            AccelerometerBiasNoise    1.6412
    7            GeomagneticVectorNoise    1.6412
    7            MagnetometerBiasNoise     1.6412
    8            AccelerometerNoise        1.6412
    8            GyroscopeNoise            1.6411
    8            MagnetometerNoise         1.6411
    8            GPSPositionNoise          1.6383
    8            GPSVelocityNoise          1.5216
    8            QuaternionNoise           1.5216
    8            AngularVelocityNoise      1.5004
    8            PositionNoise             1.5004
    8            VelocityNoise             1.5004
    8            AccelerationNoise         1.5000
    8            GyroscopeBiasNoise        1.5000
    8            AccelerometerBiasNoise    1.5000
    8            GeomagneticVectorNoise    1.5000
    8            MagnetometerBiasNoise     1.4998
    9            AccelerometerNoise        1.4998
    9            GyroscopeNoise            1.4998
    9            MagnetometerNoise         1.4998
    9            GPSPositionNoise          1.4998
    9            GPSVelocityNoise          1.4106
    9            QuaternionNoise           1.4106
    9            AngularVelocityNoise      1.3916
    9            PositionNoise             1.3916
    9            VelocityNoise             1.3916
    9            AccelerationNoise         1.3916
    9            GyroscopeBiasNoise        1.3916
    9            AccelerometerBiasNoise    1.3911
    9            GeomagneticVectorNoise    1.3911
    9            MagnetometerBiasNoise     1.3911
    10           AccelerometerNoise        1.3911
    10           GyroscopeNoise            1.3910
    10           MagnetometerNoise         1.3910
    10           GPSPositionNoise          1.3892
    10           GPSVelocityNoise          1.2977
    10           QuaternionNoise           1.2977
    10           AngularVelocityNoise      1.2977
    10           PositionNoise             1.2977
    10           VelocityNoise             1.2977
    10           AccelerationNoise         1.2975
    10           GyroscopeBiasNoise        1.2975
    10           AccelerometerBiasNoise    1.2975
    10           GeomagneticVectorNoise    1.2975
    10           MagnetometerBiasNoise     1.2974
    11           AccelerometerNoise        1.2973
    11           GyroscopeNoise            1.2973
    11           MagnetometerNoise         1.2973
    11           GPSPositionNoise          1.2973
    11           GPSVelocityNoise          1.2031
    11           QuaternionNoise           1.2030
    11           AngularVelocityNoise      1.1998
    11           PositionNoise             1.1998
    11           VelocityNoise             1.1998
    11           AccelerationNoise         1.1998
    11           GyroscopeBiasNoise        1.1998
    11           AccelerometerBiasNoise    1.1995
    11           GeomagneticVectorNoise    1.1995
    11           MagnetometerBiasNoise     1.1994
    12           AccelerometerNoise        1.1993
    12           GyroscopeNoise            1.1992
    12           MagnetometerNoise         1.1992
    12           GPSPositionNoise          1.1982
    12           GPSVelocityNoise          1.1009
    12           QuaternionNoise           1.1008
    12           AngularVelocityNoise      1.0972
    12           PositionNoise             1.0972
    12           VelocityNoise             1.0972
    12           AccelerationNoise         1.0972
    12           GyroscopeBiasNoise        1.0972
    12           AccelerometerBiasNoise    1.0968
    12           GeomagneticVectorNoise    1.0968
    12           MagnetometerBiasNoise     1.0967
    13           AccelerometerNoise        1.0966
    13           GyroscopeNoise            1.0965
    13           MagnetometerNoise         1.0965
    13           GPSPositionNoise          1.0955
    13           GPSVelocityNoise          0.9830
    13           QuaternionNoise           0.9829
    13           AngularVelocityNoise      0.9829
    13           PositionNoise             0.9829
    13           VelocityNoise             0.9829
    13           AccelerationNoise         0.9829
    13           GyroscopeBiasNoise        0.9829
    13           AccelerometerBiasNoise    0.9825
    13           GeomagneticVectorNoise    0.9825
    13           MagnetometerBiasNoise     0.9824
    14           AccelerometerNoise        0.9822
    14           GyroscopeNoise            0.9822
    14           MagnetometerNoise         0.9822
    14           GPSPositionNoise          0.9812
    14           GPSVelocityNoise          0.8868
    14           QuaternionNoise           0.8867
    14           AngularVelocityNoise      0.8816
    14           PositionNoise             0.8816
    14           VelocityNoise             0.8816
    14           AccelerationNoise         0.8815
    14           GyroscopeBiasNoise        0.8815
    14           AccelerometerBiasNoise    0.8812
    14           GeomagneticVectorNoise    0.8812
    14           MagnetometerBiasNoise     0.8811
    15           AccelerometerNoise        0.8809
    15           GyroscopeNoise            0.8809
    15           MagnetometerNoise         0.8809
    15           GPSPositionNoise          0.8799
    15           GPSVelocityNoise          0.7916
    15           QuaternionNoise           0.7916
    15           AngularVelocityNoise      0.7916
    15           PositionNoise             0.7916
    15           VelocityNoise             0.7916
    15           AccelerationNoise         0.7916
    15           GyroscopeBiasNoise        0.7916
    15           AccelerometerBiasNoise    0.7913
    15           GeomagneticVectorNoise    0.7913
    15           MagnetometerBiasNoise     0.7913
[posTunedEst, orientTunedEst] = fuse(filtTuned,sensorData,tunedmn);

Comparar filtro ajustado y no ajustado

Trazar las estimaciones de posición de los filtros ajustados y no ajustados junto con las posiciones ground-truth. Luego, trace el error de orientación (distancia del cuaternión) en grados para los filtros ajustados y no ajustados. El filtro ajustado estima la posición y la orientación mejor que el filtro no ajustado.

% Position error
figure;
t = sensorData.Time;
subplot(3,1,1);
plot(t, [posTunedEst(:,1) posUntunedEst(:,1) Position(:,1)]);
title('Position');
ylabel('X-axis');
legend('Tuned', 'Untuned', 'Truth');
subplot(3,1,2);
plot(t, [posTunedEst(:,2) posUntunedEst(:,2) Position(:,2)]);
ylabel('Y-axis');
subplot(3,1,3);
plot(t, [posTunedEst(:,3) posUntunedEst(:,3) Position(:,3)]);
ylabel('Z-axis');

Figure contains 3 axes objects. Axes object 1 with title Position, ylabel X-axis contains 3 objects of type line. These objects represent Tuned, Untuned, Truth. Axes object 2 with ylabel Y-axis contains 3 objects of type line. Axes object 3 with ylabel Z-axis contains 3 objects of type line.

% Orientation Error
figure;
plot(t, rad2deg(dist(Orientation, orientTunedEst)), ...
    t, rad2deg(dist(Orientation, orientUntunedEst)));
title('Orientation Error');
ylabel('Degrees');
legend('Tuned', 'Untuned');

Figure contains an axes object. The axes object with title Orientation Error, ylabel Degrees contains 2 objects of type line. These objects represent Tuned, Untuned.