GithubHelp home page GithubHelp logo

prologue's Introduction

Prologue

単段 / 多段式ハイブリッドロケットの軌道シミュレーターです。

Download

Latest Update: 2022/08/25

Version: 1.9.8

Download

過去のバージョン、更新履歴

利用方法

  1. 事前準備

    • Gnuplot の導入

      • Windows: ここからインストール
        gnuplot のデフォルト出力形式の選択で wxt を選択

      • macOS: Homebrewをインストール後、ターミナルで brew install gnuplot

      • Linux: ターミナルで sudo apt install gnuplot

    • その他

      • Linux: --open-result オプション指定時にエラーが発生する場合があるため以下を実行
        sudo apt install samba-common-bin
        sudo mkdir -p /var/lib/samba/usershares
  2. ダウンロードした Prologue の zip ファイルを展開

  3. 各パラメータの入力形式に沿ってファイルを作成する

  4. Prologue を起動、指示に従ってシミュレーションを実行
    macOS, Linux の場合はターミナル上でのみ実行可能

  5. result/ フォルダ下に結果が格納される

コマンドラインオプション

ターミナルで実行時、./Prologue --commandのようにして以下のオプションを指定できます。

  • --no-save: 結果を保存しない
  • --no-plot: 結果をプロットしない
  • --dry-run: 結果を保存もプロットしない(--no-save --no-plotと同値)
  • --open-result: シミュレーション実行後に結果のフォルダをエクスプローラーなどで開く

For Developers

必ずこれを読んでください。

やることがなかったら Issues にあるものを消化するといいと思います。

prologue's People

Contributors

kondoa9 avatar

Watchers

James Cloos avatar

prologue's Issues

多段式ロケットにおいて、分離前の機体と分離後の上下段に関係性を持たせる

目的

  • 現在のフォーマットではrocket1, rocket2, rocket3がどの部分のことなのかがわからないため、これを明確にする
  • 分離後であっても多少別の機体からの影響(下段であれば上段のエンジンから受ける力)があるため、これを考慮できるようにする

実装

多段式ロケットにおいて、現在はrocket1, rocket2, rocket3をそれぞれ独立にしている。

これを、例えば

