Intelligent mobile robot

Project overview: As part of an MEng team project, I took on the challenge of building the control and localisation brains for a fully autonomous warehouse robot. The goal was to navigate an indoor arena using absolutely no GPS or external positioning—just onboard lidar sensor data and math. We decided to build the control algorithms from first principles rather than relying heavily on black-box libraries.
Sensor Fusion & The EKF: The hardest part of robotics is knowing exactly where you are. To solve this, I built an Extended Kalman Filter (EKF) to fuse data from wheel odometry with visual landmark estimates (we used Aruco markers detected via lidar point clouds). To get the EKF behaving properly, I spent hours experimentally capturing static and dynamic datasets to map out the sensor noise characteristics. We found Gaussian-distributed errors in the Aruco measurements and systematic variance in the wheel encoders, which let me create accurate noise covariance models.

Tuning in Simulation: Tuning the math to match reality is a highly iterative process. I used Webots simulation to systematically scale and optimise our uncertainty estimates against ground truth data. I discovered that applying a global scale factor of 3 to our experimentally measured noise gave us the perfect balance: the robot was responsive to new landmark data but didn't wildly jump around. The result? Robust, low-drift localisation lap after lap, with an average position error of just 8 cm and a heading error of 8.2 degrees.

Handling Ambiguity with a Particle Filter: EKFs are great, but they struggle in highly ambiguous environments. To fix this, I implemented a Particle Filter (PF) that maintains multiple 'hypotheses' of where the robot might be. I injected artificial Gaussian noise into simulated Aruco measurements to see how it would handle real-world sensor imperfections. The Particle Filter proved much more resilient to tracking failures and non-Gaussian uncertainty than the EKF, though it certainly demanded more compute power.

Seeing the World: Beyond tracking markers, the robot needed to understand the room. I developed a landmark detection module to identify corner features directly from raw lidar scans. I initially tried curvature-based analysis, but real-world sensor data is messy. I ended up adapting the system to use a RANSAC line-fitting approach, which proved vastly more robust against noise and occlusion when people or objects were moving around the arena.

Mapping on the Fly: I also helped implement a Particle SLAM system using Gaussian Process Regression (GPR). This allowed the robot to generate smooth, probabilistic maps of completely unknown rooms without needing explicit prior knowledge. To keep it running efficiently in real-time, I built a pipeline to aggressively downsample and filter the dense LIDAR point clouds before feeding them into the incremental map updater.

From Sim to Reality: Everything was validated thoroughly in Webots before we ever pushed code to the physical robot. We learned quickly that physical turning manoeuvres needed to be speed-limited to ensure the lidar gathered enough dense data points to keep the map fidelity high. Seeing the robot successfully and autonomously navigate a physical arena based entirely on code we wrote from scratch was an incredible payoff.