Exhibits

  1. 01 // N-Trailer LQR Control

    2025 PythonscipyLQRKinematicsControl Theory

    Kinematic simulation and time-varying LQR controller for a n-trailer system.

    Backward driving a tractor-trailer chain is open-loop unstable. Any deviation from the reference grows and the trailers jackknife. The control problem is to stabilise this configuration in closed loop along an arbitrary reference trajectory. The reference is planned forward through the nonlinear kinematic model, then time-reversed. TV-LQR tracks it backward.

    The gain K(t) comes from integrating the matrix Riccati ODE backwards over the reference time grid using scipy solve_ivp, then interpolating at runtime. Simulation runs in PyMoskito with geometry and trajectory configured in scenario.yaml. Tested on a physical n-trailer testbed: friction, inertia, and encoder noise produced results measurably different from simulation with limited STM32 flash further constraining the K(t) storage resolution on hardware.

  2. 02 // CSV Session Logger

    2025 PythonpandasnumpyCLIData

    Session-based CSV logger for robotics experiments and bench tests. One file per run, scalar channels aligned on wall-clock time. Published on PyPI.

    Channels must be registered before logging. That constraint is intentional: you decide upfront what goes into the CSV instead of accumulating untracked columns mid-run. log() timestamps each call independently, log_many() shares a single timestamp across all keys in the dict. The difference matters when channels arrive asynchronously.

    Three fill strategies handle the resulting NaN gaps on save: none leaves them as-is, ffill propagates the last known value forward, mean interpolates between neighbours. The CLI entry point csl covers the common inspection workflow without opening Python: channel listing, duration, and quick matplotlib plots with configurable column subsets.

  3. 03 // Mobile Robot State Machine

    2026 PythonExudynROSFSMRobotics

    7-state finite state machine for an omnidirectional mecanum platform with a 6-DOF manipulator, executing a synchronized pick-and-place loop via trapezoidal velocity profiles in Exudyn simulation.

    The state machine coordinates navigation and manipulation sequentially. It computes an approach point 0.8m from the target along the robot-object line, allowing the platform to back away smoothly if it starts within the radius. Motion planning relies on synchronized trapezoidal velocity profiles across the x, y, and heading axes, where the longest required duration stretches the other axes to guarantee clean, simultaneous convergence.

    A P-controller combines feedforward velocity targets with real-time error correction, clamping output to 110% of maximum velocity. Once in position, spatial transforms via spatialmath SE3 map the object's simulation frame to the arm's moving base frame. The manipulator executes a multi-stage descent (pre-grasp, lower, grasp, and lift) before reversing the original trajectory by mirroring the synchronized velocity parameters.