#websocket #foxglove #messages #data #publish #applications

foxglove-ws

用于通过 WebSocket 向 Foxglove 发布消息的库

5 个版本

0.2.2 2023 年 10 月 2 日
0.2.1 2023 年 7 月 5 日
0.2.0 2023 年 6 月 29 日
0.1.1 2023 年 6 月 18 日
0.1.0 2023 年 6 月 18 日

77机器人 中排名

Download history 2/week @ 2024-05-28 30/week @ 2024-06-04 30/week @ 2024-06-11 55/week @ 2024-07-23 19/week @ 2024-07-30

74 每月下载量

Apache-2.0

19KB
353 代码行

Rust 中的 Foxglove WebSocket 发布

此库提供在 Rust 中将消息发布到惊人的 Foxglove UI 的方法。它实现了 Foxglove WebSocket 协议的一部分,该协议在 https://github.com/foxglove/ws-protocol 中描述。

示例

调用

cargo run --release --example string

以启动一个示例应用程序,该应用程序发布 ROS 1 字符串数据 -- 既有 latching 也有 non-latching。


lib.rs:

此库提供在 Rust 中将消息发布到惊人的 Foxglove UI 的方法。它实现了 Foxglove WebSocket 协议的一部分,该协议在 https://github.com/foxglove/ws-protocol 中描述。

该协议本身不固定消息的具体数据方案。但为了 Foxglove 能够理解这些消息,遵循众所周知的序列化方案 https://mcap.dev/spec/registry 是有意义的。

示例

这是一个使用单个 ROS1 通道/主题和 std_msgs/String 消息类型的示例。

use std::{io::Write, time::SystemTime};

fn build_string_message(data: &str) -> anyhow::Result<Vec<u8>> {
    let mut msg = vec![0; std::mem::size_of::<u32>() + data.len()];
    // ROS 1 message strings are encoded as 4-bytes length and then the byte data.
    let mut w = std::io::Cursor::new(&mut msg);
    w.write(&(data.len() as u32).to_le_bytes())?;
    w.write(data.as_bytes())?;
    Ok(msg)
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let server = foxglove_ws::FoxgloveWebSocket::new();
    tokio::spawn({
        let server = server.clone();
        async move { server.serve(([127, 0, 0, 1], 8765)).await }
    });
    let channel = server
        .publish(
            "/data".to_string(),
            "ros1".to_string(),
            "std_msgs/String".to_string(),
            "string data".to_string(),
            "ros1msg".to_string(),
            false,
        )
        .await?;
    channel
        .send(
            SystemTime::now().elapsed().unwrap().as_nanos() as u64,
            &build_string_message("Hello!")?,
        )
        .await?;
}

依赖项

~9–19MB
~262K SLoC