HemoSave Device
About this project
Postpartum hemorrhage kills thousands of mothers every year, especially
in low-resource settings. Existing approaches either rely on rough visual
estimation, which can be wildly inaccurate, or on premium devices that are
too expensive and slow to deploy at scale.
HemoSave is an ongoing project to close that gap: a device designed to
measure blood loss quickly and affordably, targeting a correlation with
premium devices while being feasible for hospitals that can't spend thousands
per unit. Learn more at bainitech.com.
- Co-founded the project and helped define the core product requirements.
-
Ran conversations with clinicians to understand workflow constraints
and real failure modes.
-
Focused on making the system usable in noisy, resource-constrained environments.
Status: Active • Ongoing validation and iteration.
SantaBot
About this project
SantaBot is a playful robotics project built around a simple idea:
can we design a robot that feels delightful but still uses the same
core systems we'd rely on for more serious work?
It combines motion, sensing, and behavior in a compact package —
a way to practice robotics fundamentals while shipping something
that actually makes people smile.
- Implemented behaviors that react to the environment in real time.
- Used this project as a sandbox to test control ideas and hardware integrations.
Status: Complete for now • Future upgrades possible.
Kinematics Library
About this project
A lot of robotics students run into the same wall: the math behind
kinematics is already hard, and the libraries they use can feel opaque,
under-documented, or too tied to specific hardware. This library is my
attempt to fix that — starting from the math, not the framework.
It's built around a SerialChain abstraction that accepts
any mix of revolute and prismatic joints, handles symbolic design parameters
(link lengths, offsets) separately from runtime joint angles, and exposes
both symbolic and high-speed numeric paths.
FK — Numeric
SE(3) chain via Rodrigues formula; batched NumPy einsum for N configurations simultaneously
FK — Symbolic
SymPy expressions for end-effector position and the full geometric Jacobian, cached after first build
Workspace Sampling
Vectorized batched FK over thousands of random configs; optional SciPy convex hull for a solid mesh
3D Visualizer
Interactive Plotly + Dash app with live sliders for joint angles and design parameters
How it works
A robot is described by listing joints with R() (revolute) or
P() (prismatic) calls. Joint origins and axes can be symbolic
expressions — so link lengths and offsets stay as parameters until you're
ready to fix numbers. The chain pre-compiles home-pose transforms whenever
the design changes, keeping per-query FK fast.
# Define a 3-DOF arm with symbolic link lengths
chain = SerialChain(
joints=[
R("z", at=(0, 0, 0), q="q1"),
R("y", at=(L1, 0, 0), q="q2"),
P("z", at=(L2, 0, 0), q="q3"),
],
ee=("L3", 0, 0),
)
# Numeric FK — single config
pts = chain.fk_points({L1: 0.4, L2: 0.3, L3: 0.2},
{q1: 0.5, q2: -0.3, q3: 0.1})
# Symbolic Jacobian — computed once, then cached
J = chain.jacobian_symbolic()
What's built so far
-
SerialChain core — forward kinematics (single and batched),
SE(3) transforms, home-frame compilation with design-change detection.
-
Symbolic layer — SymPy end-effector position expression and
geometric Jacobian, useful for deriving closed-form IK or checking singularities.
-
Workspace visualizer — Dash app with real-time 3D rendering of
joint cylinders, rotation-axis arrows, arc indicators, and a reachable workspace
cloud (convex hull if SciPy is available, point cloud otherwise).
-
Modular geometry — separate helpers for cylinder meshes,
orthonormal frame construction, and arrowhead lines keep the rendering layer
decoupled from the math core.
Python
NumPy
SymPy
Plotly / Dash
SciPy
SE(3) Math
Jacobian
Workspace Sampling
Status: Active • Being expanded as I learn — IK and dynamics coming next.