10 个版本

0.3.0 2024年8月20日
0.2.5 2024年6月28日
0.2.2 2024年5月27日
0.2.0 2024年4月11日
0.1.1 2024年2月27日

#791 in 编码

Download history 2/week @ 2024-05-15 268/week @ 2024-05-22 51/week @ 2024-05-29 10/week @ 2024-06-05 184/week @ 2024-06-12 39/week @ 2024-06-19 138/week @ 2024-06-26 41/week @ 2024-07-03 74/week @ 2024-07-24 26/week @ 2024-07-31 85/week @ 2024-08-14

每月下载量 185
用于 3 crates

MIT 许可证

6.5MB
6K SLoC

rs1090

rs1090 是一个用于解码 Mode S、ADS-B 和 FLARM 消息的 Rust 库。

它从 Python pyModeS 库中汲取灵感,并使用 deku 以清晰声明的方式解码二进制数据。

该项目最初是名为 adsb-deku 的类似项目的分支,但已重构模块以匹配 pyModeS 设计,实现了广泛的审查、简化、纠正和完成。

rs1090 的目标方向归结为

  • 提高 Python 中 Mode S 解码的性能;
  • 将轨迹数据导出到跨平台格式,如 JSON 或 parquet;
  • 提供高效的多接收器 Mode S 解码;
  • 为外部应用程序提供实时丰富轨迹数据。

如果您只想从您的树莓派中解码 ADS-B 消息并在地图上可视化数据,您可能希望坚持使用 dump0190 的某个实现。

rs1090 库附带一个配套应用程序 decode1090 和一个 Python 绑定 rs1090

性能

在解码欧洲航班(从起飞到降落)时进行的基准测试

  • pyModeS 在完整的 Python 模式下;
  • pyModeS 使用 Cython 编译的函数;
  • rs1090 在单个核心上使用 Python 绑定(为了公平比较);
  • rs1090 在多个核心上使用 Python 绑定 (默认)
  • 在多个核心上执行完整的 Rust rs1090 基准测试 (默认)

基准测试的 Python 脚本在 python/examples
使用 cargo bench 执行 Rust 基准测试。
两个脚本都在 Intel(R) Core(TM) i7-10850H CPU @ 2.70GHz 上运行。

[!NOTE]
rs1090的默认出厂模式是在所有核心上执行。这个基准测试是在一台普通笔记本电脑上进行的。在超级计算机上可能会更快,但考虑到现在大多数笔记本电脑至少有4个核心,这个基准测试可以提供你自己在电脑上应该获得的速度提升。

安装

在项目目录中运行以下Cargo命令:

cargo add rs1090

或者将以下行添加到你的Cargo.toml中:

rs1090 = "1.0.0"  # check for the latest version, we are not there yet

用法

use hexlit::hex;
use rs1090::prelude::*;

fn main() {
    let bytes: [u8; 14] = hex!("8c4841753a9a153237aef0f275be");
    // ADS-B decoding
    if let Ok((_, msg)) = Message::from_bytes((&bytes, 0)) {
        // JSON output
        let json = serde_json::to_string(&msg).expect("JSON error");
        println!("{}", json);
    }
}

crates/rs1090/examples文件夹中查看更多示例。

Python绑定

你可以使用以下命令安装为大多数Python版本编译的绑定:

pip install rs1090

该库提供了一个名为decode()的单个多功能函数

>>> import rs1090
>>> rs1090.decode("8c4841753a9a153237aef0f275be")
{'df': '17',
 'icao24': '484175',
 'bds': '06',
 'NUCp': 7,
 'groundspeed': 17.0,
 'track': 92.8125,
 'parity': 'odd',
 'lat_cpr': 39195,
 'lon_cpr': 110320}

对于Python中的大量消息(例如,您可以通过pyopensky下载的消息)

>>> import rs1090
>>> rs1090.decode(msg_list, ts_list)  # includes CPR to position decoding
...
>>> rs1090.decode(msg_list, ts_list, reference=(lat0, lon0))  # useful for surface messages
...

对于FLARM消息(也作为批量处理)

>>> msg = "7bf2381040ccc7e2395ecaa28e033a655d47e1d91d0bf986e1b0"
>>> rs1090.flarm(msg, 1655279476, 43.61924, 5.11755)
{'timestamp': 1655279476,
 'reference_lat': 43.61924,
 'reference_lon': 5.11755,
 'icao24': '38f27b',
 'is_icao24': True,
 'actype': 'Glider',
 'latitude': 43.6812864,
 'longitude': 5.150585599999999,
 'geoaltitude': 970,
 'vertical_speed': 1.0,
 'groundspeed': 18.698261951315153,
 'track': 29.655457935479006,
 'no_track': False,
 'stealth': False,
 'gps': 129}

decode1090

预构建的二进制文件可在发布页面上找到。
使用帮助命令可以查看用法。

decode1090 --help

jet1090

预构建的二进制文件可在发布页面上找到。
使用帮助命令可以查看用法。

jet1090 --help

nix

此存储库提供了一个用于构建和管理此项目的Nix flake配置。

nix develop  # open a shell with the proper environment to compile rs1090
nix build  # build the jet1090 executable
nix run  # run the jet1090 executable
nix profile install  # install jet1090 and decode1090 in your PATH

依赖关系

~10–19MB
~257K SLoC