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

Импортируйте и визуализируйте журнал рейса беспилотника с помощью 3-D анимаций и инструментальных приборов рейса. Этот пример получает обзор высокого уровня эффективности рейса в MATLAB® с помощью Инструментов Рейса (Aerospace Toolbox) функции в Aerospace Toolbox™. Затем чтобы просмотреть сигналы в пользовательском интерфейсе в Simulink®, пример использует Инструменты Рейса (Aerospace Blockset) Инструменты Рейса (Aerospace Blockset) блоки из Aerospace Blockset™

Пример извлекает сигналы интереса из файла ULOG и воспроизводит траекторию рейса UAV в MATLAB. Затем те сигналы воспроизводятся в модели Simulink с помощью инструментальных блоков.

Импортируйте журнал Рейса

Файл журнала беспилотника записывает информацию о рейсе в интервалах постоянного времени. Эта информация дает понимание эффективности рейса. Инструмент рейса измеряет переменные экранной навигации, такие как отношение, высота и заголовок беспилотника. Файл журнала ULOG для этого примера был получен из модели самолета, запускающейся в средстве моделирования Gazebo.

Импортируйте файл журнала с помощью ulogreader. Создайте flightLogSignalMapping объект для файлов ULOG.

Чтобы изучить соглашение сигналов, модули и их система координат, смотрят информацию в plotter объект. Эта информация о модулях в файле журнала становится важной при соединении сигналов с инструментальными приборами рейса.

data = ulogreader("flight.ulg");
plotter = flightLogSignalMapping("ulog");
info(plotter,"Signal")
ans=18×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"                              
    "LocalENU"                true       "X, Y, Z"                                                                                                                                                                                                     "m, m, m"                                          
    "LocalENUTarget"          true       "XTarget, YTarget, ZTarget"                                                                                                                                                                                   "m, m, m"                                          
    "LocalENUVel"             true       "VX, VY, VZ"                                                                                                                                                                                                  "m/s, m/s, m/s"                                    
    "LocalENUVelTarget"       true       "VXTarget, VYTarget, VZTarget"                                                                                                                                                                                "m/s, m/s, m/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"                                    
      ⋮

Извлеките сигналы интереса

Чтобы визуализировать рейс беспилотника с помощью инструментальных приборов, извлеките отношение, положение, скорость и скорость полета в каждый такт. Задайте соответствующее имя сигнала из информационной таблицы на предыдущем шаге. Вызовите 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 для пользователя. Координатор поворота указывает на уровень рыскания самолета с помощью показательного банковского движения (который отличается от угла крена). Для того, чтобы вычислить уровень рыскания, преобразуйте угловые уровни от системы координат тела до системы координат транспортного средства, как приведено ниже:

ψ˙=qcos(ϕ)+rsin(ϕ)cosθ

Мяч уклономера в координаторе поворота указывает на занос самолета. Этот угол заноса основан на углу между корпусом самолета и вычисленной скоростью полета. Для точной скорости полета требуется хорошая оценка вектора скорости и вектора ветра. Самый маленький БПЛА не обладает датчиками, чтобы оценить данные о векторе ветра или скорость полета при полете. БПЛА может стоять между 20-50% их скорости полета в форме встречных ветров.

Vg- Vw=Va

Чтобы вычислить занос и поворот, извлеките ветер и данные об уровне отношения непосредственно из файла журнала.

% 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));

Визуализируйте стандартные инструментальные данные о рейсе в MATLAB

Чтобы получить быстрое представление о рейсе, используйте интерфейс анимации, введенный в Данных о Траектории Рейса Отображения Используя Инструменты Рейса и Анимацию Рейса (Aerospace Toolbox) пример. Функция помощника helperDroneInstruments создает инструментальный интерфейс анимации.

helperDroneInstruments;

Набор Анемотахометра указывает на скорость беспилотника. Индикатор Artificial Horizon показывает отношение беспилотника, исключая рыскание. Индикатор Altimeter и Climb Rate показывает высоту, как зарегистрировано в барометре и датчиках скороподъемности соответственно. Координатор Поворота указывает на уровень рыскания самолета и заноса. Если скосы уклономера к левому или правому, это обозначает ситуация с блоком или промах. В скоординированном повороте занос должен быть нулем.

Визуализируйте сигналы в Simulink

В 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');