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 DashingEloquentFoxy Galactic Humble
- Building Rust types
- Publish/subscribe
- Services
- Actions
- Parameter handling
After having sourced ROS2 (see README for more details), you can try the following example:
use futures::{executor::LocalPool, future, stream::StreamExt, 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 indexmap;
- 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§
- Causes compile time error ifuse_sim_timeis unsupported.
- 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 activeGoal
- Request to the action server to accept a newGoal.
- 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.
- ROS parameter.
- 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.
Constants§
Traits§
- Trait for use it withNode::make_derived_parameter_handler().
Type Aliases§
- r2r Result type.
Derive Macros§
- Derives RosParams trait for a structure to use it withr2r::Node::make_derived_parameter_handler().