程序代写案例-MTRX1701-Assignment 3
page 1 of 8 pages






MTRX1701 Introduction to Mechatronic Engineering

Assignment 3: Working with sensor data in Python (Rev A) 2021

Notes on the Assignment
1. This assignment is worth 12% of your final mark in MTRX1701.
2. You will have the opportunity to ask the tutors for assistance during the tutorial
sessions in weeks 8–10. You should spend approximately one hour preparing for each
of these tutorials so that you can benefit fully from them.
3. The tutors will not assist you further unless you can provide real evidence you have
attempted the questions prior to the tutorials. Beyond the tutorial sessions, it is
estimated that you will need sixteen hours to complete the assignment (about 21
hours total).
4. You may discuss the assignment with your peers, however all written work submitted
for assessment must be strictly your own unless cited.
5. All work must be completed electronically (i.e. typed) including all diagrams.
6. You may complete this assignment using Python (this document) or MATLAB (see
the document “Assignment 3: Working with sensor data in MATLAB.pdf”.
Assignment Submission
1. Submit your assignment electronically as a PDF file via the “Assignments” page on
the MTRX1701 Canvas site.
2. Your assignment submission should be in the form of a report which includes answers
to the various questions and uses plots and code fragments when necessary, to back-up
your answers.
3. All your code must be submitted as appendices to your report, with one appendix per
question. Start each appendix on a new page, and designate appendices as A, B, etc.
4. Note that:
a. All plots in your report must have axis labels including units, a plot title and a
legend if there are multiple lines on one plot.
b. All plots and code fragments in the body of your report must be presented as
numbered figures with figure captions.
c. All code must be set in a fixed width font such as Courier.
5. The assignment is due at 11:59 pm, Saturday 15 May (end of week 10).
6. Late submission will be penalised by deducting 5% of the maximum mark for each
calendar day after the due date. Zero will be awarded after ten calendar days late.
7. Submit early enough to ensure that your submission is processed by 11:59 pm.
8. Keep the email that will be generated automatically by the system as proof of your
submission.
page 2 of 8 pages

Preparation
To complete this assignment, you will need to download and install some version of Python 3
along with the packages numpy, scipy and matplotlib. You can either use the official
distribution of Python or an alternative distribution such as Anaconda.
To install the official distribution of Python (download < 1GB):
1. Visit: https://www.python.org/downloads/
2. Select the installer according to your operating system and architecture.
3. Run the installer and follow the instructions.
4. Use pip (bundled with the official distribution of Python) to install and numpy,
scipy and matplotlib by opening a command window (terminal) and running:
pip install numpy scipy matplotlib
To install the Anaconda distribution of Python (2.5–3 GB):
1. Visit https://docs.anaconda.com/anaconda/install/
2. Download the installer according to your operating system and architecture.
3. Run the installer and follow the instructions accordingly. The installation should be
straightforward.
4. Anaconda comes pre-bundled with numpy, scipy and matplotlib. Once the
installation is complete, you can begin programming by launching the Spyder IDE or
your favourite code editor.
The current image on PCs in the School of IT and School of AMME is Anaconda3 5.0.1
(Python 3.6.3) x86.
The University also provides the option to use Anaconda Navigator on the Citrix Workspace.
To use this option,
1. Go to https://uniconnect.cloud.com/
2. Login using your unikey and password. The username must be entered in the
following format: shared\unikey; for example. shared\abcd1234
3. Select Anaconda Navigator from the App list.
4. Launch the Spyder IDE to start programming.
You can also use your Ed workspace on the ENGG1810 Ed web site to do this assignment if
you really want to, but it is recommended that you to the assignment on your own computer.
Context of the Assignment
Mechatronic engineering involves the management of data. A sensor is a source of data that
must be read, converted into appropriate engineering units, and then used in some way. If the
sensor is part of a control loop the data processing must be completed well within the loop
time. Understanding and working with data is critical to ensuring the reliability and
correctness of most mechatronic systems.
This assignment explores some of the important aspects of managing and interpreting data by
examining data from a variety of sensors associated with a mobile robot, Groundhog.
Groundhog was designed and built at the ACFR (Australian Centre for Field Robotics). Each
student is expected to work individually to understand the concepts and produce answers to
the questions. Students may be asked by their tutor to demonstrate their solutions during the
tutorials. You will use Python as a tool to load, modify and visualise data.
page 3 of 8 pages

When a signal is sampled by a computer-controlled data acquisition or control system the
sampling frequency is only approximately constant; deviations from a constant sampling rate
can be expected to decrease with faster, higher-quality computer hardware, just as the cost of
such hardware will inevitably be higher. A further complication can arise if data are being
transmitted on a network since in that case packets of data may occasionally be lost. When
working with data it is always wise to understand what the data represent, and to inspect the
data for anomalies such as irregular sampling or data losses. Your code should always allow
for such imperfections in data.
Question 1: Signal sampling [22 marks]
A sensor ‘sample’ is a single reading from a sensor that measures some signal – one datum.
When a sequence of samples is acquired over time the sampling rate is very important. This
question investigates the effect of sampling frequency on the accuracy with which the original
signal can be reconstructed from the sampled data.
For a constant sampling rate, the sampling interval ts is defined as the time in seconds
between successive samples. The sampling frequency fs is the number of samples acquired per
second (1/sec, or Hertz), or the reciprocal of the sampling interval:
fs = 1 / ts.
For example, if a sample is taken every 10 ms, the sampling frequency is = 1/0.010 = 100 Hz.
How should the sampling frequency be chosen? One may choose to sample a signal at a faster
rate (frequency) so that:
 The sampled data contain1 more detail, allowing ‘zooming in’ on regions of interest, or
 Any noise that corrupts the signal can be averaged out more precisely.
Conversely, it may be necessary to sample less frequently because:
 A sensor may have a limited sampling frequency, or
 The amount of data at a higher rate may overwhelm processing capacity or overflow the
available storage capacity.
The minimum rate at which a signal needs to be sampled depends on the highest frequency
of interest in the signal that we are measuring. The following questions explore why this is
important. Follow the steps outlined and address the important points in your report.
Creating a dataset using Python
You will use Python’s NumPy library to help generate an idealised, noise-free set of data, and
Python’s Matplotlib to help create plots.
0. The libraries first need to be imported as follows.
import matplotlib.pyplot as plt
import numpy as np
1. Generate a vector of data t representing a set of time values in seconds. Create five
seconds of time data at an interval of 0.001 seconds (1 ms) as follows.
# np.arange(t_start, t_end+t_step, t_step)
np.arange(0, 5+0.001, 0.001)

1 Yes, “data” is plural; the singular form is “datum”.
page 4 of 8 pages

2. Generate a vector y containing a sinusoidal signal with a frequency of 8 Hz.
y = np.sin(np.multiply(8*(2*np.pi), t))
3. Because the vector t only contains data at intervals of 1 ms, the sinusoidal signal y is
effectively sampled at that interval. What sampling frequency corresponds to this
sampling interval? How many samples are taken of each complete period of the sine
curve?
4. Plot the sampled signal amplitude y against time t using
plt.plot(t, y)
Add labels to the plot axes and add a title to the plot. Search the Matplotlib
documentation at https://matplotlib.org/ > [Documentation] to find out how to do this.
5. Zoom in to the graph by creating a new graph with a limited ranges on the axes as
follows, to display the first second of data. How many times does the signal repeat? Is
this what you expected?
# plt.xlim(left_lim, right_lim)
# plt.ylim(bottom_lim, top_lim)
Sampling from this Dataset using Python
What will happen when the 8 Hz signal is sampled at different sampling frequencies?
Investigate this by creating more time vectors, say t1, t2, etc., and generating responses from
the functions as in step 2 to create the corresponding outputs y1, y2, etc.
6. What happens if the 8 Hz signal is sampled at 20 Hz, 9 Hz, 8 Hz, 7 Hz and 5 Hz?
To see additional plots overlaid on the original plot axes, keep plotting after the
command plt.figure(fig_num, figsize=FIG_SIZE). This command retains the
previous plot and draws any subsequent plots on the same axes. The command
plt.subplot creates multiple plots in one figure environment.
7. Explain what is happening. Hint: try plotting with markers: plt.plot(t, y,
marker='o') to see where the samples are falling. Use plt.legend() to show
which markers are which.
8. Research the Nyquist rate and find what the minimum sampling frequency should be for
an 8 Hz signal. Sample the function at the Nyquist rate plus a small amount and show
your results.
Question 2: Noisy data and filtering using Python [26 Marks]
In this section, we will look at some data collected from a millimetre-wave radar. The data is
available in the comma-separated variable (CSV) file radar-2021.csv. This file contains
512 columns of numbers, with each column corresponding to the power received by the radar
(in arbitrary “radar units”) at a particular range. The radar rotates in azimuth at a constant
speed and the samples are taken at a constant sampling rate that corresponds to an increment
of 0.144 degrees of azimuth.
Important note: The outline solution provided below is not as complete as the one provided
in question 1; more, and larger, ‘gaps’ have been left for you to fill in...
1. Find out what millimetre-wave radar is and what “time of flight” means in that context.
2. Research how to convert a time-of-flight measurement in nanoseconds into a range in
page 5 of 8 pages

metres.
3. Load the data from the CSV file.
import numpy as np
raw_data = np.genfromtxt("radar_2021.csv", delimiter=",")
4. Find out how many samples are in the dataset using the command
(num_angles, num_ranges) = np.shape(raw_data)
5. Generate a vector angles containing the azimuth angle of each sample set (each row)
del_angle = np.radians( 0.144 ); # angles must be in radians!
angles = np.arange(num_angles)
angles = angles * del_angle
6. Create a vector ranges containing the ranges of each radar measurement using the
equation you found in part 2 of this question, with the time difference between
successive radar measurements set at 0.633 ns.
7. We want to be able to plot these data for visualisation. Start by associating each range
measurement with an angle using meshgrid():
rr, tt = np.meshgrid( ranges, angles )
zz = np.zeros(np.shape(raw_data))
8. Convert these data into Cartesian coordinates and visualise them as a scatter plot. Label
each axis (including the colour axis) and give the graph a title. Axis labels must include
units of measurement.
import matplotlib.pyplot as plt
# Convert to Cartesian, etc.
plt.scatter(...)
# Add labels, etc.
plt.show()
Hint: If your scatter points appear too large, consider passing the additional parameters
marker=’.’and s=1 to the plotting function.
9. The radar measurements have distinct returns, however there is noise introduced due to
thermal noise, imperfect power-matching, and manufacturing variations in component
fabrication. It is important to extract return signals that we are certain come from real
objects rather than being a result of noise. To do this we will use a CFAR detector.
Research CFAR detectors to find out what they are, and what the different variants are.
10. NumPy does not contain CFAR functions so we have supplied these (thanks Jacob!)
CFAR Detector Implementation Notes
a. We have supplied two functions CFAR1D() and CFAR2D()in the file CFAR.py
which implement 1-D and 2-D CFAR detectors.
b. The supplied detectors have variable window lengths at the edges of the data.
c. An example using CFAR2D() is shown below
x = raw_data;
hits2D, thresholds2D = ...
CFAR2D( x , pFA, nGuard , nTrain )
page 6 of 8 pages

11. Try applying a 2-D filter to the data using CFAR2D() and compare the outputs to those
from the 1-D filter CFAR1D(). How are they similar or different? Why is this so?
Question 3: Correction of sensor bias [26 marks]
This question relates to the ACFR Groundhog Robot, shown in Figure 1. Groundhog
navigates autonomously using data from an inertial navigation system (INS). The INS
contains a triaxial accelerometer and three gyroscopes oriented in the same directions as the
accelerometer axes. An accelerometer is a sensor that measures acceleration relative to an
inertial frame of reference; a triaxial accelerometer measures acceleration components in
three orthogonal directions.


Figure 1: The ACFR Groundhog robot.

The data for this question are from the triaxial accelerometer which is part of the INS
installed on Groundhog. The INS is fixed to the Groundhog frame with the accelerometer
oriented so the +x-axis points forwards, the +y-axis to the right and the +z-axis downwards.
INS data were acquired as the robot drove around a field. The data are in a file called acc-
2021.csv with the columns ordered as time (seconds), then the x, y and z components of
acceleration (m/s2).
1. In Python, load the data into a vector acc. Generate a time vector t from the data and
scale this appropriately.
2. Plot acc against t for each of the axes. What do each of the peaks represent? What is
the greatest acceleration experienced by the robot in each axis direction? Overall?
3. Acceleration data represent the time rate of change of velocity. If acceleration values are
integrated with respect to time, what do we end up with? What if we do it again?
page 7 of 8 pages

Integration of a signal involves summing the area under the curve. In sampling this
signal, we are sampling a continuous (analogue) signal—acceleration—at a set of
discrete times. There is no information available about the signal except at the discrete
times when the signal was sampled. In the time between samples, it could be assumed
either that the signal is constant or that it changed linearly. Assuming a linear change is
arguably the better assumption. Under this assumption the sampled signal can be
integrated by summing the trapezoidal areas defined by connecting adjacent sample
points with straight lines. This is the trapezoidal rule for numerical integration.
4. Calculate the cumulative sum of the individual accelerations using the trapezoidal rule
to generate a vector of velocity measured in metres per second.
Note: Python has a cumulative trapezoidal sum function called cumtrapz(). To use
cumtrapz(), add from scipy.integrate import cumtrapz at the top of the
file, and use the syntax cumtrapz(x,initial=0), where x is the variable being
passed to the function and initial=0 ensures an output matrix of the same size.
5. Do the same for the velocities to generate a vector of position in metres.
6. Plot the cumulative sums against time. When does the robot start moving? When does it
stop? What is its speed whilst moving?
7. Turn on the grid for the plot using the Python command plt.grid(). Can you see any
long-term trends that should not be there? When the robot is not moving, its position
should be constant, and its velocity should be zero; neither the position nor the velocity
cumulative sums should change. Are the position and velocity lines exactly horizontal
during periods when the robot was stationary? Can you see a trend where (supposedly)
horizontal lines have a non-zero slope?
A trend where the data ‘drifts’ in an unexpected way often comes from integrating a
signal bias. The bias is noticeable here when we expect a horizontal line (constant
position), but the bias in fact influences the entire dataset. An INS has a bias that
changes for several reasons, mostly related to temperature. Because of this, we need to
calculate and remove this bias for each dataset. A good way to identify the bias is to
leave the INS stationary for a short time, usually at the start or at both the start and
finish of data collection. If accelerometer bias is present, the average of the samples
collected will be non-zero2.
8. The samples between 4400 and 4497 inclusive were acquired while the robot was
stationary. Plot a histogram of these values. Python can plot a histogram using the
plt.hist() function; read the Matplotlib online documentation on Histograms to find
out how to use it.
Note: A subset of a vector can be selected in Python using subset =
vector[start:end]. For the current example, since the index starts from zero in
Python, use stationary_data = scaled_data[4399:4496].
9. Does the average value of the histogram look like it is zero? Find the actual average
value using Python’s np.mean() function and store in the variable bias.
10. This calculated mean value indicates that on average, each sample is moved away from
zero by this amount. Make a new variable acc_unbiased where you subtract bias

2 Provided that all noise present is zero-mean.
page 8 of 8 pages

from the biased data acc.
11. Repeat steps 3-8 using the new vector acc_unbiased. Generate a set of plots
containing the cumulative sums of acc and acc_unbiased and comment on the
difference.
Question 4: GPS data [26 marks]
Groundhog was also receiving satellite navigation data during the same mission as in part 3.
We wish to compare the inertial measurements to the GPS tracks in this question.
1. The GPS data were collected from a differential GPS system. Research differential GPS
and compare it to regular GPS.
2. Load the GPS data from the file GPS_2021.csv. From the latitudes and longitudes in
the file, where in the world did the measurements take place?
3. The GPS unit provides navigation solutions as coordinates in the latitude, longitude, and
altitude frame of reference. These coordinates are difficult to work with for most
ground-based robotic navigation tasks, so an alternative coordinate system—Universal
Transverse Mercator, or UTM—is used. Research this coordinate system and find the
transform from LatLonAlt to UTM. There are several different UTM spatial reference
systems in use; you should preferentially use Map Grid of Australia 2020 (MGA2020)
or WGS 84.
4. Apply this transform to the GPS data provided.
5. Plot the data in the UTM frame of reference and compare it to the results for the
position found in Question 3. How are they similar/different? What are some ways that
these two sets of data could be used together?















Revision history


A DCR 04/05/2021 Clarified “Assignment Submission” section
— DCR 25/04/2021 First release
Revision Made by Date Detail


欢迎咨询51作业君
51作业君 51作业君

Email:51zuoyejun

@gmail.com

添加客服微信: ITCSdaixie