Main Content

惑星系における重力のモデル化

このチュートリアルでは、重力により運動する太陽系の主要な天体の軌道をシミュレートする方法を説明します。モデルでは、太陽と惑星をそれぞれが並進自由度 3 をもつ完全球体として扱います。惑星の自転は無視されます。重力場は、惑星を軌道上に維持する力を生成します。

solar_system_tutorial_schematic.png

Spherical Solid ブロックは太陽系の天体を表し、そのジオメトリ、慣性、および色を提供します。Cartesian Joint ブロックは、太陽系の重心に位置するワールド座標系を基準に、天体の自由度を定義します。Gravitational Field ブロックは、惑星の初期軌道を曲げて閉楕円軌道状にする要因である遠距離力を付加します。

Cartesian Joint ブロックは、ワールド座標系を基準とした太陽と惑星の初期状態 (位置と速度) を提供します。初期状態は、2016 年 6 月 20 日の太陽系の配置に対応しています。これは、Jet Propulsion Laboratory (JPL) が維持管理する天体位置データベースを出典としています。

Web または Telnet インターフェイスを使用し、JPL Horizons システムを通じてこのデータベースをクエリすることができます。Aerospace Toolbox のユーザーは、別の方法として、Aerospace Ephemeris Data サポート パッケージのインストール後に MATLAB® コマンド プロンプトで関数 planetEphemeris を使用することにより、天体位置データを入手できます。

新しいモデルの開始

Simscape™ Multibody™ のモデル テンプレートを開き、不要なブロックをすべて削除します。モデルに重力場を追加できるように、重力の設定を変更します。その結果が、太陽系モデルの開始点となります。

  • MATLAB コマンド プロンプトで、「smnew」と入力します。MATLAB で Simscape Multibody モデル用のよく使用されるブロックと適切なソルバー設定をもつモデル テンプレートが開きます。

  • Mechanism Configuration、Solver Configuration、および World Frame を除くすべてのブロックを切り取ります。これら 3 つのブロックによって、重力設定、ソルバー設定およびグローバルな慣性基準座標系がモデルに提供されます。

ss_add_blocks_0.png

  • Mechanism Configuration ブロックのダイアログ ボックスで、[Uniform Gravity] を [None] に設定します。この設定により、代わりに Gravitational Field ブロックを使用して、重力を逆二乗の法則に従う力としてモデル化できるようになります。

太陽系の天体の追加

太陽系の天体は Spherical Solid ブロックを使用して表します。ジオメトリと慣性のパラメーターを MATLAB 変数として指定し、モデル エクスプローラーを使用してモデル ワークスペース内でこれらの変数を初期化します。変数は、最初の文字を大文字にして太陽系の天体の名前を付けたデータ構造体です。

Solid ブロックの接続と構成

  • Body Elements ライブラリから 9 個の Spherical Solid ブロックをモデルに追加します。ブロックは、太陽と 8 つの既知の惑星を表します。

  • 図に示すようにブロックを接続して名前を付けます。ブロックは、ワールド座標系と惑星の間の分岐した座標系接続ラインによって剛結合され、空間内で一致します。この条件は、Cartesian Joint ブロックを使用して後ほど変更します。

solar_system_add_bodies.png

  • Spherical Solid ブロックのダイアログ ボックスで、[Inertia][Based on] パラメーターを [Mass] に設定します。この慣性パラメーターの設定によって、固体の質量を直接指定することが可能となり、モデルのダイナミクスに影響を与えずに惑星の形状をスケーリングできるようになります。

  • 以下の Spherical Solid ブロック パラメーターを MATLAB のデータ構造体フィールドとして指定します。フィールド名を "Structure.Field" の形式で入力します。"Structure" は先頭文字を大文字にした太陽系の天体の名前で、"Field" は次の表に示す文字列であり、Sun.REarth.RGB のようになります。

モデル エクスプローラーを使用して、モデル ワークスペースで後ほど新しい構造体フィールドを定義します。

固体特性の初期化コードの追加

  • [モデル化] タブで、[モデル エクスプローラー] をクリックします。

  • モデル エクスプローラーの [モデルの階層構造] ペインでモデルのノードを展開し、[Model Workspace] を選択します。[モデルの階層構造] ペインは左側にあります。

  • モデル エクスプローラーの [モデル ワークスペース] ペインで、[データ ソース] を [MATLAB Code] に設定します。[モデル ワークスペース] ペインは右側にあります。

  • [MATLAB コード] フィールドに太陽と惑星の固体特性の初期化コードを追加します。コードは、太陽系の天体の名前を付けたセクションにまとめられています。初期位置と初期速度のデータを、後ほどこれらのセクションに追加します。

