epistemic-robotics

The Epistemic Robotics Project

Epistemic SLAM · two robots, two maps · AWS small warehouse · ROS 2

A link that actually falls

SLAM answers where the robot is and what the building looks like. It does not answer who knows that, and on a floor with two robots on it the second question stops being a philosophical extra: a bay r2 has not entered is not something r2 knows merely because r1 drove past it. Every demonstration here keeps the grid and the knowledge model as two views of one fact. This one cuts the radio between the two robots and takes that coincidence away, which is the only condition under which the difference between them can be measured rather than asserted.

The cut has no appearance in the simulator: nothing about a warehouse changes when a radio stops working. So the thing to watch is on the left. The arrow is where r2 believes r1 is, the disc around it is how far that belief has drifted from being knowledge, and both turn red at the point where it should stop being believed at all.

Fleet, world and per-robot SLAM from warehouse_demo, included unmodified. Reconciliation from epistemic_slam. The outage, the belief engine and the measurement are epistemic_comm.

The run

Sixty seconds without a radio

Left: what r2 believes about r1, over the map r1 is building. Right: the simulator, where nothing marks the outage at all. The cut is played at real time, the minute of drift is sampled at 4×, and the return is slowed to 0.9× because the reconnection, the verdict and the reconciliation land within three seconds of each other. Captions are matched against the run's own log and timed by the ROS timestamp of the line that carries them; where several events share an instant they are shown in sequence, so a caption can trail its event by a second and none precedes one.

The belief is not a guess about the future. While the link is up it is the last pose that arrived. When the link falls, nothing arrives, and what is drawn from then on is the last velocity integrated forward: the partner is assumed to carry on doing what it was last seen doing. The disc is the positional covariance, which grows for as long as the outage lasts and never shrinks. At fifty seconds it crosses the threshold the requirement sets, the arrow turns red, and the engine says in as many words that where r1 is should no longer be believed.

what happenedwhenmeasured
the gate stops relayingt = 0 1 764 odometry messages dropped, 64 map messages
the belief starts propagatingt = 0 from (−3.30, −8.57) at 0.150 m/s
the covariance passes the thresholdt = 50 s trace 1.000 m² against σmax² = 1.0
the link returnst = 60 s worst error 7.632 m over 636 samples, no breach
the two maps are reconciledt = 60 s 5 246 and 4 870 cells learned, 0 in conflict

Epistemic SLAM

Two views of one fact, and the moment they come apart

The demonstrations on this site rest on a coincidence that is easy to miss because it holds so consistently. A robot drives, its laser sweeps, slam_toolbox writes what it saw into a grid, and the epistemic layer writes the same event into a Kripke model. A bay the robot has not entered is unobserved in the grid and undecided in the model at once. Those are two views of one fact, and keeping them that way is what makes a run honest: no prepared map is published anywhere, so the robot cannot know a thing it did not look at.

The coincidence holds because one robot's observation drives both views. What this run does is take it away.

Three things SLAM does not store

An occupancy grid records a probability per cell. It does not record whose probability it is. A robot handed a merged map holds cells it never saw, and nothing in the format distinguishes them from cells it measured itself. That distinction is the whole of what the collaborative layer adds: coverage is a mask of what this robot observed, not of what is free in the map it happens to hold.

Nor does the grid record abstention. A cell at −1 was never observed, and a cell whose probability sits between the thresholds was observed and not resolved. Both are unknown to the epistemic layer, and collapsing the second into free or occupied would hand the model a certainty the sensor never produced. An occupancy grid stores a probability and a modal formula needs a decision, so a threshold has to be chosen somewhere; it is chosen once, in the classification, and nowhere else.

And it does not record disagreement. Two robots that observed the same cell and reached opposite conclusions have produced a fact about the fleet, not a defect in either map. Reconciliation here records the contradiction and does not stop; a disputed cell that somebody can go and look at again is worth more than a hole punched in the map, and worth much more than an average of the two readings, which would describe a floor neither robot saw.

Where knowledge ends and belief begins, in metres

While the link is up, what one robot holds about its partner is a received measurement: the partner said where it was, and the statement inherits whatever the partner's own localisation was worth. The instant the link falls that stops being an observation of anything. What continues is inference from a motion model, and the covariance is the distance it has travelled from the fact.

