| Crates.io | roslibrust_genmsg |
| lib.rs | roslibrust_genmsg |
| version | 0.19.0 |
| created_at | 2024-05-13 15:45:52.005139+00 |
| updated_at | 2026-01-14 23:40:59.406009+00 |
| description | A tool for generating source code from ROS message definitions |
| homepage | |
| repository | https://github.com/Carter12s/roslibrust |
| max_upload_size | |
| id | 1238587 |
| size | 135,153 |
Documentation about the crate is on docs.rs, extended guides can be found on roslibrust.github.io
An async rust library for interfacing with ROS1 and ROS2, built on Tokio.
This allows writing generic behaviors like:
# use roslibrust_test::ros1::*;
use roslibrust::{TopicProvider, Publish, Subscribe};
async fn relay<T: TopicProvider>(ros: T) -> roslibrust::Result<()> {
let mut subscriber = ros.subscribe::<std_msgs::String>("/in").await?;
let mut publisher = ros.advertise::<std_msgs::String>("/out").await?;
while let Ok(msg) = subscriber.next().await {
println!("Got message: {}", msg.data);
publisher.publish(&msg).await?;
}
Ok(())
}
#[tokio::main]
async fn main() -> roslibrust::Result<()> {
// Relay messages over a native ROS2 connection using Zenoh
// #[cfg(feature = "ros2")]
// {
// let ros = roslibrust::ros2::NodeHandle::new("http://localhost:11311", "relay").await?;
// relay(ros).await?;
// }
// Relay messages over a native ROS1 connection via TCPROS
#[cfg(feature = "ros1")]
{
let ros = roslibrust::ros1::NodeHandle::new("http://localhost:11311", "relay").await?;
relay(ros).await?;
}
// Relay messages over a zenoh connection compatible with zenoh-ros1-plugin / zenoh-ros1-bridge
#[cfg(feature = "zenoh")]
{
let ros = roslibrust::zenoh::ZenohClient::new(zenoh::open(zenoh::Config::default()).await.unwrap());
relay(ros).await?;
}
// Relay messages over a rosbridge_server connection with either ROS1 or ROS2!
#[cfg(feature = "rosbridge")]
{
let ros = roslibrust::rosbridge::ClientHandle::new("ws://localhost:9090").await?;
relay(ros).await?;
}
// Relay messages over a mock ROS connection for testing
#[cfg(feature = "mock")]
{
let ros = roslibrust::mock::MockRos::new();
relay(ros).await?;
}
Ok(())
}
All of this is backed by common traits for ROS messages, topics, and services. roslibrust_codegen provides generation of Rust types from both ROS1 and ROS2 .msg/.srv files and
roslibrust_codegen_macro provides a convenient macro for generating these types:
// Will generate types from all packages in ROS_PACKAGE_PATH
roslibrust_codegen_macro::find_and_generate_ros_messages!();
If you want to see what the generated code looks like checkout our generated messages in our test crate.
While the macro is useful for getting started, we recommend using roslibrust_codegen with a build.rs as shown in example_package.
This allows cargo to know when message files are edited and automatically re-generate the code.
Contribution through reporting of issues encountered and implementation in PRs is welcome! Before landing a large PR with lots of code implemented, please open an issue if there isn't a relevant one already available and chat with a maintainer to make sure the design fits well with all supported platforms and any in-progress implementation efforts.
We uphold the rust lang Code of Conduct.
MSRV is currently 1.85 to support edition 2024.