月球计算机的故事。 第一部分

第二部分
第三部分

其中一些照片是从Hack The Moon网站上拍摄的。

本文在2004年2月6日在科罗拉多州布雷肯里奇举行的第27届美国宇航学会航行和导航年会上发表。建议的版本包含其他插图,评论和较小的更正。



摘要:尽管有两个计算机问题在受控着陆期间影响了月球舱,但阿波罗11号任务仍成功登陆月球。 接近雷达接口中一个未解决的问题占用了车载计算机周期的13%左右,导致五次程序崩溃并重新启动。 由于推力控制算法位于稳定边界,错误的数据导致了一个鲜为人知的问题,错误的数据导致登月舱模块着陆引擎的推力发生波动。 对这些问题的解释使描述Apollo车载计算机的操作系统和登月控制程序成为可能。


该图描绘了月球游览模块(LEM)在月球表面的降落。 LEM飞行员通过LEM窗口使用着陆雷达和视觉测量来跟踪和验证着陆点。

LM-1,也称为阿波罗5号,是仅涉及月球舱的6小时无人飞行任务。 它于1968年1月22日举行。 对于开发车载计算机软件LGC(登月舱制导计算机)的我们来说,这是第一次飞行。 对我们来说,现在似乎是一个遥不可及的事件。

任务包括两次启动月球模块反应降落系统(LM的下降推进系统,DPS)的发动机。 在第二次点火时,根据乔治·切里[2]的工作开发了月球着陆控制方程[1]的艾伦·克伦普(Allan Klumpp)设计了一种方法来模拟地球轨道的月球着陆。 它包括三个阶段:制动阶段,“可见性”阶段和着陆模块的最终着陆阶段。 发动机的首次启动对于模拟着陆之前过渡到下降轨道的机动性是必要的。 这是飞行中的月球舱发动机的首次点火,持续约38秒。

LGC(月球模块车载计算机)处于LM-1任务的第9阶段,该程序控制DPS的首次点火。 以后的任务组织得更加灵活,DPS的首次点火在程序的步骤P40中进行。 (有关更详细的飞行程序,请参阅此处大约翻译。 )LM操纵至点火位置。 电脑开始倒计时点火。 在第30秒,READACCS任务首次执行。 她读取航天器惯性模块中的加速度计的读数,设置要执行的SERVICER任务,该任务立即开始,并设置其自身以2秒的延迟执行。 它是由轨道积分程序中的状态向量初始化的,导航方程式开始使用加速度计数据来计算位置和加速度向量。 在发动机开启的整个飞行阶段,READACCS和SERVICER每两秒钟启动一次。 点火前七个半秒,RCS(反应控制系统)开始“脏”燃烧。 我们都走近了将我们连接到休斯顿飞行控制中心的通信系统。

我们听到“引擎已启动”……几秒钟后……“引擎已关闭”。

很快我们意识到发生了什么事。 SERVICER中的一小段代码称为“ delta-V监视器”,它确定引擎有故障,并发送了关闭引擎的命令。 但是为什么呢? 为了使发动机进入推力模式,该代码在启动发动机之后始终等待一段时间,然后才开始监视发动机。 但是这一次,在此期间结束时,发动机仍然没有提供足够的牵引力以满足发动机牵引力监控器的标准。

公布的计算[3]将登月舱的油箱未处于全压力这一事实归因于DPS的缓慢出口。 但是作者进行的调查表明问题是不同的。 对于DPS燃油系统,在正常运行期间,会在发动机点火之前几秒钟打开一个阀,供发动机准备运行时燃油通过该阀进入管道。 但是在月球舱中,调节从管道到发动机的燃料流的阀可能泄漏了。 为了防止过高的燃料过早进入发动机(可能导致爆炸),决定在飞行前不久将燃料的流入推迟到点火时刻[4]。

