Skip to content

Initial xArm6 WorldBelief perception stack - #2665

Merged
mustafab0 merged 10 commits into
dimensionalOS:mainfrom
jhengyilin:jhengyi/perception-worldbelief-clean-0625
Jul 15, 2026
Merged

Initial xArm6 WorldBelief perception stack#2665
mustafab0 merged 10 commits into
dimensionalOS:mainfrom
jhengyilin:jhengyi/perception-worldbelief-clean-0625

Conversation

@jhengyilin

Copy link
Copy Markdown
Contributor

WorldBelief live object identity for xArm6 manipulation

flowchart TB
    camera([RealSense RGB-D camera])

    detector["YOLO-E prompt detector<br/><i>prompt mode, tracker disabled in xArm blueprint</i>"]
    osr["ObjectSceneRegistration<br/><i>RGB-D objects + CLIP/DINO crop embeddings</i>"]
    wb["WorldBelief<br/><i>stable IDs, support windows, re-acquisition</i>"]
    rerun["Rerun<br/><i>annotated image + 3D workspace</i>"]
    manip["PickAndPlaceModule<br/><i>reads present objects</i>"]
    recorder["XArm6WorldBeliefRecorder<br/><i>records replay-critical streams</i>"]

    subgraph m2 ["memory2"]
        direction TB
        subgraph session ["per-run recording DB"]
            direction LR
            color[(color_image)]
            depth[(depth_image)]
            info[(camera_info)]
            det2d[(detections_2d)]
            det3d[(detections_3d)]
            audit[(worldbelief_audit)]
        end
        subgraph history ["worldbelief_history.db"]
            direction LR
            object_events[(object evidence)]
            semantic_vec[(semantic vectors)]
            visual_vec[(visual vectors)]
        end
    end

    camera --> detector
    detector --> osr
    camera --> osr
    osr -->|"frame objects"| wb
    osr -->|"annotated image + current-frame pointcloud"| rerun
    wb -->|"present objects"| manip
    wb -->|"detections_3d + audit"| rerun
    wb ==> object_events
    wb ==> semantic_vec
    wb ==> visual_vec
    object_events -. "rehydrate compact identity state on restart" .-> wb
    camera ==> recorder
    osr ==> recorder
    wb ==> recorder
    recorder ==> color
    recorder ==> depth
    recorder ==> info
    recorder ==> det2d
    recorder ==> det3d
    recorder ==> audit

    classDef stream fill:#fef3c7,stroke:#d97706,stroke-width:2px
    classDef module fill:#dbeafe,stroke:#2563eb,stroke-width:2px
    classDef memory fill:#dcfce7,stroke:#16a34a,stroke-width:2px
    classDef external fill:#f3f4f6,stroke:#6b7280,stroke-width:1px
    class color,depth,info,det2d,det3d,audit,object_events,semantic_vec,visual_vec stream
    class detector,osr,wb,rerun,manip,recorder module
    class m2,session,history memory
    class camera external
Loading

What this unlocks

This PR adds a live object identity layer for the xArm6 perception/manipulation stack. The detector still sees frame-local masks; WorldBelief turns those observations into stable workspace objects that pick/place and visualization can trust.

Capability What changed Why it matters
Stable live object IDs WorldBelief associates current 3D observations against maintained identity state using geometry, labels, CLIP, DINO, support windows, and re-acquisition policy. A can should keep its identity while it moves, disappears briefly, or is seen again after camera motion.
Manipulation-facing present set OSR publishes WorldBelief present_objects to the objects port and Detection3DArray. Pick/place consumes a filtered workspace state, not every noisy frame detection.
Cross-session identity seed WorldBelief writes compact object evidence and vector evidence into a stable Memory2 history DB, then rehydrates maintained state on restart. The next process starts with prior identity evidence instead of a blank identity table.
Cleaner Rerun view Blueprint opens Rerun with annotated image on the left and 3D workspace on the right. Current-frame pointclouds are used for visual blobs. The display reflects both live camera evidence and trusted WorldBelief state without stale pointcloud trails.
Replay/debug evidence A dedicated recorder writes a fresh per-run Memory2 DB for color/depth/camera info/detections/audit streams. We can inspect what the stack saw and what WorldBelief decided without mixing sessions.

How it works - walkthrough

t Event What happens
0 Blueprint starts The xArm6 WorldBelief blueprint wires RealSense, YOLO-E, OSR, WorldBelief, Rerun, recorder, and pick/place. The stable history DB is opened if configured.
1 Camera sees objects YOLO-E produces prompt-mode masks. OSR uses color, depth, camera info, and TF to build 3D Object observations.
2 Appearance evidence is attached OSR crops each object and attaches CLIP semantic embeddings and DINO visual embeddings.
3 WorldBelief updates The identity engine matches observations to existing IDs or creates candidates. Objects become present only after enough recent support.
4 Manipulation reads state present_objects are published to the objects port and detections_3d. Pick/place sees stable workspace objects rather than raw detector churn.
5 Rerun displays state The annotated image uses current-frame identity assignments, while the 3D view receives trusted boxes plus current-frame colored pointcloud visualization.
6 Object leaves view Frustum and camera-motion handling keep a hidden identity available for re-acquisition instead of immediately deleting or publishing stale visual blobs.
7 Object returns WorldBelief can reuse the prior ID when geometry and appearance evidence are strong enough. If evidence is ambiguous, creating a new ID is safer than forcing a wrong merge.
8 Process restarts Compact WorldBelief evidence is rehydrated from Memory2 history so the identity table does not always start from scratch.

Runtime object model

The PR deliberately separates four related concepts:

Layer Meaning Used by
Raw detections YOLO-E masks/classes from the current image. OSR object construction.
Frame objects Current-frame 3D objects after WorldBelief assigns IDs. Annotated image and audit.
Present objects Objects with enough recent support to be trusted as present. objects, detections_3d, pick/place, 3D boxes.
Maintained objects Remembered identities kept internally for hidden re-acquisition/history. WorldBelief lifecycle and Memory2 history.

This split is why the Rerun pointcloud can stay visually clean while manipulation still receives stable present objects.

Why this design

  • WorldBelief is live task memory. Memory2 stores durable evidence, but the robot still needs a current materialized workspace state with deterministic identity policy.
  • Raw detector output is not enough for manipulation. Prompt-mode detection can flicker, split, or merge frame to frame. WorldBelief adds support windows, lifecycle state, and appearance-aware association before publishing objects to pick/place.
  • Memory2 remains the durable layer. WorldBelief writes object and vector evidence into Memory2 history and can rehydrate from it, but this PR does not claim to ship the final natural-language Memory2 query workflow.
  • Detector tracking is intentionally not the identity source. The xArm6 blueprint disables YOLO tracking so stable IDs come from the robot-side identity model instead of detector-local track state.
  • Visualization is separated from manipulation state. Current-frame pointcloud blobs are for visual clarity; present_objects and detections_3d remain the manipulation-facing outputs.

Main files

Area Files
Product blueprint dimos/robot/manipulators/xarm/blueprints/worldbelief.py, dimos/robot/all_blueprints.py, dimos/manipulation/blueprints.py
OSR integration dimos/perception/object_scene_registration.py
Identity engine dimos/perception/detection/world_belief.py, identity_association.py, identity_features.py
Durable history dimos/perception/detection/world_belief_history.py
Object representation dimos/perception/detection/type/detection3d/object.py
Embeddings/detector support dimos/models/embedding/dino.py, clip.py, mobileclip.py, dimos/perception/detection/detectors/yoloe.py
Recording dimos/robot/manipulators/xarm/worldbelief_recorder.py, dimos/memory2/module.py

