use std::sync::Arc;
use std::time::Duration;
use log::*;
use roslibrust::mock::MockRos;
use roslibrust_transforms::{
Quaternion, Ros1TFMessage, Stamp, Timestamp, Transform, TransformManager, Vector3,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();
info!("Creating mock ros instance...");
let ros = MockRos::new();
info!("Creating TransformManager...");
let tf_mgr = TransformManager::<Ros1TFMessage, _>::new(&ros, Duration::from_secs(10)).await?;
let tf_mgr = Arc::new(tf_mgr);
let tf_mgr2 = tf_mgr.clone();
tokio::spawn(async move {
let mut interval = tokio::time::interval(Duration::from_secs(1));
let mut x = 1.0;
loop {
interval.tick().await;
info!("Publishing transform...");
let transform = Transform::new(
"world",
"robot",
Vector3::new(x, 0.0, 0.0),
Quaternion::identity(),
Stamp::At(Timestamp::now()),
)
.unwrap();
tf_mgr2.add_transform(transform).await.unwrap();
x += 1.0;
}
});
let deadline = tokio::time::Instant::now() + Duration::from_secs(10);
let mut lookup = (Timestamp::now() + Duration::from_secs(2)).unwrap();
loop {
tokio::select! {
_ = tokio::time::sleep(deadline.saturating_duration_since(tokio::time::Instant::now())) => {
info!("Deadline reached, shutting down...");
break;
}
_ = tokio::signal::ctrl_c() => {
info!("Received Ctrl+C, shutting down...");
break;
}
xform = tf_mgr.wait_for_transform("world", "robot", lookup, None) => {
match xform {
Ok(xform) => {
let translation = xform.translation();
info!("Transform: translation=({:.3}, {:.3}, {:.3})",
translation.x,
translation.y,
translation.z
);
}
Err(e) => {
warn!("Error looking up transform: {}", e);
}
}
lookup = (lookup + Duration::from_secs(1)).unwrap();
}
}
}
Ok(())
}