发动机启动缓慢,这不是因为油箱处于低压状态,而是因为燃料尚未到达发动机。 对我们来说,设置参数设置非常简单,在检查引擎之前,delta-V监视器应等待多长时间-但没人告诉我们。

休斯顿发出了关闭车载计算机的信号。 LM-1任务的主要目标是在地球的控制下实现的。 对月球模块计算机进行编程的我们感到沮丧和失望,公众的反应加剧了失望和失望,他们没有区分程序错误和数据不正确。 这不是最后一种情况,因为看似安全的参数与着陆发动机的特性有关,使飞行任务几乎濒临失败。

* * *


阿波罗飞船导航系统的开发委托给剑桥的麻省理工学院(麻省理工学院仪器实验室)。 自1939年以来,在其创始人的领导下,“码头”查尔斯·斯塔克·德雷珀(Charles Stark Draper)实验室在惯性导航系统的开发中发挥了重要作用。 与我们签订的开发阿波罗主要制导导航和控制系统PGNCS的合同,称为“ pings”,是阿波罗计划下签署的第一份合同。 Doc亲自参加了这次飞行任务。

1970年,仪器实验室更名为Charles Stark Draper实验室,并在1973年独立于MIT,尽管与它有联系。 德雷珀的实验室仍在积极参与NASA的载人航天计划。


交会导航。 该图描绘了LEM和命令模块从月球表面升起后在月球轨道上的会聚和对接。

控制月球舱飞行的程序称为SUNBURST。 到LM-1飞行时,我们已经在研究SUNDANCE,这是绕地球轨道运行的阿波罗9号任务管理程序。 反过来,SUNDANCE变成了LUMINARY,这是阿波罗10号的计划,也是登陆月球的任务。 1969年7月,阿波罗11号的任务由LUMINARY程序99版控制。116版由12月的阿波罗12号控制,依此类推。

本文坚持使用Apollo程序中使用的名称。 程序的名称,程序中的变量的名称,我们通常以大写形式编写。

我们将该计算机程序非正式地称为“绳子”,因为它们存储在车载计算机的ROM中,就像一条编织的铜线一样。 对于登月任务,程序存储器限于36K字,每个16位,再加上一个奇偶校验位,再加上2K字的RAM。 考虑到Apollo AGC计算机的内存和包含COLOSSUS程序的命令模块(CM),可以说我们坐在月球上的内存为152 KB。


图2. 阿波罗登月舱,主要制导和导航系统,PGNS

AGC组装在坚固的气密铝镁盒中,并进行了阳极氧化处理,尺寸为6英寸乘1英尺乘2英尺,重70磅,耗电约55瓦。 它的逻辑电路由5600个三输入OR-NOT元件组成,并封装在两个扁平集成电路中。 机器的首席开发者埃尔登·霍尔(Eldon Hall)做出了一个大胆的决定,将微芯片用于计算机,尽管该技术在60年代初期还不成熟[5]。

LGC(带有所有设备)在登月舱驾驶舱后面的宇航员后面。 在宇航员之前,有一个称为“导航基座”的刚性结构,在该结构上将指向望远镜和惯性测量模块(IMU)安装在固定的几何坐标系中。 键盘和显示模块(DSKY)安装在宇航员的座椅之间。 图2显示了月球模块主要导航系统的组件和高级界面。

IMU系统(惯性测量单元)组装在直径约为一英尺的球形体内,是导航系统的核心。 她自己的心被三个固定在一起的悬架包围着,是一个“固定构件”,一个小平台上装有三个精密陀螺仪和三个加速度计,必须将它们放置在一定的位置上才能使船舶惯性定位。 陀螺仪记录船舶位置的任何偏差,并移动悬架以校正位置,所有这些都以高精度发生,并且(几乎)不取决于船舶的位置,“固定构件”给出恒定的参考位置。 REFSMMAT矩阵表示固定项相对于惯性参考系的位移。 加速计在固定成员坐标系中打开引擎的情况下测量飞行阶段的速度增量。


图3: 月球模块显示和键盘模块(DSKY)

