水彩(仮)

NULLPointerExceptionガッ

Gazebo入門2

さて.前回は起動方法についてを書きましたが,今回はシミュレートする環境を定義するxmlファイルについて少し扱いたいと思います.

おそらく,GUIから作ったファイルを保存することになると思いますが,構成を少し見てみようという感じです.

まずはこんな感じのファイルを記述します.

f:id:syoamakase:20160603171823j:plain

中央に箱がおいてあります.ちなみにこんな感じに記述します.

<?xml version="1.0"?>
<sdf version="1.4">
  <world name="default">
    <include>
        <uri>model://ground_plane</uri>
    </include>

    <include>
        <uri>model://sun</uri>
    </include>

    <model name="box">
      <pose>0 0 0.5 0 0 0</pose>
      <link name="link">
        <collision name="collision">
          <geometry>
            <box>
              <size>1 1 1</size>
            </box>
          </geometry>
        </collision>

        <visual name="visual">
          <geometry>
            <box>
              <size>1 1 1</size>
            </box>
          </geometry>
        </visual>
      </link>
    </model>        
  </world>
</sdf>

正しくモデルがダウンロード出来ていないようで,私のはちょっとエラーを吐きましたが.

さて,これらの意味を把握する必要はあんまりないと思いますが,まずはこれはxmlで記述されています.

そして設定はSDF(Simulation Description Format)という形式で記述します.

これをいい感じに記述できると,ロボットに任意にカメラをつけたりなんかが出来ます.

少し見て行きましょう.

<?xml version="1.0"?>
<sdf version="1.4">

バージョン情報です.SDFには2016年6月現在1.4から1.6まであります.多少記述が変わることがありますので注意してください.

<world name="default">

ここからworldについてを記述していきます.逆にいえばここの範囲外には何も記述はしません.

    <include>
        <uri>model://ground_plane</uri>
    </include>

    <include>
        <uri>model://sun</uri>
    </include>

モデルを取ってきています.基本的に$HOME/.gazebo/modelsの中にそれぞれのモデルを定義したものがあります.

    <model name="box">
      <pose>0 0 0.5 0 0 0</pose>
      <link name="link">
        <collision name="collision">
          <geometry>
            <box>
              <size>1 1 1</size>
            </box>
          </geometry>
        </collision>

        <visual name="visual">
          <geometry>
            <box>
              <size>1 1 1</size>
            </box>
          </geometry>
        </visual>
      </link>
    </model>    

ここは箱についての定義がなされています.

一応注意する点としてロボット系の制御に関しての知識がある方なら,ご存知と思いますが,

<pose>0 0 0.5 0 0 0</pose>

で記述されているのは(x,y,x)と(roll,pitch,yaw)になります.

ロール,ピッチ,ヨー角が採用されています.詳しくはこのページなどを参考にしてみてください.

これ自体をいじるなんてことはあんまりないと思いますが(ちょっとしたものでもこのファイルだけで2000行はすぐいってしまう),知識として知っておくと違うと思います.

Gazebo入門

はじめに

さて,みなさんはロボットの何かしらを開発する時,どのソフトウェアを使うでしょうか.

スタンダードとしてはROSがあるかと思います.

とはいえ,私は今回ROSについては何も言及しません(予定).

ROSの付属品的な扱いのGazeboについて入門を行いたいと思います.

GazeboはROSとは異なるミドルウェアで実はロボット制御もできちゃったりします.

ROSのほうが楽なのは確かですが….

まあ,知らないよりは知っているほうがよいので,Gazeboについて知っておきましょう.

インストール等の内容を示しますが,今回はUbuntu14.04またはUbuntu16.04を想定しております.

インストール

ではまずはインストールをしましょう.いくつか方法はあるようですが,ここではcurlを使って,

curl -ssL http://get.gazebosim.org | sh

とするだけ(結構時間がかかります).これで現在リリースされている最新バージョンがインストールされます.

ROSを入れている方は注意!!

GazeboはROSの依存パッケージのひとつであり,ROSのバージョンごとに入るGazeboのバージョンが決まっています.

大抵ROSに入るのはちょっと古いものです(2017年4月現在のROS Kineticは最新の7.xが入るそうですが).

gazebo側のrosパッケージのインストールもあるので,ROSを入れている場合は,ROSがデフォルトでインストールするGazeboのバージョンをそのまま使うか

ROSをアンインストールをしてください.

起動

問題なくいけたら起動してみましょう.

gazebo

これで起動です.初回起動は少し時間がかかります.

