# 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>