My toolbox

These are the tools I actually use. You can also play with seven interactive simulations right in the browser.

Technical skills

Hover a card to see what each tool is for

ROS 2

Robotics middleware. I use it to architect communication between sensors, planning and actuators through nodes, topics and services.

Python

My main language for prototyping, vision and control, with NumPy, OpenCV, PyTorch and rclpy.

KiCad

Open-source PCB design, from schematics to routing and DRC checks. Every board I build goes through it.

Autodesk Inventor

Parametric CAD. I model parts, assemblies and drawings before printing or machining.

Multi-material 3D printing

Multi-material additive manufacturing with soluble supports and mixed flexible/rigid parts. I go from model to working part in a day.

MoveIt 2

Motion planning under ROS 2, inverse kinematics and collision avoidance. I use it to drive and simulate manipulator arms.

YOLO

Real-time object detection. I train it on my own image sets for robotic vision.

FPGA

Reprogrammable logic in VHDL, for parallel processing too fast for a standard microcontroller.

PCB Design

Component selection, trace routing, signal and power constraints. My Illumine board was routed end to end.

CAD

3D modelling, tolerances and assemblies. It is the foundation of every mechanical project before manufacturing.

FEA

Finite element analysis in Abaqus or Inventor Nastran. I validate a part's strength and study mesh convergence before producing it.

C/C++

Real-time embedded programming on microcontrollers, when Python is too slow or too indirect.

Design

CAD, 3D modelling and structural optimisation

Prototyping

Multi-material 3D printing and rapid manufacturing

Development

Embedded code and robotics

The lab corner

I wrote seven physics and AI simulations for the pleasure of watching equations move. Pull the sliders and watch.

Opens in a new tab, more comfortable on a computer.

Fluid in a paraboloid

A liquid simulated in real time inside a parabolic glass. Stir it with the mouse and click to splash. In the panel, set the viscosity (from water to honey), gravity, colour and particle count.

Under the hood

About 900 particles run an SPH simulation (Smoothed Particle Hydrodynamics), using the “double density relaxation” scheme by Clavet et al. (2005). Each particle feels gravity and viscosity, applied as impulses between pairs. A density relaxation with a dual pressure term keeps the particles from clustering. A spatial hash grid speeds up the computation, and collisions are projected onto the wall y = kx². Rendering then turns the particles into a continuous surface. A Gaussian density field (metaballs) is thresholded in a GLSL shader, which computes normals, refraction, specular highlights and Fresnel directly on the GPU.

SPH
Metaballs
Three.js
GLSL
Real time
Launch the experiment

Closed-loop magnetic levitation

A steel ball held in mid-air by a feedback-controlled electromagnet. Tune Kp, Ki and Kd live, poke the ball, change its mass or add sensor noise, then watch the response curve. Depending on the settings, the system settles, oscillates or drops out.

Under the hood

The system is unstable in open loop, because the magnetic force F = C·(i/x)² grows as the ball gets closer. The simulation integrates m·ẍ = m·g − F at 480 Hz. It includes a first-order coil lag (L/R), current saturation, measurement noise and a filtered derivative. The PID controller works around the equilibrium current i_eq = x·√(mg/C), with integral-clamping anti-windup. The linearised analysis gives a stability condition (stable if and only if Kp > i_eq/x₀ and Kd > 0), which the presets let you check live.

PID
Electromagnetics
Feedback control
Canvas 2D
Real time
Launch the experiment

Rayleigh-Bénard convection

A fluid layer is heated from below and cooled from above. Watch it organise into cells, then turbulent plumes. Heat or cool locally with the mouse, change the viscosity and heating power, and follow the dust carried along by the flow.

Under the hood

Two coupled lattice-Boltzmann models share the same grid. D2Q9 handles the flow (BGK collision, no-slip top and bottom walls, periodic sides). D2Q5 handles temperature (advection-diffusion, fixed-temperature plates). The Boussinesq coupling injects a vertical buoyancy gβ·(T−T₀) into the collision equilibrium. Beyond the critical threshold, pure conduction becomes unstable and convection cells appear. Tracers are advected by bilinear interpolation of the velocity field.

Lattice-Boltzmann
Thermal
Multiphysics
Canvas 2D
Real time
Launch the experiment

Mass-spring cloth in the wind

A flag flaps in a turbulent wind. Grab it and pull on it (too hard and it tears). Set the wind strength and direction, gravity and stiffness, then orbit around the 3D scene.

Under the hood

The cloth is a grid of particles linked by distance constraints (warp, weft, shear). It is integrated with Verlet, then projected in the style of Position Based Dynamics. The wind applies to each triangle an aerodynamic force F = n·(n·v_rel)·|v_rel|·k, where v_rel accounts for the cloth velocity. The flapping of the flag emerges by itself from this coupling. A constraint stretched beyond the threshold breaks and the adjacent triangles disappear. The tear then propagates naturally. Rendering uses Three.js, with normals recomputed every frame.

Verlet
PBD
Aerodynamics
Three.js
Real time
Launch the experiment

Quarter-car suspension

One wheel, a spring, a damper and a quarter of a car body on a scrolling road. Tune stiffness and damping, switch road surface, throw in a pothole and read the verdict. Does the body filter the road? Also try the “dead damper” preset.

Under the hood

This is the classic quarter-car model with 2 degrees of freedom. The sprung mass (body) sits on a spring ks and a damper cs. The unsprung mass (wheel) sits on the tyre stiffness kt. The equations are written around static equilibrium and integrated semi-implicitly at 960 Hz, because the tyre is stiff. The road profile scrolls under the wheel at the chosen speed, with four kinds of profile: sinusoidal cobblestones, filtered value noise, Gaussian speed bumps and half-cosine potholes. Indicators are computed live: natural frequency f₀ = √(ks/ms)/2π, damping ratio ζ = cs/2√(ks·ms), and body-acceleration RMS as the comfort criterion.

Vehicle dynamics
2 DOF
Resonance
Canvas 2D
Real time
Launch the experiment

Chaotic double pendulum

Two linked bars are released together, along with a swarm of pale pendulums started a hair apart. Watch them stay merged, then diverge all at once. Grab the masses with the mouse, change lengths, masses and gravity, and slow down time.

Under the hood

The double pendulum follows its full Lagrangian equations, integrated with a fourth-order Runge-Kutta scheme at 480 Hz. With no friction the energy is conserved, which the readout checks live (near-zero drift). It is a nonlinear Hamiltonian system, deterministic yet chaotic. About fifteen copies start less than a thousandth of a radian apart, and the gap between them grows exponentially. This is the mark of a positive Lyapunov exponent. The bottom graph plots that gap on a logarithmic scale. It forms a rising straight line until the chaos has decorrelated everything.

Chaos
Lagrangian
Runge-Kutta 4
Canvas 2D
Real time
Launch the experiment

Metronomes that synchronize

Five metronomes are started at random rates on one board resting on rollers. Without touching anything, they end up ticking together. Lock the board and they become independent again. Detune them and the synchronization breaks.

Under the hood

Each metronome is a pendulum kept going by an escapement, modelled Pantaleone-style with a Van der Pol term that sets the tick amplitude. The only coupling runs through the moving board. When one arm pushes one way, the board recoils and drags all the others along. The N arms and the board form one system of equations solved explicitly, then integrated with Runge-Kutta 4 at 480 Hz. From arbitrary phases, the whole set converges to a common beat. The Kuramoto order parameter r measures this convergence, from 0 (disorder) to 1 (synchronization), and is plotted live.

Synchronization
Coupled oscillators
Van der Pol
Kuramoto
Canvas 2D
Launch the experiment