tpc16-1

TOPIC 16|ROSで活用する[1/2]|ROSで利用するためのデータ変換

PLATEAUの3D都市モデルは、ROS(Robot Operating System)における地図情報として活用できます。ROSで利用するための準備として、センシンロボティクスの開発した変換ツール「CityGMLtoRobotMap」 を使ったOBJ形式への変換を説明します。

Share

TOPIC16:ROSで活用する

このトピックでは、ROS(Robot Operating System)でPLATEAUを活用する方法を説明します。現在ROSには、「ROS1」と「ROS2」がありますが、対応ライブラリの豊富さから本稿では「ROS1」を使用する前提で説明します。

【目次】

16.1   ROSにおけるPLATEAUの活用

16.2   ROSで利用するためのデータ変換

16.3   必要となるツール類のインストール

16.4   OBJ形式ファイルに変換する

 16.4.1  CityGML形式の3D都市モデルを準備する

 16.4.2  OBJ形式データに変換する

16.1 _ ROSにおけるPLATEAUの活用

ROSは、オープンソースのロボット開発向けのミドルウェアです。ロボットの自律制御に必要な認識、計画、制御などのさまざまな機能がROS上で動作するコンポーネントとして公開されており、必要なコンポーネントを組み合わせることでロボットのソフトウェアシステムを開発できます。

PLATEAUの3D都市モデルは現実の都市空間を構成する建築物や道路、設備などの3次元形状と意味情報を保持するGISデータであり、公共測量成果を利用しているため、位置正確度が確保されています。そのため、現実世界との誤差が精度として管理された3次元地図として利用できます。

このような3D都市モデルをロボットが使用する環境地図データとして捉えると、さまざまな場面での活用が期待できます。例えば、次の用途に利用できます。

① 自己位置推定

ロボットが自らの位置を知るための仕組みを自己位置推定と呼びます。さまざまなセンサーの値とセンサーに適した環境地図をもとにロボットは自己位置推定を行います。PLATEAUが持つ3D形状から必要な形状情報を抽出・生成し、点群や画像特徴点といった適切なデータ形式に変換することで、ロボットが自己位置推定する際の地図情報として活用できます。LiDARを使用した自己位置推定の環境地図としては点群地図がよく使用されます。

② 経路計画

ロボットが移動する際、まずルートを引きます。このような機能を経路計画と呼びます。経路を求める場面においては周囲環境の形状の情報が不可欠ですが、PLATEAUが持つ3D形状を経路計画で用いる環境地図として活用できます。その際ボクセルで区切られたデータ形式のうちのひとつであるOctomapなどが使用されます。

さらに、PLATEAUは3D都市モデルであるため、従来の2Dの地図と異なり、ドローンなど空間を立体的に移動するロボットでも活用できるのが大きな特徴です。

図16-1 PLATEAUの3D都市モデルから点群を生成した例
図16-2 PLATEAUの3D都市モデルからボクセルを生成した例

16.2 _ ROSで利用するためのデータ変換

ROS上で動作する自己位置推定、経路計画などでPLATEAUの3D都市モデルを活用するためには、PointCloud(点群)やOctomap(ボクセル)に変換します。

● PointCloud

PointCloudは点群であり、大量の点(例えば50万、100万個)を扱うためのデータ形式です。各点はx,y,zの3次元空間上のどこにあるかの情報を保持します。CityGMLから生成されたPointCloudデータは、主にLiDARセンサーによる自己位置推定に用いる環境地図としての活用が想定されます。

● Octomap

Octomapは、ボクセルであり、空間の占有状態を表現するデータ形式です。区切る粒度(例えば1mなど)に応じて空間をキューブ上に分割し、各キューブが何か障害物や構造物に専有されているか、または空の空間か、あやふやな場合は0~1の間の値を保持することでロボットが動作する環境の空間占有状態を表現します。

■ PointCloudやOctomapへの変換

3D都市モデルをPointCloudに変換するには、CityGMLtoRobotMapを使います。これは2022年度のProject PLATEAUの一部として開発したもので、CityGML形式のデータをRobotが使用できる地図として変換するツール群です。Linux環境で動作します。このツールに含まれているcreate_sampling_point_cloud.pyを使うと、OBJ形式のファイルをPointCloud形式に変換できます。出力ファイルは、PLY形式とPCD形式です。ROSでは、このうちのPCD形式ファイルを使います。

【メモ】

PLY形式は、CloudCompareなどの多くの点群ビューワーソフトでサポートされているファイルフォーマットです。

図16-3 PointCloudに変換する

PCD形式のファイルができたら、「pcl_ros」と「octomap_server」を使って、ROS上で利用できるようにします。

