Expand description
Easy to use, runtime-agnostic async rust bindings for ROS2.
Minimal bindings for ROS2 that do not require hooking in to the
ROS2 build infrastructure – cargo build
is all you
need. Convenience Rust types are created by calling into the c
introspection libraries. This circumvents the ROS2 .msg/.idl
pipeline by relying on already generated C code. By default, the
behavior is to build bindings to the RCL and all message types
that can be found in the currently sourced ros environment.
What works?
- Up to date with ROS2 ~Dashing~ ~Eloquent~ Foxy Galactic
- Building Rust types
- Publish/subscribe
- Services
- Actions
- Rudimentary parameter handling
After having sourced ROS2 (see README for more details), you can try the following example:
use futures::executor::LocalPool;
use futures::future;
use futures::stream::StreamExt;
use futures::task::LocalSpawnExt;
use r2r::QosProfile;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let ctx = r2r::Context::create()?;
let mut node = r2r::Node::create(ctx, "node", "namespace")?;
let subscriber = node.subscribe::<r2r::std_msgs::msg::String>("/topic", QosProfile::default())?;
let publisher = node.create_publisher::<r2r::std_msgs::msg::String>("/topic", QosProfile::default())?;
let mut timer = node.create_wall_timer(std::time::Duration::from_millis(1000))?;
// Set up a simple task executor.
let mut pool = LocalPool::new();
let spawner = pool.spawner();
// Run the subscriber in one task, printing the messages
spawner.spawn_local(async move {
subscriber.for_each(|msg| {
println!("got new msg: {}", msg.data);
future::ready(())
}).await
})?;
// Run the publisher in another task
spawner.spawn_local(async move {
let mut counter = 0;
loop {
let _elapsed = timer.tick().await.unwrap();
let msg = r2r::std_msgs::msg::String { data: format!("Hello, world! ({})", counter) };
publisher.publish(&msg).unwrap();
counter += 1;
}
})?;
// Main loop spins ros.
loop {
node.spin_once(std::time::Duration::from_millis(100));
pool.run_until_stalled();
}
}
Re-exports
pub extern crate uuid;
pub use qos::QosProfile;
Modules
QoS (Quality of Service)
full credit goes to https://github.com/rclrust/rclrust/blob/main/rclrust/src/qos.rs
Macros
Debug log message.
Error log message.
Fatal log message.
Info log message.
Warning log message.
Structs
Action client
Action client goal handle
Action client goal handle (untyped)
Action client (untyped)
Request to cancel an active goal.
A handle to an active
Goal
Request to the action server to accept a new
Goal
.ROS service client.
ROS “untyped” service client.
A ROS clock.
A ROS context. Needed to create nodes etc.
This struct wraps a RCL message.
A ROS Node.
A ROS (typed) publisher.
A ROS (untyped) publisher.
Encapsulates a service request.
A ROS timer.
Enums
Different ROS clock types.
r2r Error type.
The status of a goal.
Logging severity
ROS parameter value.
Traits
Type Definitions
r2r Result type.