Skip to content

Commit 6d3f7e4

Browse files
committed
Update examples
Signed-off-by: Michael X. Grey <[email protected]>
1 parent 1f1d826 commit 6d3f7e4

File tree

7 files changed

+66
-60
lines changed

7 files changed

+66
-60
lines changed
Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,32 @@
11
use anyhow::{Error, Result};
2+
use rclrs::{Context, SpinOptions, Promise};
23

34
fn main() -> Result<(), Error> {
4-
let mut executor = rclrs::Context::default_from_env()?.create_basic_executor();
5+
let mut executor = Context::default_from_env()?.create_basic_executor();
56

67
let node = executor.create_node("minimal_client")?;
78

89
let client = node.create_client::<example_interfaces::srv::AddTwoInts>("add_two_ints")?;
910

10-
let request = example_interfaces::srv::AddTwoInts_Request { a: 41, b: 1 };
11-
1211
println!("Starting client");
1312

1413
while !client.service_is_ready()? {
1514
std::thread::sleep(std::time::Duration::from_millis(10));
1615
}
1716

18-
client.async_send_request_with_callback(
19-
&request,
20-
move |response: example_interfaces::srv::AddTwoInts_Response| {
21-
println!(
22-
"Result of {} + {} is: {}",
23-
request.a, request.b, response.sum
24-
);
25-
},
26-
)?;
17+
let request = example_interfaces::srv::AddTwoInts_Request { a: 41, b: 1 };
18+
19+
let response: Promise<example_interfaces::srv::AddTwoInts_Response> = client.call(&request).unwrap();
2720

28-
std::thread::sleep(std::time::Duration::from_millis(500));
21+
let promise = executor.commands().run(async move {
22+
let response = response.await.unwrap();
23+
println!(
24+
"Result of {} + {} is: {}",
25+
request.a, request.b, response.sum,
26+
);
27+
});
2928

3029
println!("Waiting for response");
31-
executor
32-
.spin(rclrs::SpinOptions::default())
33-
.map_err(|err| err.into())
30+
executor.spin(SpinOptions::new().until_promise_resolved(promise))?;
31+
Ok(())
3432
}
Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use anyhow::{Error, Result};
2+
use rclrs::{Context, SpinOptions};
23

