Skip to content

H1: bench and push-cart

What you build: a Raspberry Pi 5 with RTK GNSS and an IMU, strapped to a garden cart. You push it round your lawn and it records the boundary to a few centimetres. That boundary becomes the lawn file the mowing planner uses.

Time: two weekends. Cost: see hardware/bom.md, stage H1. Blade: none at this stage.

Tools: a laptop with Docker; a multimeter; small screwdrivers; cable ties; a tape measure; for step 6, a tripod or a fixed post.

Safety for this stage

  • Only the Pi's own USB-C supply or a USB power bank powers this stage: no lithium pack wiring yet.
  • Unplug the power before connecting or disconnecting anything (GNSS, IMU, antenna).
  • Mount the antenna where a falling cart can't drive the mast into someone; keep the cable away from wheels.

1. Put the Pi together (20 min)

Fit the active cooler, then the NVMe HAT and SSD. Don't power it yet.

2. Flash and boot (30 min)

Flash Ubuntu 24.04 server (arm64) to the SSD with Raspberry Pi Imager. Enable SSH and set a strong password in the imager. Boot it.

Checkpoint H1-A: the Pi

vcgencmd get_throttled returns 0x0 after 10 minutes idle, and the CPU temperature (vcgencmd measure_temp) stays below 70 °C. Fail: check the PSU (it must be the 27 W one) and the cooler's connector.

3. Install Docker and the robot's container (40 min)

Install Docker from Docker's own apt repository, clone the repository, and run make test. It's the same container image as the simulator, built for arm64: what passes on the laptop must pass here.

Checkpoint H1-B: same software

make test passes on the Pi with the same test count as on the laptop.

4. Connect the GNSS receiver (20 min)

Power off. Screw the antenna cable to the ZED-F9P board before powering it, then connect the board by USB. Power on and check that /dev/ttyACM0 (or similar) appears.

5. Configure corrections (30 min)

Set up the NTRIP client with your corrections source: a state CORS network or your own base station (BOM row 6/7). Never commit the caster password to the repository; it goes in a local .env file.

6. Static test (15 min + 10 min logging)

Put the antenna on a tripod or post with a clear view of the sky, away from walls and trees. Log 10 minutes.

Checkpoint H1-C: RTK fix

RTK FIXED within 5 minutes of a cold start; over 10 minutes, the horizontal scatter is within ±3 cm (95% of samples). Fail: check the antenna has a clear sky view and a ground plane, the corrections are arriving (NTRIP client log), and the antenna is multiband. Judge it with make gnss-static-report RUN_ID=h1-c BAG=<the bag>: the same script the simulator passes.

7. Connect the IMU (20 min)

Power off. Connect the BNO085 to the Pi's I²C pins with the STEMMA QT cable (3.3 V, never 5 V). Power on.

Checkpoint H1-D: IMU

i2cdetect -y 1 shows the IMU at 0x4A or 0x4B. Rotate the board 90° on a flat table: the heading changes by 90° ± 3°. Tilt it by about 20°: roll or pitch shows it, and the sign matches the robot's axis convention (x forward, y left, z up).

8. Mount everything on the cart (45 min)

Antenna at the highest point, on the cart's centreline, with its position measured from the axle (x, y, z in metres): those numbers go in the robot description, exactly like the sim robot's. IMU flat and fixed rigidly (a wobbling IMU reads the wobble). Pi and power bank in a box, out of the rain.

Checkpoint H1-E: mounting

Antenna and IMU offsets measured and written into the build record. The IMU reads level (roll and pitch within 2°) with the cart on flat ground.

9. Survey the lawn (30 min per lawn)

Walk the boundary slowly with RTK FIXED, then each flowerbed and tree as a keep-out. Record a bag.

Checkpoint H1-F: the survey

The boundary closes on itself within 5 cm. The polygon, drawn over a satellite image, matches the lawn edge. Commit it as the lawn file (GeoJSON, like config/lawns/sim-yard.geojson); the same planner as in the sim plans it.

Stage H1 done: record the checkpoint results in the build record; next is verification gate 1.