More
Choose

Engineer.

Maker.

Builder.

Technical

Built, Shipped,
and Working.

All projects
Private

2 private projects

Seawater RO unit and smart vending machine. Shown in interviews only.

01
RoboticsEmbeddedComputer Vision
Sahasak Nimavum 2025

SMARTNAV
Autonomous Wheelchair System

SMARTNAV system overview: EOG direction control, Kinect RTAB-Map SLAM and the ROS architecture on a Jetson Nano
SMARTNAV LiDAR mapping
SMARTNAV exhibition
SMARTNAV hardware detail
SMARTNAV system overview

Self-funded final year project. LiDAR combined with a depth camera drives SLAM-based hospital navigation - the chair maps, localises, and reroutes in real time around obstacles. Eye-movement control via EOG signal processing means the user only has to look where they want to go. A second input runs on an IR webcam: a face and eye tracker that estimates head pose, gaze and blinks as its own ROS 2 node. Built on ROS2 on a Jetson Nano. Exhibited at the Sahasak Nimavum National Engineering Exhibition 2025.

ROS2 SLAM LiDAR Depth Sensing EOG Face Tracking Jetson Nano Python C++ OpenCV
Interactive

Three ways to drive it

Every input runs as its own ROS 2 node on the Jetson. Pick a path to see what it uses.

JETSON NANO · ROS 2 NODES EOG electrodeson a headband Amp + filtercustom PCB IR webcamworks in the dark Depth cameraKinect LiDARobstacles + map EOG classifierleft · right · up · down Face + eye trackerhead pose · gaze · blinks RTAB-Map SLAMmap + localise Navigationplan path, reroute round obstacles Arduinomotor control Drivemotors
IR camera view of a face with landmarks, head-pose axes and yaw, pitch, roll and blink readouts
Face and eye tracker on the IR webcam: head pose (yaw −63.4°, pitch −2.5°, roll −2.0°), gaze and a blink counter, live.

02
IndustrialRoboticsEmbedded
Active NDA

Industrial Robot Arm
Automation System

Industrial robot arm automation

Multi-axis robot arm deployed and running on an active production floor. The scope covered end-to-end: motion planning, closed-loop sensor integration, suction-based end effector design including Bernoulli-style prototypes, and PLC synchronisation across the full production line. Mechanical components machined via CNC; CAD iterated across multiple revision cycles in SolidWorks and Onshape. Under NDA - specific application and client details not disclosed.

Motion Planning PLC Integration End Effectors SolidWorks Onshape CNC Sensor Fusion Closed-Loop Control
Interactive

Bernoulli gripper, cross-section

Fast air across the face drops the pressure, so fabric lifts toward it without being touched.

compressed air in fast radial flow,low pressure fabric lifts toward the face a thin air gap means no contact, no marks air leavesat the rim

Handling loop · tap a step


03
Full-Stack SoftwareData
Shipped

Property Intelligence
System Sri Lanka

Property intelligence dashboard
Property Intel listings view
Property Intel map overlay

Automated property listing intelligence platform built and running live against real Sri Lankan market data. A scraper pipeline continuously pulls listings across multiple sources into a normalised database. REST API backend exposes the data to a React dashboard with dynamic filters, map overlays, and comparison views. WhatsApp alert system fires matched listings to subscribers in real time. Fully self-hosted, database to deployment - no third-party platforms.

React Python REST API Firebase WhatsApp API SQL Web Scraping Flutter
Interactive

Follow one listing through the system

Six stages from a listing site to a WhatsApp alert.

Tap a step

Listings tracked
50,530
Rentals / sales
30,827 / 19,703
Agent listings
40,098
Sources
3 sites
Listings by source

Live count from the dashboard. Hover a bar.


04
RoboticsVisionEmbedded
Shipped

Autonomous Mango
Soft Gripper System

Autonomous mango soft gripper
Mango gripper detail

Vision-guided soft gripper built for agricultural automation in mango orchards. OpenCV pipeline handles fruit detection, localisation, and depth estimation from a single camera. GRBL controls XYZ positioning; an Arduino drives pneumatic actuation through a custom soft gripper end-effector. The gripper geometry was designed specifically to conform around irregular fruit shapes without surface damage - a constraint that ruled out rigid approaches entirely.

OpenCV GRBL Arduino Pneumatics Soft Robotics Python Computer Vision Motion Control
Interactive

From pixels to a closed gripper

One camera, one gantry, soft fingers.

Tap a step


05
RoboticsEmbeddedVision
Personal Project

Lyny v2.1
Hand Gesture Controlled Robot Car