Known limits / follow-ups

  • Exact same-location swaps between visually similar cans are still a hard identity case. If the physical objects exchange positions perfectly, stronger appearance mismatch policy may need a follow-up threshold split.
  • CLIP + DINO improve identity evidence but add latency. If annotated-image smoothness becomes the priority, the next step is a fast visual overlay before embedding completion while keeping trusted WorldBelief outputs after embeddings.
  • Runtime detector prompt updates currently replace the active prompt list. Append-to-default prompt workflow is a follow-up.
  • Memory2 vector evidence is recorded for future search/recall work, but this PR does not add the final agent query API.

@greptile-apps

greptile-apps Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds a WorldBelief perception stack for xArm6 object identity. The main changes are:

  • Live object identity folding from RGB-D detections.
  • Persistent DINO gallery lookup for cross-session ID recovery.
  • Present-object outputs for manipulation and 3D publishing.
  • Unresolved observation metadata for uncertain detections.
  • Recording and recall support for WorldBelief sessions.

Confidence Score: 5/5

This looks safe to merge.

  • No blocking issues found in the changed code.

Important Files Changed

Filename Overview
dimos/perception/detection/world_belief.py Adds identity matching, gallery restore, unresolved handling, absence voting, and present-object filtering.
dimos/perception/worldbelief_module.py Adds scan and recall skills while publishing only established present objects to downstream streams.
dimos/perception/scene_scan.py Adds recorded-frame scanning, detector prompting, RGB-D lifting, and DINO embedding attachment.
dimos/perception/detection/type/detection3d/object.py Extends object identity metadata and converts stable object geometry into Detection3D messages.

Reviews (10): Last reviewed commit: "Merge branch 'main' into jhengyi/percept..." | Re-trigger Greptile

Comment thread dimos/perception/detection/world_belief_history.py Outdated
Comment thread dimos/perception/detection/world_belief.py Outdated
Replace the live-YOLO WorldBelief pipeline with query-on-demand
perception. scan folds the COMPLETE recorded interval since the last
fold into a rule-based identity core with measured
constants. DINO crop galleries carry identity across sessions; recall searches whole-frame
CLIP over a shared history index and detector-verifies each proposed
moment before answering (CLIP proposes, the detector picks).
Comment thread dimos/perception/detection/world_belief.py Outdated
@jhengyilin

Copy link
Copy Markdown
Contributor Author

xArm6 WorldBelief — pulled perception with cross-session memory

Pivot to pulled perception: nothing runs until asked; when asked, the answer covers the complete recorded interval since the last question — no observation holes.

flowchart LR
    CAM["camera just records<br/>color + depth + pose"] --> REC[("session<br/>recording")]
    REC -- "scan (on demand)" --> SS["SceneScanner<br/>frames → 3D sightings"]
    SS --> WB["WorldBelief<br/>sightings → stable identities"]
    WB --> OUT["reply: name · id · xyz<br/>· trust · basis"]
    WB <--> MEM[("long-term memory<br/>survives restarts")]
    MEM -- "recall (on demand)" --> RC["&quot;where did I last see X?&quot;"]
Loading

How a scan actually works

The camera only records. RealSense color + depth frames and the camera's world pose stream into the session's recording .db. No GPU touches them at record time.

Frame selection — fast-forward while nothing moves, slow down when something does. The recorded camera poses set the pace: ~1 frame/s while still, 7.5/s while moving. And if the set of detected objects changes between two kept frames (a hand swapped something while the camera was still), the scanner bisects the gap and looks between them. Net cost: 11–18 % of frames ever see the detector, with no blind spots.

The worldbelief identity core

The detector has no memory — it never says "that same mug". WorldBelief adds it. It keeps one track per believed object: a stable object_id, the last observed position, and a small gallery of DINO embeddings (views of the object from different angles). Every incoming detection must be explained, and the model always prefers the cheapest explanation — reusing an existing identity over creating one.

flowchart TB
    S["detection arrives:<br/>label + 3D center + DINO embedding"] --> Q1{"Q1 · inside an active track's<br/>match radius?<br/>min(0.18 + 0.15·dt, 0.40) m"}
    Q1 -- "yes — label agrees (or cos ≥ 0.8 override),<br/>no appearance contradiction (cos ≥ 0.5)" --> T1["update that track<br/><i>basis: tracked</i>"]
    Q1 -- no --> Q2{"Q2 · inside an established track's<br/>0.13 m noise envelope?"}
    Q2 -- yes --> T2["claimed by that track —<br/>mint suppressed (envelope default)"]
    Q2 -- no --> Q3{"Q3 · gallery match to an absent or<br/>stored identity?<br/>cos ≥ 0.5, margin ≥ 0.05, same label"}
    Q3 -- yes --> T3["identity revived<br/><i>basis: reacquired / restored</i>"]
    Q3 -- no --> Q4["Q4 · mint a new track —<br/>established after 3 frames ∧ 1.5 s"]

    P["established track goes unseen"] -- "depth ray passes THROUGH<br/>its center — 2 votes" --> GONE["state: absent<br/>(gallery kept)"]
    GONE -. "revivable via Q3" .-> Q3
Loading

Q1 — Is it inside an active track's match radius? Every track predicts the object near its last observed position. The radius starts at 0.18 m and grows with time-unobserved (min(0.18 + 0.15·dt, 0.40) m) — deliberately above the measured sensor noise, since even a perfectly static object appears to jump by up to 0.126 m between lifts. Two embedding checks guard the match: a detection under a different label only matches on a strong appearance override (cos ≥ 0.8 — the same object seen 180° apart scores ~0.94, different objects max ~0.33), and a detection with the right label but a clearly foreign embedding (cos < 0.5 against the track's gallery) is vetoed — detector labels lie. A match updates the track: basis: tracked.

Q2 — Is it inside an established track's 0.13 m noise envelope? Then that track claims it, by default. Two rigid objects can't co-locate: a detection landing within the envelope of an established object is that object unless stronger evidence says otherwise, and minting there is suppressed (the mint-guard). This envelope-as-null-hypothesis rule kills most identity-theft bugs.

