Skip to content

fix: register map/replay clouds via frame_id + TF tree#2690

Draft
jeff-hykin wants to merge 7 commits into
mainfrom
jeff/fix/map
Draft

fix: register map/replay clouds via frame_id + TF tree#2690
jeff-hykin wants to merge 7 commits into
mainfrom
jeff/fix/map

Conversation

@jeff-hykin

@jeff-hykin jeff-hykin commented Jul 1, 2026

Copy link
Copy Markdown
Member

Vibed extraction of some of my existing map/db changes. Will check soon.

Drive PointCloud/Odometry world-registration off each message's frame_id
instead of a baked-in per-observation pose. World-frame messages render
directly; non-world frames are looked up in the recording's `tf` stream via
a read-only DbTf (no loop closure) and skipped with a warning if unplaceable.

DbTf uses an unbounded time tolerance so once-published static transforms
(mounts, world<-map) latch across the whole recording, while densely sampled
dynamic transforms still resolve to their nearest sample.
@codecov

codecov Bot commented Jul 1, 2026

Copy link
Copy Markdown

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
2092 1 2091 160
View the top 1 failed test(s) by shortest run time
dimos.memory2.test_store.TestBlobLoading::test_sqlite_summary_skips_unresolvable_types
Stack Traces | 0.075s run time
self = <dimos.memory2.test_store.TestBlobLoading object at 0xff65cb0f9d60>
tmp_path = PosixPath('.../pytest-0/popen-gw1/test_sqlite_summary_skips_unre0')

    def test_sqlite_summary_skips_unresolvable_types(self, tmp_path) -> None:
        """summary() skips streams whose payload class can't be imported.
    
        Recordings may reference Python types not present in this checkout;
        those must not crash a summary, but explicitly requesting one still errors.
        """
        import json
        import sqlite3
    
        from dimos.memory2.store.sqlite import SqliteStore
        from dimos.msgs.std_msgs.Int32 import Int32
    
        db = str(tmp_path / "unknown_type.db")
>       with SqliteStore(path=db) as store:

Int32      = <class 'dimos.msgs.std_msgs.Int32.Int32'>
SqliteStore = <class 'dimos.memory2.store.sqlite.SqliteStore'>
db         = '.../pytest-0/popen-gw1/test_sqlite_summary_skips_unre0/unknown_type.db'
json       = <module 'json' from '....../usr/lib/python3.12/json/__init__.py'>
self       = <dimos.memory2.test_store.TestBlobLoading object at 0xff65cb0f9d60>
sqlite3    = <module 'sqlite3' from '....../usr/lib/python3.12/sqlite3/__init__.py'>
tmp_path   = PosixPath('.../pytest-0/popen-gw1/test_sqlite_summary_skips_unre0')

dimos/memory2/test_store.py:290: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../memory2/store/sqlite.py:65: in __init__
    self._registry_conn = self._open_connection()
        __class__  = <class 'dimos.memory2.store.sqlite.SqliteStore'>
        kwargs     = {'path': '.../pytest-0/popen-gw1/test_sqlite_summary_skips_unre0/unknown_type.db'}
        parent     = '.../pytest-0/popen-gw1/test_sqlite_summary_skips_unre0'
        self       = <dimos.memory2.store.sqlite.SqliteStore object at 0xff65c208e120>
.../memory2/store/sqlite.py:70: in _open_connection
    disposable, connection = open_disposable_sqlite_connection(self.config.path)
        self       = <dimos.memory2.store.sqlite.SqliteStore object at 0xff65c208e120>
.../memory2/utils/sqlite.py:43: in open_disposable_sqlite_connection
    conn = open_sqlite_connection(path)
        path       = '.../pytest-0/popen-gw1/test_sqlite_summary_skips_unre0/unknown_type.db'
.../memory2/utils/sqlite.py:31: in open_sqlite_connection
    sqlite_vec.load(conn)
        conn       = <sqlite3.Connection object at 0xff65c20a0a90>
        path       = '.../pytest-0/popen-gw1/test_sqlite_summary_skips_unre0/unknown_type.db'
        sqlite_vec = <module 'sqlite_vec' from '.../dimos/dimos/.venv/lib/python3.12....../site-packages/sqlite_vec/__init__.py'>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

conn = <sqlite3.Connection object at 0xff65c20a0a90>

    def load(conn: sqlite3.Connection)  -> None:
      """ Load the sqlite-vec SQLite extension into the given database connection. """
    
>     conn.load_extension(loadable_path())
E     sqlite3.OperationalError: .../dimos/dimos/.venv/lib/python3.12.../site-packages/sqlite_vec/vec0.so: wrong ELF class: ELFCLASS32

conn       = <sqlite3.Connection object at 0xff65c20a0a90>

.venv/lib/python3.12....../site-packages/sqlite_vec/__init__.py:17: OperationalError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

…er loop)

Regenerated pointlio_lidar + pointlio_odometry via pcap_to_db --rate 2.0 on
china_office.pcap, timestamps re-anchored to the recording epoch and tf tree
rebuilt (static mounts + odom->base_link). Reproduces the known-good __rate2
trajectory; 2x packs denser scans per Point-LIO wall-clock accumulation window
than 1x, yielding a tighter loop closure.
Recordings can reference Python classes not present in the current
checkout. summary/replay now warn and skip those streams instead of
crashing; requesting an unresolvable stream by name still raises.
Remove the 4 ground-truth pointlio streams (all worse than the 1.5x
replay), copy the six surf*/map* config runs' odometry from the grid
sweep, and align every pointlio_odometry* stream (including the __rate*
variants) to the canonical recording anchor so they overlay the tf tree
and lidar.
pointlio_odometry, tf, and pointlio_lidar are pulled from the 1x
regen (unfrozen odom, correctly-recorded 5-edge tf tree) and shifted
onto the June-12 data clock so they align with the kept color_image /
gtsam_odom / raw_april_tags streams. Intermediate checkpoint before PGO.
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.

1 participant