tf_rosrust/tf_broadcaster.rs
1use crate::{
2 tf_error::TfError,
3 transforms::{geometry_msgs::TransformStamped, tf2_msgs::TFMessage},
4};
5
6/// Broadcast tf messages
7///
8/// Example usage:
9///
10/// ```no_run
11/// use tf_rosrust::{TfBroadcaster, TransformStamped};
12///
13/// rosrust::init("broadcaster");
14/// let broadcaster = TfBroadcaster::new();
15///
16/// let rate = rosrust::rate(100.0);
17/// let mut tf = TransformStamped::default();
18/// tf.header.frame_id = "map".to_string();
19/// tf.child_frame_id = "tf_rosrust".to_string();
20/// tf.transform.rotation.w = 1.0;
21/// let mut theta = 0.01_f64;
22/// while rosrust::is_ok() {
23/// theta += 0.01;
24/// tf.header.stamp = rosrust::now();
25/// tf.transform.translation.x = theta.sin();
26/// tf.transform.translation.y = theta.cos();
27/// broadcaster.send_transform(tf.clone()).unwrap();
28/// println!("{tf:?}");
29/// rate.sleep();
30/// }
31/// ```
32pub struct TfBroadcaster {
33 publisher: rosrust::Publisher<TFMessage>,
34}
35
36impl TfBroadcaster {
37 /// Create a new TfBroadcaster
38 pub fn new() -> Self {
39 Self {
40 publisher: rosrust::publish("/tf", 1000).unwrap(),
41 }
42 }
43
44 /// Broadcast transform
45 pub fn send_transform(&self, tf: TransformStamped) -> Result<(), TfError> {
46 let tf_message = TFMessage {
47 transforms: vec![tf],
48 };
49 // TODO: handle error correctly
50 self.publisher
51 .send(tf_message)
52 .map_err(|err| TfError::Rosrust(err.description().to_string()))
53 }
54}
55
56impl Default for TfBroadcaster {
57 fn default() -> Self {
58 TfBroadcaster::new()
59 }
60}