Rutgers · Computer Engineering

Hi, I'm Aaron
(初荣恩).

I build things. Some of them run on a server, some of them run on a basketball court, and one of them runs on a pair of clippers. Based between the Bay Area and New Brunswick, NJ.

CE @ Rutgers / self-taught barber since 2023 / Hooper

Aaron Chu Bay Area → Rutgers

About

I'm from the Bay Area, studying Computer Engineering with a minor in Computer Science at Rutgers. I like building projects that help others out, not just ones that run on my machine. Outside of school I love to play basketball. I've played all my life on high school teams, intramural teams, and the Rutgers club team for a year. I also picked up barbering as a self-taught skill in 2023, and I've built a steady client base ever since.

Full Stack Development Embedded Systems Machine Learning Physical AI

Experience

  • Software Engineer Intern @ Magnefy Jun. 2026 – Aug. 2026
  • Intern @ Trainify Labs Inc Apr. 2026 – Jun. 2026
  • Undergraduate Research Assistant @ Rutgers Electrical and Computer Engineering Dec. 2025 – Present
  • Deputy Lead Systems Integration Engineer @ University Nanosatellite Program Sep. 2025 – Present
  • Drone Support Intern @ Integem Jun. 2025 – Aug. 2025

Projects

Water Sommelier

A two-arm robot that picks up a glass water bottle, holds it steady, unscrews the cap, and drops the cap in the trash, built with a team of 3 for Viam's "Code That Moves" robot hackathon. Two xArm6 arms with wrist-mounted RealSense cameras replay taught keyframes while vision measures where the bottle and cap are, and the final demo ran end to end on the real arms. Built the Streamlit control dashboard and keyframe format, diagnosed motion-planner failures on the real arms, and fixed a bottle-tracking bug that made detections jump between bottles.

DirecSun

A desk-sized CubeSat for prototyping spacecraft attitude control, built with one other member of the STAR CubeSat team at Rutgers. A brushless motor spins a flywheel inside a 3D-printed 2U frame, 100 x 100 x 227 mm, so speeding the wheel up turns the whole box the other way, the same trick a satellite uses to point without thrusters. An ESP32-S3 closes the loop at 500 Hz from a gyro, a magnetometer, and a two-element sun sensor, and talks to a browser ground station over Wi-Fi. It is a trainer, not flight hardware.

Repository ↗
Hardware Stack drag to turn, scroll to zoom, click a deck to isolate it, or pull the stack apart with the explode slider
How DirecSun works

Why it matters

A satellite has nothing to push against, so it points by trading angular momentum with a wheel inside itself. Most students only ever meet that idea as a diagram. DirecSun puts it on a desk, where you can watch a sensor drift, watch a controller fight it, and see why a spacecraft needs a heartbeat and an e-stop. We built it for student teams, CubeSat clubs, outreach demos, and anyone prototyping pointing logic or ground software.

How it works

  1. The physics. Motor torque spins the flywheel up, and the box takes an equal torque the other way, so it turns opposite to any change in wheel speed. A wheel held at a steady speed does not turn the box at all.
  2. Bias speed. The wheel idles at 2400 rpm, the middle of its 800 to 4000 rpm range, so it can speed up or slow down to turn the box either way without ever reversing. The ESC is sensorless and stutters near zero speed, which is why the wheel never stops.
  3. A cascade running at 500 Hz. Heading error feeds a P controller, which commands a box rate. A PI controller on the gyro rate turns that into torque, torque becomes a wheel-speed reference, and a feed-forward table plus a PI loop on the Hall sensor speed sets the throttle to the ESC. It is PI, not PID. Design gains are k_psi 3.1, k_omega 0.0129, k_i 0.0163.
  4. Sensors. An MPU-6050 gyro and accelerometer, a QMC5883P magnetometer, and a BMP280 barometer share one 400 kHz I2C bus at 0x68, 0x2C, and 0x77. An A1104 Hall switch on a pin interrupt reads wheel speed from magnet passes, two OP550 phototransistors give sun angle as (A - B) / (A + B), and a 100k/22k divider on the ADC reads battery voltage. The barometer stays out of the control loop.
  5. Modes. SAFE with the motor off, then arm, then SPINUP while a printed lock pin holds the box and the wheel ramps to bias speed, then READY, the gateway to everything else. From READY we can detumble a spin back to zero rate, hold a captured heading against pokes, slew to a commanded heading on a 60 deg/s and 120 deg/s2 ramp, point at a lamp, or drive throttle, wheel speed, or box rate by hand.
  6. Safety. A 1 s heartbeat, an e-stop, a battery interlock that arms above 9.6 V and trips below 8.8 V, a 4000 rpm wheel cap holding about 5.7 J, overspeed and underspeed checks, a 30 degree tilt trip, a control-stall watchdog, and the lock pin during spin-up. E-stop and disarm both ramp the motor down over about 5 s, and e-stop latches a flag where disarm does not.

