#激光雷达 #代理 #NodeJS #系统 #聚类 # #合并器

app tether-lidar2d-consolidation

栓激光雷达2D合并代理,Rust版本

6个版本

0.5.1 2023年11月15日
0.5.0 2023年11月10日
0.4.0 2023年11月7日
0.3.3 2023年11月7日

#1 in #栓

每月下载量 43次

MIT 许可证

59KB
1K SLoC

栓激光雷达2D合并,使用Rust实现

这最初是直接从原始NodeJS代理(在此称为“原始代理”✌️)移植到Rust 🦀。v0.3之后,已添加了一些新功能。

两个主要目标是

  • 学习在真实世界应用中使用Rust,遵循一个已知且基本工程挑战已“解决”的现有代码库
  • 生产一个更快速、更轻量级的Lidar合并代理版本,可以在资源较少的平台(例如Raspberry Pi)上部署,而不会对系统造成太大压力

Cargo轻松安装

从v0.3.1开始,您可以通过Cargo安装二进制文件,即

cargo install tether-lidar2d-consolidation

...然后运行

tether-lidar2d-consolidation

命令行配置

您可以通过在执行命令后附加 --help 来查看所有可用的命令行参数,例如 tether-lidar2d-consolidation --help(已安装)或 cargo run -- --help(开发)

选项故意设置为与原始代理中使用的选项几乎相同,但有少数显著例外

  • 这里我们使用一个标志 --perspectiveTransform.includeOutside 而不是设置布尔值 ignoreOutside。这更好地反映了默认用法,并且在使用标志时更有意义(如果不明确添加,则默认为 false
  • 对于Tether,如果您想要不同的默认值,可以选择提供 --tether.host--tether.username--tether.password
  • 没有与 autoBroadcastConfig 相关的选项,因为没有这个行为的需求;我们基本上每次更改配置时都保存和(重新)发布配置,在启动时以及当请求时

开发依赖项

如果您在自己的系统上编译,Paho Eclipse MQTT有一些(非Rust)依赖项。在Mac上,您可能需要以下内容

brew install openssh cmake

在Linux上

sudo apt install libssl-dev build-essential cmake

关于库的说明

MQTT客户端

最初我们尝试使用 mqtt-rs,因为它看起来相对简单易用,但未来 mqttrs 可能会“更好”。

目前我们已经选择了 paho-mqtt,因为它似乎得到了很好的支持,并在实际场景中提供了示例(特别是异步)。

MessagePack编码/解码

rmp_serde 适用于 JSON 和 MsgPack 序列化/反序列化。我们可能没有在所有地方充分利用零拷贝操作,但这需要更多时间来弄清楚。

最初我们尝试了 msgpack-simple,它警告说“性能不如静态解决方案”,但作为起点使用起来容易得多。

聚类

我们尝试了库 kddbscan,尽管这可能非常“准确”,但它似乎运行得太慢。无论如何,这与 OG Agent 中使用的 DBSCAN 算法非常不同。

然后我们选择了更朴实的(但据称性能更好的)petal-clustering。这又需要某种称为 ndarray 的东西,它看起来非常相似(并且可能基于)Python 中的 numpy

目前,我们使用 OG Agent 中的 DBSCAN 方法,但在将来,可能值得测试这个库支持的另一种模式 HDbscan,这可能更快(见 该论文)。

另一种可能性可能是库 linfa-clustering

JSON 序列化/反序列化

我们正在使用库 serdeserde_json 的组合,这使得以各种方式处理 JSON 变得容易——包括与 Rust 类型/结构体对应的强类型,这正是我们在 Config 加载/保存中需要的。

透视变换

我们正在尝试从 ROI 到归一化的“方形”输出四边形执行“四边形到四边形投影”,类似于 OG Agent 中的 perspective-transform

到目前为止

最终,我们使用了 ndarray(它已经安装,以支持聚类计算)和 nalgebra 的组合。

日志记录

我们正在使用 logenv-logger。默认将日志级别设置为 INFO,但可以覆盖,例如,通过环境变量前缀,例如。

RUST_LOG=debug cargo run

命令行配置

我们正在使用 clap,它仅进行命令行参数解析(不使用文件、环境变量等)

类似于 more-config 的东西可能很有用,因为它包含与 NodeJS 的 rc 包类似的功能。

与 OG 版本的一些不同之处

  • 不再有 requestLlidarConfig 插件;使用 MQTT 的 retain 功能为所有客户端提供持久且最新的配置。
  • 平滑功能已集成到本代理中;无需再运行单独的 tether-tracking-smooth 代理
  • 可以在本代理中设置“存在检测”区域

有用资源

  • 通用配方,包括一些三角函数:[https://rust-lang-nursery.github.io/rust-cookbook/about.html](https://rust-lang-nursery.github.io/rust-cookbook/about.html)
  • MessagePack 规范(包括支持类型的详细信息):[https://github.com/msgpack/msgpack/blob/master/spec.md](https://github.com/msgpack/msgpack/blob/master/spec.md)
  • Rust 举例,包括自定义类型(结构体):[https://doc.rust-lang.net.cn/rust-by-example/custom_types/structs.html](https://doc.rust-lang.net.cn/rust-by-example/custom_types/structs.html)
  • Rust 编程语言“书籍”,包括有关哈希表的有用信息:[https://doc.rust-lang.net.cn/book/ch08-03-hash-maps.html](https://doc.rust-lang.net.cn/book/ch08-03-hash-maps.html)
  • 通过 VSCode + LLDB 调试的实用技巧

依赖项

~27–39MB
~714K SLoC