九州工業大学 CIR-KIT Blog

九工大自律移動ロボット製作プロジェクトCIR-KITの技術系ブログ

No.6-9:GazeboをROSに繋ぐ (ROS Plugin 編)

gazebo_logo

検証日時

03/04/2015 (Wed)

概要

Gazeboのチュートリアル第六弾「Connect to ROS」。 ROSはロボットの制御フレームワークです。このチュートリアルでは、GazeboとROSのインターフェースについて説明します。 今回はその「ROS Plugin」編です。 公式サイトを適当に翻訳しただけですので、あしからず。

レベル

INTERMEDIATE

環境
PC : Lenovo ThinkPad X240
Prosessor : Intel Core i7-4600U (2.10GHz, 4MB, 1600MHz)
RAM : PC3-12800 DDR3L (8GB)
OS : Ubuntu 14.04 LTS 64bit
Kernel : 3.13.0-44-generic
Gazebo : Version 5.0.1
参考

GAZEBO Tutorial-Connect to ROS

チュートリアル : ROSプラグイン

このチュートリアルでは、とても基本的なROSに関するGazeboのプラグインを作ってゆきます。

ROSパッケージを作る

あなたのcatkinワークスペースに新しいROSパッケージを作成してください。:

1
2
cd ~/catkin_ws
catkin_create-pkg gazebo_tutorials gazebo_ros roscpp

プラグインを作る

ここで説明したような簡単なプラグインを制作し、gazebotutorials/src/simpleworld_plugin.cppとして保存してください。:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <gazebo/common/Plugin.hh>
#include <ros/ros.h>

namespace gazebo
{
class WorldPluginTutorial : public WorldPlugin
{
public:
  WorldPluginTutorial() : WorldPlugin()
  {
  }

  void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
  {
    // Make sure the ROS node for Gazebo has already been initialized                                                                                    
    if (!ros::isInitialized())
    {
      ROS_FATAL_STREAM("A ROS node for Gazebo has not been initialized, unable to load plugin. "
        << "Load the Gazebo system plugin 'libgazebo_ros_api_plugin.so' in the gazebo_ros package)");
      return;
    }

    ROS_INFO("Hello World!");
  }

};
GZ_REGISTER_WORLD_PLUGIN(WorldPluginTutorial)
}

CMakeLists.txtをアップデートする

gazebo_tutorials/CMakeLists.txtを開き、以下のようにしてください。:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cmake_minimum_required(VERSION 2.8.3)
project(gazebo_tutorials)

# Load catkin and all dependencies required for this package
find_package(catkin REQUIRED COMPONENTS
  roscpp
  gazebo_ros
)

# Depend on system install of Gazebo
find_package(gazebo REQUIRED)

link_directories(${GAZEBO_LIBRARY_DIRS})
include_directories(${Boost_INCLUDE_DIR} ${catkin_INCLUDE_DIRS} ${GAZEBO_INCLUDE_DIRS})

add_library(${PROJECT_NAME} src/simple_world_plugin.cpp)
target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES} ${GAZEBO_LIBRARIES})

catkin_package(
  DEPENDS
    roscpp
    gazebo_ros
)

package.xmlをアップデートする

以下の行をタグの中に追加し(タグがなければ、タグも追加)、gazebo_tutorials/package.xmlをアップデートしてください。

1
  <gazebo_ros plugin_path="${prefix}/lib" gazebo_media_path="${prefix}" />

プラグインをコンパイルする

catkinをあなたのワークスペースで実行して、プラグインをビルドしてください。

1
2
cd ~/catkin_ws
catkin_make

Worldファイルを作る

以下のファイルをgazebo_tutorials/worlds/hello.Worldとして保存してください。:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" ?>
<sdf version="1.4">
  <world name="default">
    <include>
      <uri>model://ground_plane</uri>
    </include>

    <include>
      <uri>model://sun</uri>
    </include>

    <!-- reference to your plugin -->
    <plugin name="gazebo_tutorials" filename="libgazebo_tutorials.so"/>
  </world>
</sdf>

Launchファイルを作る

以下のファイルをgazebo_tutorials/launch/hello.launchとして作成してください。:

1
2
3
4
5
6
7
<launch>
  <!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find gazebo_tutorials)/worlds/hello.world"/>
    <!-- more default parameters can be changed here -->
  </include>
</launch>

プラグインを実行する

1
roslaunch gazebo_tutorials hello.launch

空のGazeboが開き、ターミナルには以下のような文字列が表示されるはずです。:

1
 INFO ros.gazebo_tutorials: Hello World!

テンプレートから始める

GazeboとROSのプラグインについて手っ取り早く理解するには、テンプレートが有効です。:

gazeborostemplate.cpp

機能性を追加する

GazeboとROSで有用な効果を果たすプラグインを作るために、プラグインについてのチュートリアルを読むことをおすすめします。

ROSのノードの注意点

もし、ROSノードがLoad()関数によって初期化されているなら、すべてのgazebo-rosプラグインは、チェックするべきです。これについては、issuesでも議論されています。ROSノードの初期化は、実行した時に自動的に初期化されます。

1
rosrun gazeboros gazebo

もしくは、empty.worldのlaunchファイルを使用してください。
gazeboros/src/gazeborosapi_plugin.cppros::init()をコールするGazeboの中にのみあるべきです。

次のステップ

様々な、Gazebo-ROS間の仕組みについては、発展的なROSの統合をご覧ください。