摘译自 Adam Rodnitzky 于 2021-03-30 发表在 tangramvision.com 的文章 Why Rust for Robots?
目前,机器人平台主要使用的程序设计语言为 C 。而 Tangram Vision 团队则认为,机器人平台应当选择更好和更合适的程序设计语言,Rust。
图像作者为 Davide Baraldi,来自于 Unsplash
C 在机器人平台的应用
对于机器人平台而言,其最终目标是商业化及其规模上的部署。C 在过去几十年的使用中,已经逐渐成为标准,这是由多种原因合力造就的。首先,C 无处不在的应用规模已经形成一个自我强化的机制;其次,C 有丰富的类库、工具,以及工程师的生态系统。比如说,ROS(译注:RobotOS,目前最流行的机器人平台客户端库之一)主要是用 C 实现的;流行的 OpenCV 计算机视觉库也主要是用 C 编写,并用 C 进行调用。
然而,工具和工程师的普遍性存在,并不能完全解释 C 在机器人平台的流行。还有一个更根本的原因是:在已知的资源限制下,大多数机器人平台必须满足可接受的性能阈值。C 非常适合这些嵌入式应用程序,因为高性能的语言才适合“与金属融合(close to the metal)”。
译注:“close to the metal” 是美剧《奔腾年代(Halt and Catch Fire)》第一季第四集剧名,大概剧情:戈登等人突破了多赫蒂阈值,这意味着他们的个人电脑组装后,将成为最快的电脑……清洁工打扫时制造了电涌,导致代码都不见了……原来乔是故意将卡梅伦骗出工作间制造了电涌……
因其 C 的特性,这种“与金属融合(close to the metal)”的优势,使得机器人平台面临着潜在的巨大危害。C 的测试、体系结构,以及内存管理,均存在使用依赖性上的不一致问题;然而,这些依赖关系可能会捕获和操纵基本的底层资源。这意味着在不经意间,就会非常容易地构建导致关键问题的 bug,并且你不会意识到……也就是说,直到你完全投入生产环境。在产品部署到生产环境之前,这个大问题的 bug,是不会被发现的。在生产环境中,一个绕过 QA 的边缘案例场景,会触发内存泄漏,或者系统崩溃,等等。
除非你如上述韦恩图所示,在狭小的交集范围内思考。否则,将会因为 C 自身的问题,而导致你的机器人平台代码库有诸多麻烦。
基于上述原因,Rust 语言则显得非常有积极意义。
将 Rust 引入机器人平台
Rust 是相对较新的机器人语言,但是有大量快速增长的项目和库,以及为机器人技术的发展提供了关键框架。
但是,为什么要改变呢?
首先,使用 Rust 构建机器人平台的最大好处是内存安全和管理。在 Rust 中,您必须非常地努力,才能“创造”内存泄漏或争用条件,比如:常见的内存陷阱、空指针,或数据争用。在 Rust 中,内存管理的方法是使用堆栈跟踪程序,然后使用指针引用来指向包含较大数据结构的堆。
为了访问数据结构,必须建立所有权,从而防止多个变量同时访问或修改数据结构。效率高?对。安全吗?对。最好的部分是:Rust 具有和 C 同等的“与金属融合(close to the metal)”的特性。这使得 Rust 成为一种高效、极其安全的语言。Rust 还允许底层访问,这非常适合资源约束和代码安全至关重要的机器人世界。
对于机器人平台来说,Rust 是一个明智的选择,但是向用 Rust 编写的机器人平台过渡,则需要时间。Rust 发布不足十年(译注:2014 年 10 月,Rust 编译器和工具有了第一个发布:0.12 版),而 C 已经存在了四个十年了。因此,C 仍然具有非常大的惯性,但 Rust 社区正在快速发展中。
机器人平台的 Rust 资源
在将 Rust 用于机器人平台的开发方面,有一个小型的,但正在不断增长的公司和开发人员社区(包括 Tangram Vision)。他们正在将一些机器人平台最常用的库和工具与 Rust 相融合,并且也在开发新的工具,以简化创建 Rust-编程(Rust-programmed)
机器人的开发路径。
下面是我们最喜欢的几个机器人平台的 Rust 资源,涵盖了机器人技术发展的一些关键领域。在我们的选择中,较看重积极维护的资源(一年内)。
框架
- OpenRR:开源的 Rust 机器人平台
ROS
- rosrust:完全由 Rust 实现的 ROS 客户端库
- ros2-rust:ROS2 的 Rust 绑定、代码生成器,以及示例代码
- rustros_tf:ROS tf 库的 Rust 端口,用于追踪三维变换
- Optimization Engine:用于机器人和自主系统的嵌入式优化
计算机视觉
- realsense-rust:用于 Intel RealSense 深度摄像机的高级绑定(Tangram Vision 维护)
- opencv-ros-camera: 一种兼容 OpenCV 的相机几何模型
- adskalman: 卡尔曼(Kalman)电子滤波器
- cam-geom: 相机几何模型
- bayes_estimate: 一种贝叶斯(Bayesian)评估库
碰撞侦测
- openrr-planner: 规避性的路径规划
控制器
- stepper: Rust 的通用步进电机驱动器和控制器接口
模拟器
- nphysics: 可用于机器人仿真的 2D 和 3D 物理引擎
数学计算
- Nalgebra: Rust 的线性代数计算库
- petgraph: 图数据结构库,兼容 Rust
你应该用 Rust 开发机器人吗?
随着 Rust 和机器人世界的发展,我们认为答案将越来越是肯定的。Rust 语言的基本优点,已经使其非常适合机器人专家,以及机器人平台的需要。越来越多的库和资源,使我们比以往任何时候都更容易开始基础工作。
谢谢您的阅读,欢迎交流。