3-
#[tokio::main]
4-
async fn main() -> Result<(), Error> {
5-
let mut executor = rclrs::Context::default_from_env()?.create_basic_executor();
4+
fn main() -> Result<(), Error> {
5+
let mut executor = Context::default_from_env()?.create_basic_executor();
66

77
let node = executor.create_node("minimal_client")?;
88

@@ -16,19 +16,17 @@ async fn main() -> Result<(), Error> {
1616

1717
let request = example_interfaces::srv::AddTwoInts_Request { a: 41, b: 1 };
1818

19-
let future = client.call_async(&request);
19+
let promise = client.call_then(
20+
&request,
21+
move |response: example_interfaces::srv::AddTwoInts_Response| {
22+
println!(
23+
"Result of {} + {} is: {}",
24+
request.a, request.b, response.sum,
25+
);
26+
}
27+
).unwrap();
2028

2129
println!("Waiting for response");
22-
23-
let rclrs_spin =
24-
tokio::task::spawn_blocking(move || executor.spin(rclrs::SpinOptions::default()));
25-
26-
let response = future.await?;
27-
println!(
28-
"Result of {} + {} is: {}",
29-
request.a, request.b, response.sum
30-
);
31-
32-
rclrs_spin.await.ok();
30+
executor.spin(SpinOptions::new().until_promise_resolved(promise))?;
3331
Ok(())
3432
}
Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
use anyhow::{Error, Result};
2+
use rclrs::{Context, ServiceInfo, SpinOptions};
23

34
fn handle_service(
4-
_request_header: &rclrs::rmw_request_id_t,
55
request: example_interfaces::srv::AddTwoInts_Request,
6+
info: ServiceInfo,
67
) -> example_interfaces::srv::AddTwoInts_Response {
7-
println!("request: {} + {}", request.a, request.b);
8+
let timestamp = info
9+
.received_timestamp
10+
.map(|t| format!(" at [{t:?}]"))
11+
.unwrap_or(String::new());
12+
13+
println!("request{timestamp}: {} + {}", request.a, request.b);
814
example_interfaces::srv::AddTwoInts_Response {
915
sum: request.a + request.b,
1016
}
1117
}
1218

1319
fn main() -> Result<(), Error> {
14-
let mut executor = rclrs::Context::default_from_env()?.create_basic_executor();
20+
let mut executor = Context::default_from_env()?.create_basic_executor();
1521

1622
let node = executor.create_node("minimal_service")?;
1723

1824
let _server = node
1925
.create_service::<example_interfaces::srv::AddTwoInts, _>("add_two_ints", handle_service)?;
2026

2127
println!("Starting server");
22-
executor
23-
.spin(rclrs::SpinOptions::default())
24-
.map_err(|err| err.into())
28+
executor.spin(SpinOptions::default())?;
29+
Ok(())
2530
}
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
use anyhow::{Error, Result};
2+
use std::sync::Mutex;
3+
use rclrs::{Context, SpinOptions};
24

35
fn main() -> Result<(), Error> {
4-
let context = rclrs::Context::default_from_env()?;
6+
let context = Context::default_from_env()?;
57
let mut executor = context.create_basic_executor();
68

79
let node = executor.create_node("minimal_subscriber")?;
810

9-
let mut num_messages: usize = 0;
10-
11+
let num_messages = Mutex::new(0usize);
1112
let _subscription = node.create_subscription::<std_msgs::msg::String, _>(
1213
"topic",
1314
move |msg: std_msgs::msg::String| {
14-
num_messages += 1;
15+
let mut num = num_messages.lock().unwrap();
16+
*num += 1;
1517
println!("I heard: '{}'", msg.data);
16-
println!("(Got {} messages so far)", num_messages);
18+
println!("(Got {} messages so far)", num);
1719
},
1820
)?;
1921

20-
executor
21-
.spin(rclrs::SpinOptions::default())
22-
.map_err(|err| err.into())
22+
println!("Waiting for messages...");
23+
executor.spin(SpinOptions::default())?;
24+
Ok(())
2325
}
Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
use anyhow::{Error, Result};
2+
use std::sync::Mutex;
3+
use rclrs::ReadOnlyLoanedMessage;
24

35
fn main() -> Result<(), Error> {
46
let mut executor = rclrs::Context::default_from_env()?.create_basic_executor();
57

68
let node = executor.create_node("minimal_subscriber")?;
79

8-
let mut num_messages: usize = 0;
10+
let num_messages = Mutex::new(0usize);
911

1012
let _subscription = node.create_subscription::<std_msgs::msg::UInt32, _>(
1113
"topic",
12-
move |msg: rclrs::ReadOnlyLoanedMessage<'_, std_msgs::msg::UInt32>| {
13-
num_messages += 1;
14+
move |msg: ReadOnlyLoanedMessage<std_msgs::msg::UInt32>| {
15+
let mut num = num_messages.lock().unwrap();
16+
*num += 1;
1417
println!("I heard: '{}'", msg.data);
15-
println!("(Got {} messages so far)", num_messages);
18+
println!("(Got {} messages so far)", *num);
1619
},
1720
)?;
1821

19-
executor
20-
.spin(rclrs::SpinOptions::default())
21-
.map_err(|err| err.into())
22+
executor.spin(rclrs::SpinOptions::default())?;
23+
Ok(())
2224
}

examples/rust_pubsub/src/simple_publisher.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use rclrs::{Context, Executor, Publisher, RclrsError, SpinOptions, QOS_PROFILE_DEFAULT};
2-
use std::{sync::Arc, thread, time::Duration};
1+
use rclrs::{Context, Executor, Publisher, RclrsError, SpinOptions};
2+
use std::{thread, time::Duration};
33
use std_msgs::msg::String as StringMsg;
44

55
struct SimplePublisherNode {
@@ -26,7 +26,7 @@ impl SimplePublisherNode {
2626

2727
fn main() -> Result<(), RclrsError> {
2828
let mut executor = Context::default_from_env().unwrap().create_basic_executor();
29-
let node = Arc::new(SimplePublisher::new(&executor).unwrap());
29+
let node = SimplePublisherNode::new(&executor).unwrap();
3030
let mut count: i32 = 0;
3131
thread::spawn(move || loop {
3232
thread::sleep(Duration::from_millis(1000));

examples/rust_pubsub/src/simple_subscriber.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use rclrs::{Context, Executor, RclrsError, SpinOptions, Subscription, QOS_PROFILE_DEFAULT};
1+
use rclrs::{Context, Executor, RclrsError, SpinOptions, Subscription};
22
use std::{
33
sync::{Arc, Mutex},
44
thread,
@@ -7,7 +7,8 @@ use std::{
77
use std_msgs::msg::String as StringMsg;
88

99
pub struct SimpleSubscriptionNode {
10-
_subscriber: Arc<Subscription<StringMsg>>,
10+
#[allow(unused)]
11+
subscriber: Subscription<StringMsg>,
1112
data: Arc<Mutex<Option<StringMsg>>>,
1213
}
1314

@@ -16,15 +17,15 @@ impl SimpleSubscriptionNode {
1617
let node = executor.create_node("simple_subscription").unwrap();
1718
let data: Arc<Mutex<Option<StringMsg>>> = Arc::new(Mutex::new(None));
1819
let data_mut: Arc<Mutex<Option<StringMsg>>> = Arc::clone(&data);
19-
let _subscriber = node
20+
let subscriber = node
2021
.create_subscription::<StringMsg, _>(
2122
"publish_hello",
2223
move |msg: StringMsg| {
2324
*data_mut.lock().unwrap() = Some(msg);
2425
},
2526
)
2627
.unwrap();
27-
Ok(Self { _subscriber, data })
28+
Ok(Self { subscriber, data })
2829
}
2930
fn data_callback(&self) -> Result<(), RclrsError> {
3031
if let Some(data) = self.data.lock().unwrap().as_ref() {
@@ -37,7 +38,7 @@ impl SimpleSubscriptionNode {
3738
}
3839
fn main() -> Result<(), RclrsError> {
3940
let mut executor = Context::default_from_env().unwrap().create_basic_executor();
40-
let node = Arc::new(SimpleSubscriptionNode::new(&executor).unwrap());
41+
let node = SimpleSubscriptionNode::new(&executor).unwrap();
4142
thread::spawn(move || loop {
4243
thread::sleep(Duration::from_millis(1000));
4344
node.data_callback().unwrap()

0 commit comments

Comments
 (0)