That gives the boundary a number, which is unusual. In the epistemic models on this site an agent either knows which of two worlds it is in or it does not, and the survey domains are built so that the question is settled by looking. Here the same distinction is continuous: the disc on the left of the film is how far the belief has drifted from being knowledge, and it widens for as long as nothing arrives. At fifty seconds it passes the threshold, and past that point the proposition about where the partner is has no business being treated as something the robot knows. The engine says so; what it cannot do is act on it, because marking that proposition uncertain means editing a model, and there is one model for the whole fleet rather than one per robot.

That last clause is the honest edge of this run. The two grids diverge because two robots observed different things while incommunicado, and reconciling them is the operation this layer performs. The two models never diverge, because there is only one, and an accessibility relation in it is a column of a shared structure and not a perspective held on a robot. Partitioning the model is a different piece of work.

Why merging maps is not a registration problem

The obvious reading of what happens at reconnection is that two grids must be aligned and combined. That reading is available and it is the wrong one. The alignment is arithmetic: both maps came from the same simulator at the same resolution, and putting them on a common extent is a translation by whole cells, with no interpolation and no rotation. Maps at different resolutions are refused rather than approximated, because a wrong registration produces a merged map that is confidently wrong, which is worse than one that is obviously missing.

What is not arithmetic is the question underneath: after the merge, what does each robot know? The answer is not the union of the grids. It is a per-robot fact, and this run reports it as one: the believing robot learned 5 246 cells it had never observed, the patrolling one 4 870, and neither now confuses them with cells it measured. That accounting is what the layer exists for, and it is the part an occupancy grid has no field for.

The measurement

The bound is met, and that is weaker than it sounds

The requirement admits an error of vmax·Δt + σprop, with vmax = 0.22 m/s taken from the speed the fleet's own controller enforces. Three runs, of thirty, sixty and a hundred and twenty seconds, meet it with no breaches: worst errors of 3.63, 6.97 and 19.20 m, each at the last sample and each larger than the one before, which is what an estimate that ages should do.

The belief error stays near one and a half metres while the admissible bound climbs linearly to thirteen metres over sixty seconds
Grey is the bound, which climbs at 0.22 m/s because that is what the platform could do; red is the error actually made. They touch only at the instant of the cut. The criterion is hardest to satisfy when the estimate is freshest and easiest when it is oldest, which is the wrong way round.

A propagation that holds the last velocity cannot fail this bound while the partner keeps its course, and the arithmetic gives the other half: a partner that reverses at full speed the instant the link falls separates at 2v·Δt and breaches the bound after σprop/vmax, which here is 0.23 s. What these runs show is that the engine tracks a partner that holds its course. They do not show that the bound cannot be broken.

The zero conflicts are the same kind of fact. The believing robot sits at its dock and the partner patrols elsewhere, so the two sets of observed cells barely touch; a contradiction needs two robots to have looked at the same cell and disagreed, and this pair never did. Routing them through one aisle from opposite ends is the next run.

Reproduction

Running it

colcon build --packages-select epistemic_msgs epistemic_comm epistemic_slam
colcon test --packages-select epistemic_comm      # 62 tests

ros2 launch epistemic_comm link_outage_launch.py t_disc:=70 t_recon:=130

t_disc and t_recon are seconds from the monitor's first clock tick, and the schedule is open loop on purpose: an outage triggered by distance would make its own duration a function of the trajectory it perturbs. Two JSON records are written per run, and the six behind the numbers above are published beside this page: short, baseline, long, and the run in the film as demo.

The full account is the report, A Link That Actually Falls: the three outage lengths, the proposition that fixes what the bound is and is not worth, the map alignment the reconciliation needed, and what it would take to make two robots hold two models instead of one.

Two findings from building it are worth recording here, because both cost a run to discover. Gating the announcement channel measures nothing: the channel is an audit path, read only by the transcript recorder, and the epistemic model advances through a service the executor calls when an action completes. And the reconciliation refused the first real pair of maps it was ever handed, for differing in size, which is correct and had never been exercised, because a test that builds both grids builds them the same shape and two maps that two robots built never are.