{
  "rocket": {
    ...,
    "motor_file": "motor.txt",
    "sub_rockets": {
      "lower_rocket": {
        ...,
        "motor_file": "motor_lower.txt",
      },
      "upper_rocket": {
        ...,
        "motor_file": "motor_upper.txt",
      }
  }
}

のようにする。

開発環境をvscodeにする

開発スピードが早いためVisual Studioを採用しましたが、容量も負荷もそこそこあるため、できるならvscodeがいいかなと思ってます。

やるのであれば、windows, mac, linuxでビルド可能にし、マルチプラットフォーム化までできると良いです。
当然、開発者の負担軽減のため、Visual Studioレベルに何もしなくてもビルドできるって状態まで持ってくことが理想です。

機軸方向ベクトルのグラフ化機能の追加

簡単に言えば、機体姿勢を視覚的に描画する機能。
機体のQuaternionをベクトル化し、Gnuplotに渡すだけである。

この機能をプログラムを変更せずにソフトウェア上で設定、確認できるようにする。

べき法則の基準高度を設定できるようにする

prologue.settings.jsonにおいて、wind_model.power_low_base_altキーを追加する。

"wind_model": {
  "power_constant": 6.0,
  "power_low_base_alt": 2.0, // [m]
  "type": "original",
  "realdata_filename": "sample.csv"
}

べき法則の式は以下の通り
$$ v' = v * ({h \over h_0}) ^ {1 \over k} $$

微分方程式の精度向上

現在の一次精度から二次、または三次精度に精度を上げる。
式は以下の通り。

二次精度
$$f^{n+1} = f^n + \delta t {3g^n - g^{n-1}\over 2}$$

三次精度
$$f^{n+1} = f^n + \delta t {23g^n - 16g^{n-1} + 5g^{n-2} \over 12}$$

結果間引き機能追加

現在はシミュレーション結果を全ステップ出力しているが、出力ファイルが巨大になってしまうため、dtを細かくし精度を担保しつつ、出力としては全てではなく 1/10(指定可能)だけ出力するようにしファイルが巨大化しないようにする。

圧力中心(傾斜も),抗力係数(傾斜も),法線力係数 vs 機体速度を組み込む

圧力中心(傾斜も),抗力係数(傾斜も),法線力係数 vs 機体速度の csv ファイルを input に
加え,飛翔速度に応じて値を使うように変更する.(csv ファイル内にない値は前後を線形
近似,最大速度が csv ファイルを超える場合は最後の値を使うように設定.)また csv ファ
イルが存在しない場合は json の定数で扱えるようにする.

抗力係数 Cd を迎え角の関数に

抗力係数は迎え角αに対し次のように変化する
(迎え角αのときの抗力係数)=(抗力係数 Cd)+(抗力係数傾斜 Cdα2)×(迎え角 rad)
×(迎え角 rad)
Cdα2 は json に新たに追加し,諸元から得る.この値が json にない場合は 0 で計算すると
いうのがあるといいかも

複数パラシュートへの対応

複数パラシュートに対応する。

現状、諸元jsonからはvel_1st、op_type_1st等の1段目のパラシュート諸元しか取得していない。
プログラム上、機体スペックのparachuteメンバーは配列として記述しているが、あらゆる場所でparachute[0]しか使ってない。

最新版通知

https://github.com/FROM-THE-EARTH/Prologue/releases/latest にアクセスすると、https://github.com/FROM-THE-EARTH/Prologue/releases/tag/v1.7.0のような最新版のURLへリダイレクトされる。
ここでURL末尾のv1.7.0を取り出し、現在のバージョンと比較することで最新版が存在するかどうかをチェックできる。

出力ファイルの整理

  • 主要な値(ランチクリア時の時刻、速度・最高高度)などをまとめたSummaryファイル
  • ステップ毎の速度・高度等シミュレーションの詳細をまとめたDetailファイル

Summaryファイル summary.csv

分離の有無にかかわらず、そのシミュレーションにおける唯一の値を取る。
そのためSummaryは1回のシミュレーションつき1つである。

出力される値

  • 風速
  • 風向
  • ランチクリア時刻
  • ランチクリア速度
  • 最高高度
  • 最高高度時刻
  • 最高速度
  • 最大対気速度
  • 最大垂直抗力

Detailファイル body1_detail, body2_detail, body3_detail, ...

Scatterシミュレーションではdetailファイルの出力は行わない。

出力される値

  • 発射からの時刻
  • その機体の時刻(分離した場合は2,3段目以降分離時を基準とした時刻となる)
  • ランチクリア True / False
  • 燃焼中 True / False
  • パラシュート開傘 True / False
  • 空気密度
  • 重力
  • 気圧
  • 気温
  • 風ベクトル
  • 機体質量
  • 重心(機体先端から)
  • 慣性モーメント ピッチ / ヨー
  • 慣性モーメント ロール
  • 迎角
  • 高度
  • 速度
  • 対気速度
  • 垂直抗力
  • Cnp
  • Cny
  • Cmqp
  • Cmqy
  • 圧力中心(機体先端から)
  • 抗力係数
  • 法線力係数
  • 緯度
  • 経度
  • 射点からの直線距離
  • 安定比
  • 動圧

マップの追加

射点緯度経度、地図画像、Gnuplot表示の調整を行う

未実装:
能代陸

実装済み:
能代海
伊豆海
伊豆陸

マルチスレッド時のスレッド数を設定ファイルで指定できるようにする

スレッド数は多ければ多いほど高速になるわけではない

が、高高度かつパラシュートを使用するとそこそこの時間がかかる上、PCスペックによっても変化する。1回の解析にかかる時間が多いほどスレッド数は多くても良いとされる。
現在はスレッド数は2で固定している。

実装するときは、ハードウェアのスレッド数限界を超えないように、threadCount <= 0とならないように

if (threadCount <= 0 || std::thread::hardware_concurrency() < threadCount)
    threadCount = 1;

を忘れずに。

横風突風時の法線力(機軸に垂直な方向の力)これは分散や軌道には影響しないのであったら便利くらいでいい

飛翔中に風速が+9m/s された場合の法線力を計算してその最大値を出力できるようにして
くれると助かる.これはあくまで仮に+9m/s の突風が定常風に追加で吹いたらどの程度の
力が加わるか知りたいだけなので,機体の飛翔姿勢には影響させない.(理論値だけでオッ
ケー)

落下地点の緯度経度算出方法について

現在は

  1. 発射点の緯度経度における1kmあたりの度を求める
    MapCoordinate(double latitude, double longitude) : m_latitude(latitude), m_longitude(longitude) {
    m_degPerLen_latitude = 31.0 / 0.00027778;
    m_degPerLen_longitude = 6378150.0 * std::cos(latitude / 180.0 * Constant::PI) * 2.0 * Constant::PI / 360.0;
    }
  2. 発射点から落下点の距離から落下点の緯度経度を求める
    double latitudeAt(double length) const { // length: from here
    return m_latitude + length / m_degPerLen_latitude;
    }
    double longitudeAt(double length) const { // length: from here
    return m_longitude + length / m_degPerLen_longitude;
    }

    という計算を経て落下点の緯度経度を求めているが、これが正しいのかどうかがよくわからない(参考資料はあったが紛失した)

3段以上のロケットへの対応(コードの整理)

優先度は非常に低い。

現実的に3段以上のロケットに対応することはほぼ無いが、現在のプログラムは1,2段専用となっている。
3段以上(無限段対応)にすることでよりメンテナンスしやすくなる(はず)

保安域の線も指定できるようにする

現在はGoogle Mapで保安線を引き、同じマップ上にシミュレーション結果の座標をプロットしている。
これを一気に行えるようにし、データ処理を楽にする。

抗力係数の向きの修正

抗力係数は本来風に平行な方向の力
今のシミュでは機軸方向の力で計算している
正しい計算式に直してほしい
具体的な計算式は(軸方向の力)= (抗力 D)×cos(迎え角α)

圧力中心位置 Cp を迎え角の関数に

圧力中心は迎え角αに対し次のように変化する
(迎え角αのときの圧力中心)=(圧力中心 Cp)+(圧力中心傾斜 Cpα)×(迎え角 rad)
ここでの迎え角はピッチとヨーそれぞれでの迎え角にする(Cna に掛け算されている迎え
角)
Cpαは json に新たに追加し,諸元から得る.この値が json にない場合は 0 で計算するとい
うのがあるといいかも

特定の風向風速で計算に異常が生じる

Scatterシミュレーションでマルチスレッドで行うと、シングルスレッドでは正常な結果が出力されるにも関わらず、異常な値が出力される場合がある。

エンジン推力を大気圧で補正する

T: 真空中の推力
Ae: ノズル出力面積= PI * (ノズル出力直径)^2 / 4

大気圧p0において、推力T0
T0 = T - p0 * Ae

燃焼実験における大気圧をp1、推力をT1とすると、
T0 = T1 + (p1 - p0) * Ae

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.