diff --git a/examples/rust-ros2-dataflow/node/src/main.rs b/examples/rust-ros2-dataflow/node/src/main.rs index 454b51d9..90775296 100644 --- a/examples/rust-ros2-dataflow/node/src/main.rs +++ b/examples/rust-ros2-dataflow/node/src/main.rs @@ -10,10 +10,7 @@ use dora_ros2_bridge::{ messages::{ example_interfaces::service::{AddTwoInts, AddTwoIntsRequest}, geometry_msgs::msg::{Twist, Vector3}, - turtlesim::{ - msg::Pose, - service::{Spawn, SpawnRequest}, - }, + turtlesim::msg::Pose, }, ros2_client::{self, ros2, NodeOptions}, rustdds::{self, policy}, @@ -26,6 +23,17 @@ fn main() -> eyre::Result<()> { let turtle_vel_publisher = create_vel_publisher(&mut ros_node)?; let turtle_pose_reader = create_pose_reader(&mut ros_node)?; + // spawn a background spinner task that is handles service discovery (and other things) + let pool = futures::executor::ThreadPool::new()?; + let spinner = ros_node.spinner(); + pool.spawn(async { + if let Err(err) = spinner.spin().await { + eprintln!("ros2 spinner failed: {err:?}"); + } + }) + .context("failed to spawn ros2 spinner")?; + + // create an example service client let service_qos = { rustdds::QosPolicyBuilder::new() .reliability(policy::Reliability::Reliable { @@ -42,16 +50,7 @@ fn main() -> eyre::Result<()> { service_qos.clone(), )?; - let pool = futures::executor::ThreadPool::new()?; - - let spinner = ros_node.spinner(); - pool.spawn(async { - if let Err(err) = spinner.spin().await { - eprintln!("ros2 spinner failed: {err:?}"); - } - }) - .context("failed to spawn ros2 spinner")?; - + // wait until the service server is ready println!("wait for add_two_ints service"); let service_ready = async { for _ in 0..10 {