软件bug可以说无处不在,但在太空当中引发的麻烦(以及经济损失)却可能超出我们的想象。
无论何时,遇到软件bug总会令人头痛不已;然而在某些情况下,软件bug造成的麻烦会比其它场景更严重——例如在太空当中执行任务。无论宇宙飞船规模多大、吨位多惊人,都需要依赖软件完成自身的既定目标。然而在编写代码时,即使最简单的人为错误也可能让一次耗资甚巨的太空之旅就此宣告失败。未能对代码进行认真检查往往决定着外空间探索的成功或者失败,更不用提可能由此带来的数亿美元损失、多年工作付之东流、既定任务无法完成甚至对宇航人员的生命造成威胁。在今天的文章中,我们将通过九项实例了解历史上真实发生过的航天器软件bug。自从首次进入太空至今,我们一直受到这类问题的困扰,而且相信它们还将继续陪伴着人类未来的宇宙开拓旅程。
Mariner 1:一条上划线引发的血案
年份: 1962年
实际问题: 1962年7月22日,Mariner 1飞船从佛罗里达州卡纳维拉尔角起飞,开始执行自己的金星探索任务。然而工程师们并没有意识到,Mariner 1上所搭载的制导软件中存在一项致命漏洞:在对打孔卡进行转译时,某个议程中缺少了一个上划线符号(注意,并非连词符)。因为如此,制导计算机错误地对原本正确的运行路线作出了补偿性调整,这使得地面控制人员不得不在其开始执行任务后的293秒内将其摧毁。好消息是在Mariner 2中该bug得到了顺利修复,而这台飞行器也在六个月之后成功完成了前往金星的探索任务。
Viking I:软件更新导致其“变砖”
年份: 1982年
实际问题:早在Spirit、Opportunity以及Curiosity等人造设备之前,Viking登陆器就已经踏出了自己的火星探索步伐。1975年,这台配备有轨道器与登陆器的飞行装置向着红色星球发起冲击。Viking I于1976年7月20日成功完成火星登陆,而Viking II则紧随其后被发射入太空。整个工作周期预计为90天,其目标包括拍摄并分析火星靓以寻找生命迹象,而且两台登陆器(及其轨道器)都连续运转了数年之久。Viking II的任务于1980年4月正式结束——原因是电池发生了故障。不过Viking I的使命则中止于1982年11月19号。当时为了解决所搭载电池出现的一项问题,任务控制器向该登陆器发出了一系列用于对新电池进行充电的指令。遗憾的是,这些新指令被写入到了登陆器的存储器当中,而该存储器中还承载着与其高增益天线相关的参数——这意味着其与地面控制器间的通信因此被阻断。美国宇航局多位工程师在接下来的几个月中一直努力与其重新建立连接,但最终没能成功——1983年3月,宇航局正式宣布Viking I任务(以及Viking计划)失败。
Phobos 1:单一字符缺失导致悲剧
年份: 1988年
实际问题: Phobos 1为1988年7月苏联发射的Phobos与Demios火星及月球探测器之一。不过Phobos 1始终未能成功抵达火星,这是因为某项定向软件测试出现了意外状况。在同年8月29日,由于上传软件中缺少某个字符,导致定向软件测试意外开始执行,并最终关闭了该飞行器的姿态推进器。最终结果是,该探测器无法将其太阳能电池阵列继续准确面向太阳方向,直到电池电量完全耗尽。同年9月2日,Phobos 1与地面控制中心失去联系。而探索火星的另一台探测器Phobos 2同样遭遇失败,这一次的问题源自硬件故障。
整数溢出错误导致Cluster步入毁灭之路
年份: 1996年
实际问题:在Mariner 1项目的34年之后,另一项存在于制导软件中的软件bug再次导致四颗人造卫星(其被统称为Cluster)以及用于运载它们的Ariane 5火箭走向毁灭。在发射之后不久,该制导软件尝试将64位浮点数字转换为一个16位整数,进而导致了溢出错误的发生。本来这项错误能够被软件检查所阻止,但技术人员却选择了忽略。该制导系统(及其备份,其中同样存在这一bug)随后关闭,导致火箭偏离轨道。最终Cluster连同其运载火箭于1996年6月4日启动自毁程序。四年之后,带着同样任务的人造卫星终于搭乘俄罗斯的运载火箭成功完成了自己的使命。
软件bug导致Milstar人造卫星无法抵达预定轨道
年份: 1999年
实际问题: Milstar由五颗地球同步卫星组成,于1994年到2003年相继发射完成,并由美国空军负责操控以提供国防部需要的安全通信机制。1999年4月30日,第六颗人造卫星发射升空,但却由于Titan IV运载火箭的控制系统软件存在错误而未能抵达预定轨道。这颗卫星无法进入正确轨道,并在十天之后被地面控制中心关闭。
采用英制单位而非公投单位导致Mars Climate Orbiter发生解体
年份: 1999年
实际问题: Mars Climate Orbiter(即火星气候轨道器)属于火星探测者98号项目的组成部分,与Mars Polar Lander(即火星极地登陆器)共同构成该项目。轨道器的任务是进入火星轨道,研究气象与气候状况并最终作为登陆器的通信中继设备。该轨道器于1998年12月11日发射升空,但始终未能进入预定轨道——原因是地距控制系统中存在一项软件bug。在1999年9月23日尝试进入火星环绕轨道时,该轨道器的所处位置低于预期,并最终导致其解体。通过分析,技术人员发现该地距控制软件在发送推力指令时使用了英制(即磅力)而非宇航软件中所通行的公投单位(牛)。啊哦,好一记乌龙球。
Mars Polar Lander:猪队友过早庆祝导致误伤
年份: 1999年
实际问题:作为火星探测器98项目的另一大组成部分,Mars Polar Lander(即火星极地登陆器)也令人遗憾地由于软件问题而遭遇失败。在1999年1月3日发射升空之后,该登陆器在同年12月3日尝试着陆时损毁。最终原因被确认为软件根据三个着陆器腿传感器返回的数据而误以为登陆器已经接触到地面,并因此关闭了下降缓冲引擎。很明显,下降过程中某次振动被传感器错误地解释为已经触地,导致下降引擎在距地尚有40米远时即行关闭,并引发了致命的坠机事故。
闪存记忆体错误几乎令火星Spirit号陷入无限重启
年份: 2004年
实际问题:在Viking登陆器与Curiosity漫游车之间,另有Spirit与Opportunity两位探索者向火星这颗红色星球发起过冲击。目前Opportunity已经在九年之后继续保持运转,而Spirit的命运却显得更为坎坷——由于闪存记忆体管理异常,其几乎在出发的两周之后就迎来使命的终点。其由DOS管理的文件系统中存在一项设计缺陷,导致闪存记忆体被迅速占满,而Spirit也因此陷入无限重启的恶性循环当中。自2004年1月21日发生问题后,其电池几乎被彻底耗尽,由此引发的过热现象差点毁掉这台设备。幸运的是,工程师们随后解决了该问题,对闪存进行了重新格式化并于2004年2月6日使其恢复正常工作。Spirit在过去六年当中一直保持运作,并顺利完成了原计划中的90天工作周期。
内存分配故障导致Mars Global Surveyor任务失败
年份: 2006年
实际问题: Mars Global Surveyor(即火星环球探测者)于1996年11月7日发射,旨在立足于火星低空轨道对这颗星球进行为期一年的研究。在软件bug出现之前,Surveyor已经正常工作了将十年时间。但在曝出问题后,美国宇航局于2006年11月2日失去了与其的联系。研究证明,问题出于2006年6月进行的一次软件更新,导致数据可能被写入到错误的内存地址。内存故障发生于同年11月初,这直接导致Suveyor的太阳能电池板无法正常转动,最终使得飞行器电池直接暴露在太阳的直射之下、进而因过热而损毁。
原文标题:Houston, we have a bug: 9 famous software glitches in space