The insfilterAsync
объект является комплексным расширенным фильтром Калмана, который оценивает положение устройства. Однако ручная настройка фильтра или нахождение оптимальных значений для параметров шума может оказаться сложной задачей. Этот пример иллюстрирует, как использовать tune
функция для оптимизации параметров шума фильтра.
Чтобы проиллюстрировать процесс настройки insfilterAsync
filter, используйте простую случайную траекторию точки пути. The imuSensor
и gpsSensor
объекты создают входы для фильтра.
% 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);
The insfilterAsync
фильтровать предохранители данные от нескольких датчиков, работающих асинхронно
filtUntuned = insfilterAsync;
Установите начальные значения для State
и StateCovariance
свойства на основе основной истины. Обычно для получения начальных значений используются первые несколько выборки sensorData
наряду с стандартными программами калибровки. Однако в этом примере groundTruth
используется для установки начального состояния для быстрого сходимости фильтра.
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);
sensorData
с нетронутым фильтромИспользуйте tunernoise
функция для создания измерительных шумов, которые также должны быть настроены. Чтобы проиллюстрировать необходимость настройки, сначала используйте фильтр с параметрами по умолчанию.
mn = tunernoise('insfilterAsync');
[posUntunedEst, orientUntunedEst] = fuse(filtUntuned, sensorData, mn);
sensorData
Используйте tune
функция для минимизации корневой средней квадратной (RMS) ошибки между groundTruth
и оценки состояния.
cfg = tunerconfig(class(filtTuned),'MaxIterations',15,'StepForward',1.1); tunedmn = tune(filtTuned,mn,sensorData,groundTruth,cfg);
Iteration Parameter Metric _________ _________ ______ 1 AccelerometerNoise 4.7634 1 GyroscopeNoise 4.7439 1 MagnetometerNoise 4.7260 1 GPSPositionNoise 4.6562 1 GPSVelocityNoise 4.4895 1 QuaternionNoise 4.4895 1 AngularVelocityNoise 4.1764 1 PositionNoise 4.1764 1 VelocityNoise 4.1764 1 AccelerationNoise 4.1657 1 GyroscopeBiasNoise 4.1657 1 AccelerometerBiasNoise 4.1615 1 GeomagneticVectorNoise 4.1615 1 MagnetometerBiasNoise 4.1466 2 AccelerometerNoise 4.1466 2 GyroscopeNoise 4.1466 2 MagnetometerNoise 4.1218 2 GPSPositionNoise 4.1218 2 GPSVelocityNoise 3.9411 2 QuaternionNoise 3.9404 2 AngularVelocityNoise 3.2970 2 PositionNoise 3.2970 2 VelocityNoise 3.2970 2 AccelerationNoise 3.2735 2 GyroscopeBiasNoise 3.2735 2 AccelerometerBiasNoise 3.2711 2 GeomagneticVectorNoise 3.2711 2 MagnetometerBiasNoise 3.2709 3 AccelerometerNoise 3.2704 3 GyroscopeNoise 3.2475 3 MagnetometerNoise 3.2338 3 GPSPositionNoise 3.2338 3 GPSVelocityNoise 3.1333 3 QuaternionNoise 3.1333 3 AngularVelocityNoise 3.0267 3 PositionNoise 3.0267 3 VelocityNoise 3.0267 3 AccelerationNoise 3.0267 3 GyroscopeBiasNoise 3.0267 3 AccelerometerBiasNoise 3.0248 3 GeomagneticVectorNoise 3.0248 3 MagnetometerBiasNoise 3.0184 4 AccelerometerNoise 3.0156 4 GyroscopeNoise 3.0028 4 MagnetometerNoise 2.9903 4 GPSPositionNoise 2.9872 4 GPSVelocityNoise 2.9043 4 QuaternionNoise 2.9043 4 AngularVelocityNoise 2.7873 4 PositionNoise 2.7873 4 VelocityNoise 2.7873 4 AccelerationNoise 2.7833 4 GyroscopeBiasNoise 2.7833 4 AccelerometerBiasNoise 2.7821 4 GeomagneticVectorNoise 2.7821 4 MagnetometerBiasNoise 2.7727 5 AccelerometerNoise 2.7693 5 GyroscopeNoise 2.7591 5 MagnetometerNoise 2.7591 5 GPSPositionNoise 2.7580 5 GPSVelocityNoise 2.6806 5 QuaternionNoise 2.6804 5 AngularVelocityNoise 2.5956 5 PositionNoise 2.5956 5 VelocityNoise 2.5956 5 AccelerationNoise 2.5880 5 GyroscopeBiasNoise 2.5880 5 AccelerometerBiasNoise 2.5874 5 GeomagneticVectorNoise 2.5874 5 MagnetometerBiasNoise 2.5693 6 AccelerometerNoise 2.5651 6 GyroscopeNoise 2.5529 6 MagnetometerNoise 2.5472 6 GPSPositionNoise 2.5344 6 GPSVelocityNoise 2.4514 6 QuaternionNoise 2.4514 6 AngularVelocityNoise 2.3829 6 PositionNoise 2.3829 6 VelocityNoise 2.3829 6 AccelerationNoise 2.3826 6 GyroscopeBiasNoise 2.3826 6 AccelerometerBiasNoise 2.3822 6 GeomagneticVectorNoise 2.3822 6 MagnetometerBiasNoise 2.3675 7 AccelerometerNoise 2.3640 7 GyroscopeNoise 2.3547 7 MagnetometerNoise 2.3540 7 GPSPositionNoise 2.3428 7 GPSVelocityNoise 2.2634 7 QuaternionNoise 2.2633 7 AngularVelocityNoise 2.2179 7 PositionNoise 2.2179 7 VelocityNoise 2.2179 7 AccelerationNoise 2.2159 7 GyroscopeBiasNoise 2.2159 7 AccelerometerBiasNoise 2.2150 7 GeomagneticVectorNoise 2.2150 7 MagnetometerBiasNoise 2.2020 8 AccelerometerNoise 2.1967 8 GyroscopeNoise 2.1951 8 MagnetometerNoise 2.1948 8 GPSPositionNoise 2.1804 8 GPSVelocityNoise 2.1153 8 QuaternionNoise 2.1153 8 AngularVelocityNoise 2.0978 8 PositionNoise 2.0978 8 VelocityNoise 2.0978 8 AccelerationNoise 2.0944 8 GyroscopeBiasNoise 2.0944 8 AccelerometerBiasNoise 2.0944 8 GeomagneticVectorNoise 2.0944 8 MagnetometerBiasNoise 2.0822 9 AccelerometerNoise 2.0771 9 GyroscopeNoise 2.0758 9 MagnetometerNoise 2.0754 9 GPSPositionNoise 2.0645 9 GPSVelocityNoise 2.0028 9 QuaternionNoise 2.0027 9 AngularVelocityNoise 1.9943 9 PositionNoise 1.9943 9 VelocityNoise 1.9943 9 AccelerationNoise 1.9883 9 GyroscopeBiasNoise 1.9883 9 AccelerometerBiasNoise 1.9876 9 GeomagneticVectorNoise 1.9876 9 MagnetometerBiasNoise 1.9770 10 AccelerometerNoise 1.9707 10 GyroscopeNoise 1.9707 10 MagnetometerNoise 1.9706 10 GPSPositionNoise 1.9564 10 GPSVelocityNoise 1.9005 10 QuaternionNoise 1.9003 10 AngularVelocityNoise 1.9003 10 PositionNoise 1.9003 10 VelocityNoise 1.9003 10 AccelerationNoise 1.8999 10 GyroscopeBiasNoise 1.8999 10 AccelerometerBiasNoise 1.8992 10 GeomagneticVectorNoise 1.8992 10 MagnetometerBiasNoise 1.8885 11 AccelerometerNoise 1.8815 11 GyroscopeNoise 1.8807 11 MagnetometerNoise 1.8806 11 GPSPositionNoise 1.8674 11 GPSVelocityNoise 1.8111 11 QuaternionNoise 1.8110 11 AngularVelocityNoise 1.8110 11 PositionNoise 1.8110 11 VelocityNoise 1.8110 11 AccelerationNoise 1.8094 11 GyroscopeBiasNoise 1.8094 11 AccelerometerBiasNoise 1.8085 11 GeomagneticVectorNoise 1.8085 11 MagnetometerBiasNoise 1.7984 12 AccelerometerNoise 1.7921 12 GyroscopeNoise 1.7919 12 MagnetometerNoise 1.7902 12 GPSPositionNoise 1.7774 12 GPSVelocityNoise 1.7315 12 QuaternionNoise 1.7313 12 AngularVelocityNoise 1.7282 12 PositionNoise 1.7282 12 VelocityNoise 1.7282 12 AccelerationNoise 1.7278 12 GyroscopeBiasNoise 1.7278 12 AccelerometerBiasNoise 1.7268 12 GeomagneticVectorNoise 1.7268 12 MagnetometerBiasNoise 1.7160 13 AccelerometerNoise 1.7103 13 GyroscopeNoise 1.7094 13 MagnetometerNoise 1.7094 13 GPSPositionNoise 1.6980 13 GPSVelocityNoise 1.6589 13 QuaternionNoise 1.6587 13 AngularVelocityNoise 1.6587 13 PositionNoise 1.6587 13 VelocityNoise 1.6587 13 AccelerationNoise 1.6575 13 GyroscopeBiasNoise 1.6575 13 AccelerometerBiasNoise 1.6566 13 GeomagneticVectorNoise 1.6566 13 MagnetometerBiasNoise 1.6480 14 AccelerometerNoise 1.6432 14 GyroscopeNoise 1.6422 14 MagnetometerNoise 1.6415 14 GPSPositionNoise 1.6330 14 GPSVelocityNoise 1.6097 14 QuaternionNoise 1.6095 14 AngularVelocityNoise 1.6093 14 PositionNoise 1.6093 14 VelocityNoise 1.6093 14 AccelerationNoise 1.6083 14 GyroscopeBiasNoise 1.6083 14 AccelerometerBiasNoise 1.6077 14 GeomagneticVectorNoise 1.6077 14 MagnetometerBiasNoise 1.6012 15 AccelerometerNoise 1.5972 15 GyroscopeNoise 1.5949 15 MagnetometerNoise 1.5942 15 GPSPositionNoise 1.5886 15 GPSVelocityNoise 1.5802 15 QuaternionNoise 1.5801 15 AngularVelocityNoise 1.5786 15 PositionNoise 1.5786 15 VelocityNoise 1.5786 15 AccelerationNoise 1.5786 15 GyroscopeBiasNoise 1.5786 15 AccelerometerBiasNoise 1.5783 15 GeomagneticVectorNoise 1.5783 15 MagnetometerBiasNoise 1.5737
[posTunedEst, orientTunedEst] = fuse(filtTuned,sensorData,tunedmn);
Постройте график оценок положения из настроенных и не настроенных фильтров вместе с основной истиной положениями. Затем постройте график ошибки ориентации (расстояние кватерниона) в степенях как для настроенных, так и для не настроенных фильтров. Настроенный фильтр оценивает положение и ориентацию лучше, чем незащищенный фильтр.
% 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');