ROS上のツールでは、データを公開する側を「パブリッシュ(配信)」、データを利用する側を「サブスクライブ(購読)」と呼び、これらの間で、データをやりとりします。データをパブリッシュする際には「トピック」という名前を付け、データを利用したいサブスクライバ側では、そのトピック名を指定することで、配信されているデータを取得できます(図16-4)。

図16-4 パブリッシュとサブスクライブ

pcl_rosパッケージに含まれるpcd_to_pointcloudを使うと、pcd形式のPointCloudデータを読み込んでパブリッシュし、ROS上で扱えるようになります。octomap_serverに含まれるoctomap_server_nodeを使うと、このバブリッシュされたPointCloudデータをサブスクライブし、それをOctomapに変換したものを、さらにパブリッシュ――すなわち、ボクセルに変換したものをパブリッシュできます。

ROSには、配信されているデータを可視化するRvizというツールがあり、パブリッシュされたPointCloud(点群)やOctomap(ボクセル)をRvizがサブスクライブすることで、可視化できます(図16-5)。

以下の手順では、Rvizで可視化するだけですが、代わりに自己位置推定するツールや経路計画を作成するツールなどからサブスクライブすることで、さまざまな用途に利用できます。

図16-5 PointCloudからOctomapへの変換、そして可視化

■ OBJ形式の3D都市モデル

PLATEAUの3D都市モデルは、CityGML形式です。次のいずれかの方法で、OBJ形式の3D都市モデルを用意します。

----------------
①G空間情報センターから、利用したい3D都市モデルのOBJ形式ファイルをダウンロードする

②PLATEAU SDK【TOPIC 17】やFME Form【TOPIC 4】などを使って、CityGMLから変換する

③CityGMLtoRobotMapに含まれているgml2obj.pyを使う
----------------

ここでは③の方法を使います。経緯度を指定すると、それを原点としたOBJ形式ファイルに変換できるため、原点のオフセットを計算しなくて済むからです。また、bldg(建築物)、brid(橋梁)、dem(地形)、tran(道路)の4種のファイルをまとめて変換できます。

16.3 _ 必要となるツール類のインストール

まずは、必要なツールをインストールします。Ubuntu 18.04で動作確認しています。curl、git、poetry、Javaを使うので、必要に応じて、インストールしておきます。

apt install curl git default-jre
curl -sSL
https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python

■ CityGMLtoRobotMap

下記のGitHubのサイトからダウンロードしてインストールします。

【CityGMLtoRobotMap】

https://github.com/Project-PLATEAU/UC22-024-CityGMLtoRobotMap

インストール先は任意ですが、以下ではホームディレクトリ(~)をカレントディレクトリとし、次のコマンドを入力してダウンロードすると想定します。

すると、カレントディレクトリにCityGMLtoRobotMapディレクトリができ、そのなかに、OBJ形式への変換ツールであるgml2obj.pyやPointCloud形式への変換ツールであるcreate_sampling_point_cloud.pyなどがダウンロードされます。これらのツールを実行するには、このディレクトリをカレントディレクトリにする必要があります。以下では、カレントディレクトリを移動する「cd ~/CityGMLtoRobotMap」が、各所に登場しますが、別のディレクトリに保存した場合は、適宜、読み替えてください。

なお、このディレクトリのなかには、 citygml-toolsをダウロンードして、 citygml-tools-2.0.0サブディレクトリに保存しておく必要があります。詳しくは、Readme.md中の「インストール方法」項目を参照してください。


└CityGMLtoRobotMap (ここにGitHubからダウンロードしたファイルを置く)
    ├citygml-tools-2.0.0 (Readme.mdに記載の手順で別途ダウンロード)
    ├gml2obj.py
    ├create_sampling_point_cloud.py
    └・・・略・・・

CityGMLtoRobotMapに含まれるツール群はPython製のプログラムで、さまざまな外部ライブラリやツールを利用して、各種変換を行います。ディレクトリ内にあるReadme.md の「インストール方法」項目には、インストールしなければならないソフトやライブラリ、環境構築の方法などが記載されているので、それに従って、環境構築してください。

● ROS

ROSをインストールします。本トピックでは、Ubuntu 18.04で動作するROS Melodicで動作確認しています。

インストールチュートリアルに従って、インストールしてください。

● pcl-ros

ROS上でPointCloudファイルを読み込んでパブリッシュするのに必要なツールです。次のコマンドを入力してインストールしてください。

apt install ros-melodic-pcl-ros

● octomap_server

ROS上でPointCloudをOctomapに変換してパブリッシュするのに必要なツールです。次のコマンドを入力してインストールしてください。

apt install ros-melodic-octomap ros-melodic-octomap-server

16.4 _ OBJ形式ファイルに変換する

まずは、CityGML形式からOBJ形式に変換します。

16.4.1 _ CityGML形式の3D都市モデルを準備する

