用 Python 解释 SpaceX 如何进行火箭回收-程序员宅基地

技术标签: 算法  python  java  机器学习  人工智能  

为了进一步了解非线性控制,我一直在尝试一种非常有效的方法,称为轨迹优化。设置完基本代码后,就可以很容易地将其应用于各种系统。这是在无人机上运行的一个有趣示例:

无人机翻转表演

在看完Starship SN15发射后,我决定进行一些动力学估算,以检验我的2D模拟玩具是否能执行翻转并自行着陆。令我兴奋的是,经过一番细心的研究,它运行得很好。但是真正令我惊讶的是当我与实际的着陆画面并排播放输出时:它的轨迹非常完美。而且编写整个程序和优化时我并没有参考视频或其他明确的计时信息。

对我而言有两种可能:1、我非常幸运,2、SpaceX在其实际系统上运行了非常相似的优化。这是一个非常有趣的东西,希望能为进入火箭回收后面的魔法打开一扇窗户。在开始编写代码之前,可能最好先解释一下轨迹优化的理论(但如果您愿意,也可以直接跳转至代码)。

轨迹优化:“最优轨迹”意味着什么?

在这种情况下,“最佳”表示通常的含义:“好”,“最佳”,“理想”等。举一个简单的例子,假设您想走过整个房间到达冰箱:您可以选择看似无数的路线,但是以某种方式只能选择其中一条路线。

两条轨迹的例子

应该很容易看到有好路线和差路线,但是实际上定义好轨迹还是差轨迹的是什么呢?这就是“成本”概念进入的地方。如果您有机器学习的经验,那么这基本上是相同的概念。您运行优化以最小化成本函数。在我们的冰箱示例中,成本函数是什么?一个简单的方法就是走我们的路。现在可以要求计算机在您和冰箱之间找到一条长度最短的路径。

选择成本函数

这可行,但有一些细微的缺陷。想象一下,您和冰箱之间有一个死亡陷阱。我们的“查找最小长度”算法将使您正确地进行操作,我认为您可能会认为这并不是真正的最佳选择。

可能更好的成本函数(以及我在Starship着陆代码中主要使用的函数)基于“努力”。假设您在地板上向前迈出一步需要您付出1点努力,而经过死亡之坑则需要您花费1000点努力。这更好地匹配了我们认为是最佳与非最佳的条件:

约束

很少有优化问题可以在没有很多约束的情况下完成,这是一些“逻辑”问题,可以解决我们的冰箱问题。

其他资料

这是轨迹优化的核心。通过最小化某些成本函数并保持一组约束来优化点之间的轨迹。这里有一些很好的资源,它们在数学方面会更深入:

https://www.youtube.com/watch?v=wlkRYMVUZTs

为火箭着陆进行编码!

现在到有趣的东西上。有一些很棒的库可以遍历方程式并进行优化工作,因此真正的“艺术”在于向解释器提出正确的问题。下面是一个指向collab notebook的链接,可让您在浏览器中运行全部代码:

https://colab.research.google.com/drive/18MVtu4reVJLBE1RXByQEmu0O9aLXlMHz?usp=sharing

轨迹

时间被切成0.04s的块,并在每个步骤中生成了火箭状态和控制状态的变量。这导致沿路径产生一堆离散点,这些点比较容易处理,然后尝试为整个对象提出封闭形式的解决方案。

由三个点和沿着该轨迹的状态组成的轨迹的示例

火箭状态向量:x[n] = [x, x_dot, y, y_dot, theta, theta_dot]

控制状态向量:u[n] = [thrust_mag, thrust_angle]

生成步骤和优化变量

之所以选择0.04s是因为它可以以每秒25帧的速度进行1:1播放。是的,实际上我确实更改了仿真时间步长,因为25 fps看起来不错。

为了找到时间步长,我手动增加了时间步长,直到找到可行的解决方案为止。有多种方法可以让求解器自行发现最短的时间轨迹(主要是:让它确定点之间的时间步长)。

成本函数

设置成本函数

所有成本都是平方和-> cost [0]²+ cost [1]²+ cost [2]²…依此类推。

最小化推力输出——理想情况下,您希望在着陆时使用少量燃油。

最小化TVC的万向节角度——移动喷嘴很费力,理想情况下,您希望它名义上指向下方。

最小化角速度——似乎有点荒唐,但我有一种直觉,即角速度/加速度会在发动机上施加最大的应变,因此您希望将其保持在尽可能低的水平。

约束集1:初始条件和最终条件

初始条件是在空气中以90m / s的速度向下旋转90度然后开始向下飞行1000m。

初始条件和最终条件约束

