10个重大版本

0.11.0 2024年4月28日
0.10.0 2024年3月16日
0.9.0 2024年1月13日
0.8.0 2023年12月14日
0.4.0 2023年7月16日

#216编码

Download history 140/week @ 2024-04-27 7/week @ 2024-05-04 4/week @ 2024-05-18 10/week @ 2024-05-25 5/week @ 2024-06-01 31/week @ 2024-06-08 150/week @ 2024-06-15 256/week @ 2024-06-22 105/week @ 2024-06-29 447/week @ 2024-07-06 375/week @ 2024-07-13 117/week @ 2024-07-20 225/week @ 2024-07-27 161/week @ 2024-08-03 66/week @ 2024-08-10

726 每月下载量
用于 rtcm-json

MIT/Apache

295KB
9K SLoC

rtcm-rs

Crates.io MIT/Apache 2.0 CI Minimum Rust Version

Unsafe-Zero-Percent

rtcm-rs是一个强大的Rust库,用于解码和编码RTCM标准10403.x中定义的RTCM版本3消息。该库目前提供了对标准最新版本3.4(10403.4)的完整支持。将根据版本发布情况添加对未来的版本支持。

秉承Rust的安全性原则,此库使用 #[forbid(unsafe_code)] 开发,确保所有操作都不会出现未定义行为、数据竞争和许多常见错误。因此,您不仅可以信赖rtcm-rs的功能,还可以信赖其对安全性的承诺。

此外,该库为Serde提供了强大的支持,Serde是一个功能强大的序列化和反序列化框架,可以方便地将RTCM消息转换为JSON、XML等格式。关于此功能的示例,请参阅rtcm-json库。

此外,该库与no_std兼容,不依赖于动态内存分配,适用于嵌入式环境。通过为每种消息类型提供功能标志,rtcm-rs可以根据您的需求进行调整,在必要时减少库大小。

功能

  • serde:用于添加序列化和反序列化支持。要启用此功能,请将以下内容添加到您的Cargo.toml文件中的rtcm-rs依赖项中
rtcm-rs = { version = "0.11.0", features=["serde"] }
  • 选择性消息支持:通过仅支持某些RTCM消息来最小化库大小。例如,要仅支持消息1004和1005,请按以下方式更新您的Cargo.toml
rtcm-rs = { version = "0.11.0", default-features=false, features=["msg1001","msg1005"] }
  • 不使用标准库:标准库的使用受std功能控制,该功能是库的默认功能。因此,要禁用标准库,请确保将default-features设置为false。
rtcm-rs = { version = "0.11.0", default-features=false }
  • test_gen:此功能仅用于在库开发期间生成测试,对于库的使用不是必需的。

用法

要将rtcm-rs添加到您的项目,请将以下内容添加到您的Cargo.toml文件中

[dependencies]
rtcm-rs = "0.11.0"

请记住,破折号形式的crate名称在rust源代码中转换为下划线形式的crate名称,即此crate的rtcm_rs。例如,要从导入预定义项添加以下内容

use rtcm_rs::prelude::*;

示例

以下是使用此库解码和编码 RTCM 消息的一些示例

基本 RTCM 消息解码

use rtcm_rs::prelude::*;
use std::io::Read;

fn main() {
    // Open the test data file containing RTCM messages
    let mut rtcm_file = std::fs::File::open("testdata/msg1001_3.rtcm").unwrap();
    let mut buffer = Vec::<u8>::new();
    
    // Read the entire file into the buffer
    if let Ok(_) = rtcm_file.read_to_end(&mut buffer) {
        // Use next_msg_frame function to extract the next RTCM message from the buffer
        if let (_, Some(message_frame)) = next_msg_frame(buffer.as_slice()) {            
            // Get the actual RTCM message from the frame
            let msg = message_frame.get_message();
            // Print the message
            println!("{:?}", msg);
        }
    }
}

使用迭代功能解码多个 RTCM 消息

use rtcm_rs::prelude::*;
use std::io::Read;