% All values are in SI units.
% RGB color vectors are on a normalized 0-1 scale.
% Body dimensions are scaled for visualization purposes. 
% Scaling has no impact on model dynamics.

% Scaling
SunScaling = 0.5e2;
TerrestrialPlanetScaling = 1.2e3;
GasGiantScaling = 2.5e2;

% Sun
Sun.M = 1.99e30;
Sun.R = 6.96e8*SunScaling;
Sun.RGB = [1 0.5 0];

% Mercury
Mercury.M =3.30e23;
Mercury.R = 2.44e6*TerrestrialPlanetScaling;
Mercury.RGB = [0.5 0.5 0.5];

% Venus
Venus.M = 4.87e24;
Venus.R = 6.05e6*TerrestrialPlanetScaling;
Venus.RGB = [1 0.9 0];

% Earth
Earth.M = 5.97e24;
Earth.R = 6.05e6*TerrestrialPlanetScaling;
Earth.RGB = [0.3 0.6 0.8];

% Mars
Mars.M = 6.42e23;
Mars.R = 3.39e6*TerrestrialPlanetScaling;
Mars.RGB = [0.6 0.2 0.4];

% Jupiter
Jupiter.M = 1.90e27;
Jupiter.R = 6.99e7*GasGiantScaling;
Jupiter.RGB = [0.6 0 0.3];

% Saturn
Saturn.M = 5.68e26;
Saturn.R = 5.82e7*GasGiantScaling;
Saturn.RGB = [1 1 0];

% Uranus
Uranus.M = 8.68e25;
Uranus.R = 2.54e7*GasGiantScaling;
Uranus.RGB = [0.3 0.8 0.8];

% Neptune
Neptune.M = 1.02e26;
Neptune.R = 2.46e7*GasGiantScaling;
Neptune.RGB = [0.1 0.7 0.8];
  • [ソースから再初期化] をクリックします。

これで Spherical Solid ブロックに、惑星の形状と色のレンダリングに必要な数値データがすべて揃いました。試しに Spherical Solid ブロックのダイアログ ボックスを開き、固体の可視化ペインに球体が表示されるようになったことを確認してください。

solar_system_visualize_earth.png

自由度の追加

Cartesian Joint ブロックを使用して、太陽系の重心と太陽系の各天体の間に並進自由度 3 を追加します。後でこれらのブロックを使用して、太陽系の天体の初期位置と初期速度を指定します。

  • Joints ライブラリから 9 個の Cartesian Joint ブロックをモデルに追加します。これらのブロックによって、太陽と 8 つの既知の惑星の並進自由度が与えられます。

  • 図に示すようにブロックを接続して名前を付けます。既存の接続ライン上にブロックを配置する場合、Simscape Multibody ソフトウェアでは、自動的にブロックがそのラインに接続されます。Spherical Solid ブロックが必ず follower (F) 座標系端子のみに接続されるように、ジョイント ブロックの反転や回転を行います。

solar_system_add_joints.png

太陽と惑星はもう剛結合されていません。互いに対して並進できるようになっています。ただし、まだ空間内で同位置にあります。太陽と惑星をそれぞれの初期位置に配置して初期速度を設定するには、ジョイントの状態ターゲットを指定しなければなりません。

初期状態ターゲットの追加

モデル内の Cartesian Joint ブロックを使用して、太陽と惑星の初期状態を MATLAB 変数として指定します。次に、モデル エクスプローラーを使用して、モデル ワークスペースで新しい MATLAB 変数を初期化します。MATLAB 変数を、既存のデータ構造体の新しいフィールドとして定義します。

Cartesian Joint ブロックの構成

  • Cartesian Joint ブロックのダイアログ ボックスで、X、Y、Z の各直進ジョイント プリミティブについて、[State Targets][Specify Position Target] チェック ボックスと [State Targets][Specify Velocity Target] チェック ボックスをオンにします。これらの設定により、太陽と惑星の初期状態を任意に指定できるようになります。

  • X、Y、Z の各直進ジョイント プリミティブについて、Cartesian Joint の状態ターゲット値を MATLAB 構造体フィールドとして指定します。フィールド名を "Structure.Field" の形式で入力します。"Structure" は先頭文字を大文字にした太陽系の天体の名前で、"Field" は次の表に示す文字列であり、Sun.PxEarth.Vz のようになります。

モデル エクスプローラーを使用して、モデル ワークスペースで後ほど新しい構造体フィールドを定義します。