How we built it

  • Mechanical. Every printed part comes out of one parametric CadQuery script driven by a single shared set of dimensions, and an assembly check plants six deliberate collisions to prove it can still catch an overlap. The box turns on two 608 bearings riding a fixed M8 bolt.
  • Firmware. ESP-IDF v6.0 and C++17. The control logic lives in a core library that includes no ESP-IDF headers, so it runs on a laptop under host tests. Those tests plant deliberate mutant safety faults and fail unless the right test catches each one.
  • Ground station. React and TypeScript with a three.js landing page, talking JSON over a WebSocket. One schema defines the contract, and the firmware, the mock box, and the UI all have to match it.
  • Process. We wrote the spec first and had Claude Code agents build against written specs and test lists. The whole stack ran against a mock box, with a recorder driving the real UI through its own buttons and checking every message.

What was hard

  • Printing and fabrication took far longer than the code. We measured parts instead of trusting spec sheets. The motor shaft thread is 6.76 mm, not the roughly 13 mm our first flywheel plan assumed, the washers are 37.88 mm across, and an AA cell is 50.17 mm long.
  • We printed small tests that each answered one question: a bearing fit test where only the 22.4 mm pocket held a 608, a hole gauge that came out loose on the rod hole and tight on the M2 pilot, a hole ladder that settled on a 2.5 mm pilot and a 4.8 mm rod hole, and a washer stack test to rehearse the mid-print pause. The printer ran about 0.4 mm small on holes, so one compensation constant in the CAD fixed all of them.
  • Hardware did not match its spec sheets. The ESCs twitched the motor at zero throttle on DShot150. DShot300 held one ESC still for about 30 s in testing, and our log says plainly that we never explained why.
  • Battery readings were wrong until we calibrated the divider against a meter. A floating ground and the wrong firmware on a swapped board were behind it.
  • Control timing slipped once Wi-Fi came up. Keeping the control tick in IRAM fixed it, and the worst tick stayed under 1 ms across a 45 minute soak with no client connected.
  • Chrome slows hidden tabs, which delayed the heartbeat and tripped the safety timeout. We moved the heartbeat into a Web Worker.

What is next

An Xbox controller in the browser through the Gamepad API. Push the stick to set where the box points, and when you let go it returns to its original orientation. It reuses the manual and slew commands we already have, with the e-stop and heartbeat still in place.

Tokeneyezed

Keeps a long-running coding agent on track toward a hard metric across compactions, crashes, and even a handoff to a different agent, while an observer blocks cheating and destructive steps and every attempt is stored in MongoDB Atlas so the plan can adapt when progress stalls. Built the memory and data layer end to end: embeddings, attempt ledger, bounded context builder, memory compactor, and retrieval eval. Built in a team of 4 for MongoDB's Harness Engineering & Model Wrangling hackathon.

