dsl linux 使用教程,SpaceDSL天体动力学仿真库的介绍、编译和使用说明

1. 介绍

SpaceDSL是一个天体动力学仿真库。它使用C++编写,为天体动力学爱好者提供一个开放的框架以更自由的方式实现天体动力学仿真。本项目基于MIT协议开放源码,以供自由使用。本项目通过CMake构建,可以用于Windows、Linux和Mac OS。SpaceDSL库可以被编译成静态库、动态库和Python依赖库。当然也支持直接使用。

1.1 核心特性

SpaceDSL包含了有关天体动力学仿真的全部基本功能,包括:

天文时间系统:支持EOP web Service,包含UTC、UT1和TT等多种时间系统的定义和转换

参考坐标系:包含ECI、TOD、ECEF、VVLH等常用空间坐标系的变换方程

JPL星历:重新打包了JPL星历读取模块,提供最新的DE436文件,包括1950至2050年间的数据

地球重力模型:使用EGM2008数据(80X80)和球谐函数构建地球的高精度重力模型

其他摄动模型:大气阻力(NRLMSISE2000)、太阳辐射压、第三天体重力(Third Body Gravity)

双天体轨道预测、J2轨道预测和用于航天器的高精度轨道预测

多种地面目标模型和访问分析(Access Analysis)

传感器支持(Simple Conic 和 Rectangular)

常用物理常量

多线程并行支持:类似于Qt的API,包含线程和线程池

支持基于STL的异常处理

提供基于NLopt的非线性优化库

1.2 后续支持的特性

摄动模型:固体潮(Earth Tide)、相对论效应

航天器的相对运动仿真

轨道动作仿真特性

轨道偏移量预测

2. 编译

2.1 支持的编译器

Clang/LLVM 3.3 及以上版本(如果是Xcode的Clang,需要5.0.0及以上版本)

GCC 7.2 及以上版本

Microsoft Visual Studio 2015 Update 3 及以上版本

Intel C++ compiler 16 及以上版本

2.2 编译过程

克隆项目代码:

git clone https://github.com/Astrodynamics/SpaceDSL.git

使用CLion打开项目:Build All

67e81fb125b2

image

注意,如果平台是Linux系统,则在Build之前需要安装以下依赖:(以Ubuntu 16.04系统为例,其他Linux系统下的安装指令类似):

sudo apt-get install python-dev

sudo apt-get install python3-dev

选择Run->Build编译全部

编译成功后,文件中多出了Build文件夹,其中astrodata是该库需要的一些基础数据文件,libNLOpt_d.dylib和libSpaceDSL_d.0.0.dylib等是动态链接库文件,PySpaceDSL_d.cpython-37m-darwin.so是该项目使用python封装后的依赖库文件。

基于以上动态链接库和位于Build/Dependence文件夹下的头文件,即可编写C++代码,进行仿真,示例代码如下:(TestMain.cpp)

#include

#include "SpaceDSL/SpaceDSL.h"

using namespace std;

using namespace SpaceDSL;

int main(int argc, char *argv[])

{

cout<

try

{

/// Initial Data

UTCCalTime vehicle_epoch (2018,1,4,16,58,11.1);

string targetName1 = "Facility1";

PointTarget target1(targetName1, -75.5966*DegToRad, 40.0386*DegToRad, 0, 10*DegToRad);

string vehicle_name1 = "The First Vehicle";// h = 257km

CartState vehicle1_cart0(-5.04649e+06, -3.53951e+06, -2.44795e+06,

4954.67 , -4008.83, -4417.73 );

double vehicle1_mass = 1000.0;

string vehicle_name2 = "The Second Vehicle"; // h = 1065km

CartState vehicle2_cart0(-5.65484e+06, -3.96619e+06, -2.74305e+06,

4680.57 , -3787.06, -4173.34 );

double vehicle2_mass = 1500.0;

/// Mission Start

Mission *pMission = new Mission();

auto pVehicle1 = pMission->InsertSpaceVehicle(vehicle_name1,vehicle_epoch,vehicle1_cart0,vehicle1_mass, 2.2, 3, 1.0, 3);

auto pVehicle2 = pMission->InsertSpaceVehicle(vehicle_name2,vehicle_epoch,vehicle2_cart0,vehicle2_mass, 2.2, 6, 1.0, 6);

pMission->RemoveSpaceVehicle(pVehicle2->GetID());

pMission->InsertFacility(targetName1,-75.5966*DegToRad, 40.0386*DegToRad, 0, 10*DegToRad);

ThirdBodyGravitySign thirdGravSign;

thirdGravSign.bIsUseSunGrav = true;

thirdGravSign.bIsUseMoonGrav = true;

double kp = 3.0;

VectorXd ap;

ap.resize(7);

ap.fill(0.0);

ap(0) = GeomagneticKpToAp(kp);

pMission->SetEnvironment(E_Earth, GravityModel::GravModelType::E_EGM08Model,

20 , 20, thirdGravSign,

GeodeticCoordSystem::GeodeticCoordType::E_WGS84System,

AtmosphereModel::AtmosphereModelType::E_NRLMSISE00Atmosphere,

150,150,ap,

true, true);

pMission->SetPropagator(E_RungeKutta4, 60);

//pMission->SetPropagator(E_RungeKutta78, 60, 0.01, 1, 120, 100);

UTCCalTime initial_time (2018,1,5,16,58,11.1);

pMission->SetMissionSequence(initial_time, 86123);

pMission->Start(true);

cout<

pMission->CalMissionAccessData();

auto accessListMap = pMission->GetAccessData();

for (auto iterMap = accessListMap->begin();

iterMap != accessListMap->end();

++iterMap)

{

cout<

cout<first.first->GetName()<first.second->GetName()<

cout<

auto accessList = iterMap->second;

for(auto &data:accessList)

{

double mjd = CalendarTimeToMjd(data.first);

cout.precision(15);

cout<

}

}

pVehicle1->Reset();

pMission->ClearProcessData();

pMission->Start();

pMission->CalMissionAccessData();

cout<

accessListMap = pMission->GetAccessData();

for (auto iterMap = accessListMap->begin();

iterMap != accessListMap->end();

++iterMap)

{

cout<

cout<first.first->GetName()<first.second->GetName()<

cout<

auto accessList = iterMap->second;

for(auto &data:accessList)

{

double mjd = CalendarTimeToMjd(data.first);

cout.precision(15);

cout<

}

}

//CalObservationAll();

cout<

/// CZML File Wirte;

CZMLScript script;

script.Initializer("TestData.czml", pMission);

script.WirteCZML();

cout<

pMission->Destory();

}

catch (SPException &e)

{

e.what();

}

return 0;

}

