2023-10-22 14:40:10 +10:00
# Aero4200-Ass3
2023-10-22 17:25:20 +10:00
# Cal Wing, Sem 2 2023
2023-10-22 14:40:10 +10:00
2023-10-22 17:25:20 +10:00
# Import System / Common Libs
2023-11-03 08:36:34 +10:00
import os , pickle
2023-10-22 14:40:10 +10:00
import numpy as np
2023-10-22 17:25:20 +10:00
import pandas as pd
2023-10-22 14:40:10 +10:00
from tqdm import tqdm
2023-11-02 17:16:52 +10:00
#from scipy.optimize import curve_fit
2023-10-22 14:40:10 +10:00
2023-10-22 18:05:38 +10:00
from numpy import pi , sin , cos , tan
2023-10-22 20:23:11 +10:00
#Import makeGraph, a custom graphing wrapper I developed, refer to it for documentation
2023-10-22 14:40:10 +10:00
from makeGraph import makeGraph , pltKeyClose , UQ_COLOURS as UQC # Custom Graphing Lib
# Make sure the relevant folders folder exists
2023-10-22 19:05:34 +10:00
folders = [ " ./images " , " ./tmp " ]
2023-10-22 14:40:10 +10:00
for folder in folders :
if not os . path . isdir ( folder ) : os . mkdir ( folder )
2023-10-22 20:23:11 +10:00
# This is a cacheing function, it checks if a cache file exists and loads it or it calcs & saves it.
# TL;DR This takes a file path & either a single variable (defArg) or some sort of callable and either
# loads it or dumps it to disk. Note: It does not validate the data inside!
2023-11-01 18:08:01 +10:00
def cacheData ( dataFilePath : str , calcFunction : callable = lambda x : x , args : tuple = ( ) , kargs : dict = { } , defArg = None , forceCalc = False , doFileDelete = False ) :
2023-10-22 19:36:56 +10:00
if len ( args ) == 0 and defArg is not None :
args = ( defArg , )
2023-10-22 19:05:34 +10:00
data = None
dataFileExt = dataFilePath . rsplit ( " . " ) [ - 1 ]
# Check if file exists
2023-11-01 18:08:01 +10:00
if os . path . isfile ( dataFilePath ) and not forceCalc :
2023-10-22 19:36:56 +10:00
print ( f " Found data file \" { dataFilePath } \" , loading data. " )
2023-10-22 19:05:34 +10:00
# Check if file is a compressed numpy file
if dataFileExt == " npz " :
2023-10-22 19:36:56 +10:00
data = np . load ( dataFilePath , allow_pickle = True ) [ " arr_0 " ]
2023-10-22 19:05:34 +10:00
elif dataFileExt == " pkl " :
#If its not then just pickle it normally
with open ( dataFilePath , ' rb ' ) as handle :
data = pickle . load ( handle )
2023-10-22 19:36:56 +10:00
elif dataFileExt == " dfz " :
data = pd . read_pickle ( dataFilePath , compression = " gzip " )
2023-10-22 19:05:34 +10:00
else :
raise TypeError ( f " Cannot determine file type of: { dataFilePath } " )
else :
2023-11-01 18:08:01 +10:00
if doFileDelete and os . path . isfile ( dataFilePath ) :
print ( f " Found data file \" { dataFilePath } \" , deleting data. " )
os . remove ( dataFilePath )
2023-10-22 19:36:56 +10:00
print ( f " Could not find data file \" { dataFilePath } \" , generating & saving data. " )
2023-10-22 19:05:34 +10:00
# Calculate Value
data = calcFunction ( * args , * * kargs )
# Check if file is a compressed numpy file
if dataFileExt == " npz " :
2023-10-22 19:36:56 +10:00
np . savez_compressed ( dataFilePath , data , allow_pickle = True )
elif dataFileExt == " dfz " :
data . to_pickle ( dataFilePath , compression = " gzip " )
2023-10-22 19:05:34 +10:00
elif dataFileExt == " pkl " :
#If its not then just pickle it normally
with open ( dataFilePath , ' wb ' ) as handle :
pickle . dump ( data , handle )
else :
raise TypeError ( f " Cannot determine file type of: { dataFilePath } " )
if data is None : raise ValueError ( " Could not import or generate data requested " )
return data
2023-11-01 18:08:01 +10:00
GRAVITY_VEC = np . array ( [ 0 , 0 , 9.81 ] )
2023-11-02 21:03:30 +10:00
INIT_FLIGHT_PRAMS = {
" position " : np . array ( [ 10 , 10 , - 50 ] ) ,
" velocity " : np . array ( [ 0 , 0 , 0 ] ) ,
" attitude " : np . array ( [ 0 , 0 , 0 ] )
}
2023-10-22 20:23:11 +10:00
2023-10-22 17:25:20 +10:00
# IMU Data Loading
# I map in to a heading to add units / make things make more sense
## The gyroscopic body angular rates from the IMU are given:
# - WBE_1 (in rad/s) - the roll rate about the body-fixed x-axis
# - WBE_2 (in rad/s) - the pitch rate about the body-fixed y-axis
# - WBE_3 (in rad/s) - the yaw rate about the body-fixed z-axis
## Specific forces:
2023-10-22 19:05:34 +10:00
# - FSP_X (in m/s^2) - the specific force in the body-fixed x-direction
# - FSP_Y (in m/s^2) - the specific force in the body-fixed y-direction
# - FSP_Z (in m/s^2) - the specific force in the body-fixed z-direction
2023-11-02 21:03:30 +10:00
TIME_HEADER = [ " Time [s] " ]
2023-10-31 23:05:24 +10:00
IMU_WBE_HEADERS = [ " WBE_1 [rad/s] " , " WBE_2 [rad/s] " , " WBE_3 [rad/s] " ] # Roll, Pitch, Yaw - Rate
IMU_FSP_HEADERS = [ " FSP_X [m/s^2] " , " FSP_Y [m/s^2] " , " FSP_Z [m/s^2] " ] # Specific Force X, Y , Z
2023-11-02 21:03:30 +10:00
IMU_DATA_HEADER = TIME_HEADER + IMU_WBE_HEADERS + IMU_FSP_HEADERS
2023-10-22 17:25:20 +10:00
def importIMUData ( mission , imu ) :
# If IMU is not a string, then convert based on bool eval where "H" == True
if type ( imu ) != str : imu = " H " if imu else " L "
2023-10-22 17:25:43 +10:00
data = pd . read_csv (
2023-10-22 17:25:20 +10:00
f " ./data/IMU_M { str ( mission ) + str ( imu ) } .txt " ,
header = None , skiprows = 1 ,
names = IMU_DATA_HEADER ,
)
2023-10-22 17:25:43 +10:00
return data
2023-11-02 17:16:52 +10:00
# Load Truth Data
2023-11-02 20:51:26 +10:00
TRUTH_N_POS_HEADER = [ " Time [s] " , " True North Position [m] " ]
TRUTH_FSP_X_HEADER = [ " Time [s] " , " True FSP_X [m/s^2] " ]
2023-11-02 17:16:52 +10:00
m1TruthData = pd . read_csv (
f " ./data/N_truth_IMU_M1L.txt " ,
header = None , skiprows = 1 ,
names = TRUTH_N_POS_HEADER ,
2023-11-02 20:51:26 +10:00
) , pd . read_csv (
2023-11-02 17:16:52 +10:00
f " ./data/N_truth_IMU_M1H.txt " ,
header = None , skiprows = 1 ,
names = TRUTH_N_POS_HEADER ,
2023-11-02 20:51:26 +10:00
) , pd . read_csv (
f " ./data/FSPB1_truth_IMU_M1.txt " ,
header = None , skiprows = 1 ,
names = TRUTH_FSP_X_HEADER ,
2023-11-02 17:16:52 +10:00
)
2023-11-02 21:03:30 +10:00
# Load the GPS Data
GPS_NED_POS_HEADER = [ " GPS Position N [m] " , " GPS Position E [m] " , " GPS Position D [m] " ]
GPS_DATA_HEADER = TIME_HEADER + GPS_NED_POS_HEADER
m2_GPSData = pd . read_csv (
f " ./data/GPS_5_Hz_IMU_M2.txt " ,
header = None , skiprows = 1 ,
names = GPS_DATA_HEADER ,
) , pd . read_csv (
f " ./data/GPS_0.5_Hz_IMU_M2.txt " ,
header = None , skiprows = 1 ,
names = GPS_DATA_HEADER ,
)
2023-10-22 19:05:34 +10:00
# Load the Mission Data
2023-10-22 17:25:20 +10:00
m1_IMUData = importIMUData ( 1 , 0 ) , importIMUData ( 1 , 1 ) #(L, H) Data
m2_IMUData = importIMUData ( 2 , 0 ) , importIMUData ( 2 , 1 )
2023-10-22 19:05:34 +10:00
# NED Translation & Force Functions
2023-10-22 18:05:38 +10:00
INIT_EULER_ANGLES = ( 0 , 0 , 0 )
2023-11-02 20:51:26 +10:00
def attitude_rate_2NED ( attitude , euler_angles ) :
2023-10-22 18:05:38 +10:00
phi , theta , psi = euler_angles
2023-11-02 20:51:26 +10:00
p , q , r = attitude
2023-10-22 18:05:38 +10:00
transMat = np . array ( [ [ 1 , sin ( phi ) * tan ( theta ) , cos ( phi ) * tan ( theta ) ] ,
[ 0 , cos ( phi ) , - sin ( phi ) ] ,
[ 0 , sin ( phi ) / cos ( theta ) , cos ( phi ) / cos ( theta ) ]
] )
angleMat = np . array ( [ [ p ] ,
[ q ] ,
[ r ]
] )
2023-10-22 17:25:20 +10:00
2023-11-01 18:08:01 +10:00
return np . matmul ( transMat , angleMat ) . flatten ( )
2023-10-22 18:05:38 +10:00
2023-11-01 18:08:01 +10:00
def calc_NED_acceleration ( NEDAttitude , specificForces ) :
phi , theta , psi = NEDAttitude # Roll, Pitch, Yaw
2023-10-22 18:05:38 +10:00
2023-10-31 23:05:24 +10:00
R41 = np . array ( [ [ cos ( psi ) * cos ( theta ) , cos ( psi ) * sin ( theta ) * sin ( phi ) - sin ( psi ) * cos ( phi ) , cos ( psi ) * sin ( theta ) * cos ( phi ) + sin ( psi ) * sin ( phi ) ] ,
2023-11-01 19:34:28 +10:00
[ sin ( psi ) * cos ( theta ) , sin ( psi ) * sin ( theta ) * sin ( phi ) + cos ( psi ) * cos ( phi ) , sin ( psi ) * sin ( theta ) * cos ( phi ) - cos ( psi ) * sin ( phi ) ] ,
[ - sin ( theta ) , cos ( theta ) * sin ( phi ) , cos ( theta ) * cos ( phi ) ]
] )
2023-10-22 18:05:38 +10:00
2023-11-01 18:08:01 +10:00
return np . matmul ( R41 , specificForces ) + GRAVITY_VEC
2023-10-22 14:46:20 +10:00
2023-10-22 19:36:56 +10:00
# Calculate Mission Translation & Force Data
2023-11-01 18:08:01 +10:00
NED_ACCELERATION_HEADER = [ " Acceleration N [m/s^2] " , " Acceleration E [m/s^2] " , " Acceleration D [m/s^2] " ]
NED_VELOCITY_HEADER = [ " Velocity N [m/s] " , " Velocity E [m/s] " , " Velocity D [m/s] " ]
NED_POSITION_HEADER = [ " Position N [m] " , " Position E [m] " , " Position D [m] " ]
2023-11-02 21:03:30 +10:00
TRANS_DATA_HEADER = TIME_HEADER + IMU_WBE_HEADERS + NED_ACCELERATION_HEADER + NED_VELOCITY_HEADER + NED_POSITION_HEADER
2023-11-03 08:29:11 +10:00
def calculateVelocityPosition ( missionData , initial_values , gpsData = None ) - > pd . DataFrame :
2023-10-22 19:05:34 +10:00
print ( " Translating Motion & Calculating Resulting Forces " )
2023-11-01 18:08:01 +10:00
2023-11-03 08:36:34 +10:00
# By default this is a reference to an object, as we update it it needs to be a copy to not modify the original.
2023-11-01 19:34:28 +10:00
offset = initial_values . copy ( )
2023-11-01 18:08:01 +10:00
2023-11-02 18:23:47 +10:00
translatedData = pd . DataFrame ( columns = TRANS_DATA_HEADER , dtype = float )
2023-11-01 18:08:01 +10:00
for i in tqdm ( range ( len ( missionData ) ) ) :
2023-11-03 08:36:34 +10:00
mData = lambda header , j = i : missionData . loc [ j , header ] . values # Easy value extraction
# dt = t[i] - t[i-1] BUT for t == 0; dt = t[i+1] - t[i]
2023-11-02 21:03:30 +10:00
dt = mData ( TIME_HEADER , i ) [ 0 ] - mData ( TIME_HEADER , i - 1 ) [ 0 ] if i > 0 else mData ( TIME_HEADER , i + 1 ) [ 0 ] - mData ( TIME_HEADER , i ) [ 0 ]
2023-11-01 18:08:01 +10:00
# Get the time point data
2023-11-01 19:34:28 +10:00
dataPoint = missionData . loc [ i , IMU_WBE_HEADERS ]
2023-11-01 18:08:01 +10:00
# Translate to NED Frame
NED_attitude_rate = attitude_rate_2NED ( dataPoint . values , INIT_EULER_ANGLES )
NED_attitude = NED_attitude_rate * dt + offset [ " attitude " ]
NED_acceleration = calc_NED_acceleration ( NED_attitude , mData ( IMU_FSP_HEADERS ) )
NED_velocity = NED_acceleration * dt + offset [ " velocity " ]
NED_position = NED_velocity * dt + offset [ " position " ]
2023-11-03 08:36:34 +10:00
# If we have GPS data prefer that.
# TL;DR If GPS Data at time point use that else use above calculated position
2023-11-03 08:29:11 +10:00
if gpsData is not None and gpsData [ TIME_HEADER ] . isin ( [ mData ( TIME_HEADER , i ) [ 0 ] ] ) . any ( ) . any ( ) :
timeIdx = gpsData [ TIME_HEADER ] . isin ( [ mData ( TIME_HEADER , i ) [ 0 ] ] ) . idxmax ( )
NED_position = gpsData . loc [ timeIdx , GPS_NED_POS_HEADER [ 0 : ] ] . values [ 0 ]
2023-11-03 08:36:34 +10:00
# Update the offsets
2023-11-01 19:34:28 +10:00
offset [ " attitude " ] = NED_attitude
2023-11-01 18:08:01 +10:00
offset [ " velocity " ] = NED_velocity
offset [ " position " ] = NED_position
2023-11-03 08:36:34 +10:00
# Add the data to the translated frame
2023-11-02 21:03:30 +10:00
translatedData . loc [ i , TIME_HEADER ] = mData ( TIME_HEADER )
2023-11-01 18:08:01 +10:00
translatedData . loc [ i , IMU_WBE_HEADERS ] = NED_attitude_rate
translatedData . loc [ i , NED_ACCELERATION_HEADER ] = NED_acceleration
translatedData . loc [ i , NED_VELOCITY_HEADER ] = NED_velocity
translatedData . loc [ i , NED_POSITION_HEADER ] = NED_position
2023-10-31 23:05:24 +10:00
2023-10-22 19:05:34 +10:00
return translatedData
2023-11-01 18:08:01 +10:00
2023-11-03 08:29:11 +10:00
def generateGraphs ( missionData , mission , gpsData = None ) :
2023-11-02 19:08:19 +10:00
pBar = tqdm ( total = 7 )
2023-11-03 08:36:34 +10:00
# Graph just the R-P-Y
2023-11-01 18:08:01 +10:00
graphData = {
" figTitle " : f " Mission { mission } Flight Characteristics " ,
" figTitleFontSize " : 16 ,
2023-11-02 17:33:08 +10:00
" figSize " : ( 8 , 12 ) , #Yay America, this is in inches :/ # Note: cm = 1/2.54
2023-11-01 18:08:01 +10:00
" yLabel " : " Time [s] " ,
" plotDim " : ( 3 , 1 ) ,
" grid " : True ,
" subPlots " : [
{
" title " : " Roll Rate " ,
" yLabel " : " Roll Rate [rad/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ IMU_WBE_HEADERS [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ IMU_WBE_HEADERS [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-01 18:08:01 +10:00
]
} ,
{
" title " : " Pitch Rate " ,
" yLabel " : " Pitch Rate [rad/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ IMU_WBE_HEADERS [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ IMU_WBE_HEADERS [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-01 18:08:01 +10:00
]
} ,
{
" title " : " Yaw Rate " ,
" yLabel " : " Yaw Rate [rad/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ IMU_WBE_HEADERS [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ IMU_WBE_HEADERS [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } , \
2023-11-01 18:08:01 +10:00
]
} ,
]
}
makeGraph ( graphData , False , False , figSavePath = f " ./images/m { mission } _rpy.png " )
pBar . update ( 1 )
2023-11-03 08:36:34 +10:00
# Graph the position of the UAV (Without 3D Plots)
2023-11-01 18:08:01 +10:00
graphData = {
" figTitle " : f " Mission { mission } Flight Position " ,
" figTitleFontSize " : 16 ,
2023-11-02 17:33:08 +10:00
" figSize " : ( 8 , 12 ) , #Yay America, this is in inches :/ # Note: cm = 1/2.54
2023-11-01 18:08:01 +10:00
" yLabel " : " Time [s] " ,
" plotDim " : ( 3 , 1 ) ,
" grid " : True ,
2023-11-02 19:08:19 +10:00
" tightLayout " : True ,
2023-11-01 18:08:01 +10:00
" subPlots " : [
{
" title " : " North Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-01 18:08:01 +10:00
]
} ,
{
" title " : " East Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-01 18:08:01 +10:00
]
} ,
{
" title " : " Down Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-01 18:08:01 +10:00
]
} ,
]
2023-11-02 17:16:52 +10:00
}
if TRUTH_N_POS_HEADER [ 1 ] in missionData [ 1 ] . columns :
2023-11-02 21:03:30 +10:00
graphData [ " subPlots " ] [ 0 ] [ " plots " ] . insert ( 0 , { " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ TRUTH_N_POS_HEADER [ 1 ] ] , " label " : " True Position " , " colour " : " uq:red " } )
2023-11-03 08:29:11 +10:00
if gpsData is not None :
graphData [ " subPlots " ] [ 0 ] [ " plots " ] . append ( { " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 1 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
graphData [ " subPlots " ] [ 1 ] [ " plots " ] . append ( { " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 2 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
graphData [ " subPlots " ] [ 2 ] [ " plots " ] . append ( { " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 3 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
2023-11-01 19:34:28 +10:00
makeGraph ( graphData , False , False , figSavePath = f " ./images/m { mission } _flight_pos.png " )
2023-11-01 18:08:01 +10:00
pBar . update ( 1 )
2023-11-03 08:36:34 +10:00
# Graph the position of the UAV (With 3D Plots)
2023-11-02 17:33:08 +10:00
graphData = {
" figTitle " : f " Mission { mission } Flight Position " ,
" figTitleFontSize " : 16 ,
2023-11-02 18:23:47 +10:00
" figSize " : ( 12 , 15 ) , #Yay America, this is in inches :/ # Note: cm = 1/2.54
2023-11-02 17:33:08 +10:00
" yLabel " : " Time [s] " ,
" plotDim " : ( 3 , 2 ) ,
" grid " : True ,
" subPlots " : [
{
" title " : " North Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 17:33:08 +10:00
]
} ,
{
" title " : " UAV Flight Path " ,
" xLabel " : " Noth Position [m] " ,
" yLabel " : " East Position [m] " ,
" zLabel " : " Down Position [m] " ,
" plots " : [
{ " x " : missionData [ 0 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : missionData [ 0 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : missionData [ 1 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
]
} ,
{
" title " : " East Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 17:33:08 +10:00
]
} ,
{
" title " : " UAV Flight Path - Low Grade Data " ,
" xLabel " : " Noth Position [m] " ,
" yLabel " : " East Position [m] " ,
" zLabel " : " Down Position [m] " ,
" plots " : [
{ " x " : missionData [ 0 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : missionData [ 0 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
#{"x":missionData[1][NED_POSITION_HEADER[0]], "y":missionData[1][NED_POSITION_HEADER[1]], "z":missionData[1][NED_POSITION_HEADER[2]], "label":"High Grade Data", "colour":"uq:blue"},
]
} ,
{
" title " : " Down Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 17:33:08 +10:00
]
} ,
{
" title " : " UAV Flight Path - High Grade Data " ,
" xLabel " : " Noth Position [m] " ,
" yLabel " : " East Position [m] " ,
" zLabel " : " Down Position [m] " ,
" plots " : [
#{"x":missionData[0][NED_POSITION_HEADER[0]], "y":missionData[0][NED_POSITION_HEADER[1]], "z":missionData[0][NED_POSITION_HEADER[2]], "label":"Low Grade Data", "colour":"uq:purple"},
{ " x " : missionData [ 1 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : missionData [ 1 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
]
} ,
]
}
2023-11-02 18:23:47 +10:00
if TRUTH_N_POS_HEADER [ 1 ] in missionData [ 1 ] . columns :
2023-11-02 21:03:30 +10:00
graphData [ " subPlots " ] [ 0 ] [ " plots " ] . insert ( 0 , { " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ TRUTH_N_POS_HEADER [ 1 ] ] , " label " : " True Position " , " colour " : " uq:red " } )
2023-11-03 08:29:11 +10:00
if gpsData is not None :
graphData [ " subPlots " ] [ 0 ] [ " plots " ] . append ( { " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 1 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
graphData [ " subPlots " ] [ 2 ] [ " plots " ] . append ( { " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 2 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
graphData [ " subPlots " ] [ 4 ] [ " plots " ] . append ( { " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 3 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
graphData [ " subPlots " ] [ 1 ] [ " plots " ] . append ( { " x " : gpsData [ GPS_DATA_HEADER [ 1 ] ] , " y " : gpsData [ GPS_DATA_HEADER [ 2 ] ] , " z " : gpsData [ GPS_DATA_HEADER [ 3 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
graphData [ " subPlots " ] [ 3 ] [ " plots " ] . append ( { " x " : gpsData [ GPS_DATA_HEADER [ 1 ] ] , " y " : gpsData [ GPS_DATA_HEADER [ 2 ] ] , " z " : gpsData [ GPS_DATA_HEADER [ 3 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
graphData [ " subPlots " ] [ 5 ] [ " plots " ] . append ( { " x " : gpsData [ GPS_DATA_HEADER [ 1 ] ] , " y " : gpsData [ GPS_DATA_HEADER [ 2 ] ] , " z " : gpsData [ GPS_DATA_HEADER [ 3 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
2023-11-02 17:33:08 +10:00
makeGraph ( graphData , False , False , figSavePath = f " ./images/m { mission } _flight_pos_3d.png " )
pBar . update ( 1 )
2023-11-03 08:36:34 +10:00
# Graph Just the velocity
2023-11-01 18:08:01 +10:00
graphData = {
" figTitle " : f " Mission { mission } Flight Velocity " ,
" figTitleFontSize " : 16 ,
2023-11-02 17:33:08 +10:00
" figSize " : ( 8 , 12 ) , #Yay America, this is in inches :/ # Note: cm = 1/2.54
2023-11-01 18:08:01 +10:00
" yLabel " : " Time [s] " ,
" plotDim " : ( 3 , 1 ) ,
" grid " : True ,
" subPlots " : [
{
" title " : " North Velocity " ,
" yLabel " : " Velocity [m/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_VELOCITY_HEADER [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_VELOCITY_HEADER [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-01 18:08:01 +10:00
]
} ,
{
" title " : " East Velocity " ,
" yLabel " : " Velocity [m/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_VELOCITY_HEADER [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_VELOCITY_HEADER [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-01 18:08:01 +10:00
]
} ,
{
" title " : " Down Velocity " ,
" yLabel " : " Velocity [m/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_VELOCITY_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_VELOCITY_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-01 18:08:01 +10:00
]
} ,
]
}
2023-11-01 19:34:28 +10:00
makeGraph ( graphData , False , False , figSavePath = f " ./images/m { mission } _flight_velocity.png " )
2023-11-01 18:08:01 +10:00
pBar . update ( 1 )
2023-11-03 08:36:34 +10:00
# Graph just the acceleration
2023-11-01 18:08:01 +10:00
graphData = {
" figTitle " : f " Mission { mission } Flight Acceleration " ,
" figTitleFontSize " : 16 ,
2023-11-02 17:33:08 +10:00
" figSize " : ( 8 , 12 ) , #Yay America, this is in inches :/ # Note: cm = 1/2.54
" yLabel " : " Time [s] " ,
2023-11-02 18:23:47 +10:00
" plotDim " : ( 3 , 1 ) ,
2023-11-02 17:33:08 +10:00
" grid " : True ,
" subPlots " : [
{
" title " : " North Acceleration " ,
" yLabel " : " Acceleration [m/s$^2$] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_ACCELERATION_HEADER [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_ACCELERATION_HEADER [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-02 17:33:08 +10:00
]
} ,
{
" title " : " East Acceleration " ,
" yLabel " : " Acceleration [m/s$^2$] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_ACCELERATION_HEADER [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_ACCELERATION_HEADER [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-02 17:33:08 +10:00
]
} ,
{
" title " : " Down Acceleration " ,
" yLabel " : " Acceleration [m/s$^2$] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_ACCELERATION_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_ACCELERATION_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-02 17:33:08 +10:00
]
} ,
]
}
makeGraph ( graphData , False , False , figSavePath = f " ./images/m { mission } _flight_accell.png " )
pBar . update ( 1 )
2023-11-03 08:36:34 +10:00
# Graph the position, velocity & acceleration on one big graph
2023-11-02 17:33:08 +10:00
graphData = {
" figTitle " : f " Mission { mission } Flight Characteristics " ,
" figTitleFontSize " : 16 ,
2023-11-02 18:23:47 +10:00
" figSize " : ( 20 , 12 ) , #Yay America, this is in inches :/ # Note: cm = 1/2.54
2023-11-01 18:08:01 +10:00
" yLabel " : " Time [s] " ,
2023-11-02 18:23:47 +10:00
" plotDim " : ( 3 , 3 ) ,
2023-11-01 18:08:01 +10:00
" grid " : True ,
" subPlots " : [
2023-11-02 17:33:08 +10:00
{
" title " : " North Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 17:33:08 +10:00
]
} ,
{
" title " : " North Velocity " ,
" yLabel " : " Velocity [m/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_VELOCITY_HEADER [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_VELOCITY_HEADER [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 17:33:08 +10:00
]
} ,
2023-11-01 18:08:01 +10:00
{
" title " : " North Acceleration " ,
" yLabel " : " Acceleration [m/s$^2$] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_ACCELERATION_HEADER [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_ACCELERATION_HEADER [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-01 18:08:01 +10:00
]
} ,
2023-11-02 17:33:08 +10:00
{
" title " : " East Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 17:33:08 +10:00
]
} ,
{
" title " : " East Velocity " ,
" yLabel " : " Velocity [m/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_VELOCITY_HEADER [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_VELOCITY_HEADER [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 17:33:08 +10:00
]
} ,
2023-11-01 18:08:01 +10:00
{
" title " : " East Acceleration " ,
" yLabel " : " Acceleration [m/s$^2$] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_ACCELERATION_HEADER [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_ACCELERATION_HEADER [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-01 18:08:01 +10:00
]
} ,
2023-11-02 17:33:08 +10:00
{
" title " : " Down Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 17:33:08 +10:00
]
} ,
{
" title " : " Down Velocity " ,
" yLabel " : " Velocity [m/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_VELOCITY_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_VELOCITY_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 17:33:08 +10:00
]
} ,
2023-11-01 18:08:01 +10:00
{
" title " : " Down Acceleration " ,
" yLabel " : " Acceleration [m/s$^2$] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_ACCELERATION_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_ACCELERATION_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-01 18:08:01 +10:00
]
} ,
]
}
2023-11-02 17:33:08 +10:00
if TRUTH_N_POS_HEADER [ 1 ] in missionData [ 1 ] . columns :
2023-11-02 21:03:30 +10:00
graphData [ " subPlots " ] [ 0 ] [ " plots " ] . insert ( 0 , { " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ TRUTH_N_POS_HEADER [ 1 ] ] , " label " : " True Position " , " colour " : " uq:red " } )
2023-11-03 08:29:11 +10:00
if gpsData is not None :
graphData [ " subPlots " ] [ 0 ] [ " plots " ] . append ( { " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 1 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
graphData [ " subPlots " ] [ 3 ] [ " plots " ] . append ( { " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 2 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
graphData [ " subPlots " ] [ 6 ] [ " plots " ] . append ( { " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 3 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } )
2023-11-02 18:23:47 +10:00
makeGraph ( graphData , False , False , figSavePath = f " ./images/m { mission } _flight_chars.png " )
2023-11-01 18:08:01 +10:00
pBar . update ( 1 )
2023-10-22 19:05:34 +10:00
2023-11-03 08:36:34 +10:00
# Graph the R-P-Y, velocity & acceleration on one big graph
2023-11-02 19:08:19 +10:00
graphData = {
" figTitle " : f " Mission { mission } Flight Characteristics " ,
" figTitleFontSize " : 16 ,
" figSize " : ( 20 , 12 ) , #Yay America, this is in inches :/ # Note: cm = 1/2.54
" yLabel " : " Time [s] " ,
" plotDim " : ( 3 , 3 ) ,
" grid " : True ,
" subPlots " : [
{
" title " : " Roll Rate " ,
" yLabel " : " Roll Rate [rad/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ IMU_WBE_HEADERS [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ IMU_WBE_HEADERS [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-02 19:08:19 +10:00
]
} ,
{
" title " : " North Velocity " ,
" yLabel " : " Velocity [m/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_VELOCITY_HEADER [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_VELOCITY_HEADER [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 19:08:19 +10:00
]
} ,
{
" title " : " North Acceleration " ,
" yLabel " : " Acceleration [m/s$^2$] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_ACCELERATION_HEADER [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_ACCELERATION_HEADER [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-02 19:08:19 +10:00
]
} ,
{
" title " : " Pitch Rate " ,
" yLabel " : " Pitch Rate [rad/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ IMU_WBE_HEADERS [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ IMU_WBE_HEADERS [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-02 19:08:19 +10:00
]
} ,
{
" title " : " East Velocity " ,
" yLabel " : " Velocity [m/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_VELOCITY_HEADER [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_VELOCITY_HEADER [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 19:08:19 +10:00
]
} ,
{
" title " : " East Acceleration " ,
" yLabel " : " Acceleration [m/s$^2$] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_ACCELERATION_HEADER [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_ACCELERATION_HEADER [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-02 19:08:19 +10:00
]
} ,
{
" title " : " Yaw Rate " ,
" yLabel " : " Yaw Rate [rad/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ IMU_WBE_HEADERS [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ IMU_WBE_HEADERS [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } , \
2023-11-02 19:08:19 +10:00
]
} ,
{
" title " : " Down Velocity " ,
" yLabel " : " Velocity [m/s] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_VELOCITY_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_VELOCITY_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-02 19:08:19 +10:00
]
} ,
{
" title " : " Down Acceleration " ,
" yLabel " : " Acceleration [m/s$^2$] " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_ACCELERATION_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_ACCELERATION_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-02 19:08:19 +10:00
]
} ,
]
}
makeGraph ( graphData , False , False , figSavePath = f " ./images/m { mission } _flight_chars_rpy.png " )
pBar . update ( 1 )
2023-11-02 17:16:52 +10:00
TRUTH_NPOS_DELTA_HEADER = [ " Calculated vs True Position Delta [m] " , " Calculated vs True Position Error [ % ] " ]
def doTruthComparison ( missionData , truthData ) :
for i , mData in enumerate ( missionData ) :
2023-11-03 08:36:34 +10:00
# Add & calculate the error of each position to the dataframe
2023-11-02 17:16:52 +10:00
mData [ TRUTH_N_POS_HEADER [ 1 ] ] = truthData [ i ] [ TRUTH_N_POS_HEADER [ 1 ] ]
mData [ TRUTH_NPOS_DELTA_HEADER [ 0 ] ] = mData [ NED_POSITION_HEADER [ 0 ] ] - mData [ TRUTH_N_POS_HEADER [ 1 ] ]
mData [ TRUTH_NPOS_DELTA_HEADER [ 1 ] ] = np . abs ( mData [ TRUTH_NPOS_DELTA_HEADER [ 0 ] ] ) / mData [ TRUTH_N_POS_HEADER [ 1 ] ] * 100
2023-11-03 08:36:34 +10:00
# Correct the DataType in the injected column
2023-11-02 18:23:47 +10:00
mData [ mData . columns ] = mData [ mData . columns ] . astype ( float )
2023-11-02 17:16:52 +10:00
return missionData
def generateTruthErrorGraphs ( missionData ) :
2023-11-03 08:36:34 +10:00
# Use polyfit to generate the 2nd order polynomial to best fit the error data
2023-11-02 21:03:30 +10:00
poly_low = np . polyfit ( missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , missionData [ 0 ] [ TRUTH_NPOS_DELTA_HEADER [ 0 ] ] , 2 )
poly_high = np . polyfit ( missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , missionData [ 1 ] [ TRUTH_NPOS_DELTA_HEADER [ 0 ] ] , 2 )
2023-11-03 08:36:34 +10:00
2023-11-02 17:16:52 +10:00
graphData = {
" grid " : True ,
" xLabel " : " Time [s] " ,
" yLabel " : " Position Delta [m] " ,
" title " : " Calculated vs True North Position Delta " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ TRUTH_NPOS_DELTA_HEADER [ 0 ] ] , " label " : " Low Grade IMU Error " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ TRUTH_NPOS_DELTA_HEADER [ 0 ] ] , " label " : " High Grade IMU Error " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : np . polyval ( poly_low , missionData [ 0 ] [ TIME_HEADER [ 0 ] ] ) , " label " : " Low Grade Best Fit Curve " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : np . polyval ( poly_high , missionData [ 1 ] [ TIME_HEADER [ 0 ] ] ) , " label " : " High Grade Best Fit Curve " } ,
2023-11-02 18:45:22 +10:00
2023-11-02 17:16:52 +10:00
]
}
makeGraph ( graphData , False , False , figSavePath = " ./images/m1_error_delta.png " )
graphData = {
" grid " : True ,
" xLabel " : " Time [s] " ,
" yLabel " : " Position Error [ % ] " ,
" title " : " Calculated vs True North Position Error " ,
" plots " : [
2023-11-02 21:03:30 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : np . abs ( missionData [ 0 ] [ TRUTH_NPOS_DELTA_HEADER [ 1 ] ] ) , " label " : " Low Grade IMU Error " } ,
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : np . abs ( missionData [ 1 ] [ TRUTH_NPOS_DELTA_HEADER [ 1 ] ] ) , " label " : " High Grade IMU Error " } ,
2023-11-02 17:16:52 +10:00
]
}
2023-11-02 18:23:47 +10:00
makeGraph ( graphData , False , False , figSavePath = " ./images/m1_error_percent.png " )
2023-11-02 17:16:52 +10:00
2023-11-03 08:29:11 +10:00
return poly_low , poly_high
2023-11-02 18:45:22 +10:00
2023-11-03 08:29:11 +10:00
def generateGPSGraphs ( missionData , gpsMissionData , gpsData , mission ) :
graphData = {
" figTitle " : f " Mission { mission } Flight Position " ,
" figTitleFontSize " : 16 ,
" figSize " : ( 12 , 15 ) , #Yay America, this is in inches :/ # Note: cm = 1/2.54
" yLabel " : " Time [s] " ,
" plotDim " : ( 3 , 2 ) ,
" grid " : True ,
" subPlots " : [
{
" title " : " North Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-03 09:40:27 +10:00
{ " x " : gpsMissionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : gpsMissionData [ 0 ] [ NED_POSITION_HEADER [ 0 ] ] , " label " : " GPS Corrected Low Grade Data " , " colour " : " uq:orange " } ,
{ " x " : gpsMissionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : gpsMissionData [ 1 ] [ NED_POSITION_HEADER [ 0 ] ] , " label " : " GPS Corrected High Grade Data " , " colour " : " uq:green " } ,
2023-11-03 08:29:11 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 0 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 0 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-03 09:40:27 +10:00
{ " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 1 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } ,
2023-11-03 08:29:11 +10:00
]
} ,
{
" title " : " UAV Flight Path " ,
" xLabel " : " Noth Position [m] " ,
" yLabel " : " East Position [m] " ,
" zLabel " : " Down Position [m] " ,
" plots " : [
2023-11-03 09:40:27 +10:00
{ " x " : gpsMissionData [ 1 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : gpsMissionData [ 1 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : gpsMissionData [ 1 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " GPS Corrected High Grade Data " , " colour " : " uq:orange " } ,
{ " x " : gpsMissionData [ 0 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : gpsMissionData [ 0 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : gpsMissionData [ 0 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " GPS Corrected Low Grade Data " , " colour " : " uq:green " } ,
2023-11-03 08:29:11 +10:00
{ " x " : missionData [ 1 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : missionData [ 1 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-03 09:40:27 +10:00
{ " x " : missionData [ 0 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : missionData [ 0 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
{ " x " : gpsData [ GPS_DATA_HEADER [ 1 ] ] , " y " : gpsData [ GPS_DATA_HEADER [ 2 ] ] , " z " : gpsData [ GPS_DATA_HEADER [ 3 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } ,
2023-11-03 08:29:11 +10:00
]
} ,
{
" title " : " East Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-03 09:40:27 +10:00
{ " x " : gpsMissionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : gpsMissionData [ 0 ] [ NED_POSITION_HEADER [ 1 ] ] , " label " : " GPS Corrected Low Grade Data " , " colour " : " uq:orange " } ,
{ " x " : gpsMissionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : gpsMissionData [ 1 ] [ NED_POSITION_HEADER [ 1 ] ] , " label " : " GPS Corrected High Grade Data " , " colour " : " uq:green " } ,
2023-11-03 08:29:11 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 1 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-03 09:40:27 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 1 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 2 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } ,
2023-11-03 08:29:11 +10:00
]
} ,
{
" title " : " UAV Flight Path - Low Grade Data " ,
" xLabel " : " Noth Position [m] " ,
" yLabel " : " East Position [m] " ,
" zLabel " : " Down Position [m] " ,
" plots " : [
2023-11-03 09:40:27 +10:00
{ " x " : gpsMissionData [ 0 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : gpsMissionData [ 0 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : gpsMissionData [ 0 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " GPS Corrected Low Grade Data " , " colour " : " uq:green " } ,
2023-11-03 08:29:11 +10:00
{ " x " : missionData [ 0 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : missionData [ 0 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-03 09:40:27 +10:00
{ " x " : gpsData [ GPS_DATA_HEADER [ 1 ] ] , " y " : gpsData [ GPS_DATA_HEADER [ 2 ] ] , " z " : gpsData [ GPS_DATA_HEADER [ 3 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } ,
2023-11-03 08:29:11 +10:00
]
} ,
{
" title " : " Down Position " ,
" yLabel " : " Position [m] " ,
" plots " : [
2023-11-03 09:40:27 +10:00
{ " x " : gpsMissionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : gpsMissionData [ 0 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " GPS Corrected Low Grade Data " , " colour " : " uq:orange " } ,
{ " x " : gpsMissionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : gpsMissionData [ 1 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " GPS Corrected High Grade Data " , " colour " : " uq:green " } ,
2023-11-03 08:29:11 +10:00
{ " x " : missionData [ 0 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 0 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " Low Grade Data " , " colour " : " uq:purple " } ,
2023-11-03 09:40:27 +10:00
{ " x " : missionData [ 1 ] [ TIME_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
{ " x " : gpsData [ TIME_HEADER ] , " y " : gpsData [ GPS_DATA_HEADER [ 3 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } ,
2023-11-03 08:29:11 +10:00
]
} ,
{
" title " : " UAV Flight Path - High Grade Data " ,
" xLabel " : " Noth Position [m] " ,
" yLabel " : " East Position [m] " ,
" zLabel " : " Down Position [m] " ,
" plots " : [
2023-11-03 09:40:27 +10:00
{ " x " : gpsMissionData [ 1 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : gpsMissionData [ 1 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : gpsMissionData [ 1 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " GPS Corrected High Grade Data " , " colour " : " uq:orange " } ,
2023-11-03 08:29:11 +10:00
{ " x " : missionData [ 1 ] [ NED_POSITION_HEADER [ 0 ] ] , " y " : missionData [ 1 ] [ NED_POSITION_HEADER [ 1 ] ] , " z " : missionData [ 1 ] [ NED_POSITION_HEADER [ 2 ] ] , " label " : " High Grade Data " , " colour " : " uq:blue " } ,
2023-11-03 09:40:27 +10:00
{ " x " : gpsData [ GPS_DATA_HEADER [ 1 ] ] , " y " : gpsData [ GPS_DATA_HEADER [ 2 ] ] , " z " : gpsData [ GPS_DATA_HEADER [ 3 ] ] , " label " : " GPS Position " , " colour " : " uq:red " } ,
2023-11-03 08:29:11 +10:00
]
} ,
]
}
2023-11-03 09:40:27 +10:00
makeGraph ( graphData , False , False , figSavePath = f " ./images/m { mission } _flight_pos_3d_gps_all.png " )
2023-11-02 17:16:52 +10:00
2023-10-22 14:40:10 +10:00
if __name__ == ' __main__ ' :
2023-11-02 20:51:26 +10:00
# Task 1 - b, c, d
2023-11-02 17:16:52 +10:00
#Load, Process & Graph Mission Data for Mission 1
2023-11-02 19:08:19 +10:00
print ( " Loading / Calculating to Mission 1 Data " )
2023-11-01 18:08:01 +10:00
missionData = cacheData ( " ./tmp/m1_L_transData.dfz " , calculateVelocityPosition , ( m1_IMUData [ 0 ] , INIT_FLIGHT_PRAMS ) , forceCalc = False ) , \
cacheData ( " ./tmp/m1_H_transData.dfz " , calculateVelocityPosition , ( m1_IMUData [ 1 ] , INIT_FLIGHT_PRAMS ) , forceCalc = False )
2023-11-02 17:16:52 +10:00
missionData = doTruthComparison ( missionData , m1TruthData )
2023-11-02 19:08:19 +10:00
print ( " Starting to Graph Mission 1 " )
2023-11-02 20:51:26 +10:00
#generateGraphs(missionData, 1)
2023-10-22 20:23:11 +10:00
2023-11-02 20:51:26 +10:00
# Task 2 - b
2023-11-03 08:29:11 +10:00
errorPoly = generateTruthErrorGraphs ( missionData )
2023-11-02 19:23:27 +10:00
for i , poly in enumerate ( errorPoly ) :
string = " "
for n , c_n in enumerate ( poly ) :
string + = f " + { c_n : .4f } *t^ { len ( poly ) - 1 - n } "
print ( f " { ' High ' if i else ' Low ' } Grade Error Poly: " + string [ 2 : ] )
2023-11-02 18:45:22 +10:00
2023-11-02 20:51:26 +10:00
# Task 3
2023-11-02 21:03:30 +10:00
t_15_data = m1TruthData [ 0 ] [ TIME_HEADER + [ TRUTH_N_POS_HEADER [ 1 ] ] ] . iloc [ ( m1TruthData [ 0 ] [ TIME_HEADER [ 0 ] ] - 15 ) . abs ( ) . argsort ( ) [ : 1 ] ] . values , \
m1TruthData [ 2 ] [ TIME_HEADER + [ TRUTH_FSP_X_HEADER [ 1 ] ] ] . iloc [ ( m1TruthData [ 2 ] [ TIME_HEADER [ 0 ] ] - 15 ) . abs ( ) . argsort ( ) [ : 1 ] ] . values
2023-11-02 20:52:32 +10:00
t_15_data = pd . DataFrame ( {
2023-11-02 21:03:30 +10:00
TIME_HEADER [ 0 ] : [ t_15_data [ 0 ] [ 0 ] [ 0 ] ] ,
2023-11-02 20:52:32 +10:00
TRUTH_N_POS_HEADER [ 1 ] : [ t_15_data [ 0 ] [ 0 ] [ 1 ] ] ,
TRUTH_FSP_X_HEADER [ 1 ] : [ t_15_data [ 1 ] [ 0 ] [ 1 ] ]
} )
2023-11-02 20:51:26 +10:00
print ( t_15_data )
# Task 4
2023-11-02 19:08:19 +10:00
#Load, Process & Graph Mission Data for Mission 2
2023-11-02 20:51:26 +10:00
print ( " \n Loading / Calculating to Mission 2 Data " )
2023-11-03 09:40:27 +10:00
missionData_4 = cacheData ( " ./tmp/m2_L_transData.dfz " , calculateVelocityPosition , ( m2_IMUData [ 0 ] , INIT_FLIGHT_PRAMS ) , forceCalc = False ) , \
2023-11-02 17:16:52 +10:00
cacheData ( " ./tmp/m2_H_transData.dfz " , calculateVelocityPosition , ( m2_IMUData [ 1 ] , INIT_FLIGHT_PRAMS ) , forceCalc = False )
2023-11-02 19:08:19 +10:00
print ( " Starting to Graph Mission 2 " )
2023-11-03 09:40:27 +10:00
#generateGraphs(missionData_4, 2)
2023-11-02 21:03:30 +10:00
# Task 5
2023-11-03 08:29:11 +10:00
# Calc 5hz Mission
missionData = cacheData ( " ./tmp/gps_5_m2_L_transData.dfz " , calculateVelocityPosition , ( m2_IMUData [ 0 ] , INIT_FLIGHT_PRAMS , m2_GPSData [ 0 ] ) , forceCalc = False ) , \
cacheData ( " ./tmp/gps_5_m2_H_transData.dfz " , calculateVelocityPosition , ( m2_IMUData [ 1 ] , INIT_FLIGHT_PRAMS , m2_GPSData [ 0 ] ) , forceCalc = False )
2023-11-03 09:40:27 +10:00
#generateGraphs(missionData, "2 - 5Hz GPS", m2_GPSData[0])
2023-11-03 08:29:11 +10:00
# Calc 0.5hz Mission
missionData = cacheData ( " ./tmp/gps_0.5_m2_L_transData.dfz " , calculateVelocityPosition , ( m2_IMUData [ 0 ] , INIT_FLIGHT_PRAMS , m2_GPSData [ 1 ] ) , forceCalc = False ) , \
cacheData ( " ./tmp/gps_0.5_m2_H_transData.dfz " , calculateVelocityPosition , ( m2_IMUData [ 1 ] , INIT_FLIGHT_PRAMS , m2_GPSData [ 1 ] ) , forceCalc = False )
2023-11-03 09:40:27 +10:00
generateGPSGraphs ( missionData_4 , missionData , m2_GPSData [ 0 ] , " 2 - 0.5Hz GPS Correction & Comparison " )
#generateGraphs(missionData, "2 - 0.5Hz GPS", m2_GPSData[1])
2023-11-02 21:03:30 +10:00
2023-11-02 17:16:52 +10:00
2023-11-02 20:51:26 +10:00
2023-10-22 20:23:11 +10:00
print ( " Complete " )