Repository ↗
Control Loop goal loop, memory retrieval, and the observer's on-track/flag branch
flowchart TD
    F1["F1 — User submits goal (Dashboard)"]
    F1b["F1b — Scheduler heartbeat fires (async)"]
    F2["F2 — Frontend validates input"]
    F3{"F3 — Input valid?"}
    F4["F4 — Return validation error"]
    F5["F5 — Backend creates new session"]
    F6["F6 — Backend resumes session from checkpoint"]
    F7["F7 — Goal Loop Controller reads active goal"]
    F8{"F8 — Goal exists and incomplete?"}
    F9["F9 — Persist final state, return output"]
    F10["F10 — Retrieve memory (vector search)"]
    F11["F11 — Retrieve skills (vector search)"]
    F12["F12 — Check metrics history / budget"]
    F13{"F13 — Session budget exceeded?"}
    F14["F14 — Planner decides next action"]
    F15{"F15 — Tool required?"}
    F16["F16 — Treat response as step result"]
    F17["F17 — Tool Executor executes call"]
    F18["F18 — Observer evaluates call"]
    F19{"F19 — On track or flag?"}
    F20["F20 — Generate corrective note"]
    F21["F21 — Log event to sessions"]
    F22["F22 — Metric Scorer writes metrics"]
    F23{"F23 — Failure threshold exceeded?"}
    F24["F24 — Goal Loop Controller replans goals"]
    F25{"F25 — Goal completion criteria met?"}
    F26["F26 — Compactor summarizes + embeds to memory"]
    F27["F27 — Mark goal complete"]
    F28["F28 — [Stretch] Skill distillation to skills"]

    F1 --> F2
    F1b -.-> F6
    F2 --> F3
    F3 -->|No| F4
    F3 -->|Yes| F5
    F5 --> F7
    F6 --> F7
    F7 --> F8
    F8 -->|No| F9
    F8 -->|Yes| F10
    F10 --> F11
    F11 --> F12
    F12 --> F13
    F13 -->|Yes| F9
    F13 -->|No| F14
    F14 --> F15
    F15 -->|No| F16
    F15 -->|Yes| F17
    F16 --> F21
    F17 --> F18
    F18 --> F19
    F19 -->|Flag| F20
    F19 -->|On track| F21
    F20 --> F14
    F21 --> F22
    F22 --> F23
    F23 -->|Yes| F24
    F23 -->|No| F25
    F24 --> F7
    F25 -->|No| F26
    F25 -->|Yes| F27
    F26 --> F10
    F27 --> F28
    F28 --> F7
            

DeskPartner

An overhead camera and VLM planner drive a reBot B601-DM arm to autonomously sort a desk zone into trash, pen cup, and tray, running closed-loop until the desk is clean. Won Honorable Mention at the Embodied Metal Hackathon, hosted by Mission Robotics, New Theory, Savant, and North Star.

DeskPartner Demo ready, click a can or run the demo
grab berry berry grab cola cola grab grape grape
packed 0 / 3
shoulder −76.6° · elbow 96.6° · gripper open · idle

Knowsy

Interactive 5-stage RISC-V pipeline simulator for Knowsy, an open-source educational platform led by Professor Dov Kruger. Students type a program and watch RAW and control hazards, stall bubbles, forwarding paths, and branch mispredictions play out cycle by cycle, with processor-handled and compiler-handled modes. Led a team of 5 for development of the module.

GitHub org ↗
Pipeline Hazard Demo ready, pick a scenario or run the demo

cycle 0 / 10

VeriStudent

Marketplace for college students to safely buy and sell textbooks and find sublets, with .edu-locked sign-in. React/Expo frontend, Supabase Postgres backend with real-time chat.

View live ↗

PocketLab

Built with a team of 4, PocketLab turns a $10 ESP32 into a real-time IoT science lab: a React/TypeScript web app streams live sensor data over WebSockets into Recharts and Three.js visualizations. Includes guided, step-by-step experiment templates with noise filtering, offline fallback, and data export.

Zipply

Real-time chat app built on React and Firebase, with auth, instant messaging, and responsive design.

SuperHearo

Team of 4, Android app pairing voice control and speech recognition to help elderly and blind users with daily tasks.

Repository ↗

Basketball

A few highlights from the court.