状態ターゲットの初期化コードの追加

  • [モデル化] タブで、[モデル エクスプローラー] をクリックします。

  • Mechanics Explorer の [モデルの階層構造] ペインでモデルのノードを展開し、[モデル ワークスペース] を選択します。[モデルの階層構造] ペインは左側にあります。

  • モデル エクスプローラーの [モデル ワークスペース] ペインで、[データ ソース] を [MATLAB Code] に設定します。[モデル ワークスペース] ペインは右側にあります。

  • [MATLAB コード] フィールドにジョイントの状態ターゲットの初期化コードを追加します。青色で表示された新しいコードは、JPL の天体位置データベースから取得した位置と速度のコンポーネントで構成されています。新しいコードのみをコピーするか、モデル ワークスペースのコード全体を表示内容と置き換えることができます。

% All values are in SI units.
% RGB color vectors are on a normalized 0-1 scale.
% Body dimensions are scaled for visualization purposes. 
% Scaling has no impact on model dynamics.

% Scaling
SunScaling = 0.5e2;
TerrestrialPlanetScaling = 1.2e3;
GasGiantScaling = 2.5e2;

% Sun
Sun.M = 1.99e30;
Sun.R = 6.96e8*SunScaling;
Sun.RGB = [1 0.5 0];
Sun.Px = 5.5850e+08; 
Sun.Py = 5.5850e+08;
Sun.Pz = 5.5850e+08;
Sun.Vx = -1.4663;
Sun.Vy = 11.1238;
Sun.Vz = 4.8370;

% Mercury
Mercury.M =3.30e23;
Mercury.R = 2.44e6*TerrestrialPlanetScaling;
Mercury.RGB = [0.5 0.5 0.5];
Mercury.Px = 5.1979e+10; 
Mercury.Py = 7.6928e+09;
Mercury.Pz = -1.2845e+09;
Mercury.Vx = -1.5205e+04;
Mercury.Vy = 4.4189e+04;
Mercury.Vz = 2.5180e+04;

% Venus
Venus.M = 4.87e24;
Venus.R = 6.05e6*TerrestrialPlanetScaling;
Venus.RGB = [1 0.9 0];
Venus.Px = -1.5041e+10; 
Venus.Py = 9.7080e+10;
Venus.Pz = 4.4635e+10;
Venus.Vx = -3.4770e+04;
Venus.Vy = -5.5933e+03;
Venus.Vz = -316.8994;

% Earth
Earth.M = 5.97e24;
Earth.R = 6.05e6*TerrestrialPlanetScaling;
Earth.RGB = [0.3 0.6 0.8];
Earth.Px = -1.1506e+09; 
Earth.Py = -1.3910e+11;
Earth.Pz = -6.0330e+10;
Earth.Vx = 2.9288e+04;
Earth.Vy = -398.5759;
Earth.Vz = -172.5873;

% Mars
Mars.M = 6.42e23;
Mars.R = 3.39e6*TerrestrialPlanetScaling;
Mars.RGB = [0.6 0.2 0.4];
Mars.Px = -4.8883e+10; 
Mars.Py = -1.9686e+11;
Mars.Pz = -8.8994e+10;
Mars.Vx = 2.4533e+04;
Mars.Vy = -2.7622e+03;
Mars.Vz = -1.9295e+03;

% Jupiter
Jupiter.M = 1.90e27;
Jupiter.R = 6.99e7*GasGiantScaling;
Jupiter.RGB = [0.6 0 0.3];
Jupiter.Px = -8.1142e+11; 
Jupiter.Py = 4.5462e+10;
Jupiter.Pz = 3.9229e+10;
Jupiter.Vx = -1.0724e+03;
Jupiter.Vy = -1.1422e+04;
Jupiter.Vz = -4.8696e+03;

% Saturn
Saturn.M = 5.68e26;
Saturn.R = 5.82e7*GasGiantScaling;
Saturn.RGB = [1 1 0];
Saturn.Px = -4.2780e+11; 
Saturn.Py = -1.3353e+12;
Saturn.Pz = -5.3311e+11;
Saturn.Vx = 8.7288e+03;
Saturn.Vy = -2.4369e+03;
Saturn.Vz = -1.3824e+03;

% Uranus
Uranus.M = 8.68e25;
Uranus.R = 2.54e7*GasGiantScaling;
Uranus.RGB = [0.3 0.8 0.8];
Uranus.Px = 2.7878e+12; 
Uranus.Py = 9.9509e+11;
Uranus.Pz = 3.9639e+08;
Uranus.Vx = -2.4913e+03;
Uranus.Vy = 5.5197e+03;
Uranus.Vz = 2.4527e+03;

