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 在 编码
726 每月下载量
用于 rtcm-json
295KB
9K SLoC
rtcm-rs
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