MATLAB Mobile™ сообщает данные о датчике с акселерометра, гироскопа и магнитометра на мобильных устройствах Apple или Android. Необработанные данные из каждого датчика или сплавленные данные ориентации могут быть получены. Эти примеры показывают, как сравнить слитые данные ориентации с телефона с оценкой ориентации из ahrsfilter
(Navigation Toolbox) объект.
Считайте данные записанного датчика телефона. Файл MAT samplePhoneData.mat
содержит данные о датчике, регистрируемом на iPhone со частотой дискретизации 100 Гц. Чтобы запустить этот пример с вашими собственными телефонными данными, смотрите Набор данных о датчике с MATLAB Mobile или MATLAB Online.
matfile = 'samplePhoneData.mat'; SampleRate = 100; % This must match the data rate of the phone. [Accelerometer, Gyroscope, Magnetometer, EulerAngles] ... = exampleHelperProcessPhoneData(matfile);
MATLAB Mobile использует конвенцию, показанную на следующем изображении. Для обработки данных о датчике с помощью ahrsfilter
объект, преобразуйте в NED, правую систему координат с перемещением по часовой стрелке вокруг осей, соответствующих положительным вращениям. Смените оси X и Y и отмените ось Z для различных данных о датчике. Обратите внимание, что показания акселерометра отрицаются, поскольку показания имеют противоположный знак в двух соглашениях.
Accelerometer = -[Accelerometer(:,2), Accelerometer(:,1), -Accelerometer(:,3)]; Gyroscope = [Gyroscope(:,2), Gyroscope(:,1), -Gyroscope(:,3)]; Magnetometer = [Magnetometer(:,2), Magnetometer(:,1), -Magnetometer(:,3)]; qTrue = quaternion([EulerAngles(:,3), -EulerAngles(:,2), EulerAngles(:,1)], ... 'eulerd', 'ZYX', 'frame');
Телефон может иметь случайное вращательное смещение. Не зная смещения, вы не можете сравнить ahrsfilter
объект и результаты телефона. Используйте первые четыре выборки, чтобы определить вращательное смещение, затем поверните данные телефона назад к желаемым значениям.
% Get a starting guess at orientation using ecompass. No coefficients % required. Use the initial orientation estimates to figure out what the % phone's rotational offset is. q = ecompass(Accelerometer, Magnetometer); Navg = 4; qfix = meanrot(q(1:Navg))./meanrot(qTrue(1:Navg)); Orientation = qfix*qTrue; % Rotationally corrected phone data.
Чтобы оптимизировать параметры шума для телефона, настройте ahrsfilter
объект. Параметры фильтра должны быть настроены для конкретного БИНС на телефоне, который регистрировал данные в MAT-файле. Используйте tune
(Navigation Toolbox) функция с записанными в журнал данными ориентации как основная истина.
orientFilt = ahrsfilter('SampleRate', SampleRate); groundTruth = table(Orientation); sensorData = table(Accelerometer, Gyroscope, Magnetometer); tc = tunerconfig('ahrsfilter', "MaxIterations", 30, ... 'ObjectiveLimit', 0.001, 'Display', 'none'); tune(orientFilt, sensorData, groundTruth, tc);
Оцените ориентацию устройства с помощью настроенной ahrsfilter
объект.
reset(orientFilt); qEst = orientFilt(Accelerometer,Gyroscope,Magnetometer);
Постройте график углов Эйлера для каждой оценки ориентации и кватернионного расстояния между двумя оценками ориентации. Расстояние кватерниона измеряется как угол между двумя кватернионами. Это расстояние может использоваться в качестве метрики ошибки для оценки ориентации.
numSamples = numel(Orientation); t = (0:numSamples-1).'/SampleRate; d = rad2deg(dist(qEst, Orientation)); figure plot(t, eulerd(qEst, 'ZYX', 'frame')) legend yaw pitch roll title('ahrsfilter Euler Angles') ylabel('Degrees') xlabel('Time (s)')
figure plot(eulerd(Orientation, 'ZYX', 'frame')) legend yaw pitch roll title('Phone Euler Angles') ylabel('Degrees') xlabel('Time (s)')
figure plot(t, d) title('Orientation Error') ylabel('Degrees') xlabel('Time (s)') % Add RMS error rmsval = sqrt(mean(d.^2)); line(t, repmat(rmsval,size(t)),'LineStyle','-.','Color','red'); text(t(1),rmsval + 0.7,"RMS Error = " + rmsval,'Color','red')
Используйте HelperOrientationViewer
класс, чтобы просмотреть оценки ориентации телефона как 3-D прямоугольник.
fig = figure; viewer = HelperOrientationViewer("AppWindow", fig, "BoxDimensions", [2.0514, 1.0129, 0.11]); for i = 1:numel(qEst) viewer(qEst(i)); end