Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
M
MicroCART
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Distributed Autonomous Networked Control Lab
MicroCART
Commits
70e338d4
Commit
70e338d4
authored
7 years ago
by
Tara Mina
Browse files
Options
Downloads
Patches
Plain Diff
Added analysis code for IMU data and Simulink block for Mahony filter
parent
c912fce4
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
controls/dataCollection/IMU_standstill/analyzeIMU_data.m
+273
-0
273 additions, 0 deletions
controls/dataCollection/IMU_standstill/analyzeIMU_data.m
controls/model/mahony_filter.slx
+0
-0
0 additions, 0 deletions
controls/model/mahony_filter.slx
with
273 additions
and
0 deletions
controls/dataCollection/IMU_standstill/analyzeIMU_data.m
0 → 100644
+
273
−
0
View file @
70e338d4
function
analyzeIMU_data
(
fileName
)
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
IMU_dataDirectory
=
'C:\Users\Tara\Desktop\Project Documents\Current Project Documents\EE 492\Data\IMU Data'
;
IMU_dataFile
=
[
IMU_dataDirectory
,
'\'
,
fileName
];
IMU_data
=
readtable
(
IMU_dataFile
);
g
=
9.8
;
%meters per second squared
%Set the column values of the table
timeCol
=
1
;
accelXCol
=
2
;
accelYCol
=
3
;
accelZCol
=
4
;
gyroXCol
=
5
;
gyroYCol
=
6
;
gyroZCol
=
7
;
%Pull the data columns into arrays
timeArray
=
IMU_data
{:,
timeCol
};
accelXArray
=
IMU_data
{:,
accelXCol
};
accelYArray
=
IMU_data
{:,
accelYCol
};
accelZArray
=
IMU_data
{:,
accelZCol
};
gyroXArray
=
IMU_data
{:,
gyroXCol
};
gyroYArray
=
IMU_data
{:,
gyroYCol
};
gyroZArray
=
IMU_data
{:,
gyroZCol
};
%Get the mean and standard deviation of the accelerometer data and multiply
%by the g constant to get this value in meters per second
accelX_mean
=
mean
(
accelXArray
)
*
g
;
accelY_mean
=
mean
(
accelYArray
)
*
g
;
accelZ_mean
=
mean
(
accelZArray
)
*
g
accelX_dev
=
std
(
accelXArray
)
*
g
;
accelY_dev
=
std
(
accelYArray
)
*
g
;
accelZ_dev
=
std
(
accelZArray
)
*
g
;
%Get mean and standard deviation of gyroscope data, which is in rad / sec
gyroX_mean
=
mean
(
gyroXArray
);
gyroY_mean
=
mean
(
gyroYArray
);
gyroZ_mean
=
mean
(
gyroZArray
);
gyroX_dev
=
std
(
gyroXArray
);
gyroY_dev
=
std
(
gyroYArray
);
gyroZ_dev
=
std
(
gyroZArray
);
%Calculate the variances from the standard deviations
accelX_var
=
accelX_dev
^
2
;
accelY_var
=
accelY_dev
^
2
;
accelZ_var
=
accelZ_dev
^
2
;
gyroX_var
=
gyroX_dev
^
2
;
gyroY_var
=
gyroY_dev
^
2
;
gyroZ_var
=
gyroZ_dev
^
2
;
%Print received data from accelerometer nicely to command prompt
disp
(
' '
);
disp
(
'Accelerometer data: '
);
disp
(
[
'X acceleration mean ( m / s^2 ): '
,
num2str
(
accelX_mean
)
]
);
disp
(
[
'Y acceleration mean ( m / s^2 ): '
,
num2str
(
accelY_mean
)
]
);
disp
(
[
'Z acceleration mean ( m / s^2 ): '
,
num2str
(
accelZ_mean
)
]
);
disp
(
[
'X acceleration standard deviation ( m / s^2 ): '
,
num2str
(
accelX_dev
)
]
);
disp
(
[
'Y acceleration standard deviation ( m / s^2 ): '
,
num2str
(
accelY_dev
)
]
);
disp
(
[
'Z acceleration standard deviation ( m / s^2 ): '
,
num2str
(
accelZ_dev
)
]
);
disp
(
[
'X acceleration variance ( (m/s^2) ^ 2 ): '
,
num2str
(
accelX_var
)
]
);
disp
(
[
'Y acceleration variance ( (m/s^2) ^ 2 ): '
,
num2str
(
accelY_var
)
]
);
disp
(
[
'Z acceleration variance ( (m/s^2) ^ 2 ): '
,
num2str
(
accelZ_var
)
]
);
disp
(
' '
);
%Print received data from gyroscope nicely to command prompt
disp
(
'Gyroscope data: '
);
disp
(
[
'Angular velocity about X mean ( rad / s ): '
,
num2str
(
gyroX_mean
)
]
);
disp
(
[
'Angular velocity about Y mean ( rad / s ): '
,
num2str
(
gyroY_mean
)
]
);
disp
(
[
'Angular velocity about Z mean ( rad / s ): '
,
num2str
(
gyroZ_mean
)
]
);
disp
(
[
'Angular velocity about X standard deviation ( rad / s ): '
,
num2str
(
gyroX_dev
)
]
);
disp
(
[
'Angular velocity about Y standard deviation ( rad / s ): '
,
num2str
(
gyroY_dev
)
]
);
disp
(
[
'Angular velocity about Z standard deviation ( rad / s ): '
,
num2str
(
gyroZ_dev
)
]
);
disp
(
[
'Angular velocity about X variance ( (rad/s) ^ 2 ): '
,
num2str
(
gyroX_var
)
]
);
disp
(
[
'Angular velocity about Y variance ( (rad/s) ^ 2 ): '
,
num2str
(
gyroY_var
)
]
);
disp
(
[
'Angular velocity about Z variance ( (rad/s) ^ 2 ): '
,
num2str
(
gyroZ_var
)
]
);
disp
(
' '
);
% %Graph plots:
% figure();
% plot(timeArray, accelXArray * g);
% title('X Acceleration Data ( m / s^2 )');
% xlabel('Time (s)');
%
% figure();
% plot(timeArray, accelYArray * g);
% title('Y Acceleration Data ( m / s^2 )');
% xlabel('Time (s)');
%
% figure();
% plot(timeArray, accelZArray * g);
% title('Z Acceleration Data ( m / s^2 )');
% xlabel('Time (s)');
%
% figure();
% plot(timeArray, gyroXArray);
% title('Angular Velocity about X Data (rad/s)');
% xlabel('Time (s)');
%
% figure();
% plot(timeArray, gyroYArray);
% title('Angular Velocity about Y Data (rad/s)');
% xlabel('Time (s)');
%
% figure();
% plot(timeArray, gyroZArray);
% title('Angular Velocity about Z Data (rad/s)');
% xlabel('Time (s)');
%
%
% %Get the magnitude of the accelerometer data
% mag_accel = sqrt( accelXArray.^2 + accelYArray.^2 + accelZArray.^2 ) * g;
% mag_accel_mean = mean( mag_accel );
% mag_accel_dev = std( mag_accel );
% mag_accel_var = mag_accel_dev ^ 2;
%
% %Display these results and graph them
% disp( ['Magnitude of acceleration vector mean ( m / s^2 ): ' , num2str(mag_accel_mean) ] );
% disp( ['Magnitude of acceleration vector standard deviation ( m / s^2 ): ' , num2str(mag_accel_dev) ] );
% disp( ['Magnitude of acceleration vector variance ( ( m/s^2 )^2 ): ' , num2str(mag_accel_var) ] );
% figure();
% plot( timeArray, mag_accel, 'b' );
% hold on;
% plot( timeArray, ones(1, length(timeArray)) * g , 'r-' );
% title('Magnitude of Acceleration Vector with Respect to Nominal ( m / s^2 )');
% xlabel('Time (s)');
% legend( 'Accel Mag Measured' , 'Accel Mag Nominal' );
%
% %Also graph the percent error
% mag_accel_percentError = abs(mag_accel - g) / g * 100;
% figure();
% plot( timeArray, mag_accel_percentError);
% title('Magnitude of Acceleration Vector Percent Error from Nominal (%) ');
% xlabel('Time (s)');
% ylabel('Percent Error (%)');
%
% mag_accel_percentError_mean = mean( mag_accel_percentError );
% mag_accel_percentError_dev = std( mag_accel_percentError );
%
% disp(' ');
% disp( ['Percent error from nominal mean ( % ): ' , num2str(mag_accel_percentError_mean) ] );
% disp( ['Percent error from nominal standard deviation ( % ): ' , num2str(mag_accel_percentError_dev) ] );
% disp(' ');
%Following example given in MATLAB help
%Looking at the frequency response characterisitcs of the noise
timeArray_diff
=
diff
(
timeArray
);
timeArray_diffMean
=
mean
(
timeArray_diff
);
%seconds
fs
=
1
/
timeArray_diffMean
;
%Get the fast fourier transform
accelX_fft
=
fft
(
accelXArray
*
g
-
accelX_mean
);
accelY_fft
=
fft
(
accelYArray
*
g
-
accelY_mean
);
accelZ_fft
=
fft
(
accelZArray
*
g
-
accelZ_mean
);
gyroX_fft
=
fft
(
gyroXArray
-
gyroX_mean
);
gyroY_fft
=
fft
(
gyroYArray
-
gyroY_mean
);
gyroZ_fft
=
fft
(
gyroZArray
-
gyroZ_mean
);
%Determine the length of our data and obtain only first half of FFT data
N
=
length
(
timeArray
);
accelX_fft
=
accelX_fft
(
1
:
N
/
2
+
1
);
accelY_fft
=
accelY_fft
(
1
:
N
/
2
+
1
);
accelZ_fft
=
accelZ_fft
(
1
:
N
/
2
+
1
);
gyroX_fft
=
gyroX_fft
(
1
:
N
/
2
+
1
);
gyroY_fft
=
gyroY_fft
(
1
:
N
/
2
+
1
);
gyroZ_fft
=
gyroZ_fft
(
1
:
N
/
2
+
1
);
%Get the power spectral density of the signal
accelX_PSD
=
(
1
/
(
2
*
pi
*
N
)
)
*
abs
(
accelX_fft
)
.^
2
;
accelY_PSD
=
(
1
/
(
2
*
pi
*
N
)
)
*
abs
(
accelY_fft
)
.^
2
;
accelZ_PSD
=
(
1
/
(
2
*
pi
*
N
)
)
*
abs
(
accelZ_fft
)
.^
2
;
gyroX_PSD
=
(
1
/
(
2
*
pi
*
N
)
)
*
abs
(
gyroX_fft
)
.^
2
;
gyroY_PSD
=
(
1
/
(
2
*
pi
*
N
)
)
*
abs
(
gyroY_fft
)
.^
2
;
gyroZ_PSD
=
(
1
/
(
2
*
pi
*
N
)
)
*
abs
(
gyroZ_fft
)
.^
2
;
%Multiply everything but the first and last term by 2
accelX_PSD
(
2
:
end
-
1
)
=
2
*
accelX_PSD
(
2
:
end
-
1
);
accelY_PSD
(
2
:
end
-
1
)
=
2
*
accelY_PSD
(
2
:
end
-
1
);
accelZ_PSD
(
2
:
end
-
1
)
=
2
*
accelZ_PSD
(
2
:
end
-
1
);
gyroX_PSD
(
2
:
end
-
1
)
=
2
*
gyroX_PSD
(
2
:
end
-
1
);
gyroY_PSD
(
2
:
end
-
1
)
=
2
*
gyroY_PSD
(
2
:
end
-
1
);
gyroZ_PSD
(
2
:
end
-
1
)
=
2
*
gyroZ_PSD
(
2
:
end
-
1
);
%Get the frequency range vector
freq
=
0
:(
2
*
pi
)/
N
:
pi
;
%Show the plots of the power spectral density in the log domain
figure
();
plot
(
freq
/
pi
,
10
*
log10
(
accelX_PSD
)
);
%plot( freq/pi, accelX_PSD, '*' );
title
(
'Periodogram of X Acceleration Data Using FFT'
);
xlabel
(
'Normalized Frequency (\times\pi rad/sample)'
);
ylabel
(
'Power Frequency (dB/rad/sample)'
);
%ylabel('Power Frequency');
figure
();
plot
(
freq
/
pi
,
10
*
log10
(
accelY_PSD
)
);
title
(
'Periodogram of Y Acceleration Data Using FFT'
);
xlabel
(
'Normalized Frequency (\times\pi rad/sample)'
);
ylabel
(
'Power Frequency (dB/rad/sample)'
);
figure
();
plot
(
freq
/
pi
,
10
*
log10
(
accelZ_PSD
)
);
title
(
'Periodogram of Z Acceleration Data Using FFT'
);
xlabel
(
'Normalized Frequency (\times\pi rad/sample)'
);
ylabel
(
'Power Frequency (dB/rad/sample)'
);
figure
();
plot
(
freq
/
pi
,
10
*
log10
(
gyroX_PSD
)
);
title
(
'Periodogram of Angular Velocity about X Data Using FFT'
);
xlabel
(
'Normalized Frequency (\times\pi rad/sample)'
);
ylabel
(
'Power Frequency (dB/rad/sample)'
);
figure
();
plot
(
freq
/
pi
,
10
*
log10
(
gyroY_PSD
)
);
title
(
'Periodogram of Angular Velocity about Y Using FFT'
);
xlabel
(
'Normalized Frequency (\times\pi rad/sample)'
);
ylabel
(
'Power Frequency (dB/rad/sample)'
);
figure
();
plot
(
freq
/
pi
,
10
*
log10
(
gyroZ_PSD
)
);
title
(
'Periodogram of Angular Velocity about Z Using FFT'
);
xlabel
(
'Normalized Frequency (\times\pi rad/sample)'
);
ylabel
(
'Power Frequency (dB/rad/sample)'
);
%Estimate the average power spectral density, ignoring the first value
accelX_PSD_mean
=
mean
(
accelX_PSD
(
2
:
end
)
);
accelX_PSD_mean_dB
=
10
*
log10
(
accelX_PSD_mean
);
accelY_PSD_mean
=
mean
(
accelY_PSD
(
2
:
end
)
);
accelY_PSD_mean_dB
=
10
*
log10
(
accelY_PSD_mean
);
accelZ_PSD_mean
=
mean
(
accelZ_PSD
(
2
:
end
)
);
accelZ_PSD_mean_dB
=
10
*
log10
(
accelZ_PSD_mean
);
gyroX_PSD_mean
=
mean
(
gyroX_PSD
(
2
:
end
)
);
gyroX_PSD_mean_dB
=
10
*
log10
(
gyroX_PSD_mean
);
gyroY_PSD_mean
=
mean
(
gyroY_PSD
(
2
:
end
)
);
gyroY_PSD_mean_dB
=
10
*
log10
(
gyroY_PSD_mean
);
gyroZ_PSD_mean
=
mean
(
gyroZ_PSD
(
2
:
end
)
);
gyroZ_PSD_mean_dB
=
10
*
log10
(
gyroZ_PSD_mean
);
%Display the average power spectral densities in dB
disp
(
' '
);
disp
(
[
'Average PSD for X Acceleration Data Noise (dB): '
,
num2str
(
accelX_PSD_mean_dB
)
]
);
disp
(
[
'Average PSD for Y Acceleration Data Noise (dB): '
,
num2str
(
accelY_PSD_mean_dB
)
]
);
disp
(
[
'Average PSD for Z Acceleration Data Noise (dB): '
,
num2str
(
accelZ_PSD_mean_dB
)
]
);
disp
(
[
'Average PSD for Angular Velocity about X Data Noise (dB): '
,
num2str
(
gyroX_PSD_mean_dB
)
]
);
disp
(
[
'Average PSD for Angular Velocity about Y Data Noise (dB): '
,
num2str
(
gyroY_PSD_mean_dB
)
]
);
disp
(
[
'Average PSD for Angular Velocity about Z Data Noise (dB): '
,
num2str
(
gyroZ_PSD_mean_dB
)
]
);
disp
(
' '
);
disp
(
' '
);
disp
(
[
'Average PSD for X Acceleration Data Noise : '
,
num2str
(
accelX_PSD_mean
)
]
);
disp
(
[
'Average PSD for Y Acceleration Data Noise : '
,
num2str
(
accelY_PSD_mean
)
]
);
disp
(
[
'Average PSD for Z Acceleration Data Noise : '
,
num2str
(
accelZ_PSD_mean
)
]
);
disp
(
[
'Average PSD for Angular Velocity about X Data Noise : '
,
num2str
(
gyroX_PSD_mean
)
]
);
disp
(
[
'Average PSD for Angular Velocity about Y Data Noise : '
,
num2str
(
gyroY_PSD_mean
)
]
);
disp
(
[
'Average PSD for Angular Velocity about Z Data Noise : '
,
num2str
(
gyroZ_PSD_mean
)
]
);
disp
(
' '
);
end
This diff is collapsed.
Click to expand it.
controls/model/mahony_filter.slx
0 → 100644
+
0
−
0
View file @
70e338d4
File added
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment