#![allow(
clippy::unwrap_used,
clippy::expect_used,
clippy::print_stdout,
clippy::print_stderr
)]
fn main() {
#[cfg(all(feature = "shm", target_os = "linux"))]
generate();
#[cfg(not(all(feature = "shm", target_os = "linux")))]
{
eprintln!("gen_domain_fixture needs `--features shm` on Linux: writing a .tft maps memory");
std::process::exit(1);
}
}
#[cfg(all(feature = "shm", target_os = "linux"))]
fn generate() {
use tf_tree::{Capacity, Domain, EdgeCfg, InterpPolicy, SensorDomain, TreeBuilder};
const OUT: &str = "testdata/frozen/sensor_domain.tft";
let cfg = EdgeCfg::new(Capacity::slots(32))
.interp(InterpPolicy::ScLerp)
.domain(SensorDomain::TAG);
let tree = TreeBuilder::new()
.dynamic_edge("map", "odom", cfg)
.dynamic_edge("odom", "base_link", cfg)
.static_edge(
"base_link",
"lidar",
&tf_tree::exp_se3([0.1, -0.2, 0.3, 0.4, 0.5, -0.6]),
)
.build()
.unwrap();
for (i, (parent, child)) in [("map", "odom"), ("odom", "base_link")]
.into_iter()
.enumerate()
{
let p = tree.frame(parent).unwrap();
let c = tree.frame(child).unwrap();
let w = tree.claim(c, p).unwrap();
let seed = 1.0 + i as f64;
for k in 0..16i64 {
let t = k as f64 * 0.01 * seed;
w.push(
k * 10_000_000, &tf_tree::exp_se3([
0.30 * (t * std::f64::consts::SQRT_2).sin(),
0.20 * (t * std::f64::consts::PI).cos(),
0.17 * t + 0.05 * seed,
1.30 * t + 0.11 * seed,
-0.70 * (t * std::f64::consts::E).sin(),
0.42 * (t + seed).cos(),
]),
)
.unwrap();
}
core::mem::forget(w);
}
let path = std::path::Path::new(OUT);
std::fs::create_dir_all(path.parent().unwrap()).unwrap();
let header = tree
.freeze_to(path, Some("gen_domain_fixture"), [0; 32], 0)
.unwrap();
println!(
"wrote {OUT}: {} bytes, format_version {}, layout_hash {:#010x}",
std::fs::metadata(path).unwrap().len(),
header.format_version,
header.layout_hash,
);
}