Skip to content

Seven decisions, and the cheapest hedgehog protection there is

We reviewed the Phase 5 (perception) plan together and made all seven decisions in it. Then we built the first piece, which needs no camera and no AI: the robot doesn't mow in the dark.

The decisions

# Question Decided
D1 Can the AI overrule the lidar? No. Chris: "the lidar is and should be treated as always 'more confidently true' than an AI interpretation of data." The lidar wins on is something there; the AI may only add caution; a degraded lidar is a fault, never the camera's turn
D2 Low animals in long grass The robot won't mow grass taller than ~8 cm by default (so the lidar can still tell a hedgehog from the lawn). An app switch overrides it, for one mow only
D3 Detector licence Apache-2.0 for now; the detector is a plug-in, so anyone can swap in another model later without re-licensing the rest
D4 Camera privacy Images never leave the robot; recordings exclude the camera (a test enforces it, today); everything beyond the lawn boundary is masked
D5 People and pets Full stop and wait, not "blade off and carry on". Chris: "better not even bump into anyone." Dog mess: tell the owner, with an app option to avoid the spot until it's cleaned up
D6 When is it good enough to mow unattended? Not decided yet, on purpose: no numbers until there's a baseline from real images
D7 Order Deterministic work first (night rule, grass, lidar health, moving people), the camera after

A pattern emerged: every setting defaults to the safer choice. Loosening one is app-only (never the buttons), needs a confirmation, and expires on its own.

The night rule

Hedgehogs, toads and foxes come out at dusk, which is when robot mowers hurt them. So: no mowing from 30 minutes before sunset to 30 minutes after sunrise, computed from the robot's own GNSS position and the date with the NOAA solar equations. No internet, no time-zone database, no override.

The unit tests check it against published sunrise and sunset tables (Philadelphia in June and December, Greenwich, and Tromsø's midnight sun and polar night). One test is there because of a trap: at a western longitude a summer evening is already tomorrow in UTC, so asking "when is sunrise on today's UTC date?" at 19:30 local returns tomorrow's sunrise and refuses to mow in broad daylight. The first version of that test passed even with the bug in place, because it checked a moment that was night under either reading. So the test was rewritten, and then checked by putting the bug back in and watching it fail.

The simulator's clock starts at zero, so each run says what UTC time sim time zero is (default: 10:00 local, midsummer). Two runs, judged by a report that recomputes "is mowing allowed?" for every blade command in the bag, independently of the mission's own bookkeeping:

Run Scenario Result
night-dusk-2 Mowing at 19:57 local; the cutoff is 20:02:18 Rule switched at 20:02:18, sent home 1 s later, docked 26 s later, stayed on the dock. Blade on after the cutoff: 0.9 s
night-dawn-1 On the dock at 05:57; mowing allowed from 06:01:25 Waited, then started at 06:01:26; finished the patch (97.3% coverage)

One bug on the way: the first dusk run never started. Launch arguments are YAML, and YAML reads 2026-06-21T23:57:00Z as a date object, which ROS parameters refuse. It's the same family as the bug from Phase 1, where 60 was read as an integer. The value is now forced to a string, and the quirk is written down.

Next: real grass in the simulator. The lawn has been a flat plane all along, and a flat lawn flatters the lidar.