九州工業大学 CIR-KIT Blog

九工大自律移動ロボット製作プロジェクトCIR-KITの技術系ブログ

No.3-3:環境をつくろう ! (Digital Elevation Models 編)

gazebo_logo

検証日時

02/03/2015 (Tue)

概要

Gazeboのチュートリアル第三弾「Build a World」。 このチュートリアルでは、シミュレーション中の環境をどのように構築するかについて説明します。
今回はその「Digital Elevation Models」編です。
公式サイトを適当に翻訳しただけですので、あしからず。

レベル

ADVANCED

環境
PC : Lenovo ThinkPad X240
Prosessor : Intel Core i7-4600U (2.10GHz, 4MB, 1600MHz)
RAM : PC3-12800 DDR3L (8GB)
OS : Ubuntu 14.04 LTS 64bit
Kernel : 3.13.0-44-generic
Gazebo : Version 5.0.1
参考

GAZEBO Tutorial-Build a World

はじめに

Digital Elevation Model (DEM)は3Dの植物や建物のような物体を含まないような地形です。DEMはLIDARやradar、カメラなどによるセンサフュージョンによって生成されます。グラウンドポジションの地形の標高は、定期的に水平間隔でサンプリングされています。WikipediaでDEMのより詳しい情報があります。
DEMという言葉は一般的な名称であり、至って普通のフォーマットです。実際、DEMは代表的なグリッド立体図(水平捜線)や、ベクトルベースの基板地図変換であるvector-based triangular irregular network (TIN)なのです。現在GazeboはGDALライブラリでサポートされているraster(水平捜線)データのみをサポートしています。
GazeboをDEMをサポートする主な動機付けは、リアルな地形をシミュレートできるようにしたいというものです。ロボットを現実の世界のと同じ地形でシミュレーションし、その動向をテストし、救助用または農業用への応用を図ることは興味深いものとなるでしょう。

GazeboにDEMサポートを適用する

DEMファイルをサポートするには、GDALライブラリをインストールする必要があります。

Ubuntu Trusty/Utopic の場合:
1
  sudo apt-get install gdal-bin libgdal-dev libgdal1h python-gdal
Ubuntu Precise の場合:
1
  sudo apt-get install gdal-bin libgdal1-1.7.0 libgdal1-dev python-gdal

DEMファイルとSDFフォーマットでの定義

立体データを提供する団体はいくつかあります。例えば、80年代の噴火前噴火後のセント・ヘレンズ山のDEMフォーマットファイルをダウンロードしましょう。ダウンロードしたら、Unzipで解凍し、mtsthelens.demという名前をつけましょう。

1
2
3
4
  cd ~/Downloads
  wget http://extract.cr.usgs.gov/public/NED/mtsthelens_before.zip
  unzip ~/Downloads/mtsthelens_before.zip -d /tmp
  mv /tmp/30.1.1.1282760.dem /tmp/mtsthelens.dem

通常、DEMファイルにはたくさんの取り決めがあるので、Gazeboでは扱えません。なので、DEMの取り決めに合わせる良いアイデアがあります。i日のコマンドで地形を129x129に縮小し、Gazeboのmedia/dem/ディレクトリにそれをコピーします。

1
2
  mkdir -p /tmp/media/dem/
  gdalwarp -ts 129 129 /tmp/mtsthelens.dem /tmp/media/dem/mtsthelens_129.dem

GazeboでDEMファイルを読み込むのは高低地図を読み込む方法と同じです。Gazeboは読み込みファイルがプレーンファイルかDEMファイルであった場合、自動でファイルを検出します。volcano.worldファイルを作成し、以下の内容をコピペしてください。できたら/tmpのように、どこにでも好きなところに保存してください。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?xml version="1.0" ?>
<sdf version="1.4">
  <world name="default">
    <!-- A global light source -->
    <include>
      <uri>model://sun</uri>
    </include>
    <model name="heightmap">
      <static>true</static>
      <link name="link">
        <collision name="collision">
          <geometry>
            <heightmap>
              <uri>file://media/dem/mtsthelens_129.dem</uri>
              <size>150 150 50</size>
              <pos>0 0 0</pos>
            </heightmap>
          </geometry>
        </collision>
        <visual name="visual_abcedf">
          <geometry>
            <heightmap>
              <texture>
                <diffuse>file://media/materials/textures/dirt_diffusespecular.png</diffuse>
                <normal>file://media/materials/textures/flat_normal.png</normal>
                <size>1</size>
              </texture>
              <texture>
                <diffuse>file://media/materials/textures/grass_diffusespecular.png</diffuse>
                <normal>file://media/materials/textures/flat_normal.png</normal>
                <size>1</size>
              </texture>
              <texture>
                <diffuse>file://media/materials/textures/fungus_diffusespecular.png</diffuse>
                <normal>file://media/materials/textures/flat_normal.png</normal>
                <size>1</size>
              </texture>
              <blend>
                <min_height>2</min_height>
                <fade_dist>5</fade_dist>
              </blend>
              <blend>
                <min_height>4</min_height>
                <fade_dist>5</fade_dist>
              </blend>
              <uri>file://media/dem/mtsthelens_129.dem</uri>
              <size>150 150 50</size>
              <pos>0 0 0</pos>
            </heightmap>
          </geometry>
        </visual>
      </link>
    </model>
  </world>
