Projects

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.

Lunar simulator - six-wheel rover autonomy loop

Stack: ROS 2 Jazzy · Gazebo Harmonic · C++17 · Eigen · OpenCV

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.
  1. SenseStereo images, wheel encoders and raw IMU in Gazebo Harmonic.
  2. OdometryStereo VO and wheel-odometry front ends publish motion estimates.
  3. FuseContinuous error-state KF propagates on IMU, corrects on VO and wheel.
  4. DriveAckermann steering converts velocity commands into wheel targets.
Lunar rover estimation stack schematic Side-view rover with attached NavCams and forward-facing stereo LocCams. LocCams provide visual odometry; IMU and odometry feed an error-state filter. Illustrative only. six-wheel rover · side view NavCams LocCams IMU (raw) propagation VO + WHEEL ODOM correction ERROR-STATE KF continuous filter
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.

ArvSimulator - entry trajectory and atmosphere core

Stack: C90 · CMake · fixed RK4 · adaptive Dormand-Prince 5(4) · Python plotting

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.
  1. AtmosphereLayered steady-state Earth model evaluated at current position.
  2. Propagate6-DOF step with fixed RK4 or adaptive Dormand-Prince 5(4).
  3. ArchiveTime loop appends state history for later review.
  4. InspectPython plots support atmosphere-model inspection.
Layered atmosphere and entry arc schematic Horizontal atmosphere layers with a dashed entry arc, state vector and integrator annotations. Illustrative only. layered steady-state atmosphere upper middle lower surface entry archive 6-DOF STATE pos · vel quat · rates RK4 FIXED DOPRI 5(4) atmosphere trajectory archive
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.

NBodySimulator - rigid-body gravity and ADCS harness

Stack: C90 · CMake · Extended Kalman Filter · IGRF · sun sensing · magnetorquers

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.
  1. SenseSun-sensing algorithm developed and tested in NBodySimulator.
  2. FuseEKF combines sun-sensor, magnetometer and IMU measurements.
  3. EnvironmentMy IGRF implementation models the magnetic field.
  4. ActuateMagnetorquer models support magnetic attitude-control studies.
JamSail 3U CubeSat ADCS simulation schematic An elongated 3U CubeSat with corner rails, three unit sections, and solar-panel cell grids, alongside sun sensing, IMU and IGRF inputs, EKF sensor fusion, and magnetorquer blocks. Illustrative layout, not an exact spacecraft CAD model. TRIAD is not part of the implemented estimator. JamSail 3U x z sun vector IMU B (IGRF) SUN SENSING sun-visible operation EKF SENSOR FUSION IMU · sun · mag MAGNETORQUER magnetic torque
Illustration · not simulation data

Current scope. An engineering simulation harness, not flight-qualified software. Solar-sail and accelerometer paths remain unfinished.

Student-team CubeSat projects

JamSail 3U CubeSat - AOCS/ADCS lead

NottSpace · Sep 2024 - Aug 2025

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.

Read the JamSail ADCS project paper (PDF). Dissertation/publication note.

IDeT-Sat - Systems engineer

Nottingham Space Society · Sep 2022 - Jul 2023

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.

Read the IDeT-Sat paper (PDF)

Nottingham Space Society CubeSat team with their spacecraft model
Nottingham Space Society CubeSat team · 2023.

Current UAV research and earlier Airbus GNC testing and simulation work are described separately. The personal ArvSimulator project above is not a claim that it was an Airbus project.

Interested in the details?

Explore the source repositories above, read about my research and engineering background, or get in touch to discuss estimation, simulation, and robotics.

Image preview

Open original