Simulink と Gazebo 間のコシミュレーションの実行
この例では、Simulink™ と Gazebo の間で同期されたシミュレーションを設定し、Gazebo にコマンドを送信し Gazebo からデータを受信する方法を説明します。
Gazebo シミュレーション環境の設定
この例では、Gazebo を含む独自の Linux 環境を使用するか、提供されている "ROS および Gazebo を含むバーチャル マシン" をダウンロードします。このバーチャル マシン (VM) の /home/user/src/GazeboPlugin.
に、必要な Gazebo プラグインがあります。
Linux VM および Gazebo を使用した独自の Linux 環境を設定するための要件の詳細については、Gazebo シミュレーション環境の要件および制限を参照してください。
独自の Linux 環境を使用する場合は、Gazebo プラグインの手動インストールの手順に従ってください。それ以外の場合は、Gazebo シミュレーション環境の起動を参照してください。
Gazebo プラグインの手動インストール
プラグインのソース コードを zip パッケージとして取得します。次の関数は、GazeboPlugin
というフォルダーを現在の作業ディレクトリに作成して GazeboPlugin.zip
に圧縮します。
packageGazeboPlugin
GazeboPlugin.zip
を、次の要件を満たす Linux マシンにコピーします。
パッケージを Linux プラットフォーム上で解凍します。この例では /home/user/src/GazeboPlugin
に展開します。
ターミナルで次のコマンドを実行して、プラグインをコンパイルします。
cd /home/user/src/GazeboPlugin
build
フォルダーが既に存在する場合は、削除します。
rm -r build
プラグインをインストールします。
mkdir build cd build cmake .. make
プラグインの場所は /home/user/src/GazeboPlugin/export/lib/libGazeboCoSimPlugin.so
です。
生成されたプラグインをホスト コンピューターから削除します。
if exist('GazeboPlugin', 'dir') rmdir('GazeboPlugin', 's'); end if exist('GazeboPlugin.zip', 'file') delete('GazeboPlugin.zip'); end
Gazebo シミュレーション環境の起動
VM または独自の Linux オペレーティング システムでターミナルを開き、次のコマンドを実行して Gazebo シミュレーターを起動します。
cd /home/user/src/GazeboPlugin/export export SVGA_VGPU10=0 gazebo ../world/multiSensorPluginTest.world --verbose
これらのコマンドは、次をもつ Gazebo シミュレーターを起動します。
2 台のレーザー距離計:
hokuyo0
、hokuyo1
2 台の RGB カメラ:
camera0
、camera1
2 台の深度カメラ:
depth_camera0
、depth_camera1
2 台の IMU センサー:
imu0
、imu1
ユニット ボックス モデル:
unit_box
multiSensorPluginTest.world
は /home/user/src/GazeboPlugin/world
フォルダーにあります。このワールド ファイルは、.xml
本文の次の行により、Simulink とのコシミュレーション用 Gazebo プラグインを含めています。
<plugin name="GazeboPlugin" filename="lib/libGazeboCoSimPlugin.so"><portNumber>14581</portNumber></plugin>
filename フィールドは、コンパイルされた Gazebo プラグインの場所をポイントしていなければなりません。このパスは、Gazebo 自体が起動される場所に対する相対パスにするか、次を実行して Gazebo プラグインの検索パスに追加することができます。
export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:/home/user/src/GazeboPlugin/export
Gazebo コシミュレーションの構成
performCoSimulationWithGazebo
モデルを開きます。これは、これらのシミュレートされたセンサーからセンサー データを受信する方法と、Simulink からユニット ボックス モデルを作動させる方法を示します。
open_system("performCoSimulationWithGazebo")
モデルのシミュレーションを行う前に、Gazebo Pacer ブロックを使用して Gazebo コシミュレーションを構成します。
hilite_system('performCoSimulationWithGazebo/Gazebo Pacer')
ブロックを開いて [Gazebo のネットワークおよびシミュレーション設定の構成] リンクをクリックします。
open_system('performCoSimulationWithGazebo/Gazebo Pacer')
[ネットワーク アドレス] ドロップ ダウンから Custom
を選択します。Linux マシンの IP アドレスを入力します。Gazebo の既定の [ポート] は 14581
です。[応答タイムアウト] を 10 秒に設定します。
[テスト] ボタンをクリックして、実行中の Gazebo シミュレーターへの接続をテストします。
センサー データの取得
Gazebo Read ブロックを使用して、3 つのセンサーから特定のトピックに関するデータを取得します。
IMU:
/gazebo/default/imu0/link/imu/imu
LIDAR スキャン:
/gazebo/default/hokuyo0/link/laser/scan
RGB カメラ:
/gazebo/default/camera0/link/camera/image
MATLAB® Function ブロックを使用して、IMU の読み取り値を表示し、LIDAR スキャンと RGB イメージを可視化します。
Gazebo モデルの作動
Gazebo Apply Command ブロックを使用して、ユニット ボックスに、その加速度が 1 になる z 方向の一定の力を加えます。Gazebo Blank Message を使用して、空白の ApplyLinkWrench
メッセージを作成します。Bus Assignment ブロックを使用して、unit_box/link
エンティティに力を加えるためのメッセージの要素を指定します。Gazebo Read を使用して、ボックスのグラウンド トゥルース姿勢を出力します。1 秒間でのボックスの変位は 0.5 m 近くになるはずです。
コシミュレーションの実行
コシミュレーションを開始するには、[実行] をクリックします。[ステップを進める] を使用して、シミュレーションをステップ実行することもできます。コシミュレーションの実行中に [ステップを戻す] はサポートされません。
シミュレーションの実行中、Gazebo シミュレーターと Simulink の時間が同期していることがわかります。
このモデルは、MATLAB Function ブロックと MATLAB のプロット機能を使用して、Gazebo のセンサー データを可視化します。以下に Gazebo カメラから取得したイメージ データのスナップショットを示します。
以下に LIDAR スキャン イメージのスナップショットを示します。
ユニット ボックス ブロックの z 方向の位置の時間プロットは、データ インスペクターを使用して表示できます。このブロックの変位は、その期間の一定加速により放物線の形状を示します。
シミュレーション終了時におけるユニット ボックスの位置は 1.001 であるため、変位は 0.5001 となり、予測値の 0.5 とわずかに異なります。これは Gazebo の物理エンジンの誤差によるものです。この誤差を小さくするには、Gazebo 物理エンジンの最大ステップ サイズを小さくします。
時間の同期
コシミュレーション中、[一時停止] を使用して Simulink と Gazebo シミュレーターをいつでも一時停止できます。
メモ: Gazebo はシミュレーションの 1 タイム ステップ前で一時停止します。
これは次のコシミュレーションの時間シーケンスによるものです。
センサー データと作動コマンドは、正しいタイム ステップで交換されます。実行では、まず Gazebo、次に Simulink の順序でステップするように選択されます。シミュレーションの実行はまだ t+1 にあり、Simulink はモデルが再開されるまで前のステップ時間に留まります。