最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

シミュレーションでのロボットの自律性のテスト

この例では、MATLAB® による Gazebo® シミュレーターの制御を調べます。

ロボット シミュレーターを使用するときには、シミュレーションの実行中に自律アルゴリズムをテストし、ワールド内の環境を動的に変更することが重要です。この例では、Gazebo を使用してロボットの基本的な自律性を作成する方法と、その操作方法を説明します。この例のロボットは TurtleBot® プラットフォームです。TurtleBot を使用する具体的な例については、TurtleBot との通信の例を参照してください。

この例では、timer を使用して TurtleBot の動作の自律的な側面を制御します。タイマーを使用することで、プロセスはバックグラウンドにおいて、MATLAB® コマンド ラインをブロックすることなく一定の実行間隔で実行されるようになります。ループや他のメソッドを使用して基本的な自律性を調べることはできますが、スケジュールされた実行やブロックを行わない特性により、タイマーは自律動作を実現するための最適の選択となります。

必要条件: Gazebo およびシミュレートされた TurtleBot の入門Gazebo からのモデルおよびシミュレーションの特性の読み取りGazebo でのオブジェクトの追加、作成、および削除Gazebo での力とトルクの適用

Gazebo への接続

Linux® マシンで Gazebo を起動します。Gazebo およびシミュレートされた TurtleBot の入門の仮想マシンを使用する場合は、Gazebo Empty ワールドを使用します。

サンプル IP アドレス (192.168.1.1) を仮想マシンの IP アドレスに置き換えて、ROS を初期化します。ExampleHelperGazeboCommunicator クラスのインスタンスを作成します。

ipaddress = '192.168.203.129';
rosinit(ipaddress)
Initializing global node /matlab_global_node_57640 with NodeURI http://192.168.203.1:64500/
gazebo = ExampleHelperGazeboCommunicator;

ワールドに壁を作成します。

 wall = ExampleHelperGazeboModel('grey_wall','gazeboDB');
 spawnModel(gazebo,wall,[-2 4 0]);

Gazebo の単位はすべて、SI 単位系を使用して指定します。

可動ベース用の ExampleHelperGazeboSpawnedModel オブジェクトを作成し、その向きの状態を変更します。壁にまっすぐ向くように、TurtleBot を 90 度 (pi/2 ラジアン) 回転させます。

 kobuki = ExampleHelperGazeboSpawnedModel('mobile_base',gazebo);
 setState(kobuki,'orientation',[0 0 pi/2]);

TurtleBot の障害物回避の開始

この節では、Gazebo で TurtleBot の自律動作を作成するシンプルな方法を説明します。TurtleBot の基本的な障害物回避動作を使用します。この動作では、前進して、レーザー スキャナーで検出された障害物の間近に接近するとロボットが向きを変えます。

パブリッシャーとパブリッシャー メッセージのグローバル変数を作成し、制御アルゴリズムがそれらにアクセスできるようにします。

 global robot
 global velmsg

速度のパブリッシャーと、その情報を伝達する ROS メッセージを作成します。

 robot = rospublisher('/mobile_base/commands/velocity');
 velmsg = rosmessage(robot);

レーザー スキャン トピックをサブスクライブします。

 timerHandles.sub = rossubscriber('/scan');

TurtleBot のメイン制御ループを制御するタイマーを作成します。

 t = timer('TimerFcn',{@exampleHelperGazeboAvoidanceTimer,timerHandles},'Period',0.1,'ExecutionMode','fixedSpacing');

タイマーのコールバック関数において、exampleHelperGazeboAvoidanceTimer はレーザー スキャン コールバック関数を定義し、TurtleBot が移動中にオブジェクトとの衝突を回避する基本アルゴリズムを実行します。このファイルは +gazebo ディレクトリにあります。

タイマーを開始します。

start(t);

オブジェクトの追加

TurtleBot は壁に向かって前進します。壁の間近に来ると、壁との衝突を回避するために左に向きを変えなければなりません。

メモ: TurtleBot が壁と衝突する場合、レーザー スキャンが Gazebo からパブリッシュされていない可能性があります。Gazebo セッションを再開して再試行してください。

TurtleBot が動作中でもワールドに変更を加えることができます。ワールドに新しい壁を追加します。十分早い段階で追加すると、TurtleBot をブロックして壁への衝突を回避させることができます。

 spawnModel(gazebo,wall,[-5.85 0.15 0],[0, 0, pi/2]);
 
 pause(20);     % TurtleBot avoids walls for 20 seconds

モデルの削除とシャットダウン

タイマーを止めてロボットのアルゴリズムを停止します。

stop(t)

ワールド内のすべてのオブジェクトを見つけて、手動で追加したオブジェクトを削除します。

list = getSpawnedModels(gazebo)
list = 4×1 cell array
    {'ground_plane'}
    {'mobile_base' }
    {'grey_wall'   }
    {'grey_wall_0' }

次のコマンドを使用して、2 つの壁を削除します。

removeModel(gazebo,'grey_wall');
removeModel(gazebo,'grey_wall_0');

作業が終了したら、パブリッシャー、サブスクライバー、およびその他 ROS 関連のオブジェクトをワークスペースからクリアします。

clear

ROS ネットワークでの作業が完了したら、rosshutdown を使用します。グローバル ノードをシャットダウンして Gazebo から切断します。

rosshutdown
Shutting down global node /matlab_global_node_57640 with NodeURI http://192.168.203.1:64500/

完了したら、仮想マシン上の Gazebo ウィンドウを閉じます。