Jump to:  Research,  Tools,  Toys,  Coursework


Some of the things I've done in grad school. For a complete list of my publications, see my Google Scholar profile.

Keep it Upright: Nonprehensile Object Transportation on a Mobile Manipulator

We consider a nonprehensile manipulation task in which a mobile manipulator robot must balance objects on a tray without grasping them—known as the waiter’s problem—and move to a desired location while avoiding static and dynamic obstacles. We propose a model predictive control approach that is fast and reactive enough to dodge a thrown volleyball while keeping a tall water bottle balanced.

Force Push: Robust Single-Point Pushing with Force Feedback

We present the first controller for quasistatic (i.e., assuming accelerations are negligible) robotic planar pushing with single-point contact using only force feedback. We show that our controller is robust to parameter variation and state perturbations through simulations and hardware experiments.

Mobile Manipulation in Unknown Environments with Differential Inverse Kinematics Control

This work is an exploration of mobile manipulator control and the capabilities of our robot. We propose a whole-body differential inverse kinematics control approach for position-controlled industrial mobile manipulators. Our controller is capable of task-space trajectory tracking, force regulation, obstacle and singularity avoidance, and pushing an object toward a goal location, with limited sensing and knowledge of the environment. We evaluate the proposed approach through extensive experiments on a 9 degree-of-freedom omnidirectional mobile manipulator.

Safe Online Learning with Gaussian Processes

We develop a safe online learning-based controller that combines robust control with Gaussian process regression (GPR). The main idea is to use GPR to learn an upper bound on the uncertainty in the system online, which is then used in a robust controller. We prove that the learned upper bound is correct with high probability and we verify the approach experimentally on a 6 degree-of-freedom UR10 industrial manipulator.


Some small side projects that may be useful.


Compile xacro files to URDF directly from Python.


Small utilities for PyBullet, including shortest distance computation, point-clouds from cameras, recording video, ghost objects, and more.


Compiled auto-differentiated code using CppADCodeGen combined with an easy Eigen interface and Python bindings.


A vim plugin to uniquely highlight the current match under the cursor.


Jump to previously-visited directories by name. If there are multiple matches, the user selects the correct absolute path from a list. A cousin of z with a more obvious directory-priority algorithm.


A simple shell script to cut, copy, and paste files between directories from the command line.


A simple shell script for easily sourcing files from any directory.


Some small side projects that may be fun.

Predator Prey Simulation

A web-based simulation of flocking birds being hunted by predators.


A curses-based version of Conway's Game of Life that allows for multiple species of cell, written in Python.


A simulation of bodies with gravitational attraction and elastic collisions in two dimensions.


A collection of fractals including the dragon curve, Sierpinski triangle, Mandelbrot set, and Koch snowflake.


Some of the more interesting projects done for my undergrad courses.

Nuclear Power Plant Inspection Robot

A mobile robot capable of navigating the boiler room of a nuclear power plant and autonomously performing pipe thickness measurements and collection of other relevant data. Engineering Capstone project. I focused largely on the software systems, particularly the vision system and interface to the robot arm.

Autonomous Obstacle Course Traversal Robot

A mobile robot that autonomously traverses an obstacle course, including ascending and descending a ramp and locating a variable end point. Developed as part of the MTE 380 design project course at the University of Waterloo. I worked primarily on the robot's software, including the signal processing, movement, and state machine.

Read My Lips

An LSTM-based neural network architecture designed to perform lip-reading. Achieved an average accuracy of 86.30% when reading the lips of a known speaker.