Three simulators, one thread: estimation you can test.
From lunar-rover localisation to atmospheric entry and spacecraft attitude estimation, these projects connect physical models, sensor fusion, and software integration.
Purpose. Explore a complete lunar-rover autonomy loop in simulation: drive a six-wheel platform with Ackermann steering, estimate its motion from complementary odometry sources, and inspect the results offline. The project is a learning and integration testbed, not a mission system.
My contribution
I develop the six-wheel rover model and localisation stack: stereo visual odometry, wheel odometry, and a continuous error-state Kalman filter fusing IMU, visual, and wheel measurements. I also implement Ackermann steering, startup supervision, and rosbag recording with Plotly post-processing.
Technical approach
Stereo visual odometry uses LocCams, the forward-facing stereo localisation cameras mounted on the rover body, not NavCams. Wheel odometry is a parallel measurement path. A continuous error-state filter propagates on raw IMU and corrects from VO and wheel terms, keeping rotation handling explicit through Eigen. A supervisor orders startup; rosbag captures runs for Plotly review.
SenseStereo images, wheel encoders and raw IMU in Gazebo Harmonic.
OdometryStereo VO and wheel-odometry front ends publish motion estimates.
FuseContinuous error-state KF propagates on IMU, corrects on VO and wheel.
DriveAckermann steering converts velocity commands into wheel targets.
Illustration · not simulation data
Current scope. A single-rover simulation testbed. Wheel-slip feedback is disabled, and multi-rover operation remains a design direction rather than a demonstrated capability.
Purpose. Explore atmospheric entry with a layered steady-state Earth atmosphere and a six-degree-of-freedom trajectory propagator. State histories are archived for analysis, with Python plots for inspecting the atmosphere model.
My contribution
I implemented the layered atmosphere model, the trajectory state (position, velocity, quaternion, and body rates), fixed-step RK4 and adaptive Dormand-Prince 5(4) integration, and the atmosphere-to-trajectory-to-archive time loop. I also developed Python tooling to inspect the atmosphere model.
Technical approach
Each step evaluates the atmosphere from the current position, propagates the full state with the selected integrator, and appends the result to an archive for offline analysis. Adaptive step control follows the Dormand-Prince 5(4) pair; fixed RK4 remains available for comparison and debugging.
AtmosphereLayered steady-state Earth model evaluated at current position.
Propagate6-DOF step with fixed RK4 or adaptive Dormand-Prince 5(4).
ArchiveTime loop appends state history for later review.
InspectPython plots support atmosphere-model inspection.
Illustration · not simulation data
Current scope. In development. The live-data application and network interface remain planned. The work described here may be ahead of the public repository's default branch.
Purpose. I developed NBodySimulator to simulate and test JamSail's ADCS, including attitude estimation, sensor fusion, sun sensing, and magnetic attitude control. The simulator and the CubeSat subsystem are distinct but closely linked projects.
My contribution
I developed the simulator, an Extended Kalman Filter fusing sun-sensor, magnetometer and IMU measurements, and my own implementation of the International Geomagnetic Reference Field (IGRF). I also developed and tested a sun-sensing algorithm using NBodySimulator.
Technical approach
TRIAD was studied but found too susceptible to noise and was not used in the final estimator. EKF sensor fusion and operation when the CubeSat could sense the Sun provided the lowest-cost solution that met the payload's operational requirements. My IGRF implementation models the magnetic environment for attitude-estimation and control studies.
SenseSun-sensing algorithm developed and tested in NBodySimulator.
FuseEKF combines sun-sensor, magnetometer and IMU measurements.
EnvironmentMy IGRF implementation models the magnetic field.
ActuateMagnetorquer models support magnetic attitude-control studies.
Illustration · not simulation data
Current scope. An engineering simulation harness, not flight-qualified software. Solar-sail and accelerometer paths remain unfinished.
Led ADCS requirements, architecture, interfaces, and verification planning for a CubeSat carrying a GNSS-interference sensing payload and a new solar-sail design. Developed embedded C software and coordinated subsystem interfaces with the spacecraft team.
My NBodySimulator was developed to simulate and test this ADCS. The work included EKF fusion of sun-sensor, magnetometer and IMU measurements, my own IGRF implementation, and development and testing of a sun-sensing algorithm.
TRIAD was investigated but rejected because of its susceptibility to noise. Restricting operations to periods when the CubeSat could sense the Sun, together with the Kalman Filter, was the lowest-cost solution that met the payload's operational requirements.
Worked on requirements, system architecture, subsystem interfaces, and breakdown structures in a 12-person student CubeSat team. Integrated Raspberry Pi software, a microcontroller, IMU, and cameras; the team achieved a top-four finish among 12 UK teams in the UKSEDS Satellite Design Competition.
Explore the source repositories above, read about my research and engineering background, or get in touch to discuss estimation, simulation, and robotics.