DSKY是LGC的主要人机界面。 对于具有三个通用寄存器的显示屏,每个寄存器都存储一个符号数(小数点后五位),三个寄存器(两个两位数)以指示飞行的当前阶段(从63到68的数字降落在月球上)以及“动词”和“名词”。 团队和计算机之间进行交流的原始语言需要动词和名词。 飞行阶段和动词/名词组合在某些情况下是由程序设置的,而在其他情况下,则是由机组人员通过19个键盘从键盘输入的。 这三个通用寄存器的内容取决于输入的名词和动词。 DSKY还包含一组由计算机控制的指示灯,以及当LGC不在待机模式时点亮的计算机活动指示灯。

月球模块和命令模块中的AGC计算机用两种语言编程。 我们称其为“基本”,或更正确的称呼为“尤尔”,是由休·布莱尔·史密斯(Hugh Blair-Smith)撰写的约40支车队的装配工[6]。 第二个是解释器,用于解释语言(实际上是一组子程序),旨在简化导航计算,包括双精度数(30位定点数)的向量和矩阵,但速度很慢。 《口译员》由查尔斯·芒茨(Charles Muntz)撰写。

AGC记忆周期的持续时间为11.7μs。 汇编程序中的单精度加法花费了两个周期。 解释器中的双精度向量乘法大约需要5 ms。 AGC编程的挑战之一是要同时使用两种语言来达到速度和紧凑性的最佳平衡。

阿波罗(Apollo)的计算机程序非常小巧,足以装在一张纸上,通常是折叠后的11英寸15英寸纸和6英寸纸捆厚度的纸张。 该清单包括一个字符表,可以在流执行期间对其进行跟踪。 有了一个清单,我们总是知道当寻找错误时答案就在其中,尽管有时很难找到它。


图4. 月球模块LUMINARY 131的程序清单

LGC体系结构是模块化的,但不拘一格。 在计算机内部,我们至少在导航任务中使用了公制。 但是,NASA的运营商,尤其是宇航员,更喜欢英国的测量系统。 这意味着在显示之前,高度和垂直速度(例如)已从公制转换为英尺和英尺/秒。 质量和牵引力以磅表示。 因为本文的目的是部分展示在那个宇宙飞船时代我们所说的东西,所以我将使用当时被接受的单位。


德雷珀码头上的卡通

* * *


现在,位于剑桥百汇75号的任务监控部门已移至一个较大的房间,1969年7月20日,这个房间很拥挤,尽管我们当中参与这一阶段工作最忙的那些人都做了清洁工作。 我们在教室里听了一个蹲箱(通信设备),而距离那里一百万英里的一艘载人飞船离开了月球,并接近月球陨石坑的低点,其高度在虚线火山口上方约50,000英尺处。表面,然后打开着陆引擎。

团队在计算机上键入了“动词37”,这意味着P63阶段,准备进行受控下降,并保留在命令模块中,直到发动机燃烧为止。 计算机执行了一种算法,计算出确切的点火时间和登月舱在该时刻的位置。 接下来,飞船转到所需位置。 在点火时,发动机喷嘴应朝着船舶的轨道速度矢量几乎向前。

现在计算机给出的错误代码为500。他认为雷达天线的位置不正确。 团队发现开关位于正确的位置,但仍然进行了开关,错误消失了。 这与接下来发生的事件无关,但更使我们怀疑,有时告诉计算机天线或开关位置的信号存在。

控制权转移到了BURNBABY程序,这是我们在LM-1之后编写的主要点火控制程序,目的是在点火之前使用类似的算法来节省内存。 在DSKY上,显示“动词6,名词62”。 中间的寄存器包含以分钟和秒为单位的时间,点火倒计时开始。 35秒钟后显示屏变为空白,30秒钟后再次点亮。 这是“ Average-G”算法已开始的信号。 在7.5秒内,开始“脏”烧。 起飞前5秒钟,显示屏闪烁,等待机组人员的启动命令。 登月舱飞行员Buzz Aldrin站在驾驶舱右侧,主要负责与DSKY的合作。 他按“继续”。

