Tutorial?

車輪移動ロボット

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

※バージョン111026以降で正常に動作

車両モデル

ここではデフォルトで用意されている車輪移動ロボットのモデル(OpenHRP形式)を用います。

syaryou1.jpg

      上から見た車輪移動ロボット

 
syaryou2.jpg

      ひっくり返した車輪移動ロボット

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

車体や車輪の質量、サイズ、色等はすべて形状ファイルで設定されています。

形状ファイルはこちら(※ダウンロードする必要はありません)

filewheel_robot.x3d

コントローラ作成

まずは車輪移動ロボットを操作するコントローラを作成します。

$ cd ~/sigverse-<version>/bin/NewWorld
$ emacs wheelController.cpp

wheelController.cpp

#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);

private:
  double maxForce;
}; 

void DumbelController::onInit(InitEvent &evt) {
  maxForce = 300.0;
}

double DumbelController::onAction(ActionEvent &evt) {
  return 1.0;
}

//メッセージ受信時に呼び出される関数
void DumbelController::onRecvMessage(RecvMessageEvent &evt)
{
  int n = evt.getSize();
  if (n>0)
    {
      //メッセージを取得します。
      std::string msg = evt.getString(0); 

      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());
       
          //速度を設定します。
          my->setJointVelocity("JOINT_LWHEEL", lvel, maxForce);
          my->setJointVelocity("JOINT_RWHEEL", rvel, maxForce);
        }
    }
}

extern "C" Controller * createController() {
  return new DumbelController;
}

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

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

世界ファイル

次に世界ファイルを作成します。

$ cd ..
$ emacs xml/wheelWorld.xml

wheelWorld.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"/>
   <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"/>
 </instanciate>

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

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

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

   <set-attr-value name="x" value="0.0"/>
   <set-attr-value name="y" value="25.0"/>
   <set-attr-value name="z" value="200.0"/>
 </instanciate>
</world>

この世界ファイルでは車輪移動ロボット"WheelRobot.xml"を指定しています。 カメラはロボットの車体"LINK_CENTER"に設置しました。 車輪移動ロボット以外にも障害物としてペットボトルを置きました。

実行

それでは実行してみましょう。

$ ./sigserver.sh -p 9001 -w xml/wheelWorld.xml

ビューワーで接続して見てみると車輪移動ロボットの前方にペットボトルが置かれています。

syaryou3.jpg

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

syaryou4.jpg

障害物に衝突しないよういろいろと移動してみてください。

車輪の特性など細かい設定を行いたい場合はこちらを参考にしてください。


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