Robotics & AI Engineer
Humanoid, quadruped & mobile robotics Β· ROS 2 Β· NVIDIA Isaac Sim
Three robots. Three morphologies. One interface.
A deliberate series of projects testing whether a clean ROS 2 + Isaac Sim control
architecture transfers across robot types β wheeled (Jetbot), bipedal (Unitree H1),
and quadrupedal (Boston Dynamics Spot). Same external /cmd_vel + /odom
contract; different policies, different DOF counts, different motion capabilities.
A ROS 2 control stack for the Boston Dynamics Spot quadruped in NVIDIA Isaac Sim 5.1, built around NVIDIA's pre-trained flat-terrain walking policy. Spot autonomously navigates a configurable sequence of (x, y) goals using body-frame velocity control with full holonomic motion β linear.x, linear.y, and angular.z commanded simultaneously.
Third project in the architecture series. Unlike the H1 humanoid (forward-only kinematic), Spot's policy supports lateral strafe and reverse β so the waypoint controller projects the world-frame goal direction into the robot's body frame and commands all three velocities at once. No rotate-first state machine needed.
Representative navigation run. Path coloured by navigation state. Demonstrates closed-loop body-frame velocity control on /spot/odom feedback.
A ROS 2 control stack for the Unitree H1 humanoid in NVIDIA Isaac Sim 5.1, built around NVIDIA's pre-trained flat-terrain walking policy. The robot autonomously navigates a sequence of waypoints using a heading-first state machine (ROTATE β WALK β REACHED) wrapped around the policy's velocity interface.
Second project in the series. Same two-process architecture as the Spot and Jetbot projects;
external /cmd_vel + /odom contract identical. The interesting design
moment for this project was the OmniGraph bridge β see below.
Why OmniGraph for the bridge: Isaac Sim 5.1 ships Python 3.11; system
ROS 2 Jazzy is built for Python 3.12. The natural "import rclpy from a standalone script"
approach crashes inside Node.__init__ due to a C-extension ABI mismatch.
Solving this by moving all ROS pub/sub into OmniGraph keeps Python controllers in their
native environment and avoids fragile workarounds. This pattern was reused unchanged
for the Spot project.
Representative navigation run across a 2 m square. Path colour-coded by state (amber = rotating, blue = walking, green = reached).
First project in the series Β· differential drive Β· 3 completed phases
The wheeled robot project where the architecture started. Same two-process design,
same external /cmd_vel + /odom contract, applied to a Jetbot
with differential-drive kinematics. Built progressively across three phases β basic motion,
closed-loop waypoint navigation, and reactive obstacle avoidance with LiDAR β with a
deliberate modular refactor in between to support the perception layer cleanly.
The architectural decisions made here scaled directly to the H1 humanoid and Spot quadruped that followed. The Jetbot project remains the most thoroughly engineered of the three β clean module hierarchy, unit-testable pure functions, dedicated architecture document.
Phase 3 β 360Β° LiDAR + reactive obstacle avoidance combined with closed-loop waypoint navigation
Phase 2 β closed-loop waypoint navigation (left) Β· Phase 1 β basic motion control (right)
University of Hertfordshire Β· Jun 2024 β Sep 2024 Β· Real hardware
Developed a real-time ROS-based control pipeline for a physical 25-DOF Shadow Robot Hand, integrating sEMG-driven ML inference for gesture-based manipulation. Hand pose commands derived from forearm muscle electrical activity via a Myo armband, classified by trained ML models, and dispatched as joint targets to the real robot.
sEMG-driven gesture control of a physical Shadow Robot Hand (part 1 and part 2)
My long-term goal is to develop affordable, real-world robotics systems that can learn from their environment through observation and interaction.
I'm particularly interested in learning-driven robots that improve their behaviour over time using perception and feedback β with a focus on practical, everyday applications.
The aim is to reduce complexity and cost while enabling intelligent robotic systems that can operate effectively in real-world environments.