transforms_io 0.1.0

IO layer for the transforms crate with ROS2 and Minot.
Documentation
# transforms_io

An IO layer for the [transforms](https://crates.io/crates/transforms) crate.

`transforms_io` provides ROS2 message handling for the middleware-independent [transforms](https://crates.io/crates/transforms) crate. It bridges ROS2 message types with the transform engine, supporting multiple ROS backends and [Minot](https://crates.io/crates/mt_pubsub).

## Alternatives

For roslibrust, use the [roslibrust_transforms](https://crates.io/crates/roslibrust_transforms) crate.

## Installation

Add to your `Cargo.toml`:

```toml
[dependencies]
transforms_io = "*"

# Enable exactly one backend
[features]
default = []
# Choose one:
# r2r = ["transforms_io/r2r"]
# ros2-client = ["transforms_io/ros2-client"]
# mt-pubsub = ["transforms_io/mt-pubsub"]
```

## Usage

### r2r Backend

Two modes available:

#### Threads

```rust
use transforms_io::r2r_backend::{TfBroadcaster, TfListener};

// Create broadcaster
let broadcaster = TfBroadcaster::new(&mut node);

// Create listener (spawns blocking threads)
let listener = TfListener::new(&mut node);

// Lookup transform
let tf = listener.lookup_transform("base_link", "sensor", time)?;
```

#### Async

Enable `r2r-async` feature:

```toml
[dependencies]
transforms_io = { version = "0.1", features = ["r2r-async"] }
```

```rust
use transforms_io::r2r_backend::TfListener;

// Returns listener + two futures to spawn on your runtime
let (listener, dynamic_fut, static_fut) = TfListener::new_async(&mut node);

// Spawn on your async runtime
tokio::spawn(dynamic_fut);
tokio::spawn(static_fut);

// Use listener
let tf = listener.lookup_transform("base_link", "sensor", time)?;
```

### ros2-client Backend

```rust
use transforms_io::ros2_client_backend::{TfBroadcaster, TfListener};

let listener = TfListener::new(&mut node);
let tf = listener.lookup_transform("map", "base_link", time)?;
```

### mt-pubsub Backend

```rust
use transforms_io::mt_pubsub_backend::{TfBroadcaster, TfListener};
use std::sync::Arc;
use tokio::runtime::Runtime;

let rt = Arc::new(Runtime::new().unwrap());
let listener = TfListener::new(&node, rt);
let tf = listener.lookup_transform("map", "base_link", time)?;
```

### License

<sup>
Licensed under either of <a href="LICENSE-APACHE">Apache License, Version
2.0</a> or <a href="LICENSE-MIT">MIT license</a> at your option.
</sup>

<br>

<sub>
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in this crate by you, as defined in the Apache-2.0 license, shall
be dual licensed as above, without any additional terms or conditions.
</sub>