从任务开始的时间102:33:05,自燃燃料进入着陆发动机,并以10%的节气门速度点燃。 阿姆斯特朗甚至没有感觉到轻微的震动-加速度小于1 / 25g。 显示屏高亮显示“名词63”,三个寄存器显示屏现在显示全速5559.7英尺/秒,垂直速度为-2.2英尺/秒,表面上方的高度为49971英尺[8]。 发动机支座将着陆发动机的推力矢量对准船质心。 点火后26秒,软件将DPS的最大推力提高到9,870磅(43,900 N),是官方宣布的10,500磅的94%,同时,着陆机动开始。

P63是制动阶段,其唯一目的是抑制垂直速度。 它在船到达7400英尺高的“高门”终止条件后8分钟结束。 图 图5示出了登月的阶段。


图 5. 登陆月球的阶段(大约数字)

从任务开始时的102:36:55起,指挥官尼尔·阿姆斯特朗(Neil Armstrong)站在月球舱的左侧,用操纵杆绕着推力轴旋转航天器,以便航天器的窗户可以让宇航员向下看地面,因为当它被引导到太空的那一刻,地球就可以看见它了。 但是船旋转得太慢了。 阿姆斯特朗将自动驾驶仪的速度限制从5度/秒切换为25度/秒[9]。 紧接此动作之前,着陆雷达发出“数据正常”的信号。

在不知道当前距离和速度的情况下,不可能如此精确地导航以安全降落在月球表面上。 该信息由着陆雷达提供。 尽管由软件执行了似然性检查,但未经命令和飞行控制中心的确认,雷达数据仍无法包含在状态向量中。点火大约五分钟后,Aldrin输入了“动词16,名词68”-一个显示“名词”的请求,其中第三个寄存器显示了雷达看到的高度与计算机计算出的高度之差。此变量称为DELTAH,约为-2900英尺。这在误差范围之内。雷达数据进入导航系统,而不会对飞行路径产生不利影响。

然后,我们听到了“软件警告”一词。在剑桥,我们互相看着对方。在飞船上,Aldrin看到PROG信号点亮,显示屏再次显示“动词6,名词63”。他迅速按下“动词5名词9”。 DSKY显示屏上显示警告代码1202。如果计算机过载,即显示此警告。正在运行的任务多于有足够的时间来处理它们。他们在剑桥说:“警告处决,记忆中没有位置。”阿姆斯特朗然后严厉地说:“给我们指示警告1202” [10]。

事件开始迅速发展,对我们来说,从剑桥传输数据太快了。这是由休斯顿的飞行控制中心完成的。接下来发生的事情的故事经常被重复-26岁的军官史蒂夫·巴尔斯(Steve Bales)说的是“继续”还是“取消”。 Bailes参与了LGC警报的最新分析,在该分析中,如果错误发生的次数不多并且轨迹没有偏离所计算的错误,则决定继续执行错误1202的任务。他在后台得到了NASA的Jack Garman和MIT的Russ Larson的支持。加曼说“继续”,信号员查理·杜克(Charlie Duke)向船员讲了话。在麻省理工学院,当我们意识到某种神秘的事物浪费了计算机时间时,我们屏住呼吸。

从错误信号的发生到休斯顿的回答“继续”之间经过了半分钟。在此期间,飞行控制中心检查了DELTAH值,Aldrin拨打了“ 57”,这是一个允许导航系统接收雷达数据的代码。然后,他尝试再次输入“动词16,名词68”,并看到DELTAH如何下降到900英尺。错误信号再次闪烁。再次发出“动词5名词9-1202”。他们再次从地球上回答“继续”。


图6. 着陆期间的预期(点)和实际(实线)牵引力(模拟数据)

