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

Gazebo からのモデルおよびシミュレーションの特性の読み取り

この例では、MATLAB® から Gazebo® シミュレーターを操作する方法を説明します。Gazebo のシミュレーションを一時停止し、物理特性を読み取り、Gazebo ワールドのオブジェクトに関する情報を取得する方法を示します。

必要条件: Gazebo およびシミュレートされた TurtleBot の入門

Gazebo ワールドへの接続

仮想マシンまたは Linux® マシン上のデスクトップから Gazebo ワールドを開きます。Gazebo およびシミュレートされた TurtleBot の入門の Ubuntu® 仮想マシンを使用している場合は、Gazebo Empty または Gazebo Playground を使用します。

ホスト コンピューター上の MATLAB インスタンスで、ipaddress を仮想マシンの IP アドレスに置き換えて、次のコマンドを実行します。このコマンドは、ROS を初期化し、指定した IP アドレスの ROS マスターに MATLAB インスタンスを接続します。

ipaddress = '192.168.203.129'; % Replace with your IP
rosinit(ipaddress)
Initializing global node /matlab_global_node_41902 with NodeURI http://192.168.203.1:56855/

メモ: シミュレーションへの接続に使用するネットワークが既定のネットワークではない場合は、IP アドレスを手動で指定できます。構文は以下のようになります。IP_OF_VM はシミュレーションの IP アドレスに、IP_OF_HOST_COMPUTER はホストの IP アドレスに置き換えます。

rosinit('IP_OF_VM','NodeHost','IP_OF_HOST_COMPUTER');

ROS ネットワーク上の使用可能なすべての ROS トピックを表示します。

rostopic list
/camera/depth/camera_info                                   
/camera/depth/image_raw                                     
/camera/depth/points                                        
/camera/parameter_descriptions                              
/camera/parameter_updates                                   
/camera/rgb/camera_info                                     
/camera/rgb/image_raw                                       
/camera/rgb/image_raw/compressed                            
/camera/rgb/image_raw/compressed/parameter_descriptions     
/camera/rgb/image_raw/compressed/parameter_updates          
/camera/rgb/image_raw/compressedDepth                       
/camera/rgb/image_raw/compressedDepth/parameter_descriptions
/camera/rgb/image_raw/compressedDepth/parameter_updates     
/camera/rgb/image_raw/theora                                
/camera/rgb/image_raw/theora/parameter_descriptions         
/camera/rgb/image_raw/theora/parameter_updates              
/clock                                                      
/cmd_vel_mux/active                                         
/cmd_vel_mux/input/navi                                     
/cmd_vel_mux/input/safety_controller                        
/cmd_vel_mux/input/teleop                                   
/cmd_vel_mux/parameter_descriptions                         
/cmd_vel_mux/parameter_updates                              
/depthimage_to_laserscan/parameter_descriptions             
/depthimage_to_laserscan/parameter_updates                  
/gazebo/link_states                                         
/gazebo/model_states                                        
/gazebo/parameter_descriptions                              
/gazebo/parameter_updates                                   
/gazebo/set_link_state                                      
/gazebo/set_model_state                                     
/joint_states                                               
/laserscan_nodelet_manager/bond                             
/mobile_base/commands/motor_power                           
/mobile_base/commands/reset_odometry                        
/mobile_base/commands/velocity                              
/mobile_base/events/bumper                                  
/mobile_base/events/cliff                                   
/mobile_base/sensors/bumper_pointcloud                      
/mobile_base/sensors/core                                   
/mobile_base/sensors/imu_data                               
/mobile_base_nodelet_manager/bond                           
/odom                                                       
/rosout                                                     
/rosout_agg                                                 
/scan                                                       
/tf                                                         
/tf_static                                                  

トピックのリストが表示されない場合は、ネットワークが適切に設定されていません。ネットワークの設定手順については、Gazebo およびシミュレートされた TurtleBot の入門を参照してください。

ExampleHelperGazeboCommunicator クラスを使用して Gazebo ワールドへの接続を設定します。これにより、Gazebo の処理が簡単になります。

gazebo = ExampleHelperGazeboCommunicator;

Gazebo エンジンの物理特性の読み取り

ExampleHelperGazeboCommunicator オブジェクトを使用して、シミュレーションの物理特性を抽出します。

phys = readPhysics(gazebo)
phys = struct with fields:
                      Gravity: [0 0 -9.8000]
                   UpdateRate: 100
                     TimeStep: 0.0100
             SimulationStatus: 0
                DisableBodies: 0
    PreconditioningIterations: 0
              InnerIterations: 50
                   Relaxation: 1.3000
            ErrorToleranceRMS: 0
                 ContactWidth: 1.0000e-03
        MaxCorrectingVelocity: 100
          ConstantForceMixing: 0
      ErrorReductionParameter: 0.2000
                  MaxContacts: 20

