Simulink と Gazebo 間のコシミュレーションの実行

この例では、Simulink と Gazebo の間で同期されたシミュレーションを設定する方法と、Gazebo からデータを受信して Gazebo にコマンドを送信する方法を説明します。

Gazebo シミュレーション環境の設定

この例では、Gazebo を含む独自の Linux 環境を使用するか、ROS 2 Melodic および Gazebo を含む仮想マシンをダウンロードします。この仮想マシン (VM) の /home/user/src/GazeboPlugin. に、必要な Gazebo プラグインがあります。

ソフトウェア要件は次のとおりです (VM に含まれる)。

オペレーティング システム: Ubuntu Xenial Xerus または Ubuntu Bionic Beaver

依存するソフトウェア: cmake 2.8、gazebo9 および libgazebo9-dev

独自の Linux 環境を使用する場合は、「Gazebo プラグインの手動インストール」の手順に従ってください。

Gazebo プラグインの手動インストール

プラグインのソース コードを zip パッケージとして取得します。次の関数は、GazeboPlugin というフォルダーを現在の作業ディレクトリに作成して GazeboPlugin.zip に圧縮します。

packageGazeboPlugin

GazeboPlugin.zip を、次の要件を満たす Linux マシンにコピーします。

パッケージを Linux プラットフォーム上で解凍します。この例では /home/user/src/GazeboPlugin に展開します。

ターミナルで次のコマンドを実行して、プラグインを /home/user/src/GazeboPlugin/export/lib/libGazeboCoSimPlugin.so にコンパイルします。

cd /home/user/src/GazeboPlugin
mkdir build
cd build
cmake ..
make

生成されたプラグインをホスト コンピューターから削除します。

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 台のレーザー距離計: hokuyo0hokuyo1

  • 2 台の RGB カメラ: camera0camera1

  • 2 台の深度カメラ: depth_camera0 depth_camera1

  • 2 台の IMU センサー: imu0imu1

  • ユニット ボックス モデル: 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 m/s2 になる 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 はモデルが再開されるまで前のステップ時間に留まります。

次のステップ