Simulink と Gazebo 間のコシミュレーションの実行
この例では、Simulink™ と Gazebo の間で同期されたシミュレーションを設定し、Gazebo にコマンドを送信し Gazebo からデータを受信する方法を説明します。
Gazebo シミュレーション環境の設定
この例では、Gazebo を含む独自の Linux 環境を使用するか、提供されている "ROS および Gazebo を含むバーチャル マシン" をダウンロードします。このバーチャル マシン (VM) の /home/user/src/GazeboPlugin.
に、必要な Gazebo プラグインがあります。
Linux VM および Gazebo を使用した独自の Linux 環境を設定するための要件の詳細については、Gazebo シミュレーション環境の要件および制限を参照してください。
VM 設定で、[Accelerate 3D graphics] を無効にします。VM 設定で、[VM]、[Settings]、[Hardware]、[Display] に移動し、[Accelerate 3D graphics] を無効にします。
独自の 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 はモデルが再開されるまで前のステップ時間に留まります。