Skip to content

Too steep

The second ground hazard after drop-offs: a slope too steep to drive up, or to drive across without sliding. This post gives the robot a slope limit, two ways to see a steep bank coming, and a backstop for when it doesn't.

How steep is too steep?

The limit comes from the robot itself, not from a number typed into the code. Ion is modelled on a YardForce Classic 500, which the maker rates for slopes up to 30% (16.7°). Ion's own limit is 15°, a little inside that.

Driving across a slope is different. A low mower like this won't tip over until about 55°, but on wet grass its tyres start to slide sideways at about 19°. So the sideways limit is a bit lower: 90% of the climb limit, 13.5° for Ion. From 80% of either limit the robot slows down.

Those numbers are defaults for Chris to check on the real lawn. The first two guesses were too strict, as it turned out (more below).

A plateau with a steep side

The simulated yard got a new patch: a 20 cm plateau with a bank on its west side. The south half of the bank is a gentle 7°, the north half a steep 20°, and the plateau's south side ends in a wall.

The map layer. On the correct map, the steep half of the bank is marked as a keep-out, and the robot keeps the same extra margin from it as from a raised flowerbed. It mowed 97.7% of the patch it could reach and finished normally. It never tilted more than 7° and never came closer than 35 cm to the wall's edge.

The sensing layer is for a map that doesn't know about the bank. The robot has three checks:

  • Up or down, ahead. It fits a line to the ground 0.5 to 2 m past its nose and adds its own pitch. A run of ground only counts if it's a clean line, so a box or a flowerbed isn't mistaken for a ramp.
  • Sideways, ahead. It measures the ground under where each wheel is about to go, and the difference between the two sides over a metre, plus its own roll.
  • The backstop. The robot's own tilt sensor, averaged over a second. If it is ever tilted past a limit, it stops.

Over a limit, it does what it does at a drop: it stops, backs straight out by 30 cm, and gives up the mission with the reason, so a person can look.

With the bank left off the map, the robot saw it while the steep part was still 1.1 m past its nose, stopped, backed off and gave up. It never tilted more than 5° sideways and never entered the bank.

The Slope patch from above, shaded by how steep the ground is: the 20° bank is a dark strip on the left, the gentle 7° ramp a pale band. Left, with the bank on the map: the robot's path covers the patch and stays clear of the bank. Right, with the bank left off the map: the path runs north along the bank's foot and stops, with the steep ground it saw circled inside the bank

What broke on the way

  • The bank was beside the robot, not ahead of it. The first unmapped run planned its outer lap along the foot of the steep bank. Looking ahead, the ground was flat, so the up/down check saw nothing. One wheel climbed the bank until the tilt backstop stopped it at 12.7° of roll, well inside the bank. That's what the sideways check is for.
  • The lowest point is in the wrong place. The first sideways check used the lowest laser return in each 20 cm patch of ground. On a sideways slope that is always the patch's downhill edge, so a 20° bank read as 4°. The check now looks at narrow strips right under each wheel track instead.
  • The top of a ramp looked like a step. Where a ramp levels out, the ground estimate changed so abruptly that it was thrown away, and the ramp's top read as an obstacle. A ground estimate that drops away is now kept when it clearly matches the ground just ahead.
  • The limits were too strict for a lumpy lawn. The bumpy test lawn is an ordinary 25 cm mound with small bumps on it. Across it, the robot rolls 10° even averaged over a second, and a diagonal across the mound's flank really tips 12.4° over a metre. With a sideways limit of 10°, then 12°, the robot refused to mow it. An offline check of the sideways measurement against the true terrain showed it's accurate: on average it's off by 0.04°, and a single reading by at most 2.8°. The limit was the problem, not the measurement. It's now 13.5°, and one stray reading isn't enough: the slope has to be seen in three scans in a row.
  • A hilltop looked like a cliff. Climbing the bumpy lawn's mound at about 6°, the robot is tipped back, so in its own frame the ground 2 m ahead sits about 21 cm lower than it really is. At the top, the far side read as a 20 cm drop, and the robot gave up mowing a perfectly ordinary lawn. The drop check now measures heights along gravity, levelling the lidar's picture with the tilt sensor first. Replayed at the same spots: 4 false drops before, none after, and the terrace's real walls are still seen.
  • The route home went straight down the bank. With the extra margin around the tree, the wall and the steep bank, the plateau had no way out that kept every margin. When the route planner found no route, it fell back to a straight line, and that line ran down the mapped 20° bank. The robot stopped at its foot. Now the route home tries again without the extra margin, still keeping clear of every keep-out, and if there's still no way, it stops and asks for help rather than drive through a keep-out.

Did it break anything?

  • The bumpy lawn (7 cm grass) mowed 97% and finished, with no false drop at the hilltop any more. But it made one false stop for grass, climbing the foot of the mound. That's 2.8 false stops per 100 m², over our bar of 1. It isn't new: the ground estimate still struggles where a slope begins or ends under grass, and it's the next ground-estimate job.
  • The terrace with the wrong map still stops for the real wall and gives up. The closest the robot's front corner came to the edge was 9 cm (12 cm last time). That's the same weak spot as before: a turn that swings the robot toward an edge brings it into view late.
  • The obstacle course still passes: every obstacle on bare ground, and everything but the hose in 7 cm grass.

Not covered yet

  • Wheel slip. A wet slope the robot can't climb shows up as wheels turning while the robot doesn't move. The satellite fix can see that; it's not built yet.
  • The real limits. 15° up, 13.5° across and slowing at 80% are defaults until they're checked on Chris's lawn.
  • Next: is the lidar telling the truth? Everything above trusts the lidar. The next step checks it: a dirty or wet window, rain, a frozen or silent sensor. Its first test run already found something: 7 cm grass looked like rain to it.