驾驶火星探测车
2004年1月3日太平洋标准时间晚上 8:30,一个来自地球的重达一千磅的金属物体划破火星的天空。六分钟后,在张开降落伞和安全气囊后,这块金属重重地撞击到这颗红色星球上,弹跳了 28 次,超过 300 米,然后缓缓停了下来。安全气囊放气,露出了它们保护的金属金字塔,金字塔展开后,露出了一个名为勇气号的六轮机器人地质学家。
为期三个月的火星探索由此开始。对于 NASA 喷气推进实验室的数百名科学家和工程师团队来说,勇气号正在充当我们的眼睛——和我们的工具箱,利用其可折叠手臂尖端的工具——在我们邻近行星探索的新篇章中发挥作用。机遇号,勇气号的孪生姐妹,在三周后在火星的另一侧复制了勇气号的壮举。所有这些科学家和工程师用什么来驾驶探测车呢?他们正在使用 Linux。
火星探测漫游者 (MER) 任务标志着 Linux 在太空计划中应用的一个转折点。Linux 以前也曾在太空任务中使用过——例如,早在 1997 年,一辆 Debian 笔记本电脑就搭乘 STS-83 航天飞机升空。但火星探测漫游者项目是 JPL 第一个在关键任务操作中使用 Linux 系统的任务。在 MER 任务中,Linux 被用于高级科学规划以及低级命令排序、可视化和模拟。
尽管这看起来可能很奇怪,但 Linux 最初并非旨在成为我们的主要开发平台。我们的软件最初旨在用于火星 '01 任务,该任务基本上是 JPL 1997 年火星探路者任务的重复。计划是在单个 Silicon Graphics 工作站上完成所有探测车命令,就像在火星探路者任务中所做的那样。当时,我们对 Linux 的支持主要是一种对冲 SGI 命运的手段。
然而,在 JPL 的火星 '98 任务失败后,JPL 重新规划了其火星战略。火星 '01 计划被取消,转而支持稍后发射的任务,即最终成为 MER 的任务。结果是,我们获得了比计划多两年的开发时间,尽管是用于与我们计划不同的航天器。MER 探测车比探路者的索杰纳号探测车更大、更智能、更复杂,而且每个探测车都配备了机械臂。
在这两年里,Linux 和它运行的通用 x86 硬件在 CPU 和图形速度方面都取得了巨大进步,这在很大程度上要归功于图形芯片制造商 NVIDIA 及其强大的 Linux 支持。因此,我们越来越倾向于更快、更好、更便宜的 Linux 解决方案。我们最终购买了两台高端 SGI,在飞行操作期间添加到我们的 Linux 机器中,但尚不清楚我们最终是否会使用它们;现在的 Linux 机器为我们提供了同等甚至更好的性能。因此,MER 探测车正在由多个团队并行工作,在为该任务购买的数十台 Linux 系统上进行指挥。
我们的软件,一套名为探测车序列和可视化程序 (RSVP) 的应用程序,是在 Linux 上开发、测试和部署的。RSVP 为 MER 的工程师和科学家提供了指挥火星探测车的复杂工具。由于漫长的光时延迟,在勇气号着陆日,往返时间几乎达到 20 分钟,因此无法交互式地驾驶探测车。相反,RSVP 提供了一个沉浸式环境,可以准确显示探测车的环境并模拟其行为。在整个火星夜晚,我们地球人使用 RSVP 在命令级别规划一天的活动,然后将生成的命令上传到探测车。探测车在接下来的火星日执行这些命令。
RSVP 的两个主要组成部分是探测车序列编辑器 (RoSE),它为所有航天器命令提供面向文本的命令,以及 HyperDrive,它为驾驶、手臂运动和成像命令提供高级三维图形。每个单独的应用程序都可以以独立模式运行,但它们一起使用时功能更强大。在组合模式下,应用程序在橡树岭国家实验室开发的并行虚拟机 (PVM) 软件的控制下运行。PVM 提供了一条数据总线,一种供 RSVP 组件应用程序通过相互传递消息来同步其工作的方式。
我们大多数消息的内容都基于 RML,这是一种专门为表示探测车命令序列而设计的基于 XML 的规范。这种消息传递方法有许多优点,其中最重要的一点是我们可以用不同的语言实现单独的工具。只要该工具可以发送 PVM 消息,它就可以成为套件的一部分。RoSE、我们的消息传递中心和我们的消息记录器是用 Java 编写的;HyperDrive、我们的图像查看器和我们的序列流浏览器是用 C++ 和 C 编写的。对于下一个任务,我们可能会尝试添加用脚本语言(如 Perl 和 Python)编写的工具。
RoSE 是一个在 Sun Java 虚拟机 1.3.1 版上运行的 Java 应用程序;但是,它不是用 Sun 的编译器编译的,而是用 IBM 速度更快的 Java 编译器 Jikes 编译的。RoSE 受益于 Java 众所周知的可移植性:我们获得了在性能良好、快速的 Linux 机器上编译和测试的好处,并定期在 SGI 上安装和测试它,几乎没有遇到任何麻烦。我们甚至做了一个到 Mac OS X 的实验性移植,但由于缺乏支持第三个平台的时间而放弃了。Mac OS X 上没有明显的问题,但如果出现任何问题,我们将没有时间处理它们。我们也没有支持 Mac OS X 的要求,因此我们完全放弃了它。
RoSE 具有很强的数据驱动性,它从启动时读取的 XML 配置文件中学习关于探测车的一切知识。用于开发 RoSE 的 IDE 是久经考验的 GNU Emacs。RoSE 的大部分 GUI 都是使用 Java 的标准 GUI 工具包 Swing 手工制作的 Java 代码构建的。尽管 Swing 不错,但手工制作 GUI 代码有时很乏味;如果在当时有支持 Java 的 Glade 版本可用,我们很可能会使用它。尽管如此,用户界面的重要部分是动态构建的。RoSE 在启动时读取的 XML 配置文件之一是探测车命令字典的描述,有点像探测车的应用程序编程接口 (API)。RoSE 使用此命令字典动态生成对话框,用于编辑每个命令,这种方法在命令字典在其多年的开发过程中发生巨大变化时节省了无数的工作。
自动化友好的 Linux 环境极大地提高了 RoSE 的可靠性。早期,我们为 RoSE 编写了广泛的自测代码,然后设置了一个简单的 cron 作业来每晚运行测试。如果任何自测失败,它们会在第二天早晨的电子邮件消息中报告给开发人员。这帮助我们尽早发现错误,而导致这些错误更改仍然在我们脑海中记忆犹新。我们对 RoSE 的积极自测是一种实验,事实证明它获得了丰厚的回报。
顺便提一下,Java 以速度慢而闻名,但我们不得不说,这种声誉似乎是不公平的。尽管 RoSE 有些地方可以更快,但这对于任何软件都是如此。如果我们有更多的时间(软件开发中不变的口头禅),我们可以消除所有瓶颈。就目前而言,Java 对于我们的目的来说足够快,并且 Linux 强大的 Java 支持对我们来说是一个巨大的好处。
HyperDrive 是 RSVP 套件的交互式可视化组件;这是他们将在 CNN 上展示的部分。HyperDrive 的主要目的是通过让操作员充分了解探测车的状态及其当前环境,从而实现安全高效的探测车驾驶和手臂运动规划。这是通过将多个数据源融合到三维场景中,然后提供多种查看此场景的方式来实现的。
HyperDrive 的主要数据来源之一是从立体图像生成的地形模型。两个探测车上的大多数相机都是立体相机,这意味着它们可以像人眼一样用于感知深度。通过使用一种称为立体相关的技术,我们可以从图片的平面二维世界进入渲染计算机图形的三维世界。通过将这些地形模型与代表探测车的 CAD 数据相结合,我们拥有了一个系统的核心,该系统能够交互式地渲染探测车在地形上行驶或将其手臂放置在火星表面的视图(图 2)。
我们可以进一步将这些渲染与来自探测车相机的原始图像相结合,以提供增强现实视图,其中从探测车看到的场景叠加了合成图像,并且可以使用 LCD 快门眼镜以三维方式查看(图 3)。我们还可以渲染来自任何探测车相机的模拟视图,以帮助图像定位。
在这个虚拟世界中,我们放置图标和注释,这些是软件创建的对象,用于说明命令序列并描述世界的特征。这些对象中最重要的组是代表探测车要执行的命令的图标序列。虽然面向文本的 RoSE 编辑器显示用于编辑的整个命令序列,但 HyperDrive 仅显示具有合理视觉表示的命令子集。在 HyperDrive 中,移动、机械臂和成像命令显示为跨地形放置的一系列图标,每个图标都位于其执行位置。这使我们能够以可视化方式对探测车在地形上的移动进行编程,并以高精度放置其手臂。我们在火星表面上的第一次放置估计在其预期目标的 5 毫米范围内。当我们在同一目标上放置第二个仪器时,我们做得更好,将其放置在距第一个位置 0.3 毫米范围内。对于一亿英里外的目标来说,这还不错。
Linux 下的三维图形编程最初是一项非常前沿的冒险,后来发展成为一个具有强大驱动程序和库的强大平台。HyperDrive 基于 Silicon Graphics 的 OpenGL Performer 渲染 API。我们使用 GTK+ 和 libglade 作为 HyperDrive 的用户界面。Glade 和 libglade 实现的快速原型制作使 GUI 开发变得轻松高效,我们强烈建议其他需要强大界面工具包的人使用此工具集。随着我们的主要目标从 IRIX 演变为 Linux,我们能够使用越来越多的开源工具和库,然后找到或构建回 IRIX 的端口以保持兼容性。
HyperDrive 还能够动画化探测车的预测动作,实时构建动画并允许用户环顾四周并从多个角度检查探测车的行为。相同的功能可用于回放探测车的实际性能,基于探测车的每日报告。当这些回放动画成为 JPL 每日新闻发布会的常规功能时,我们感到非常惊喜,至少可以说。
Frank Hartman 目前是喷气推进实验室的一名软件工程师,专门从事计算机图形学,也是一名火星探测车驾驶员,工作地点位于加利福尼亚州帕萨迪纳市。他拥有费城艺术大学的雕塑美术学士学位和斯坦福大学的航空航天工程理学硕士学位。Frank 与他的妻子 Leah 居住在加利福尼亚州阿尔塔迪纳。
Scott Maxwell 是加利福尼亚州帕萨迪纳喷气推进实验室的一名软件开发人员和火星探测车驾驶员。他喜欢练习合气道、阅读经典文学作品,并用寥寥数语概括自己的一生。他是Linux 内核核心注释的作者。