飞行时间为102:39:31,一切顺利,节气门及时关闭。 “啊哈!节气门关闭,比模拟器要好。 “油门准时关闭!”阿姆斯特朗兴奋地说道。在着陆阶段航天器与地球之间对话的正式记录中,只有一个感叹号-在这个地方[11]。

在从65%到最大推力的模式下操作时,着陆发动机的喷嘴遭受严重腐蚀。当着陆所需的推力减小到直到制动阶段结束时不再需要返回最大值的水平时,节气门关闭。很好地关闭节气门表明控制系统工作正常。的确,如果百叶窗卡在打开位置,则有必要中断任务,因为根据导航方程式,在40秒后,船舶将不得不转弯。

当月球舱被引导到月球表面时,阿姆斯特朗数了数个地标,这些地标表明月球舱的下降幅度超过了要求。他发现计算机不知道降落模块降得太多了[12]。否则,发动机在最大推力下的停留时间会比实际发生的时间更长。


月球模块的模拟器。

任务时间102:41:32,该船越过了7400英尺的标记,以125英尺/秒的速度下降,到达了“高门”。导航系统现在必须执行其他任务。月球模块朝前,因此沿航线可见月球表面。在DSKY上,模式寄存器显示64,表示“可见阶段”,“名词64”更改为“名词63”。现在以两位大写显示两个两位数而不是速度。其中之一是着陆点(LPD)的名称,该角度指示在允许自动着陆的情况下,阿姆斯特朗应该看窗户上的哪个标记,以查看船舶将着陆的位置。制导系统控制偏航以使着陆点保持在视线范围内。机组人员可以使用手动控制器更改着陆点。 (阿姆斯特朗在飞行前说,他计划不利用这个机会,但是显然“可见性阶段”持续了太长时间)。第二个数字显示了可以更改着陆点的剩余时间。在此阶段,其中包含一种算法,该算法可让您更改着陆点,因为那是最紧张的着陆期。

任务时间102:42:17,发生错误1201。再次,执行程序错误(计算机系统软件由两个子系统组成:执行程序-实时操作系统和解释器-虚拟机,实际上是使用双精度数字的命令解释器。)-没有可用内存。大约24秒后,再次出现错误1202,这两种情况下休斯顿的控制中心都说“继续”。尼尔·阿姆斯特朗(Neil Armstrong)在这段时间内的心脏跳动了120到150次[13],他遵守了这些指示。

, , .. 64 , LPD. , , , . , , , . , , , .

但是,阿姆斯特朗设法注意到LPD系统表明“我们正在降落在一个大型岩石陨石坑附近,非常大的岩石覆盖了大部分表面” [15]。因此,从任务开始(海拔650英尺)开始的102:43:08时刻,阿姆斯特朗决定不能坐在弹坑附近,将自动驾驶仪模式开关从``自动''切换到``ATT HOLD''以手动控制登月舱的位置。他以零角度操纵以保持水平速度,并越过了岩石地形。

(ATT HOLD表示数字自动驾驶仪在“态度保持”模式下控制飞行速度,在这种模式下,宇航员可以通过使操纵杆偏转来控制飞行速度。释放操纵杆握柄后,自动驾驶仪将重置速度以保持其当前位置。)

任务时间102:43:20,海拔430英尺,阿姆斯特朗用左手(P66)将输入拨动开关切换到下降速度控制模式。现在,计算机控制着船的推力,以保持由ROD开关控制的下降速度。向上移动开关会使速度减慢每秒一英尺。向下运动使下降速度增加了相同的量。阿姆斯特朗(Armstrong)使用操纵杆将模块倾斜至水平速度为零,然后将模块发送到安全的着陆位置。经过几次“可能是非自愿的”控制运动之后,由于发动机排气口产生的灰尘使他对速度的感知发生了扭曲,阿姆斯特朗以102:45:40的速度将一艘宇宙飞船降落到了宁静之海。

Source: https://habr.com/ru/post/zh-CN462439/


All Articles