Lyny v2.1 gesture-controlled robot car
Lyny v2.1 gesture recognition

ESP32-based WiFi-teleoperated robot car with real-time hand gesture recognition. Gesture classification runs on a host machine via OpenCV - detecting and interpreting hand pose from a webcam - and streams directional commands over WebSocket to the onboard firmware. Designed around a low-latency control loop with concurrent video feedback. Custom PCB, 3D-printed chassis, and full firmware from scratch. Personal project, built end to end.

ESP32 OpenCV WebSocket Python Gesture Recognition WiFi Control Embedded C PCB Design
Interactive

From a hand to the wheels

Gesture recognition runs on the laptop; the car stays light and fast.

Tap a step


06
IndustrialEmbedded
Deployed

H-BOT XY Motion System
ClearCore Firmware & Precision Control

HBOT XY motion system

Developed firmware for a high-dynamic H-BOT XY positioning system for an industry client, using a ClearCore logic board. Motion is parameterised through X, Y, F (feed rate), and A (acceleration) values — X axis range 1700 to -1300, Y axis 4300 to -4300. Precision was critical: small coordinate adjustments with verified sequencing and recommended delays between moves to prevent mechanical overshoot. Wrote and tuned the ClearCore firmware from scratch, iterating through code inspection and parameter refinement until reliable repeatable positioning was achieved on the production line.

ClearCore H-BOT Firmware Motion Control XY Positioning Feed Rate Tuning C++
Interactive

Click the table

Both motors are fixed and share one belt, so every move is a mix of the two.

A B −40000+4000+15000−1000Y (firmware units)X
Target
X 0 · Y 0
Motor A
0
Motor B
0

Both motors turning the same way slides the beam along Y. Opposite ways moves the carriage along X. Anything else is a mix.


07
RoboticsVision
Shipped

Delta Robot Vision
OpenCV Conveyor Object Detector

Delta Robot Toothbrush Detector
Delta detection pipeline
Delta contour analysis
Delta coordinate output
Delta robot setup

Full OpenCV vision pipeline for detecting toothbrushes on a moving conveyor and feeding position + orientation data to a delta robot for pick-and-place. Grayscale processing with contour detection isolates each item; principal component analysis extracts centroid coordinates and rotation angle per object. Template matching on the detected head region corrects angle polarity when the brush flips orientation. A pixel-to-millimetre calibration model — automated using a known-length reference object — converts all screen coordinates into robot workspace coordinates. End result: the delta robot receives precise X, Y, angle for every item on the belt in real time.

OpenCV Python PCA Template Matching Contour Detection Calibration Coordinate Transform Delta Robot
Interactive

Try it: the 180° problem

Rotate the brush. PCA finds the axis but not which end is the head. Switch the head check off and watch what the robot would be told.

CAM 0 · 0.42 mm/px (example)
PCA axis
35°
Sent to robot
35°


08
EmbeddedIndustrial
Shipped

Medical Grade
Consumer Device Testing Jig Apparatus

Medical Grade Consumer Device Testing Jig

Custom testing jig apparatus built to medical-grade tolerances for a New York-based health-tech company. The system automates pressure-profile validation and EVT testing cycles on consumer wearable devices, replacing manual bench testing with a repeatable, data-logged workflow. ESP32-based hardware handles real-time sensor acquisition and serial data logging; mechanical housing designed in CAD and 3D-printed for rapid iteration. Contributed to compliance documentation and defined pressure-profile requirements from physical testing data.

ESP32 CAD 3D Printing Firmware Sensor Integration Data Logging EVT Testing Pressure Profiling
Interactive

One test cycle

Bench tests that used to be hand-timed, logged automatically.

Tap a step


09
EmbeddedFPGA
Shipped

Crazy Machine
FPGA-Arduino Interactive Mechanical Display

Crazy Machine FPGA project
Crazy Machine detail

A circus-themed interactive machine built from recycled components — servo gate, Ferris wheel, magnetic elevator, and entrance ramp all choreographed together. The core engineering challenge was synchronised Arduino-FPGA SPI communication: Verilog state machines on the FPGA handled timing-critical sequences while Arduino managed higher-level control logic. Sensor accuracy across multiple subsystems required careful debouncing and calibration. Final result is a fully autonomous sequence that runs start-to-finish without intervention.

FPGA Verilog Arduino SPI Servo Control State Machines Mechanical Design 3D Printing
Interactive

How the show runs

Hard timing in hardware, decisions in software.

Tap a step


10
EmbeddedRobotics
Shipped

Dual-DAC Line-Following Robot
NE555 Comparator, Bang-Bang Control + GUI