</sdf>

コードの上部にある<heightmap><size>要素は、(<size>要素がないときは)Gazeboが原寸でDEMファイルを読み込むかどうかを決定し、(<size>要素があるときは)リサイズします。今回は、DEMファイルをリサイズします。<size>要素はGazeboにシミュレーションで使用し、リサイズする大きさをメートル単位で定義します。もし、正しいアスペクト比を維持したいなら横幅、高さ、海抜(<size>の三番目です)を詳細に計算して定義してください。今回の例では、DEMファイルは150 x 150 [m]で最も高いところで、海抜50 [m] となるようにリサイズしています。
GazeboをDEMファイルを含むworldと共に立ち上げ、以下のような火山の立体図が表示されることを確認してください。以下のコマンドの例では、ファイルを/tmpディレクトリに置いています。

1
2
3
 # インストールパスにあるgazeboのsetup.shにsourceコマンドを実行することを確認してください。
 source /usr/share/gazebo/setup.sh
 GAZEBO_RESOURCE_PATH="$GAZEBO_RESOURCE_PATH:/tmp" gazebo /tmp/volcano.world

gazebo_sthelens

興味のある地域のDEMファイルを手に入れるにはどうしたらよいですか?

GLCF(Global Land Cover Facillity)について

続いて、興味のある特定の地域のDEMファイルを手に入れる方法を説明します。
Global Land Cover Facilityでは地球の高解像度なデジタル地形データを提供し、維持しています。Search and Preview toolへ行ってみましょう。すると、イメージしたシミュレータを見つけることができるでしょう。すべての地形パッチはあなたがこのツールを使う前から知っているであろう個々のpathとrowを持っています。私達は、QGISを使い興味のあるpath/rowを発見するのです。以下のキャプチャはその検索画面です。 glcf_search_tool

QIGSについて

QIGSとはクロスプラットフォームのオープンソース地理情報システムプログラムです。以下のように、このプログラムでは閲覧、編集、調査で使用することができます。QGISのサイトの指示にしたがってQGISをダウンロードしてください。

QIGSのダウンロード

QGISのダウンロードを参考にしてQGISをダウンロードします。
以下のように、aptを使ってQGISをインストールします。

1
2
  sudo apt-get update
  sudo apt-get install qgis python-qgis
QGISの使い方
  1. QGISを開いたら、以下のように、画面左にあるWMS/WMTSレイヤの追加というアイコンをクリックしましょう。 qgis-add-wms-wmts

  2. すると以下のようなウィンドウが出るので、以下のように、バーをクリックし、Lizardtch serverを選択し、接続ボタンを押してください。 qgis-lizardtech-server

  3. すると、以下の一枚目のように、レイヤを選択できるようになるので、タイトルがMODISであるレイヤを選んで、一番下の追加を押してください。終わったら、このウィンドウィンドウを閉じてください。
    うまく行くと、二枚目の写真のように、世界地図がレイヤに表示されるはずです。 qgis-add-modis qgis-modis-layer

  4. 続いてのステップは他のレイヤーを利用可能なパッチと共に追加します。このshapeファイルをダウンロードし、どこでも良いのでフォルダに解凍してください。私は、~/Downloads/に保存し、そこで展開しました。

  5. QGISに戻り、以下の一枚目のように、ベクタレイヤの追加というアイコンを押してください。すると、開く前に、現在のプロジェクトを保存しますか?と聞かれるポップアプが表示されるので、保存するを選んでください。その後、先ほど解凍したフォルダの中のwrs2descending.shpファイルを選択してください。うまく開けると、2枚目の様なレイヤが表示されるはずです。 qgis-add-vector-layer qgis-wrs2-descending-layer

