- The added line is THIS COLOR.
- The deleted line is THIS COLOR.
Up:[[Tutorial]] Previous:[[HMD+KINECT]]
----
#contents
*Clean Up タスクサンプル[#m4114c6c]
※このサンプルはv2.1.1以降で動作します。
ロボットがゴミをゴミ箱に捨てるサンプルを紹介します。
**サンプルコード取得 [#s25b412a]
以下をサーバ側でダウンロードします。
#ref(CleanUp_v1.tar.gz)
**コンパイル [#l257db11]
次に展開してコンパイルします。
$ tar xzvf CleanUp_v1.tar.gz
$ cd CleanUp_v1
$ make
***コンパイルに失敗する場合 [#yd4d49df]
コンパイルするには環境変数SIGVERSE_PATHにバージョンSIGVerseのバージョン2.1.1以降を設定する必要があります。
$ export SIGVERSE_PATH=/home/<username>/sigverse-<バージョン2.1.1以降>
$ export PATH=$PATH:$SIGVERSE_PATH/bin
$ bash
※注意)動作環境によっては以下のコードをコントローラの最初に追加する必要があります。
#include <unistd.h>
**実行 [#zf79c3b1]
それでは実行してみましょう。
$ sigserver.sh -w ./CleanUp.xml
ビューワーで接続するとロボットが机の前に立っていて、机の上に缶とペットボトルが置いてあります。
#ref(./CleanUp_1.PNG,60%)
シミュレーションをスタートさせるとロボットが空き缶もしくはペットボトルに手を伸ばし、それをもってゴミ箱へと運びます。
#ref(./CleanUp_3.PNG,60%)
**ゴミ認識 [#c0141f0e]
このサンプルでは缶、もしくはペットボトルをゴミと認識してゴミ箱に運びます。
ロボットのコントローラを見てみます。
$ emacs CleanUpRobot.cpp
#highlight(cpp:firstline[300]){{
bool MyController::recognizeTrash(Vector3d &pos, std::string &name)
{
/////////////////////////////////////////////
///////////ここでゴミを認識します////////////
/////////////////////////////////////////////
// 候補のゴミが無い場合
if(m_trashes.empty()){
return false;
}
// ここでは乱数を使ってゴミを決定します
int trashNum = rand() % m_trashes.size();
// ゴミの名前と位置を取得します
name = m_trashes[trashNum];
SimObj *trash = getObj(name.c_str());
// ゴミの位置取得
trash->getPosition(pos);
return true;
}
}}
#highlight(end)
300行目あたりにrecognizeTrashという関数がありここでゴミを認識します。
このサンプルではゴミの名前が既に分かっていて、乱数でゴミを決定し、直接ゴミの位置を取得しています。
画像処理や距離センサなどでゴミを認識する場合はここにコードを追加していきます。