[[Tutorial]]

Up:[[Tutorial]]    Previous:[[ロボット・ダイナミクス(ヒューマノイド)]]     Next: [[距離センサ]]  

#contents

*車輪移動ロボット [#oab43195]
ここでは車輪移動ロボットを操作するサンプルを紹介します。

※このサンプルはバージョン121029, SIGViewerバージョン2.0.1以降には対応していません。
※このサンプルはバージョン2.1.0以降で動作します。

**車両モデル [#hfb27269]
ここではデフォルトで用意されている車輪移動ロボットのモデル(OpenHRP形式)を用います。
このチュートリアルでは以下の車両モデルを使用します。



#ref(syaryou1.jpg)
#ref(車輪移動ロボット(v120330 v1.4.8)/syaryou1.jpg)
      上から見た車輪移動ロボット

#br
#ref(syaryou2.jpg)
#ref(車輪移動ロボット(v120330 v1.4.8)/syaryou2.jpg)
      ひっくり返した車輪移動ロボット

車体の両サイドに車輪が2つついていて、前と後ろには球のキャスターが付いています。
左右の車輪は"JOINT_LWHEEL"と"JOINT_RWHEEL"という関節名でつながれています。この関節の角速度を設定して、車輪を回転させます。このモデルの車輪の半径は3、左の車輪の中心から右の車輪の中心までの距離は22(SIGVerseの長さの単位)です。

左右の車輪は"JOINT_LWHEEL"と"JOINT_RWHEEL"という関節名でつながれています。この関節の角速度を設定して、車輪を回転させます。このモデルの車輪の半径は7cm。車体のサイズは 20×8×25(cm)。
車体や車輪の質量、サイズ、色等はすべて形状ファイルで設定されています。

形状ファイルはこちら(※ダウンロードする必要はありません)
#ref(wheel_robot.x3d)
以下からモデルをダウンロードし、SIGVerse作業ディレクトリに置きます。
#ref(MobileBase_2.1.0.tar.gz)

 $ cd ~/MyWorld
 $ tar zxvf MobileBase_2.1.0.tar.gz



**コントローラ作成 [#y57ebc89]
まずは車輪移動ロボットを操作するコントローラを作成します。
 $ cd ~/sigverse-<version>/bin/NewWorld
 $ emacs wheelController.cpp

wheelController.cpp

#highlight(cpp){{
 #include <Controller.h>
 #include <ControllerEvent.h>
 #include <Logger.h>
#include <Controller.h>
#include <ControllerEvent.h>
#include <Logger.h>
 
 /**
  * 車両モデルのサンプル
  */
 class DumbelController : public Controller {
 public:
   void onInit(InitEvent &evt);
   double onAction(ActionEvent&);
   void onRecvMessage(RecvMessageEvent &evt);
/**
 * 車両モデルのサンプル
 */
class MobileController : public Controller {
public:
  void onInit(InitEvent &evt);
  double onAction(ActionEvent&);
  void onRecvMsg(RecvMsgEvent &evt);
 
 private:
   double maxForce;
 }; 
private:
  double maxForce;
}; 
 
 void DumbelController::onInit(InitEvent &evt) {
   maxForce = 300.0;
 }
void MobileController::onInit(InitEvent &evt) {
  maxForce = 300.0;
}
 
 double DumbelController::onAction(ActionEvent &evt) {
   return 1.0;
 }
double MobileController::onAction(ActionEvent &evt) {
  return 1.0;
}
 
 //メッセージ受信時に呼び出される関数
 void DumbelController::onRecvMessage(RecvMessageEvent &evt)
 {
   int n = evt.getSize();
   if (n>0)
     {
       //メッセージを取得します。
       std::string msg = evt.getString(0); 
//メッセージ受信時に呼び出される関数
void MobileController::onRecvMsg(RecvMsgEvent &evt)
{

      //メッセージを取得します。
      std::string msg = evt.getMsg(); 
      SimObj *my = getObj(myname());
 
       SimObj *my = getObj(myname());
      //メッセージ" "が含まれていると左右の車輪の角速度を設定します。
      if (strstr(msg.c_str(), " "))
	{
	  //メッセージを左と右の角速度に分けます.
	  std::string left_vel;
	  std::string right_vel;
	  int n = 0;
	  n = msg.find(" ");
	  left_vel = msg.substr(0,n);
	  right_vel = msg.substr(n+1);
	  double lvel = atof(left_vel.c_str());
	  double rvel = atof(right_vel.c_str());

	  LOG_MSG(("(%f, %f)", lvel, rvel)); 
	  //速度を設定します。
	  my->setJointVelocity("JOINT_LWHEEL", lvel, maxForce);
	  my->setJointVelocity("JOINT_RWHEEL", rvel, maxForce);
	}
}
 
       //メッセージ":"が含まれていると左右の車輪の角速度を設定します。
       if (strstr(msg.c_str(), ":"))
         {
           //メッセージを左と右の角速度に分けます.
           std::string left_vel;
           std::string right_vel;
           int n = 0;
           n = msg.find(":");
           left_vel = msg.substr(0,n);
           right_vel = msg.substr(n+1);
           double lvel = atof(left_vel.c_str());
           double rvel = atof(right_vel.c_str());
        
           //速度を設定します。
           my->setJointVelocity("JOINT_LWHEEL", lvel, maxForce);
           my->setJointVelocity("JOINT_RWHEEL", rvel, maxForce);
         }
     }
 }
 
 extern "C" Controller * createController() {
   return new DumbelController;
 }
extern "C" Controller * createController() {
  return new MobileController;
}

}}
これはビューワーで車輪移動ロボットを操作できるサンプルです。車輪移動ロボットは左右の車輪の角速度[rad/s]のメッセージを受け取って車輪の角速度を設定します。メッセージの送信方法は左と右の角速度を":"で区切るだけです。例えば左の車輪を角速度1.5(rad/s)、右の車輪の角速度を2(rad/s)に設定したいときは"1.5:2"というメッセージを送信します。
これはビューワーで車輪移動ロボットを操作できるサンプルです。車輪移動ロボットは左右の車輪の角速度[rad/s]のメッセージを受け取って車輪の角速度を設定します。メッセージの送信方法は左と右の角速度をスペースで区切るだけです。例えば左の車輪を角速度1.5(rad/s)、右の車輪の角速度を2(rad/s)に設定したいときは"1.5 2"というメッセージを送信します。

Makefileを修正してコンパイルします。(動作手順省略)
コンパイルします。

 $ ./sigmake.sh wheelController.cpp

**世界ファイル [#j6edad8f]
次に世界ファイルを作成します。
 $ cd ..
 $ emacs xml/wheelWorld.xml
 $ emacs wheelWorld.xml

wheelWorld.xml

#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
 <world name="myworld">
   
  <gravity x="0.0" y="-9.8" z="0.0"/>
 
  <instanciate class="WheelRobot.xml">
    <set-attr-value name="name" value="Robot1"/>

  <gravity x="0.0" y="-980.7" z="0.0"/>

  <instanciate class="mobile_base.xml">
    <set-attr-value name="name" value="mobile_base_001"/>
    <set-attr-value name="dynamics" value="true"/>
    <set-attr-value name="elnk1" value="LINK_CENTER"/>
 

    <set-attr-value name="x" value="0.0"/>
    <set-attr-value name="y" value="7.0"/>
    <set-attr-value name="z" value="0.0"/>
 

    <set-attr-value name="language" value="c++"/>
    <set-attr-value name="implementation"  value="./NewWorld/wheelController.so"/>
    <set-attr-value name="implementation"  value="./wheelController.so"/>
    <set-attr-value name="collision" value="true"/>
  </instanciate>
 

  <instanciate class="sePetBottle2LEmpty.xml">
    <set-attr-value name="name" value="petbottle_0"/>
    <set-attr-value name="dynamics" value="false"/>
 
    <set-attr-value name="dynamics" value="true"/>

    <set-attr-value name="x" value="0.0"/>
    <set-attr-value name="y" value="25.0"/>
    <set-attr-value name="y" value="16.67"/>
    <set-attr-value name="z" value="100.0"/>
    <set-attr-value name="collision" value="true"/>
  </instanciate>
 

  <instanciate class="sePetBottle2LEmpty.xml">
    <set-attr-value name="name" value="petbottle_1"/>
    <set-attr-value name="dynamics" value="false"/>
 
    <set-attr-value name="dynamics" value="true"/>

    <set-attr-value name="x" value="0.0"/>
    <set-attr-value name="y" value="25.0"/>
    <set-attr-value name="y" value="16.67"/>
    <set-attr-value name="z" value="200.0"/>
    <set-attr-value name="collision" value="true"/>
  </instanciate>
</world>
 </world>
}}
この世界ファイルでは車輪移動ロボット"WheelRobot.xml"を指定しています。
この世界ファイルでは"mobile_base.xml"を指定しています。
カメラはロボットの車体"LINK_CENTER"に設置しました。
車輪移動ロボット以外にも障害物としてペットボトルを置きました。

**実行 [#e2f1dd3c]
それでは実行してみましょう。
 $ ./sigserver.sh -p 9001 -w xml/wheelWorld.xml
 $ sigserver.sh -w ./wheelWorld.xml
ビューワーで接続して見てみると車輪移動ロボットの前方にペットボトルが置かれています。
#ref(syaryou3.jpg)

例えばビューワーからメッセージ"1:0.5"を送信してみます。
例えばビューワーからメッセージ"1 0.5"を送信してみます。
すると車両は右前方向に進み始めます。

#ref(syaryou4.jpg)
#ref(./syaryou_4.PNG,40%)

障害物に衝突しないよういろいろと移動してみてください。
バックすることもできます。

車輪の特性など細かい設定を行いたい場合は[[こちら>車輪プロパティの設定]]を参考にしてください。

#highlight(end)

*Old Version [#i2524b22]
-[[車輪移動ロボット(v120330, v1.4.8)]]
-[[車輪移動ロボット(v120330 v1.4.8)]]

Up:[[Tutorial]]    Previous:[[ロボット・ダイナミクス(ヒューマノイド)]]     Next: [[距離センサ]]  


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