ВВЕДЕНИЕ
Микроэлектромеханические MEMS датчики широко применяются в системах управления наземными, подводными и воздушными объектами, в навигации, смартфонах, игровых консолях. MEMS датчики используются для измерения угловых скоростей (гироскопы), ускорений (акселерометры), давления, влажности, температуры, концентрации химических веществ, газов.
Показания MEMS датчиков содержат ошибки, генерируемые шумами, нелинейностями, нестабильностью, взаимовлиянием координат, и др. источниками.
Существует и разрабатывается целый ряд методов минимизации ошибок. Оценки эффективности методов проводятся на показаниях MEMS датчиков, полученных при разных условиях эксплуатации.
Наличие модели показаний MEMS датчиков, включающих спектр ошибок приведенных его спецификации, позволяет оперативно оценить эффективность методов минимизации ошибок. Модель показаний датчиков может также помочь в разработке и оптимизации методов.
В этой работе рассматриваются средства MATLAB для генерации показаний виртуальных инерциальных MEMS датчиков.
Этапы моделирования MEMS датчика
Схема моделирования показаний MEMS датчика на примере показаний accelReadings виртуального акселерометра, перемещающегося с ускорением acceleration [1] представлена на Рисунок 1. Показания датчика содержат ошибки, вызванные шумами, дрейфом нуля, взаимовлиянием координат, изменением температуры, квантованием и др. факторами.
![Рисунок 1.Схема моделирования показаний accelReadings виртуального акселерометра, перемещающегося с ускорением acceleration [1]. Рисунок 1.Схема моделирования показаний accelReadings виртуального акселерометра, перемещающегося с ускорением acceleration [1].](https://habrastorage.org/r/w1560/getpro/habr/upload_files/79b/97f/b00/79b97fb005956cb82b5cbabea2852905.png)
Моделирование показаний MEMS датчика включает два основных этапа:
1. Построение модели датчика (акселерометр – гироскоп, акселерометр – магнитометр, или акселерометр – гироскоп – магнитометр), которая содержит основные источники ошибок (Рисунок 2).
2. Формирование и подача воздействий на модель в виде линейных ускорений, угловых скоростей и ориентации датчика (Рисунок 3).


Создание объектов параметров датчиков модуля MPU-9250
3D акселерометр
Данные спецификации
3D акселерометр с 16 битным АЦП показывает линейные ускорения. Параметры акселерометра:
Диапазон: ± 2 ± 4 ± 8 ± 16g
Чувствительность в диапазонах ± 2, ± 4, ± 8, ± 16g: 16384, 8192, 4096, 2048 бит/g
Точность начальной калибровки: ± 3%
Чувствительность к температуре: ± 0.02%/°С (-40°C .. +85°C)
Нелинейность: 0.5%
Чувствительность к показаниям по другим осям: ± 2%
Показание нуля по X и Y: ± 50 мg
Показание нуля по Z: ± 80 мg
Изменение X и Y нуля от температуры: ± 35 мg (0°C .. +70°C)
Изменение Z нуля от температуры: ± 60 мg (0°C .. +70°C)
Спектральная плотность шума: 14 ug/sqrt(Гц) (10 Гц, ± 2g, 1кГц АЦП)
Частота программируемого семплирования АЦП: от 4 до 1000 преобразований в секунду.
Показания акселерометра микросхемы MPU-6050 установленной в горизонтальной плоскости: 0g по X и Y осям и +1g по оси Z
Объект параметров accelparams
Класс accelparams задает параметры акселерометра для моделирования инерциального акселерометра с помощью объектной модели imuSensor.
Следующие параметры 3D акселерометра объединяются в объект.
accel_params = accelparams (...
'MeasurementRange',2*9.81,... % m/s2 (default: Inf)
'Resolution', 2*9.81/2^16,... % (m/s2)/LSB (default: 0)
'ConstantBias', [0 0 0],... % m/s2 (default: [0 0 0])
'AxesMisalignment', [0 0 0],... % % (default: [0 0 0])
'NoiseDensity', Na,... % (m/s2)/√Hz (default: [0 0 0])
'BiasInstability', Ba,... % m/s2 (default: [0 0 0])
'RandomWalk', Ka,... % (m/s2)/√Hz (default: [0 0 0])
'TemperatureBias', [0 0 0],... % (m/s2)/°C (default: [0 0 0])
'TemperatureScaleFactor', [0 0 0]); % %/°C (default: [0 0 0])
Например,
Na = [1.4 1.4 2.5]*1e-3
Ka = [1.2318 1.517 2.3184]*1e-06
Ba = [1.4487 1.022 1.8373]*1e-04
>> accel_params = accelparams('MeasurementRange', 2*9.81,'Resolution', 2*9.81/2^16,'NoiseDensity', N, 'RandomWalk', K, 'BiasInstability', B);
3D гироскоп
Данные спецификации
3D гироскоп с 16 битным АЦП показывает угловую скорость. Параметры гироскопа:
Диапазон: ± 250, ± 500, ± 1000, ± 2000 °/с
Чувствительность в диапазонах ± 250, ± 500, ± 1000, ± 2000 °/с: 131, 65.5, 32.8, 16.4 бит/(°/с)
Изменение коэффициента пропорциональности: < ± 3% (25 °C)
Чувствительность коэффициента пропорциональности к изменению температуры: ± 2%
Нелинейность: ± 0.2%
Чувствительность к показаниям по другим осям: ± 2%
Показания при нулевой скорости: ± 20 °/с (25 °С)
Зависимость показаний при нулевой скорости от температуры: ± 20 °/с (-40°C .. +85°C)
Чувствительность к линейным ускорениям: ± 0,1 (°/с)/g
Среднеквадратичный уровень шума (RMS): 0.05 °/с (± 250 °/с; 100 Гц)
Среднеквадратичный низкочастотный уровень шума (RMS): 0.033 °/с (± 250 °/с; 1-10 Гц)
Спектральная плотность шума (RMS): 0.005 °/с/sqrt(Гц) (± 250 °/с; 10 Гц)
Механические частоты
X 30 (33) 36 кГц
Y 27 (30) 33 кГц
Z 24 (27) 30 кГц
Частота программируемого семплирования АЦП: от 4 до 8000 преобразований в секунду.
Время установки показаний гироскопа после его включения: 30 мс (от подачи питания до ± 1 °/с от конечного значения)
Объект параметров
Класс gyroparams создает объект параметров гироскопа для моделирования инерциального гироскопа с помощью объектной модели imuSensor.
Объект включает следующие параметры модели гироскопа.
gyro_params = gyroparams( ...
'MeasurementRange',deg2rad(250), ... % rad/s (default: Inf)
'Resolution', deg2rad(250/2^16), ... % (rad/s)/LSB (default: 0)
'ConstantBias', [0 0 0], ... % rad/s (default: [0 0 0])
'AxesMisalignment', [0 0 0], ... % % (default: [0 0 0])
'NoiseDensity', Ng, ... % (rad/s)/√Hz (default: [0 0 0])
'BiasInstability', Bg, ... % rad/s (default: [0 0 0])
'RandomWalk', Kg, ... % (rad/s)/√Hz (default: [0 0 0])
'TemperatureBias', [0 0 0], ... % (rad/s)/°C (default: [0 0 0])
'TemperatureScaleFactor', [0 0 0], ... % %/°C (default: [0 0 0])
'AccelerationBias', [0 0 0]); % (rad/s)/(m/s2)(default:[0 0 0])
Например,
Ng = deg2rad([86.5 91.6 92.9]*1e-3);
Kg = deg2rad([3.076 8.289 3.6737]*1e-05);
Bg = deg2rad([3.09 5.8 3]*1e-03);
>> gyro_params = gyroparams('MeasurementRange', deg2rad(250*2),'Resolution', deg2rad(250*2/2^16),'NoiseDensity', Ng, 'RandomWalk', Kg, 'BiasInstability', Bg);
3D магнитометр
Данные спецификации
3D магнитометр с 16 битным АЦП показывает индукцию магнитного поля вокруг датчика. Параметры магнитометра:
o Диапазон измерения: >= +/- 4912 uT (25oC)
o Встроенный АЦП:
Разрешение: 14-/16-бит
Чувствительность: 0.57 (0.6) 0.63 µT/LSB typ. (14-бит)
0.1425 (0.15) 0.1575 µT/LSB typ. (16-бит)
Начальное смещение: -500 .. +500 бит (25oC)
Время измерения: (7.2) 9 мс
o Имеет встроенный источник магнитного поля для калибровки датчика
Объект параметров
Класс (объект) magparams задает параметры магнитометра. Этот объект используется для моделирования магнитометра.
mag_params = magparams (...
'MeasurementRange', 4800,... % uT (default: Inf)
'Resolution', 4800*2/2^16,... % uT/LSB (default: 0)
'ConstantBias', [0 0 0],... % uT (default: [0 0 0])
'AxesMisalignment', [0 0 0],... % % (default: [0 0 0])
'NoiseDensity', Nm,... % uT/√Hz (default: [0 0 0])
'BiasInstability', Bm,... % uT (default: [0 0 0])
'RandomWalk', Km,... % uT/√Hz (default: [0 0 0])
'TemperatureBias', [0 0 0],... % uT/°C (default: [0 0 0])
'TemperatureScaleFactor', [0 0 0]); % %/°C (default: [0 0 0])
Например,
Nm = [0.6 0.6 0.9]/sqrt(100)
mag_params = magparams('MeasurementRange',4800,'Resolution', 4800*2/2^16, 'ConstantBias',1, 'NoiseDensity',Nm,'TemperatureBias', [0.8 0.8 2.4], 'TemperatureScaleFactor',0.1);
Коэффициенты отклонения Аллана
Коэффициенты N, B, K отклонения Аллана пропорциональны следующим ошибкам MEMS датчиков:
· N - случайное блуждание по углу (ARW - Angle Random Walk),
· B - нестабильность смещения (BI - Bias Instability),
· K - случайное блуждание по скорости (RRW - Rate Random Walk),
Коэффициенты контретного датчика можно вычислить по наклонам графика adev отклонения Аллана. Отклонения вычисляются для заданного количества точек m по долговременным показаниям датчика, полученными с частотой опроса Fs.
Отклонения Аллана равны квадратному корню от дисперсии Аллана:
[avar,tau] = allanvar(omega,'octave',Fs); % avar(tau) дисперсия Аллана
или
[avar, tau] = allanvar(omega, m, Fs);

Зависимость коэффициентов Аллана от частоты семплирования Fs
Таблица 1. Изменение Fs прореживанием массива долговременных показаний
| Fs = 2 | Fs = 0.2 | Fs = 0.02 | Fs = 0.002 | Fs = 0.0002 |
N K B | 0.0865 3.0761e-05 0.0031 | 0.2741 3.3292e-05 0.0042 | 0.8717 3.9661e-05 0.0080 | 2.8123 1.0783e-04 0.0265 | 15.4488 4.2866e-04 0.0737 |
При прореживании показаний в 100 раз, приводящему к такому же уменьшению частоты семплирования, на участке изменения Fs от 2 до 0.02 Гц
N увеличивается в 10 раз
K увеличивается на 25%
B увеличивается в 2.7 разa
Таблица 2. Изменение Fs при сохранении массива долговременных показаний
| Fs = 2 | Fs = 0.2 | Fs = 20 | Fs = 200 | Fs = 2000 |
N K B | 0.0865 3.0761e-05 0.0031 | 0.2737 9.7273e-06 0.0031 | 0.0274 9.7273e-05 0.0031 | 0.0087 3.0761e-04 0.0031 | 0.0027 9.7273e-04 0.0031 |
При увеличении частоты Fs в 100 раз от 2 до 200 Гц
N уменьшается в 10 раз
K увеличивается в 10 раз
B остается без измерения
Создание модели MEMS датчика
Для моделирования показаний датчика необходимо создать системный объект модели imuSensor c заданными свойствами, а затем работать с объектом, как если бы это была функция.
Виртуальный модуль MEMS модуля может включать следующие типы датчиков.
'accel-gyro'
'accel-mag'
'accel-gyro-mag'
Варианты создания IMU объектов MEMS датчика c перечисленными выше структурами:
% Создание модели 'accel-gyro' MEMS датчика
IMU_accel_gyro = imuSensor( ...
'IMUType', 'accel-gyro', ... % 'accel-gyro' (default)'
'SampleRate', Fs, ... % 100 (default)
'Temperature', 25, ... % 25 (default)
'Accelerometer', accel_params, ... % accel_params object (default)
'Gyroscope', gyro_params, ... % gyro_params object (default)
'RandomStream', 'Global stream'); % 'Global stream' (default) | 'mt19937ar with seed'
% Создание модели 'accel-mag' MEMS датчика
IMU_accel_mag = imuSensor( ...
'IMUType', 'accel-mag', ... % 'accel-gyro' (default)'
'SampleRate', Fs, ... % 100 (default)
'Temperature', 25, ... % 25 (default)
'MagneticField', [27.5550 -2.4169 -16.0849],... % [27.5550 -2.4169 -16.0849] (default)
'Accelerometer', accel_params, ... % accel_params object (default)
'Magnetometer', mag_params, ... % mag_params object (default)
'RandomStream', 'Global stream'); % 'Global stream' (default) | 'mt19937ar with seed'
% Создание модели 'accel-gyro_mag' MEMS датчика
IMU_accel_gyro_mag = imuSensor( ...
'IMUType', 'accel-gyro-mag', ... % 'accel-gyro' (default)'
'SampleRate', Fs, ... % 100 (default)
'Temperature', 25, ... % 25 (default)
'MagneticField', [27.5550 -2.4169 -16.0849],... % [27.5550 -2.4169 -16.0849] (default)
'Accelerometer', accel_params, ... % accel_params object (default)
'Gyroscope', gyro_params, ... % gyro_params object (default)
'Magnetometer', mag_params, ... % mag_params object (default)
'RandomStream', 'Global stream'); % 'Global stream' (default) | 'mt19937ar with seed'
Например:
Fs= 1000;
IMU_accel_gyro = imuSensor('SampleRate', Fs, 'Accelerometer', accel_params, 'Gyroscope', gyro_params);
IMU_accel_gyro_mag = imuSensor('accel-gyro-mag','SampleRate', Fs, 'Accelerometer', accel_params, 'Gyroscope', gyro_params, 'Magnetometer', mag_params);
Моделирование показаний MEMS датчика
Варианты моделей IMU:
[accelReadings,gyroReadings] = IMU(acc_body,angVel_body)
[accelReadings,gyroReadings] = IMU(acc_body,angVel_body,orientation_body)

[accelReadings,magReadings] = IMU(acc_body,angVel_body)
[accelReadings,magReadings] = IMU(acc_body,angVel_body,orientation_body)

[accelReadings,gyroReadings,magReadings] = IMU(acc_body,angVel_body)
[accelReadings,gyroReadings,magReadings] = IMU(acc_body,angVel_body,orientation_body)
% accelReadings [m/s2], gyroReadings [rad/s], magReadings [uT]

Модели позволяют моделировать показания виртуальных датчиков: акселерометров accelReadings, гироскопов gyroReadings, и магнитометров magReadings, соответствующие воздействиям и характеристикам (параметрам) датчиков.
На вход моделей подаются ускорения датчика acc по трем координатам, угловые скорости angVel по трем координатам и, опционно, положение в пространстве orientation в кватернионах, например, 0.99953 + 0.010297i - 0.0093976j + 0.027471k или матрицах вращения.
Показания 3D акселерометра
Задание траекторий ускорения датчика
Fs = 1000; % частота семплирования
numSamples = 10000; % количество показаний
t = 0:1/Fs:(numSamples-1)/Fs; % время считывания показаний
ang_vel_body = zeros(numSamples, 3); % массив 3D угловых скоростей
acc_body = zeros(numSamples, 3); % массив 3D линейных ускорений
acc_x = 0.02*(2*pi/3.3)^2*sin(6*pi*t/10); % ускорение вдоль X, период 3.3с
acc_body(:,1) = acc_x;
Сравнение показаний модели и реального акселерометра
% создание объекта IMU модели
IMU = imuSensor('accel-gyro','SampleRate', Fs, 'Accelerometer', accel_params, 'Gyroscope', gyro_params);
% моделирование показаний accelReadings акселерометра и gyroReadings гироскопа
[accelReadings,gyroReadings] = IMU(acc_body,ang_vel_body);
% accelReadings [m/s2], gyroReadings [rad/s]
На Рисунок 5 показаны смоделированные и реальные показания акселерометра X и их стандартные отклонения.

ВЫВОДЫ
1. Стандартное отклонение шумов (Рисунок 5) смоделированных показаний акселерометра = [0.002 0.005 0.014 0.044] увеличивается с ростом частоты семплирования Fs = [2 10 100 1000] в √(Fs/2) раз.
2. Стандартное отклонение шумов реального датчика не изменяется c увеличением частоты семплирования от 2 Гц до 1000 Гц.
3. Стандартное отклонение stdm смоделированных показаний акселерометра совпадает со стандартным отклонением stdsens показаний датчика когда оба варианта получены при одинаковой частоте семплирования Fsens и коэффициенты Аллана модели Nmb и Kmb больше соответствующих коэффициентов реального датчика Nsens и Ksens в √(Fsens) раз.
Например, если по долговременным показаниям реального датчика на частоте семплирования Fsens = 2 Hz вычислены коэффициенты Аллана Nsens = 0.0014 и Ksens = 1.2318e-06, то для моделирования показаний с тем же стандартным отклонением необходимо установить коэффициенты Аллана
4. При постоянных N, K коэффициентах Аллана, увеличение частоты Fsm семлирования модели относительно частоты Fsens семлирования датчика приводит к росту стандартного отклонения stdm модели относительно стандартного отклонения stdsens:
как показано на Рисунок 5.
5. Для обеспечения равенства между стандартным отклонением stdm модели и stdsens датчика при частоте семплирования модели Fsm отличающейся от частоты семплирования датчика Fsens необходимо задать коэффициенты Аллана модели Nm и Km с учетом N, K коэффициентов датчика:

Показания 3D гироскопа
Задание траекторий угловой скорости датчика
Fs = 1000; % частота семплирования
numSamples = 10000; % количество показаний
t = 0:1/Fs:(numSamples-1)/Fs; % время считывания показаний
acc_body = zeros(numSamples, 3); % массив 3D линейных ускорений
ang_vel_body = zeros(numSamples, 3); % массив 3D угловых скоростей
ang_vel_x = 20*(2*pi/3.3)*sin(6*pi*t/10); % скорость поворота вокруг X
ang_vel_body(:,1) = ang_vel_x;
Сравнение показаний модели и реального гироскопа
% создание объекта IMU модели
IMU = imuSensor('accel-gyro','SampleRate', Fs, 'Accelerometer', accel_params, 'Gyroscope', gyro_params);
% моделирование показаний accelReadings акселерометра и gyroReadings гироскопа
[accelReadings,gyroReadings] = IMU(acc_body,ang_vel_body);
% accelReadings [m/s2], gyroReadings [rad/s]
[accelReadings,gyroReadings] = IMU(acc_body,ang_vel_body);
% accelReadings [m/s2], gyroReadings [rad/s
ВНИМАНИЕ! При моделировании показаний, коэффициенты Аллана Т и К, а также угловая скорость модели датчика задаются в рад/с, а не в град/с.

ВЫВОДЫ
1. Стандартное отклонение шумов (Рисунок 7) смоделированных показаний гироскопа stdm = [0.124 0.298 0.889 2.725] увеличивается с ростом частоты семплирования Fs = [2 10 100 1000] в √(Fs/2) раз.
2. Стандартное отклонение шумов реального датчика не изменяется c увеличением частоты семплирования от 2 Гц до 1000 Гц.
3. Стандартное отклонение stdm смоделированных показаний гироскопа совпадает со стандартным отклонением stdsens показаний датчика когда оба варианта получены при одинаковой частоте семплирования Fsens и коэффициенты Аллана модели Nmb и Kmb больше соответствующих коэффициентов реального датчика Nsens и Ksens в √Fsens раз.
Например, если по долговременным показаниям реального датчика на частоте семплирования Fsens = 2 Hz вычислены коэффициенты Аллана Nsens = 0.0865 и Ksens = 3.076e-05, то для моделирования показаний с тем же стандартным отклонением необходимо установить коэффициенты Аллана
4. При постоянных N, K коэффициентах Аллана, увеличение частоты Fsm семлирования модели относительно частоты Fsens семлирования датчика приводит к росту стандартного отклонения stdm модели относительно стандартного отклонения stdsens :
как показано на Рисунок 7.
5. Для обеспечения равенства между стандартным отклонением stdm модели и stdsens датчика при частоте семплирования модели Fsm отличающейся от частоты семплирования датчика Fsens необходимо задать коэффициенты Аллана модели Nm, Km с учетом N, K коэффициентов датчика:

Показания 3D магнитометра
Моделирование показаний по угловой скорости датчика
Показания магнитометра зависят от поворотов датчика, которые моделируются угловыми скоростями датчика ang_vel_body.
acc_body = zeros(numSamples, 3); % массив 3D линейных ускорений
ang_vel_body = zeros(numSamples, 3); % массив 3D угловых скоростей
acc_x = 0.02*(2*pi/3.3)^2*sin(6*pi*t/10); % ускорение вдоль X, период 3.3с
ang_vel_x = 20*(2*pi/3.3)*sin(6*pi*t/10); % скорость поворота вокруг X
ang_vel_body(:,2) = ang_vel_x;
[accelReadings,magReadings] = IMU(acc_body,ang_vel_body);
% accelReadings [m/s2], magReadings [uT]
Пример показаний виртуального магнитометра показан на Рисунок 9. Показания магнитометра и амплитуда шумов в точности совпадают с задаваемой угловой скоростью датчика ang_vel_body и шумами модели гироскопа (Рисунок 8).

Моделирование показаний магнитометра через ориентацию датчика
Fcapt = 134; % частота семплирования показаний магнетометра
Fs = 134; % частота семплирования показаний модели
Nm = [1.9 1.9 1.9]*Fcapt/sqrt(Fs)
mag_params = magparams('MeasurementRange',4800,'Resolution', 4800*2/2^16, 'ConstantBias', [-3100 -1200 3010], 'NoiseDensity',Nm);
orientation_body = quaternion.ones(numSamples, 1); % val = 1 + 0i + 0j + 0k
acc_body = zeros(numSamples, 3); % массив 3D линейных ускорений
ang_vel_body = zeros(numSamples, 3); % массив 3D угловых скоростей
IMU = imuSensor('accel-mag','SampleRate',Fs); % объект модели
[accelReadings,magReadings] = IMU(acc_body,ang_vel_body,orientation_body); % magReadings in [мкТл]

В моделях 'accel-mag' и 'accel-gyro_mag' амплитуда магнитной индукции устанавливается через свойство модели 'MagneticField' , для показаний магнетометра (Рисунок 11) установлены значения амплитуды [-3000 -1100 3000], смещение показаний 'ConstantBias' в списке параметров объекта magparams равно [0 0 0].
Независимые (без модели магнитометра) вычисления магнитной индукции :
где ang_vel_body - скорость поворота датчика в [рад/с].
Для совпадения показаний модели Z магнитометра и реального магнитометра (Рисунок 10) вместо 'ConstantBias', [-3100 -1200 3010] в списке параметров объекта magparams заданы смещения модели
'ConstantBias',[0 0 0].
Для соответствия уровня шумов модели магнитометра шумам реального датчика (std = 170 [мкТл], Рисунок 10) коэффициенты дисперсии Аллана 'NoiseDensity' объекта параметров равны
где Fsens = 134 Гц – частота опроса реального магнитометра; Fs – частота опроса модели магнитометра.
Показание модели (шумы и амплитуда сигнала) модели магнитометра (Рисунок 11) адекватны показанию реального магнитометра Рисунок 10. Стандартное отклонение показаний модели не зависит от частоты семплирования.

При поворотах (изменении ориентации) магнитометра вокруг оси Z изменяются показания магнитометров X и Y (Рисунок 11), показания линейных акселерометров не меняются. При поворотах магнитометра вокруг X и Z изменяются показания магнитометров и акселерометров (Рисунок 12).

Моделирование ориентации датчика
Ориентация изменяет чувствительность акселерометров. Ориентация модели датчика вычисляется в кватернионах или 3х3 матрицами поворота для каждого показания.
Преобразование кватерниона, вектора поворота и угла Эйлера
Преобразование кватерниона в вектор поворота и угол Эйлера и обратные преобразования выполняются следующими функциями MATLAB.
q = [0.7071 0.7071 0 0]
quat = quaternion(q) % создание кватерниона
q = 0.7071 0.7071 0 0
norm(quat) = 1
rotationVector = rotvec(quat) % преобразование кватерниона в вектор поворота (рад)
rotationVector = 1.5708 0 0
quat_back = quaternion(rotationVector,'rotvec') % обратное преобразование вектора поворота (рад) в кватернион
quat_back = 0.70711 + 0.70711i + 0j + 0k
rotationVectord = rotvecd(quat) % преобразование кватерниона в вектор поворота (град)
rotationVectord = 90 0 0
quat_back = quaternion(rotationVectord,'rotvecd') % обратное преобразование вектора поворота (град) в кватернион
quat_back = 0.70711 + 0.70711i + 0j + 0k
eulerAnglesRandians = euler(quat,'ZYX','frame') % Преобразование кватерниона в угол Эйлера (рад)
eulerAnglesRandians = 0 0 1.5708
quat_back = quaternion(eulerAnglesRandians,'euler','ZYX','frame') % обратное преобразование угол Эйлера (рад) в кватернион
quat_back = 0.70711 + 0.70711i + 0j + 0k
eulerAnglesDegrees = eulerd(quat,'XYZ','frame') % Преобразование кватерниона в угол Эйлера (град)
eulerAnglesDegrees = 90.0000 0 0
quat_back = quaternion(eulerAnglesDegrees,'eulerd','XYZ','frame') % обратное преобразование угол Эйлера (uрад) в кватернион
quat_back = 0.70711 + 0.70711i + 0j + 0k
Моделирование ориентации по показаниям гироскопов и акселерометров
Формирование ориентации моделью imufilter
Для моделирования ориентации по показаниям гироскопов и акселерометров необходимо создать объект imufilter с заданными свойствами, а затем, использовать объект как функцию, которая вычисляет ориентацию кватернионами или матрицами поворота в соответствии с угловыми скоростями и ускорениям.
Создание объекта FUSE модели imufilter :
FUSE = imufilter (...
'SampleRate', 100,... % 100 (default), (Hz)
'DecimationFactor', 1,... % 1 (default)
'AccelerometerNoise', 0.00019247,... % 0.00019247 (default), (m/s2)^2
'GyroscopeNoise', 9.1385e-05,... % 9.1385e-05 (default) (rad/s)^2
'GyroscopeDriftNoise', 3.0462e-13,... % 3.0462e-13 (default) (rad/s)^2
'LinearAccelerationNoise', 0.0096236,...% 0.0096236 (default) (m/s2)^2
'LinearAccelerationDecayFactor', 0.5,...% 0.5 (default)
'OrientationFormat', 'quaternion'); % 'quaternion' (default) | 'Rotation matrix'; 3x3xN
Например
FUSE = imufilter('OrientationFormat', 'quaternion')
[orientation,angularVelocity] = FUSE(acc_body,ang_vel_body)
quaterionEulerAngles = eulerd(orientation_body,'XYZ','frame')
ВНИМАНИЕ.
1. Угловая скорость ang_vel_body задается в рад/с
2. Ориентация в углах Эйлера равна отношению угловой скорости к частоте семплирования:
3. Ориентация вычисляется относительно координат акселерометра, например изменение вектора ускорений acc_body = [0 0 9.81] до [0 9.81 0] изменяет ориентацию вокруг X на 90 градусов.
Моделирование ориентации по показаниям акселерометров и магнитометров, ecompass()
accelerometerReading = [0 0 9.81]; % [м/с2]
magnetometerReading = [109 -23 9807]; % [нТл]
% ориентация в кватернионах
orientation_body = ecompass(accelerometerReading,magnetometerReading)
% orientation_body = 0.9946 + 0i + 0j + 0.10379k
quaterionEulerAngles = eulerd(orientation_body,'ZYX','frame')
% quaterionEulerAngles = 11.9151 0 0
Формирование ориентации моделью kinematicTrajectory
Для моделирования ориентации orientationNED по угловой скорости и линейному ускорению инерциального датчика необходимо создать объект kinematicTrajectory с заданными свойствами, а затем, использовать объект как функцию, которая вычисляет ориентацию кватернионами или матрицами поворота в соответствии с угловыми скоростями ang_vel_body и ускорениями acc_body.
traj = kinematicTrajectory(...
'SampleRate', 100, ... % 100 (default) (Hz)
'Position', [0 0 0], ... % [0 0 0] (default) (m)
'Velocity', [0 0 0], ... % [0 0 0] (default) (m/s)
'Orientation', quaternion(1,0,0,0), ... % quaternion(1,0,0,0) (default) | scalar quaternion | 3-by-3 real matrix
'AccelerationSource', 'Input', ... % 'Input' (default)
'AngularVelocitySource', 'Input'); % 'Input' (default)
[~,orientationNED,~,accNED,angVelNED] = traj(acc_body,ang_vel_body);
Как видно из приведенных примеров, показания моделей инерциальных датчиков MATLAB достаточно адекватно могут описывать показания реальных датчиков, что может пригодиться, например, при тестировании и разработке методов оптимизации и обработки показаний датчиков.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Help MATLAB

