Why
Throughout Varden Labs and Embark I helped develop a lot of the perception and localization algorithms, but my co-founders implemented them. After leaving, I wanted to build them myself, so I learned ROS.
Set-up
Using ROS simulation libraries, I built an environment for a robot to drive around and sense with a simulated lidar, and published artificial wheel-encoder and GPS data with added noise to develop against.
The screenshot at the top shows it running: the Gazebo world top right and RViz below it, with the keyboard-teleop terminal and the code that generates the noisy encoder data on the left.
What I built
- Path recording and trajectory following: record waypoint paths, follow them, and visualize them in ROS.
- A probabilistic 2D occupancy-grid map built from lidar and robot state, saved to disk for later localization.
- An extended Kalman filter fusing encoders with poor GPS, with the error ellipse and heading-error arc drawn in RViz (the blue circle and arc in the screenshot).
- ICP scan registration from the robot’s lidar frame to the global map, feeding a particle filter that moves particles with the ICP transform and the EKF, and resamples them using the ICP fitness score. The particle filter was still in development when I wrote this up.
Localization pipeline
- Simulated sensorsLidarWheel encodersWith added noiseGPSDeliberately poor
- Dead reckoningExtended Kalman filterState estimate with error ellipse
- Map matchingICP scan registrationAgainst a saved occupancy-grid map
- EstimateParticle filterParticles moved by ICP + EKF, resampled by ICP fitness


