このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

Gazebo での力とトルクの適用

この例では、Gazebo® シミュレーターでモデルに力とトルクを適用するさまざまな方法を説明します。まず、説明のためにドアを使用して、3 つの異なる方法でトルクの適用を調べます。次に、2 つの TurtleBot® Create モデルで複合モデルの力の適用を示します。最後に、基本的なボールを使用してオブジェクトのプロパティ (この場合は跳ね返り) を調べます。

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

Gazebo への接続

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

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

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

動くドアの追加

この節では、ジョイントにトルクを適用する 3 つの異なる方法を示します。ここではドアを使用します。

ドアのモデルを作成し、シミュレーターに 3 つのインスタンスを発生させます。発生させる位置と向き (単位はメートルとラジアン) を指定します。

 doormodel = ExampleHelperGazeboModel('hinged_door','gazeboDB');
 door1 = spawnModel(gazebo,doormodel,[-1.5 2.0 0]);
 door2 = spawnModel(gazebo,doormodel,[-1.5 0.5 0],[0 0 pi]);
 door3 = spawnModel(gazebo,doormodel,[-1.5 -2.5 0]);

Gazebo の単位はすべて、SI 単位系を使用して指定します。ドアを追加すると、ワールドは次のイメージのようになります。

メモ: Gazebo シミュレーションをアイドルのままにしておくと、可動アイテムは多くの場合浮動します。コマンドなしでドアがゆっくり動いている場合、この動作は正常です。これが起きる理由は、多くの場合、Gazebo シミュレーターの理想的な設定より現実世界での方が摩擦が大きいためです。

最初のドアのリンクとジョイントのハンドルを取得して表示します。

 [links, joints] = getComponents(door1)
links = 3×1 cell array
    {'hinged_door::frame'  }
    {'hinged_door::door'   }
    {'hinged_door::handles'}

joints = 3×1 cell array
    {'hinged_door::handle'     }
    {'hinged_door::hinge'      }
    {'hinged_door::world_joint'}

最初のドアでは、hinge ジョイントに直接トルクを適用します。

jointTorque を使用して最初のドアにトルクを適用します。これによりドアが開き、シミュレーション中は開いたままになります。最初の 2 行は、トルク適用の停止時間と大きさのパラメーターを定義します。cell 配列 joints の 2 番目の要素は hinged_door::hinge です。これを jointTorque の呼び出しで使用します。

 stopTime = 5; % Seconds 
 effort = 3.0; % Newton-meters
 jointTorque(door1, joints{2}, stopTime, effort);

2 番目の方法では、ヒンジ ジョイントの代わりにドア リンクにトルクを適用します。この方法は、トルクをリンク (この場合はドア) の重心に適用し回転軸周りには適用しないため、あまりクリーンではありません。それでも、この方法でドアを動かすトルクが発生します。

関数 applyForce を使用します。links の 2 番目の要素は 'hinged_door::door' です。これを applyForce の呼び出しで使用します。

 forceVector = [0 0 0];     % Newtons
 torqueVector = [0 0 3];    % Newton-meters
 applyForce(door2, links{2}, stopTime, forceVector, torqueVector);

ドアを動かすために、ドアの重心に (トルクではなく) 力を直接適用できます。コマンドは次のとおりです。

 forceVector = [0 -2 0];     % Newtons
 applyForce(door2, links{2}, stopTime, forceVector);

メモ: 力は、オブジェクトの座標系ではなく、常にワールド座標系から適用されます。この力を適用すると、それは負の y 方向に連続的に作用します。これは、ドアに対する一定のトルクにはなりません。

3 番目のドアでは、力やトルクを適用せずにヒンジ角度を手動で定義します。

while ループを使用して、ドアのスイング動作を作成します。ExampleHelperGazeboSpawnedModel クラスの関数 setConfig を使用します。

angdelta = 0.1;    % Radians
 dt = 0;            % Seconds
 angle = 0;         % Radians
 tic
 while (toc < stopTime)

     if angle > 1.5 || angle < 0     % In radians
         angdelta = -angdelta;        
     end
    
     angle = angle+angdelta;        
     setConfig(door3,joints{2},angle); 
     pause(dt);
 end

操作する TurtleBot オブジェクトの作成

