Skip to content
Snippets Groups Projects
Commit 941e8500 authored by Tara Mina's avatar Tara Mina
Browse files

Added scripts to calculate M.O.I.

parent c81a6eef
No related branches found
No related tags found
No related merge requests found
function averageMOI = ...
getAverageMomentOfInertia( directoryLocation, massUsed_grams_array )
%Given a directory of data labeled "Test_1", "Test_2", etc, will find
%the moment of inertia for each data set, using the mass used in grams
%at the corresponding index of the massUsed_grams_array. And from
%finding all of the moments of inertia, in this way, this function will
%return the average.
%First find the number of tests we need to run (will be equal to the
%length of the massUsed_grams_array)
numRuns = length(massUsed_grams_array);
%Create a sum variable, to which we will add our calculated MOI values:
sumOfMOIs = 0;
%For each of the runs, calculate the moment of inertia
for i = 1:numRuns
%Create the file name for the current run, in string:
currFileName = ['Test_', num2str(i), '.csv'];
%Create the full file path for the current run:
currFullFilePath = [directoryLocation, '\', currFileName];
%Get the current mass used in grams
massUsed_grams = massUsed_grams_array(i);
%Get the moment of inertia for this run
curr_MOI = getMomentOfInertia(currFullFilePath, massUsed_grams);
%Add this run's moment of inertia value calculated to the sum
sumOfMOIs = sumOfMOIs + curr_MOI;
end %for i = 1:numRuns
%Get the average moment of inertia value, by dividing by the total
%number of runs
averageMOI = sumOfMOIs / numRuns;
end
function momentOfInertia = getMomentOfInertia( fullFilePath, massUsed_grams )
%This function will calculate a single moment of inertia value, given a
%file location to a csv file, along with the mass value used on the mass
%handle as a torque. (Note, there's no need to have to consider the mass of
%the handle, which is 5.0 grams, since this function takes care of that)
%fileLocation = 'C:\Users\Tara\Desktop\Project Documents\Current Project Documents\EE 491\Data\Physics Department Measurements\Test\';
%fileName = 'Test_1.csv';
%Mass used in grams
%mass_grams = 200.1;
massHandle_grams = 5.0;
totalMass_grams = massUsed_grams + massHandle_grams;
totalMass_kg = totalMass_grams / 1000.0;
%Define a cut-off start angle in radians
angleStart_cutoff = 0.1;
%Radius of the knob where the string was pulling from (in meters)
radius = 0.04445; %(4.445 centimeters - or 1.75 inches)
%Acceleration constant due to gravity (in meters per second squared)
g = 9.80665;
%Define a cut-off "padding" to stop taking data before reaching the end of
%the data recorded in the file
%For example, if dataEndPadding is 10, we will "cut-off" our data when we
%get to 10 data points from the very end of the data run
dataEndPadding = 5;
%Define columns of the table
timeCol = 1;
angleCol = 2;
angularVelCol = 3;
%angularAccelCol = 4;
%Create full file path
%fullFilePath = [fileLocation, fileName];
%Bring in Data
dataTable = readtable(fullFilePath);
%Extract the time, angle (in radians), and angular velocity (in radians per
%second) arrays from the data table
timeArray = dataTable{:, timeCol};
angleArray = dataTable{:, angleCol};
angularVelArray = dataTable{:, angularVelCol};
%Find the first positive angle value
i_start = find(angleArray > angleStart_cutoff, 1);
%Get the start time and start angular position, based on this start index
time_start = timeArray(i_start);
angle_start = angleArray(i_start);
%Find the initial angular velocity, which is the corresponding angular
%velocity value at this start index (in radians per second)
w_o = angularVelArray(i_start);
%Determine the end time of our data collection, so first get the length of
%the time array
timeArray_len = length(timeArray);
%Get the last index based on the length of the data and the "padding"
%amount defined at the beginning
i_end = timeArray_len - dataEndPadding;
%Get the end time and end angular position in radians
time_end = timeArray(i_end);
angle_end = angleArray(i_end);
%Get the difference in time and angular position (in radians)
angle_diff = angle_end - angle_start;
time_diff = time_end - time_start;
%Using this expression, where alpha is the constant angular acceleration:
% theta_diff = w_o*t_diff + (1/2)*alpha*(t_diff^2)
%We can solve for alpha to get
% (theta_diff - w_o*t_diff) = (1/2)*alpha*(t_diff^2)
% 2*(theta_diff - w_o*t_diff) / (t_diff^2) = alpha
%Thus the angular acceleration in radians per second-squared, denoted by
%alpha can be found like this:
angularAccel = 2*(angle_diff - w_o*time_diff) / (time_diff * time_diff);
%This constant angular acceleration should be due to the torque caused by
%the gravitational force caused by our falling mass (m*g*r)
torque_gravity = totalMass_kg * g * radius;
%The moment of inertia would be this torque divided by the constant angular
%acceleration value (in kilograms meters-squared)
momentOfInertia = torque_gravity / angularAccel;
end
%Create the massesUsed_grams_array, which represents the masses we used for
%each run, which we keep the same for the runs done for each of the
%testing (yaw, pitch, roll, and their calibration tests as well)
massesUsed_grams = [200.1, 300.1, 100.1];
numTrialsPerMass = 5;
massUsed_grams_array = [ ones(1, numTrialsPerMass) * massesUsed_grams(1), ...
ones(1, numTrialsPerMass) * massesUsed_grams(2), ...
ones(1, numTrialsPerMass) * massesUsed_grams(3)];
%Set the directory locations for the pitch, roll, and yaw data and their
%calibration runs
topLevelDir = 'C:\Users\Tara\Desktop\Project Documents\Current Project Documents\EE 491\Data\Physics Department Measurements\Moment of Inertia Data';
directoryLocation_yawCalib = [topLevelDir , '\Calibration Testing Yaw'];
directoryLocation_pitchCalib = [topLevelDir, '\Calibration Testing Pitch and Roll'];
directoryLocation_rollCalib = [topLevelDir, '\Calibration Testing Pitch and Roll'];
directoryLocation_yawData = [topLevelDir, '\Yaw Data'];
directoryLocation_pitchData = [topLevelDir, '\Pitch Data'];
directoryLocation_rollData = [topLevelDir, '\Roll Data'];
%Get the average moment of inertia values for the pitch, roll, and yaw data
%as well as their calibration funs
averageMOI_yawCalib = getAverageMomentOfInertia( ...
directoryLocation_yawCalib, massUsed_grams_array );
averageMOI_pitchCalib = getAverageMomentOfInertia( ...
directoryLocation_pitchCalib, massUsed_grams_array );
averageMOI_rollCalib = getAverageMomentOfInertia( ...
directoryLocation_rollCalib, massUsed_grams_array );
averageMOI_yawData = getAverageMomentOfInertia( ...
directoryLocation_yawData, massUsed_grams_array );
averageMOI_pitchData = getAverageMomentOfInertia( ...
directoryLocation_pitchData, massUsed_grams_array );
averageMOI_rollData = getAverageMomentOfInertia( ...
directoryLocation_rollData, massUsed_grams_array );
%Now determine the quadcopter's average moment of inertia about the pitch,
%roll, and yaw axes of rotation
quadYaw = averageMOI_yawData - averageMOI_yawCalib
quadPitch = averageMOI_pitchData - averageMOI_pitchCalib
quadRoll = averageMOI_rollData - averageMOI_rollCalib
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment