В этом примере показано, как генерировать показания блока инерциальных измерений (IMU) от датчика, установленного на наземном транспортном средстве. В зависимости от местоположения датчика ускорения IMU различны.
Укажите траекторию ППМ транспортного средства и вычислите его позиции с помощью lookupPose.
% Sampling rate. Fs = 100; % Waypoints and times of arrival. waypoints = [1 1 1; 3 1 1; 3 0 0; 0 0 0]; t = [1; 10; 20; 30]; % Create trajectory and compute pose. traj = waypointTrajectory(waypoints, t, "SampleRate", Fs); [posVeh, orientVeh, velVeh, accVeh, angvelVeh] = lookupPose(traj, ... t(1):1/Fs:t(end));
Создание двух 9-осевых imuSensor объекты, состоящие из акселерометра, гироскопа и датчиков магнитометра. Один imuSensor объект формирует показания IMU, установленного на месте происхождения транспортного средства, а другой - показания IMU, установленного на месте водителя. Затем укажите смещение между началом координат транспортного средства и IMU, установленным на сиденье водителя. Звонить helperPlotIMU для визуализации местоположения датчиков.
% IMU at vehicle origin. imu = imuSensor("accel-gyro-mag", "SampleRate", Fs); % IMU at driver's seat. mountedIMU = imuSensor("accel-gyro-mag", "SampleRate", Fs); % Position and orientation offset of the vehicle and the mounted IMU. posVeh2IMU = [2.4 0.5 0.4]; orientVeh2IMU = quaternion([0 0 90], "eulerd", "ZYX", "frame"); % Visualization. helperPlotIMU(posVeh(1,:), orientVeh(1,:), posVeh2IMU, orientVeh2IMU);

Вычислите траекторию истинности на земле IMU, установленного на водительском кресле, с помощью transformMotion функция. Эта функция использует смещения положения и ориентации и траекторию транспортного средства для вычисления траектории IMU.
[posIMU, orientIMU, velIMU, accIMU, angvelIMU] = transformMotion( ... posVeh2IMU, orientVeh2IMU, ... posVeh, orientVeh, velVeh, accVeh, angvelVeh);
Формирование показаний IMU как для IMU, установленного в начале координат транспортного средства, так и для IMU, установленного на сиденье водителя.
% IMU at vehicle origin. [accel, gyro, mag] = imu(accVeh, angvelVeh, orientVeh); % IMU at driver's seat. [accelMounted, gyroMounted, magMounted] = mountedIMU( ... accIMU, angvelIMU, orientIMU);
Сравните показания акселерометра двух IMU. Обратите внимание, что ускорение по оси X отличается из-за расположения вне центра.
figure('Name', 'Accelerometer Comparison') subplot(3, 1, 1) plot([accel(:,1), accelMounted(:,1)]) legend('Aligned with Vehicle', 'Off-centered') title('Accelerometer') ylabel('x-axis (m/s^2)') subplot(3, 1, 2) plot([accel(:,2), accelMounted(:,2)]) ylabel('y-axis (m/s^2)') subplot(3, 1, 3) plot([accel(:,3), accelMounted(:,3)]) ylabel('z-axis (m/s^2)')

Сравните показания гироскопа двух IMU.
figure('Name', 'Gyroscope Comparison') subplot(3, 1, 1) plot([gyro(:,1), gyroMounted(:,1)]) ylim([-0.22 0.1]) legend('Aligned with Vehicle', 'Off-centered') title('Gyroscope') ylabel('x-axis (rad/s)') subplot(3, 1, 2) plot([gyro(:,2), gyroMounted(:,2)]) ylabel('y-axis (rad/s)') subplot(3, 1, 3) plot([gyro(:,3), gyroMounted(:,3)]) ylabel('z-axis (rad/s)')

Сравните показания магнитометра двух IMU.
figure('Name', 'Magnetometer Comparison') subplot(3, 1, 1) plot([mag(:,1), magMounted(:,1)]) legend('Aligned with Vehicle', 'Off-centered') title('Magnetometer') ylabel('x-axis (\muT)') subplot(3, 1, 2) plot([mag(:,2), magMounted(:,2)]) ylabel('y-axis (\muT)') subplot(3, 1, 3) plot([mag(:,3), magMounted(:,3)]) ylabel('z-axis (\muT)')
