← all posts

Hyperscooter, day five: a front suspension that doesn't give up at the end of travel

Day five of the Hyperscooter. We haven't written about the scooter itself yet — only about its DC-DC. So first, briefly: what this machine is and how we design it. Then the story of one chart: how a curve on our test rig told us the front suspension gives up at the end of travel, and how five attempts later we arrived at a rocker whose rate keeps rising all the way to the stop.

What the Hyperscooter is

An electric scooter for off-road riding and jumps that we are designing from scratch. There are almost no off-the-shelf assemblies in it: our own frame, our own suspension, our own controllers and electronics.

  • Frame — a load-bearing tub of 4130 steel, battery inside on vibration mounts.
  • Suspension — 230 mm of travel at both wheels. A four-bar with a rocker up front, a single-sided swingarm with a rocker at the rear. Shocks — Fox DHX2 230 × 65 mm.
  • Drive — two Lonnyo hub motors, 8 kW each, VESC-based controllers.
  • Battery — 24S12P of Molicel P60C cells.

The frame's design case is a repeated 2 m drop to flat. Water rating — IPX9K and IPX7 for everything, motors included.

3D model of the scooter: red front suspension with rocker and shock, orange tub frame, rear swingarm
The whole layout: tub frame, four-bar up front, swingarm at the rear
The same scooter from the side: wheelbase, deck height, handlebar
Side view: suspension at static, 30 % sag

How we design it

Everything that can be calculated is calculated by code, not drawn by hand. Move a pivot — and the curves, the model, the simulator and the pictures all update.

  • Kinematics — in Python: an optimizer picks pivot points for targets on wheel path and leverage.
  • CAD — in CadQuery: parts are built from the same points. A check runs the full travel and ±40° of steering lock and looks for collisions.
  • Simulator — a planar model of the scooter with a rider, in Python: drops, ledges, bumps, braking.
  • Test rig — the same model ported to Godot: a 3D replay slowed down to ×0.01, with charts. The rig and the Python reference agree to thousandths of a percent.

That rig is where it all started.

A strange chart

The rig has a "progression" chart: spring rate referred to the wheel, as a percentage of static. It shows how the suspension stiffens as it compresses. We were looking at a 0.5 m drop at 20 km/h. The rear rose smoothly to ~155 %, while the front behaved oddly: up, down, and up again.


The Godot test rig: the scooter after a drop, progression chart below — the blue front curve dips between two peaks, the orange rear curve is smooth
The old rocker: the front dips between two peaks, the rear is a smooth curve

The first thought was a calculation error. The rig computes wheel rate through the second derivative of shock length over travel, and that is easy to spoil numerically.

Kinematics, not arithmetic

We recomputed the same quantity in Python over the full travel — both from the rig's spline and from raw kinematics without a spline. The curves matched, and the dip stayed.


Spring rate at the wheel over travel: the rear rises to 162 %, the front reaches 172 % at 189 mm and collapses towards the end of travel
The old rocker: after 189 mm the front loses rate, the rear keeps rising

It's the leverage. With the old rocker, the "wheel travel / shaft travel" ratio fell from 4.19 to a minimum of 3.03 at 213 mm and then rose again. Wheel rate is made of two parts: spring rate times leverage squared, plus spring force times the rate of change of leverage. When the leverage turns back, the second part flips sign — and spring force near the end of travel is about 10 kN. That is what pulls the rate down: from 172 % of static at 189 mm to 137 % at 216 mm.

A condition instead of points

We didn't touch the four-bar: wheel path, trail and anti-dive were already tuned. We re-optimized only the rocker — its pivot, arms, the link and the shock's upper eye. To the existing targets we added one condition: wheel rate must not fall anywhere in the travel.

Five attempts

The very first candidate gave a smooth curve. But a curve isn't a part yet, and that's where the collisions started.

Each collision became a new optimizer condition: clearance from the link and rocker plates to the arch, to the fork axles, to the crown housings, to the link arm roots. We checked every condition against CAD first: on the old geometry, the measure had to show contact exactly where CAD sees it.


Close-up of the 3D model: the blue link passes through the grey fork pivot axle, the green rocker next to it
Candidate 2 at 204 mm of travel: the link goes right through the fork pivot axle

Rocker v3

Fifth attempt. Rocker arms of 98 and 49 mm, a 166 mm link, and the rocker turns through 83° over the full travel.

0 mm — fully extended
0 mm — fully extended
115 mm — mid-travel
115 mm — mid-travel
230 mm — fully compressed
230 mm — fully compressed

Leverage now falls over the whole travel — from 4.49 to 2.69, 40 % progression instead of the former 26 %. Wheel rate climbs from 69 % of static at the top of the travel to 259 % at the stop.


Two charts: on the left, leverage over travel for v1, v2, v3 — v1 turns back near the end; on the right, wheel rate — v1 collapses after 190 mm, v2 and v3 rise to the end
Three rockers: v1 — the old one, v2 — the first candidate we looked at in 3D, v3 — the final one

On the rig the same drop now looks like this: one smooth peak at the front, no dips.


The Godot test rig with rocker v3: the same drop, the blue front curve rises in one smooth peak
Rocker v3 on the rig: same drop, same moment

What it gives

We ran every simulator scenario with the old and the new rocker. The spring was chosen so that static sag stays the same.

On medium hits the shock force drops by 12–34 %, and the 1 m ledge no longer bottoms out. Small stuff is unchanged. The 2 m drop still bottoms out — that's a job for the damper, not the geometry.

Front and rear as a pair

Front and rear are built differently: a four-bar with a rocker up front, a swingarm with a rocker at the rear. Yet on a 1 m drop their travel almost mirrors each other: 224.1 mm peak at the front, 223.2 mm at the rear, and over the hit the curves differ by 8 mm on average.


Front and rear wheel travel over time after touchdown on a 1 m drop: the blue and orange curves almost coincide, both reach 224 mm and settle
1 m drop, rocker v3: front and rear travel follow almost one curve

This isn't luck, and it isn't v3's doing. We tuned both ends to the same average leverage, around 3.6, and the same sag, so the old rocker behaved as a pair too. What matters is that v3 kept the pair intact, even though the front now stiffens more than the rear towards the stop.

What's left

  • Calculate forces in the link and rocker pivots over the full travel, and bushing margins — especially at the end of travel.
  • Check a 1175 lb/in spring for coil fit: length for the DHX2, travel to coil bind, inner diameter.
  • Raise the rear progression: right now the front stiffens almost twice as much towards the stop.
  • All of this is a model. Measurements will come when we build the front suspension.

Your own hardware — from calculation to bench
Start with the brief: four questions and an honest answer on whether we are a good fit.
Take the brief