В этом примере показано, как сгенерировать показания инерциального измерительного блока (IMU) от датчика, который смонтирован на наземном транспортном средстве. В зависимости от местоположения датчика ускорения IMU отличаются.
Задайте waypoint траекторию транспортного средства и вычислите положения транспортного средства с помощью 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));
Создайте два imuSensor
с 9 осями объекты состоят из акселерометра, гироскопа и датчиков магнитометра. Один
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);
Сравните показания акселерометра двух IMUs. Заметьте, что ускорение оси 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)')
Сравните показания гироскопа двух IMUs.
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)')
Сравните показания магнитометра двух IMUs.
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)')