Constructed Test Setup
During Winter Quarter 2026, I developed an edge-computing Structural Health Monitoring (SHM) system for my ME 399 Independent Project. It aims to detect, localize, and assess kinetic impacts (e.g., bird strikes, debris, enemy attacks) on a 1-meter open-architecture UAV wing in real time.
Primary Software: Arduino, Python, OnShape, BambuLab, ANSYS Mechanical (Transient Structural, Modal)
Hardware & Embedded: Teensy 4.1, ADXL375 high-G accelerometers, 30 AWG silicone wiring, Permaboard PCB, 3D-printed PLA structure
Key Focus Areas: CAD design, vibration FFT analysis, ML training
Designed and 3D-printed an open-architecture UAV wing (~ 1-meter span).
Developed a distributed sparse array of high-G accelerometers along the wing.
Trained an ML model to translate acoustic shockwaves into discrete spatial coordinates (across 6 geometric zones).
Executed sub-millisecond inference entirely on the microcontroller to simulate zero-latency flight controller alerts.
Threat: Modern autonomous UAVs face unpredictable kinetic threats (i.e shrapnel, mid-air collisions, bird strikes) that compromise structural integrity.
Vulnerability: Current flight controllers lack real-time spatial awareness for airframe degradation.
When a wing takes damage, the UAV continues to fly under standard aerodynamic assumptions.
This can lead to unrecoverable spins or catastrophic wing separation due to drag.
CONOPS: To survive, the UAV should instantly detect damage, localize it, and trigger adaptive measures (i.e limiting top speed, disabling a compromised aileron, adjusting asymmetric motor thrust).
Goal: Map theoretical acoustic shockwave propagation and identify natural frequencies to determine sensor placement before manufacturing.
Engineering Constraints: Constructed physical wing with a 3D printer for ease of manufacturing. Standard isotropic PLA properties failed to represent 3D-printed internal gyroid infill.
Execution:
Modeled a simplified open-architecture UAV wing with spars, ribs, and skin in OnShape.
Ran Modal Analysis in Ansys to identify the first 6 natural frequencies: 14, 19, 66, 77, 84, 184 Hz.
Simulated a 50 N triangular impulse load (0.002s to 0.008s duration) on the main spar tip in Transient Structural.
Resampled acceleration-time data from Transient analysis to a uniform 1000 Hz grid in Python, then ran an FFT to confirm the dominant response aligned with the 14 Hz fundamental bending mode.
Wing Model in OnShape
50 N downward force applied to a 2-mm circular region on face of main spar
Transient Animation for 50N Impact
Applied Force (Tabular)
FFT on Ansys Transient Acceleration Data
Goal: Construct a 1-meter test wing and integrate a sensor harness capable of recording high-amplitude impacts.
Engineering Constraints: 3D printer bed size limitations required modular printing. Standard drone accelerometers saturate during sharp kinetic events (>16G). Standard PVC wiring is stiff, so it would mechanically dampen the wing's modal response.
Execution:
Split the wing print into 19 individual sections (5 main spars, 5 rear spars, 9 ribs). Printed each section with 4 wall loops and 5-8% gyroid infill, and bonded sections together with JB Weld high-strength epoxy.
Installed M2.5 brass heat-set inserts into spar mounting bosses to mount ADXL375 accelerometers.
Integrated 3 ADXL375 accelerometers (±200 G range, 3200 Hz output data rate) routed via flexible 30 AWG silicone wire to a Teensy 4.1 hub.
Teensy bus capacitance spikes on shared SPI lines corrupted data when testing 4 accelerometers. Turned the sensor array into 3 (locations at main spar root, main spar tip, rear spar tip) and soldered connections to a permanent PCB to eliminate breadboard contact resistance.
Secured the root end of the wing to a 1" - thick wood block. Secured the wood block with six C-clamps to a rigid lab table to simulate a fixed cantilever boundary condition.
ADXL375
Teensy 4.1
Center Punch
Permaboard Connections for 3 Accelerometers
Soldered Permaboard Connections for 3 Accelerometers Before Wing Assembly
C-Clamp Setup
Goal: Classify the physical location of kinetic strikes across 6 discrete zones along my UAV wing using raw shockwave attenuation data.
Execution:
Struck 6 distinct wing zones (Z1-Z6) with a center punch across 120 calibration runs (20 strikes per zone).
Z1 – main spar root
Z2 – main spar middle
Z3 – main spar tip
Z4 – rear spar root
Z5 – rear spar middle
Z6 – rear spar tip
Reduced the high-frequency data from each calibration run by extracting the peak Z-axis G-force across a 0.1s window for each sensor.
Generated a 3-element attenuation coordinate (one per accelerometer): [S1_peak, S2_peak, S3_peak], which should theoretically be unique to each zone. The coordinate is normalized, as the ratio between vibrational amplitudes should stay consistent for strikes on the same zone.
Trained a Scikit-Learn Decision Tree Classifier on the acoustic energy dissipation ratios across the spar paths. As mentioned previously, the vibration data for each zone should be relatively unique and identifiable across multiple trials.
Transpiled the trained Python Decision Tree into static, deterministic nested if/else C++ logic flashed directly to the Teensy 4.1 for edge execution. This logic is implemented when the wing is struck in various zones.
Iteration 1 yielded 44.4% accuracy due to root clamp deflection. I then stiffened the root joint with epoxy and more C-clamps to enforce better "true" cantilever boundary behavior. This increased the classification accuracy to 87.5%.
FFT on Physical Wing Impact (note: same impact section as ANSYS model, but different force amplitude)
Zones 1-6 marked on physical wing (sensors at Z1, Z3, and Z6)
Goal: In practice, I would have the structural state data be livestreamed to a ground station dashboard and trigger autonomous flight adaptations upon structural failure.
Execution:
Built a Python GUI communicating with the Teensy over serial USB to my laptop.
Programmed dynamic UI telemetry displaying live impact location, flashing red on a wing diagram. Also, I had terminal logging of the peak Gs to correspond with what the UI was displaying.
Damage Detection Logic: An impact on the wing spars should transfer energy throughout the entire wing. If a spar ever broke, this would introduce an acoustic discontinuity. For example, if there was spar breakage between Z3 and Z2, and the wing was hit again at Z3, then the energy transfer ratio from Z3 to Z2 should be much less than if the spar was physically intact.
If a tip impact exceeds 10 G but less than 15% reaches the root sensor, the system would flag an acoustic discontinuity.
Physical Validation: I severed the rear epoxy joint between Z4 and Z5. Subsequent strikes successfully triggered the safety override message.
Python GUI Layout
Live Python Impact Detection GUI Logs Impact
C++ Logic from 87.5% Accuracy ML Algorithm
Epoxy Connection Broken Between Spar Connection Between Zones 4 and 5
Sample Flight Controller Override Logic
Screenshot of Failure Detected on Wing from Breakage
Mechanical Interfacing: My printed spar modular joints should feature geometric key/slot interlocking features rather than butt joints. This way, it would improve shear alignment during epoxy curing and prevent premature bond separation.
Sensor Placement: I shouldn't have placed accelerometers at the wing root. Theoretically, these locations should experience little to no vibration if there is a true fixed cantilever setup. That would not make any vibration data from that accelerometer valuable.
Sensing Methodology: I find so many flaws with my CONOPS. First, I have the system detect a physical discontinuity only through a subsequent impact after a possible breakage. Who knows how long that could be after an initial impact, where a UAV has already been long compromised. The system needs to be able to detect this as soon as an impact is detected. So the physical utility of this system is flawed, and more so, I got great experience doing physical integration of sensors and creating some logic override commands.
An improved version could make use of accelerometers and Fiber Bragg Grating (FBG) strain sensors. So the accelerometer could detect the location of the initial impact, and FBGs could analyze the extent of the strain created in that area and assess physical damage autonomously.