Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
214 commits
Select commit Hold shift + click to select a range
0f50b68
add recorder
jeff-hykin Jun 1, 2026
f172f5a
frame fix
jeff-hykin Jun 1, 2026
0a74a33
add max_velocity
jeff-hykin Jun 1, 2026
63070e9
refactor: extract FastLio2Recorder into its own module
jeff-hykin Jun 1, 2026
9afdeb4
temp go2 helper
jeff-hykin Jun 2, 2026
20a75a8
better tcpdump cleanup
jeff-hykin Jun 2, 2026
c6f2813
record with transform frames
jeff-hykin Jun 3, 2026
6049881
feat: go2 offline recording post-process + apriltag quality filtering
jeff-hykin Jun 3, 2026
d038390
-
jeff-hykin Jun 3, 2026
b77ec1a
feat: positional target + most-recent-recording default for go2 post-…
jeff-hykin Jun 3, 2026
67c3338
clean and add backup stream
jeff-hykin Jun 3, 2026
aadba8c
Merge branch 'jeff/feat/go2_record_clean' of github.com:dimensionalOS…
jeff-hykin Jun 3, 2026
ad76b45
feat: replay dimos main.jsonl into the go2 post-process .rrd as logs
jeff-hykin Jun 3, 2026
04844a4
feat: --check (sanity-check only) mode that writes summary.json
jeff-hykin Jun 3, 2026
581a1ee
fix: only look for main.jsonl next to the mem2.db
jeff-hykin Jun 3, 2026
56f13f5
Merge branch 'jeff/feat/go2_record_clean' of github.com:dimensionalOS…
jeff-hykin Jun 3, 2026
cf9bbb2
-
jeff-hykin Jun 3, 2026
ec336c9
clean up
jeff-hykin Jun 3, 2026
7ef91f6
pointlio native module: mirror fastlio2 module (PointLio class, point…
jeff-hykin Jun 3, 2026
2b31c91
pointlio native: define ROOT_DIR for the laserMapping debug paths
jeff-hykin Jun 3, 2026
0500790
pointlio native: lock fast-lio input to built pointlio rev (pointlio_…
jeff-hykin Jun 3, 2026
459f1d8
Merge branch 'main' of github.com:dimensionalOS/dimos into jeff/feat/…
jeff-hykin Jun 3, 2026
e0e1ab4
clean
jeff-hykin Jun 3, 2026
aea4372
rename
jeff-hykin Jun 3, 2026
d069c99
add mid360_realsense
jeff-hykin Jun 4, 2026
d30c045
new recording system
jeff-hykin Jun 4, 2026
f41faa8
formatting
jeff-hykin Jun 4, 2026
a14bae8
pointlio native: point fast-lio input at github remote (was macOS-onl…
jeff-hykin Jun 4, 2026
8d98e13
pointlio native: add mid360-pointlio blueprints
jeff-hykin Jun 4, 2026
c082684
Merge branch 'main' of github.com:dimensionalOS/dimos into jeff/feat/…
jeff-hykin Jun 4, 2026
dc42455
fastlio2: make pcap capture interface configurable via DIMOS_PCAP_IFACE
KrishnaH96 Jun 4, 2026
1b7c6f7
realsense: fix IMU stream startup and depth->IMU extrinsics
KrishnaH96 Jun 4, 2026
11dc457
feat: add lie-down/stand-up keys to keyboard teleop
jeff-hykin Jun 4, 2026
9065332
fixup pose
jeff-hykin Jun 5, 2026
f8a6b65
pointlio native: replay harness, deterministic clock, pcap tooling + …
jeff-hykin Jun 5, 2026
8d518aa
fixup the aggregation steps
jeff-hykin Jun 5, 2026
fa6325d
pointlio native: consume fast-lio from github instead of local path
jeff-hykin Jun 5, 2026
c3a65b2
add ssh tele op
jeff-hykin Jun 7, 2026
89151a7
pointlio_native: fix replay thread race + iVox glog dep + master-fait…
jeff-hykin Jun 11, 2026
b35d0f2
pointlio_native: pin fast-lio to local path so production nix build c…
jeff-hykin Jun 11, 2026
4303fd6
pointlio_native: repoint fast-lio at pushed github pointlio (02d5066)
jeff-hykin Jun 11, 2026
360133c
pointlio: pcap_to_db time-aligns pointlio_lidar + odometry into a db,…
jeff-hykin Jun 12, 2026
0f4cc4c
update
jeff-hykin Jun 12, 2026
d08f555
perf: stream point clouds/images during .rrd generation to bound memory
jeff-hykin Jun 12, 2026
f4b25c9
refactor: drop lidar reanchor step from recording post-process
jeff-hykin Jun 12, 2026
9611105
fastlio2: offline pcap replay + pcap_to_db tool (mirror pointlio)
jeff-hykin Jun 13, 2026
6e5e336
fastlio2: remove the velocity cap entirely
jeff-hykin Jun 13, 2026
21cb8f2
Merge branch 'main' into jeff/feat/pointlio_native
jeff-hykin Jun 13, 2026
01d8872
pointlio: single default.yaml config; drop extra sensor presets + dem…
jeff-hykin Jun 13, 2026
afd8395
Merge remote-tracking branch 'origin/jeff/feat/go2_record_clean' into…
jeff-hykin Jun 13, 2026
7ee3308
pointlio: pcap_to_db builds a db from scratch; keep recorder out of r…
jeff-hykin Jun 13, 2026
b0c8b2a
fastlio2: privatize pcap_to_db recorder + regenerate all_blueprints
jeff-hykin Jun 13, 2026
a472d25
pointlio: document lidar_type enum + link Livox CustomMsg in default.…
jeff-hykin Jun 13, 2026
eeb90e8
fastlio2: pcap_to_db builds a db from scratch (mirror pointlio)
jeff-hykin Jun 13, 2026
b07e9fc
Merge remote-tracking branch 'origin/main' into jeff/feat/go2_record_…
jeff-hykin Jun 13, 2026
3b5f988
pointlio: one default.yaml (strip ROS-only keys, note mid360 params);…
jeff-hykin Jun 13, 2026
c53c73a
pointlio: add ruwik2_part3 divergence sample to LFS; fix from-scratch…
jeff-hykin Jun 13, 2026
d48a945
pointlio: pcap_to_db docstring uses nested get_data for the ruwik2_pa…
jeff-hykin Jun 13, 2026
c062727
pointlio: address greptile review — fix stale fastlio docstring; ts=0…
jeff-hykin Jun 13, 2026
00b0720
fastlio2: set mid360 acc_cov=0.5 to bound velocity divergence
jeff-hykin Jun 13, 2026
22d9ec0
feat(virtual_mid360): Rust native module — pcap replay over a virtual…
jeff-hykin Jun 13, 2026
0504aae
feat(pointlio): publish body-frame cloud, split frame_ids, remove glo…
jeff-hykin Jun 13, 2026
333ece4
merge: bring virtual_mid360 rust module into pointlio branch
jeff-hykin Jun 13, 2026
8bb723b
feat(virtual_mid360): Python NativeModule wrapper for blueprints
jeff-hykin Jun 13, 2026
32757d6
feat(virtual_mid360): add demo_virtual_mid360_pointlio blueprint + re…
jeff-hykin Jun 13, 2026
4570885
fix(virtual_mid360): don't fetch LFS pcap at blueprint import
jeff-hykin Jun 13, 2026
3aff05f
fastlio2: offline pcap replay + pcap_to_db tool (mirror pointlio)
jeff-hykin Jun 13, 2026
6dbb391
fastlio2: pcap_to_db builds a db from scratch + privatize recorder
jeff-hykin Jun 13, 2026
24c19fa
fastlio2: set mid360 acc_cov=0.5 to bound velocity divergence
jeff-hykin Jun 13, 2026
8d9a461
lidar: split recording — standalone LivoxPcapRecorder + ts-rewriting …
jeff-hykin Jun 13, 2026
1088fe3
fastlio2: rip out the global_map output (Python)
jeff-hykin Jun 13, 2026
c64047d
fastlio2: rip out the global_map output (C++)
jeff-hykin Jun 13, 2026
4725bcb
fastlio2: bump mid360 acc_cov 0.5 -> 1.0 for reliable bounding
jeff-hykin Jun 14, 2026
9bb8315
refactor(pointlio): remove in-process pcap replay; use virtual_mid360…
jeff-hykin Jun 15, 2026
a24e29f
feat(pointlio): new pcap_to_db driven by the rust virtual_mid360 replay
jeff-hykin Jun 15, 2026
05aa9d9
refactor(pointlio): drop mount/init_pose offset — publish in the sens…
jeff-hykin Jun 15, 2026
e741ad8
virtual_mid360: over-the-wire pcap replay for fastlio (live SDK path)
jeff-hykin Jun 15, 2026
1c42128
fastlio2: remove the in-process pcap replay subsystem
jeff-hykin Jun 15, 2026
7bf679e
feat(virtual_mid360): make point/IMU multicast group configurable
jeff-hykin Jun 15, 2026
1118f23
pcap_to_db: orchestrate virtual_mid360 behind the --pcap interface
jeff-hykin Jun 15, 2026
b266301
chore(pointlio): trim verbose comments; fix two stale ones
jeff-hykin Jun 15, 2026
d7ffc6f
feat(virtual_mid360): read demo blueprint pcap from VIRTUAL_MID360_PC…
jeff-hykin Jun 15, 2026
0f48de5
refactor(virtual_mid360): require lidar_ip/host_ip/lidar_netns (not L…
jeff-hykin Jun 15, 2026
5f27cfd
feat(virtual_mid360): tcpdump pcap recorder for raw Livox Mid-360 UDP
jeff-hykin Jun 15, 2026
3d077c4
fix(virtual_mid360): kill tcpdump via unconfined label when AppArmor …
jeff-hykin Jun 15, 2026
d987f87
mid360 recorder: scream loudly + narrow sudoers hint when tcpdump kil…
jeff-hykin Jun 15, 2026
ab4c19d
mid360 recorder: include long-term sudoers fix in the bash reaper's f…
jeff-hykin Jun 15, 2026
8376809
virtual_mid360: drop verbose default fn + rename single-char vars
jeff-hykin Jun 15, 2026
344560c
pointlio/timing: replace single-letter var names with meaningful ones
jeff-hykin Jun 15, 2026
bea9ec8
virtual_mid360: pull pointlio's latest + fix replay stop logic
jeff-hykin Jun 15, 2026
90079f3
virtual_mid360: drop stale handshake TODOs
jeff-hykin Jun 15, 2026
ec184cb
pointlio: fix FAST-LIO mislabels in prose/logs (module is Point-LIO)
jeff-hykin Jun 15, 2026
2e7c755
pointlio cpp: drop timing.hpp, rename FastLio->PointLio, body frame i…
jeff-hykin Jun 15, 2026
6fb4b09
pointlio: review fixes + required network IPs + frame-id rename
jeff-hykin Jun 15, 2026
4eadca8
pointlio cpp: bump fast-lio flake to 36a3eef (PointLio class rename)
jeff-hykin Jun 15, 2026
2a0f51c
pointlio: TF timestamp = odometry ts exactly (drop falsy-0.0 wall-clo…
jeff-hykin Jun 15, 2026
948c3f5
virtual_mid360: give terse rust names meaningful ones
jeff-hykin Jun 15, 2026
b4a455b
virtual_mid360/pcap_to_db: condense verbose comments
jeff-hykin Jun 15, 2026
76743e0
pointlio cpp: forward Point-LIO velocity in odometry twist (was zeroed)
jeff-hykin Jun 15, 2026
5fdaf56
virtual_mid360 demo: take addresses from env vars, no hardcoded IPs
jeff-hykin Jun 15, 2026
3ec490d
pointlio/virtual_mid360: strip remaining verbose/useless comments
jeff-hykin Jun 15, 2026
e06c29f
virtual_mid360: default Config from VIRTUAL_MID360_* env vars; slim t…
jeff-hykin Jun 15, 2026
95383f8
virtual_mid360: rename env vars VIRTUAL_MID360_* -> DIMOS_MID360_*
jeff-hykin Jun 15, 2026
0dd0071
pointlio: make host_ip fully optional (derive from lidar_ip's subnet)
jeff-hykin Jun 15, 2026
1f21def
clean
jeff-hykin Jun 15, 2026
9a12a30
-
jeff-hykin Jun 15, 2026
6f70e29
pointlio cpp: bump fast-lio pin to 46b1a9e (macOS libc++/apple-sdk-26…
jeff-hykin Jun 15, 2026
d234536
virtual_mid360: re-lock dimos-repo to repo root (stale 4-level path →…
jeff-hykin Jun 15, 2026
12c4d13
Merge branch 'jeff/feat/pointlio_native' of github.com:dimensionalOS/…
jeff-hykin Jun 15, 2026
be4c1f8
pcap_to_db: make netns opt-in; default to no-netns aliases on one host
jeff-hykin Jun 15, 2026
460168c
pointlio: human-readable filter config + raw_cloud bypass; expose pre…
jeff-hykin Jun 15, 2026
3a8fc55
pointlio cpp: unwrap multi-line printf/statements onto single lines
jeff-hykin Jun 15, 2026
e2a4d85
pointlio: drop last fastlio names (pointlio_debug + pointlio.hpp head…
jeff-hykin Jun 15, 2026
7ee0c31
pointlio module.py: tighten verbose config/comment lines
jeff-hykin Jun 15, 2026
226a330
-
jeff-hykin Jun 15, 2026
1e7bf28
pointlio cpp: fix statements swallowed into trailing // comments (P0)
jeff-hykin Jun 15, 2026
c4fa47b
pointlio cpp: uninit Livox SDK before clearing globals (fix shutdown …
jeff-hykin Jun 15, 2026
d7aa546
-
jeff-hykin Jun 15, 2026
7f49b00
Merge branch 'jeff/feat/pointlio_native' of github.com:dimensionalOS/…
jeff-hykin Jun 15, 2026
c35dd76
virtual_mid360: pull pointlio's latest (env-var config defaults, nami…
jeff-hykin Jun 15, 2026
b245098
rename LFS sample ruwik2_part3 -> mid360_shake_stairs
jeff-hykin Jun 15, 2026
c64c2ba
pointlio: rip out output-cloud downsampling + denoising
jeff-hykin Jun 15, 2026
773d02c
Merge branch 'main' into jeff/feat/pointlio_native
jeff-hykin Jun 15, 2026
de3b32f
fastlio2: rip out output-cloud downsampling + denoising (mirror point…
jeff-hykin Jun 15, 2026
6f33458
fastlio2: uninit Livox SDK before clearing globals (fix shutdown null…
jeff-hykin Jun 15, 2026
f91f4e9
Merge branch 'main' into jeff/feat/pointlio_native
jeff-hykin Jun 16, 2026
fc682b3
Merge remote-tracking branch 'origin/main' into jeff/feat/pointlio_na…
jeff-hykin Jun 16, 2026
24cb75a
fastlio2: trim verbose comments across the recorder files
jeff-hykin Jun 16, 2026
d6d979f
Merge remote-tracking branch 'origin/main' into jeff/feat/pointlio_na…
jeff-hykin Jun 16, 2026
45bffc3
fastlio2: condense verbose acc_cov / filter_size comments in mid360.yaml
jeff-hykin Jun 16, 2026
bf858c4
fastlio2: remove mount/init_pose machinery + timing.hpp (mirror point…
jeff-hykin Jun 16, 2026
94cf54f
fastlio2: drop // ---- section banners (mirror pointlio's single-line…
jeff-hykin Jun 16, 2026
aca9e56
fastlio2: tighten the last multi-line pcap_to_db stop-logic comment
jeff-hykin Jun 16, 2026
0f7be3a
merge
jeff-hykin Jun 17, 2026
2fbdb79
virtual_mid360: use tracing::error! instead of eprintln! for startup …
jeff-hykin Jun 17, 2026
6d0833a
virtual_mid360 recorder: default lidar_ip from DIMOS_MID360_LIDAR_IP …
jeff-hykin Jun 17, 2026
8b4c130
livox Mid360: honor DIMOS_MID360_LIDAR_IP env for lidar_ip (fallback …
jeff-hykin Jun 17, 2026
ca9d276
livox: share host_ip auto-detect between Mid360 driver and Point-LIO
jeff-hykin Jun 17, 2026
e9f8096
livox Mid360: host_ip defaults to None (machine-specific, auto-detect…
jeff-hykin Jun 17, 2026
027f214
clean
jeff-hykin Jun 17, 2026
28b01f8
fix pre-existing mypy 3.10 errors (Unpack import, numpy no-any-return)
jeff-hykin Jun 17, 2026
f31b1c8
feat(pointlio): pcap_to_db --config (pwd-relative) + --odom/lidar-str…
jeff-hykin Jun 17, 2026
9c4724f
cleanup
jeff-hykin Jun 17, 2026
a5256e9
macos fixes
jeff-hykin Jun 17, 2026
b4109a1
macos fix
jeff-hykin Jun 17, 2026
4d3f1c1
fix(pointlio): pcap_to_db doc paths + self-terminate on lidar-stream …
jeff-hykin Jun 17, 2026
723d6fa
fix(virtual_mid360): derive Serialize on Config for NativeConfig bound
jeff-hykin Jun 17, 2026
0953506
fix(pointlio): serialize Point-LIO EKF access across IMU + main threads
jeff-hykin Jun 17, 2026
da415cd
Merge remote-tracking branch 'origin/main' into jeff/feat/pointlio_na…
jeff-hykin Jun 17, 2026
4d3c79d
fix(virtual_mid360): use #[native_config] for Config (main dimos-modu…
jeff-hykin Jun 17, 2026
1ad8031
Merge remote-tracking branch 'origin/main' into jeff/feat/fastlio_rec…
jeff-hykin Jun 17, 2026
ec5594d
feat(pointlio): pcap_to_db writes a <db>.rrd quick-look
jeff-hykin Jun 17, 2026
35a8ad9
feat(map): map global registers clouds by per-frame pose; --go2 for o…
jeff-hykin Jun 17, 2026
55099fc
fastlio2: mirror pointlio's virtual_mid360 evolution (self-provision …
jeff-hykin Jun 17, 2026
c458de8
fix(pointlio): use z.max()-z.min() not np.ptp in pcap_to_db .rrd grad…
jeff-hykin Jun 17, 2026
39cf383
fastlio2: make host_ip/lidar_ip optional + env-driven (mirror pointlio)
jeff-hykin Jun 17, 2026
3fb1a54
feat(pointlio): recorder stamps lidar poses; pcap_to_db auto-stops by…
jeff-hykin Jun 17, 2026
10faefe
Merge branch 'main' into jeff/feat/pointlio_native
jeff-hykin Jun 17, 2026
6ffaad4
feat(map): add --carve/--no-carve toggle to map global, default off
leshy Jun 17, 2026
ec86efa
Revert "fix pre-existing mypy 3.10 errors (Unpack import, numpy no-an…
jeff-hykin Jun 17, 2026
4b22007
Revert "fix pre-existing mypy 3.10 errors (Unpack import, numpy no-an…
jeff-hykin Jun 17, 2026
62e71b7
Merge branch 'jeff/feat/pointlio_native' into jeff/feat/fastlio_record2
jeff-hykin Jun 18, 2026
721a290
fastlio2: move config from YAML files to FastLio2Config (literal-unio…
jeff-hykin Jun 18, 2026
e17e6b1
fastlio2 pcap_to_db: mirror pointlio rrd + span auto-stop; get_data d…
jeff-hykin Jun 18, 2026
9faea3b
fastlio2/pointlio: recorders inherit memory2 Recorder, override pose …
jeff-hykin Jun 18, 2026
c995b0a
fastlio2: fov_degree is an int in the generated YAML
jeff-hykin Jun 18, 2026
86d8f68
Merge remote-tracking branch 'origin/main' into jeff/feat/fastlio_rec…
jeff-hykin Jun 18, 2026
f2aeab4
pointlio: move config from default.yaml to PointLioConfig (literal-un…
jeff-hykin Jun 18, 2026
9b38016
memory2: add TfRecorder; fastlio/pointlio recorders inherit it via @p…
jeff-hykin Jun 18, 2026
9335298
fastlio2: publish sensor/body-frame lidar (get_body_cloud), like poin…
jeff-hykin Jun 18, 2026
b2eb4c7
fastlio2: reference dimos-module-fastlio2 body-cloud branch (drop fla…
jeff-hykin Jun 18, 2026
f5ca33f
fastlio2/pointlio: code-review cleanup
jeff-hykin Jun 18, 2026
e2ae0b8
fastlio2: honor filter_size + publish flags; drop virtual_now()
jeff-hykin Jun 18, 2026
ffd8628
fastlio2: remove scan_bodyframe_pub_en (always publish sensor/body fr…
jeff-hykin Jun 18, 2026
e5621fb
fastlio2 pcap_to_db: open the .rrd in rerun + get_data fallback for -…
jeff-hykin Jun 18, 2026
9f13b16
blueprints: use default FastLio2 config in nav; stash FlowBase mid360…
jeff-hykin Jun 18, 2026
244954f
fastlio2 pcap_to_db: FastLio2 tuning as direct CLI flags
jeff-hykin Jun 18, 2026
6bcaaa3
fastlio2: no YAML — pass FAST-LIO params as plain CLI args
jeff-hykin Jun 18, 2026
5e88c54
fastlio2 main.cpp: python-style formatting (de-align = and comments)
jeff-hykin Jun 18, 2026
d35224a
fastlio2 main.cpp: inline run_main_iter into the main loop
jeff-hykin Jun 18, 2026
404d604
fastlio2 main.cpp: run_main_iter as a free function (time as arg, not…
jeff-hykin Jun 18, 2026
fa1ee7b
fastlio2/pointlio recorders: record at msg.ts; drop ts-alignment mach…
jeff-hykin Jun 18, 2026
eb7891e
fastlio2: delete cpp/README.md; fix stale 'rendered to YAML' comment
jeff-hykin Jun 18, 2026
a2aa3ce
fastlio2: reword acc_cov comment (no jhist/go2 references)
jeff-hykin Jun 18, 2026
e30afd9
fastlio2/pointlio recorders: drop the force flag; always replace own …
jeff-hykin Jun 18, 2026
2eb1ac4
fastlio2/pointlio recorders: rename via ports + .remappings, drop _st…
jeff-hykin Jun 18, 2026
9183d7e
memory2: fold TfRecorder into base Recorder (all Recorders record tf)
jeff-hykin Jun 18, 2026
0ab7ab1
pointlio: drop YAML config, pass tuning as plain CLI args
jeff-hykin Jun 18, 2026
fba90db
memory2: add Recorder.stream_remapping config for per-stream renames
jeff-hykin Jun 18, 2026
43d25f5
fastlio/pointlio: consistent frame_id scheme, stamp cloud with sensor…
jeff-hykin Jun 18, 2026
33c7041
fastlio/pointlio: default sensor_frame_id to mid360_link
jeff-hykin Jun 18, 2026
c76339d
memory2/recorders: fix APPEND re-run duplicating tf + ignoring stream…
jeff-hykin Jun 18, 2026
1e3e9b1
fastlio main.cpp: match pointlio formatting; inline get_publish_ts + …
jeff-hykin Jun 18, 2026
c5a6ab9
memory2: fix mypy no-any-return in Recorder._resolve_pose
jeff-hykin Jun 18, 2026
0260030
pointlio: revert module to origin/main (keep PR #2498 fastlio-only)
jeff-hykin Jun 18, 2026
2678ba7
Merge commit 'c5a6ab944' into jeff/feat/pointlio_native
jeff-hykin Jun 18, 2026
44efe28
Merge branch 'jeff/feat/fastlio_record2' into jeff/feat/pointlio_native
jeff-hykin Jun 18, 2026
253cf7a
Revert "pointlio: revert module to origin/main (keep PR #2498 fastlio…
jeff-hykin Jun 18, 2026
691a24a
Merge branch 'main' into jeff/feat/fastlio_record2
jeff-hykin Jun 20, 2026
1a2d129
feat(zed): SDK-free ZedSimple color + IMU into go2_mid360 recording
jeff-hykin Jun 20, 2026
8c3d5a9
Merge branch 'main' into jeff/feat/fastlio_record2
jeff-hykin Jun 21, 2026
18ec528
Merge branch 'main' of github.com:dimensionalOS/dimos into jeff/feat/…
jeff-hykin Jun 21, 2026
afadd1f
-
jeff-hykin Jun 21, 2026
f2cd2dc
Merge branch 'jeff/feat/fastlio_record2' of github.com:dimensionalOS/…
jeff-hykin Jun 21, 2026
2aa131e
Merge remote-tracking branch 'origin/jeff/feat/pointlio_native' into …
jeff-hykin Jun 21, 2026
0edae56
feat(recording): switch go2_mid360 + mid360_realsense to Point-LIO
jeff-hykin Jun 21, 2026
9cda108
chore(recording): delete SpeedWarner (Point-LIO has built-in saturati…
jeff-hykin Jun 21, 2026
542a0ec
[autofix.ci] apply automated fixes
autofix-ci[bot] Jun 22, 2026
f8c94f9
chore: drop temp bin/go2_rec helper from the branch
jeff-hykin Jun 22, 2026
db1d361
docs: revert native_modules.md example change
jeff-hykin Jun 22, 2026
30718ba
chore: move hid into its alphabetical slot in the mypy ignore list
jeff-hykin Jun 22, 2026
720cf59
revert(zed): remove ZED camera from go2 recording branch
jeff-hykin Jun 22, 2026
66e8066
RESTORE: revert KeyboardTeleop lie-down/stand-up wiring
jeff-hykin Jun 22, 2026
d0ccd82
merge
jeff-hykin Jun 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 114 additions & 28 deletions dimos/hardware/sensors/camera/realsense/camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

from __future__ import annotations

import atexit
import threading
import time
from typing import TYPE_CHECKING
Expand All @@ -26,11 +25,11 @@
from scipy.spatial.transform import Rotation

from dimos.constants import DEFAULT_THREAD_JOIN_TIMEOUT
from dimos.core.coordination.blueprints import autoconnect
from dimos.core.coordination.module_coordinator import ModuleCoordinator
from dimos.core.core import rpc
from dimos.core.module import Module, ModuleConfig
from dimos.core.stream import Out
from dimos.core.transport import LCMTransport
from dimos.hardware.sensors.camera.spec import (
OPTICAL_ROTATION,
DepthCameraConfig,
Expand All @@ -41,9 +40,11 @@
from dimos.msgs.geometry_msgs.Vector3 import Vector3
from dimos.msgs.sensor_msgs.CameraInfo import CameraInfo
from dimos.msgs.sensor_msgs.Image import Image, ImageFormat
from dimos.msgs.sensor_msgs.Imu import Imu
from dimos.msgs.sensor_msgs.PointCloud2 import PointCloud2
from dimos.spec import perception
from dimos.utils.reactive import backpressure
from dimos.visualization.vis_module import vis_module

if TYPE_CHECKING:
import pyrealsense2 as rs # type: ignore[import-not-found,import-untyped]
Expand All @@ -67,6 +68,7 @@ class RealSenseCameraConfig(ModuleConfig, DepthCameraConfig):
align_depth_to_color: bool = True
enable_depth: bool = True
enable_pointcloud: bool = False
enable_imu: bool = True
pointcloud_fps: float = 5.0
camera_info_fps: float = 1.0
serial_number: str | None = None
Expand All @@ -79,6 +81,7 @@ class RealSenseCamera(DepthCameraHardware, Module, perception.DepthCamera):
pointcloud: Out[PointCloud2]
camera_info: Out[CameraInfo]
depth_camera_info: Out[CameraInfo]
imu: Out[Imu]

@property
def _camera_link(self) -> str:
Expand All @@ -100,6 +103,10 @@ def _depth_frame(self) -> str:
def _depth_optical_frame(self) -> str:
return f"{self.config.camera_name}_depth_optical_frame"

@property
def _imu_frame(self) -> str:

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Recorded IMU with realsense cause I wanted an all-in-one recording

return f"{self.config.camera_name}_imu_optical_frame"

def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def]
super().__init__(*args, **kwargs)
self._pipeline: rs.pipeline | None = None
Expand All @@ -115,6 +122,10 @@ def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def]
self._latest_color_img: Image | None = None
self._latest_depth_img: Image | None = None
self._pointcloud_lock = threading.Lock()
# IMU state
self._imu_pipeline: rs.pipeline | None = None
self._depth_to_imu_extrinsics: rs.extrinsics | None = None
self._latest_accel: Vector3 | None = None

@rpc
def start(self) -> None:
Expand Down Expand Up @@ -176,6 +187,71 @@ def start(self) -> None:
)
)

if self.config.enable_imu:
self._start_imu()

def _start_imu(self) -> None:
import pyrealsense2 as rs

imu_pipeline = rs.pipeline()
imu_config = rs.config()
if self.config.serial_number:
imu_config.enable_device(self.config.serial_number)

try:
# Explicit IMU rates required: without an fps librealsense falls back to
# accel @ 63 Hz, which D4xx firmware doesn't offer -> "Couldn't resolve requests".
imu_config.enable_stream(rs.stream.accel, rs.format.motion_xyz32f, 200)
imu_config.enable_stream(rs.stream.gyro, rs.format.motion_xyz32f, 200)
imu_pipeline.start(imu_config, self._on_imu_frame)
except RuntimeError as error:
print(f"RealSense IMU unavailable, disabling IMU stream: {error}")
return

self._imu_pipeline = imu_pipeline

if self._profile is not None and self.config.enable_depth:
depth_stream = self._profile.get_stream(rs.stream.depth)
# The accel profile must come from the device's extrinsics graph, not the
# separately-started IMU pipeline -- cross-pipeline profiles aren't linked and
# get_extrinsics_to() raises "Requested extrinsics are not available!".
accel_stream = next(
profile
for sensor in self._profile.get_device().query_sensors()
for profile in sensor.get_stream_profiles()
if profile.stream_type() == rs.stream.accel
)
self._depth_to_imu_extrinsics = depth_stream.get_extrinsics_to(accel_stream)
Comment on lines +218 to +224

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 StopIteration crash when accel profile not found

next() with no default raises StopIteration if no sensor on the device exposes an rs.stream.accel profile. This exception is outside the surrounding try/except RuntimeError block, so it propagates up through _start_imu() into start(), crashing camera initialisation with a confusing traceback. The IMU pipeline has already been started and stored in self._imu_pipeline at this point, so the state is partially initialised when the crash occurs. Using next(..., None) and guarding the extrinsics call prevents this.

Suggested change
accel_stream = next(
profile
for sensor in self._profile.get_device().query_sensors()
for profile in sensor.get_stream_profiles()
if profile.stream_type() == rs.stream.accel
)
self._depth_to_imu_extrinsics = depth_stream.get_extrinsics_to(accel_stream)
accel_stream = next(
(
profile
for sensor in self._profile.get_device().query_sensors()
for profile in sensor.get_stream_profiles()
if profile.stream_type() == rs.stream.accel
),
None,
)
if accel_stream is not None:
self._depth_to_imu_extrinsics = depth_stream.get_extrinsics_to(accel_stream)
else:
print("RealSense: no accel profile found in device graph; IMU->depth TF will be skipped")


def _on_imu_frame(self, frame: rs.frame) -> None:
if frame.is_frameset():
for sub_frame in frame.as_frameset():
self._handle_motion_frame(sub_frame)
else:
self._handle_motion_frame(frame)

def _handle_motion_frame(self, frame: rs.frame) -> None:
import pyrealsense2 as rs

motion = frame.as_motion_frame()
if not motion:
return

motion_data = motion.get_motion_data()
stream_type = motion.get_profile().stream_type()

if stream_type == rs.stream.accel:
self._latest_accel = Vector3(motion_data.x, motion_data.y, motion_data.z)
elif stream_type == rs.stream.gyro and self._latest_accel is not None:
# Gyro drives publishing, paired with the most recent accel sample.
self.imu.publish(
Imu(
angular_velocity=Vector3(motion_data.x, motion_data.y, motion_data.z),
linear_acceleration=self._latest_accel,
frame_id=self._imu_frame,
)
)

def _publish_camera_info(self) -> None:
ts = time.time()
if self._color_camera_info:
Expand Down Expand Up @@ -381,6 +457,16 @@ def _publish_tf(self, ts: float) -> None:
)
transforms.append(color_to_color_optical)

# camera_link -> imu (physical motion-sensor extrinsics)
if self._depth_to_imu_extrinsics is not None:
imu_tf = self._extrinsics_to_transform(
self._depth_to_imu_extrinsics,
self._camera_link,
self._imu_frame,
ts,
)
transforms.append(imu_tf)

self.tf.publish(*transforms)

def _generate_pointcloud(self) -> None:
Expand Down Expand Up @@ -408,6 +494,13 @@ def _generate_pointcloud(self) -> None:
def stop(self) -> None:
self._running = False

if self._imu_pipeline:
try:
self._imu_pipeline.stop()
except Exception:
pass # Pipeline might already be stopped
self._imu_pipeline = None

# Stop pipeline first to unblock wait_for_frames()
if self._pipeline:
try:
Expand All @@ -426,6 +519,8 @@ def stop(self) -> None:
self._profile = None
self._align = None
self._color_to_depth_extrinsics = None
self._depth_to_imu_extrinsics = None
self._latest_accel = None
self._latest_color_img = None
self._latest_depth_img = None
super().stop()
Expand All @@ -443,34 +538,25 @@ def get_depth_scale(self) -> float:
return self._depth_scale


def main() -> None:
dimos = ModuleCoordinator()
dimos.start()
def _color_camera_info_to_rerun(camera_info: CameraInfo) -> object:
# Re-parent the pinhole onto the color image entity + its optical frame so
# the color image renders inside the camera frustum in the 3D view.
return camera_info.to_rerun(
image_topic="world/color_image",
optical_frame="camera_color_optical_frame",
)

camera = dimos.deploy(RealSenseCamera, enable_pointcloud=True, pointcloud_fps=5.0)
camera.color_image.transport = LCMTransport("/camera/color", Image)
camera.depth_image.transport = LCMTransport("/camera/depth", Image)
camera.pointcloud.transport = LCMTransport("/camera/pointcloud", PointCloud2)
camera.camera_info.transport = LCMTransport("/camera/color_info", CameraInfo)
camera.depth_camera_info.transport = LCMTransport("/camera/depth_info", CameraInfo)

def cleanup() -> None:
try:
dimos.stop()
except Exception:
pass

atexit.register(cleanup)
dimos.start_all_modules()

try:
while True:
time.sleep(0.1)
except (KeyboardInterrupt, SystemExit):
pass
finally:
atexit.unregister(cleanup)
cleanup()
def main() -> None:
blueprint = autoconnect(
RealSenseCamera.blueprint(enable_pointcloud=True, pointcloud_fps=5.0),
vis_module(
"rerun",
rerun_config={"visual_override": {"world/camera_info": _color_camera_info_to_rerun}},
),
)

ModuleCoordinator.build(blueprint).loop()


if __name__ == "__main__":
Expand Down
69 changes: 0 additions & 69 deletions dimos/hardware/sensors/lidar/pointlio/config/default.yaml

This file was deleted.

3 changes: 0 additions & 3 deletions dimos/hardware/sensors/lidar/pointlio/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@ find_package(Eigen3 REQUIRED)
# PCL (only components we need — avoid full PCL which drags in VTK via io)
find_package(PCL 1.8 REQUIRED COMPONENTS common filters)

find_package(yaml-cpp REQUIRED)

# glog (iVox map backend — include/ivox/ivox3d.h needs glog)
find_package(glog REQUIRED)

Expand Down Expand Up @@ -94,7 +92,6 @@ target_link_libraries(pointlio_native PRIVATE
${LCM_LIBRARIES}
${LIVOX_SDK}
${PCL_LIBRARIES}
yaml-cpp::yaml-cpp
glog::glog
)

Expand Down
6 changes: 3 additions & 3 deletions dimos/hardware/sensors/lidar/pointlio/cpp/flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion dimos/hardware/sensors/lidar/pointlio/cpp/flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@
pkgs.glib
pkgs.eigen
pkgs.pcl
pkgs.yaml-cpp
pkgs.glog
pkgs.boost
pkgs.llvmPackages.openmp
Expand Down
Loading
Loading