This chapter is about the parts that every solution had to add when the two helps were taken away. It is for a reader who has read the problem and knows the six solutions from the pushing book. Every number in the chapter comes from a committed file in the project, and each one is linked where it is used.
This first page answers one question. What must a solution do before it can push at all, when its camera is on its wrist and nobody tells it when to stop? The answer has five parts. A solution must look from several places. It must remember what it saw. It must find each glass by touch with the camera alone. It must say when the table is done. And it must know where its fingers really are.
Contents#
- The ring of eight stands
- The belief: what the arm remembers
- The ranging push
- How a solution says it is done
- The hand hangs below the waypoint
1. The ring of eight stands#
Looking comes first, because a solution cannot choose a push until it has seen the glasses.
The camera now rides on the wrist, as the camera rides on the wrist explains. To see from another side, the arm must move, and moving costs arm time.
A stand is a place where the jaw can wait at travel height and look. Each
stand is at the edge of the glass zone and faces across it. The geometry
solution uses eight stands, one for each direction the arm can reach. Walking
all eight is one lap, and one lap costs about 8 seconds of arm time.
01-one-fixed-nudge/tour.py
holds the ring.

In the picture, see that one look from travel height already covers the whole glass zone. See also that each stand looks across the zone from a different side. Two glasses that stand in a line from one side are not in a line from the next.
So one stand can frame the whole floor of the zone. Why walk eight? The reason is that glasses hide each other, and the solution cannot tell that a hidden glass is missing. Looking from every side is the general cure, because no arrangement hides a glass from all eight sides.
The project measured this on twenty tables, numbers 0 to 19. The table below gives the share of glasses that one look or one lap catches. Read each row as "out of every 100 glasses on the table, this many were seen".
| What the arm looks from | Glasses seen, of every 100 |
|---|---|
| an average single stand | 85 |
| the best single stand on that table | 97 |
| all eight stands, one lap | 100 (all 84 of 84) |
The numbers are from the geometry solution's README. So the lap buys the last glass, not the first. But the last glass matters. A glass nobody saw is a glass the solution would call finished without looking at it.
The geometry solution walks one lap at the start of a table. It walks another
lap before it says the table is done. After a push it looks from one stand
only, the one where the pushed glass should be least hidden. Taking another
picture from where the jaw already stands costs nothing, because nothing
moves. On those twenty tables, 46% of the arm's time went on looking
(calibration.json,
looking_share 0.461).
A lap gives many pictures, and each picture shows only some of the glasses. The next section answers how those pictures become one table.
2. The belief: what the arm remembers#
The lap in the section above gives eight pictures, so the solution needs one place to hold what all of them said.
The belief is the table as the solution believes it to be. It is built
from many looks.
01-one-fixed-nudge/remembered.py
holds it. It follows three rules.
- Each look is merged in. A glass seen in one picture stays in the belief while the arm looks somewhere else.
- Repeated readings are averaged. Every look carries its own small camera error. Two readings of the same glass are two measurements, and their mean is better than either one.
- A pushed glass is forgotten first. After a push the glass is somewhere new. If the new reading were averaged with the old ones, the answer would be a place where the glass never stood. So the solution says when it has moved a glass, and that glass's average starts again at the next look.
The belief takes a short cut. It knows which glass is which because the bench gives each glass a number. A real cell would have to match each glass in one picture to the same glass in the next. This book does not solve that problem.
The geometry solution, the ranked solution and the world model all use this
belief. The three solutions that answer from a picture were first built to
answer from one look, so at first they held only the current picture. Later
they were given a simpler record, Measured, in
bench/keeping_clear.py.
It keeps the newest reading of every glass seen on the table and does not
average. The other pieces of the check
says why it was needed and what it bought.
The belief says where each glass stands. It does not say how far the fingers must travel before they touch one. The next section answers how a solution finds that out without a force sensor.
3. The ranging push#
The belief from the section above gives each glass's place, but a push must also know where the fingers first meet the glass.
In the pushing book, the hand comes down near the glass and then creeps forward slowly. It stops when its force sensor feels the glass, and it pushes from there. The loop: plan, feel, look again describes it. That creep was needed. The jaw meets a glass at the jaw's own height, and there a glass can be much narrower than at its widest part. The fingertips travel 10 to 11 mm to meet a straight glass. They travel 19 to 30 mm to meet a stemmed one, because they meet the stem.
A path in this book cannot creep. A path is a fixed list of waypoints, carried out from start to end. It cannot stop halfway because something touched. So the only sense left for finding the glass is the camera. The solution pushes a little, looks, and sees whether the glass moved.
So the pushing book's one test push becomes two pushes, followed by the real push.
- Ranging. The fingertips go 5 mm deeper than last time, and the arm looks. This says only whether the glass has been met. It says nothing about whether the glass slides.
- Testing. Now the distance is known. The solution makes the pushing book's 5 mm test push exactly, and looks.
- Pushing. Every later push on that glass starts from the measured distance. So the glass lands where the planner aimed it, not short of it.
There is a limit on how deep ranging may go. The camera cannot tell "not
touched yet" from "touched, and now leaning". In both cases the glass has not
moved. Reaching deeper on a leaning glass puts it on its side. So the depth is
capped by the pushing book's lean guard, which is 0.7 of the angle at which the
glass would fall. After that, the solution leaves the glass alone. That is the
safe way to be wrong.
01-one-fixed-nudge/nudge.py
holds the ranging, the testing and the pushing.
With looking, the belief and ranging, a solution can act on a table. The next section answers how it decides that it has finished.
4. How a solution says it is done#
The sections above let a solution look and push. But in this book nothing stops a table for the solution, so it must also stop by itself.
A solution answers each look with one of two things: a path for the jaw, or "done". The examiner explains why "done" is part of the mark. This section is about how each kind of solution says it.
A geometry solution says it in words. When its chooser has no push left that it is willing to make, it walks the whole ring once more. Then it asks the chooser again. Only if there is still nothing to do does it answer "done". Running out of arm time is never reported as "done", because that ending belongs to the clock.
A policy that only draws paths has no word for "done". The two borrowed
models answer with a path and nothing else. So
bench/stopping.py
reads "done" from what the policy does. An answer that could not touch any
glass is a quiet answer. A run of quiet answers in a row is taken as the
policy saying that it sees nothing worth doing.
How many quiet answers are enough? The number came from the teacher, which is the ranked geometry solution. A learned policy must be allowed at least as many quiet answers as the teacher gives before it pushes again. The table below shows the teacher's quiet spells over 40 tables. A spell is a run of quiet answers in a row. Read each row as the longest and the middle spell before that kind of ending.
| What ended the quiet spell | Longest spell | Middle spell |
|---|---|---|
| a push | 8 answers | 2 answers |
| the teacher saying "done" | 11 answers | 10 answers |
The numbers are in
teacher-quiet-spells.json.
The bench uses 16, which is above both. A rule of 3 would call a policy
finished partway through its first lap, on every table. The two mistakes do not
cost the same. A rule that is too high wastes a few arm seconds. A rule that is
too low ends the table.
The rule only looks at the shape of an answer. It never asks whether a push was a good idea. A policy that waves the jaw in the air and a policy that has cleared the table are both quiet. The scorecard tells them apart, because it looks at the table.
The imitation solution later learned the teacher's own "done" as well. Its chapter describes that. For it, the quiet rule is only a backstop.
The quiet rule asks whether an answer "could touch a glass". The first version answered that question wrongly. The next section explains the mistake.
5. The hand hangs below the waypoint#
The quiet rule in the section above, and the cell's interlock, both have to know how low the hand goes. This section is about the error both of them first made.
A waypoint is one point on a path. Its height names the middle of the jaw, not the bottom of the fingers. The jaw is turned on its side, and the fingers hang about 70 mm below the middle. So a path whose waypoints look high can still drag the fingers through the top of a tall glass.

In the picture, see the gap between the waypoint and the fingertips. The waypoint clears the glass, but the fingers do not.
Two shared pieces of code first measured from the waypoint.
- The quiet rule. Its first version asked whether a path came down to pushing height. One run broke a glass while every one of its answers was counted as quiet. A rule that calls a policy finished while it is knocking glasses over is not a rule about finishing.
- The interlock. This is the one check the cell still makes: it refuses a push into a glass that would tip. Its first version took the waypoint's height as the underside of the hand. That left a band 70 mm deep where the hand could sweep through a glass and the interlock said nothing. A policy that hovers spends its time in exactly that band.
Both now subtract the 70 mm before they ask their question. The quiet rule
also compares the lowest finger with the tallest glass the solution has
measured, not only with pushing height.
bench/stopping.py
and the hand_meets check in
bench/open_run.py
hold the corrected sums.
These five pieces were enough for the two geometry solutions, which broke no glass. The learned solutions still failed on their first walk. The next page answers why.