GAZEBO: 簡単なプラグインプログラミング

この記事が私が担当しているロボットプログラミングⅡの講義用です。
今回はgazeboのプログラミングを初体験しましょう。
ここではgazebo単体で利用できる簡単な方法(プラグイン)を説明します。
次の手順に従って作業しましょう。

本記事はGAZEBO.orgのチュートリアルを改変しています。

1. 作業ディレクトリの作成
端末を開き、以下のコマンドを実行する($は打ち込まない)。ロボットプログラミングの演習では~/prog2ディレクトリ(フォルダ)の中にいろいろなプログラムを作っていく。

$ cd
$ mkdir prog2
$ cd prog2
$ mkdir 1hello
$ cd 1hello
$ gedit hello_world.cc

2. プラグイン用ソースコードの作成
プラグインとなるC++言語のソースコード(拡張子cc)を作成する。

以下のプログラムを「1.作業ディレクトリの作成」で開いたgedit(エディター)にコピペしてhello_world.ccを保存する。
 注:コピペするときは、下プログラムの右上にあるプリンタアイコンの左にあるView Sourceアイコンをクリックして、ソースを表示して、それをコピペすること。そうしないと、コンパイルと時のエラーになやまされることになる。

#include <gazebo/gazebo.hh> // gazebo用のヘッダーファイル
namespace gazebo
{
  class WorldPluginTutorial : public WorldPlugin
  {
    public: WorldPluginTutorial() : WorldPlugin()
    {
      printf("Hello World!\n"); // ユーザがプログラムするのはこの行だけ
    }

    public: void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
    {
       //今回はSDF(Simulation Description Format)ファイル
       // を読み込まないでここは空
    }
  };
  GZ_REGISTER_WORLD_PLUGIN(WorldPluginTutorial); // プラグインの登録
}

コピペしたらgeditの「保存」ボタンをクリックして~/prog2/1hello/の中に保存し、geditメニューバーの「ファイル(F)」→「終了(Q)」でgeditを終了する。
gedit_hozon
3. ワールドファイルの作成
シミュレーションの世界を設定するワールドファイル(拡張子はworld)を作成する。先程、geditを保存したディレクトリ(~/prog2/1hello/)で、次のコマンドを端末で実行する。

$ gedit hello.world

geditのウインドウが新たに開くので、以下のソースコード(2番の注参照)をコピペ、保存し、geditを終了する。4行目のlibhello_world.soはhello_world.ccをコンパイルすると自動的に生成される。

<?xml version="1.0"?>
<sdf version="1.4">
  <world name="default">
    <plugin name="hello_world" filename="./build/libhello_world.so"/>
  </world>
</sdf>

4. コンパイル設定ファイルの作成
gazeboではソースコードをコンパイル(ビルド)するのにcmakeというシステムを使う。
先程から使っている端末で以下のコマンドを実行しgeditを起動する。

$ gedit CMakeLists.txt

CMakeLists.txtはcmakeの設定ファイル。次のソースコード(2番の注参照)をgeditにコピペし、CMakeLists.txtを保存する。保存場所は2番、3番と同じ~/prog2/1helloディレクトリ。保存したらgeditを終了する。

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

find_package(Boost REQUIRED COMPONENTS system)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

include (FindPkgConfig)
if (PKG_CONFIG_FOUND)
  pkg_check_modules(GAZEBO gazebo)
endif()
include_directories(${GAZEBO_INCLUDE_DIRS})
link_directories(${GAZEBO_LIBRARY_DIRS})

add_library(hello_world SHARED hello_world.cc)
target_link_libraries(hello_world ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES})

5.コンパイル
以下のコマンドを実行し、ソースコードをメイクする。

$ cd ~/prog2/1hello
$ mkdir build
$ cd build
$ cmake ../
$ make

cmakeのコマンドがないと怒られたら、以下のコマンドを実行し、再度、上のコマンドを実行する。

$ sudo apt-get install cmake

では、実行しよう!以下のコマンドを実行し、端末にhello world!と表示されれば成功。

$ cd ~/prog2/1hello
$ gzserver hello.world --verbose

hello

終わり

おまけ:上の方法でうまく行かない場合は、1hello.tgzを~/prog2にダウンロードし、次のコマンドで解凍し、上の説明に戻って実行しよう。

$ cd ~/prog2
$ tar xvzf 1hello.tgz


Exercise

1. 上の手順と同様にして"I Love KIT"と表示するプログラムを作ろう(標準出力の復習)。
<ヒント> まず、~/prog2/ex1-kitというフォルダを作り、その中で作業しなさい。
kit.cc、kit.world、CMakeLists.txtの3個のファイルを作成する。

2. 上の手順と同様にして以下の星印を表示しよう(for文の復習)。
<ヒント> まず、~/prog2/ex1-starというフォルダを作り、その中で作業しなさい。
star.cc、star.world、CMakeLists.txtの3個のファイルを作成する。
star

3. 上の手順と同様にして、キーボードから1~3が入力されたらWinter、4~6ならSpring、7~9ならSummer、10~12ならFallと表示するプログラムをif文を使い実装しよう(標準入力、if文の復習)。

4.  上の手順と同様にして、3番目の問題をswitch文で実装しよう(switch文の復習)。

5. 上の手順と同様にして、3次元ベクトルa(0.1, 0.2, 0.3)とb(0.3, 0.2, 0.1)の内積を計算するプログラムを実装しよう(配列の復習)。

以上

コメントを残す

メールアドレスが公開されることはありません。