Q3 — Does its embedding match an absent or stored identity's gallery? No active track claims it — so compare the detection's DINO embedding against the galleries of every absent identity, from this session or any earlier one. The best match must cos ≥ 0.5, beat by a margin ≥ 0.05 (a near-tie between two candidates means the evidence can't tell them apart — refuse to guess), carry the same label, and resemble the absent identity more than any co-located neighbour. Success revives the identity: basis: reacquired (same session) or restored (previous session).

Q4 — Mint a new track. Only when Q1–Q3 all fail is a new object_id minted — and the track stays unestablished until seen 3 frames across ≥ 1.5 s. Hand blurs and one-frame glitches never establish, so they never reach a scan reply.

Absence is evidence-only. A track is never dropped for being unseen — it goes state: absent only when the depth ray passes through its center (the sensor ranges the table behind it) on 2 separate frames. Panning away is not absence. The gallery is kept, so an absent identity stays revivable via Q3.

Galleries are the long-term memory. Each established sighting adds sufficiently-novel views to the track's gallery in worldbelief_history.db (megabytes — recordings stay the heavy, per-file-deletable archive). Restart everything tomorrow, scan once: Q3 runs against the stored galleries and the mug returns with its old id.

recall reuses the same skepticism. "Where did I last see X" searches whole-frame CLIP vectors across all indexed sessions — but CLIP similarity is nearly flat within one scene (measured top-30 spread: 0.259→0.248), so its ranking only proposes. Each candidate moment is verified by a small detection scan of its source recording; the first confirmed moment is the answer, and where_object is either detector-verified or honestly None.

Where each piece lives in the code:

Concept In the code
a track / the belief table _Track / WorldBelief (world_belief.py)
embedding gallery (RAM + persistent) _Track.gallery / _GalleryStoreworldbelief_history.db
Q1 — match radius, label override, appearance veto _match_frame()
Q2 — 0.13 m envelope + mint-guard _envelope_neighbours(), checked in _match_frame() / _acquire()
Q3 — gallery match with floor + margin _reacquire_candidate() / _acquire()
Q4 — mint + establishment (3 frames ∧ 1.5 s) _insert() / _hit()
absence (2 depth votes, gallery kept) _vote_absence() + absence.py
viewpoint-diversity trust (tentativeconfirmed) trust_of() — 2 distinct viewpoints

How to Test

dimos --xarm6-ip <ROBOT_IP> run xarm6-worldbelief
# in a second terminal:
dimos mcp call scan -a prompt='["mug","coke can"]'
dimos mcp call recall -a text="mug"

Move an object by hand between scans → same id, basis: reacquired. Remove it → drops from the reply (2-vote absence). Restart the process and scan → same ids, basis: restored. recall returns when/where it was last seen — including from a previous session's recording.

Comment thread dimos/perception/absence.py Outdated
Comment thread dimos/perception/absence.py Outdated
Comment thread dimos/perception/absence.py Outdated
Comment thread dimos/perception/detection/world_belief.py Outdated
Comment thread dimos/perception/detection/world_belief.py
Comment thread dimos/perception/detection/world_belief.py
Comment thread dimos/perception/detection/world_belief.py Outdated
Comment thread dimos/robot/manipulators/xarm/worldbelief_recorder.py Outdated
Comment thread dimos/perception/detection/world_belief.py Outdated
Comment thread dimos/manipulation/blueprints.py Outdated
Comment thread dimos/perception/scene_scan.py Outdated
@TomCC7

TomCC7 commented Jul 8, 2026

Copy link
Copy Markdown
Member

@jhengyilin @mustafab0 (@leshy pls audit) I think it's fine to make world-belief a dedicated module as it makes lifecycle and api boundary clean, concurrent reads with single write is not a problem for sqlite as read operates on the snapshot. My only concern about having to specify db path for mutliple modules can be relieved in the future by providing some pre-launch config injection (I'm thinking of using some timestamp based default location and make sure two modules sync on this path)

Address review feedback. WorldBeliefRecorder is
now a dumb writer; the new WorldBeliefModule owns the belief, the
scan/CLIP models, and the scan/recall skills. SceneScanner is stateless:
callers pass the belief in. Hand-built matrices replaced with Transform/Pose/
PointStamped; tuning constants live in WorldBeliefConfig; _Track is a
grouped slots dataclass. Gallery lookup now selects the newest view by
append time (the per-track counter resets on restore).
@jhengyilin

Copy link
Copy Markdown
Contributor Author

xArm6 WorldBelief — pulled perception with cross-session memory

Pivot to pulled perception

flowchart TB
    CAM["camera<br/>color + depth + pose"] --> REC["WorldBeliefRecorder<br/>"]
    REC -- writes --> RDB[("session recording<br/>per-session .db")]
    RDB -- "scan / recall<br/>(on demand)" --> WB["WorldBeliefModule<br/>@scan · @recall<br/>SceneScanner + WorldBelief"]
    MEM[("long-term memory<br/>worldbelief_history.db<br/>survives restarts")] <--> WB
    WB --> OUT["reply: name · id · xyz<br/>· trust · basis"]
    WB -- "objects · detections_3d · pointcloud" --> CONS["PickAndPlace / Rerun"]
Loading

Two modules

The stack is split as 2:

  • WorldBeliefRecorder (record plane) only writes: raw color/depth/camera_info/joint_state + tf into a per-session, timestamped recording db.
  • WorldBeliefModule (query plane) owns everything intelligent: the warm WorldBelief fold, the scan/CLIP/DINO models, and the scan/recall MCP skills. It reads the recording db on demand (W writes the long-term history db.

How a scan actually works — follow one call

The camera only records. RealSense color + depth frames and the camera's world pose stream into the session's recording .db. No GPU touches them at record time.

Frame selection — fast-forward while nothing moves, slow down when something does. The recorded camera poses set the pace: ~1 frame/s while still, 7.5/s while moving. And if the set of detected objects changes between two kept frames (a hand swapped something while the camera was still), the scanner bisects the gap and looks between them. Net cost: 11–18 % of frames ever see the detector, with no blind spots.

Ownership. SceneScanner is a stateless engine (models + frame selection + 2D→3D lift + embeddings); it is handed the module's WorldBelief and folds frames into it — scanner.scan(store, belief, …). The belief owns all identity/trust/absence state and outlives every scan.

The worldbelief identity core

The detector has no memory — it never says "that same mug". WorldBelief adds it. It keeps one track per believed object: a stable object_id, the last observed position, and a small gallery of DINO embeddings (views of the object from different angles). Every incoming detection must be explained, and the model always prefers the cheapest explanation — reusing an existing identity over creating one.

flowchart TB
    S["detection arrives:<br/>label + 3D center + DINO embedding"] --> Q1{"Q1 · inside an active track's<br/>match radius?<br/>min(0.18 + 0.15·dt, 0.40) m"}
    Q1 -- "yes — label agrees (or cos ≥ 0.8 override),<br/>no appearance contradiction (cos ≥ 0.5)" --> T1["update that track<br/><i>basis: tracked</i>"]
    Q1 -- no --> Q2{"Q2 · inside an established track's<br/>0.13 m noise envelope?"}
    Q2 -- yes --> T2["claimed by that track —<br/>mint suppressed (envelope default)"]
    Q2 -- no --> Q3{"Q3 · gallery match to an absent or<br/>stored identity?<br/>cos ≥ 0.5, margin ≥ 0.05, same label"}
    Q3 -- yes --> T3["identity revived<br/><i>basis: reacquired / restored</i>"]
    Q3 -- no --> Q4["Q4 · mint a new track —<br/>established after 3 frames ∧ 1.5 s"]

    P["established track goes unseen"] -- "depth ray passes THROUGH<br/>its center — 2 votes" --> GONE["state: absent<br/>(gallery kept)"]
    GONE -. "revivable via Q3" .-> Q3
Loading

Q1 — Is it inside an active track's match radius? Every track predicts the object near its last observed position. The radius starts at 0.18 m and grows with time-unobserved (min(0.18 + 0.15·dt, 0.40) m) — deliberately above the measured sensor noise, since even a perfectly static object appears to jump by up to 0.126 m between lifts. Two embedding checks guard the match: a detection under a different label only matches on a strong appearance override (cos ≥ 0.8 — the same object seen 180° apart scores ~0.94, different objects max ~0.33), and a detection with the right label but a clearly foreign embedding (cos < 0.5 against the track's gallery) is vetoed — detector labels lie. A match updates the track: basis: tracked.

Q2 — Is it inside an established track's 0.13 m noise envelope? Then that track claims it, by default. Two rigid objects can't co-locate: a detection landing within the envelope of an established object is that object unless stronger evidence says otherwise, and minting there is suppressed (the mint-guard). This envelope-as-null-hypothesis rule kills most identity-theft bugs.

