Crate r2r

source ·
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

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.