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');
% Orientation Error figure; plot(t, rad2deg(dist(Orientation, orientTunedEst)), ... t, rad2deg(dist(Orientation, orientUntunedEst))); title('Orientation Error'); ylabel('Degrees'); legend('Tuned', 'Untuned');