fn main() {
    // Open the test data file containing RTCM messages
    let mut rtcm_file = std::fs::File::open("testdata/msgs_1.rtcm").unwrap();
    let mut buffer = Vec::<u8>::new();

    if let Ok(_) = rtcm_file.read_to_end(&mut buffer) {
        // Create an iterator over the RTCM message frames in the buffer
        let mut iterator = MsgFrameIter::new(buffer.as_slice());

        // Iterate over the message frames and print the message number
        for message_frame in &mut iterator {
            println!("Message {}", message_frame.message_number().unwrap());
        }
    }    
}

编码 RTCM 消息

use rtcm_rs::prelude::*;
use rtcm_rs::msg::{Msg1001T, Msg1001Sat};
use rtcm_rs::util::DataVec;

fn main() {
    // Initialize a new message builder
    let mut message_builder = MessageBuilder::new();
    
    // Build the RTCM message
    let result = message_builder.build_message(&Message::Msg1001(Msg1001T {
        reference_station_id: 100,
        gps_epoch_time_ms: 0,
        synchronous_gnss_msg_flag: 0,
        divergence_free_smoothing_flag: 0,
        smoothing_interval_index: 0,
        satellites: {
            let mut satellites = DataVec::new();
            satellites.push(Msg1001Sat {
                gps_satellite_id: 20,
                gps_l1_code_ind: 0,
                l1_pseudorange_m: Some(20000000.0),
                l1_phase_pseudorange_diff_m: Some(0.2),
                l1_lock_time_index: 0,
            });
            satellites.push(Msg1001Sat {
                gps_satellite_id: 21,
                gps_l1_code_ind: 0,
                l1_pseudorange_m: Some(26000000.0),
                l1_phase_pseudorange_diff_m: Some(0.4),
                l1_lock_time_index: 0,
            });
            satellites
        },
    }));

    // If the message is successfully built, print the encoded bytes
    if let Ok(bytes) = result {
        println!("Encoded message: {:?}", bytes);
    }
}

在这个第三个示例中,我们演示了如何编码一个 RTCM 消息。我们首先初始化一个新的 MessageBuilder 实例,然后使用其 build_message 方法来构建一个新的 RTCM 消息。如果消息成功构建,则打印表示消息的字节序列。此示例展示了如何创建并编码一个包含卫星信息的复杂 RTCM 消息。

支持的消息

支持所有 RTCM v. 3.4 (10403.4) 消息。

版本 1.0 的路线图

  • 涵盖所有 RTCM 版本 3 消息
    • MSM 可观察消息
    • 站元数据消息
    • 辅助信息消息
    • 星历消息
    • SSR 消息
    • 转换参数消息
    • 投影参数消息
    • 网络 RTK 修正消息
    • 传统可观察消息
    • 版本 3.4 消息
  • 稳定 API(可能破坏某些向后兼容性)
    • 一致的消息数据类型(以及消息字段名称)
  • 扩展单元测试
  • 性能优化
  • 增强文档

变更日志

版本 0.11.0

此版本添加了对以下新消息的支持

  • NavIC 的 MSM 消息(1131-1137)
  • 新的 RTCM 3.4 消息(1300-1304)

此外,还修复了一些错误

  • 北斗 MSM 信号映射错误
  • 某些包含 f32 和 f64 类型字段的某些消息可能存在舍入误差。

版本 0.10.0

此更新包括使 API 更加一致的更改。不幸的是,这可能会在某些情况下破坏与先前版本的向后兼容性。

更改

  • 某些消息的字段名称修订,以及删除了一些具有向量和字符串的冗余长度字段。受影响的消息包括
    • 所有 MSM(1071-1127)
    • 1001
    • 1007
    • 1008
    • 1013
    • 1030
    • 1033
    • 1059
    • 1065
    • 1230
  • 删除并合并了一些向量/字符串容量常量
  • 添加了一个新特性 std,它控制对标准库的依赖。目的是更方便的错误处理,因为它允许 RtcmError 类型实现标准库的 Error 特性。特性 std 被定义为库的默认特性,因此要关闭它,需要在 Cargo.toml 中将 default-features 参数设置为 false。

版本 0.9.0

  • 全面支持 RTCM v. 3.3

许可证

MIT 或 Apache-2.0

依赖项

~425–730KB
~17K SLoC