ここでは東京都23区の3D都市モデルを使います。

【3D都市モデル(Project PLATEAU)東京都23区】
https://www.geospatial.jp/ckan/dataset/plateau-tokyo23ku

G空間情報センターの3D都市モデル(Project PLATEAU)東京都23区のページを開き、[CityGML]の部分からダウンロードします(図16-6)。

図16-6 CityGMLのダウンロード

ダウンロードしたら、そのzipファイルを解凍して、適当なディレクトリに置きます。以下では、ホームディレクトリ(~)配下の「Downloads/13100_tokyo23-ku_2020_citygml_3_2_op」に配置したと想定してコマンドを解説します。別の場所に置いている場合は、適宜、読み替えてください。

~
├Downloads
│    └13100_tokyo23-ku_2020_citygml_3_2_op (ダウンロードしたCityGML群を置く)
│        ├13100_indexmap_op.pdf
│        ├・・・略・・・
│        ├udx
│            ├bldg
│            │   ├・・・略・・・
│            │   ├ 53394525_bldg_6697_2_op.gml
│            │   └・・・略・・・
│            ├bird
│            ├dem
│            ├fld
│            ├fm
│            ├lsld
│            ├luse
│            ├tran
│            └utf

├CG2RM (後述。ディレクトリは自動生成される)
│    ├obj        (OBJ形式に変換した結果が格納される)
│    └pointcloud (PointCloud形式に変換した結果が格納される)
│     
└CityGMLtoRobotMap (GitHubからダウンロードしたファイルを置く)
    ├citygml-tools-2.0.0 (Readme.mdに記載の通りに別途ダウンロード)
    ├gml2obj.py
    ├create_sampling_point_cloud.py
    └・・・略・・・

16.4.2 _ OBJ形式データに変換する

CityGMLtoRobotMapに含まれるgml2objを使って、ダウンロードしたCityGML形式ファイルをOBJ形式に変換します。

gml2objは、指定した経緯度を原点としたOBJ形式ファイルへと変換します。変換対象は、その経緯度の地点を含むファイル(3次メッシュで分割された単位)です。

ここでは例として、東京都庁所在地の経緯度を原点としたOBJ形式ファイルに変換します。地理院地図などで調べると、その経緯度は以下のとおりです。高さのオフセットは0とします。

【東京都庁所在地(今回、原点とする位置)】

緯度:35.6895014
経度:139.6917337
高さ:0

これまでの手順のように、ダウンロードしたCityGMLデータを「~/Downloads/13100_tokyo23-ku_2020_citygml_3_2_op」に配置しているならば、下記のコマンドを実行すると、変換できます。

cd ~/CityGMLtoRobotMap
python gml2obj.py -s ~/Downloads/13100_tokyo23-ku_2020_citygml_3_2_op/udx --lat 35.6895014 --lon 139.6917337 --alt 0 --mapcode_level third

-sオプションはCityGMLファイルを置いたディレクトリ名、--lat、--lon、--altは、それぞれ、原点とする緯度、経度、高さです。--mapcode_levelは、経緯度を中心に、「1次メッシュ」(first)、「2次メッシュ」(second)、「3次メッシュ」(third)の、どの範囲を変換するかを指定するオプションです。ここでは3次メッシュの範囲を指定しています。

変換対象となるのは、-sオプションで指定したディレクトリ以下の「bldg」「brid」「dem」「tran」の各ディレクトリに含まれているファイルのうち、--lat、--lonオプションで指定した原点座標を含むファイルです。東京都所在地として指定した緯度35.6895014、経度139.6917337は、3次メッシュ「53394525」に含まれているため、このファイルが対象となります。変換の際、LOD1とLOD2の内容がマージされます。すなわち、LOD2が存在する地域はLOD2のデータが、そうでない地域はLOD1のデータが変換されます。

【メモ】

--mapcode_levelにsecondを指定している場合は、2次メッシュ、すなわち、「533945」の範囲が対象となり、2次メッシュの「533945」に加え、その範囲と重なる3次メッシュの「53394501」~「53394599」のファイル群が変換対象となります。

正常に処理されると、ホームディレクトリ直下にCG2RMディレクトリが自動的に作成され、そのobjサブディレクトリのなかに、変換後のOBJ形式ファイルが保存されます(保存先は「--save_dir」オプションで変更することもできます)。この例では、指定した原点が3次メッシュ「53394525」に含まれるので、実際の出力ファイルは、「53394525_bldg_6697_2_op.obj」などとなります。

【文】

大畑成史(株式会社センシンロボティクス)、大澤文孝

【監修】

大畑成史(株式会社センシンロボティクス)
安谷屋樹(アダワープジャパン株式会社)
多葉井宏(株式会社竹中工務店)