Gazebo は SI 単位を使用します。

確認するには、z の進行方向が逆になるようにシミュレーションの重力を変更します。値も小さくします。物理特性がすべてのオブジェクトに影響するようにシミュレーションをリセットします。

phys.Gravity = [0 0 0.1];       % Units are m/s^2
setPhysics(gazebo,phys);
resetSim(gazebo);

pause(5);                        % Let gravity take effect for 5 seconds

シミュレーションの一時停止、一時停止解除および再開

TurtleBot® (およびワールド内のすべてのもの) が、ゆっくりと上に加速して地面から離れて行くのを確認できます。ExampleHelperGazeboCommunicator を使用してシミュレーションを一時停止します。

pauseSim(gazebo);
pause(3);

一時停止すると、シーンは次の図のように表示されます。

シミュレーションを再開します。オブジェクトは再度上方向に動き始めます。

resumeSim(gazebo);
pause(3);

TurtleBot が再度浮き上がります。

関数 resetSim では、物理特性が元の値にリセットされません。setPhysics を使用して物理特性を手動でリセットしてください。

1/8 の速度でのシミュレーションの実行

この節では、Gazebo シミュレーターをスローモーションで実行する方法を説明します。スローモーションの使用は、急激な、または短時間の物理的処理および動作を注意深く調べる際に非常に便利です。

物理特性の更新頻度を変更することによって、シミュレーションの実行速度を遅くします。1/8 の速度で実行するとどうなるかを確認できます。

pauseSim(gazebo);
phys = readPhysics(gazebo);
phys.UpdateRate = phys.UpdateRate/8;
setPhysics(gazebo,phys);

重力を通常の値に戻します。

phys.Gravity = [0 0 -9.8];   % Set gravity back to normal value (m/s^2)
setPhysics(gazebo,phys);
resumeSim(gazebo);
pause(5);

シミュレーションを再開すると、TurtleBot はスローモーションで地面に戻ります。

更新頻度を通常に戻して、シミュレーションがリアルタイムで実行されるようにします。

phys.UpdateRate = phys.UpdateRate*8;   % Set update rate back to normal value
setPhysics(gazebo,phys);
pause(3);

シミュレーションをリセットします。

resetSim(gazebo);

Gazebo ワールド内のモデル リストの取得

ExampleHelperGazeboCommunicator クラスを使用すると、ワールド内のすべてのモデルを見つけることができます。

models = getSpawnedModels(gazebo)
models = 2×1 cell array
    {'ground_plane'}
    {'mobile_base' }

モデルからのリンクの取得

ExampleHelperGazeboSpawnedModel クラスを使用してオブジェクトを作成することにより、モデル (この例では Kobuki® TurtleBot®) に関する具体的な情報を取得します。

kobuki = ExampleHelperGazeboSpawnedModel('mobile_base',gazebo)
kobuki = 
  ExampleHelperGazeboSpawnedModel with properties:

      Name: 'mobile_base'
     Links: {3×1 cell}
    Joints: {2×1 cell}

[kobukiLinks, kobukiJoints] = getComponents(kobuki)
kobukiLinks = 3×1 cell array
    {'base_footprint'  }
    {'wheel_left_link' }
    {'wheel_right_link'}

kobukiJoints = 2×1 cell array
    {'wheel_left_joint' }
    {'wheel_right_joint'}

モデルのプロパティの読み取り - 姿勢と向き

TurtleBot の ExampleHelperGazeboSpawnedModel オブジェクトを使用し、関数 getState を使用して位置、向きおよび速度を取得します。

[position, orientation, velocity] = getState(kobuki)
position = 1×3

   -0.0005    0.0001   -0.0011

orientation = 1×3

   -0.2551   -0.4581    0.0049

velocity = struct with fields:
     Linear: [0.0011 6.9205e-05 -1.3551e-05]
    Angular: [8.9766e-04 1.6358e-04 0.0025]

Gazebo オンライン モデル データベースからすべてのモデルのリストを取得

関数 exampleHelperGazeboListModels を使用して、Gazebo Web サイトからダウンロード可能なすべての Gazebo モデルを取得します。

builtInModels = exampleHelperGazeboListModels;

シャットダウン

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

clear

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

rosshutdown
Shutting down global node /matlab_global_node_41902 with NodeURI http://192.168.203.1:56855/

次のステップ