Project Mow — RT‑72 build log

Teaching a commercial zero-turn to mow itself.

The Rogue Tensor 72″ is our autonomous mowing platform — a Bad Boy Rogue 72″ with the Kawasaki FX1000V EFI, retrofitted into a mower that learns a property, maps its keep-outs, and quietly takes the Saturday-morning chore off the calendar. This page is the running log of every decision that got us here.

Bad Boy Rogue 72" — three-quarter view showing the deck and the 'Rogue' badge
72″
Cutting deck
999cc
Kawasaki FX1000V
RTK
cm-grade GPS
3
cameras
ROS 2
on Jetson
01

Why the Bad Boy Rogue 72″ EFI

Before any code or sensors, we needed a chassis we could trust to take the abuse of being controlled by a computer for hours at a time. Here's how we landed on the Bad Boy Rogue.

Zero-turn, by necessity

A zero-turn radius (ZTR) mower controls each rear wheel independently with a hydrostatic transmission. From a controls standpoint, that's a gift — the platform is already a differential drive, which is the same kinematic model nearly every wheeled robot uses. We don't have to fight an Ackermann steering geometry or simulate a virtual rear wheel. Forward kinematics and odometry slot right in.

The Kawasaki FX1000V EFI

The Rogue 72″ ships with Kawasaki's FX1000V EFI — a 999 cc, 90° air-cooled V-twin rated by Kawasaki at 38.5 hp at 3,600 RPM and 57.8 lb-ft of peak torque at 3,200 RPM. It's a commercial engine in a commercial deck, and the EFI side of it matters to us for reasons that all get worse the moment a human isn't standing on the platform:

  • Cold starts without a choke. A carbureted engine wants a warm-up ritual. Autonomous operation means the mower might fire up at 6 AM in a heavy dew — the FX1000V's sequential multi-port injection just runs.
  • Electronic altitude compensation. Kawasaki's ECU adjusts the mixture for ambient conditions automatically. Carbs need to be re-jetted; the EFI doesn't care whether we're at 600 ft or 6,000 ft.
  • Power that tracks load. Kawasaki advertises that the integrated electronic throttle "matches blade speed and power to load and terrain." In practice that means steadier RPM through thick grass — steadier RPM is steadier blade tip speed, which is a cleaner, more even cut.

The Rogue, specifically

Bad Boy's commercial line is the Rogue, and the spec sheet shows it. The 72″ deck is 3-gauge fabricated with a 1/4″ top, reinforced 3/8″ sides, and a 1/2″ leading edge — meaningfully heavier-built than a stamped residential deck, which matters when the thing driving it is a state machine and not a person reading the terrain ahead. Underneath, dual 16 cc Hydro-Gear pumps drive 18 ci Parker wheel motors — commercial drivetrain components, not the integrated transaxles you find on consumer ZTRs. Top ground speed is 13 mph; curb weight is 1,595 lb.

