Main Content

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

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

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

この例では、Gazebo を含む独自の Linux 環境を使用するか、提供されている "ROS および Gazebo を含むバーチャル マシン" をダウンロードします。このバーチャル マシン (VM) の /home/user/src/GazeboPlugin. に、必要な Gazebo プラグインがあります。

Linux VM および Gazebo を使用した独自の Linux 環境を設定するための要件の詳細については、Gazebo Simulation Environment Requirements and Limitationsを参照してください。

独自の 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 台のレーザー距離計: 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 はモデルが再開されるまで前のステップ時間に留まります。

次のステップ