insfilterAsync
объектом является расширенный Фильтр Калмана комплекса, который оценивает положение устройства. Однако вручную настройка фильтра или нахождение оптимальных значений для шумовых параметров могут быть сложной задачей. Этот пример иллюстрирует, как использовать tune
функция, чтобы оптимизировать параметры шума фильтра.
Проиллюстрировать настраивающий процесс insfilterAsync
отфильтруйте, используйте простую случайную waypoint траекторию. 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);
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.5898 1 GyroscopeNoise 4.5694 1 MagnetometerNoise 4.5481 1 GPSPositionNoise 4.4737 1 GPSVelocityNoise 4.2984 1 QuaternionNoise 4.2984 1 AngularVelocityNoise 3.9668 1 PositionNoise 3.9668 1 VelocityNoise 3.9668 1 AccelerationNoise 3.9556 1 GyroscopeBiasNoise 3.9556 1 AccelerometerBiasNoise 3.9511 1 GeomagneticVectorNoise 3.9511 1 MagnetometerBiasNoise 3.9360 2 AccelerometerNoise 3.9360 2 GyroscopeNoise 3.9360 2 MagnetometerNoise 3.9064 2 GPSPositionNoise 3.9064 2 GPSVelocityNoise 3.7129 2 QuaternionNoise 3.7122 2 AngularVelocityNoise 3.0116 2 PositionNoise 3.0116 2 VelocityNoise 3.0116 2 AccelerationNoise 2.9850 2 GyroscopeBiasNoise 2.9850 2 AccelerometerBiasNoise 2.9824 2 GeomagneticVectorNoise 2.9824 2 MagnetometerBiasNoise 2.9821 3 AccelerometerNoise 2.9821 3 GyroscopeNoise 2.9613 3 MagnetometerNoise 2.9432 3 GPSPositionNoise 2.9432 3 GPSVelocityNoise 2.8373 3 QuaternionNoise 2.8369 3 AngularVelocityNoise 2.6993 3 PositionNoise 2.6993 3 VelocityNoise 2.6993 3 AccelerationNoise 2.6993 3 GyroscopeBiasNoise 2.6993 3 AccelerometerBiasNoise 2.6971 3 GeomagneticVectorNoise 2.6971 3 MagnetometerBiasNoise 2.6955 4 AccelerometerNoise 2.6941 4 GyroscopeNoise 2.6797 4 MagnetometerNoise 2.6676 4 GPSPositionNoise 2.6626 4 GPSVelocityNoise 2.5530 4 QuaternionNoise 2.5530 4 AngularVelocityNoise 2.4285 4 PositionNoise 2.4285 4 VelocityNoise 2.4285 4 AccelerationNoise 2.4232 4 GyroscopeBiasNoise 2.4232 4 AccelerometerBiasNoise 2.4217 4 GeomagneticVectorNoise 2.4217 4 MagnetometerBiasNoise 2.4023 5 AccelerometerNoise 2.4019 5 GyroscopeNoise 2.3900 5 MagnetometerNoise 2.3900 5 GPSPositionNoise 2.3887 5 GPSVelocityNoise 2.2986 5 QuaternionNoise 2.2986 5 AngularVelocityNoise 2.1945 5 PositionNoise 2.1945 5 VelocityNoise 2.1945 5 AccelerationNoise 2.1863 5 GyroscopeBiasNoise 2.1863 5 AccelerometerBiasNoise 2.1856 5 GeomagneticVectorNoise 2.1856 5 MagnetometerBiasNoise 2.1615 6 AccelerometerNoise 2.1613 6 GyroscopeNoise 2.1393 6 MagnetometerNoise 2.1199 6 GPSPositionNoise 2.1112 6 GPSVelocityNoise 2.0140 6 QuaternionNoise 2.0140 6 AngularVelocityNoise 1.9288 6 PositionNoise 1.9288 6 VelocityNoise 1.9288 6 AccelerationNoise 1.9242 6 GyroscopeBiasNoise 1.9242 6 AccelerometerBiasNoise 1.9216 6 GeomagneticVectorNoise 1.9216 6 MagnetometerBiasNoise 1.9054 7 AccelerometerNoise 1.9047 7 GyroscopeNoise 1.8887 7 MagnetometerNoise 1.8820 7 GPSPositionNoise 1.8803 7 GPSVelocityNoise 1.7713 7 QuaternionNoise 1.7712 7 AngularVelocityNoise 1.7145 7 PositionNoise 1.7145 7 VelocityNoise 1.7145 7 AccelerationNoise 1.7122 7 GyroscopeBiasNoise 1.7122 7 AccelerometerBiasNoise 1.7112 7 GeomagneticVectorNoise 1.7112 7 MagnetometerBiasNoise 1.6873 8 AccelerometerNoise 1.6853 8 GyroscopeNoise 1.6790 8 MagnetometerNoise 1.6694 8 GPSPositionNoise 1.6565 8 GPSVelocityNoise 1.5700 8 QuaternionNoise 1.5676 8 AngularVelocityNoise 1.5366 8 PositionNoise 1.5366 8 VelocityNoise 1.5366 8 AccelerationNoise 1.5366 8 GyroscopeBiasNoise 1.5366 8 AccelerometerBiasNoise 1.5353 8 GeomagneticVectorNoise 1.5337 8 MagnetometerBiasNoise 1.5166 9 AccelerometerNoise 1.5129 9 GyroscopeNoise 1.5117 9 MagnetometerNoise 1.5114 9 GPSPositionNoise 1.4953 9 GPSVelocityNoise 1.4106 9 QuaternionNoise 1.4106 9 AngularVelocityNoise 1.3742 9 PositionNoise 1.3742 9 VelocityNoise 1.3742 9 AccelerationNoise 1.3731 9 GyroscopeBiasNoise 1.3731 9 AccelerometerBiasNoise 1.3715 9 GeomagneticVectorNoise 1.3715 9 MagnetometerBiasNoise 1.3576 10 AccelerometerNoise 1.3528 10 GyroscopeNoise 1.3528 10 MagnetometerNoise 1.3510 10 GPSPositionNoise 1.3322 10 GPSVelocityNoise 1.2512 10 QuaternionNoise 1.2512 10 AngularVelocityNoise 1.2507 10 PositionNoise 1.2507 10 VelocityNoise 1.2507 10 AccelerationNoise 1.2497 10 GyroscopeBiasNoise 1.2497 10 AccelerometerBiasNoise 1.2480 10 GeomagneticVectorNoise 1.2480 10 MagnetometerBiasNoise 1.2301 11 AccelerometerNoise 1.2233 11 GyroscopeNoise 1.2222 11 MagnetometerNoise 1.2220 11 GPSPositionNoise 1.2008 11 GPSVelocityNoise 1.1043 11 QuaternionNoise 1.1043 11 AngularVelocityNoise 1.1038 11 PositionNoise 1.1038 11 VelocityNoise 1.1038 11 AccelerationNoise 1.1028 11 GyroscopeBiasNoise 1.1028 11 AccelerometerBiasNoise 1.1013 11 GeomagneticVectorNoise 1.1013 11 MagnetometerBiasNoise 1.0867 12 AccelerometerNoise 1.0782 12 GyroscopeNoise 1.0767 12 MagnetometerNoise 1.0733 12 GPSPositionNoise 1.0505 12 GPSVelocityNoise 0.9564 12 QuaternionNoise 0.9563 12 AngularVelocityNoise 0.9563 12 PositionNoise 0.9563 12 VelocityNoise 0.9563 12 AccelerationNoise 0.9550 12 GyroscopeBiasNoise 0.9550 12 AccelerometerBiasNoise 0.9534 12 GeomagneticVectorNoise 0.9534 12 MagnetometerBiasNoise 0.9402 13 AccelerometerNoise 0.9303 13 GyroscopeNoise 0.9291 13 MagnetometerNoise 0.9269 13 GPSPositionNoise 0.9036 13 GPSVelocityNoise 0.8072 13 QuaternionNoise 0.8071 13 AngularVelocityNoise 0.8071 13 PositionNoise 0.8071 13 VelocityNoise 0.8071 13 AccelerationNoise 0.8065 13 GyroscopeBiasNoise 0.8065 13 AccelerometerBiasNoise 0.8052 13 GeomagneticVectorNoise 0.8052 13 MagnetometerBiasNoise 0.7901 14 AccelerometerNoise 0.7806 14 GyroscopeNoise 0.7806 14 MagnetometerNoise 0.7768 14 GPSPositionNoise 0.7547 14 GPSVelocityNoise 0.6932 14 QuaternionNoise 0.6930 14 AngularVelocityNoise 0.6923 14 PositionNoise 0.6923 14 VelocityNoise 0.6923 14 AccelerationNoise 0.6906 14 GyroscopeBiasNoise 0.6906 14 AccelerometerBiasNoise 0.6896 14 GeomagneticVectorNoise 0.6896 14 MagnetometerBiasNoise 0.6801 15 AccelerometerNoise 0.6704 15 GyroscopeNoise 0.6676 15 MagnetometerNoise 0.6653 15 GPSPositionNoise 0.6469 15 GPSVelocityNoise 0.6047 15 QuaternionNoise 0.6047 15 AngularVelocityNoise 0.6037 15 PositionNoise 0.6037 15 VelocityNoise 0.6037 15 AccelerationNoise 0.6019 15 GyroscopeBiasNoise 0.6019 15 AccelerometerBiasNoise 0.6015 15 GeomagneticVectorNoise 0.6015 15 MagnetometerBiasNoise 0.5913
[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');