Skip to content

v2.10.0 - ROOM-SEG: room/door detection completely rebuilt for 900-series (EPHEMERAL) robots

Choose a tag to compare

@johnnyh1975 johnnyh1975 released this 26 Jun 15:29
21c15fe

Roomba+ v2.10.0

Highlights

ROOM-SEG: room/door detection completely rebuilt for 900-series (EPHEMERAL) robots

The gap-distance heuristic that previously detected rooms and doors from travel data (ZoneStore) has been replaced end to end with a watershed-based segmentation engine (RoomSegStore) that works directly on the same accumulated coverage-density data used for the cleaning heatmap implemented from scratch with zero new runtime dependencies (no scipy/scikit-image).

The old approach had a structural flaw: with dense MQTT pose sampling, the maximum distance between consecutive samples never reliably exceeded the door-gap threshold, so most real doorways were never detected. The new approach instead finds rooms as density basins in the coverage map and doors as the saddle points between them — verified against real field data to produce a stable room result across a range of parameters, not a lucky one-off.

What's new for EPHEMERAL (900-series) robots:

  • Room and door identity stay stable across recomputations — a name you assign survives even as more missions refine the boundaries.
  • A door's tracked position is now the median of its recent crossing observations (not the latest single reading), making it robust to a door being at a different swing angle from one mission to the next.
  • A Repair Issue prompts naming for newly detected rooms, same as before.
  • If you're updating from an earlier version, any room names you already confirmed are migrated automatically the first time this version starts — no action needed.

What was deliberately removed:

  • The door-width calibration helper (Options Flow → map scale calibration). It only ever adjusted a cosmetic rendering scale that's still directly editable as a plain number in the general map settings — the calibration step itself added no functionality beyond that, and field experience showed it saw effectively no use.

Battery / dock contact monitoring (new Repair Issue)

A new check (battery_contact_suspect) catches two patterns that usually indicate a loose or corroded battery/dock contact rather than a failing battery:

  • An implausible jump in reported battery level — more than ~25 percentage points within under 10 minutes. No real battery changes state that fast; this is the BMS communication link dropping and recovering.
  • The highest battery level reached declining over three consecutive charge cycles — a slower-motion version of the same underlying issue.

This complements the existing dock_contact_health check, which depends on firmware-reported counters (nChatters/nKnockoffs/nAborts) that not every firmware version exposes — the new check works from batPct alone, which is universal. If dock_contact_health was never firing for you despite real symptoms, this is likely why; it now also logs a debug note when its expected fields are absent so the gap is visible rather than silent.

Map rendering

  • Door markers and room outlines on the live map are now sourced from the same RoomSegStore/GeometryStore pipeline above. The previous gap heuristic feeding these is gone.
  • Hidden rooms are now correctly excluded from the map overlay (previously they were excluded from selectors and Repair Issues but still drawn on the map — an inconsistency, now fixed).

Fixes

  • dock_contact_health's detection gate now logs a debug message when none of its expected fields are present for a given firmware, instead of silently never firing.
  • CLOUD-CATCHUP false-positive (SMART/Smart Map robots). The delayed cloud-refresh retry introduced in v2.9.1 to fix last_cleaned_rooms staying stale could itself be fooled into giving up too early: its "has the cloud caught up yet" check looked at whatever MissionStore's newest local record happened to be, without confirming it was actually the record for the mission that just ended. If an unrelated record (e.g. an earlier failed attempt) coincidentally received its own backfill enrichment at almost the same moment the check ran, the check would conclude "done" against the wrong record and skip its second, later retry — leaving last_cleaned_rooms permanently null for the real mission instead. Confirmed via a field retest (Thonno, three-attempt room-selected mission with two failed short attempts followed by a genuine 67-minute completion) and fixed by comparing against the record present before the mission ended, by identity, rather than by its content.

Internal

  • Six-stage migration from ZoneStore to RoomSegStore, fully decoupled from the also-removed ZoneStore-only data path. A minimal read-only migration shim (legacy_zone_migration.py) is kept solely so existing installations can carry their confirmed room names forward once; it has no other purpose.
  • Two small, genuinely independent pieces of logic that happened to live inside the old ZoneStore were relocated rather than deleted: dock-drift detection (now a standalone function in image.py) and the door-gap-width constants used by SMART-tier door detection (now in const.py).
  • 2,825 tests (up from 2,776), 0 failing.

Upgrade notes

No action required. Existing confirmed room names for 900-series robots are migrated automatically on first start after upgrading.