diff --git a/examples/logging_demo/Cargo.toml b/examples/logging_demo/Cargo.toml
new file mode 100644
index 000000000..778981c51
--- /dev/null
+++ b/examples/logging_demo/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "logging_demo"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+rclrs = "0.4"
+example_interfaces = "*"
diff --git a/examples/logging_demo/package.xml b/examples/logging_demo/package.xml
new file mode 100644
index 000000000..0cfdd3520
--- /dev/null
+++ b/examples/logging_demo/package.xml
@@ -0,0 +1,21 @@
+
+
+
+ examples_logging_demo
+ Esteve Fernandez
+
+ Jacob Hassold
+ 0.4.1
+ Package containing an example of how to use a worker in rclrs.
+ Apache License 2.0
+
+ rclrs
+ rosidl_runtime_rs
+ example_interfaces
+
+
+ ament_cargo
+
+
diff --git a/examples/logging_demo/src/main.rs b/examples/logging_demo/src/main.rs
new file mode 100644
index 000000000..789a93e00
--- /dev/null
+++ b/examples/logging_demo/src/main.rs
@@ -0,0 +1,39 @@
+use rclrs::*;
+use std::time::Duration;
+
+fn main() -> Result<(), RclrsError> {
+ let mut executor = Context::default_from_env()?.create_basic_executor();
+ let node = executor.create_node("logging_demo")?;
+
+ let _subscription = node.clone().create_subscription(
+ "logging_demo",
+ move |msg: example_interfaces::msg::String| {
+ let data = msg.data;
+
+ // You can apply modifiers such as .once() to node.logger()
+ // to dictate how the logging behaves.
+ log!(node.logger().once(), "First message: {data}",);
+
+ log!(node.logger().skip_first(), "Subsequent message: {data}",);
+
+ // You can chain multiple modifiers together.
+ log_warn!(
+ node.logger().skip_first().throttle(Duration::from_secs(5)),
+ "Throttled message: {data}",
+ );
+ },
+ )?;
+
+ // Any &str can be used as the logger name and have
+ // logging modifiers applied to it.
+ log_info!(
+ "notice".once(),
+ "Ready to begin logging example_interfaces/msg/String messages published to 'logging_demo'.",
+ );
+ log_warn!(
+ "help",
+ "Try running\n \
+ $ ros2 topic pub logging_demo example_interfaces/msg/String \"data: message\"",
+ );
+ executor.spin(SpinOptions::default()).first_error()
+}
diff --git a/examples/minimal_client_service/src/minimal_client.rs b/examples/minimal_client_service/src/minimal_client.rs
index a8651b4a5..da287a6a1 100644
--- a/examples/minimal_client_service/src/minimal_client.rs
+++ b/examples/minimal_client_service/src/minimal_client.rs
@@ -1,4 +1,5 @@
use anyhow::{Error, Result};
+use example_interfaces::srv::*;
use rclrs::*;
fn main() -> Result<(), Error> {
@@ -6,31 +7,25 @@ fn main() -> Result<(), Error> {
let node = executor.create_node("minimal_client")?;
- let client = node.create_client::("add_two_ints")?;
+ let client = node.create_client::("add_two_ints")?;
- let request = example_interfaces::srv::AddTwoInts_Request { a: 41, b: 1 };
+ let promise = executor.commands().run(async move {
+ println!("Waiting for service...");
+ client.notify_on_service_ready().await.unwrap();
- println!("Starting client");
+ let request = AddTwoInts_Request { a: 41, b: 1 };
- while !client.service_is_ready()? {
- std::thread::sleep(std::time::Duration::from_millis(10));
- }
+ println!("Waiting for response");
+ let response: AddTwoInts_Response = client.call(&request).unwrap().await.unwrap();
- client.async_send_request_with_callback(
- &request,
- move |response: example_interfaces::srv::AddTwoInts_Response| {
- println!(
- "Result of {} + {} is: {}",
- request.a, request.b, response.sum
- );
- },
- )?;
+ println!(
+ "Result of {} + {} is: {}",
+ request.a, request.b, response.sum,
+ );
+ });
- std::thread::sleep(std::time::Duration::from_millis(500));
-
- println!("Waiting for response");
executor
- .spin(SpinOptions::default())
- .first_error()
- .map_err(|err| err.into())
+ .spin(SpinOptions::new().until_promise_resolved(promise))
+ .first_error()?;
+ Ok(())
}
diff --git a/examples/minimal_client_service/src/minimal_client_async.rs b/examples/minimal_client_service/src/minimal_client_async.rs
index c31f2e26e..7feb462ca 100644
--- a/examples/minimal_client_service/src/minimal_client_async.rs
+++ b/examples/minimal_client_service/src/minimal_client_async.rs
@@ -1,4 +1,5 @@
use anyhow::{Error, Result};
+use example_interfaces::srv::*;
use rclrs::*;
#[tokio::main]
@@ -7,7 +8,7 @@ async fn main() -> Result<(), Error> {
let node = executor.create_node("minimal_client")?;
- let client = node.create_client::("add_two_ints")?;
+ let client = node.create_client::("add_two_ints")?;
println!("Starting client");
@@ -15,20 +16,20 @@ async fn main() -> Result<(), Error> {
std::thread::sleep(std::time::Duration::from_millis(10));
}
- let request = example_interfaces::srv::AddTwoInts_Request { a: 41, b: 1 };
+ let request = AddTwoInts_Request { a: 41, b: 1 };
- let future = client.call_async(&request);
+ let promise = client
+ .call_then(&request, move |response: AddTwoInts_Response| {
+ println!(
+ "Result of {} + {} is: {}",
+ request.a, request.b, response.sum,
+ );
+ })
+ .unwrap();
println!("Waiting for response");
-
- let rclrs_spin = tokio::task::spawn_blocking(move || executor.spin(SpinOptions::default()));
-
- let response = future.await?;
- println!(
- "Result of {} + {} is: {}",
- request.a, request.b, response.sum
- );
-
- rclrs_spin.await.ok();
+ executor
+ .spin(SpinOptions::new().until_promise_resolved(promise))
+ .first_error()?;
Ok(())
}
diff --git a/examples/minimal_client_service/src/minimal_service.rs b/examples/minimal_client_service/src/minimal_service.rs
index 0fe681dbf..8142012dd 100644
--- a/examples/minimal_client_service/src/minimal_service.rs
+++ b/examples/minimal_client_service/src/minimal_service.rs
@@ -1,12 +1,15 @@
use anyhow::{Error, Result};
+use example_interfaces::srv::*;
use rclrs::*;
-fn handle_service(
- _request_header: &rclrs::rmw_request_id_t,
- request: example_interfaces::srv::AddTwoInts_Request,
-) -> example_interfaces::srv::AddTwoInts_Response {
- println!("request: {} + {}", request.a, request.b);
- example_interfaces::srv::AddTwoInts_Response {
+fn handle_service(request: AddTwoInts_Request, info: ServiceInfo) -> AddTwoInts_Response {
+ let timestamp = info
+ .received_timestamp
+ .map(|t| format!(" at [{t:?}]"))
+ .unwrap_or(String::new());
+
+ println!("request{timestamp}: {} + {}", request.a, request.b);
+ AddTwoInts_Response {
sum: request.a + request.b,
}
}
@@ -16,12 +19,9 @@ fn main() -> Result<(), Error> {
let node = executor.create_node("minimal_service")?;
- let _server = node
- .create_service::("add_two_ints", handle_service)?;
+ let _server = node.create_service::("add_two_ints", handle_service)?;
println!("Starting server");
- executor
- .spin(SpinOptions::default())
- .first_error()
- .map_err(|err| err.into())
+ executor.spin(SpinOptions::default()).first_error()?;
+ Ok(())
}
diff --git a/examples/minimal_pub_sub/Cargo.toml b/examples/minimal_pub_sub/Cargo.toml
index 209359698..ab7849541 100644
--- a/examples/minimal_pub_sub/Cargo.toml
+++ b/examples/minimal_pub_sub/Cargo.toml
@@ -29,7 +29,7 @@ path = "src/zero_copy_publisher.rs"
anyhow = {version = "1", features = ["backtrace"]}
rclrs = "0.4"
rosidl_runtime_rs = "0.4"
-std_msgs = "*"
+example_interfaces = "*"
# This specific version is compatible with Rust 1.75
backtrace = "=0.3.74"
diff --git a/examples/minimal_pub_sub/package.xml b/examples/minimal_pub_sub/package.xml
index da3e76041..3494e36bb 100644
--- a/examples/minimal_pub_sub/package.xml
+++ b/examples/minimal_pub_sub/package.xml
@@ -14,11 +14,11 @@
rclrs
rosidl_runtime_rs
- std_msgs
+ example_interfaces
rclrs
rosidl_runtime_rs
- std_msgs
+ example_interfaces
ament_cargo
diff --git a/examples/minimal_pub_sub/src/minimal_publisher.rs b/examples/minimal_pub_sub/src/minimal_publisher.rs
index f6f5d54da..2eaf409e2 100644
--- a/examples/minimal_pub_sub/src/minimal_publisher.rs
+++ b/examples/minimal_pub_sub/src/minimal_publisher.rs
@@ -7,9 +7,9 @@ fn main() -> Result<(), Error> {
let node = executor.create_node("minimal_publisher")?;
- let publisher = node.create_publisher::("topic")?;
+ let publisher = node.create_publisher::("topic")?;
- let mut message = std_msgs::msg::String::default();
+ let mut message = example_interfaces::msg::String::default();
let mut publish_count: u32 = 1;
diff --git a/examples/minimal_pub_sub/src/minimal_subscriber.rs b/examples/minimal_pub_sub/src/minimal_subscriber.rs
index a29b23e5f..7750c6062 100644
--- a/examples/minimal_pub_sub/src/minimal_subscriber.rs
+++ b/examples/minimal_pub_sub/src/minimal_subscriber.rs
@@ -7,19 +7,16 @@ fn main() -> Result<(), Error> {
let node = executor.create_node("minimal_subscriber")?;
- let mut num_messages: usize = 0;
-
- let _subscription = node.create_subscription::(
+ let worker = node.create_worker::(0);
+ let _subscription = worker.create_subscription::(
"topic",
- move |msg: std_msgs::msg::String| {
- num_messages += 1;
- println!("I heard: '{}'", msg.data);
- println!("(Got {} messages so far)", num_messages);
+ move |num_messages: &mut usize, msg: example_interfaces::msg::String| {
+ *num_messages += 1;
+ println!("#{} | I heard: '{}'", *num_messages, msg.data);
},
)?;
- executor
- .spin(SpinOptions::default())
- .first_error()
- .map_err(|err| err.into())
+ println!("Waiting for messages...");
+ executor.spin(SpinOptions::default()).first_error()?;
+ Ok(())
}
diff --git a/examples/minimal_pub_sub/src/minimal_two_nodes.rs b/examples/minimal_pub_sub/src/minimal_two_nodes.rs
index 968d14d1f..b34947687 100644
--- a/examples/minimal_pub_sub/src/minimal_two_nodes.rs
+++ b/examples/minimal_pub_sub/src/minimal_two_nodes.rs
@@ -1,47 +1,41 @@
use rclrs::*;
-use std::sync::{
- atomic::{AtomicU32, Ordering},
- Arc, Mutex,
-};
+use std::sync::Arc;
use anyhow::{Error, Result};
-struct MinimalSubscriber {
- num_messages: AtomicU32,
+struct MinimalSubscriberNode {
+ #[allow(unused)]
+ subscription: WorkerSubscription,
+}
+
+struct SubscriptionData {
node: Node,
- subscription: Mutex