首先我们拿到github提供的文件,看到有challenge,generator,solver三个文件夹。我们需要的主要是challenge和generator。为了更加方便的部署环境而不需要大量的docker环境,因此,我选用直接执行脚本实现题目环境。
打开官网的generator-base文件夹,查看Makefile文件内容。
直接执行 docker build . -t generator-base:debug
然后执行 docker run,根据需要选择参数。
然后clone下官网hack-a-sat的文件夹,进入attitude文件夹
首先需要生成题目所需文件,所以进入generator文件夹,执行python3 generator.py
如果需要更改生成文件位置可以打开generator.py的文件,修改filename的值
然后进入challenge文件夹,执行python3 challenge.py文件即可开启题目。
如果需要挂载在端口可以使用socat tcp-listen:port,fork exec:./程序名,reuseaddr
至此,题目环境搭建完成。
题目意图比较两个向量从而确定当前姿态。这无疑涉及一些专业知识。所以根据attitude和vector两个关键词在搜索引擎中搜索,随后得到以下两个比较合适的论文标题,而两者区别在于一个是attitude,一个是quaternion。
首先了解一下什么是quaternion,以及常见的attitude描述形式从而判断我们选择哪一个文章进行实现。
quaternion叫做四元数,本身形式时三个虚部加上一个实部构成的复数。如下图所示。
但是对于我们来说,我们需要知道quaternion在spacecraft中的意义。
在Introduction to Satellite Attitude Control文章中,我找到了相关的内容。
第一个关键定义是,姿态是用来确定航天器的方位,而航天器有自己的三维方向,同时需要将这个航天器坐标系与一些惯性参考系进行比较,以便测量变化。
因此,一个航天器的姿态是指其相对于特定参考系的三维方向。
然后是探究该三维方向的表现形式是什么?
在wiki中表示,该三维方向可以用多种方法来描述;然而,最常见的是旋转矩阵、四元数和欧拉角。
旋转矩阵如下图所示:
四元数如下图所示:
欧拉角如下图所示:
接下来看看题目需要的描述方法是什么。
执行python3 challenge.py后,任意输入发现提示输入格式为四个数值,因此,判断需要的结果是四元数。
确定我们需要的结果是四元数后,我们进一步阅读Fast Quaternion Attitude Estimation from Two Vector Measurements的论文内容。
该方法实现的前提条件是有两个在航天器坐标系下的星星位置方向的单位向量以及两个在参考坐标系下的测量向量,这个参考坐标系通常是惯性系。而我们需要得到的姿态是将矢量从参考坐标系旋转到航天器本体坐标系的矩阵。
确定航天器姿态的最简便方法是TRIAD,目前已有的解题方案中ADDVulcan使用了这一方案,其计算方式为
A = b1*r1.T + b3*r3.T + np.cross(b1, b3) * np.cross(r1, r3).T
其中b1是参考坐标系下的测量向量,r1航天器坐标系下的星星位置方向的向量,b3和r3则是根据b1,b2,r1,r2计算得到的数值。计算方法为
而这一方法得到的结果是旋转矩阵还需要转化成四元数。
我们今天使用的方法则是直接得到四元数。
首先,我们引入WAHBA's Problem
其中w_k是参考坐标系下的三维向量,v_k是航天器坐标系下的三维向量,R是我们需要求解的3*3的旋转矩阵。a_k是该观测星星的权重。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)