Q3 — Does its embedding match an absent or stored identity's gallery? No active track claims it — so compare the detection's DINO embedding against the galleries of every absent identity, from this session or any earlier one. The best match must cos ≥ 0.5, beat by a margin ≥ 0.05 (a near-tie between two candidates means the evidence can't tell them apart — refuse to guess), carry the same label, and resemble the absent identity more than any co-located neighbour. Success revives the identity: basis: reacquired (same session) or restored (previous session). When identities are compared across sessions, the stored gallery's position/support metadata comes from the most recently appended view (wall-clock store time, which survives restarts) — a per-track frame counter resets on restore and would keep electing a stale pre-move position.

Q4 — Mint a new track. Only when Q1–Q3 all fail is a new object_id minted — and the track stays unestablished until seen 3 frames across ≥ 1.5 s. Hand blurs and one-frame glitches never establish, so they never reach a scan reply.

Absence is evidence-only. A track is never dropped for being unseen — it goes state: absent only when the depth ray passes through its center (the sensor ranges the table behind it) on 2 separate frames. Panning away is not absence. The gallery is kept, so an absent identity stays revivable via Q3.

Galleries are the long-term memory. Each established sighting adds sufficiently-novel views to the track's gallery in worldbelief_history.db (megabytes — recordings stay the heavy, per-file-deletable archive). Restart everything tomorrow, scan once: Q3 runs against the stored galleries and the mug returns with its old id.

recall reuses the same skepticism. "Where did I last see X" searches whole-frame CLIP vectors across all indexed sessions — but CLIP similarity is nearly flat within one scene (measured top-30 spread: 0.259→0.248), so its ranking only proposes. Each candidate moment is verified by a small detection scan of its source recording; the first confirmed moment is the answer, and where_object is either detector-verified or honestly None.

Where each piece lives in the code:

Concept In the code
record plane (dumb writer + live db path RPC) WorldBeliefRecorder (dimos/perception/worldbelief_recorder.py)
query plane (scan/recall skills, owns belief + models) WorldBeliefModule (dimos/perception/worldbelief_module.py)
stateless scan engine — folds INTO the belief you pass SceneScanner.scan(store, belief, …) (scene_scan.py)
a track / the belief table _Track (slots dataclass: physical / identity / lifecycle field groups) / WorldBelief (world_belief.py)
every tuning constant (measured values) WorldBeliefConfig — blueprint-overridable
embedding gallery (RAM + persistent) _Track.gallery / _GalleryStoreworldbelief_history.db
Q1 — match radius, label override, appearance veto _match_frame()
Q2 — 0.13 m envelope + mint-guard _envelope_neighbours(), checked in _match_frame() / _acquire()
Q3 — gallery match with floor + margin _reacquire_candidate() / _acquire()
Q4 — mint + establishment (3 frames ∧ 1.5 s) _insert() / _hit()
absence (2 depth votes, gallery kept) _vote_absence() + absence.py (Transform-native projection)
viewpoint-diversity trust (tentativeconfirmed) trust_of() — 2 distinct viewpoints

How to Test

dimos --xarm6-ip <ROBOT_IP> run xarm6-worldbelief
# in a second terminal:
dimos mcp call scan -a prompt='["mug","coke can"]'
dimos mcp call recall -a text="mug"

Move an object by hand between scans → same id, basis: reacquired. Remove it → drops from the reply (2-vote absence). Restart the process and scan → same ids, basis: restored. recall returns when/where it was last seen — including from a previous session's recording. While a scan is running, the recording db keeps growing — recording and scanning live in separate worker processes.

@jhengyilin
jhengyilin requested a review from mustafab0 July 9, 2026 00:31
@codecov

codecov Bot commented Jul 9, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 30.04435% with 631 lines in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
dimos/perception/detection/world_belief.py 25.00% 279 Missing ⚠️
dimos/perception/worldbelief_module.py 29.61% 145 Missing ⚠️
dimos/perception/recall.py 18.27% 76 Missing ⚠️
dimos/perception/detection/identity_features.py 17.77% 37 Missing ⚠️
dimos/perception/absence.py 29.72% 26 Missing ⚠️
...os/perception/detection/type/detection3d/object.py 38.46% 24 Missing ⚠️
dimos/perception/detection/detectors/yoloe.py 23.07% 20 Missing ⚠️
dimos/perception/worldbelief_recorder.py 65.45% 19 Missing ⚠️
.../robot/manipulators/xarm/blueprints/worldbelief.py 85.71% 4 Missing ⚠️
dimos/models/embedding/clip.py 0.00% 1 Missing ⚠️
@@            Coverage Diff             @@
##             main    #2665      +/-   ##
==========================================
- Coverage   72.42%   71.82%   -0.60%     
==========================================
  Files        1002     1009       +7     
  Lines       89281    90154     +873     
  Branches     8129     8248     +119     
==========================================
+ Hits        64664    64756      +92     
- Misses      22427    23286     +859     
+ Partials     2190     2112      -78     
Flag Coverage Δ
OS-ubuntu-24.04-arm 64.89% <30.04%> (-0.36%) ⬇️
OS-ubuntu-latest 67.29% <30.04%> (-0.37%) ⬇️
Py-3.10 67.28% <30.04%> (-0.37%) ⬇️
Py-3.11 67.28% <30.04%> (-0.37%) ⬇️
Py-3.12 67.27% <30.04%> (-0.38%) ⬇️
Py-3.13 67.28% <30.04%> (-0.37%) ⬇️
Py-3.14 67.28% <30.04%> (-0.37%) ⬇️
Py-3.14t 67.27% <30.04%> (-0.38%) ⬇️
SelfHosted-macOS ?

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
dimos/robot/all_blueprints.py 100.00% <ø> (ø)
dimos/models/embedding/clip.py 44.64% <0.00%> (ø)
.../robot/manipulators/xarm/blueprints/worldbelief.py 85.71% <85.71%> (ø)
dimos/perception/worldbelief_recorder.py 65.45% <65.45%> (ø)
dimos/perception/detection/detectors/yoloe.py 60.20% <23.07%> (+8.98%) ⬆️
...os/perception/detection/type/detection3d/object.py 36.89% <38.46%> (+12.80%) ⬆️
dimos/perception/absence.py 29.72% <29.72%> (ø)
dimos/perception/detection/identity_features.py 17.77% <17.77%> (ø)
dimos/perception/recall.py 18.27% <18.27%> (ø)
dimos/perception/worldbelief_module.py 29.61% <29.61%> (ø)
... and 1 more

... and 39 files with indirect coverage changes

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@TomCC7 TomCC7 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shape is good, left some comments 👍

Comment thread dimos/perception/worldbelief_module.py
Comment thread dimos/perception/detection/world_belief.py
Comment thread dimos/perception/worldbelief_module.py Outdated
Comment thread dimos/perception/worldbelief_module.py Outdated
Comment thread dimos/perception/worldbelief_module.py Outdated
  - finish Recorder/query ownership and serialize shared model state
  - use global DINO re-ID with ambiguity abstention and cross-session galleries
  - publish  3D snapshots through the xArm Rerun validation blueprint
  - keep PickAndPlace, navigation, and shared infrastructure out of scope
Comment thread dimos/perception/detection/world_belief.py Outdated
Comment thread dimos/perception/detection/world_belief.py
@jhengyilin

jhengyilin commented Jul 11, 2026

Copy link
Copy Markdown
Contributor Author

WorldBelief — pulled perception with cross-session memory

This supersedes the earlier spatial-radius/Q1–Q4 overview. The final implementation uses
global DINO appearance matching for identity. 3D evidence is used for current geometry,
viewpoint trust, and absence—not as a movement-distance identity heuristic.

flowchart TB
    CAM["RealSense<br/>color + depth + camera pose"] --> REC["WorldBeliefRecorder<br/>record plane"]
    REC --> SESSION[("timestamped session DB<br/>raw evidence")]
    SESSION -- "scan / recall<br/>on demand" --> WB["WorldBeliefModule<br/>query plane"]
    HISTORY[("worldbelief_history.db<br/>DINO galleries + CLIP index")] <--> WB
    WB --> REPLY["scan result<br/>name · full ID · xyz · trust · basis"]
    WB --> OBJECTS["objects snapshot"]
    WB --> VIS["detections_3d · pointcloud"]
    CAM --> RERUN["Rerun validation"]
    VIS --> RERUN
    OBJECTS -. "future integration PR" .-> DOWNSTREAM["PickAndPlace / navigation"]
Loading

Two modules

  • WorldBeliefRecorder is the record plane. It continuously writes RGB-D, camera info,
    joint state, and resolved pose evidence to a new timestamped SQLite recording for each run.
  • WorldBeliefModule is the query plane. It owns the YOLO-E/DINO/CLIP model instances, the
    mutable WorldBelief fold, persistent history, and the scan/recall skills. Scan and
    recall share one instance lock; published snapshots are copied from mutable belief state.

The Recorder performs no detection. WorldBeliefModule warms YOLO-E and DINO at startup so
scan is ready; CLIP remains lazy until the first recall.

One scan call

  1. The xArm blueprint has no built-in vocabulary, so each call supplies a non-empty prompt.
  2. The first call reads at most window seconds of history. Later calls fold every eligible
    frame after the belief watermark, so window does not limit cross-scan catch-up.
  3. Pose deltas select coarse stationary frames and denser moving-camera frames. The xArm
    blueprint uses 4 Hz while stationary; moving sampling is 7.5 Hz. First and last eligible
    frames are retained.
  4. YOLO-E segments prompted objects, RGB-D and TF lift them into world-frame Objects, and
    DINO embeds each accepted crop.
  5. Frames fold chronologically into the module-owned belief. If RGB-D/TF evidence cannot reach
    the recording end, the call fails instead of returning a stale success.
  6. The module publishes Object, Detection3DArray, and aggregate point-cloud snapshots after
    releasing the engine lock.

Identity and long-term memory

flowchart TB
    DET["lifted detection<br/>label + current 3D geometry + DINO"] --> CAND["candidate identities<br/>RAM tracks + retrieved persisted galleries"]
    CAND --> ASSIGN["global one-to-one<br/>DINO cosine assignment"]
    ASSIGN -- "clear winner" --> MATCH["tracked / reacquired / restored"]
    ASSIGN -- "near tie" --> ABSTAIN["abstain<br/>do not guess or mint"]
    ASSIGN -- "no plausible identity" --> NEW["new candidate ID"]
    NEW --> EST["established after<br/>3 frames AND 1.5 s"]
Loading
  • Same-label matches require cosine ≥ 0.5. A label change requires the stronger ≥ 0.8
    appearance override.
  • The assignment is global, so two observations cannot claim the same identity in one frame.
    A rival within the 0.05 margin is ambiguous and is not silently converted into a new ID.
  • 3D position does not arbitrate identity. A moved object may retain its ID after an arbitrary
    gap when its DINO evidence is distinctive; ambiguous lookalikes remain unresolved.
  • Established tracks are tentative after one viewpoint and confirmed after two sufficiently
    distinct viewpoints. This is identity-evidence status, not manipulation or collision safety.
  • Partial or implausibly enlarged observations may refresh the visible center without replacing
    trusted shape geometry.
  • An object becomes absent only after two depth frames see through its expected location.
    Occlusion and an out-of-view camera provide no absence vote.
  • Established identities persist as bounded, diverse DINO galleries in
    worldbelief_history.db. Galleries are namespaced by exact checkpoint and embedding size, so
    incompatible model spaces are not mixed after a configuration change.

Identity basis in the returned object describes the latest evidence:

Basis Meaning
new newly created candidate
tracked matched in the next folded frame
reacquired matched to an in-memory identity after a gap or absence
restored matched to an identity persisted by an earlier process/session

recall

recall(text) incrementally indexes immutable session frames with CLIP into the same history
database. CLIP ranks candidate moments across sessions; it is not trusted as localization.
Top moments are reopened from their source recordings and checked with a small YOLO-E + DINO
scan. The response includes the recording, timestamp, camera pose, uncalibrated CLIP similarity,
and detector-confirmed where_object. If no candidate is confirmed, where_object is None.

Configuration

Deployment policy stays in the xArm blueprint; the generic perception modules contain no xArm
paths or vocabulary. The main model and sampling choices are blueprint fields:

WorldBeliefModule.blueprint(
    scan_prompts=[],
    stationary_hz=4.0,
    yoloe_model_name="yoloe-11l-seg.pt",
    dino_model_name="facebook/dinov2-base",
    clip_model_name="openai/clip-vit-base-patch32",
)

Persistent gallery and CLIP streams are isolated by checkpoint ID, so changing DINO or CLIP
does not reuse incompatible embeddings.

How to test

# terminal 1
uv run dimos --xarm6-ip <ROBOT_IP> run xarm6-worldbelief

# terminal 2: an explicit prompt is required
uv run dimos mcp call scan -a prompt='["coke can", "mug", "yellow can"]'
uv run dimos mcp call recall -a text="mug"

Expected checks:

  • repeated scans keep a distinctive object's full ID;
  • a moved or previously absent object reports basis: reacquired;
  • after restart, a gallery match reports the same full ID with basis: restored;
  • two novel camera viewpoints promote an established identity from tentative to confirmed;
  • Rerun shows live RGB/depth plus published 3D detections and point cloud.

Comment thread dimos/perception/detection/world_belief.py
mustafab0
mustafab0 previously approved these changes Jul 11, 2026
Comment thread dimos/perception/detection/world_belief.py
Comment thread dimos/perception/detection/world_belief.py Outdated
auto-merge was automatically disabled July 13, 2026 20:59

Head branch was pushed to by a user without write access

Comment thread dimos/perception/worldbelief_module.py Outdated
@jhengyilin

jhengyilin commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

xArm6 WorldBelief — pulled perception with cross-session memory

This supersedes the earlier spatial-radius/Q1–Q4 overview. The final implementation uses
global DINO appearance matching for identity. 3D evidence is used for current geometry,
viewpoint trust, and absence—not as a movement-distance identity heuristic.

flowchart TB
    CAM["RealSense<br/>color + depth + camera pose"] --> REC["WorldBeliefRecorder<br/>record plane"]
    REC --> SESSION[("timestamped session DB<br/>raw evidence")]
    SESSION -- "scan / recall<br/>on demand" --> WB["WorldBeliefModule<br/>query plane"]
    HISTORY[("worldbelief_history.db<br/>DINO galleries + CLIP index")] <--> WB
    WB --> REPLY["scan result<br/>established + unresolved observations"]
    WB --> OBJECTS["established objects snapshot"]
    WB --> VIS["established detections_3d · pointcloud"]
    CAM --> RERUN["Rerun validation"]
    VIS --> RERUN
    OBJECTS -. "future integration PR" .-> DOWNSTREAM["PickAndPlace / navigation"]
Loading

Two modules

  • WorldBeliefRecorder is the record plane. It continuously writes RGB-D, camera info,
    joint state, and resolved pose evidence to a new timestamped SQLite recording for each run.
  • WorldBeliefModule is the query plane. It owns the YOLO-E/DINO/CLIP model instances, the
    mutable WorldBelief fold, persistent history, and the scan/recall skills. Scan and
    recall share one instance lock.

The Recorder performs no detection. WorldBeliefModule warms YOLO-E and DINO at startup so
scan is ready; CLIP remains lazy until the first recall.

scan

  1. The xArm blueprint has no built-in vocabulary, so each call supplies a non-empty prompt.
  2. The first call reads at most window seconds of history. Later calls fold every eligible
    frame after the belief watermark, so window does not limit cross-scan catch-up.
  3. Pose deltas select coarse stationary frames and denser moving-camera frames. The xArm
    blueprint uses 4 Hz while stationary; moving sampling is 7.5 Hz. First and last eligible
    frames are retained.
  4. YOLO-E segments prompted objects, RGB-D and TF lift them into configured-target-frame
    Objects, and DINO embeds each accepted crop.
  5. Frames fold chronologically into the module-owned belief. If RGB-D/TF evidence cannot reach
    the recording end, the call fails instead of returning a stale success.
  6. The scan result reports established and unresolved observations. After releasing the engine
    lock, the module publishes established Object, Detection3DArray, and aggregate
    point-cloud snapshots.

Identity and long-term memory

flowchart TB
    DET["lifted detection<br/>label + current 3D geometry<br/>+ DINO when available"] --> CAND["candidate identities<br/>RAM tracks + retrieved persisted galleries"]
    CAND --> ASSIGN["global one-to-one<br/>DINO cosine assignment"]
    ASSIGN -- "clear winner" --> MATCH["tracked / reacquired / restored"]
    ASSIGN -- "near tie or missing embedding<br/>for a known label" --> ABSTAIN["retain unresolved observation<br/>do not guess or persist identity"]
    ASSIGN -- "no plausible identity" --> NEW["new candidate ID"]
    NEW --> EST["established after<br/>3 frames AND 1.5 s"]
Loading
  • Same-label matches require cosine ≥ 0.5. A label change requires the stronger ≥ 0.8
    appearance override.
  • The assignment is global, so two observations cannot claim the same identity in one frame.
    A rival within the 0.05 margin is ambiguous and is not silently converted into a new ID.
  • 3D position does not arbitrate identity. A moved object may retain its ID after an arbitrary
    gap when its DINO evidence is distinctive. Ambiguous or same-label embedding-less detections
    remain visible in scan metadata with basis: unresolved, but do not enter identity tracks,
    galleries, or trusted publications.
  • Unestablished candidates older than five seconds are excluded before association, so stale
    support cannot establish an expired identity.
  • Established tracks are tentative after one viewpoint and confirmed after two sufficiently
    distinct viewpoints. This is identity-evidence status, not manipulation or collision safety.
  • Partial or implausibly enlarged observations may refresh the visible center without replacing
    trusted shape geometry.
  • An object becomes absent only after two depth frames see through its expected location.
    Occlusion and an out-of-view camera provide no absence vote.
  • Established identities persist as bounded, diverse DINO galleries in
    worldbelief_history.db. Galleries are namespaced by exact checkpoint and embedding size, so
    incompatible model spaces are not mixed after a configuration change.

Identity basis in scan results describes the latest evidence:

Basis Meaning
new newly created candidate
tracked matched in the next folded frame
reacquired matched to an in-memory identity after a gap or absence
restored matched to an identity persisted by an earlier process/session
unresolved current physical observation without a defensible durable identity

recall

recall(text) incrementally indexes immutable session frames with CLIP into the same history
database. Frames are processed chronologically and sampled into stable time buckets; the source
watermark advances only after an indexing top-up completes.

CLIP ranks candidate moments across sessions but is not trusted as localization. Distinct top
moments are reopened from their source recordings and checked with YOLO-E + DINO over a small
temporal window. The response includes the recording, timestamp, camera position, uncalibrated
CLIP similarity, and detector-confirmed where_object. If no candidate is confirmed, recall
still returns the best CLIP-ranked moment with where_object: None. If the index has no matching
moment, recall returns None.

Configuration

Deployment policy stays in the xArm blueprint; the generic perception modules contain no xArm
paths or vocabulary. The main model and sampling choices are blueprint fields:

WorldBeliefModule.blueprint(
    scan_prompts=[],
    stationary_hz=4.0,
    yoloe_model_name="yoloe-11l-seg.pt",
    dino_model_name="facebook/dinov2-base",
    clip_model_name="openai/clip-vit-base-patch32",
)

Persistent gallery and CLIP streams are isolated by checkpoint ID, so changing DINO or CLIP
does not reuse incompatible embeddings.

How to test

# terminal 1
uv run dimos --xarm6-ip <ROBOT_IP> run xarm6-worldbelief

# terminal 2: an explicit prompt is required
uv run dimos mcp call scan -a prompt='["coke can", "mug", "yellow can"]'
uv run dimos mcp call recall -a text="mug"

Expected checks:

  • repeated scans keep a distinctive object's full ID;
  • unresolved observations remain visible in scan results but stay out of trusted publications;
  • a moved or previously absent object reports basis: reacquired;
  • after restart, a gallery match reports the same full ID with basis: restored;
  • two novel camera viewpoints promote an established identity from tentative to confirmed;
  • unconfirmed recall still returns the remembered moment with where_object: None;
  • Rerun shows live RGB/depth plus published 3D detections and point cloud.

@mustafab0
mustafab0 added this pull request to the merge queue Jul 15, 2026
Merged via the queue into dimensionalOS:main with commit ce2c71a Jul 15, 2026
23 of 25 checks passed
T-Markus-Liang added a commit to T-Markus-Liang/dimos_m20 that referenced this pull request Jul 25, 2026
* fix: better save path for nav recordings (dimensionalOS#2796)

* feat(transport): rust zenoh support and api refactor (dimensionalOS#2753)

* feat(arduino): add ArduinoModule with full arduino sim (and real arduino) support (dimensionalOS#1879)

* Swastika/docs chore/cleanup and fix links (dimensionalOS#2832)

* Velocity API (dimensionalOS#2859)

* holonomic trajectory controller (dimensionalOS#2697)

Co-authored-by: danvi <bogdan@dimensionalos.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: leshy <lesh@sysphere.org>

* fix(config): merge nested module overrides (dimensionalOS#2829)

* fix(mls-planner): macOS fix, link pyo3 cdylib (dimensionalOS#2836)

* revert(voxels): drop unused time_window mode from VoxelGrid (dimensionalOS#2845)

* Revert "feat(arduino): add ArduinoModule with full arduino sim (and r… (dimensionalOS#2868)

* feat: external blueprint registration (dimensionalOS#2517)

* Fix test_basic_deployment in CI (dimensionalOS#2767)

* Run CI on merge queue (dimensionalOS#2936)

* fix: disallow unused _ variables (dimensionalOS#2928)

* Add Galaxea A1Z arm in simulation (dimensionalOS#2947)

Co-authored-by: cc <cc7@duck.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: cc <55869557+TomCC7@users.noreply.github.com>

* Initial  xArm6 WorldBelief perception stack (dimensionalOS#2665)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* feat(g1-groot): navigation on the real G1 (Point-LIO + raytracing costmap) (dimensionalOS#2861)

Co-authored-by: Jeff Hykin <jeff.hykin@gmail.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* Swastika/docs/navigation relocalization (dimensionalOS#2764)

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(teleop): rename Hosted Teleop page to Remote Teleop (dimensionalOS#2967)

* feat(hosted-teleop): Go2 teleoperation over Cloudflare broker (dimensionalOS#2798)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: spomichter <pomichterstash@gmail.com>
Co-authored-by: Sam Bull <git@sambull.org>
Co-authored-by: Paul Nechifor <paul@nechifor.net>

* DimSim scene editing/authoring in JS + moving inside dimos (dimensionalOS#2187)

Co-authored-by: Paul Nechifor <paul@nechifor.net>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(unitree): marshal stop_movement zero-twist onto the loop thread (dimensionalOS#2977)

* chore: bump version to 0.0.14b1 (beta pre-release) (dimensionalOS#2971)

* add latency graph and description to hosted teleop page (dimensionalOS#2982)

* docs(hosted-teleop): operator how-to + config/architecture refresh (dimensionalOS#2945)

Co-authored-by: stash <pomichterstash@gmail.com>

* serve LFS media via dimos-docs-assets so it renders on mintlify (dimensionalOS#2973)

* style(docs): fix trailing whitespace breaking lint on main (dimensionalOS#2991)

* add dimTELE banner (dimensionalOS#2984)

Co-authored-by: stash <pomichterstash@gmail.com>

* feat: blueprint namespaces (dimensionalOS#2725)

* fix: delete dead dimsim code (dimensionalOS#2980)

Co-authored-by: leshy <lesh@sysphere.org>

* fix: run all tests locally (dimensionalOS#2995)

* add gitHub community files for contributors and AI-assisted development (dimensionalOS#2347)

* fix: large file (dimensionalOS#3003)

* Fix/ivan/3d planner voxel colors (dimensionalOS#2983)

* feat: ban `__new__` (dimensionalOS#3009)

* fix: remove removed cibuildwheel enable group breaking release builds (dimensionalOS#3007)

* [Backport release/0.0.14b1] fix: remove removed cibuildwheel enable group breaking release builds (dimensionalOS#3013)

Co-authored-by: stash <pomichterstash@gmail.com>

* build(deps): bump the actions group across 1 directory with 6 updates (dimensionalOS#3056)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(manipulation): stabilize agentic xArm simulation (dimensionalOS#2999)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Paul Nechifor <paul@nechifor.net>

* fewer fields (dimensionalOS#3052)

* Build all GC Roots into Cachix (dimensionalOS#2866)

* Control coordinator refactor to add declarative task (dimensionalOS#2959)

Co-authored-by: Paul Nechifor <paul@nechifor.net>
Co-authored-by: leshy <lesh@sysphere.org>

* feat(hosted-teleop): Arm hosted teleoperation over the Cloudflare broker (dimensionalOS#3004)

* feat(control): removes frozen set of input streams - now Any Input stream can be routed to the control coordinator (dimensionalOS#3110)

* chore: add OpenYAM URDF support (dimensionalOS#3049)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* feat: add Viser robot mesh display options (dimensionalOS#3112)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* add links to cards (dimensionalOS#3065)

* [Tests] Add unit tests for SequentialIds (dimensionalOS#3060)

* feat(web): PR 1 - Deno (dimensionalOS#3042)

* Ivan/feat/go2zenoh (dimensionalOS#3141)

* feat: Piper teleop polishing (dimensionalOS#3101)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* feat(hosted-teleop): auto-select operator view via robot_type broker config (dimensionalOS#3144)

* chore: remove get_project_root (dimensionalOS#3131)

* Add backport label to Dependabot PRs and check docker weekly (dimensionalOS#3067)

* fix memory issues DIM-1326 (dimensionalOS#3149)

Co-authored-by: danvi <bogdan@dimensionalos.com>

* docs(drone): fix dead pre-built RosettaDrone APK link (dimensionalOS#2546)

Co-authored-by: Paul Nechifor <paul@nechifor.net>

* feat: manipulation planning group (dimensionalOS#2645)

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* Go2 holonomic Pose tracker trajectory controller (dimensionalOS#2948)

Co-authored-by: Ivan Nikolic <lesh@sysphere.org>

* feat(web): PR 2 - Relay (dimensionalOS#3043)

* ai disclose rule update (dimensionalOS#3028)

* Replace httpx with aiohttp (dimensionalOS#2974)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Paul Nechifor <paul@nechifor.net>

* fix(memory2): recorder ingress reception_ts + poseless streams (dimensionalOS#2927)

* ci: smoke-build a wheel on PRs touching release build config (dimensionalOS#3008)

* Fix typos and grammar (dimensionalOS#2726)

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
Co-authored-by: Paul Nechifor <paul@nechifor.net>

* feat: visualize manipulation obstacles (dimensionalOS#3108)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* feat(web): PR 3 - Python client (dimensionalOS#3044)

* feat(web): PR 4 - E2E (dimensionalOS#3045)

* Swastika/chore/readme update (dimensionalOS#3027)

* Persist dependencies on disk (dimensionalOS#3167)

* ci: label first-time contributor PRs (dimensionalOS#3171)

* Add @Dreamsorcerer as global codeowner (dimensionalOS#3165)

* feat(m20): integrate official MuJoCo model

* docs(m20): add official MuJoCo integration guide

* docs(m20): add English guide and fidelity review

* docs(m20): make English guide primary

* docs(m20): document lateral and yaw limitation

* docs(m20): add MuJoCo test matrix

* docs(m20): consolidate test matrix into guides

* docs(m20): clarify guide reading order

* fix(memory2): preserve recorder ingress timing

* fix(memory2): avoid undefined frame in pose warning

* fix(config): merge nested module overrides (dimensionalOS#2829)

(cherry picked from commit 66ce423)

* style: format Zenoh service

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Andrew Lauer <69774903+aclauer@users.noreply.github.com>
Co-authored-by: Jeff Hykin <jeff.hykin@gmail.com>
Co-authored-by: Swastika <44317853+swstica@users.noreply.github.com>
Co-authored-by: Dan Vi <bogwi@tutamail.com>
Co-authored-by: danvi <bogdan@dimensionalos.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: leshy <lesh@sysphere.org>
Co-authored-by: cc <55869557+TomCC7@users.noreply.github.com>
Co-authored-by: Paul Nechifor <paul@nechifor.net>
Co-authored-by: Sam Bull <git@sambull.org>
Co-authored-by: Krishna_Hundekari <113392023+KrishnaH96@users.noreply.github.com>
Co-authored-by: cc <cc7@duck.com>
Co-authored-by: Jheng-Yi Lin <75511000+jhengyilin@users.noreply.github.com>
Co-authored-by: Pim Van den Bosch <49974392+Nabla7@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: stash <pomichterstash@gmail.com>
Co-authored-by: ruthwikdasyam <63036454+ruthwikdasyam@users.noreply.github.com>
Co-authored-by: Viswajit <39920874+Viswa4599@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dimos-release-bot[bot] <4143859+dimos-release-bot[bot]@users.noreply.github.com>
Co-authored-by: Mustafa Bhadsorawala <39084056+mustafab0@users.noreply.github.com>
Co-authored-by: 起岚 <155608604+xiaoyaoqilan@users.noreply.github.com>
Co-authored-by: Daniel Eneh <72442267+Danny024@users.noreply.github.com>
Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
T-Markus-Liang added a commit to T-Markus-Liang/dimos_m20 that referenced this pull request Jul 25, 2026
* fix: better save path for nav recordings (dimensionalOS#2796)

* feat(transport): rust zenoh support and api refactor (dimensionalOS#2753)

* feat(arduino): add ArduinoModule with full arduino sim (and real arduino) support (dimensionalOS#1879)

* Swastika/docs chore/cleanup and fix links (dimensionalOS#2832)

* Velocity API (dimensionalOS#2859)

* holonomic trajectory controller (dimensionalOS#2697)

Co-authored-by: danvi <bogdan@dimensionalos.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: leshy <lesh@sysphere.org>

* fix(config): merge nested module overrides (dimensionalOS#2829)

* fix(mls-planner): macOS fix, link pyo3 cdylib (dimensionalOS#2836)

* revert(voxels): drop unused time_window mode from VoxelGrid (dimensionalOS#2845)

* Revert "feat(arduino): add ArduinoModule with full arduino sim (and r… (dimensionalOS#2868)

* feat: external blueprint registration (dimensionalOS#2517)

* Fix test_basic_deployment in CI (dimensionalOS#2767)

* Run CI on merge queue (dimensionalOS#2936)

* fix: disallow unused _ variables (dimensionalOS#2928)

* Add Galaxea A1Z arm in simulation (dimensionalOS#2947)

Co-authored-by: cc <cc7@duck.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: cc <55869557+TomCC7@users.noreply.github.com>

* Initial  xArm6 WorldBelief perception stack (dimensionalOS#2665)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* feat(g1-groot): navigation on the real G1 (Point-LIO + raytracing costmap) (dimensionalOS#2861)

Co-authored-by: Jeff Hykin <jeff.hykin@gmail.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* Swastika/docs/navigation relocalization (dimensionalOS#2764)

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(teleop): rename Hosted Teleop page to Remote Teleop (dimensionalOS#2967)

* feat(hosted-teleop): Go2 teleoperation over Cloudflare broker (dimensionalOS#2798)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: spomichter <pomichterstash@gmail.com>
Co-authored-by: Sam Bull <git@sambull.org>
Co-authored-by: Paul Nechifor <paul@nechifor.net>

* DimSim scene editing/authoring in JS + moving inside dimos (dimensionalOS#2187)

Co-authored-by: Paul Nechifor <paul@nechifor.net>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(unitree): marshal stop_movement zero-twist onto the loop thread (dimensionalOS#2977)

* chore: bump version to 0.0.14b1 (beta pre-release) (dimensionalOS#2971)

* add latency graph and description to hosted teleop page (dimensionalOS#2982)

* docs(hosted-teleop): operator how-to + config/architecture refresh (dimensionalOS#2945)

Co-authored-by: stash <pomichterstash@gmail.com>

* serve LFS media via dimos-docs-assets so it renders on mintlify (dimensionalOS#2973)

* style(docs): fix trailing whitespace breaking lint on main (dimensionalOS#2991)

* add dimTELE banner (dimensionalOS#2984)

Co-authored-by: stash <pomichterstash@gmail.com>

* feat: blueprint namespaces (dimensionalOS#2725)

* fix: delete dead dimsim code (dimensionalOS#2980)

Co-authored-by: leshy <lesh@sysphere.org>

* fix: run all tests locally (dimensionalOS#2995)

* add gitHub community files for contributors and AI-assisted development (dimensionalOS#2347)

* fix: large file (dimensionalOS#3003)

* Fix/ivan/3d planner voxel colors (dimensionalOS#2983)

* feat: ban `__new__` (dimensionalOS#3009)

* fix: remove removed cibuildwheel enable group breaking release builds (dimensionalOS#3007)

* [Backport release/0.0.14b1] fix: remove removed cibuildwheel enable group breaking release builds (dimensionalOS#3013)

Co-authored-by: stash <pomichterstash@gmail.com>

* build(deps): bump the actions group across 1 directory with 6 updates (dimensionalOS#3056)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(manipulation): stabilize agentic xArm simulation (dimensionalOS#2999)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Paul Nechifor <paul@nechifor.net>

* fewer fields (dimensionalOS#3052)

* Build all GC Roots into Cachix (dimensionalOS#2866)

* Control coordinator refactor to add declarative task (dimensionalOS#2959)

Co-authored-by: Paul Nechifor <paul@nechifor.net>
Co-authored-by: leshy <lesh@sysphere.org>

* feat(hosted-teleop): Arm hosted teleoperation over the Cloudflare broker (dimensionalOS#3004)

* feat(control): removes frozen set of input streams - now Any Input stream can be routed to the control coordinator (dimensionalOS#3110)

* chore: add OpenYAM URDF support (dimensionalOS#3049)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* feat: add Viser robot mesh display options (dimensionalOS#3112)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* add links to cards (dimensionalOS#3065)

* [Tests] Add unit tests for SequentialIds (dimensionalOS#3060)

* feat(web): PR 1 - Deno (dimensionalOS#3042)

* Ivan/feat/go2zenoh (dimensionalOS#3141)

* feat: Piper teleop polishing (dimensionalOS#3101)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* feat(hosted-teleop): auto-select operator view via robot_type broker config (dimensionalOS#3144)

* chore: remove get_project_root (dimensionalOS#3131)

* Add backport label to Dependabot PRs and check docker weekly (dimensionalOS#3067)

* fix memory issues DIM-1326 (dimensionalOS#3149)

Co-authored-by: danvi <bogdan@dimensionalos.com>

* docs(drone): fix dead pre-built RosettaDrone APK link (dimensionalOS#2546)

Co-authored-by: Paul Nechifor <paul@nechifor.net>

* feat: manipulation planning group (dimensionalOS#2645)

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* Go2 holonomic Pose tracker trajectory controller (dimensionalOS#2948)

Co-authored-by: Ivan Nikolic <lesh@sysphere.org>

* feat(web): PR 2 - Relay (dimensionalOS#3043)

* ai disclose rule update (dimensionalOS#3028)

* Replace httpx with aiohttp (dimensionalOS#2974)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Paul Nechifor <paul@nechifor.net>

* fix(memory2): recorder ingress reception_ts + poseless streams (dimensionalOS#2927)

* ci: smoke-build a wheel on PRs touching release build config (dimensionalOS#3008)

* Fix typos and grammar (dimensionalOS#2726)

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
Co-authored-by: Paul Nechifor <paul@nechifor.net>

* feat: visualize manipulation obstacles (dimensionalOS#3108)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

* feat(web): PR 3 - Python client (dimensionalOS#3044)

* feat(web): PR 4 - E2E (dimensionalOS#3045)

* Swastika/chore/readme update (dimensionalOS#3027)

* Persist dependencies on disk (dimensionalOS#3167)

* ci: label first-time contributor PRs (dimensionalOS#3171)

* Add @Dreamsorcerer as global codeowner (dimensionalOS#3165)

* feat: add RoboPlan multi-robot planning (dimensionalOS#3155)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Andrew Lauer <69774903+aclauer@users.noreply.github.com>
Co-authored-by: Jeff Hykin <jeff.hykin@gmail.com>
Co-authored-by: Swastika <44317853+swstica@users.noreply.github.com>
Co-authored-by: Dan Vi <bogwi@tutamail.com>
Co-authored-by: danvi <bogdan@dimensionalos.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: leshy <lesh@sysphere.org>
Co-authored-by: cc <55869557+TomCC7@users.noreply.github.com>
Co-authored-by: Paul Nechifor <paul@nechifor.net>
Co-authored-by: Sam Bull <git@sambull.org>
Co-authored-by: Krishna_Hundekari <113392023+KrishnaH96@users.noreply.github.com>
Co-authored-by: cc <cc7@duck.com>
Co-authored-by: Jheng-Yi Lin <75511000+jhengyilin@users.noreply.github.com>
Co-authored-by: Pim Van den Bosch <49974392+Nabla7@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: stash <pomichterstash@gmail.com>
Co-authored-by: ruthwikdasyam <63036454+ruthwikdasyam@users.noreply.github.com>
Co-authored-by: Viswajit <39920874+Viswa4599@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dimos-release-bot[bot] <4143859+dimos-release-bot[bot]@users.noreply.github.com>
Co-authored-by: Mustafa Bhadsorawala <39084056+mustafab0@users.noreply.github.com>
Co-authored-by: 起岚 <155608604+xiaoyaoqilan@users.noreply.github.com>
Co-authored-by: Daniel Eneh <72442267+Danny024@users.noreply.github.com>
Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
leshy added a commit that referenced this pull request Jul 29, 2026
This reverts commit ce2c71a, except for
dimos/models/embedding/dino.py, which is kept: DINOModel is a standalone
EmbeddingModel whose only dependencies (dimos.models.base,
dimos.models.embedding.base, dimos.msgs.sensor_msgs.Image) predate the
reverted commit.

Conflict in dimos/robot/all_blueprints.py resolved by keeping the
wrist-camera entry added after the merge; only the two world-belief
registry entries are removed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants