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次
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 序列化/反序列化
我们正在使用库 serde 和 serde_json 的组合,这使得以各种方式处理 JSON 变得容易——包括与 Rust 类型/结构体对应的强类型,这正是我们在 Config 加载/保存中需要的。
透视变换
我们正在尝试从 ROI 到归一化的“方形”输出四边形执行“四边形到四边形投影”,类似于 OG Agent 中的 perspective-transform。
到目前为止
- https://www.physicsforums.com/threads/transform-that-maps-points-from-any-quad-to-an-reactangle.833996/
- https://docs.rs/projective/0.3.0/projective/trait.Projective.html 提供了必要的 API - 我认为需要应用给任何给定点的 3x3(或是否是 4x4?)矩阵。可以通过复制 https://github.com/jlouthan/perspective-transform/blob/master/dist/perspective-transform.js 来解决这个问题?
- https://math.stackexchange.com/questions/296794/finding-the-transform-matrix-from-4-projected-points-with-javascript/339033#339033
- https://stackoverflow.com/questions/14244032/redraw-image-from-3d-perspective-to-2d/14244616#14244616
- https://blog.mbedded.ninja/mathematics/geometry/projective-transformations/
- https://en.wikipedia.org/wiki/Homography#Mathematical_definition
- https://docs.rs/cgmath/0.18.0/cgmath/struct.Perspective.html
- https://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/
- https://yasenh.github.io/post/homogeneous-coordinates/
最终,我们使用了 ndarray
(它已经安装,以支持聚类计算)和 nalgebra
的组合。
日志记录
我们正在使用 log 和 env-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