The frame uses cast I-beam rails and a 3-link rear trailing-arm suspension with independent fronts (Bad Boy's "EZ-Ride"). The suspension matters more than it sounds: a rigid frame transmits every bump straight into the camera mounts, the IMU, and the GPS antenna. Compliance in the chassis means cleaner sensor data.

Where we bought it

For the record: we paid full retail. Bad Boy isn't a sponsor, Kawasaki isn't a sponsor, nobody is — this is a self-funded project and every part on the mower came out of our own pocket. We picked it up from Springfield Mow in Springfield, Missouri, and the experience was genuinely excellent: straight answers on what the Rogue does well, what the trade-offs are, and zero pressure to upsell into something we didn't need. If you're in southwest Missouri and shopping for a commercial ZTR, they're worth the drive.

Top-down view of the engine bay — Kawasaki FX1000V V-twin, Hydro-Gear pumps, and drive belts
02

Actuators vs. servos — and why duty cycle won the argument

Two lap bars, two pedals, one PTO clutch. Picking how to move them was the single biggest rabbit hole of the build.

The temptation: hobby servos

The first instinct — and the one a lot of DIY mower builds reach for — is a pair of large hobby servos. They're fast, they're precise, and the firmware to drive one is a single PWM line. We seriously considered them. The problem is that mowing a long row holds the lap bars at near-full deflection for minutes at a time, and hobby servos are spec'd for movement, not for parking against a continuous load. Hold a hobby servo at stall against a return spring for a 4-hour mow and you cook the windings. That's a duty-cycle problem, and duty cycle is the lens we're using to pick everything that moves on this build.

What "100% duty cycle" actually means

Duty cycle is how much of any given hour the actuator is allowed to be moving or holding force without overheating. A consumer-grade linear actuator — the kind that lifts a TV out of a cabinet — is typically rated around 25% duty: one minute on, three minutes off. That's fine for a TV. It is catastrophic for something that has to run a lap bar through hundreds of position corrections per minute for hours at a stretch.

A 100% duty cycle rating means the manufacturer says you can drive it continuously, indefinitely, without thermal de-rating — achieved through some combination of bigger motors, better thermal paths, and built-in temperature monitoring. That's the rating class the lap-bar actuators on this mower need to live in.

Class
Continuous use?
Why it matters here
Hobby servo
No
Cooks windings under a held load
Consumer linear actuator
~25% duty
Thermals fail under continuous correction
Industrial 100%-duty actuator
Yes
What we need for the lap bars

Where we are on the picking

We're currently evaluating the 100%-duty offerings from Progressive Automations. They publish honest duty-cycle numbers, the lineup runs from very small to industrial-class, and they offer variants with built-in position feedback — which we want, because closing a position loop in firmware is the difference between "actuator at neutral" being a hopeful command and a checkable fact. We haven't locked a model yet; this section will get updated with the part number, stroke, and force rating once it's bolted on.

The PTO clutch is its own animal

Engaging the blades is a single 12 V solenoid clutch — binary on/off, switched by a logic-level MOSFET behind a flyback diode. We kept this dirt simple on purpose: when the safety system says "blades off," there's exactly one wire to interrupt.

03

What we learned about cameras

Sun. Dust. Vibration. Bumps. The yard tries very hard to make a camera lie to you.

Global shutter, always

Rolling-shutter sensors give you "jelly cam" the moment the chassis hits a tree root. Every line is exposed at a slightly different time, so straight fence posts come out curved. You can maybe dewarp it in software; you absolutely cannot trust the geometry for SLAM or obstacle distance. We pay the global-shutter premium.

Dynamic range matters more than megapixels

A 12 MP sensor staring at a deep shadow next to a sunlit driveway just clips everything. A 2 MP sensor with proper HDR / wide-dynamic-range modes (think IMX462 class) reads both ends of the histogram. We'd rather have a clear 2 MP image than a useless 12 MP one.

Stereo is great until the lenses get dirty

Stereo depth assumes both lenses see the same world. Pollen on one lens and not the other and your disparity map turns into modern art. We baked in two mitigations: hydrophobic lens coatings, and a confidence threshold that throws out points whose left/right matches don't agree.

Wide field of view, low distortion

A 120° horizontal FOV gets us peripheral awareness without going full fisheye. Past ~140° the edge pixels carry so little angular resolution that we'd rather just add a third camera.

USB 3.0 over GigE, for now

GigE Vision is the "right" answer industrially — deterministic, long cable runs, PoE. But for a single-vehicle build with the compute mounted three feet from the cameras, USB 3.0 is half the cost and half the configuration. We can revisit when we want PoE-powered cameras on the deck corners.

Vibration kills mounts, not sensors

The CMOS itself shrugs off mower vibration. The thing that fails is the lens locking ring backing off and slowly defocusing the image over a 40-hour mow. Loctite and a witness mark on every lens. Boring, essential.

camera-rig.jpg The forward-facing stereo bar mounted to the ROPS

Hardware on this build

Not sponsors. Not partners. We bought their gear at retail — this is just credit where credit's due.

04

Raspberry Pi vs. Jetson

Early plans had a Raspberry Pi 5 doing the whole job. Once we wrote down the perception loop we actually wanted, the math stopped working.

Raspberry Pi 5

Considered
  • Massive community, every accessory you can imagine
  • Low power draw — easy to keep cool
  • No real GPU. CPU inference of even a small detector is single-digit FPS
  • Limited camera bandwidth via CSI when running multiple streams
  • No CUDA — locks us out of the easy ML ecosystem

Jetson Orin Nano

Picked
  • 1024 CUDA cores + 32 tensor cores — real-time vision
  • 40 TOPS — room for bigger perception models
  • JetPack ships with CUDA, cuDNN, TensorRT, ROS 2 builds
  • 256 GB NVMe SSD on board — plenty of room for maps, models, and session logs
  • Hotter and hungrier — serious thermal planning required

How we decided

The deciding factor was the perception loop. Once you commit to running stereo depth, obstacle classification, and grass-vs-not-grass segmentation against multiple camera streams in parallel, you've left the Pi's comfort zone. CPU-only inference of even a small detector model is single-digit FPS on a Pi 5; an add-on AI accelerator helps, but you're still working around limited camera bandwidth and a software stack that wasn't built for it. The Jetson Orin Nano is built for exactly that workload — CUDA, TensorRT, MIPI CSI-2, the whole pipeline.

Our Jetson is shipping now with a 256 GB NVMe SSD, so we get fast model loads and plenty of headroom for cached map tiles, recorded sessions, and on-device datasets without juggling SD cards. Once it's in hand we'll write up the actual perception framerates we measure, side by side, and replace this paragraph with real numbers.

compute-stack.jpg Jetson + Pi + power distro inside the enclosure
05

Picking a LiDAR

We're going off-the-shelf — we just haven't locked in which off-the-shelf yet. Here's the shape of the decision.

What the LiDAR actually has to do

The job isn't mapping. The job is "what's in front of me that wasn't there yesterday." A toy in the yard. A hose. A sleeping cat. We already know the boundary from the teaching pass, and we expect the ground to be roughly planar, so the sensor's job is obstacle detection inside the volume immediately ahead of the mower — not 200 m range, not centimeter-grade accuracy. The bar is "never run over the cat."

The classes we're considering

  • 2D spinning (RPLidar-class): Cheap, well-supported in ROS, easy to integrate. The catch is a single horizontal scan line — a dog at 50 cm looks identical to a fencepost. Probably enough to stop for an obstacle, not enough to characterize it.
  • Multi-line spinning (Slamtec Mapper / RPLidar A3 with tilt, Hokuyo multi-line): A handful of stacked beams gets us closer to a real 3D occupancy grid for not much more money. The bandwidth and integration are still ROS-friendly.
  • Solid-state automotive (Livox Mid-360, Unitree L1): Real 3D point clouds, no moving parts to wear out, the kind of data robotics papers use. More expensive, and the non-repetitive scan patterns take some work to integrate cleanly, but they're firmly in reach for a serious DIY build.
  • Premium spinning 3D (Velodyne / Ouster): Beautiful data. Wrong order of magnitude on price for a residential mower. Off the table.

How we'll decide

The honest answer is "once the cameras and Jetson are integrated." Stereo depth from the cameras might cover more of the obstacle-avoidance load than we initially expected, in which case a 2D spinning unit is plenty as a backup. If stereo struggles — sun glare, dappled shade through trees, low-contrast grass-on-grass targets — we'll move up to a Livox-class solid-state unit. We'd rather decide with real perception data than guess from a spec sheet.

Sensor fusion plan

Whatever LiDAR we pick will feed an occupancy grid at the planner level. Stereo cameras feed the same grid. Disagreements are voted on by the safety supervisor: if either sensor says "stop," we stop. Ugly redundancy and we love it.

06

RTK — the centimeter that changes everything

A standard GPS fix is good to maybe three meters. A mower wandering by three meters eats the flowerbed. RTK gets us to two centimeters — but the question was whether to build our own base station or piggy-back on Missouri's free network.

What RTK actually is

A normal GPS receiver computes its position from the timing of satellite signals, and the atmosphere mangles those timings just enough to put you a few meters off. Real-Time Kinematic (RTK) cancels that error by comparing your rover's measurements against a second receiver — the base — sitting at a precisely surveyed point. The base broadcasts the local error correction over a stream called NTRIP, and your rover applies it in real time. Two receivers, one stream, and you're suddenly accurate to about 1–2 cm.

Option A: build our own base

The DIY route uses a multi-band receiver like the u-blox ZED-F9P with a survey-grade helical antenna mounted on a tripod or rooftop monument. You let it average a position for 24 hours (longer is better), feed the result back as the base's "known" location, and run an NTRIP caster on a Raspberry Pi to broadcast corrections.

  • Hardware: ~$700 for a ZED-F9P board, ~$300 for a decent antenna, ~$80 for a Pi caster, plus mounting and weatherproofing.
  • Pros: Works without cellular. No baseline-distance penalty — the base is right there. Total control.
  • Cons: Up-front cost. Needs a clear sky-view spot with mains power and reliable network. The base location only gets repeatably accurate, not absolutely accurate, unless you tie it to a CORS station — which loops us right back to the public network.

Option B: free MoDOT corrections

Missouri runs MoDOT GNSS, a public Continuously Operating Reference Station network covering the whole state. Anyone can register for a free NTRIP account and pull corrections from the nearest reference station — or, better, from a Virtual Reference Station the network synthesizes near your rover. The state maintains the monuments, surveys the antennas, and runs the casters. It's a public good and it's outstanding.

  • Cost: $0. Free account, free corrections, free forever.
  • Coverage: Reference stations every 50–70 km across Missouri. Most properties are within 20 km of one — well inside the "fast fix, tight accuracy" envelope.
  • Catch: The rover needs internet to pull the stream. No cell, no corrections, no RTK fix.

What we actually do

We use MoDOT as the primary source. A 4G modem on the mower pulls a VRS stream over NTRIP and feeds it into the ZED-F9P's correction port; first fix typically resolves in under 30 seconds at the start of a mow. When we lose cell signal — back of the property, behind the tree line — the receiver falls back to RTK Float and the mower auto-pauses until Fixed is restored. The mission-control UI surfaces this with a yellow GPS pill in the header so you always know which mode you're in.

And we still want our own base

MoDOT is excellent, but a private base is a great belt-and-suspenders: it works during cell outages, and during the brief windows when the public caster goes down for maintenance. We're prototyping a Pi-based caster on the workshop roof now. If/when it's reliable, the rover will prefer the local base and silently fall back to MoDOT.

07

The software stack

A phone-first mission-control web app on top, ROS 2 in the middle, a safety MCU at the bottom. Each layer has exactly one job.

UI

Mission control PWA

A single-page web app you install to your phone like a native app. Boundary teaching ("walk the perimeter, I'll record"), keep-out drawing, mow start/pause/stop, live telemetry, session history, return-home. Works offline once map tiles are cached. Built so the mower itself is the server — you connect to its WiFi and you're in.

Brain

ROS 2 perception & planning

On the Jetson: stereo + LiDAR fusion into an occupancy grid, RTK-GPS into the EKF, nav2 for local planning, Fields2Cover for coverage path generation across the boundary polygon. State-machine over the top so "mowing," "transit," "RTK degraded — pause," and "return home" are explicit, observable modes — not flags.

Reflex

Safety MCU firmware

A Teensy 4.1 sits between the brain and the actuators. It does three things and nothing else: closes the actuator position loop at 1 kHz, runs a 500 ms watchdog (no command => lap bars to neutral, blades off), and listens for the physical e-stop. If the Jetson kernel panics, the MCU doesn't care — it just keeps running the watchdog.

What it does, day to day

01

Teach a property once

Walk the boundary with the phone. The mower records every step as RTK fixes and simplifies the trace into a polygon. Add keep-outs the same way.

02

Plan a coverage pattern

Fields2Cover generates an efficient mow with proper headland turns. The user picks stripe direction; the planner does the rest.

03

Mow with live awareness

Perception runs on every camera frame. New obstacle? Stop, classify, route around if possible, alert the user if not.

04

Degrade gracefully

RTK drops to Float? Pause and wait. Camera goes blind? Reduce speed and lean on LiDAR. Connection drops? Lap bars to neutral, immediately.

05

Come home

Explicit "return home" command from the UI, or automatic at end-of-mow. Follows a recorded home path so it never improvises a route through the gate.

06

Log everything

Every session writes a JSON log: path, fuel burn, RTK quality history, obstacle events. We mine these to figure out what to fix next.

ui-screenshot.jpg Phone screenshot of the live mow screen
08

What's next

  1. Pick the LiDAR. Once stereo perception is running on the Jetson, decide whether a 2D spinning unit is enough as a safety backup or we need a solid-state 3D sensor.
  2. Real-world boundary teaching. Currently tested in the front yard. Next: the back acreage, where multipath GPS errors get interesting.
  3. Acoustic anomaly detection. Microphone on the deck, listening for the characteristic tink of metal on a sprinkler head. Stop instantly when it hears one.
  4. Solar-shed dock. Park, refuel-by-hand, charge electronics, weather out of the rain. A real dock is a long way off; a smart shed is closer.