[[Tutorial]]
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

**実行 [#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という関数がありここでゴミを認識します。
このサンプルではゴミの名前が既に分かっていて、乱数でゴミを決定し、直接ゴミの位置を取得しています。
画像処理や距離センサなどでゴミを認識する場合はここにコードを追加していきます。


Front page   New List of pages Search Recent changes   Help   RSS of recent changes