この記事が私が担当しているロボットプログラミングⅡの講義用です。
今回は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を終了する。
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
終わり
おまけ:上の方法でうまく行かない場合は、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個のファイルを作成する。
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)の内積を計算するプログラムを実装しよう(配列の復習)。
以上
コメント