Mechanical Engineering + Robotics student at UT Austin (Honors). I work on problems where the answer isn't obvious — pressure vessels at 10 MPa, combat robots that must survive their own weapon, wearables that solve the failure mode every competitor ignores. My process is the same across all of them: understand the constraint set first, then earn the design. Seeking internships in product design, mechanical engineering, and robotics.
Projects
01
Consumer posture wearable built from first principles — differential IMU sensing at the T2–T6 thoracic interval is designed to fix the false-positive problem that gets every competing device abandoned. A 3-phase adaptive haptic algorithm prevents alert fatigue, in a 75×22×12mm package.
02
Fabrication, jig design, and ergonomics engineering on a 4130 chromoly space-frame solar race car — including a force-instrumented seat jig used to qualify drivers on minimum pedal force output.
03
Full design of a 10 MPa hydraulic actuator from first principles — pressure vessel theory and Euler buckling analysis, FEA-validated to <2% error.
04
Pressure-regulated hive feeder eliminating drowning failure modes in urban apiaries. Led a 5-person team to a sub-$5 fluid-lock system with zero bee fatalities across 3 FDM iterations.
05
PPO-trained ground robot that intercepts a live volleyball serve and redirects it to a target coordinate. I led the system concept and reward design, hitting a 66.7% redirect success rate in simulation.
06
Full-stack mechatronics build for Texas Robo Rumble. I owned CAD, electronics integration, and weapon design — including a tip-speed estimate at ~47 m/s and three chassis iterations to solve a brittle-infill failure.
Team lead, 5 people. I owned the vent geometry, wall-thickness, and material/process decisions and drove the P1→P3 failure-analysis loop to a validated, sub-$5 atmospheric fluid-lock feeder.
Outcome
Over a semester and a half, I led a five-person team at Longhorn Design Lab to design and prototype the BeeBetter Feeder — a sub-$5, pressure-regulated syrup delivery system for the Bevo Beekeepers, a recognized UT Austin student organization. By replacing open gravity-fed troughs with an atmospheric fluid-lock mechanism, we eliminated the primary drowning failure mode. Three FDM prototypes, two documented failure modes, and one validated field design later — bees fed successfully with no fatalities observed across the trial.
Research & problem framing
Before touching CAD, we audited existing commercial and DIY apiary feeder designs to understand why the drowning problem persisted. Conventional designs uniformly rely on open gravity-fed troughs — a cheap, simple architecture that creates an uncontrolled flooded pool at full reservoir load. We documented failure modes across several reference designs and identified the core issue: no existing low-cost feeder regulated trough depth as a function of reservoir state.
This research phase directly shaped our design constraints: the solution had to be manufacturable at low cost, reproducible without precision equipment, and deployable by beekeepers with no engineering background. That last constraint had as much influence on the final design as the fluid mechanics did.
The physics: atmospheric fluid lock
When the sealed reservoir is inverted over the trough, syrup flows until it submerges the vent hole — at which point air can no longer enter and a partial vacuum forms in the headspace. Equilibrium holds when:
where ρ ≈ 1330 kg/m³ for 2:1 sugar syrup, g = 9.81 m/s², and h is the fluid column height above the vent. As bees consume syrup, the vent briefly exposes, admits a single air bubble, and reseals — dispensing only what was consumed. The trough self-regulates throughout the entire feeding cycle.
Critical constraint: because Pheadspace < Patm, walls experience continuous inward atmospheric pressure. Any wall flex reduces internal volume, draws in a large air slug, and floods the trough. Structural rigidity was therefore the primary design constraint — not fluid dynamics.
Design & DFM decisions
I owned three specific engineering decisions that defined the architecture of the final design. Each was made with manufacturability as a first-class constraint alongside performance — not an afterthought.
- Vent hole geometry — sized and positioned the vent to allow controlled single-bubble air entry without destabilizing the vacuum. Too large and air enters in slugs, flooding the trough; too small and surface tension blocks entry, starving bees. The geometry was constrained to what FDM could reliably reproduce at standard layer heights without post-processing.
- Wall thickness — set final reservoir wall thickness to resist inward atmospheric pressure without overbuilding. Used SolidWorks Simulation to set up the mesh and validate deflection targets. Thicker walls cost more filament and print time; this was a direct tradeoff between structural performance and unit cost.
- Material and process selection — specified food-safe FDM filament for prototyping with food-safe epoxy as an interim porosity seal. The production roadmap moves to food-safe resin casting, eliminating layer porosity as a structural variable, removing the epoxy step, and enabling finer vent geometry resolution — all at comparable cost. This progression was planned from day one as a deliberate DFM strategy, not a retrofit.
3 prototypes, 2 failure modes
| Prototype | Failure mode | Root cause | Fix applied |
|---|---|---|---|
| P1 | Vacuum never formed — trough flooded immediately | Vent slots oversized; reservoir height too large for vacuum to hold against full fluid column weight | Reduced vent geometry to controlled diameter; recalculated reservoir height to match target equilibrium fluid column |
| P2 | Slow vacuum leak — trough flooded gradually over ~20 min | FDM layer-to-layer bonding at wall joints was porous; ambient air infiltrated headspace over time and broke the seal | Applied food-safe epoxy to all interior surfaces; redesigned joint geometry for improved layer adhesion and airtight bonding at seams |
| P3 | None — validated design | — | Stable sub-millimeter trough depth. Single-bubble controlled air entry. Zero flooding. Successful bee feeding confirmed in live testing. |
Cost & manufacturability
Total prototype unit cost came in under $5 — FDM filament, laser-cut acrylic, and food-safe epoxy. This was not accidental. From the first design review, I held unit cost as a hard constraint: Bevo Beekeepers needed a solution they could reproduce in-house, not a precision-machined assembly requiring vendor sourcing.
Every material and geometry decision was evaluated against three criteria: does it work, can a non-engineer build it, and does it cost less than $5 per unit? The planned transition to food-safe resin casting maintains all three — it removes the epoxy coating step, improves wall integrity by eliminating the most common failure mode from the production path, and stays within budget at low volumes.
DFM takeaway: designing for the end user's manufacturing capability is as important as designing for the engineering requirement. A solution that requires a machine shop to reproduce is not a solution for a student beekeeping club.
Skills demonstrated
Takeaways
This project taught me that manufacturing constraints and user constraints are design inputs, not limitations to work around after the fact. Holding a $5 unit cost and in-house reproducibility as hard requirements from day one changed every geometry and material decision we made — and produced a better, more deployable solution than an unconstrained design would have.
Leading a team through two documented failure modes also shaped how I approach iteration: each failure is a data point, not a setback. P1 told us the vent geometry and reservoir height were wrong. P2 told us FDM porosity was the hidden variable. P3 worked because we listened to both. That loop — fail fast, diagnose precisely, fix one variable at a time — is the most transferable skill this project gave me.
Solo. I sized every component from thick-wall pressure-vessel and Euler-buckling theory, ran FEA on all pressure-boundary parts, and produced the GD&T drawing package. This is an analysis and design study — no physical actuator was built.
Motivation
This project was a deliberate exercise in designing past the CAD model: sizing every component from first-principles theory, validating those numbers against FEA, and asking at each step whether the design survives real operational loads — not just whether it looks right on screen. I used it to pressure-test three skills at once: system-level DFM (tolerance stack-ups, load paths, failure modes), thick-wall pressure vessel analysis, and FEA rigor — with hand calculations and simulation agreeing to within 2% on the governing stress.
Project goal
I designed a complete double-acting hydraulic linear actuator from first principles — applying thick-wall pressure vessel theory to size every component, then validating analytical models against finite element analysis to hold static and buckling margins under a 10 MPa industrial load (fatigue life is a planned V2 study, not yet run). The goal was to move beyond surface-level CAD and develop a genuine product design mentality: tracing exact load paths, calculating failure modes, and producing manufacturing-ready documentation.
Why double-acting hydraulic?
Pneumatic cylinders are fast but suffer from low force density and poor precision due to air compressibility. Electric linear actuators have a large footprint relative to force output and struggle with shock loading. Double-acting hydraulics use pressurized, essentially incompressible mineral oil for both extension and retraction — delivering immense force density in a compact envelope with rigid load-holding capability and bidirectional power. This is the industry standard architecture for aerospace landing gear, autonomous heavy construction equipment, and high-payload robotic end effectors.
Core design specifications
| Parameter | Value | Rationale |
|---|---|---|
| Bore diameter | 50 mm | Balances force output with compact footprint |
| Rod diameter | 25 mm | Standard 1:2 area ratio for medium duty cycles |
| Stroke length | 200 mm | Target operating range |
| Design pressure | 10 MPa (1,450 psi) | Industrial-grade load requirement |
Material selection
- Cylinder tube & end caps — AISI 4140 alloy steel (per detail drawing). A chromium-molybdenum alloy steel with the high yield strength and fatigue resistance needed for cyclic hoop loading — a standard hydraulic cylinder-tube material. Because 4140 is not stainless, the bore is honed and the assembly relies on a corrosion-resistant finish; matching the tube and cap alloy keeps thermal expansion consistent to protect seal fit across the operating temperature range.
- Piston rod — 17-4 PH Stainless Steel (H900). High yield strength (1310 MPa, H900 condition) prevents Euler buckling under compressive load. Resists pitting corrosion that would otherwise create surface asperities and shred the dynamic rod seals.
- Piston — 6061-T6 Aluminum. Chosen as a fail-safe: aluminum against the stainless steel bore eliminates catastrophic metal-to-metal galling if the primary polymer seals were ever to fail.
- Seal stack — Polyurethane & NBR. Polyurethane for dynamic rod seals (exceptional abrasion resistance over millions of strokes); NBR/PTFE T-seal on the piston for petroleum compatibility and extrusion prevention.
14-component assembly
The assembly uses a fixed-to-floating kinematic hierarchy, grounding the cylinder tube to the origin. An Advanced Limit Distance mate (bounded 5–195 mm) simulates the physical oil-cushion end stops inside the cylinder. Rigorous clearance verification confirmed the 0.04 mm piston running clearance and 0.05 mm rod-to-gland clearance without rigid-body interference. Notable design decisions include a 5 mm drain-back port in the front gland cap to prevent hydraulic lock, SAE-6 O-ring boss ports placed 35 mm from end faces so the piston never blocks fluid inlet at full stroke, and piston T-seal grooves sized for a precise 23.5% cross-sectional O-ring squeeze to balance zero-leakage containment with low dynamic friction.
Hand calculations vs. FEA validation
Cylinder tube (thick-wall pressure vessel). Because ri/t = 25/8 = 3.125 — far below 10 — thin-wall hoop stress approximations would underestimate required thickness by ~25%. Using Lamé's equations, maximum hoop stress at the bore surface under 10 MPa computes to +36.94 MPa; total von Mises stress is 40.65 MPa. FEA returned ~41 MPa in the nominal wall — matching the hand calculation to <2% and validating the thick-wall model. At the cross-bore port the local stress concentration raises the FEA peak to ~165 MPa (0.5 mm mesh) — still well under the 460 MPa yield, a factor of safety of ~2.8 at the governing location. The fine local mesh was essential to resolve this gradient; a coarse global mesh would have smoothed it over.
Piston rod (Euler column buckling). Using a pinned-guided end condition (K = 2.0, the worst-case eccentric loading assumption), the hand calculation gives a critical buckling load of 110.8 kN against the 19.64 kN applied force — a safety factor of 5.65. FEA returned a mode-1 load factor of 3.94 (critical load ≈ 77 kN), more conservative than the idealized column. Both confirm a comfortable margin — roughly 4–5× — against buckling; the gap between the analytical K = 2.0 assumption and the meshed end conditions is exactly the kind of discrepancy I would reconcile before releasing the design. The 2 mm uniform mesh across the full rod length was required: buckling is a geometric instability, not a localized stress riser, so sufficient nodes along the slender length are needed to resolve the lateral deflection curve accurately.
GD&T & manufacturing documentation
To prove the assembly was ready for external vendor sourcing, I generated an ASME Y14.5-2018 compliant drawing package establishing the internal bore as Datum A, the rear annular face as Datum B, and a tie-rod hole as Datum C for clocking. Key callouts: Cylindricity ⌭ 0.010 mm on the bore (violation means piston binding and rapid seal failure), Total Runout ⌰ 0.050 mm on the OD relative to Datum A (controls wall-thickness uniformity for even pressure containment — specified in place of concentricity, which Y14.5-2018 removed as functionally unmeasurable on the shop floor), and True Position ⊕ Ø0.5 mm on the hydraulic ports to guarantee alignment with standard fittings. Mounting interface and envelope dimensions follow ISO 6020-2 metric interchangeability, so the actuator drops into standard machine interfaces without adapter hardware.
Additional FEA validation — component-level studies
Beyond the two headline calculations above (cylinder tube hoop stress and piston rod buckling), I ran component-level FEA on every pressure-boundary part to confirm the full assembly — not just the two most critical members — holds safety margin under the 10 MPa design load.
Future iterations
Engineering is iterative. V2 targets a transient CFD simulation to visualize velocity streamlines through the SAE ports, and a thermal-structural coupled study analyzing heat generation from internal fluid friction (~100 W volumetric load) and its effect on seal clearances at sustained operating temperatures.
Concept, mechanical architecture, and RL policy. I designed the holonomic + pneumatic robot concept and the PPO observation / action / reward structure, reaching 66.7% redirect success in simulation. Simulation only — not yet on hardware.
Motivation
Most robotic interception demos in the literature cheat — the object's trajectory is known in advance, or the environment is constrained enough that the math is trivial. I wanted to build something that works on a truly live object: a served volleyball with randomized velocity, spin, launch angle, and landing position, where the policy has to generalize across hundreds of distinct incoming trajectories with zero hardcoded physics assumptions.
The Rob1N Lab at Texas Robotics provided the compute and mentorship to make it happen. I joined as a researcher and took ownership of the system concept, the RL policy architecture, and the simulation environment from the ground up.
Why this is hard
- Partial observation — the ball's landing position is unknown until it is mid-flight. The policy must make real-time predictions that get continuously refined as the ball travels.
- High-dimensional state space — a live serve has six coupled variables: 3D position, 3D linear velocity, and rotational velocity. The agent must reason across all of them simultaneously, not optimize for one.
- No pre-knowledge of trajectory — the policy cannot memorize; it must generalize across a distribution of incoming conditions it has never seen exactly before.
Mechanical concept
The drivetrain is holonomic — four mecanum wheels enable instant omnidirectional translation without chassis rotation. A conventional differential drive wastes critical milliseconds reorienting before it can translate toward the ball, which is fatal for real-time interception timing. The top payload is a pneumatic turntable: a rotating platform for aiming combined with a pneumatic air cylinder for explosive, precisely-timed contact force. Pressurization amount and firing timing are direct outputs of the RL policy — the agent controls the full actuation chain end-to-end.
Policy design — PPO
I designed the full observation and action space, structuring the inputs so the agent had everything needed to reason about ball flight without being given the answer:
- Ball XYZ position (randomized per trial)
- Ball 3D linear velocity (randomized per trial)
- Ball rotational velocity
- Robot XYZ position
- Robot velocity
- Robot → target distance
- Plate pop-up angle
- Pneumatic firing timing
- Pressurization amount
- Plate rotation angle
- Robot XYZ target position
- Drive motor torques
The reward function required the most careful design. An early version caused the policy to collapse onto a single behavior — maximizing one reward variable (e.g. contact rate) while ignoring all others. The fix was a composite multi-objective reward that forced the agent to satisfy all constraints simultaneously:
| Signal | Target | Rationale |
|---|---|---|
| Landing accuracy | Ball within 0.15 m of target XYZ | Primary success metric |
| Spikeability bonus | Ball in 0.5 m zone for 0.5–3 s | Ensures output is usable by an attacking hitter |
| Apex timing | ≈ 0 downward velocity at peak | Penalizes flat, fast sets that can't be attacked |
| Spin reduction | Minimize rotational velocity | Clean sets are more controllable |
| Miss / out of bounds | Penalty | Prevents gaming accuracy by avoiding contact |
Isaac Lab environment setup
I set up the full simulation environment in NVIDIA Isaac Lab — the steepest engineering challenge of the project. Translating the physical concept into a GPU-parallelized simulation required building the volleyball world in Unreal Engine and exporting it as USDZ into Isaac Sim, and defining every physics parameter from scratch: ball mass, restitution, friction, and joint definitions for the turntable mechanism. Getting rigid body dynamics stable and domain randomization working correctly across hundreds of parallel rollouts required significant iteration before training was stable.
Ball physics were validated against real volleyball specifications. GPU-accelerated parallel simulation collapsed what would otherwise be weeks of training into a feasible timeline. The agent trained end-to-end from reward signal alone — no hand-crafted motion planning, no hardcoded trajectory math.
Current results
The policy achieved a 66.7% redirect success rate in simulation, up from roughly 0.3% at initialization — a ~200× improvement driven entirely by the composite reward signal. The agent generalizes across randomized ball position and velocity distributions — it is not memorizing trajectories. The current simulation controls a pneumatic turntable at a fixed position; the robot does not yet reposition to intercept. Full training curve and rollout video available on request.
Next steps
- Full robot integration — replace the fixed turntable with the complete holonomic robot model in Isaac Lab, with correct physics for all joints and drivetrain components.
- Repositioning policy — train the robot to predict ball landing location mid-flight and drive to the correct intercept position before contact.
- Skill composition — train positioning and redirection jointly so the agent executes both skills in sequence without one degrading the other.
- Hardware deployment — transfer the validated simulation policy to the physical robot via ROS.
Chassis & ergonomics, build-floor. I designed and fabricated two welding jigs, co-built the force-instrumented driver-qualification jig, triangulated the failing handbrake mount, redesigned the steering-wheel ergonomics, and produced 10+ ASME Y14.5 drawings.
What I actually did
This was fabrication-heavy, hands-on engineering work on a 4130 chromoly space-frame solar race car built for FSGP and ASC competition. My contributions spanned jig design and manufacturing, driver qualification tooling, ergonomics redesign, weld prep, machine shop work, and structural reinforcement — the kind of integrated build-floor role where you understand the car as a system, not just your one component.
Jig design & weld repeatability
Misaligned or inconsistently positioned tube joints compound across a full chassis assembly — a fraction of a degree off at one node propagates into fit-up problems at every subsequent joint. The previous jig approach had no reliable way to constrain angled tubes to a repeatable position, so each joint required re-setup from scratch.
I designed 2 welding jigs in SolidWorks, manufactured and 3D-printed them, and validated fit against the actual tube geometry. The jigs constrained both tube ends and the joint angle, eliminating per-joint re-setup and holding consistent weld position across every repeat. Setup time dropped approximately 50% compared to the previous approach — estimated against documented prior build logs.
Driver validation tooling — force-instrumented seat jig
A solar car driver needs to sustain controlled pedal force across a long endurance race. If a driver can't physically generate adequate braking or throttle force from the seated position, that's a safety and performance issue — not something you discover mid-race.
I co-designed and built a force-instrumented seat jig with two other team members that solved this at the qualification stage. The jig constrained the driver's feet and back to the exact seated geometry of the car, then used an integrated weight scale to measure the leg force they could apply to the pedals from that position. Candidates who failed to meet the minimum force threshold were disqualified from driving. This turned an informal "does this person fit in the car" check into a documented, repeatable qualification protocol.
The threshold traces back to the regulations: ASC/FSGP scrutineering requires the car to pass a dynamic brake test at a minimum average deceleration of 4.72 m/s². Worked back through the car's master-cylinder sizing and pedal ratio, that corresponds to a sustained pedal force on the order of ~200 N (~45 lbf) from the constrained seating position — the qualification threshold was set above this figure with margin. (Pedal-force figure is a representative estimate from the regulation deceleration requirement and typical pedal-ratio geometry; the regulation value is exact.)
Structural reinforcement — handbrake triangulation
The handbrake rod attachment point was slipping under load — the rod was applying force to a single-point weld that couldn't adequately handle the combined stress from braking inputs. A slipping handbrake on a race car is a safety-critical failure mode.
The fix was a triangulated welded reinforcement: a triangular bracket added around the attachment point to distribute the rod load across a larger section of the frame rather than concentrating it at a single joint. Triangle geometry is the correct structural response here — it converts a bending-dominant load path into a tension/compression-dominant one, which the tube section handles far more efficiently. The result was a stable, non-slipping brake attachment that held through the remainder of the build and testing cycle.
Ergonomics redesign — steering wheel & pedal box
The previous steering wheel layout had buttons positioned too far from the natural hand grip, requiring drivers to reach and shift grip to actuate controls — a problem that compounds over long race stints and at speed. I mapped finger placement data across all candidate drivers, identified the ergonomic envelope where hand contact was most consistent and secure, and redesigned button positioning based on that data. The new layout keeps all controls within the natural grip without requiring hand repositioning.
On the pedal box: holes for the pedal assembly were misaligned and undersized, preventing the system from functioning as designed. I corrected tolerances using the manual drill press and mill, re-establishing the correct geometry and bringing the pedal throw within spec across driver profiles.
GD&T drawings
Produced 10+ ASME Y14.5-compliant engineering drawings for battery box mounting tabs, gussets, and structural attachments — specifying tolerances tight enough to ensure consistent fit-up at assembly while remaining achievable on the shop-floor tooling available to the team. The drawings served as the primary communication layer between CAD intent and fabrication output.
Sample drawings: battery box mounting tabs and frame gussets (AISI 4130 Steel, ASME Y14.5-2018, Scale 1:2)
Skills demonstrated
Takeaway
The most important thing this project taught me is that fabrication is engineering — it isn't separate from design, it's where design gets stress-tested. Every misaligned hole, every slipping brake attachment, every jig that didn't hold position is a design failure that shows up on the build floor. The engineers who are useful on a real car program are the ones who can move between CAD, the machine shop, and the weld table, and who understand the tradeoffs at each step.
Solo — sensing, firmware, packaging. I architected the dual-IMU differential-sensing scheme, wrote the 3-phase adaptive haptic firmware, and designed the FDM enclosure. Breadboard-validated at Prototype 1; the differential-sensing performance is designed but not yet characterized with logged sensor data.
Why I built this
I slouch. I've tried to fix it. Every device I picked up buzzed constantly for the first few days, then I'd ignore it, then I'd stop wearing it. My friends and family repeated the same pattern. That's not a user problem — that's a design failure baked into every product in the category.
This project started as a personal frustration and became an engineering audit: why does every posture wearable eventually get abandoned? The answer sits at the intersection of sensing architecture, behavioral psychology, and mechanical packaging — and none of the existing products had solved all three simultaneously. I built this to fix that, and to teach myself end-to-end mechatronics in the process.
Market audit — what actually fails
Before writing a line of firmware or opening CAD, I spent time mapping the exact failure modes of existing devices. The Upright GO is the market leader — and it has three compounding problems that I documented and used as hard design constraints.
| Failure mode | Root cause | User experience | My design response |
|---|---|---|---|
| False positives | Single IMU with no reference point — reaching for coffee, turning to talk to a colleague, or leaning to pick something up all register as slouch events | Alert fires for normal movement. User loses trust in the device and starts ignoring buzzes | Dual IMU differential sensing: one sensor at T2 as a reference, one at T6 as measurement — only their relative angular change triggers an alert |
| Alert fatigue | Fixed threshold + fixed alert frequency = constant buzzing for users who actually slouch badly, which is exactly who the device is for | End-of-day vibration fatigue. Device abandoned not because it malfunctions but because it works exactly as designed | 3-phase adaptive algorithm — sensitivity and grace period evolve with the user's posture improvement over the session |
| Adhesive attachment | Skin-contact adhesive lasts ~10 uses, degrades with sweat, and requires skin access — incompatible with a dress shirt or blazer | Daily reapplication friction, fails in warm environments, socially incompatible with professional dress | Cantilevered spring clip — grips fabric perpendicular to the spine axis, no skin contact required |
Sensing architecture — the differential IMU decision
The core insight is anatomical. When the thoracic spine flexes into a forward slouch, the angular relationship between the T2 and T6 vertebrae changes — the segment between them curves. A single IMU measures absolute tilt relative to gravity, which means it cannot distinguish a slouch from the entire body leaning forward (to reach something, to look at a screen, to talk to someone). Both events look identical to a single sensor.
Two IMUs eliminate this ambiguity. IMU 1 sits at T2 and acts as the reference — it measures what the entire body is doing. IMU 2 sits at T6 and measures the spinal segment below. The curvature proxy is their difference:
At neutral posture, both sensors read nearly the same angle — the spine is straight, so θ_differential is small. As the user slouches, the T2–T6 segment curves independently of overall body lean — θ_differential grows. The 65mm center-to-center spacing is not arbitrary: it maps to the anatomical distance between the T2 and T6 spinous processes on the human thoracic spine, which is the segment where kyphotic curvature is most pronounced and measurable.
On startup, the device samples both IMUs for ~2 seconds and stores the calibrated neutral: θ_neutral = θ_IMU2 − θ_IMU1. All subsequent detections are relative to that baseline. A 15–20% deviation from θ_neutral triggers the haptic motor — personalized to the user's own anatomical neutral, not a population average.
T2–T6 spacing varies with stature, so the 65 mm figure is a design center, not a per-user requirement: because detection is thresholded on change from the user's own calibrated neutral, inter-user anatomical variation and small placement errors shift the baseline, not the signal. P2 will characterize the placement-error envelope with logged sensor data.
Electrical architecture
The electrical pipeline is deliberately minimal for P1 — breadboard-validated before committing to PCB layout. Two MPU-6050 breakout boards share a single I2C bus, differentiated by their hardware address pins: AD0 pulled low on IMU 1 (address 0x68) and high on IMU 2 (address 0x69). This is the only way to run two identical I2C devices on the same bus without a multiplexer.
- Microcontroller — Seeed XIAO nRF52840. Chosen over the ESP32 on power grounds: the ESP32's WiFi radio draws too much current for a body-worn device on a 150–400mAh LiPo. The nRF52840 has onboard BLE at a fraction of the current draw, and the XIAO form factor (21×17.5mm) fits the PCB envelope constraint.
- Motor drive — 2N2222 NPN transistor + 1N4148 flyback diode. The GPIO pin on the XIAO cannot source enough current to drive the coin motor directly. The 2N2222 acts as a switch — a 1kΩ base resistor limits the current from the GPIO pin, the transistor switches the motor from the battery rail. The 1N4148 clamps the inductive voltage spike when the motor is cut, protecting the microcontroller.
- Haptic actuator — 10mm coin vibration motor, 3V. Selected for minimal audibility through clothing — the Upright GO's vibration is audible in open office environments. The 10mm diameter fits the motor pocket geometry and the enclosure's vibration isolation design.
Power budget (estimated, P1). The dominant loads are the two MPU-6050s at ~3.8 mA each in full accel+gyro mode, the nRF52840 at ~2 mA average with BLE advertising, and the coin motor at ~70 mA but under ~1% duty cycle — roughly 10 mA average draw. On the 150–400 mAh LiPo range under consideration, that is ~15–40 hours per charge — two workdays to a week of 8-hour wear. P2 targets <2 mA average via MPU-6050 cycle mode (accelerometer-only wake at ~10 µA between gyro reads) and BLE connection-interval tuning. Thermally the device is a non-problem — total dissipation is under 100 mW — so the thermal design constraint is the charging path: P2's charge circuit is spec'd to ≤1C with a battery protection PCM, keeping skin-adjacent surfaces well below the 43°C wearable contact limit. (Currents from component datasheets; battery life is a design estimate pending logged P1 power characterization.)
The behavioral problem — why alert fatigue is the real enemy
The Upright GO's training mode vibrates every single time the user slouches. For someone with genuinely bad posture — the primary target user — this means near-constant buzzing from day one. This is not a sensor failure. The device is working correctly. But continuous alerts cause desensitization: the brain habituates to a repeated non-threatening stimulus and stops registering it as meaningful. The same phenomenon is documented extensively in ICU alarm research, where clinical staff are exposed to hundreds of alarms per shift, and 70–90% are false or non-actionable — leading to delayed response to genuine alerts. The behavioral failure mode is identical in both contexts: too many alerts → desensitization → abandonment.
I also ran informal testing: I observed when friends and family quit their posture devices, timed alert saturation against device abandonment, and tracked which alert patterns they tolerated versus tuned out. The pattern was consistent — high-frequency fixed alerts failed within days regardless of the user's motivation. This informed the three-phase algorithm directly.
Adaptive haptic algorithm — 3-phase behavioral model
- Biofeedback loop — real-time haptic signal lets users consciously intercept unconscious slouch behavior
- Pavlovian conditioning — vibration as a conditioned stimulus that triggers an involuntary corrective response over time
- Habit loop — vibration is the cue, correction is the routine, relief from vibration is the reward
- Alert fatigue prevention — algorithm must reduce alert frequency as posture improves to avoid desensitization
- Phase 1 — tight threshold, 10s grace period. Builds awareness through frequent, well-timed feedback
- Phase 2 — threshold widens slightly, grace period extends to 20–30s. Alerts reduce as posture improves
- Phase 3 — long grace periods, infrequent reminders. Device becomes a safety net rather than a trainer
- P2 addition — time-of-day sensitivity: algorithm tightens at known slouch windows (e.g. 3pm fatigue dip) based on session history
The grace period is the critical design parameter — not the threshold. A grace period that's too short makes the alert fire on any transient deviation. Too long and the feedback arrives after the user has already corrected (breaking the conditioning loop). The 10s / 20–30s / long progression was derived from observing the point at which users began ignoring alerts in informal testing, then backing off the frequency until alerts remained actionable.
Gesture interactions are integrated into the enclosure placement: single tap pauses alerts for 10 minutes (intentional lean — meeting, reaching across a desk), double tap triggers recalibration, hold 3s powers on/off. The device has to be reachable by the user's hand for the tap-to-pause to work — this constrained the clip position to the upper collar/trapezius region rather than mid-back.
Enclosure design & DFM
The enclosure target envelope is 75×22×12mm — set by the IMU center-to-center constraint (65mm), PCB footprint (25×25mm), and the requirement that it disappear under a dress shirt or blazer. Every mechanical feature was designed around three constraints simultaneously: IMU measurement integrity, clip retention reliability, and FDM manufacturability.
- IMU registration pockets. Each MPU-6050 breakout sits in a four-walled pocket with 0.2mm clearance per side. The walls prevent the board from rotating — any rotation of IMU 2 relative to IMU 1 introduces a false offset into θ_differential that looks like a slouch signal. I2C wire routing channels between pockets prevent harness bunching that would otherwise stress the I2C solder joints.
- Motor isolation. The coin motor sits in a 10mm diameter × 4mm deep pocket separated from the IMU pockets by a foam gasket. Without isolation, motor vibration couples directly into the IMU accelerometer readings during an alert — the sensor vibrates, the firmware detects it as movement, and false detections cascade. The foam gasket decouples the motor mechanically while keeping the enclosure compact.
- Clip geometry. A cantilevered PLA tongue extending from the backshell grips across the fabric width, perpendicular to the spine axis. This orientation is mechanically correct: the enclosure's own length acts as a moment arm that resists rotation under clip load, preventing the device from pivoting on the fabric (which would skew the IMU readings). A clip retention tab is the designed failure mode — if the clip releases under load, the tab takes the impact rather than the IMU wire joints. P2 replaces the PLA tongue with a stiffer geometry and a compression spring insert for consistent retention force across fabric thicknesses.
- Shell split and assembly. Horizontal split line with heat-set inserts in the bottom shell and M2 screws from the top. No snap-fits for P1 — snap-fit geometry requires tighter tolerance control than FDM reliably delivers at 0.4mm nozzle. 1.5° draft on all vertical walls for clean support removal. Tolerance stack-up analysis covers IMU board flatness, pocket floor flatness, and shell twist under clip load — the combination of these three determines whether the IMU sits square in its pocket or introduces a systematic angular offset.
User requirements traceability
| User requirement | Engineering response |
|---|---|
| "Tell the difference between slouching and reaching" | Dual IMU differential sensing — relative angle change, not absolute tilt |
| "Don't embarrass me in a meeting" | 3V coin motor in isolated pocket; tap-to-pause suppresses alerts for 10 min |
| "Forget it's there until it needs to tell me something" | 75×22×12mm envelope; Phase 3 algorithm becomes a rare safety net |
| "Look professional, not medical" | Clip attachment — no skin adhesive, works over a dress shirt or blazer |
| "Stay put all day without reattaching" | Cantilevered clip perpendicular to spine axis; retention tab failure mode |
| "Alerts feel helpful, not nagging" | 3-phase adaptive algorithm — frequency decreases as posture improves |
| "Actually improve over time, not just depend on it" | Phase 3 design intent: device recedes as habit forms |
P1 → P2 roadmap
- P1 (current) — breadboard validation of full sensing pipeline; FDM enclosure with PLA clip; firmware for all three phases; gesture recognition via tap interrupt
- P2 — custom PCB replacing the breakout boards (eliminates height stack-up from through-hole pins); compression spring clip insert for consistent multi-fabric retention; BLE app sync for session posture history and time-of-day sensitivity tuning; skin-safe enclosure material evaluation per ISO 10993 (irritation and sensitization) for prolonged skin-adjacent wear
Skills demonstrated
Takeaway
This project sits at the intersection of everything I haven't built before — embedded firmware, circuit design, consumer packaging, and behavioral modeling — which is exactly why I chose it. The hardest engineering problem turned out not to be the sensing or the firmware. It was understanding why people abandon devices, tracing that failure mode back to specific design decisions, and building a system that prevents those decisions from being made in the first place. The research came before the CAD, and that order mattered.
Mechatronics — CAD, electronics, weapon. I owned the drum-vs-alternatives selection, the three-iteration gyroid-infill chassis fix, first-principles tip-speed sizing, and systematic ESC fault diagnosis.
Why this project is here
My first exposure to designing for a system that actively wants to destroy itself on contact. Every decision below is a constraint the team hadn't had to design around before — impact loading, weight budgeting under a hard limit, and diagnosing failures we didn't cause but still had to solve on a deadline. The real engineering is in the constraint set, not the build.
Weapon selection — reasoning against alternatives
We chose a drum over three alternatives, for reasons specific to a first build with no prior combat data. The table captures the decision and the logic behind each reject.
| Weapon type | Why we didn't choose it |
|---|---|
| Flipper | Insufficient force-to-weight margin at 3 lb to reliably invert an opponent — a flipper that can't flip just adds a top-heavy, low-clearance liability |
| Vertical / horizontal spinner | Highest offensive ceiling, but bearing and shaft-alignment failure modes are unforgiving with zero prior failure data to design against |
| Wedge | No offensive capability against a bot that simply refuses to engage |
| Drum ✓ | Sustained contact offense, and the drum mass doubles as forward armor — the one weapon type that covers offense and defense simultaneously |
Chassis iteration — three prints, one insight
We went through three print configurations before the chassis survived a full match. The progression is the engineering story: v2 taught us that infill percentage and infill pattern are separate levers — we'd been treating them as one.
| Build | Config | Failure | Root cause | Fix |
|---|---|---|---|---|
| v1 | Low infill % | Tore at drum mount under weapon torque | Insufficient wall stiffness let the frame flex enough to propagate a tear through print layers | Raise infill % |
| v2 | High infill % (rectilinear) | Shattered on impact; over weight budget | Dense rectilinear infill resists steady load but fails brittle under sharp impact — and the added mass cut into the weapon budget | Change infill pattern, not just density |
| v3 ✓ | 20% gyroid | Held for the full event | Gyroid's triaxial lattice distributes impact load in all directions at lower infill % than rectilinear needs for equivalent toughness | Locked as final |
Gyroid recovered the weight that rectilinear's brittleness cost — same or better toughness, less mass. We also relocated motor and drum mounting holes lower in the frame after testing showed hits near the original placement could rupture surrounding filament and loosen structural screws. Moving them out of the highest-impact zone removed the stress concentration entirely.
Weapon sizing — first-principles estimate
We estimated tip speed from the sourced drivetrain before ever spinning it up, to sanity-check the motor/battery choice against drum geometry:
Estimated from published specs and typical 3 lb drum geometry, not tachometer-measured. The calculation is the point — sizing the weapon against voltage and radius before committing to parts, not after.
Weight budget — 1361 g hard ceiling
Every gram spent on structure is a gram not spent on weapon energy. The budget below reflects the v3 configuration — the gyroid infill switch is what freed enough mass to keep the drum assembly at ~37% of total weight.
| Subsystem | Mass (est.) | % of 1361 g |
|---|---|---|
| Drum + shaft + bearings | ~420 g | 31% |
| Weapon motor (2836 brushless) | ~80 g | 6% |
| Drive motors + wheels + hubs | ~230 g | 17% |
| Battery (4S LiHV) | ~60 g | 4% |
| ESCs + receiver + wiring | ~90 g | 7% |
| Chassis + internal dividers (20% gyroid) | ~380 g | 28% |
| Fasteners + margin | ~100 g | 7% |
Estimated from component published specs and class-typical drum-bot allocations — the build was weighed as a complete unit at check-in, not per-subsystem. A calibrated per-subsystem teardown weigh-in is on the list for the next event cycle.
Electrical failure — diagnosis process
One ESC showed no power-on response pre-competition. I isolated it as a manufacturing defect rather than a build error by working through the fault tree systematically: checked input voltage and connector continuity first (ruling out our wiring), then swap-tested the suspect unit against a known-good ESC on the same harness. The failure moved with the part, confirming it was internal to the ESC. Reordered and rebuilt on schedule. The value here isn't that we fixed it — it's that we identified the failure source before wasting time re-wiring a harness that wasn't the problem.
Electronics layout
I positioned the ESCs and receiver outside the drum's rotational envelope during CAD, removing any path for a wire to enter the weapon during a hit. I also added 3D-printed internal dividers around the electronics bay to stop components from shifting under impact loading — a connector fatiguing loose mid-match is an invisible failure mode until it costs you a match.
Match results
| Match | Result | What decided it |
|---|---|---|
| 1 | Win | Opponent's own weapon exchange flipped them onto their back; no self-righting mechanism, immobilized |
| 2 | Loss | Opponent's wedge got under our ground clearance and flipped us; same failure mode, now on our side |
Known limitation — and the next design decision
Both matches came down to the same variable: self-righting. We won Match 1 because our opponent lacked it, and lost Match 2 because we did too. It wasn't an oversight — a first build had to prioritize a working drum and a survivable chassis over a righting subsystem. But it's the clearest next step: either a passive asymmetric shell geometry that resists resting upside-down, or an active righting arm, sized against the weight the gyroid infill switch freed up.
CAD Renders
Full assembly — electronics bay open. Green: battery. Teal: weapon motor. Gold: drum. Drive motors center.
Chassis body (V1) — internal dividers isolate the electronics bay. This iteration was replaced after testing showed it would break on impact.
Drum weapon — exploded assembly. Gold drum body carries the impact mass; bearing and shaft stack visible. The drum mass doubles as forward armor.
Skills demonstrated