DAC Line Following Robot
Line follower circuit detail

Line-following robot built from first principles — dual DAC generates a linear ramp signal that feeds into NE555 comparators for optical sensor thresholding, driving push-pull transistor motor stages directly. Bang-bang closed-loop control implemented in Arduino firmware adapts to varying track conditions in real time. Paired with a custom Python GUI for live sensor monitoring and parameter tuning without reflashing. Explored control algorithm refinement, sensor power optimisation, and circuit design across the full hardware-firmware-software stack.

Arduino DAC NE555 Push-Pull Transistor Bang-Bang Control Python GUI Circuit Design Optical Sensing
Interactive

Signal path

Analog front end, digital decisions.

Tap a step


11
EmbeddedIoT
Shipped

Automatic Plant Watering System
IoT, Firebase + Flutter Mobile App

Automatic Plant Watering System
Plant watering hardware
Plant watering enclosure

End-to-end IoT system for automated plant care — soil moisture and raindrop sensors drive solenoid valves through a custom 3D-printed control box housing a 20x4 LCD. Three operating modes: manual trigger, time-interval scheduling, or sensor-threshold automation. Backend on Firebase for real-time data storage; Blynk for remote control. Flutter mobile app built in Dart gives full visibility and control from anywhere. Rain detection prevents unnecessary watering on wet days. Multiple solenoid lines configurable for different plant zones.

ESP32 Arduino Firebase Flutter Dart Blynk IoT SOLIDWORKS 3D Printing
Interactive

Sensor to app

Three modes, rain-aware, controllable from anywhere.

Tap a step


12
IndustrialPLC
Shipped

Automatic Stamping & Sorting Machine
SIMATIC S7-300 PLC Automation

PLC Automatic Stamping Sorting Machine

Conveyor-based automated stamping and sorting system that categorises items into Large, Medium, and Small by measured length. Photo sensors detect items on the belt; actuators divert them to the correct output lane. Control logic runs on a SIMATIC S7-300 CPU using Ladder Diagram programming — precise timing coordination between stamp actuation and conveyor indexing was the key challenge. Built as a team project exploring how PLCs govern real industrial automation: deterministic cycle times, fail-safe sensor handling, and scalable logic structure.

SIMATIC S7-300 PLC Ladder Logic Conveyor Automation Photo Sensors Actuators TIA Portal
Interactive

Stamp and sort

Deterministic PLC timing against a moving belt.

stamp photo sensor parts sorted by measured length SML

Tap a step


13
VisionMLSoftware
Ballarat pilot

Street Vehicle Detection
YOLO11 Pipeline for Town-Scale Imagery

Ballarat junction with detected vehicles boxed
Street with coaches and parked cars boxed
Coned road with parked cars boxed
Local field-desk dashboard with the Ballarat boundary

A bounded, resumable pipeline that finds parked vehicles in licensed street imagery for a whole town. Panoramas are re-rendered into flat views and photos are tiled so small, distant cars survive detection. YOLO11 boxes are merged across tiles and views, located with a pinhole range model, and clustered so one car seen in dozens of frames becomes one record. Ballarat pilot: 1,844 images, 6,917 detections and 2,460 vehicles, every one saved as a crop for human review. Street imagery: Mapillary contributors, CC BY-SA 4.0.

YOLO11UltralyticsOpenCVPythonSQLiteGeoJSONOpenStreetMapMapillary API
Interactive

Follow a photo through the pipeline

Eight stages from a road network to a reviewable vehicle record.

Tap a step

Detections by class

1,844 images processed on a CPU.

Twelve cropped vehicle detections
Review crops, one per detection. Number plates arrive already blurred by the imagery provider.

14
VisionAutonomous Vehicles
MCAV · 2026

Lane Detection at Night
Adaptive OpenCV Pipeline

Night road with both lane lines detected
Histogram with the Otsu threshold at 37
Least-squares versus robust lane fits

Detects two painted lane lines 1.5 m apart in night footage from a Zed2i stereo camera, built for Monash Connected Autonomous Vehicle's technical task. Every threshold comes from the frame's own histogram with Otsu's method, so the same code works as lighting changes. A pixel must be both an edge and white to count, and lane lines are fitted with a Huber loss plus inlier rejection so stray segments from lamps and shadows can't drag them. Output: a lane overlay, a bird's-eye view and a 416.7 px/m scale, served from a Flask app that takes images or video.

OpenCVOtsuCannyHough TransformRobust FittingPythonFlaskZed2i
Interactive

Step through the pipeline

Seven stages from a raw night frame to two fitted lines. Use the arrows or your keyboard.

