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}