Paving the map forgot
The last post taught the robot to stop its blade before a garden path, as long as the path was on the map. If a path isn't drawn, or is drawn in the wrong place, the robot would mow straight over it. This post adds the second layer: the robot sees the paving for itself.
What paving looks like to a lidar
The lidar already measures grass height to decide whether the lawn is too long to mow. Grass is 4 to 10 cm of thin blades. Paving is flat. So the safety software looks at a strip of ground just ahead of the robot, split into 20 cm squares. A square gets flagged as bare when the lidar has hit it at least four times and none of those hits is more than 2.5 cm above the ground.
One flag isn't enough. The robot keeps a map of what it has seen, in 10 cm squares. A square counts as paving once it has been flagged three times and three of its neighbours have too, because paving is an area, not a speck. Then the blade rule from the last post treats the sensed paving exactly like mapped paving: slow down, stop, cross with the blade off, restart on the far side.
The test
The same 5 × 5 m patch with a paved path across it, but the robot gets a map with the path deleted. The coverage report still knows where the path really is, so it can tell whether the blade ever spun over it.

| Map only (last post) | Sensing only (path not mapped) | Both | |
|---|---|---|---|
| Blade spinning over the path | never | never | never |
| Closest a spinning blade came | 3.4 cm | 9.1 cm | 4.8 cm |
| Coverage of what it can reach | 96.3% | 92.8% | 94.6% |
Runs hard-4-ion, hard-14-unmapped and hard-17-mapped, Ion, measured from ground truth at 10 Hz. The run on plain grass with no paving (hard-15-grass) found no paving at all and took the same time as before.
Four things that went wrong first
The robot skipped half a stripe. This one had nothing to do with paving. Its route ran along one side of the patch, then turned round and came straight back 7.6 cm away. Running 4 cm off its line, the robot was as close to the return leg as to the leg it was on, so its idea of "how far along the route am I" jumped round the turn. It turned back 1.3 m early. Now it can't count itself round a sharp corner until it has actually reached it.
Grass looked like paving. The first sensing runs found 130 bare squares on plain grass. Every one was first seen 1.7 to 1.9 m ahead. That far out, the lidar's beams hit the lawn at a shallow angle and slip between the grass blades to the soil. Looking only 1.6 m ahead brought that to zero.
Then the blade reached the paving. With the shorter view, the robot came out of a turn 1.6 m from the path at full speed and confirmed the near edge only 0.67 m away. Too late: the blade spun over the paving 22 times in 10 Hz samples. The fix is to be careful before being sure: as soon as anything bare is in view, the robot slows to a crawl until it knows. It costs about 40 seconds on this patch, and nothing on plain grass.
Two layers stopped too early. With the map and the sensing both on, the robot stopped 10 cm short of the path instead of 3 cm, because the sensed edge lands about 5 cm past the real one. Next to a mapped path the map now wins: sensed paving within 6 cm of it is ignored. That still catches paving drawn more than 6 cm out of place, and within that, the 5 cm blade margin covers it.
What's not good yet
- 94.6% with both layers is just under our 95% bar. About one row in six, the sensed edge lands 15 cm out instead of 5. The 20 cm squares are too coarse to find an edge precisely. Smaller squares should fix it; that's on the list.
- It can't see paving right under its nose. The view starts 0.6 m ahead, so if a turn ends closer to the paving than that, only the map can stop the blade.
- It's still simulated paving. Flat paint on the simulated ground, not real gravel. Real gravel is lumpy, wet paving shines, and both will look different to the lidar, so this needs testing on real ground. Later, the camera can help tell paving, gravel and grass apart.
Next: drop-offs, the worst of the three ground hazards.