Импортируйте и визуализируйте журнал рейса беспилотника с помощью 3-D анимаций и инструментальных приборов рейса. Этот пример получает обзор высокого уровня эффективности рейса в MATLAB® с помощью Инструментов Рейса (Aerospace Toolbox) функции в Aerospace Toolbox™. Затем чтобы просмотреть сигналы в пользовательском интерфейсе в Simulink®, пример использует Инструменты Рейса (Aerospace Blockset) блоки из Aerospace Blockset™
Пример извлекает сигналы интереса из файла ULOG и воспроизводит траекторию рейса UAV в MATLAB. Затем те сигналы воспроизводятся в модели Simulink с помощью инструментальных блоков.
Файл журнала беспилотника записывает информацию о рейсе в интервалах постоянного времени. Эта информация дает понимание эффективности рейса. Инструмент рейса измеряет переменные экранной навигации, такие как отношение, высота и заголовок беспилотника. Файл журнала ULOG для этого примера был получен из модели самолета, запускающейся в средстве моделирования Gazebo.
Импортируйте файл журнала с помощью ulogreader
. Создайте flightLogSignalMapping
объект для файлов ULOG.
Чтобы изучить соглашение сигналов, модули и их система координат, смотрят информацию в plotter
объект. Эта информация о модулях в файле журнала становится важной при соединении сигналов с инструментальными приборами рейса.
data = ulogreader("fwflight.ulg"); plotter = flightLogSignalMapping("ulog"); info(plotter,"Signal")
ans=14×4 table
SignalName IsMapped SignalFields FieldUnits
_____________________ ________ __________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________
"Accel" true "AccelX, AccelY, AccelZ" "m/s^2, m/s^2, m/s^2"
"Airspeed" true "PressDiff, IndicatedAirSpeed, Temperature" "Pa, m/s, degreeC"
"AttitudeEuler" true "Roll, Pitch, Yaw" "rad, rad, rad"
"AttitudeRate" true "BodyRotationRateX, BodyRotationRateY, BodyRotationRateZ" "rad/s, rad/s, rad/s"
"AttitudeTargetEuler" true "RollTarget, PitchTarget, YawTarget" "rad, rad, rad"
"Barometer" true "PressAbs, PressAltitude, Temperature" "Pa, m, degreeC"
"Battery" true "Voltage_1, Voltage_2, Voltage_3, Voltage_4, Voltage_5, Voltage_6, Voltage_7, Voltage_8, Voltage_9, Voltage_10, Voltage_11, Voltage_12, Voltage_13, Voltage_14, Voltage_15, Voltage_16, RemainingCapacity" "v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, %"
"GPS" true "Latitude, Longitude, Altitude, GroundSpeed, CourseAngle, SatellitesVisible" "degree, degree, m, m/s, degree, N/A"
"Gyro" true "GyroX, GyroY, GyroZ" "rad/s, rad/s, rad/s"
"LocalNED" true "X, Y, Z" "m, m, m"
"LocalNEDTarget" true "XTarget, YTarget, ZTarget" "m, m, m"
"LocalNEDVel" true "VX, VY, VZ" "m/s, m/s, m/s"
"LocalNEDVelTarget" true "VXTarget, VYTarget, VZTarget" "m/s, m/s, m/s"
"Mag" true "MagX, MagY, MagZ" "Gs, Gs, Gs"
Чтобы визуализировать рейс беспилотника с помощью инструментальных приборов, извлеките отношение, положение, скорость и скорость полета в каждый такт. Задайте соответствующее имя сигнала из информационной таблицы на предыдущем шаге. Вызовите extract
функция с соответствующими именами сигнала. Элемент временного вектора сигналов настроен так, они запускают в 0 секунд.
% Extract attitude and roll-pitch-yaw data. rpy = extract(plotter, data,"AttitudeEuler"); rpy{1}.Time=rpy{1}.Time-rpy{1}.Time(1); RollData = timetable(rpy{1}.Time,rpy{1}.Roll,... 'VariableNames',{'Roll'}); PitchData = timetable(rpy{1}.Time,rpy{1}.Pitch,... 'VariableNames',{'Pitch'}); YawData = timetable(rpy{1}.Time,rpy{1}.Yaw,... 'VariableNames',{'Yaw'}); % Extract position and xyz data. Position = extract(plotter, data,"LocalNED"); Position{1}.Time = Position{1}.Time-Position{1}.Time(1); X = timetable(Position{1}.Time,Position{1}.X,... 'VariableNames',{'X'}); Y = timetable(Position{1}.Time,Position{1}.Y,... 'VariableNames',{'Y'}); Z = timetable(Position{1}.Time,Position{1}.Z,... 'VariableNames',{'Z'}); % Extract velocity data. vel = extract(plotter, data,"LocalNEDVel"); vel{1}.Time=vel{1}.Time-vel{1}.Time(1); XVel = timetable(vel{1}.Time,vel{1}.VX,... 'VariableNames',{'VX'}); YVel = timetable(vel{1}.Time,vel{1}.VY,... 'VariableNames',{'VY'}); ZVel = timetable(vel{1}.Time,vel{1}.VZ,... 'VariableNames',{'VZ'}); % Extract Airspeed magnitude data. airspeed = extract(plotter, data,"Airspeed"); Airspeed = timetable(airspeed{1}.Time,airspeed{1}.IndicatedAirSpeed,... 'VariableNames',{'Airspeed'});
Наши данные о записях журнала рейса в единицах СИ. Инструментальные приборы рейса требуют преобразования в Космическую Стандартную Модульную Систему, представленную английской Системой. Это преобразование обработано в блоке визуализации, доступном в присоединенной модели Simulink для пользователя. Координатор поворота указывает на уровень отклонения от курса самолета с помощью показательного банковского движения (который отличается от угла крена). Для того, чтобы вычислить уровень отклонения от курса, преобразуйте угловые уровни от системы координат тела до системы координат транспортного средства, как приведено ниже:
Мяч уклономера в координаторе поворота указывает на занос самолета. Этот угол заноса основан на углу между корпусом самолета и вычисленной скоростью полета. Для точной скорости полета требуется хорошая оценка вектора скорости и вектора ветра. Самый маленький БПЛА не обладает датчиками, чтобы оценить данные о векторе ветра или скорость полета при полете. БПЛА может стоять между 20-50% их скорости полета в форме встречных ветров.
- =
Чтобы вычислить занос и поворот, извлеките ветер и данные об уровне отношения непосредственно из файла журнала.
% Extract roll, pitch and yaw rates and an estimated windspeed. [p,q,r,wn,we] = helperExtractUnmappedData(data); % Merge timetables. FlightData = synchronize(X,Y,Z,RollData,PitchData,YawData,XVel,YVel,ZVel,p,q,r,Airspeed,wn,we,'union','linear'); % Assemble an array for the data. FlightDataArray = double([seconds(FlightData.Time) FlightData.X FlightData.Y FlightData.Z FlightData.Roll ... FlightData.Pitch FlightData.Yaw,FlightData.VX,FlightData.VY,... FlightData.VZ,FlightData.p,FlightData.q,FlightData.r,FlightData.Airspeed,FlightData.wn,FlightData.we]); % Ensure time rows are unique. [~,ind]=unique(FlightDataArray(:,1)); FlightDataArray=FlightDataArray(ind,:); % Preprocess time data to specific times. flightdata = double(FlightDataArray(FlightDataArray(:,1)>=0,1:end));
Чтобы получить быстрое представление о рейсе, используйте интерфейс анимации, введенный в Данных о Траектории Рейса Отображения Используя Инструменты Рейса и Анимацию Рейса (Aerospace Toolbox) пример. Функция помощника helperDroneInstruments
создает инструментальный интерфейс анимации.
helperDroneInstruments;
Набор Анемотахометра указывает на скорость беспилотника. Индикатор Artificial Horizon показывает отношение беспилотника, исключая отклонение от курса. Индикатор Altimeter и Climb Rate показывает высоту, как зарегистрировано в барометре и датчиках скороподъемности соответственно. Координатор Поворота указывает на уровень отклонения от курса самолета и заноса. Если скосы уклономера к левому или правому, это обозначает ситуация с блоком или промах. В скоординированном повороте занос должен быть нулем.
В Simulik можно создать пользовательскую визуализацию сигналов с помощью инструментальных блоков, чтобы помочь диагностировать проблемы с рейсом. Например, напряжение и данные о батарее в файлах журнала могут помочь диагностировать отказы из-за несоответствующей степени или скачков напряжения. Извлеките эти данные о жидком тесте ниже, чтобы визуализировать их.
% Extract battery data. Battery = extract(plotter,data,"Battery"); % Extract voltage data from topic. Voltage = timetable(Battery{1}.Time,Battery{1}.Voltage_1,... 'VariableNames',{'Voltage_1'}); % Extract remaing battery capacity data from topic. Capacity = timetable(Battery{1}.Time,Battery{1}.RemainingCapacity,... 'VariableNames',{'RemainingCapacity'});
Откройте 'dronegauge'
модель, которая берет загруженные данные и отображает их на различных приборах и фигуре анимации UAV.
open_system('dronegauges');
Запустите модель. Сгенерированный рисунок показывает траекторию UAV в режиме реального времени, и приборы показывают текущий статус рейса.
sim('dronegauges');