Skip to content

Why Vector wandered: friction with no favourite

Last time, Vector was the one platform still failing its smoke test. It ran 16 to 18 cm off its path (the limit is 15), and its heading estimate was off by about 3° (the limit is 2°). We blamed its filter. The filter was fine: the simulated tyres weren't.

The clue: it never turned about its middle

A skid-steer like Vector turns in place by running its left wheels forward and its right wheels back. It should spin about the middle of its wheelbase, which is where its centre is in the plan. So we measured how far its centre actually moved during every turn in place of more than 20° (scripts/pivot_probe.py):

Platform Centre moved per turn in place (median) Worst
Ion (2 wheels + caster) 0.6 cm 2.8 cm
Tachyon (2 wheels + 2 casters) 1.0 cm 3.8 cm
Graviton (tracks, 3 road wheels a side) 3.2 cm 7.4 cm
Vector (4 wheels, 2 axles) 20 cm 29 cm

From the smoke-9 runs, ground truth.

Vector wasn't spinning about its middle. It spun about whichever axle happened to grip, and could change its mind part-way through a turn. The axles are 48 cm apart, so turning about one of them throws the centre sideways by up to 24 cm per turn. Every stripe end began with the robot well off its line, and every RTK fix that pulled the estimate back also bent the heading.

Why: plain friction has no favourite

The simulator models each tyre's grip as plain friction: it resists sliding with the same force at any sliding speed. Now picture Vector turning in place. The tyres on whichever axle is further from the turning point slide sideways faster. But with two axles, the two sliding speeds always add up to the same total, wherever between the axles the turning point is:

  • about the middle, each axle slides at 24 cm per radian of turn: 24 + 24 = 48;
  • about the front axle, the front doesn't slide and the rear slides at 48: 0 + 48 = 48.

Same sliding, same force, same energy lost: the simulator had no reason to prefer the middle, so any small nudge moved the turning point. With three wheels a side, Graviton's middle road wheel breaks the tie (about the middle: r + 0 + r; about the front: 0 + r + 2r), which is why it only wandered 3 cm.

A real tyre isn't like that. Its sideways grip builds up with how fast it slips sideways, so sliding twice as fast on one axle costs more than sliding at half speed on both. That makes the middle the one cheapest turning point, which is why real skid-steer robots turn about their middle.

The fix: give the tyres side-slip

Gazebo has a model for exactly this: tyre slip compliance, where sideways force grows with sideways slip. Vector's four wheels now have it (WheelSlip, lateral compliance 1.0). Two things then needed re-tuning:

  • Turns fell a third short. Tyres that give sideways resist turning more, so the same wheel speeds turned Vector only 0.67 as fast as its odometry expected. Its scrub factor (how much wider the wheels act than they are, when turning) went from 1.4 to 2.1. The turn calibration is back to 1.01. Field studies of skid-steer robots report factors of 1.5 to 2.5, so 2.1 is believable.
  • Docking. At docking speed (0.15 m/s), a skid-steer with real tyre side-slip barely turns while rolling: told to turn at 0.07 rad/s, it turned at 0.005. When its last turn in place onto the dock line finished 6° off, it couldn't steer that out. It reached the contacts 4 cm to one side three times running and gave up. The final line-up now finishes within 2.3° instead of 5.7°, for every platform.

Vector's longer path-following lookahead (0.9 m, set last time to stop a weave) wasn't needed any more: the weave was the old friction too. It's back to Ion's 0.5 m. Two small steering fixes from the hunt stayed, for every robot: the aim point never gets closer than 25 cm, even just before a corner, and the start of a path counts as a corner (a leg that starts more than 17° off begins with a turn in place).

We first gave the tracks side-slip too, and Graviton started wobbling along its stripes (it covered 95.3% instead of 99.2%). Tracks didn't need it, so they don't get it. A test now checks that only two-axle skid-steer has it.

Vector, before and after

Vector run Centre moved per turn in place (median) Worst path error Heading error (global) Docked
smoke-9 (plain friction) 20.3 cm 17.9 cm 3.07° first try
smoke-15 (side-slip, scrub 1.4) 5.9 cm 26.5 cm 1.27° no: turns 33% short
smoke-19 (scrub 2.1, lookahead 0.5) 5.9 cm 10.5 cm 1.72° first try
smoke-20 (same) 6.6 cm 10.4 cm 1.33° no: 4 cm off, 3 times
smoke-21 (dock line-up 2.3°) 6.3 cm 10.0 cm 1.66° second try, 1.6 cm and 3° off

The smoke tests now

Robot smoke-9 smoke-22 Worst path error Heading error (global) Docked (try, position, heading)
Ion PASS PASS 8.5 cm 1.06° 1st, 1.0 cm, −0.4°
Quark PASS PASS 9.1 cm 1.22° 1st, 0.1 cm, −1.3°
Photon PASS PASS 9.3 cm 1.17° 2nd, 0.9 cm, +1.0°
Vector FAIL: 17.9 cm off PASS 11.1 cm 1.58° 2nd, 2.1 cm, −3.2°
Graviton PASS PASS 5.4 cm 1.22° 1st, 0.5 cm, −1.5°
Tachyon PASS PASS 8.9 cm 1.13° 1st, 0.9 cm, +1.3°

All six platforms pass: they undock, mow the patch and dock again. Vector and Photon each needed a second go at the dock, which the mission allows (three tries). Vector's took the second try in both of its last two runs, so its docking is the weakest part left. The Platforms page battle cards show these results.

What this doesn't prove

The side-slip setting is a modelling choice, not a measurement: the right value depends on the tyres and the grass. It's the difference between a simulator that can't pick a turning point and one that turns about the middle, as real skid-steers do. The scrub factor (2.1) and the docking line-up will need checking on a real Vector. A real skid-steer at walking pace also needs a firm push to turn at all, and the simulator now shows that too. Docking is where that matters most, so it's the first thing to watch on real hardware.