Skip to content

Clover and Moose

The simulated dog that runs at the robot has a name now. Two, actually: Clover and Moose, the two dogs who will share the real lawn with this robot. Clover got a sim model last week. Moose asked (through Chris) not to be left out, so he got one too. Making his turned up a bug that had been quietly spoiling the camera tests, and filming them both showed us something about where a mower's camera can and can't look.

Two dogs out of ellipsoids

Neither model is a scan. Each is around 30 ellipsoids, generated by a short script, in the dog's own colours:

  • Clover: white, with a light tan patch over her back, floppy ears that are pink inside.
  • Moose: short black coat, a white face with a blaze up the forehead, white chest and white paws, black ears.

The photos they were made from aren't kept anywhere, not even in the private repo. Only the colours made it into the models.

The white-dog bug

The first render of Moose came out as a pure white silhouette, and that was wrong: Moose is mostly black. Clover had been rendering the same way all along. We just hadn't noticed, because she's white anyway.

The cause was the mesh files. They gave the renderer the dogs' surface but no normals, the arrows that say which way each bit of surface faces. Without those, Gazebo's renderer dropped the colours and drew both dogs flat white, with no shading. (Gazebo's physics engine had tripped on the same thing earlier, in the terrain's collision meshes. Same lesson, different part of the program.)

That matters beyond looks. Every camera result so far had been measured on a white cut-out of a dog. With normals added, here's what the robot's detector (YOLOX-nano, the small one a Raspberry Pi 5 can run) says about them:

Clover and Moose in front of the robot's camera, with the detector's labels

Scene (camera level) Clover Moose
side on, 2 m bird 0.69 dog 0.75
side on, 4 m bird 0.50 dog 0.60
head on, 3 m nothing dog 0.60 (and person 0.59)
side on, 6 m bird 0.53 nothing

Moose reads as a dog. Clover, a pale dog made of smooth blobs, mostly reads as a bird. We're not reshaping her to please the detector: that would only make the numbers lie. It says more about sculpted sim dogs than about the detector. Real photos (step 5.5 of the plan) are the test that counts.

Filming them

The devlog gets video now. A new "chase camera" follows the robot from behind and above during a run and saves a frame every tenth of a second. A small script then turns those frames into a video. Here's each dog's run at the robot, at real speed:

Both runs pass every check from the things that move post. The lidar sees each dog 3.9 m out, 0.6 s after it starts running. The blade goes off and the robot stops. It waits 33–34 s after the dog has gone, then finishes the mow.

What the camera saw: nothing useful

The robot's own camera, though, never called either dog a dog. In both runs its only detections were "keyboard": the edge of the privacy mask, which blacks out everything that isn't our lawn, seems to make a band the detector likes.

The robot's camera after the privacy mask: lawn kept, everything else black, and a "keyboard"

The reason is in the video. The dog comes in from the robot's left and stops 1.1 m off its flank. The camera looks forward. At best it would catch legs and a chest at the edge of the frame. The lidar sees all the way round. So for a dog that comes from the side, the lidar is the only sensor that can work, and it does.

That's useful to know before we decide what the camera is for. It can tell things apart (a dog from a hose from a child sitting down) when they're ahead, in the robot's path. The next test needs a dog that crosses in front.

Not covered yet

  • A scenario with a dog crossing ahead of the robot, the camera's real job.
  • Both dogs at once (today it's one per run).
  • The grass report counts the stop for the dog as a "false stop", because it doesn't know about things that move. The safety checks are right; the report needs to learn about movers.
  • Speed figures for the Pi 5 + Hailo AI HAT; today's runs held the detector to Pi 5 CPU speed (about 3.5 frames a second).