Spacex如何落地星舰(有点)

2021-05-14 07:51:33

又名:我如何“不小心”发现我已经知道的东西:优化方法是着陆火箭的核心。

作为个人推动的一部分,以了解有关非线性控制的更多信息,我一直在玩一个相当强大的方法,称为轨迹优化。建立基本代码后,它相当容易应用于各种系统。这是一个有趣的例子,它在无人机上运行:

在等待STARSHIP SN15推出时(它实际上擦洗,悲伤),我决定将一些估计放在一起的一些动态,看看我是否可以获得我的玩具2D模拟以执行史诗翻转和土地。为了我的兴奋,经过一些愚蠢,它很好地工作。但是,我真的很惊讶我是当我用实际的着陆镜头并排发挥输出时:它非常好。我希望我发生这种情况发生的活力,我可能会或可能没有跳出我的椅子。编写了整个程序和优化,而无需对视频或其他显式定时信息的任何引用。

对我来说,这意味着两件事之一:无论是令人难以置信的幸运,还是SPACEX正在运行非常相似的实际系统的优化。我认为这两者都是真的。 Twitter上的好人对此感兴趣,所以我决定做一些深刻的潜水可能很有趣。这是一些非常有趣的东西,希望有一点窗户进入朝着着陆火箭后面的巫术。

在进入代码之前,它可能是解释轨迹优化背后的理论的好主意(但如果您愿意,请随意直接向代码跳转,我不会阻止您)。我绝不是专家,如果你觉得有些东西脱了,请随时与我联系。我还将提供与实际上知道他们在谈论的内容的内容的链接。

幸运的是,在这种情况下,“最佳”意味着它通常意味着什么:“好”,“最好”,“理想”等。作为一个简单的例子,想象一下,你想穿过房间到你的冰箱:你可以采取看似无限数量的路线,但不知怎的,你只挑选其中一个跟随。

应该相当容易看到有良好的路线和糟糕的路线,但实际上定义了一个好的与坏轨迹?这是“成本”概念进入的地方。如果您有机器学习的经验,这将基本上是相同的概念。您可以使用优化以最大限度地减少您的成本函数。在我们的冰箱示例中,成本函数是多少?一个容易采取的人将是我们道路的长度。现在可以让计算机找到您和具有最短长度最短的冰箱的路径是可行的。

这是有效的,但有一些轻微的缺陷。想象一下,你和冰箱之间有一个死亡™的坑。我们的“发现最小的长度”算法将立即运行,我认为您可能同意不是真正的最佳状态。

一个潜在的成本函数(以及我的星舰登陆代码中主要用于的)是基于“努力”。说它需要一个努力在地板上向前移动一步,并且需要1000点努力通过Death™的坑。更好地匹配我们认为是最佳的vs而不是最佳:

没有很好的约束,这里有很少的优化问题,这里是我们的达到冰箱 - 最小的问题的一些“逻辑”的问题:)

这是轨迹优化的核心;通过最小化一些成本函数来优化点之间的轨迹,并持有一组约束。这是一些良好的资源,在这方面的数学方面进入了深度:

现在有趣的东西。在那里有一些惊人的图书馆通过方程式流失,进行优化的沉重提升,因此真正的“艺术”在于向求解器提出正确的问题。如果您想按照行沿线(我保证不是那么多线)或小闲地遵循它,这是一个链接笔记本的链接,可以让您在浏览器中运行它:

将时间切成0.04S块,并在每个步骤中产生火箭状态和控制状态的变量。这导致沿着路径的一堆离散点,这些路径更容易与然后试图为整个东西提出封闭的形式解决方案(几乎不可能)。

(挑选0.04秒,因为它会在25帧中播放1:1播放一秒钟。是的,我实际上确实改变了模拟时间,因为25 fps看起来很好)

最大限度地减少推力输出 - 理想情况下,您想尽可能地使用一点燃料。

最大限度地减少TVC眩晕角度 - 移动喷嘴是努力,理想情况下,您希望它名义上指向下方。

最大限度地减少角速度 - 似乎有点野卡,但是亨舍尔,角速度/加速度在车辆上施加了最大的应变,因此您希望保持尽可能低。

初始条件是在80m / s的空气中启动1000米,旋转90度。

从飞行俱乐部提供的SN9数据中获取起始高度和速度:https://flightclub.io/result/2d?code=sn91

这基本上是“不要破坏物理学”约束。它等同于火箭的离散时间模拟,下一个状态等于当前状态+衍生物* dt。 (注意:我在代码中使用X_DOT()而不是f(),因为我认为它更容易阅读)。

(注意:这是一个相当糟糕的离散化,并且存在更好的方法,如搭配。但是,这是写出这一点的最简单和最快的方式)

推力不能大于单个猛禽最大值,不能油门低于40%,并且推力矢量控制不能在每个方向上闪烁超过20度

Raptor Max是从维基百科拍摄的,+ -20度完全是猜测,我很想知道这个是否有更可靠的数据。

这就是基本上,你调用OPTI.SOLVE(),然后将我们的问题转化为IPOPT(开源优化求解器)可以理解的东西。在思考一下后,希望这条消息应该到达一个高堆栈的迭代打印的底部:

下一点代码使用Matplotlib进行一个漂亮的动画,它需要一点才能生成所有帧,但结果非常好。

虽然近乎完美的赛道大多是我幸运的事情,但有一些有趣的东西来拉出它,主要是:

Starship非常可能遵循预先计划的优化轨迹,或运行实时优化以在飞行中生成最佳轨迹。 (或两者混合)

不仅仅是这样,我们可以进一步猜测它们的优化成本函数/“目标”非常相似:最小化推力,最小化TVC角度,最大限度地减少角速度。赛道几乎是不可思议的,特别是它滑出两种方式多远。 (我总是认为这是过度的,但它可能只是着陆垫的最佳路径)。这也是一个有趣的分析工具,我真的想弄清楚一些额外的约束,导致SN8和SN9的着陆失败(需要有点调整:最终状态不再是一个刚性约束)。

它诱人的“哇我刚才想出了太空速度如何降落他们的火箭!”,但可悲的是,这并不是真的。 一旦生成了一个物理可能的轨迹,就会让你去的地方,你需要做的是你需要做的整个东西,遵循这个轨迹:状态估计,闭环反馈控制,基于真实的轨迹动态更新该轨迹 时间条件......还有更多的是那些是一个实际的航空工程师(我不是)的人会知道。 除此之外,这些求解器需要很长时间才能运行,而在线(实时)优化非常难以正确和安全地拉开:一个错误的输入和您的求解器可以吐回“失败”,导致物品掉了出来 天空。 无论如何,谢谢你对此来说,希望你学到了一些东西。 如果您有疑问,请随时向我联系到我的Twitter或电子邮件(托马斯。