From b9443024cec265337fe01f683f99f6c07864159c Mon Sep 17 00:00:00 2001 From: Yang Zhou Date: Mon, 4 Nov 2024 16:14:23 -0500 Subject: [PATCH] add rerun textlog --- Cargo.toml | 2 +- config/peng_default_blueprint.rbl | Bin 117292 -> 150688 bytes src/lib.rs | 1 + src/main.rs | 37 +++++++++++++++++++++--------- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3cfe80bf..6036092e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,6 @@ thiserror = "1.0.63" serde = { version = "1.0.209", features = ["derive"] } serde_yaml = "0.9.34" env_logger = "0.11.5" -log = "0.4.22" +#log = "0.4.22" # use rerun::external::log rayon = "1.10.0" rand_chacha = "0.3.1" diff --git a/config/peng_default_blueprint.rbl b/config/peng_default_blueprint.rbl index d62123844b9b85b2394bf5448c733c10f22b49f0..7d7445f40d52d7912965f4de335198d759f75b30 100644 GIT binary patch delta 39546 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 P$3q0IonC5rx@$aZdV@hpHS?O}h<+8K= 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 GI{y!C>u_iQ delta 16302 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 DA6HVp diff --git a/src/lib.rs b/src/lib.rs index e5ada6b8..d1c9ace0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,6 +22,7 @@ pub mod config; use nalgebra::{Matrix3, Quaternion, Rotation3, SMatrix, UnitQuaternion, Vector3}; use rand_chacha::ChaCha8Rng; use rand_distr::{Distribution, Normal}; +use rerun::external::log; use std::f32::consts::PI; #[derive(thiserror::Error, Debug)] /// Represents errors that can occur during simulation diff --git a/src/main.rs b/src/main.rs index 3f5b1d54..00d15093 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,20 +1,28 @@ use nalgebra::Vector3; use peng_quad::*; +use rerun::external::log; /// Main function for the simulation fn main() -> Result<(), SimulationError> { - env_logger::builder() - .parse_env(env_logger::Env::default().default_filter_or("info")) - .init(); let mut config_str = "config/quad.yaml"; let args: Vec = std::env::args().collect(); if args.len() != 2 { - log::warn!("Usage: {} .", args[0]); - log::warn!("Loading default configuration: config/quad.yaml"); + println!( + "[\x1b[33mWARN\x1b[0m peng_quad] Usage: {} .", + args[0] + ); + println!("[\x1b[33mWARN\x1b[0m peng_quad] Loading default configuration: config/quad.yaml"); } else { - log::info!("Loading configuration: {}", args[1]); + println!( + "[\x1b[32mINFO\x1b[0m peng_quad] Loading configuration: {}", + args[1] + ); config_str = &args[1]; } let config = config::Config::from_yaml(config_str).expect("Failed to load configuration."); + println!( + "[\x1b[32mINFO\x1b[0m peng_quad]Use rerun.io: {}", + config.use_rerun + ); let mut quad = Quadrotor::new( 1.0 / config.simulation.simulation_frequency as f32, config.quadrotor.mass, @@ -65,17 +73,23 @@ fn main() -> Result<(), SimulationError> { params: step.params.clone(), }) .collect(); - log::info!("Use rerun.io: {}", config.use_rerun); let rec = if config.use_rerun { - rerun::spawn(&rerun::SpawnOptions::default())?; - Some(rerun::RecordingStreamBuilder::new("Peng").connect()?) + let _rec = rerun::RecordingStreamBuilder::new("Peng").spawn()?; + rerun::Logger::new(_rec.clone()) + .with_path_prefix("logs") + .with_filter(rerun::default_log_filter()) + .init() + .unwrap(); + Some(_rec) } else { + env_logger::builder() + .parse_env(env_logger::Env::default().default_filter_or("info")) + .init(); None }; + log::info!("Use rerun.io: {}", config.use_rerun); if let Some(rec) = &rec { rec.log_file_from_path(config.rerun_blueprint, None, false)?; - } - if let Some(rec) = &rec { rec.set_time_seconds("timestamp", 0); log_mesh(rec, config.mesh.division, config.mesh.spacing)?; log_maze_tube(rec, &maze)?; @@ -181,5 +195,6 @@ fn main() -> Result<(), SimulationError> { break; } } + log::logger().flush(); Ok(()) }