15 个版本

0.2.4 2024 年 3 月 25 日
0.2.3 2024 年 1 月 26 日
0.1.8 2024 年 1 月 9 日
0.1.5 2023 年 12 月 30 日
0.1.0-alpha2 2023 年 11 月 13 日

80机器人

Download history 10/week @ 2024-03-11 145/week @ 2024-03-18 221/week @ 2024-03-25 49/week @ 2024-04-01 29/week @ 2024-04-08 7/week @ 2024-04-15 18/week @ 2024-04-22 10/week @ 2024-04-29 6/week @ 2024-05-06 19/week @ 2024-05-13 33/week @ 2024-05-20 24/week @ 2024-05-27 27/week @ 2024-06-03 28/week @ 2024-06-10 25/week @ 2024-06-17 23/week @ 2024-06-24

每月 下载 105
4 个 Crates 中使用 (通过 mavspec_rust_gen)

MIT/Apache

430KB
5K SLoC

MAVInspect

Rust 库,用于解析 MAVLink XML 定义。

🇺🇦 repository crates.io docs.rs issues

关于 MAVLink 的更多信息

MAVLink 是一种轻量级开源协议,用于无人机、机载组件和地面控制站之间的通信。它被像 PX4ArduPilot 这样的自动驾驶仪使用。MAVLink 具有简单紧凑的序列化模型。基本抽象是 message,可以通过链路(UDP、TCP、UNIX 套接字、UART 等)发送,并反序列化为具有原始类型或原始类型数组的结构体。这些字段可以通过 enum 变体进一步限制,并使用元数据(如度量单位、默认值或无效值)进行注释。

存在几种MAVLink方言。官方方言定义是可以在MAVlink 仓库中找到的XML文件。基于message抽象,MAVLink定义了所谓的microservices,它指定了客户端在特定条件下对特定消息的响应方式,或者如何启动特定操作。

这个库是其他MAVLink相关工具(代码生成器、遥测收集器、IO等)的构建块。我们故意将所有与协议检查无关的内容移到了其他Mavka项目中。

什么是Mavka?

Mavka是一个工具集合,用于解析、存储和通信由Rust编写的MAVLink数据。特别是

  • MAVSpec负责代码生成。
  • Mavio是一个用Rust编写的最小化MAVLink通信库。它支持no-std(和no-alloc)目标,并专注于MAVLink协议的无状态部分。
  • Maviola是一个基于Mavio的MAVLink通信库,它提供了一个高级接口来处理MAVLink消息,并处理协议的有状态功能:排序、消息时间戳、自动心跳、简化消息签名等。

本项目遵循semantic versioning。根据规范,在达到版本1.0.0之前,可以在次要版本中引入破坏性更改。然而,只要可能,我们将在unstable功能标志下保持不稳定的功能。

安装

使用cargo安装MAVSpec

cargo add mavinspect

用法

./message_definitions解析标准自定义XML定义

use mavinspect::parser::Inspector;

fn main() {
    // Instantiate inspector and load list of XML definitions
    let inspector = Inspector::builder()
        .set_sources(&[
            "./message_definitions/standard",
            "./message_definitions/extra",
        ])
        .build()
        .unwrap();
    
    // Parse all XML definitions
    let protocol = inspector.parse().unwrap();
    
    // Get `minimal` dialect
    let minimal = protocol.dialects().get("minimal").unwrap();
    
    // Get `HEARTBEAT` message
    let heartbeat = minimal.get_message_by_name("HEARTBEAT").unwrap();
    println!("\n`HEARTBEAT` message: {:#?}", heartbeat);
}

有关高级用法,请参阅示例API 文档

方言命名

为了避免在库中使用MAVInspect进行代码生成时,类似名称(如SomeDialectsome_dialect)之间的冲突,我们匹配到lower_snake_case。这意味着SomeDialectSOME_DIALECTsome_dialect将被视为相同的,而somedialect将被视为不同的方言。

示例

  • parser — 解析XML定义。
    cargo run --example parser --features=serde
    

路线图

API被认为是相对稳定的,但某些高级功能仍需开发。然而,这些功能大多是锦上添花的,而不是使这个库完整的必要条件。

里程碑v1包含被认为达到稳定版本1.0.0所必需的功能。

存在一些实验性功能,可能发布也可能不发布。其中大部分与gRPC里程碑相关。

欢迎提出建议拉取请求

首先,值得提到的是官方的Rust语言MAVLink客户端:rust-mavlink。编写这个库的一个原因是将解析器和代码生成器解耦成独立的项目。

我本人受到了MAVLink(Go语言)的gomavlib库的启发。我喜欢它的编写方式,其源代码在某些情况下帮助我解决了官方MAVLink文档不够清晰的问题。

如果你想要自动生成语言绑定并且偏好Python,可能会对官方的mavgen代码生成工具感兴趣。如果你需要MAVLink消息的路由器,我们建议使用mavp2p。如果你需要一个支持MAVLink微服务的解决方案,那么值得检查使用gRPC API的MAVSDK

MAVLink已经有近15年的历史了,但围绕这个协议的生态系统仍然充满活力,不断发展。一些项目稳定且健壮,而另一些则功能丰富但尚不完整。

许可证

我们在这里简单遵守根据Rust API指南(C-PERMISSIVE)提出的双重许可建议。

以下两种许可证中选择其一:

由你选择。

贡献

除非你明确声明,否则你根据Apache-2.0许可证定义,有意提交给作品包含在内的任何贡献,都应如上双重许可,没有任何附加条款或条件。

依赖关系

~4–6MB
~102K SLoC