Nathan Lodder

Robotics, physical and mathematical modelling, and human-computer interfacing

1. Robot collecting pets
Perspective view of robot
2. Perspective View
Servo power diagram
3. Servo Power Diagram
Magnetometer diagram
4. Magnetometer Functional Overview
Robot collecting pet
5. Robot Collecting Pet
Side view of robot
6. Side View

Pet Rescue Robot

  • Tools
  • C++
  • ESP32
  • LiDar Sensors
  • Magnetometer Sensors
  • Servo Motors
  • OnShape
  • Skills
  • Object Oriented Programming
  • 3D CAD
  • Circuit Design
  • Sensor Characterization
  • Prototyping
  • I2C Protocol
  • UART Protocol

As part of a team of four, I designed, built, and competed with an autonomous robot capable of seeking out and rescuing small stuffed animals (“pets”) from an obstacle-filled environment. Our robot placed 2nd out of 15 teams in the final course competition.

We integrated a range of hardware and control systems:
- LiDAR for initial target detection and navigation support
- Infrared reflectance sensor array in a PID feedback loop for line-following navigation
- Dual triple-axis magnetometers to guide the robotic claw toward magnetic targets
- ESP32 microcontrollers, servos, DC motors, and other fundamental drive and control components
- I2C and UART Protocols for sensor and inter-microcontroller communication respectivley

The robot was powered by three lithium-polymer batteries, and its chassis, storage bay, and arm were built from laser-cut hardboard and 3D-printed PLA components designed in OnShape.

Navigation debugging view
1. Navigation debugging view
Roll and pitch control flow
2. Roll and pitch control flow
Drone in simulation
3. Drone in simulation
Image processing-blue mask
4. Image processing-blue mask
Image processing-morphological closing
5. Image processing-morphological closing
Image processing-contours & convex hull
6. Image processing-contours & convex hull

Simulated Drone Control

  • Tools
  • Python
  • OpenCV
  • ROSa
  • Gazebo
  • OnShape
  • GitHub
  • Skills
  • Networking
  • Bash Scripting
  • Drone Control
  • Version Control

Created two-drone team to navigate simulated environment to collect data from signs in ROS/Gazebo.

Controller nodes were implemented in Python and communicated via rostopics. For high-frequency inter-drone communication I created a custom lightweight message type (see drone message repository). Controllers and stabilizers would send movement demands to a command bridge node which would apply all requested forces to the drone. This was to isolate ownership of force application to a single node and reduce the number of service calls to Gazebo's costly ApplyBodyWrench service.

Roll and pitch stabilization was handled by a node that took inputs from an IMU link on the drone body and published required correction velocities (to be read by the command bridge) after passing the roll, pitch and angular velocity values through a PID function.

I processed the front camera feed with OpenCV for navigation. I used the difference of the horizontal centroid of blue signs from the centre of the frame as the error for left/right strafing and yaw PID controllers. For forward/backward movement I used the relative height of the sign in the frame, pushing the drone back if the sign was too large in frame, and forward if the sign was too small in frame, also through a PID function.

The base drone design was performed in OnShape and converted to a URDF file through the onshape-to-robot plugin. I wrote a python script to convert this .urdf file to a .xacro file for cleanliness and better handling of repeat parts. This file was then modified per developed needs in controller development (adding sensors, modifying drone colors etc.).

1. Sensor overlay on camera feed prototype setup
2. Sensor overlay on camera feed prototype setup
Raspberry Pi setup
3. Raspberry Pi and ultrasonic sensors prototyping
GUI overlay
4. Distance data overlay on camera feed

Wheelchair Backup Assist Proximity Overlay

  • Tools
  • Python
  • Raspberry Pi
  • Raspberry Pi OS Linux
  • Ultrasonic Sensors
  • Data Processing
  • Skills
  • Software Construction
  • Command Line Interfacing
  • Sensor Characterization
  • Prototyping

As part of the Electrical Sub-team at UBC BEST-Enable I programmed Raspberry Pi to stream video from a Picam to a small monitor with a proximity-indicator overlay to provide client in electric wheelchair with visibility and proximity feedback when reversing in tight environments.

This was my first introduction to working on a linux system and debugging in the command line where our primary struggle was interfacing with the external display to create a clean and effective stream for our client. We overcame this by looking through the openCV documentation to find potential solutions, landing on the Python OpenCV namedWindow() method.

Vexbot holding four balls
1. Balls Collected
Front of Vexbot
2. Front View
Perspective view of Vexbot
3. Perspective View
Perspective view of Vexbot
4. Perspective View

Vexbot

  • Tools
  • C++
  • Vex Vision Sensors
  • Vex Motors
  • Vex Distance Sensors
  • Skills
  • Object-Oriented Programming
  • Sensor Characterization
  • Prototyping

I designed and built a Vexbot that uses vision sensors' color recognition cability to identify and collect coloured balls. The robot would then use the same sensor to scan for and identify a delivery location, and would use a distance sensor to detect when it was close enough to drop off the balls.

1. Demo of plugin
dark mode embedded plot in Obsidian
2. Dark mode interactive plot
light mode embedded plot in Obsidian
3. Light mode interactive plot
code block for plot in Obsidian
4. Code block for plot in Obsidian

Obsidian Interactive Plot Plugin

  • Tools
  • CSS
  • JavaScript
  • Python
  • Skills
  • Object-Oriented Programming
  • Event-Driven Architecture
  • Inter-Process Communication
  • Resource Management

I developed a custom Obsidian plugin that integrates a live Python execution environment directly into Markdown notes. Designed to replace static hand-drawn plots with interactive data visualizations, the plugin uses Node.js child processes to bridge Obsidian with the Python/Plotly ecosystem. It features a custom CSS-to-Python theme engine that dynamically injects Obsidian's UI variables into the rendering pipeline, ensuring that plots automatically adapt their color palettes during theme shifts (see photos) for a native user experience.

I wrote this plugin to improve my knowledge management environment and engineering and learning workflows. I plan to create more quality of life features such as quick-plot shortcuts and other UI shortcuts (slider, variable manipulators etc.) as time permits.

NOTE: There is currently an issue where the plugin does not render regular python code blocks properly, only rendering when the tage is 'python local-py'. I am actively working on resolving this issue.

NOTE: Development is on hold while I determine how to protect against recent and anticipated supply chain vulnerabilities in python dependencies.