Rust workspace for turning raw RoboCup SSL logs into model-ready training samples.
- Live mode: parse
.log/.log.gzfiles withloguna, clean them, segment sequences, and emit per-robot training samples on demand. - Archive mode: preprocess logs into compressed
rkyv + zstdshards with manifest, split bundle, and normalization stats. - Review tool: embedded Rust review server plus React/Vite web app for sequence review, playback, overlays, and bulk triage.
- Optional
tchfeature inzr-core: convert sample batches into weightedtch::Tensorvalues.
crates/zr-core- core library onlycrates/zr-cli- CLI toolscrates/zr-review- embedded local review serverapps/zr-review-web- review web frontend
zombie-resurrection— interactive preprocessing with optional manual reviewzr-auto-pipeline— fully-automated raw → training-data pipeline (no human intervention)zr-review— embedded local review server
Generate a starter config:
cargo run -p zr-cli --bin zombie-resurrection -- init-config --output zr-config.jsonAudit one log:
cargo run -p zr-cli --bin zombie-resurrection -- audit \
--input /path/to/raw-log \
--team-name YourTeamPreprocess logs into archived shards:
cargo run -p zr-cli --bin zombie-resurrection -- preprocess \
--input /path/to/raw-logs \
--team-name YourTeam \
--output-dir data/processed \
--review-file data/review.jsonAutomated pipeline (no review, enhanced cleaning):
cargo run -p zr-cli --bin zr-auto-pipeline -- \
--input /path/to/raw-logs \
--team-name YourTeam \
--output-dir data/auto \
--verboseRun the embedded review server:
cargo run -p zr-review --bin zr-review -- \
--logs-dir /path/to/raw-logs \
--team-name YourTeam \
--review-file data/review.jsonThe frontend is built and embedded automatically by build.rs.
For frontend-only iteration you can still run:
cd apps/zr-review-web
npm install
npm run devuse std::path::PathBuf;
use zr_core::{LiveDataset, PipelineConfig, ReviewStore, TeamSelector};
let mut config = PipelineConfig::default();
config.target_team = TeamSelector::Name("YourTeam".to_string());
let dataset = LiveDataset::new(
vec![PathBuf::from("/path/to/raw-log")],
config,
Some(ReviewStore::default()),
);
for sample in dataset.iter().take(8) {
let sample = sample?;
println!("{} -> {:?}", sample.metadata.game_id, sample.target);
}
# Ok::<(), anyhow::Error>(())- Raw source:
VisionTracker2020 - Training target: per-robot next relative delta
(dx, dy, dtheta) - Manual review: web queue, playback, scrubber, overlays, compare mode, keep/drop/needs-attention with notes
- Archive format:
rkyvpayload compressed withzstd - Split export: train/validation/test assignments plus normalization stats and sample weights
- Identity handling: Hungarian-style matching with gating and suspicious-swap flags
- Live-play handling: referee commands plus motion heuristics