ここまでで、メインウィンドウに2つのレイヤが開いていることを確認できるはずです。2つのレイヤーを同時に確認できるようにするため、wrs2descedingレイヤの透明度を変更しましょう。
ウィンドウ左側のレイヤ一覧より、wrsdescendingレイヤをダブルクリックすると、以下の一枚目のようなウィンドウが出るので、透明度を85%程度に修正しましょう。成功すれば、二枚目のようなレイヤになっているはずです。 qgis-wrs2-descending- transparency qgis-modis-wrs2-descending

QGISとGLCFを使って地形データを取得するまでの手順

QGISの操作
  1. 脇ほどまでのレイヤを使って、スクロールと左ボタンを使用し、興味のある地域まで移動してください。
    今回は、富士山まで移動してみました。 qgis-mtfuji

  2. 以下のように、上部のバーにある、地物情報表示というアイコンをクリックしてください。
    その状態で、興味のある地域をクリックすると、以下のように、そのエリア一体の地形パッチがハイライトされます。 qgis-identify-features

  3. 以下のキャプチャの例では、富士山近辺の地域のDEMのためのpathとrowを確認することができます。 qgis-identify-features-detail ちなみに、公式チュートリアルでは、以下のキャプチャのように、スペイン、カナリア諸島の、ラスパルマスのDEMのpathとrowを確認しています。 qgis_las_palmas

GLCFの操作
  1. GLCF検索ツールに戻り、調べたpath/rowの値をStart PathStart Rowとラベリングされているカラムに入力しましょう。

  2. 入力したら、Submit Quenryをクリックしてください。

  3. Preview and Downloadを押すと結果を表示できます。以下の結果は、富士山近傍のもので、path = 108、row = 35とした時の結果です。 glcf-mtfuji

  4. 地形ファイルを選び、Downloadを押してください。
    今回は、計測年度が一番新しい、2011年のもの、ID:294-863を選びました。(上図参照)

  5. 最後に、拡張子が.TIF.gzのファイルを選び、好きなディレクトリに保存し、展開してください。
    尚、.gzが付いているデータは複数ありますが、README.GTFによると、*_B62.TIF.gzとなっているものが程よい解像度で、良いみたいです。また、README.GTFによると、*.TIF.*GeoTiffフォーマットになっているそうなので、これを選びましょう。尚、*はワイルドカードです。
    GLCF(Global Land Cover Facility)ファイルは、DEMが利用できるフォーマットとして、最も標準的ななGeoTiffフォーマットになっています。

GazeboでDEMデータを使用するための準備

DEMデータは通常、高精細に作られています。Gazeboで使用する前に、gdalwarpを使って地形の解像度を扱いやすいサイズにします。

1
  gdalwarp -ts <width> <height> <srcDEM> <targetDEM>

DEMデータは、しばしば、holesvoidエリアを含んでいます。そういったエリアはDEMが生成された時に作成できなかったデータがあるエリアと一致します。holeというデータの場合、holeには、DEMで使用された、データタイプの最大値もしくは最小値が割り当てられています。
上記のようなholsが埋められたDEMのデータセットである、finishedバージョンをダウンロードするよう、常に心がけてください。もし、あなたのDEMの地形データがhols(NODATA値としても知られている)を含んでいる場合、gdal_fillnodata.pyのような、gdalのツールを使って手動で修復してみてください。

Gazeboで様々なDEMを使う

Gazeboは、直接様々なDEMをサポートしていないにも関わらず、GDALにはDEMを一つにするマージのための有益なツールセットがあります。DEMのセットをダウンロードする最初のステップはマージすることです。パッチは他のパッチと重なることがあるということを覚えておいてください。GDALはそれらの重なりをシームレスにマージできるのです。今あなたがいるディレクトリにマージする準備ができた状態でGeofiffファイルがあるとすると、次のコマンドで、それをマージできます。

1
  gdal_merge.py *.tif -o dem_merged.tif

すると、dem_merged.tifファイルをworldファイルの中で使用できますし、Gazeboはすべてのパッチがマージされた状態で、地形を読み込むでしょう。以下のスクリーンショットは、公式サイトのもので、カナリア諸島一帯を囲む4つのパッチをマージした結果だそうです。 gazebo_dem_merged

最後に

自分で取得した地図をとりあえず表示することは出来ましたが、縮尺とかがおかしいままなので、解決したら、また投稿します。とりあえず今は、先に進みたいです。(02/04/2015 21:51)