feat: ROS2 bag recording manager (Issue #615) #625

Merged
sl-jetson merged 1 commits from sl-jetson/issue-615-bag-recorder into main 2026-03-15 11:02:38 -04:00
Collaborator

Summary

Upgrades saltybot_bag_recorder (Issue #488) with motion-triggered recording, auto-split, USB/NVMe storage selection, and disk-usage cleanup.

New: bag_policy.py (pure Python, ROS2-free)

  • MotionState — tracks /cmd_vel activity, idle timeout (30s default), should_start_recording() / should_stop_recording() predicates
  • DiskInfo — disk-usage snapshot, used_pct, free_gb, exceeds_pct(), has_min_free()
  • StorageSelector — ordered path list (USB→NVMe→home), picks first with ≥2 GB free
  • BagPolicy — split (1 GB/10 min), disk warn (70%), cleanup trigger (80%), age-based expiry (7 days)

Enhanced: bag_recorder_node.py

  • Motion trigger: subscribes /cmd_vel, auto-start on non-zero velocity, auto-stop after 30s idle
  • Auto-split: checks every ~30s, restarts ros2 bag record subprocess when segment exceeds 1 GB or 10 min
  • Storage selection: tries /media/usb0, /media/usb1, /mnt/nvme/saltybot-bags, ~/saltybot-data/bags in order
  • Disk monitoring: warns at 70%, deletes bags >7 days when disk >80%
  • Status JSON on /saltybot/bag_recorder/status at 1 Hz (recording state, segment size, disk info)
  • Services: /saltybot/bag_recorder/{start,stop,split} + legacy names

Updated: bag_recorder.yaml

New params: storage_paths, motion_trigger, idle_timeout_s, split_size_gb, split_duration_min, warn_disk_pct, cleanup_disk_pct, min_free_gb, status_hz

Tests: 76 passing

MotionState, DiskInfo, StorageSelector, BagPolicy (split/disk/age/constructor validation)

## Summary Upgrades `saltybot_bag_recorder` (Issue #488) with motion-triggered recording, auto-split, USB/NVMe storage selection, and disk-usage cleanup. ### New: `bag_policy.py` (pure Python, ROS2-free) - **`MotionState`** — tracks `/cmd_vel` activity, idle timeout (30s default), `should_start_recording()` / `should_stop_recording()` predicates - **`DiskInfo`** — disk-usage snapshot, `used_pct`, `free_gb`, `exceeds_pct()`, `has_min_free()` - **`StorageSelector`** — ordered path list (USB→NVMe→home), picks first with ≥2 GB free - **`BagPolicy`** — split (1 GB/10 min), disk warn (70%), cleanup trigger (80%), age-based expiry (7 days) ### Enhanced: `bag_recorder_node.py` - Motion trigger: subscribes `/cmd_vel`, auto-start on non-zero velocity, auto-stop after 30s idle - Auto-split: checks every ~30s, restarts `ros2 bag record` subprocess when segment exceeds 1 GB or 10 min - Storage selection: tries `/media/usb0`, `/media/usb1`, `/mnt/nvme/saltybot-bags`, `~/saltybot-data/bags` in order - Disk monitoring: warns at 70%, deletes bags >7 days when disk >80% - Status JSON on `/saltybot/bag_recorder/status` at 1 Hz (recording state, segment size, disk info) - Services: `/saltybot/bag_recorder/{start,stop,split}` + legacy names ### Updated: `bag_recorder.yaml` New params: `storage_paths`, `motion_trigger`, `idle_timeout_s`, `split_size_gb`, `split_duration_min`, `warn_disk_pct`, `cleanup_disk_pct`, `min_free_gb`, `status_hz` ### Tests: 76 passing MotionState, DiskInfo, StorageSelector, BagPolicy (split/disk/age/constructor validation)
sl-jetson added 1 commit 2026-03-15 10:12:59 -04:00
Upgrades saltybot_bag_recorder (Issue #488) with:

- Motion-triggered auto-record: subscribes /cmd_vel, starts on non-zero
  velocity, stops after 30s idle timeout (configurable)
- Auto-split at 1 GB or 10 min via subprocess restart
- USB/NVMe storage selection: ordered priority list, picks first path
  with >= 2 GB free (/media/usb0 -> /media/usb1 -> /mnt/nvme -> ~/bags)
- Disk monitoring: warns at 70%, triggers cleanup of bags >7 days at 80%
- JSON status on /saltybot/bag_recorder/status at 1 Hz
- Services: /saltybot/bag_recorder/{start,stop,split}
  (legacy /saltybot/{start,stop}_recording kept for compatibility)
- bag_policy.py: pure-Python MotionState, DiskInfo, StorageSelector,
  BagPolicy — ROS2-free, fully unit-testable
- 76 unit tests passing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sl-jetson merged commit fea550c851 into main 2026-03-15 11:02:38 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: seb/saltylab-firmware#625
No description provided.