通过Python封装过的依赖库PySpaceDSL,可以使用Python编写仿真代码。

将PySpaceDSL_d.cpython-37m-darwin.so文件重命名为PySpaceDSL.so,同时在当前路径下放置astrodata基础数据文件夹,编写Python脚本(TestPython.py):

from PySpaceDSL import *

import numpy as np

print("SpaceDSL Test Run!")

def main():

# Initial Data

initial_time = UTCCalTime(2018, 1, 4, 16, 58, 11.1)

vehicle1_cart0 = CartState(-5.04649e+06, -3.53951e+06, -2.44795e+06, 4954.67, -4008.83, -4417.73)

vehicle1_mass = 1000.0

vehicle2_cart0 = CartState(-5.65484e+06, -3.96619e+06, -2.74305e+06, 4680.57, -3787.06, -4173.34)

vehicle2_mass = 1500.0

# Mission Start

test_mission = Mission()

test_mission.InsertSpaceVehicle('The First Vehicle', initial_time, vehicle1_cart0, vehicle1_mass, 2.2, 3, 1.0, 3)

test_mission.InsertSpaceVehicle('The Second Vehicle', initial_time, vehicle2_cart0, vehicle2_mass, 2.2, 6, 1.0, 6)

test_mission.InsertFacility('Facility1', -75.5966 * DegToRad(), 40.0386 * DegToRad(), 0, 10 * DegToRad())

thirdGravSign = ThirdBodyGravitySign()

thirdGravSign.bIsUseSunGrav = True

thirdGravSign.bIsUseMoonGrav = True

kp = 3.0

ap = np.zeros(7)

ap[0] = GeomagneticKpToAp(kp)

test_mission.SetEnvironment(SolarSysStarType.E_Earth, GravityModel.GravModelType.E_EGM08Model, 20, 20,

thirdGravSign, GeodeticCoordSystem.GeodeticCoordType.E_WGS84System,

AtmosphereModel.AtmosphereModelType.E_NRLMSISE00Atmosphere,

150, 150, ap, True, True)

test_mission.SetPropagator(IntegMethodType.E_RungeKutta4, 60.0)

test_mission.SetMissionSequence(initial_time, 86400)

test_mission.Start(True)

print('------First Calculation Finished ------')

test_mission.CalMissionAccessData()

accessListMap = test_mission.GetAccessData()

print(accessListMap)

# CZML File Wirte;

script = CZMLScript()

script.Initializer("PyTestData.czml", test_mission)

script.WirteCZML()

print("CZML Output Finished!")

if __name__ == "__main__":

main()

运行程序,会在当前目录生成一个.CZML后缀的文件。CMZL文件是一种用来描述动态场景的JSON架构的语言,主要用于Cesium在浏览器中的展示。这里的CZML文件就是用于可视化展示仿真结果的描述文件。

3.使用说明

编写C++程序或Python脚本完成仿真过程,并自动生成.CZML文件后,可以通过SpaceDSL自带的可视化程序ElectronVisualizer展示仿真结果。

首先需要在系统安装Node.js环境。

然后切换到SpaceDSL项目中的ElectronVisualizer路径下:

cd ElectronVisualizer

安装相关依赖库:

npm install --save-dev electron

npm install --save-dev cesium

npm install --save glob

然后,启动可视化软件:

npm start

软件启动后,点击菜单Read Script,选择先前生成的.CZML文件加载。

67e81fb125b2

image

文件加载后,操作界面左下角的控制按钮,即可播放仿真结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值