もしworldファイル(xmlファイル)を起動する場合は

gazebo <worldファイルの名前>

としてください.

また,Gazebo自体に影響するわけではありませんが,--verboseオプションを使っておくことをお勧めします.

これは起動したコマンドライン上でGazeboの細かい情報がでます.デバッグには必ず使いましょう.

f:id:syoamakase:20160601185537p:plain

こんな画面が出れば成功です.

起動方法はもう一つあり,

gzclient

の後,別端末で

gzserver

と入力していただいても同じことができます.

大まかにgzclientは画面表示に関わる部分,gzserverは物理計算等を行う部分です.gazeboと言うコマンドはgzclientgzserverを行う,という処理になります.

アンインストール

curlでインストール(上記の方法)した場合,以下のコマンドを打ち込んでください.

sudo apt-get remove '.*gazebo.*' '.*sdformat.*' '.*ignition-math.*'

Ubuntu14.04では確認をいたしましたが,他のOSでは確認をしておりません.またROS等が入っている場合の確認はしておりませんので,そのあたりは自己責任でお願いします.

modelについて

Gazeboは起動時にModel Databaseに接続を試みます.もしproxy環境下にある場合は絶対に失敗しますので,モデルを直接ダウンロードしましょう.
参考

ダウンロードの方法はhgを使って,

hg clone https://bitbucket.org/osrf/gazebo_models

と打ってください(hgのほうにもproxyの設定が必要ですが…).

続き

Gazeboを使う際に注意してほしいこと。その3

3.便利リンク集

ROS系統の問題ならともかく、Gazeboの問題は基本的にはgoogle先生に聞いても大抵直接的な答えは出てきません。

そこで私が使ったことのあるリンク集を貼り付けていきます。もしかしたら役に立つかも。

GazeboのAPI

実はGazebo自身がAPIを用意しています。大体Gazeboを入れたときに入ります。何かソフトウェアをインストールしなくとも、これで解決できる場合があります。

プラグインとして書く必要があるため、結構面倒かも。形式はC++

SDFの説明

worldファイルを作成するときに使う(かも)。この形式に従って記述しているため、それぞれどんな記述をするのかを確認できます。

これを使えるとKinectに(無理矢理)普通のカメラを搭載したり、カメラセンサーからとる画像サイズを変えたりすることもできます。

Gazeboのソースコード

Bitbucketにソースコードがあります。正直見てもあんまりよくわかませんが、issueを送るときなどにどうぞ。

Gzwebのソースコード

Gazeboほど活発でもないため、将来的に使っていくのは少し微妙かも知れませんが、クラウド化する今日においてはもしかしたら流行るかも知れません。

全部公式ページですね。なんだかんだで公式ページが一番使えるような気がします。Gazeboを単体で使うことがほとんどないためか、ほぼ参考にできるページがありませんでした。

4.これはできない!エラー集

これでエラーが出てしまいましたって言うものです。残念ながら解決方法がわかってないので、もしわかる方がいらっしゃったらコメントをください。

virtual boxの3Dアクセラレーションを有効にしている場合

ネイティブのubuntuなんて用意できないって方はvirtual boxで起動してみるというのも一種の手だと思います。ですが、virtualboxの高速化のため3Dアクセラレーションをオンにしていると OpenGL系統でエラーを吐いて強制終了してしまいます。

XWindowを使って画面転送をしたとき(Mac限定)

一見うまくいくのですが3Dモデルの画面にマウスを持っていった瞬間エラーを吐いて終了してしまいます。

Gazeboを使う際に注意してほしいこと。その2

続きです。

 

2.docker上では注意!dockerからの起動方法

Gazeboはdocker hubに公式としてイメージを配布しておりますが、これ表示できなくね?と思いました。そう、dockerのコンテナ上にはディスプレイがありません。どうすんだよって話ですが、大きく分けて3パターンの解決方法があります。

 

まず一つ目。

gzserver,gzclientを使う方法です。gzserverをdocker上のコンテナで、gzclientをホストのPCで,という方式です。

最近dockerがWindowsMacでもVirtual boxを介さず起動できるようになるとの発表がありましたので,そのうちこの方法が使えるようになると思います。厳密に言えば使えなくはないですがポート等の問題があるので、かなり厳しいと思います。

この方法の欠点はわざわざホスト側のPCにGazeboをインストールしなければならないことです。環境を汚さないことがdockerの大きな利点ですから、一番良い解決方法ではあるのですが、少しどうなのって感じです。

 

次に二つ目。

