Robotics Portfolio

Kishan Grewal

Building robots that learn from demonstration, balance on their own, and navigate the world without a human in the loop.

Extend Robotics, UK

Vision-Language-Action

A full VLA pipeline for a Franka Emika Panda, built in the UCL Robotic Perception and Learning Lab in partnership with Extend Robotics. XR teleoperation for data collection, visuomotor policies fine-tuned on it, and closed-loop deployment on real hardware, targeting a contact-rich industrial task: inserting an electrical connector into its socket.

Policy Deployment

LeRobot VLA Deployment

SmolVLA, ACT, and π0 from the LeRobot framework, fine-tuned on roughly 200 teleoperated demonstrations and deployed closed-loop on the arm for electrical plug insertion. The LeRobot inference APIs couldn't talk to the Franka control bridge directly, so I built the deployment runner from scratch, running inference asynchronously and streaming joint targets to the arm over UDP, using real-time chunking to keep motion smooth.

Data Collection

Meta Quest XR Teleoperation

The policies were trained on hand-collected demonstrations: Meta Quest controller teleoperation drove the arm over UDP through inverse kinematics, recording two synchronised camera feeds and per-episode robot state to JSONL. Before fine-tuning, we cleaned the data, and converted it into the LeRobotDataset parquet + MP4 format.

University College London

Control & Embedded

A cart-pole balancing robot built from scratch, laser-cut chassis, Arduino Giga R1, IMU and encoder sensing. One control stack runs across all three demos: a Kalman filter estimating the full system state, feeding an LQR outer loop that outputs a desired force, with a PID inner loop on each wheel.

Disturbance Rejection

Tap-Test Recovery

An impulse to the pendulum tip, caught and returned to vertical without overshooting the cart limits. The controller is linearised around small angles, so the Kalman filter is doing real work: without a clean state estimate, the LQR would react to noise as much as it would to the actual pendulum angle.

Large-Angle Recovery

Recovery from 20-degree Tilt

The same controller, the same gains, catching the pendulum from a 20-degree initial offset. Well outside the range the linearisation is valid for, and the nonlinear dynamics are not small. It catches it anyway, which says something about how much margin a well-tuned LQR can carry.

Tracking Under Motion

2m Autonomous Traversal

The LQR tracks a moving position reference, generated by a trapezoidal velocity profile that ramps the cart across two metres and decelerates to a stop. The pendulum stays up for the full traverse without hitting the cart limits. Deadband compensation for the motors turned out to be the detail that made it work on hardware.

MangDang, Hong Kong

Quadruped Autonomy

ROS 2 packages for the Mini Pupper 2, built and open-sourced during a summer internship at MangDang's Hong Kong office, placed through the HKSTP Global Internship Programme, a competitive scheme placing international students inside Hong Kong's largest technology ecosystem.

Vision-in-the-Loop

Person Tracking

YOLO detections fused with IMU orientation through independent PID controllers for yaw and pitch, holding alignment to a moving person within three degrees. The IMU matters: camera-only control overshoots on every step cycle as the body bobs. Smooth enough that it actually feels like following.

Autonomous Navigation

SLAM and Navigation

SLAM Toolbox mapping, Nav2 planning, AMCL localisation, deployed on a real table with real obstacles. Quadruped odometry is noisier than wheel odometry and the planners don't know that by default. The costmap inflation radii, DWB critic weights, and AMCL motion model parameters all needed tuning before the robot would navigate reliably without knocking into everything.

Multi-Robot Coordination

Four-Robot Fleet

Four quadrupeds coordinated in C++, each running an EKF over IMU and velocity data to estimate heading. Low-cost servos added yaw drift that built with every gait cycle, so closed-loop heading correction pulled each robot back into line. This kept the formation stable, rather than letting it drift after only a few steps.