Stage 1: grayscale night road


15
VisionRoboticsROS 2
Team · Simulation

ArUco Visual Docking
ROS 2 TurtleBot3 in Gazebo

Gazebo top view with the robot docked at the middle station
Robot camera view of the marker when docked

Team project at Monash: a TurtleBot3 finds a fiducial marker on its charging dock with a single RGB camera, drives in and stops at a set distance. The controller changes with range because the pose estimate's reliability changes with range: bearing-only homing far away, an odometry-driven swing onto the dock's centre line, then a blind final 0.25 m where the marker no longer fits in the camera's view. All four seeded runs docked within about 7 mm, and pose error at 1.76 m was 6.5 mm.

ROS 2 JazzyGazeboArUcosolvePnPState MachinePythonOdometry
Interactive

The docking state machine

Runs at 20 Hz. Tap a state, then see how resolution and angle limit what the camera can read.

States · tap one

How far away the marker still reads

Last reliable detection while reversing at 0.22 m/s, by camera resolution.

How steep an angle it still reads

Share of frames with the centre marker detected, 320×240 at 0.15 m/s.


16
VisionML
Prototype

Cosmetic Grading
Scratch & Dent Detection for Refurbished Laptops

Heavily scratched lid with detected damage marked
Like-new lid with almost nothing detected
Lid where a fingerprint and dust were counted as scratches

A grading baseline that needs no training data: it finds scratches, scuffs and dents on a laptop lid, measures them in millimetres and turns that into grade A, B or C, with the damage marked on the saved photo as evidence. Lighting is flattened using only lid pixels, damage is thresholded against a robust noise estimate, and thin blobs are measured as scratches while round shaded blobs count as dents. Cut-offs fitted on half of 180 test lids graded the other half 93.3% correctly; its misses were fingerprints and dust counted as damage. The test lids are generated, with real-world nuisances added on purpose.

OpenCVNumPyPythonImage ProcessingClassificationEvaluation
Interactive

Photo vs detection

Drag the handle. Then check every lid's score against the fitted cut-offs.

Laptop lid as photographed
The same lid with detected damage marked
PhotoDetected

Damage score of every lid

Log scale. Dashed lines are the cut-offs fitted on the training half. Red rings are test lids graded wrong. Hover a dot.

Held-out half: true vs given grade

90 lids the cut-offs never saw. 84 correct (93.3%).

Given AGiven BGiven C
True A2550
True B0300
True C0129

17
RoboticsControl
Monash · 2026

Sim-to-Real PID
Sphero Robot, Intelligent Robotics

Sphero BOLT at the start of the road-tile test track
The Sphero BOLT robot used for the real runs

Tune a PID controller in simulation, then make the simulator behave like the real Sphero robot so the gains carry over. I fitted a dynamics model with a delay term and logged 377 runs on the real robot. The fitted model predicted held-out runs to 0.033 m RMSE, and the real robot tracked its path at 0.075 m RMSE against a 0.20 m pass limit, with 0.038 m final error against 0.10 m.

PythonPIDSystem IdentificationGymnasiumAutotuningData Logging
Interactive

Closing the sim-to-real gap

The simulator is only useful once it behaves like the real robot.

Tap a step

Real robot vs pass limits

Same gains, run on the real Sphero. Hover a bar.


18
VisionMLSoftware
Prototype

Asset-Label Reader
Barcode, QR & OCR with Cross-Checking

Test label under glare with the barcode, QR and serial boxed
Clean test label read three ways
Motion-blurred label sent to a person
Worn label still read correctly

Reads the serial number off an equipment asset label three independent ways and only auto-accepts when two agree. OpenCV locates the barcode, and a Code 128 decoder written from scratch rectifies it, reads scanlines in both directions, matches bar widths to the 106 patterns and rejects anything that fails the checksum. QR and RapidOCR run alongside. Across 108 test images in nine conditions (tilt, glare, blur, low light, worn labels) it got 96 serials right, sent 12 to a person and accepted zero wrong ones. Motion blur was the only condition that beat it. The test labels are generated.

OpenCVCode 128QRRapidOCRONNX RuntimePythonTesting
Interactive

Pick a condition

See what each reader found and what the vote decided, then the read rate across all 108 images.

Test label under glare

How a read works · tap a step

Correct records
96 of 108 (88.9%)
Wrong serials accepted
0
Sent to a person
12 all motion blur
Time per read (CPU)
49 ms barcode · 2.7 s OCR

Read rate by condition · 12 labels each

Have a robotics challenge, an automation problem, or a system you want to build from scratch?

Let’s solve it together. I build things that actually ship.