% Neptune
Neptune.M = 1.02e26;
Neptune.R = 2.46e7*GasGiantScaling;
Neptune.RGB = [0.1 0.7 0.8];
Neptune.Px = 4.2097e+12; 
Neptune.Py = -1.3834e+12;
Neptune.Pz = -6.7105e+11;
Neptune.Vx = 1.8271e+03;
Neptune.Vy = 4.7731e+03;
Neptune.Vz = 1.9082e+03;
  • [ソースから再初期化] をクリックします。

これでモデルには、JPL のデータベースから取得した位置座標に惑星を配置するうえで必要な数値データが揃いました。ただし、この時点でのモデルのシミュレーションでは、直線軌道で運動する惑星が表示されます。楕円軌道にするには、太陽と惑星の重力場を追加してモデルを完成させなければなりません。

solar_system_no_gravity.gif

重力場の追加

Gravitational Field ブロックを使用して、太陽系の各天体の引力をモデル化します。このブロックは、他のすべての天体に対する天体の引力を、ニュートンの万有引力の法則を用いて自動的に計算します。

  • 各 Spherical Solid ブロックのダイアログ ボックスで、[Frames] 領域を展開して [Create] ボタンをクリックします。

  • [Frame Name] パラメーターを R2 に設定し、[Save] ボタンをクリックします。新しい座標系は基準座標系の正確なコピーですが、そこには別個の座標系端子があります。これらの端子を使用して、接続ラインを交差させないようにしながら重力場ブロックを接続できます。

  • Forces and Torques ライブラリから 9 個の Gravitational Field ブロックをモデルに追加します。これらのブロックは、太陽系の各天体が他のすべての天体に及ぼす重力を提供します。

  • 図に示すようにブロックを接続して名前を付けます。ブロックが直接 Spherical Solid ブロックに接続していることを確認します。こうした接続により、重力場は必ず固体球を中心として、それに剛結合されるようになります。

solar_system_add_gravity.png

  • Gravitational Field ブロックで、[Mass] パラメーターを MATLAB 構造体フィールド名として指定します。フィールド名を "Structure.Field" の形式で入力します。"Structure" は先頭文字を大文字にした太陽系の天体の名前で、"Field" は文字列 M であり、Sun.MEarth.M のようになります。これらのフィールドは、モデル ワークスペースで既に定義されています。

シミュレーションの構成と実行

1 回のシミュレーションで地球の公転 10 回分が把捉されるように、Simulink® ソルバー設定を構成します。続いてモデルをシミュレートし、結果として得られる太陽系のアニメーションを表示します。10 年分のアニメーションを数秒間で再生するようにアニメーション設定を構成します。

ソルバー設定の構成

  • [コンフィギュレーション パラメーター] を開きます。[モデル化] タブで、[モデル設定] をクリックします。

  • [終了時間] パラメーターを 10*365*24*60*60 に設定します。10 年の秒数に等しいこの数値によって、2016 年 6 月 20 日から 2026 年 6 月 20 日までの地球の公転 10 回分を完全にシミュレートできるようになります。

  • [最大ステップ サイズ] パラメーターを 24*60*60 に設定します。この数値は 1 日の秒数に等しく、滑らかなアニメーションが提供されるよう十分に小さい値となっています。シミュレーション結果をより高速にするには、この数値を増やします。

モデルの更新とシミュレーション

ブロック線図を更新します。[モデル化] タブで、[モデルの更新] をクリックします。初期状態のモデルの 3 次元表示を含む Mechanics Explorer が開きます。可視化ペインに太陽と惑星が表示されること、またそれらの相対的な寸法と位置が妥当であることを確認します。

シミュレーションを実行します。Mechanics Explorer によって、太陽系のアニメーションが再生されます。既定のベース再生速度では、惑星が静止して見えることに注意してください。Mechanics Explorer のアニメーション設定でこの速度を上げなければなりません。アニメーション設定の構成

  • Mechanics Explorer で、[Tools][Animation Settings] を選択します。

  • [Base(1X) Playback Speed] に「3153600」と入力します。これは、10 秒ごとに地球が 1 回公転する速度に相当します。

  • 新しいベース再生速度を適用するために、一時停止してから再生します。次の図は、新しい速度でのアニメーションの結果を示したものです。

solar_system_animation_c.gif

モデル例を開く

太陽系全体のモデルを確認するには、MATLAB コマンド プロンプトで次のように入力します。

openExample("sm/DocGravitationalFiledExample","SupportingFile","DocGravitationalFiled.slx").

参考

| | | |

関連するトピック