Симулируйте датчик IMU, смонтированный на UAV

Создайте адаптер датчика для imuSensor от Navigation Toolbox™ и собирают показания для симулированного сценария рейса UAV.

Создайте адаптер датчика

Используйте createSensorAdaptorTemplate функция, чтобы сгенерировать датчик шаблона и обновить его, чтобы адаптировать imuSensor объект для использования в сценарии UAV.

createCustomSensorTemplate

Этот пример provivdes класс адаптера uavIMU, который может быть просмотрен используя следующую команду.

edit uavIMU.m

Используйте адаптер датчика в симуляции сценария UAV

Используйте адаптер датчика IMU в симуляции Сценария UAV. Во-первых, создайте сценарий.

scenario = uavScenario("StopTime", 8, "UpdateRate", 100);

Создайте платформу UAV и задайте траекторию. Добавьте mesh фиксированного крыла для визуализации.

plat = uavPlatform("UAV", scenario, "Trajectory", ...
    waypointTrajectory([0 0 0; 100 0 0; 100 100 0], "TimeOfArrival", [0 5 8], "AutoBank", true));
updateMesh(plat,"fixedwing", {10}, [1 0 0], eul2tform([0 0 pi]));

Присоедините датчик IMU с помощью uavSensor возразите и задайте uavIMU как вход. Загрузите параметры для модели датчика.

imu = uavSensor("IMU", plat, uavIMU(imuSensor));

fn = fullfile(matlabroot,'toolbox','shared',...
    'positioning','positioningdata','generic.json');
loadparams(imu.SensorModel,fn,"GenericLowCost9Axis");

Визуализируйте сценарий.

figure
ax = show3D(scenario);
xlim([-20 200]);
ylim([-20 200]);

Предварительно выделите simData структура и поля, чтобы сохранить данные моделирования. Датчик IMU выведет ускорение и угловые уровни.

simData = struct;
simData.Time = duration.empty;
simData.AccelerationX = zeros(0,1);
simData.AccelerationY = zeros(0,1);
simData.AccelerationZ = zeros(0,1);
simData.AngularRatesX = zeros(0,1);
simData.AngularRatesY = zeros(0,1);
simData.AngularRatesZ = zeros(0,1);

Setup сценарий.

setup(scenario);

Запустите симуляцию с помощью advance функция. Обновите датчики и запишите данные.

updateCounter = 0;
while true
    % Advance scenario.
    isRunning = advance(scenario);
    updateCounter = updateCounter + 1;
    % Update sensors and read IMU data.
    updateSensors(scenario);
    [isUpdated, t, acc, gyro] = read(imu);
    % Store data in structure.
    simData.Time = [simData.Time; seconds(t)];
    simData.AccelerationX = [simData.AccelerationX; acc(1)];
    simData.AccelerationY = [simData.AccelerationY; acc(2)];
    simData.AccelerationZ = [simData.AccelerationZ; acc(3)];
    simData.AngularRatesX = [simData.AngularRatesX; gyro(1)];
    simData.AngularRatesY = [simData.AngularRatesY; gyro(2)];
    simData.AngularRatesZ = [simData.AngularRatesZ; gyro(3)];

    % Update visualization every 10 updates.
    if updateCounter > 10
        show3D(scenario, "FastUpdate", true, "Parent", ax);
        updateCounter = 0;
        drawnow limitrate
    end
    % Exit loop when scenario is finished.
    if ~isRunning 
        break; 
    end
end

Figure contains an axes object. The axes object contains an object of type patch.

Визуализируйте симулированные показания IMU.

simTable = table2timetable(struct2table(simData));
figure
stackedplot(simTable, ["AccelerationX", "AccelerationY", "AccelerationZ", ...
    "AngularRatesX", "AngularRatesY", "AngularRatesZ"], ...
    "DisplayLabels", ["AccX (m/s^2)", "AccY (m/s^2)", "AccZ (m/s^2)", ...
    "AngularRateX (rad/s)", "AngularRateY (rad/s)", "AngularRateZ (rad/s)"]);

Figure contains an object of type stackedplot.

Для просмотра документации необходимо авторизоваться на сайте