4个版本 (重大变更)
0.4.0 | 2023年4月20日 |
---|---|
0.3.0 | 2023年4月19日 |
0.2.0 | 2023年4月8日 |
0.1.0 | 2023年4月8日 |
在机器人类别中排名第80
每月下载量37次
2MB
20K SLoC
包含(静态库,1MB)lib/librobotcontrol.a,(ELF可执行文件/库,37KB)am335x-pru0-rc-encoder-fw,(ELF可执行文件/库,36KB)am335x-pru1-rc-servo-fw
librobotcontrol-sys
BeagleBone板上机器人相关功能的底层库。你可能希望将你使用的功能子集封装在更自然/更安全的Rust代码中。
请参阅最新版本的rust API文档。还可以参阅librobotcontrol
API文档和示例。大部分内容相同。例如,在C/C++中你会调用
rc_button_init(...)
在rust中你会调用
unsafe { librobotcontrol_sys::rc_button_init(...) }
。
示例
示例请见examples/heading.rs
。这可以通过连接你的BeagleBone进行交叉编译并运行来部署。
# Add the target for cross-compilation
rustup target add armv7-unknown-linux-musleabihf
# Build, deploy & run on BeagleBone
make deploy-heading-example
实现细节
弄清楚所有这些细节非常痛苦。在研究时,似乎其他人也经历了类似的挑战,所以也许详细说明一部分细节将有助于他人。只想使用这个库的人不需要知道所有这些细节。
与默认的librobotcontrol
设置不同,这个版本使用musl而不是glibc,这使得交叉编译过程变得直接。但是这样做有点棘手。使用librobotcontrol
的构建设置需要大量修改,并在主机系统上强制使用一些非常具体且难以设置的工具链。使用cc
crate创建自定义构建设置可以避免前者的问题,但仍然会遭受后者的困扰。经过几天尝试使用这两种策略中的任何一种来解决问题后,我放弃了——即使我解决了它,它也绝对不具有良好的可移植性。
为了避免上述问题,我们通过docker BuildKit在alpine上构建librobotcontrol
。但是,较新版本的alpine使用musl 1.2.x,它在32位机器上使用64位时间,而由libc crate静态链接的musl 1.1.x在32位机器上使用32位时间,导致链接错误。有一个兼容性补丁可以解决这个问题,但似乎使用较旧版本的alpine(该版本包含musl 1.1.x)更容易也更安全。假设你已经安装了docker BuildKit和相应的VM设置(这是一个很大的假设!),重新生成库就像这样简单:make lib/librobotcontrol.a
。通常情况下,你不必这样做,因为库已经包含在内。
我们还想提前构建bindgen绑定,因为这样做需要安装库,但在主机机器上不太可能这样做。然而,较旧的alpine版本没有为rust提供apk
软件包,而rustup也没有提供为armv7-unknown-linux-musleabihf
安装的方式——这有点令人惊讶,因为我们可以很好地为它交叉编译rust代码。所以为了构建绑定,有一个使用较新版本的alpine的单独alpine容器,该版本有一个为rust提供的apk
软件包。
该版本的alpine还有一个rustfmt
软件包,但不知何故,与bindgen-cli
一起使用会导致后者永远无法完成。所以我们只是在代码从容器中复制出来后,在主机机器上格式化代码。重新构建这些绑定应该就像这样简单:make src/bindings.rs
。但同样,通常情况下你不必这样做,因为绑定已经提交。
librobotcontrol
导出的大多数内容都没有包含在bindings.rs
中,因为库重新导出了所有各种东西,这些都有更安全、等效的rust版本,例如libm函数。我可能过分热情地进行了筛选,所以请随意提交PR以包含您需要的缺失项。
此库的早期版本使用c2rust将librobotcontrol
转换为Rust,而不是尝试上述所有花招。但我担心不完美的转换会导致错误。令我震惊的是,许多东西(包括#include
甚至libc类型)都是按模块进行转换的。例如,每个模块中都有一个FILE
类型的副本,它们在Rust看来并不兼容。早期的c2rust通过其“重构”支持来防止这个问题[通过支持重构],但在更近的版本中被移除,以便更容易地将其现代化以适应新的Rust、LLVM等版本。我尝试手动重构,但这会导致我患上腕管综合症。