Xwindowを使う方法です。Xwindowはディスプレイの情報を別のPCに持って行けるので画面を転送すればできます。

これもまあまあ問題があります。まずGazeboは3Dのレンダリングがなされているため、Mac,Windowsでは3Dレンダリング関連で引っかかりまともに動かせません。

Ubuntuでは動作しますが、なぜか一部の画面が欠落したりでなんだかんだ使えません。

f:id:syoamakase:20160331161436p:plain

こんな感じ。左が欠落しています。VM上でしか試していませんので、もしかしたらネイティブでlinuxをインストールしている場合は使えるかもしれません。

 

最後に三つ目。

gzwebを使う方法です。その1でもちらっと書きましたがgzwebとは何かといいますとgzclient(3Dモデルのレンダリング)の機能をWebブラウザでしようとするものです。

機能は制限されてしまいますが、ある程度使えます。PR2等のセンサーなどが多いもの

では処理がかなり重いので、軽めのロボットを使うのであれば十分使えるでしょう。

 

基本に立ち返って…

さて、ここでは結局Gazeboって何が向いているんだって話ですね。Gazeboは物理シミュレータと銘打っているため、当然重力等を考慮した環境が必要な場合には有効です。

逆に、そんなのは別に要らない、リアルな画像が欲しいんだ、って場合は逆に向いていないと思います。その場合はUnityやUnreal Engine等のほうが相性がいいですし、何より動かしやすい(重要)。やりたいことが物理演算が必要ならばGazebo、要らないならまた別のものを考慮したほうがよいです。

 

 

 

Gazeboを使う際に注意してほしいこと。その1

闇に飲まれる!

 

ロボットシミュレーターの闇は深いぜよ…。

 

1ヶ月半ほどGazeboをいじる機会があったので、それのアウトプットをします。とはいえ結論としてやりたいことはできませんでした…。なので、詰まった点とその解決方法をできうる限り皆様に還元して、同じ苦労はしてほしくないという願いをこめつつ書きます。ROSを使う場合にもある程度役に立つと思います。

 

特に断りがないときはGazeboはソフトウェアの名前、gazeboはコマンドの名前とします。

0.知っておくと便利!Gazeboのアレコレ

gazebo --verbose

詳細な情報を教えてくれます。デバッグしているときは基本的に--verboseオプションはつけましょう。大体のバグはこのオプションを指定すると書いてくれてます。

 

gz world -r

gazeboを使っている状態で別ターミナルで入力すると、モデルと時間を初期状態に戻します。GUI上でShift+Ctrl+rでもできます。

 

GAZEBO_PLUGIN_PATH

Gazeboのプラグインパスを指定する環境変数です。Gazeboをインストールした際にいくつか初期で入っているものがありますが、これは自前でプラグインを用意したときに指定するものです。

 

GAZEBO_MASTER_IP

gzserverを動かしているPCのIPアドレスを指定する環境変数です。何も指定されていなければlocalhostとなります。意識してサーバーとクライアントを分けない限りは使わないと思います。

 

GAZEBO_MASTER_URI

URLではありません。クライアント側からgzserverを起動しているIPアドレスを指定する環境変数です。これも意識しない限り使わないと思います。

 

 

1.リモートサーバー上では使えないよ!!

と言うわけで一つ目はこれ。Gazeboにはgzserverとgzclientにコマンドが分けられています(正確にはgzもありますが)。

 

実はこれ一定条件下ではサーバーとクライアントを別PCでやっても使えます。

 

その条件とは、

両方向でpingが繋がる

要するに同一LAN内であれば繋がります。たとえなかったとしてもホスト側のPCがDMZ(ファイアーウォールなどで規制していない)にあれば使えます。

 

…少し考えればわかりますが、実用に耐えうるものではありません。そもそも同一LAN内にあるならサーバーにしなくとも高性能なPC内でgazeboを打てばよいわけですし、同一LAN内以外で両方向でpingが繋がるってセキュリティには明るくなくとも危険とわかります。

 

なので名前的にはいけそうな気がしますが、少し無理があるということです。一応作っていたものがリモートサーバーを想定していたのでgzwebで代替しようとしています。

 

ちなみに試してみたいという方は

サーバー側で

GAZEBO_MASTER_IP=<自分のIPアドレス> gzserver 

 

クライアント側で

GAZEBO_MASTER_URI=http://<サーバーのIP>:11345 gzclient 

 

 としてください。同一PCであればgzserverとgzclientのみで大丈夫です。

 

長くなりそうなので次へ続きます。