この節では、TurtleBot Create の作成と外部操作を説明します。より複雑なオブジェクトのシンプルな制御を示します。

データベース (GazeboDB) から GazeboModel を追加して、ワールドに TurtleBot をもう 1 台作成します。発生するロボットは TurtleBot Create であり、Kobuki ではありません。その右車輪に外部トルクを適用します。

メモ: Create の発生にはインターネット接続が必要です。

 botmodel = ExampleHelperGazeboModel('turtlebot','gazeboDB');
 bot = spawnModel(gazebo,botmodel,[1,0,0]);

TurtleBot は当初、角度 0 度で x 軸方向を向いて発生します。次のコマンドを使用して、向きを pi/2 ラジアン (90 度) に変更します。

 setState(bot,'orientation',[0 0 pi/2]);

applyForce を使用し、ExampleHelperGazeboSpawnedModel オブジェクトから外部トルクを TurtleBot Create の右車輪に適用して右車輪を動かします。

[botlinks, botjoints] = getComponents(bot)
botlinks = 5×1 cell array
    {'turtlebot::rack'               }
    {'turtlebot::create::base'       }
    {'turtlebot::create::left_wheel' }
    {'turtlebot::create::right_wheel'}
    {'turtlebot::kinect::link'       }

botjoints = 4×1 cell array
    {'turtlebot::create::left_wheel' }
    {'turtlebot::create::right_wheel'}
    {'turtlebot::create_rack'        }
    {'turtlebot::kinect_rack'        }

botjoints の 2 番目の要素は 'turtlebot::create::right_wheel' です。jointTorque の呼び出しで botjoints{2} を使用します。

turnStopTime = 1;       % Seconds
turnEffort = 0.2;       % Newton-meters
jointTorque(bot, botjoints{2}, turnStopTime, turnEffort)

車輪ではなく、TurtleBot のベースへの力の適用を試すことができます。

spawnModel を使用して 2 番目の TurtleBot Create を作成します。

 bot2 = spawnModel(gazebo,botmodel,[2,0,0]);
 [botlinks2, botjoints2] = getComponents(bot2)
botlinks2 = 5×1 cell array
    {'turtlebot::rack'               }
    {'turtlebot::create::base'       }
    {'turtlebot::create::left_wheel' }
    {'turtlebot::create::right_wheel'}
    {'turtlebot::kinect::link'       }

botjoints2 = 4×1 cell array
    {'turtlebot::create::left_wheel' }
    {'turtlebot::create::right_wheel'}
    {'turtlebot::create_rack'        }
    {'turtlebot::kinect_rack'        }

ベースに y 方向の力を適用します。ベースがほとんど動かないことを確認します。力は車輪の垂直方向に作用しています。

botlinks2 の最初の要素は 'turtlebot::create::base' です。applyForce の呼び出しで botlinks2{1} を使用します。

 applyForce(bot2,botlinks2{1},2,[0 1 0]);

x 方向に力を適用します。ロボットはより大きく動きます。

 applyForce(bot2,botlinks2{1},2,[1 0 0]);

TurtleBot のベースにトルクを適用して回転させます。

 applyForce(bot2,botlinks2{1},2,[0 0 0],[0 0 1]);

跳ねるボールの追加

この節では、2 つのボールの作成を説明し、'bounce' プロパティを表示します。

ExampleHelperGazeboModel クラスを使用して、シミュレーションに 2 つのボールを作成します。addLink を使用して、跳ね返りのパラメーターを指定します。

 bounce = 1;    % Unitless coefficient
 maxCorrectionVelocity = 10;    % Meters per second
 ballmodel = ExampleHelperGazeboModel('ball');
 addLink(ballmodel,'sphere',0.2,'color',[0.3 0.7 0.7 0.5],'bounce',[bounce maxCorrectionVelocity]);

2 つのボールを、一方をもう一方の上方に発生させて、跳ね返りを表します。

 spawnModel(gazebo,ballmodel,[0 1 2]);
 spawnModel(gazebo,ballmodel,[0 1 3]);
 
 pause(5);

ボールを追加した後、ワールドは次のようになります。

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

モデルをクリーンアップします。

 exampleHelperGazeboCleanupApplyForces;

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

clear

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

rosshutdown
Shutting down global node /matlab_global_node_16668 with NodeURI http://192.168.203.1:50907/

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

次のステップ