Этот пример показывает, как сгенерировать показания инерциального измерительного блока (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
объект формирует показания БИНС, установленного в источник средства, а другой генерирует показания БИНС, установленного на сиденье драйвера. Затем укажите смещение между источником транспортного средства и БИНС, установленным на сиденье драйвера. Функции 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);
Вычислите траекторию основной истины БИНС, установленного на сиденье драйвера, используя transformMotion
функция. Эта функция использует смещения положения и ориентации и траекторию транспортного средства, чтобы вычислить траекторию IMU.
[posIMU, orientIMU, velIMU, accIMU, angvelIMU] = transformMotion( ... posVeh2IMU, orientVeh2IMU, ... posVeh, orientVeh, velVeh, accVeh, angvelVeh);
Сгенерировать показания БИНС как для БИНС, установленного в начале транспортного средства, так и для БИНС, установленного на сиденье драйвера.
% IMU at vehicle origin. [accel, gyro, mag] = imu(accVeh, angvelVeh, orientVeh); % IMU at driver's seat. [accelMounted, gyroMounted, magMounted] = mountedIMU( ... accIMU, angvelIMU, orientIMU);
Сравните показания акселерометра двух БИНС. Заметьте, что ускорение по оси 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)')
Сравните показания гироскопа двух БИНС.
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)')
Сравните показания магнитометра двух БИНС.
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)')