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