起始高度和速度来自飞行俱乐部的SN9数据:https://flightclub.io/result/2d?code = SN91

约束集2:动态

每个状态时间步都必须服从:x [n + 1] -x [n] = f(x [n],u [n])* dt

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

为状态向量中的所有元素设置动力学约束

飞行常数和动力学功能:

  • g = 9.8

  • m = 100000公斤(猜测湿重和干重之间的一个很好的舍入数。实际上,当您使用燃料时,这种情况会发生变化,但出于准确性考虑,我只是为了简单起见)

  • 长度= 50米

  • I =(1/12)* m *长度²(均匀杆的惯性)

定义f(x,u)= x_dot

(注意:这是一个相当差的离散化,并且存在更好的方法,例如并置。但是,这是写出来的最简单,最快的方法)

约束集3:可变范围

推力不能超过一个猛禽战机的最大值,油门不能低于40%,推力矢量控制在每个方向上的摆角都不能超过20度 Raptor max取自维基百科,+-20度完全是个猜测,我很想知道是否有更可靠的数据用于此。

设置u的有界约束

优化!

剩下要做的就是运行它!

选择求解器并运行!

基本上就是这样,您调用opti.solve(),然后将其转换为Ipopt(开放源代码优化求解器)可以理解的问题。希望此消息应该到达大量迭代打印的底部:

这就是我们想要看到的

状态和控制阵列图

下一部分代码使用matplotlib制作了漂亮的动画,需要花一点时间来生成所有帧,但结果还是很不错的。

总结

虽然接近完美的轨道可能主要是让我对事物的估计感到幸运,但仍有一些有趣的东西可以借鉴,主要是:

Starship很有可能要么遵循预先计划的优化轨迹,要么运行实时优化以动态生成最优轨迹。(或两者混合)

不仅如此,我们可以进一步猜测它们的优化成本函数/“目标”与我们的非常相似:最小化推力,最小化TVC角和最小化角速度。这条赛道有时几乎是不可思议的,尤其是在双向滑行的情况下。(我一直以为这是过冲,但这可能只是到达着陆点的最佳路径)。这也是一个有趣的分析工具,我真的很想找出导致SN8和SN9着陆失败的一些其他约束(需要进行一些调整:最终状态不再是严格的约束)。

为什么实际上着陆火箭比这要难得多

“哇,我刚刚想出了SpaceX是如何着陆他们的火箭的!!”,但可悲的是,事实并非如此。

一旦生成了一条物理上可能的轨迹,该轨迹将您带到了您想去的地方,那么您需要做的很多事情才能真正沿着该轨迹运动:状态估计,闭环反馈控制,基于实际运动轨迹的动态更新时间条件……还有很多真正的航空工程师知道的东西。除此之外,这些求解器还需要花费很长时间才能运行,并且在线(实时)优化很难正确而安全地完成:一个错误的输入,您的求解器可能会发出“失败”的声音,从而导致故障发生。

下面是Lars Blackmore网站的链接,他是Starship EDL的首席工程师以及研究Falcon 9着陆技术的人。他的论文和其他出版物对如何在EDL问题中使用最佳控制进行了更为全面的概述。

http://larsblackmore.com/


点击下方阅读原文加入社区会员

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/BF02jgtRS00XKtCx/article/details/117235778

智能推荐

xp计算机安全设置在哪里,WinXP如何进入安全模式?WinXP进入安全模式设置-程序员宅基地

文章浏览阅读3.4k次。相信有很多人都知道,安全模式是Windows操作系统中的一种特殊模式,每当操作系统中出现错误,只要在安全模式下,就可以很轻松的修复操作系统出现的错误。对于经常使用电脑的用户来讲,如何进入安全模式可以说是小菜一碟,但对于很少使用电脑的用户来讲,就有点困难了。下面,针对这一问题,小编这就来教教大家WinXP进入安全模式的方法。方法/步骤1、如果不能进入正常系统,开机后,可以到系统选项界面时,直接按F8..._xp怎么进入安全模式

2019北邮计算机考研大纲,2019年北京邮电大学802电子电路考研大纲-程序员宅基地

文章浏览阅读173次。802 电子电路模拟部分一、考试要求要求学生系统地掌握模拟电子技术的基本概念、基本电路的工作原理和基本分析方法,并能灵活应用于实际,具有较强的分析问题与解决问题的能力。二、考试内容1、了解PN结及其特性;掌握常用二极管、双极型晶体管及场效应管的特性和主要参数。2、掌握双极型晶体管组成的三种基本组态电路的特点和基本分析方法;了解场效应管放大电路。3、了解多级放大电路的常用耦合方式,掌握多级放大电路的..._北邮计算机考研大纲

