MV-7010: Activateとの連成シミュレーション - クワッドローターの制御
本チュートリアルでは、連成シミュレーションでMotionSolveとActivateを用いてクワッドローターを制御する方法について学習します。
Activateは、多分野にまたがる動的なシステムのモデリングとシミュレーションのためのソフトウェアソリューションです。このソフトウェアは、連続時間と離散時間の両方のコンポーネントを必要とする信号処理やコントローラの設計に特に役立ちます。
連成シミュレーションでは、シミュレーション中にMotionSolveモデルとActivateモデルが相互に通信することができます。連成シミュレーションの理想的な使用例は、マルチボディダイナミクスモデルの制御システムの開発です。
クワッドローターモデルと制御
クワッドローターモデルは、2組の同じ固定ピッチのプロペラ(時計回りに2つ、反時計回りに2つ)を使用して揚力とトルクを制御するマルチローターヘリコプターです。
筐体運動の制御は、1つまたは複数のローターディスクの回転速度を変化させ、それによってそのトルク負荷および推力または揚力特性を変化させることによって達成されます。
MotionViewでは、4つのスーパーブレードを持つクワッドローターフレームを作成し、ローターの動きを追加します。風の外乱を表現するために、力のセットが使用されます。
Activateは、MotionSolveとの連成シミュレーションにより、風の影響を補うためにクワッドローターに高度と方向を与えるコントローラをインプリメントします。
演習
Quadrotor_start.mdl、rotor.h3d、shaft.h3d、superblade.h3d、Quadrotor_Control_Start.scmを<installation_directory>tutorials\mv_hv_hg\mbd_modeling\motionsolve\cosimulation\activate>から自身の作業ディレクトリ<作業ディレクトリ>にコピーします。
モデルの確認
- 新しいMotionViewセッションを開始します。
-
File Open model
を選択し、Quadrotor_start.mdlファイルを自身の作業ディレクトリから読み込みます。
- モデルを確認します。
クワッドローターモデルは、vehicleと呼ばれる1つのフレーム、4つのプロペラ、4つのローターの合わせて9つのボディを有しています。それらに関連して、それぞれのグラフィックがあります。
これら9つのボディを連結するために、ローターと車両とを連結する4つの固定ジョイントと、プロペラとローターとを連結する4つの回転ジョイントが設けられています。
プロペラの運動の指定
-
Motions
を右クリックし、Add Motion or MotionPairダイアログを表示させます。
-
LabelにProp_Left_Rotation、Variableにmot_Prop_Left_Rotationと入力し、OKをクリックします。
Figure 1. - ConnectivityタブでJointをダブルクリックします。Propeller_Leftを選択し、OKをクリックします。
-
PropertyをVelocityに変更します。
Figure 2. - 手順1-4を繰り返し、他のプロペラに運動を作成します。
Label Variable On Joint Property Prop_Right_Rotation mot_Prop_Right_Rotation Propeller_Right Velocity Prop_Front_Rotation mot_Prop_Front_Rotation Propeller_Front Velocity Prop_Rear_Rotation mot_Prop_Rear_Rotation Propeller_Rear Velocity クワッドローターでは、プロペラの速度は、車両のピッチとロールのコントローラによって定義されます。
各プロペラの運動の速度値を定義するために、連成シミュレーションでさらに使用する3つのソルバー変数を作成します。
プロペラの速度の指定
-
速度を指定する前に、まずソルバー変数を作成する必要があります。
-
ツールバーのSolverVariable
を右クリックし、Add SolverVariableダイアログを表示させます。
- LabelにThrottle_Commandと入力します。
-
Variableにsv_Throttle_Commandと入力し、OKをクリックします。
Figure 3.
Figure 4. -
a-cの手順を繰り返し、ピッチとロールのソルバー変数を作成します。
- Label
- Variable
- Roll_Command
- sv_Roll_Command
- Pitch_Command
- sv_Pitch_Command
-
ツールバーのSolverVariable
-
これでプロペラの運動速度を更新できるようになりました。
- Project BrowserでMotionsフォルダーに進み、Prop_Left_Rotationを選択します。
- Motionsパネルで、Propertiesタブに進みます。
-
Propertiesタブで、Define byをExpressionに切り替え、次のように入力します:
`VARVAL({sv_Throttle_Command.idstring})+VARVAL({sv_Roll_Command.idstring})`
-
以下のとおり、プロペラの右、フロント、リアについて上記の手順を繰り返します:
- Motion
- Expression
- Prop_Right_Rotation
-
`VARVAL({sv_Throttle_Command.idstring})-VARVAL({sv_Roll_Command.idstring})`
- Prop_Front_Rotation
-
`-VARVAL({sv_Throttle_Command.idstring}) -VARVAL({sv_Pitch_Command.idstring})`
- Prop_Rear_Rotation
-
`-VARVAL({sv_Throttle_Command.idstring})+ VARVAL({sv_Pitch_Command.idstring})`
Note: 左右にある横プロペラが車両のロールを制御し、縦プロペラがピッチを制御します。式内の符号の違いにより、クワッドローターの回転方向が決定されます。
Figure 5.
風の外乱力の追加
クワッドローターの推力と風の影響を表現するためには、力とモーメントのセットを定義する必要があります。
風の外乱は、車両中心部に付与されるX軸とY軸のトルクの組み合わせで表されます。
ここで、
= 推力
= 推力率(プロペラの形状、空気密度、およびスピン面積を考慮して定義されます。この解析の場合、Tf= 2.1998e-5)
= プロペラの角速度
-
風の外乱力を作成します。
-
Force
を右クリックし、Add Forceダイアログを表示させます。
- LabelにWind_Disturbanceと入力します。
- Variableにfrc_Wind_Disturbanceと入力し、OKをクリックします。
- Connectivityタブで、ForceをAction only、PropertyをRotationalにセットします。
-
BodyにVehicleを、PointにPivotを選択します。
Figure 6. -
Rot Propertiesタブで、TxとTyを0.5にセットします。
Figure 7.
-
Force
-
推進力を作成します。
-
Force
を右クリックし、Add Forceダイアログを表示させます。
- LabelにThrust_Leftと入力します。
- Variableにfrc_Thrust_Leftと入力し、OKをクリックします。
- Connectivityタブで、ForceをAction only、PropertyをTranslationalにセットします。
-
BodyにボディRotor_Leftを、PointにポイントLeft_Motor_Centerを、Ref MarkerにマーカーLeft_Rotorを選択します。
Figure 8. -
Trans Propertiesタブで、FzをExpressionに変更し、次の式を入力します: ` `
Figure 9. -
この手順を繰り返して、右、フロント、リアの推進力を作成します。
- Thrust Right
- Label
- Thrust_Right
- Variable
- frc_Thrust_Right
- Body
- Rotor_Right
- Point
- Right_Motor_Center
- Ref Marker
- Right_Rotor
- Fz Expression
Figure 10.- Thrust Front
- Label
- Thrust_Front
- Variable
- frc_Thrust_Front
- Body
- Rotor_Front
- Point
- Front_Motor_Center
- Ref Marker
- Front_Rotor
- Fz Expression
Figure 11.- Thrust Rear
- Label
- Thrust_Rear
- Variable
- frc_Thrust_Rear
- Body
- Rotor_Rear
- Point
- Rear_Motor_Center
- Ref Marker
- Rear_Rotor
- Fz Expression
Figure 12.
-
Force
- モデルを保存するためにSave Asをクリックし、名称Quadrotor_tutorial.mdlで保存します。
制御入力とプラント出力の作成
Co-Simulation Modeで動作するようにMBSモデルを変更するには、MotionViewモデルにソルバー配列およびソルバー変数エンティティを追加する必要があります。ソルバー変数には、個々のプラント入力および出力値が含まれます。ソルバー配列は、Activateと通信するためのプラントの入出力を定義します。
-
ソルバー変数の追加
- 個々のプラント入力ソルバー変数は、プロペラの速度の指定のプロペラの動きで既に定義されています。それらは、Throttle_Command、Roll_CommandおよびPitch_Commandです。
-
次に、高度、ロール角、ピッチ角、X位置、Y位置、X速度、Y速度である個々のプラント出力値を定義します。
-
ツールバーのSolverVariable
を右クリックし、Add SolverVariableダイアログを表示させて以下のソルバー変数を追加します:
Label Variable Expression Altitude sv_Altitude `DZ({m_Vehicle.idstring})`
Roll_Angle sv_Roll_Angle `AY({m_Vehicle.idstring})`
Pitch_Angle sv_Pitch_Angle `AX({m_Vehicle.idstring})`
PosX sv_PosX `DX({m_Vehicle.idstring})`
PosY sv_PosY `DY({m_Vehicle.idstring})`
VX sv_VX `VX({m_Vehicle.idstring})`
VY sv_VY `VY({m_Vehicle.idstring})`
Note: SolverVariable PropertiesタブのTypeを必ずExpressionに設定してください。
-
ツールバーのSolverVariable
-
Activateと通信するために、ControlInputとPlantOutputの2つのソルバー配列を作成します。
- ツールバーのSolverArrayを右クリックし、Add SolverArrayダイアログを表示させます。
- LabelにControlInputと入力します。
- Variableにsa_ControlInputと入力し、OKをクリックします。
-
Propertiesタブで、Array typeをPlant Inputに変更し、Appendに2(信号をあと2つ)と入力します。
Figure 13. -
SolverVariable 1にRoll_Command、SolverVariable 2にThrottle_Command、SolverVariable 3にPitch_Commandをこの順に選択します。
Figure 14. - ツールバーのSolverArrayを右クリックし、Add SolverArrayダイアログを表示させます。
- LabelにPlantOutputと入力します。
- Variableにsa_PlantOutputと入力し、OKをクリックします。
- Propertiesタブで、Array typeをPlant Outputに変更し、Appendを6回クリックして信号をあと6つ追加します。
- 7つのソルバー変数に、Roll_Angle、Altitude、Pitch_Angle、PosX、PosY、VX、VY変数をこの順に選択します。
- モデルを保存します。
検証のためのMotionSolveでのMBSモデルの実行
-
Run Solver
をクリックし、MotionSolve入力の名称をQuadrotor_tutorial.xmlに変更してモデルを実行します。
-
Animateをクリックしてシミュレーション結果をアニメーション表示し、モデルが意図した通りに動作することを確認してから次のステップに進みます。
Note: コントローラはまだモデルに接続されていないため、入力荷重とトルクはゼロになっています。
MotionSolveのActivateとの接続
- All Programsメニューから Activateを起動します。
- メニューバーからFile > Openを選択します。
-
Quadrotor_Control_Start .scmを開き、モデルを確認します。
このシステムには、クワッドローターの高度、Xポジション、Yポジションの3つの制御セクションがあります。XとYの位置制御はターゲットパスで定義されており、このモデルでは0.025の傾きとなっています。
Figure 15.7つのPIDによって定義されたこれら3つの制御セクションは、MBSモデルのプラント入力です。MotionViewでは、Roll_Command、Throttle_CommandおよびPitch_Commandとして定義されています。
プラント出力であるRoll_Angle、Altitude、Pitch_Angle、PosX、PosY、VX、VYはPID制御の入力となります。
例えば、X ポジションターゲットコントロールでは、プラント出力からの3つの入力(PosX、VX、ロールアングル)が表示されます。
Figure 16. -
ActivateとMotionSolveの連成シミュレーションを有効にするために、ActivateからFile > Preferences > Pathsを選択します。表示されるダイアログで、MotionSolveおよびMotionViewのライセンスパスを定義します。
Figure 17. -
Palette BrowserからPalettes > Activate > CoSimulationを選択し、現在のダイアグラムにMotionSolveブロックをドラッグ&ドロップしてブロックを接続します。
Figure 18. -
ダイアグラムでMS Plantブロックをダブルクリックします。表示されるダイアログで、以下のブロックプロパティを定義します:
-
XML or MDL input filename :ファイルセレクターをクリックして MotionView .mdlモデルまたはMotionSolve .xmlファイル(Quadrotor_tutorial.mdlまたはQuadrotor_tutorial.xml)のパスを参照します。
Note: Activateでは、MotionSolveとの連成シミュレーションのための入力として、MDLまたはXMLのいずれかを定義することができます。入力ファイル名にMDLを選択した場合、MDLは実行時にXMLに変換されるため、連成シミュレーションの開始時に遅延が発生することがあります。
- MRF output filename: 出力MRFファイル(Quadrotor_tutorial.mrf)のパスを指定します。パスの指定にはスラッシュ / を用います。
- Direct feed through: チェックボックスをクリア(デフォルト)します。オブジェクトが選択された状態でシミュレーションが実行され、代数的なループに遭遇した場合、代数的なループを解除するためにこのオプションをクリアする必要があります。
入力モデル*.mdlまたは*.xmlを読み込むと、以下のパラメータが自動的に入力されます:- Inputs Row Size: 値3は、ActivateからMotionSolveモデルに3つの信号が供給されていることを示しています。これらの信号は、変数Roll_Command、 Throttle_Command、Pitch_Commandを持つソルバー配列PlantInputに対応しています。
- Outputs Row Size: 値7は、MotionSolveモデルが1つのポートから7つの信号を発信していることを示しています。このため、信号を分離するためにDemuxブロックが追加されています。信号は、変数Roll_Angle、Altitude、Pitch_Angle、PosX、PosY、VX、VYを持つソルバー配列PlantOutputに対応しています。
Figure 19.
Activateとの連成シミュレーションを行うには、以下の2つの方法があります:- ローカル連成シミュレーション
- このケースでは、MotionSolveとActivateは同じマシン上にインストールされています。追加の設定は必要なく、“MotionSolveサーバIPアドレス”と“MotionSolveサーバポート番号”のフィールドは、上述のFig. 19に示すように、デフォルト値のままにしておくことが可能です。Activateから連成シミュレーションを開始すると、Step 4で指定したパスに基づいて、2つのソルバー間の接続が自動的に行われます。
- ActivateとMotionSolveとの間のリモート連成シミュレーション
- このケースでは、MotionSolveとActivateはネットワークを介してアクセス可能な異なるマシン上にあることが可能です。後続のセクションで、リモート連成シミュレーションがどのように行えるかを説明します。
- Machine AにはActivateが、Machine BにはMotionSolveがインストールされており、Machine AとMachine Bが異なる場合を想定しています。このようなシナリオは、MotionSolveモデルがMachine Bにインストールされており、モデルをMachine Aに移動してローカル連成シミュレーションを行うことができない場合に有用です。 Note: 連成シミュレーションを成功させるためには、Machine Aに有効なMotionViewのインストールが必要です。
- Machine A
- Machine Aでステップ4(パスの設定)を完了します。ここでのパスは、Machine Aに有効にインストールされた MotionViewを指定します。
- MSPlantブロック内で、Machine BにあるMotionSolveモデルの正確な名称(パスなし)を指定します。
- MSPlantブロック内で、“MotionViewサーバーIPアドレス”と “MotionViewサーバーポート番号”のフィールドを使用して、Machine BのIPアドレスとポート番号を指定します。
- OKをクリックします。
- Machine B
- コマンドプロンプトウィンドウ内で以下のMotionSolve環境変数を設定します。
- NUSOL_DLL_DIR: MotionSolveバイナリの場所(通常は<altair>/hwsolvers/motionsolve/bin/win64)を指します。
- PATH: NUSOL_DLL_DIRで指定したパスをシステムパスに追加します。
- RADFLEX_PATH: MotionSolveライセンスライブラリの場所(通常は<altair>/hwsolvers/common/bin/win64)を指します。
- MotionViewモデルがあるディレクトリに移動します。
- コマンドプロンプトに“msdaemon”と入力して、MotionSolveサーバーコマンド“msdaemon”を起動します。これで、MotionViewサーバーが“listening”モードで開始します。
- コマンドプロンプトウィンドウ内で以下のMotionSolve環境変数を設定します。
連成シミュレーションを行うには、このチュートリアルの残りの部分に従います。
-
XML or MDL input filename :ファイルセレクターをクリックして MotionView .mdlモデルまたはMotionSolve .xmlファイル(Quadrotor_tutorial.mdlまたはQuadrotor_tutorial.xml)のパスを参照します。
-
ブロックMuxの出力をクリック&ドラッグしてMSプラントの制御入力に接続します。同様に、MSプラントのプラント出力端をDmuxの入力端に接続します。これで必要なブロックはすべて存在し、modeling windowに接続されました。
Figure 20. -
リボンのSimulateツールグループから、Setup
ツールを選択します。Simulation ParametersダイアログのFinal Time欄に12と入力します。これで、シミュレーションが12秒間実行されます。
Figure 21.Note: Activateはこの連成シミュレーションシナリオではメインソルバー(呼び出しソルバー)であるため、Activateのシミュレーション終了時刻がMotionSolveのシミュレーション終了時刻と異なる場合、MotionSolveシミュレーション終了時刻は上記のActivateダイアログで指定された終了時刻と一致するように実行時に修正されます。 -
リボンから、Run
をクリックします。
モデル内のScopeブロックは、高度、ロール、ピッチ、X位置、Y位置、パスを示す以下のプロットを生成します。
Figure 22. 高度
Figure 23. ロール
Figure 24. ピッチ
Figure 25. X位置
Figure 26. Y位置
Figure 27. X速度
Figure 28. Y速度
Figure 29. XYパス -
HyperViewを起動してQuadrotor_tutorial.h3dファイルをアニメーション表示し、クワッドローターの挙動を確認します。
Figure 30.
Figure 31. - アプリケーションを終了する前に、作業をActivateにquadrotor_complete.scmとして保存します。