sftp shell 批量上传文件_浅析Suse中的sftp批量传送文件-程序员宅基地

文章浏览阅读246次。我学习Suse经常的遇到一些问题,喜欢总结一下,就这样知识就慢慢的积累起来了,前两天我想传一些文件,可在Suse中我不会去操作,于是我上网找了一下,就学会了在shell脚本里使用sftp批量传送文件,希望看完本文之后你能过学会在shell脚本里使用sftp批量传送文件。主要步骤如下:1.为运行shell脚本的本地用户生成密钥对2.将其中的公钥分发到sftp欲登录的远程服务器上3.编写并以上面的本地..._批量sftp传文件

def __init__(self):-程序员宅基地

文章浏览阅读1.9k次。def __init__(self): 是一个Python类中的构造函数,用于创建类的实例时初始化该实例的属性。在构造函数中,self是一个指向类的实例本身的引用,可以用它来访问和设置该实例的属性。构造函数的名称是固定的,不能更改,而且第一个参数必须是self。..._def __init__(self):

OpenCV拷贝与ROI_opencv a(rect).copyto(b.rect())-程序员宅基地

文章浏览阅读1.6k次。OpenCV的Mat变量之间拷贝分浅拷贝和深拷贝(由于3.0以后对IplImage变量不再使用,所以这里仅考虑Mat变量)一. 浅拷贝Mat a;Mat b = a; //a "copy" to bMat c(a); //a "copy" to c注意:浅拷贝不复制数据只创建矩阵头,实现数据共享,更改a, b, c三个变量中的任意一个都会对另外2个产生同样的作用。_opencv a(rect).copyto(b.rect())

【Win10】蓝屏“选择一个选项”,关机重启均无法进入系统解决方案-程序员宅基地

文章浏览阅读4.2w次,点赞35次,收藏166次。参考文章:https://zhuanlan.zhihu.com/p/140922138https://blog.csdn.net/Andrew_clovers/article/details/106139827https://www.pianshen.com/article/89412024098/_选择一个选项

随便推点

音乐标签修改 android,mp3标签-mp3标签修改器 安卓版v4.0-PC6安卓网-程序员宅基地

文章浏览阅读2k次。标签编辑器 mp3 Tag Editor可以快速的帮你修改MP3里面的标签乱码,主要是MP3乱码太多会使得MP3文件体积变大,也可以修正歌曲的信息。官方介绍《MP3标签编辑器 MP3 Tag Editor》是一款生活应用,可以帮助您编辑MP3里的ID3标签(标题,歌手,专辑,类型,曲目)。此外,它还可以快速的帮助您修正在繁体中文,简体中文,日文和韩文MP3中的标签乱码。软件功能可以删除多余的Mp3..._android 修改mp3歌曲详细信息实现

Linux端口被占用怎么解决-程序员宅基地

文章浏览阅读457次。Linux端口被占用怎么解决

Android.mk 文件 之 入门语法介绍_.mk文件的语法-程序员宅基地

文章浏览阅读211次。一、Android.mk介绍Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等。要掌握jni,就必须熟练掌握Android.mk的语法规范。它的基本格式如下:LOCAL_PATH:=$(callmy-dir) include$(CLEAR_VARS) ..._.mk文件的语法

C++primer plus习题+答案_c++primer plus 复习题答案-程序员宅基地

文章浏览阅读1.2k次。类是用户定义的类型的定义。类声明指定了数据将如何存储,同时指定了用来访问和操纵这些数据的方法(类成员函数)_c++primer plus 复习题答案

通知服务的使用问题_java注册完服务如何通知其他服务 site:blog.csdn.net-程序员宅基地

文章浏览阅读205次。1.服务大多数和通知一起,然后关键问题是PendingIntent的使用对于App demo,启动的一个类,竟然没有把整个屏幕覆盖,这不合理啊。自己试验没有这个问题。由于服务不会自己停止,我们要手动停止服务。服务生命周期重点还是绑定服务,以及服务和活动的通信啊。加油。_java注册完服务如何通知其他服务 site:blog.csdn.net

2019.11.零散笔记_搜索系统:项目内容,通过网站爬虫爬取网站数据,然后基于klastlcseard和klbana搭建-程序员宅基地

文章浏览阅读282次。《精益创业》一书对 MVP 和迭代思维有比较好的讲解,可以看看。PS:有篇老外写的关于 MVP 的文章不错,其中的配图被到处使用。可能需要翻墙:Making sense of MVP (Minimum Viable Product) - and why I prefer Earliest Testable/Usable/LovableApache Flink 零基础入门教程h..._搜索系统:项目内容,通过网站爬虫爬取网站数据,然后基于klastlcseard和klbana搭建