Comments
Description
Transcript
R-GIS 入門 R-GIS RT コンポーネントで学ぶ R-GIS
R-GIS 入門 R-GIS RT コンポーネントで学ぶ R-GIS(ロボット GIS) Ver. 2.0 2010 年 12 月 7 日版 R-GIS コンソーシアム監修 目次 はじめに 第 1 章 R-GIS とは 1.1 GIS の基本 1.2 移動ロボットと GIS~ロボット向け GIS と従来の GIS の違い 1.3 データ構造と機能 1.4 標準について 第 2 章 準備 2.1 インストール 2.2 サンプル環境(地図) 2.3 サンプルロボット 2.4 フリーの GIS 環境 第 3 章 R-GIS サーバ 3.1 RgisOperator RTC 3.2 R-GIS ミニ RTC 第 4 章 R-GIS クライアント 4.1 LEGO NXT 移動機能とセンサ機能 4.2 GIS と接続する移動ロボットシステム 第 5 章 R-GIS 用の地図編集 5.1 GIS ソフト 5.2 GIS データの作り方 5.3 R-GIS データの作り方 第 6 章 次回予告 6.1 応用編 6.1.1 NEDO 知能化プロジェクトの他コンソの利用例 6.1.2 つくばチャレンジ 2009 を実例として 6.1.3 SLAM 研究と R-GIS はじめに このテキストは,R-GIS RT コンポーネント(RTC)を用いた R-GIS の入門書です.対象 は,ロボット用の GIS および RTC に興味のある,ロボット工学初心者を想定しています. ただし,ロボットではなく GIS に主な興味を持たれている方も読み進めることができるよ うに,ロボット工学自体には,大きく踏み込みません.サンプルのデータやソフト,また, 本テキスト内で紹介しているロボット玩具を試用することで,ロボット工学者に対しては, ロボットへの GIS 機能の導入の端緒になるように書かれています.一方,GIS ユーザに対 しては,ロボットの内部に深く立ち入らずに,ロボット技術を GIS に利用することができ るように書かれています. このテキストでは,RT コンポーネントの詳細やロボット(特に移動ロボット)のプロ グラムについては,深く説明しません.本テキストを読み進める上で,RTC のプログラミ ングがしたい,移動ロボットの RTC を設計し,実装したいといった興味が湧かれた読者 は,産総研や NEDO 知能化プロジェクト参画メンバが公開している各種情報にアクセス して頂ければ,本テキストで紹介しているサンプルプログラムやハードウェアを,簡単に 取り換えることができます. 最後に,このような R-GIS テキスト作成の機会と予算を与えてくれました,NEDO 知 能化プロジェクト佐藤知正 PL 他関係者に感謝を述べさせていただくと共に,R-GIS RTC が再利用されることを期待しております. R-GIS 教科書作成チーム一同 第 1 章 R-GIS とは 状況が変化しやすい人間の生活空間において,ロボットがロバストに動作するためには, ロボットの環境・状況認識能力や自律的な判断能力の向上が必要です.このロボットの能 力を環境の側から補完しようというのが「環境情報構造化」です[1]. 構造化環境が提供する情報としては,いわゆる「地図」だけでなく,カメラなどのセン サによって獲得されたデータ,人やロボット,障害物の特徴,経路情報などが挙げられま す.これらは,その情報が取得された地図上の位置との組で記録されることが多いでしょ う.このような,地理空間における対象事物に対し,その位置や範囲と属性情報が対にな っている情報を「地理空間情報」と呼びます[2].ロボットが人と共存するための「環境情 報構造化」には,このような地理空間情報を生成,管理する機能が必要となると考えてい ます. 私たちのグループは,情報構造化環境プラットフォーム「ロボットタウン」の中でロボ ットに地図情報を提供するしくみについて研究を行ってきました[3].これを発展させ,こ れまで人間向けの意思決定支援ツールであった GIS(Geographic Information System) の地理空間情報技術とロボットの分野で用いられてきた環境情報技術とを融合し,ロボッ トが理解可能な形で地理空間情報を提供するロボット GIS(R-GIS)を提案しているとこ ろです[4].これにより,ロボットはシームレスな実空間で活動し,人間および複数のロボ ット間で環境・空間情報を共有することができるようになると考えています(図 1) . 図 1 Concept of Robotic and Geographic Information System (R-GIS) このような背景ですが,先ずは,GIS の基本や動向を簡単に紹介していくことにしまし ょう. 1.1 GIS の基本 GIS (Geographic Information System 地理情報システム)は,コンピュータ上で,いわ ゆる地図の情報(地物)やこれに付随するさまざまな属性情報をデータベースとして保持 し,これら地理空間情報の利用,管理,検索、分析、表示などの機能をもったシステムの 総称です.現場の測量・調査結果や人工衛星からのデータを,空間や時間の面から分析・ 編集することで,科学的な調査,土地や施設,道路といったインフラ情報の管理などに利 用されています.数百年の昔から紙図面での地物の管理は行われてきましたが,近年のコ ンピュータの発展に伴い,膨大なデータの取り扱いが簡単になり,リアルタイムでのデー タ編集やシミュレーション,可視化といった,より高度な処理が可能になってきました. これ以上の GIS の詳しい説明や利用例は,他書に譲るとして,ここでは,R-GIS を使う上 での最小限の用語や知識について,整理しておきたいと思います. 【データ形式】 GIS で使われるデータは,たくさんあります.建物や道路などの形状を示した図形情報 や航空写真や衛星写真といった画像情報,建物の所有者や住所など地物に関する属性情報, 地図の表示や投影変換で必要となる測地系や投影法に関する情報,縮尺や精度といったメ タ情報もあります.これらの情報は,その形式もさまざまですが,最近は,XML 形式で 記述されるものも多く,標準仕様に準拠することで相互変換も容易になっています. 【図形情報】 GIS で取り扱うデータはその目的に応じて様々な形式を使用します。それらを大きな区 分で分類するとラスタデータとベクタデータに分けることができます. 【ラスタデータ】 空間を一定間隔の格子状に分割し,その各セルに値を与えるものです.このラスタデー タを、ロボット分野でほぼ同義としてグリッドマップと呼ぶことが多いようです.地形を あらわすラスタデータでセル値に標高値持つものを,数値地形モデル(DEM)と呼びます. また,航空写真や衛星写真といった画像データもラスタデータとして扱われます.画像処 理分野では,TIFF という画像フォーマットがありますが,GIS 分野では,GeoTiff という 空間参照情報をヘッダー部に含んだ TIFF 画像がよく利用されています.なお,航空写真 も衛星写真も光学装置によるひずみや地形の起伏によるひずみを含むため,背景地図とし て利用するためにはこのひずみを補正する必要があります.このひずみを補正した画像は, オルソ画像と呼ばれています. 【ベクタデータ】 ベクタデータとは,いくつかの点座標から構成される「ポイント」,「ライン」, 「ポリゴ ン」などで表現されたデータをいいます.ポイントはx、y、(z)座標の対からなる図 形で、ラインとは、複数の点をつないで形成する折れ線をあらわす図形、ポリゴンとは、 折れ線の始点と終点が同一点になった面をあらわす図形になります。ポリゴンの内部に、 穴となるポリゴンを定義することによって、ドーナツ状のポリゴンを記述することも可能 です。基本的に GIS では、取り扱いたい地物をこれらポイント、ライン、ポリゴンのいず れかでデータ化していくことになります。 その他、①ライン同士を結節点で接合することで道路や管路をあらわすネットワークデ ータ、②ポイント・ライン・ポリゴンの空間的な位相関係をデータベース化したトポロジ ーデータ、③地形の起伏を三角形の面の集合で表した TIN データなど、少し特殊なデータ 形式も存在します。データ利用の目的に応じて使わけが必要になります。 データを作成する際には、地図や図面のトレース,測量や設計等による CAD データの 変換、レーザスキャナ等のセンサデータの加工によって生成することができます. 【測地系】 測地系とは,基準となる地球上の3次元点位置および地球の形状(球面近似や平面近 似)を定めたものです.測地系が異なる場合は、同じ経緯度座標値であっても地球上の違 う場所を指し示すことになります。そこで 2004 年、日本では,日本測地系から世界測地 系へと、国際基準の座標系へと移行する法改正を行ったため、GPS 等で出力される座標値 をそのまま地図の座標として利用することができるようになりました。世界測地系の詳細 は、世界測地系等のキーワードで検索されたい。 【GIS の主な機能】 GIS の主な機能としては,地図の表示や図形の作成・編集,属性の作成・編集,検索や 空間解析などがあります.注意したいことは,GIS の機能の多くは,最終的に,人間が視 覚的に見て判断する意思決定ツールとなることを目的として開発されている点です.ロボ ットを含む機械が,人間と違う方法で地図を利用するためには、それに合わせた仕組みが 必要になることがあります。 【GIS の動向,ロボット研究の動向】 現在のロボット業界は製造業向けの産業用ロボットが主力となっていますが,今後は, 生活・医療・公共分野で活動するサービスロボットや RT (Robot Technology)システムが 普及し,2025 年には 7.2 兆円規模の市場に成長すると期待されています[6].一方,GIS 分野においては,一般向けモバイル地図サービスの普及とともに,従来の静的な地理情報 だけでなく,ユーザが必要とする場所・状況に応じて位置や関連情報を提供する GIS サー ビスが社会に浸透するよう施策の検討・整備が進められてきています[2]. 地理空間 情報の 標準化 団体 OGC( Open Geospatial Consortium) [7]では, SWE (Sensor Web Enablement)として Web を介してあらゆる種類のセンサ情報を位置情報 と共に交換するためのサービス及びデータ記述の標準化が進められています.また,環境 に配置されたセンサネットワークを利用し,警告の自動発令やリアルタイムな観測情報に 基づいた意思決定を行える仕組みの実現を目指しています.一方,RT 分野では日本の研 究者が中心となって,ソフトウェア標準化団体 OMG(Object Management Group)にお いて,特定のセンサやアルゴリズムに依存しないロボット位置情報サービス標準 RLS (Robotic Localization Service)の策定が進められています[8].RLS は ISO の地理情報 標準をベースとしており,ロボットや観測対象の位置は,座標参照系(CRS: Coordinate Reference System)に関連づけられる空間座標・姿勢・時間・識別子・誤差情報で構成さ れるデータ構造で表現されます. このように GIS の発展動向と RT 分野で求められている方向性は重なる部分が多く,相 互活用によってサービスの幅も広げられる可能性があります.RT 分野と GIS を連携する ための枠組みや仕組みの開発が急務であると考えられるでしょう. 1.2 移動ロボットと GIS~ロボット向け GIS と従来の GIS の違い ロボット用 GIS ( R-GIS)で取り扱う空間情報は,従来の GIS で取り扱ってきた地理空間 情報と性質を異にする点が多くあります(表 1).また,自律移動ロボットは人間と違い, デジタルデータの計算処理によって自己位置,障害物や経路の認識・判断を行いますので, 確度を上げるために高精度で詳細な空間情報や位置測位が必要となります.しかし,縮尺 1/100 より詳細な空間情報は,一般に入手や整備が困難なことが多くあります.この他, 本質的に地理空間情報は現実空間を抽象化したものですから,少なからず実世界と地理空 間情報には差異が存在してしまいます.この差異を補間する技術,すなわち不確実な地理 空間情報の処理,ロボットの空間的認識・判断・学習が両分野における課題となっている わけです. 表1 GIS とロボットの空間情報の差異 課題 従来の GIS の地図 移動ロボットの地図 対象地物 静的環境 静的環境+動的環境 地図 広域(シームレスな地図管理) 局所域(主にロボット周辺) データ更新頻度 比較的長期間隔 リアルタイムの環境変化に応じた (年単位,月単位) 更新 年月日または時刻単位,過去 ミリ秒単位(センサデータ取得頻 のある時点・期間 度) 処理速度要求 遅い(数秒~数分) リアルタイムの処理 位置精度 縮尺レベルに応じた精度 数[cm]単位の精度 データの確度の 決定的 確率的 人間 ロボット(制御アルゴリズム) 時間の取扱い 扱い方 利用者 座標系 地理座標系 主にロボット作業座標系(GPS 等の 地理座標系も併用) 取り扱う地理空間情報の性質に留意しながら,ロボットの移動経路計画など空間把握に 必要とする空間情報をロボット間で共有する基盤が,R-GIS というわけです.複数のロボ ットが,システムを利用する一つの方法は,サーバクライアントモデルですが,以下は, R-GIS サーバとクライアントが実現する機能とその振り分け例を示しています. [R-GIS Server] 空間情報提供: ロボットが必要とする空間情報を各ロボットに応じて抽出し提供する機能 空間情報更新: ロボット搭載のセンサや環境中のセンサによって獲得された情報を集約し, 空間情報をリアルタイムに更新する機能 空間情報融合: 様々なセンサで計測した空間情報を融合し,新しい種類の空間情報を生成 する機能 空間情報処理: 取得した空間情報をロボットの動作計画に利用できる情報や座標系などへ 加工する機能.空間検索や属性検索といった各種検索機能 [R-GIS Client] 空間情報受信: ロボットの移動能力やセンシング能力に応じた空間情報を R-GIS サーバか ら受信する機能 空間情報送信: ロボットの自己位置やセンサによって獲得した情報を R-GIS に送信する機 能 空間情報保持: ロボットの移動に応じて,必要な空間情報を保持する機能 各機能が,サーバとクライアントのどちらで実現されるかは,ロボットの性能やアプリ ケーションに依存します.また,各機能モジュール間やロボット間で送受されるマップは, ベースマップ,環境(センサ)マップ,フィールドマップ,ロボットマップ(人間向けに はグラフィカルマップ)に分類することができます. (図 2) . 図 2 R-GIS で扱う地図の種類 また,皆さんご存知のように,ロボットの動作制御では,いくつかの座標系を設定する 必要があります(図 3) .移動ロボットの場合は,ロボットの作業空間を定めるワールド座 標系と,ロボットを中心としたロボット座標系です.この他,作業移動型ロボットの場合 は,ツール座標系や対象物毎の座標系もあります.一方,これらのローカルな座標系に対 し,グローバルな座標系としては,測地学の分野において公共座標系として GPS 等で一 般化的している WGS84 測地系に準拠した経緯度座標系や,日本国が定める平面直角座標 系(19 座標系)などの地理座標系があります.図 3 は,これらの間の関係を示したもので す.なお,図中の CS (Coordinate System) は,座標系(座標軸と距離単位からなる数学的 に定義された座標),CRS は,座標参照系(CS と地球の表面の座標と結びつけるためのも の)を意味しています.これらの接尾語は,R-GIS を間違いなく使うために重要ですので, 覚えておいてください. 図 3 Geographic, World and Local Coordinate System 上記のように様々な座標系が考えられますが,地理空間情報をシームレスにつなげるた めには,各空間情報はグローバルな座標系で表わされる必要があります.一方,人間が情 報を取り扱う場合は,身近な地物を基準としたローカルな座標系を用いることが多いです ね.ロボット作業座標系も,GPS の普及による経緯度座標系を除いて,ほぼ同様です. GIS とロボットを取り巻く環境情報を統合するためには,どこで演算を行うかは様々な手 法が考えられるものの,少なくとも,ローカルな座標系とグローバルな座標系を簡単に変 換できなければならないでしょう. 座標変換自体は,ワールド座標系に地理座標系への参照情報(CRS 情報)を付加するこ とで位置座標の変換を行う仕組みで,これらを組み合わせた単純なものです.ただし,ロ ボットで用いる場合は,以下の事項を考えるべきでしょう.この詳細については,R-GIS 応用編で説明できればと考えています. 座標系に関するパラメータ(軸や原点)の変化(動的な座標系か否か) 座標系の永続性(一時的な座標系か否か) 座標系の識別手法 座標系の管理手法と管理の粒度 座標系間の相互変換 座標変換に要する計算時間 第 2 章 準備 本書では,R-GIS RTC とサンプル地図データ,および移動ロボットサンプルとしての レゴキットとその RTC を使用して,R-GIS の超簡単な機能を確認し,R-GIS を理解して もらうことを目的としています. 具体的な課題としては,RgisOperator を使って,GIS データから生成したポテンシャ ルグリッドによる最小コスト経路探索を行い,それに合わせて,移動ロボットを動作させ る,というものです. 第 3 章以降から,それぞれの RTC 群を順次,使用していきますが,ここでは,まず, その準備をします. 2.0 動作環境 OS:Windows VISTA Home Premium(32 ビット) Windows XP Proffesional(32 ビット) Winodws 7 Proffesional (32 ビット) RT ミドルウェア:OpenRTM-aist C++版 0.4.2,python 版 0.4.1, JAVA 版 0.4.2 開発環境:Microsoft Visual Studio 2008, Python 2.5, JDK 1.5.0.22 (OpenRTM-aist は JDK 1.6 をサポートしていません) RTSystemEditor for OpenRTM-aist 0.4.2 2.1 インストール 【RT ミドルウェアのインストール】 先ず,RT ミドルウェア(RTM)をインストールしましょう.RT ミドルウェアを利用する ためには,使用するプラットフォームや,RT ミドルウェアの実行に必要な各種ソフトウ ェアのパッケージをインストールする必要があります. 利用プラットフォームには,Windows 版や Linux 版がありますが,この教科書では, 入門編ということで,皆さんが日常よく使われている Windows/C++/JAVA/PYTHON 版を 使うことにします.また,現時点で,OpenRTM-aist の最新バージョンは,1.0 ですが, これまでの開発の経緯から,本書では,0.4.2 で記述します. さて,RTM のインストール方法については, OpenRTM-aist 公式ホームページ: http://www.openrtm.org/OpenRTM-aist/html/ [ダウンロード]→[過去のバージョン]→[C++]→"OpenRTM-aist-0.4.2-RELEASE"(Visual Studio 2008 用)をダウンロードして下さい. 【外部ライブラリのセットアップ】 OpenCV のインストール: OpenRTM-aist のホームページのインストールマニュアルに従って,OpenCV 1.0 をイ ンストールしておいてください. FWTools のインストール: FWTools で,GIS 関連の主要なオープンソースソフトウェア・ライブラリをまとめて インストールできます. (FWTools ホームページ http://fwtools.maptools.org/) (1)FWTools 2.4.3 (Windows 32bit) セットアッププログラムをダウンロードします. http://home.gdal.org/fwtools/FWTools243.exe (2)セットアッププログラムをダウンロードして実行します. (3)環境変数を設定します.¥data 以前は,インストール先に応じて変えてください. 変数:GDAL_DATA 値:"C:¥Program Files¥FWTools2.4.3¥data" (4)インストール先の bin¥proj.dll を同じフォルダ内にコピーして,proj_fw.dll とい うファイル名にしてください. 【R-GIS サンプルツールキット(コンポーネント)のインストール】 本書に付属のパッケージ「Rgis.zip」をインストールします.このファイルを展開後, C:¥ にコピーを行って下さい. フォルダー構成は, C:¥Rgis¥binary ¥RgisOperatorTest20090924 となります. 必要なコンポーネント RgisOperatorComp ActionPlanningRTCComp LocalPathPlanningRTCComp LegoMotorControlComp LegoControllerComp MapManagementRTCComp GlobalPathPlanningRTCComp LocalizationDataDistributerRTCComp LegoManagerComp SelfLocalizationComp 【LEGO NXT に関係するセットアップ】 このテキストで使用するレゴは,「教育用レゴ マインドストーム NXT 基本セット 9797」です.教育用レゴには,電源として電池の代わりに充電バッテリーが付属していま すが,充電用のアダプターは別売りです.「教育用レゴ AC アダプター(NXT 用) 」を追 加で購入すると良いでしょう.レゴに関する市販のソフトウェア(教育用レゴ NXT ソフ トウェアなど)は不要です.また,パソコン側には,レゴとの通信手段として, Bluetooth が必要になります. (参考) 「玩具用レゴ マインドストーム NXT」でも動作します. http://www.afrel.co.jp/tech/otherqa.html レゴは,基本セットのサンプル通りに組み立てていきます.但し,右側のモータは A の コネクタに,左側のモータは C のコネクタに接続し,超音波センサは,3のコネクタに接 続します.タッチセンサは,使用しないため,接続をしなくても良いです. 図 レゴ 組み立て例 組み立てが終わりましたら,LEGO の公式ホームページにある USB driver(1.02 or later)をインストールしましょう(http://mindstorms.lego.com/enus/support/files/default.aspx#Driver) .インストール後,パソコンとレゴを USB ケーブ ルで接続をします. 図 LEGO MINDSTORM NXT USB Driver のインストール 図 LEGO と PC を USB で接続 次に,JDK 1.5.22 をインストールします( https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_DeveloperSite/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-1.5.0_22-oth-JPR@CDSCDS_Developer) .既に,OpenRTM-aist の JAVA のインストールマニュアルで,1.5.15 をインストールされている方は,1.5.22 をインストールする必要はありません.ここでは, 表の通り,いくつかの環境変数を設定します.自分のパソコンの環境を考慮して,値を変 更して下さい. 表 JAVA に関する環境変数の例 変数 値 PATH C:¥Program Files¥Java¥jdk1.5.0_22¥bin を追加 JAVA_HOME C:¥Program Files¥Java¥jdk1.5.0_22 RTM_JAVA_ROOT C:¥Program Files¥OpenRTM-aist¥0.4 CLASSPATH .; C:¥Program Files¥OpenRTM-aist¥0.4¥jar¥OpenRTM-aist0.4.2.jar; C:¥Program Files¥OpenRTM-aist¥0.4¥jar¥commonscli-1.1.jar 次に,LEJOS 0.85 をインストールします.LEGO と PC は USB で接続したままの状態 で,セットアップを行って下さい. 図 LEJOS セットアップ 1 図 LEJOS セットアップ 2 図 LEJOS セットアップ 3 図 LEJOS セットアップ 4 図 LEJOS セットアップ 5 図 LEJOS セットアップ 6 図 NXT の接続確認 図 「はい」を選択 図 ファームウェアの書き換え中 図 「いいえ」を選択する 次に,Bluetooth の設定を行います.接続に関する注意点は,LEGO の公式ホームペー ジ を 参 考 に し て 下 さ い (http://mindstorms.lego.com/en-us/bluetooth/default.aspx) . Windows 標準のデバイスドライバを必ず使用するようにして下さい.Windows7 で, Cambridge Silicone Radio (CSR)社の USB ドングルを使ったインストール例を挙げます. まず,LEJOS をインストールしたレゴの電源を入れます.NXT がスリープしないよう に設定を行っておくと安心です.ドングルに付属するドライバ類は,一切,インストール しないで下さい.まず,USB ドングルを Windows の USB ポートに指します.そうす ると,自動的にドライバがインストールされます.ドライバがインストールされると,自 動的に「デバイスの追加」が開きます.ここに「NXT」が現れるので,NXT を指定して, 次をクリックします.続いて,ペアリングコードの入力が求められるので,必ず「123 4」を入力して下さい.そうするとペアリングが終了し,レゴと通信が可能になります. 図 Windows 標準のドライバがインストールされる 図 デバイスの追加 図 ペアリングコード「1234」を入力 図 Bluetooth 接続のプロパティ画面 2.2 サンプル環境(地図) サンプル地図データとして,障害物データを1種類,コストデータを1種類,用意して います.身近さと縮尺の問題がありますが,今回は,移動ロボット研究者にとってよく知 られている,つくば市中央公園の地図データをモデルに,作成,準備しています. 座標系:平面直角座標系 第 9 系(世界測地系)JGD2000 CS IX EPSG:2451 格納形式:ESRI Shapefile (Cost.shp, Wall.shp など) ※ Shapefile 形式は,.shp(形状), .shx(インデックス), .dbf(属性), .prj(空間参照) など複数のファイルで構成されます. 図○.サンプル GIS データ ファイル名 形状 内容 obstacles_pt.shp ポイント レーザーレンジファインダなどで検出 した障害物(点) obstacles_ln.shp ライン 段差などの障害物(線) floor_1F_wall.shp ポリゴン 建物の壁などの障害物(面) floor_1F_cost.shp ポリゴン 移動コスト ・floor_1F_cost の数値はコスト値 ・青枠線はグリッド生成範囲 (x=XXXXX, y=-YYYYY) (x=XXXXX, y=-YYYYY) 2.3 サンプルロボット 接続するロボットサンプルとしては,LEGO 社の MINDSTORM NXT 基本セットを利 用します. 第 3 章 R-GIS サーバ 3.1 RgisOperator RTC RgisOperator は,GIS(Geographic Information System:地理情報システム)による各 種地理空間データ処理サービスを提供する RT コンポーネント(RTC)である. 位置情報や環境情報(ランドマークの位置,障害物の分布,行動範囲,路面状態の区分な ど)を,地理座標系を持つ空間データ(フィーチャ:ベクタ形式の形状データ+属性デー タ,グリッド:ラスタ形式のデータ)として重層的に管理し,経路探索,ロボット位置記 録などの移動ロボット向けサービスを提供する. 図 2-1 RgisOperator の位置づけ RgisOperator の仕様 RT コンポーネントの基本情報 Module name RgisOperator Module description RgisOperator Module version 1.0.0 Module vender R-GIS Module category R-GIS Component type STATIC Component’s activity type PERIODIC Component kind Data Flow Number of maximum instance 5 Execution type PeriodicExecutionContext Execution rate 1.0 Rgis MapService Operator RouteService TrackLogService PlottingService RT コンポーネントのアクティビティ アクティビティ 実行する処理 on_initialize GIS ライブラリの初期設定 on_finalize GIS ライブラリの解放 on_activated RgisOperator 設定ファイル(プロジェクトデータ)の読み込 み on_deactivated プロジェクトデータの解放 on_execute 何もしない InPort(データ入力ポート) なし OutPort(データ出力ポート) なし サービスポート(Provider) Port Name Instance Type Instance Name Type Name MapServicePort RGIS::RTComp::MapService MapService MapService RouteServicePort RGIS::RTComp::RouteService RouteService RouteService TrackLogServicePort RGIS::RTComp::TrackLogService TrackLogService TrackLogService PlottingServicePort RGIS::RTComp::PlottingService PlottingService PlottingService MapServicePort RgisOperator 設定ファイルに記述されたマップやレイヤ情報の取得,フィ ーチャの空間検索・属性検索,フィーチャ→ラスタ変換,測地座標系変 換,空間データのファイル出力など,基本的な GIS サービスを提供する. RouteServicePort 経路探索に関連するサービス(ポテンシャルグリッド生成,最小コスト経路 探索など)を提供する. TrackLogServicePort ロボットの位置情報を空間データベースに記録する. PlottingServicePort 環境情報(観測対象の位置など)を空間データベースに記録する. サービスポート(Consumer) なし コンフィギュレーション パラメータ名 データ型 内容 ProjectFilePath String RgisOperator 設定ファイル(.xml)の絶対パス TemporalDirectory String 一時ディレクトリ RgisOperator 設定ファイル RgisOperator で使用するマップや経路探索用パラメータなどの各種設定を XML 形式で記 述した「RgisOperator 設定ファイル」を作成し,このファイルのパスを RT コンポーネン トのコンフィギュレーション"ProjectFilePath"で指定する. 主な設定事項(詳細やサンプルは後述) 各種サービスの設定 RouteService などのサービスの実行に必要な設定を記述する. マップの設定 RgisOperator からアクセスする各種空間データソースを,マップ内の各レイヤとして登録 する. 座標参照系の設定 RgisOperator で取り扱う各種空間データの座標参照系を登録する.座標参照系を変換する 際に必要となる. サービス定義: RGIS::RTComp::MapService boolean getMapInfo(out RGIS::Geo::MapInfoC mapInfo) RgisOperator設定ファイルで設定されたマップ情報を取得する. [引数] • mapInfo:結果として返されるマップ情報 [戻り値]取得の成否 boolean getLayerInfoByName(out RGIS::Geo::LayerInfoC layerInfo, in string layerName) RgisOperator設定ファイルで設定されたレイヤ情報を取得する. [引数] • layerInfo:結果として返されるレイヤ情報 • layerName:対象レイヤ名 [戻り値]取得の成否 boolean addFeature(in string layerName, in RGIS::Geo::FeatureC feature) フィーチャレイヤにフィーチャを追加する [引数] • layerName:対象レイヤ名 • feature:追加するフィーチャ [戻り値]追加の成否 boolean getFeature(out RGIS::Geo::FeatureC feature, in string layerName, in long idx) フィーチャレイヤからフィーチャを取得する [引数] • feature:結果として返されるフィーチャ • layerName:対象レイヤ名 • idx:フィーチャのインデックス番号 [戻り値]取得の成否 boolean queryFeatures(out RGIS::Geo::FeaturesC features, in string layerName, in string whereClause) フィーチャレイヤからフィーチャを属性データで検索する [引数] • features:結果として返されるフィーチャ群 • layerName:対象レイヤ名 • whereClause:検索式(SQL WHERE 文) [戻り値]検索の成否 boolean getFeaturesAt(out RGIS::Geo::FeaturesC features, in string layerName, in PntC pt, in double tolerance) フィーチャレイヤから,指定した位置にあるフィーチャを取得する.点レイヤの場合は,指定位置か らtorelance内の距離にあるフィーチャを検索する. [引数] • features:結果として返されるフィーチャ群 • layerName:対象レイヤ名 • pt:位置 • tolerance:検索半径 [戻り値]検索の成否 boolean getGridData(out RGIS::Geo::GridC gridData, in string layerName); ラスタレイヤからグリッドデータを取得する [引数] • gridData:結果として返されるグリッドデータ • layerName:対象レイヤ名 [戻り値]取得の成否 boolean createGridFromFeatureLayer(out RGIS::Geo::GridC gridData, in string layerName, in RGIS::Geo::GridInfoC gridInfo, in string fieldName, in double fixedValue, in double bgValue) フィーチャレイヤからグリッドデータを生成する [引数] • gridData:結果として返されるグリッドデータ • layerName:対象レイヤ名 • gridInfo:グリッドのセルサイズ等の設定 • fieldName:フィーチャが存在する領域のセル値を属性値から設定する場合,属性名を指定する • fixedValue:フィーチャが存在する領域のセル値を一定値にする場合,そのセル値を指定する • bgValue:フィーチャが無い背景領域のセル値 [戻り値]生成の成否 boolean exportToFile(in string layerName, in string filePath, in string sourceType, in string options) フィーチャレイヤをファイルに出力する.メモリレイヤに一時的に蓄積されたフィーチャを保存する 場合などに使用. [引数] • layerName:対象レイヤ名 • filePath:出力するファイルの絶対パス • sourceType:出力形式.GDAL/OGR で定義されている対応フォーマットの名称で指定する. • options:出力オプション.GDAL/OGR で定義されている出力オプションパラメータで設定する. [戻り値]出力の成否 boolean exportToFileWithQuery(in string layerName, in string filePath, in string sourceType, in string options, in string whereClause); フィーチャレイヤから属性データで検索したフィーチャをファイルに出力する. [引数] • layerName:対象レイヤ名 • filePath:出力するファイルの絶対パス • sourceType:出力形式.GDAL/OGR で定義されている対応フォーマットの名称で指定する. • options:出力オプション.GDAL/OGR で定義されている出力オプションパラメータで設定する. • whereClause:検索式(SQL WHERE 文) [戻り値]出力の成否 boolean projectPoint(out PntC resultPt, in PntC sourcePt, in string crsFrom, in string crsTo) 点をある座標系から別の座標系に座標変換する.座標系はproj4形式のパラメータ文字列で指定する. [引数] • resultPt:結果として返される変換後の座標 • sourcePt:変換元の座標 • crsFrom:変換元の座標参照系 • crsTo:変換先の座標参照系 [戻り値]変換の成否 boolean projectPointByName(out PntC resultPt, in PntC sourcePt, in string crsNameFrom, in string crsNameTo) 点をある座標系から別の座標系に座標変換する.座標系はRgisOperator設定ファイルで設定した名称 で指定する. [引数] • resultP:結果として返される変換後の座標 • sourcePt:変換元の座標 • crsFrom:変換元の座標参照系の名称 • crsTo:変換先の座標参照系の名称 [戻り値]変換の成否 boolean exportGridToTiff (in RGIS::Geo::GridC grid, in string filePath) グリッドデータを GeoTIFF(位置情報付き TIFF ファイル)に出力する. [引数] • grid:出力するグリッド • filePath:出力するファイルの絶対パス(.tif) [戻り値]出力の成否 boolean exportGridToJpeg (in RGIS::Geo::GridC grid, in string filePath, in long quality, in boolean withWorldFile) グリッドデータをJPEGファイルに出力する. [引数] • grid:出力するグリッド • filePath:出力するファイルの絶対パス(.jpg) • quality:出力する jpeg 画像の品質(10~100 の間の数値) • withWorldFile:true にすると,位置情報(.wrl ファイル)も出力する. [戻り値]出力の成否 void setMapExtent(in BoxC ext) グリッドマップのデフォルトの範囲を設定する. [引数] • ext:マップの範囲 RGIS::RTComp::RouteService long createCostGrid(out RGIS::Geo::GridC resultGrid, in BoxC extent) RgisOperator 設定ファイルで指定したフィーチャレイヤから,コストグリッドを生成する. [引数] • resultGrid:結果として返されるコストグリッド • extent:生成するグリッドの範囲.縦または横のサイズが 0 になる場合は,デフォルトの範囲を 使用する. [戻り値]結果パラメータ.成功の場合は 0 を返す. long createObstacleGrid(out RGIS::Geo::GridC resultGrid, in BoxC extent) RgisOperator 設定ファイルで指定したフィーチャレイヤから,障害物グリッドを生成する. [引数] • resultGrid:結果として返される障害物グリッド • extent:生成するグリッドの範囲.縦または横のサイズが 0 になる場合は,デフォルトの範囲を 使用する. [戻り値]結果パラメータ.成功の場合は 0 を返す. long createPotentialGrid(out RGIS::Geo::GridC resultGrid, in PntC destinationPt, in BoxC extent) RgisOperator 設定ファイルで指定したフィーチャレイヤから,目的地までの移動ポテンシャルグリッ ドを生成する. [引数] • resultGrid:結果として返されるポテンシャルグリッド • destinationPt:目的地の座標(extent の内部に設定すること) • extent:グリッドを生成する範囲 [戻り値]結果パラメータ.成功の場合は 0 を返す. long createPotentialGridByGrid(out RGIS::Geo::GridC resultGrid, in RGIS::Geo::GridC costGrid, in RGIS::Geo::GridC obstacleGrid, in PntC destinationPt) 障害物グリッドとコストグリッドを使って,目的地までの移動ポテンシャルグリッドを生成する.(各 種設定については,別記 RgisOperator 設定ファイル仕様を参照) [引数] • resultGrid:結果として返されるポテンシャルグリッド • costGrid:コストグリッド • obstacleGrid:障害物(進入禁止)グリッド • destinationPt:目的地の座標(extent の内部に設定すること) [戻り値]結果パラメータ.成功の場合は 0 を返す. long getShortestPathFromGrid(out RGIS::Geo::LineStringC routeOut, in RGIS::Geo::GridC potentialGrid, in PntC fromPt) ポ テ ン シ ャ ル グ リ ッ ド を 使 っ て 最 小 コ ス ト 経 路 を 探 索 す る .( 各 種 設 定 に つ い て は , 別 記 RgisOperator 設定ファイル仕様を参照) [引数] • routeOut:結果として返される経路のノード • potentialGrid:探索に使うポテンシャルグリッド • fromPt:出発地の座標 [戻り値]結果パラメータ.成功の場合は 0 を返す. long getNetworkRoute(out RGIS::Geo::LineStringC resultNodes, in PntC fromPt, in PntC toPt) ネットワークデータから経路を探索する. (ネットワークデータの格納と処理のため pgRouting による ネットワークデータベース構築が必要. ) [引数] • resultNodes:結果として返される経路(折れ線) • fromPt:出発地の座標 • toPt:目的地の座標 [戻り値]結果パラメータ.成功の場合は 0 を返す. RGIS::RTComp::RouteServiceInfoC getRouteServiceInfo() 経路サービス情報を取得する [戻り値]経路サービス情報 void setRouteServiceInfo(in RGIS::RTComp::RouteServiceInfoC info) 経路サービス情報を設定する [引数] • info:経路サービスの設定情報 RGIS::RTComp:: TrackLogService boolean saveLocation(in LocationC loc) ロボット等の位置・姿勢などを空間データベースに追加する.追加先などは RgisOperator 設定ファイ ルで設定しておく. [引数] • loc:ロボットの位置情報 [戻り値]追加の成否 RGIS::RTComp:: PlottingService boolean saveObjectLocation(in string layerName, in LocationC loc) 観測対象物等の位置・姿勢などを空間データベースに追加する.保存先などはプロジェクトファイル で設定する. [引数] • layerName:追加先のレイヤ名 • loc:対象物の位置情報 [戻り値]追加の成否 対応する空間データフォーマット フィーチャデータ ESRI Shapefile(広く使われている GIS データ格納形式) PostGIS(PostgreSQL の GIS データ拡張) メモリ(RT コンポーネントが Active 状態のときのみ.一時データ用) グリッドデータ GeoTIFF(位置情報付き TIFF) 必要な外部ライブラリ FWTools 2.4.7 GIS ライブラリ http://fwtools.maptools.org/ (1)Web サイトからセットアッププログラムをダウンロードして実行する. (2)下記のように環境変数を設定する.\data 以前はインストール先に応じて 変更する. 変数:GDAL_DATA 値:”C:\Program Files\FWTools2.4.7\data” (3)インストール先の bin\proj.dll を同じフォルダ内にコピーして,proj_fw.dll というファイル名にする. OpenCV 1.0 画像処理ライブラリ http://sourceforge.net/projects/opencvlibrary/ RgisOperator のファイル構成 ・ クライアント RTC 開発用 RgisCommon.idl RgisGeo.idl RgisOperator.idl ・ 実行ファイル群 RgisOperatorComp.exe(RgisOperator RTC の本体) R-GIS 内部ライブラリの dll 群 ・ 設定ファイル群 (ユーザが編集) rtc.conf(RT コンポーネント動作設定ファイル) RgisOperatorRTC.conf(RgisOperatorRTC コンフィギュレーションファイル) ←rtc.conf で指定した場所に格納 rgis_project.xml(RgisOperator 設定ファイル)←RgisOperatorRTC.conf または RTC インスタンスの ProjectFilePath コンフィギュレーションで指定した場所 に格納 RgisOperator RTC によるポテンシャルグリッド経路探索 ポテンシャルグリッドによる最小コスト経路探索 RgisOperator の RouteService が 提 供 す る サ ー ビ ス createPotentialGrid() や getShortestPathFromGrid()によって,障害物グリッドと移動コストグリッドから生成し た目的地までのポテンシャルグリッド(累積コストグリッド)を使って,グリッド内のあ る地点から目的地までの最小コスト経路探索を行う. 障害物フィーチャレイヤ (建物形状) 移動コストフィーチャレイヤ RgisOperator RTC ソースグリッド 障害物グリッド 移動コストグリッド ポテンシャルグリッド・経路探索 図 街区レベルの建物形状データを用いてグリッドマップ生成・経路探索を実行した例 (1)障害物フィーチャレイヤ(茶: 壁,紫:板,赤:物体)と,移動コス トフィーチャレイヤ(水色) (2)障害物グリッド(厚み有) (3)コストグリッド [RouteService 設定] 出発地 (x=16905, y=-34540) 目的地 (x=16913, y=-34581) cellSize = 0.2 bufferSize = 0.4 routeTolerance = 0 withObstacleThickening = 1 目的地 (4) ソ ー ス グ リ ッ ド ( バ ッ フ ァ (5)ポテンシャルグリッド 有) 出発地 目的地 (6)経路探索結果 (7)経路線 (1)と重ねてみたもの (8)拡大図 経路の単純化なし 図 屋内データを用いてグリッドマップ生成・経路探索を実行した例 障害物グリッド 壁や危険箇所など,進入不可能な領域をグリッドマップで設定する. RgisOperator 設定ファイルで rgis:obstacleLayerName を指定すれば,そのフィーチャレ イヤから障害物グリッドが自動生成される.指定されていない場合は,障害物がないもの として処理される. レーザレンジファインダなどで検出した障害物(点),段差等の障害物(線),壁や柱等の 障害物(面)など,複数の障害物フィーチャレイヤを登録できる. 移動コストグリッド 移動にかかるコストの分布をグリッドマップで設定する.移動しにくいところや避けたい 領域などに,1~254 の整数でコスト値を与える.値が大きいほどコストが大きくなる.デ フォルト値は1. RgisOperator 設定ファイルで rgis:costLayerName を指定すれば,そのレイヤから移動コ ストグリッドが自動生成される.各コスト領域フィーチャには,rgis:costFieldName で指 定する属性フィールドに 1~254 の整数でコスト値を設定しておく.その他領域のコスト 値 は rgis: defaultCostValue で 設 定 す る ( デ フ ォ ル ト の コ ス ト 値 は 1 ). rgis:costLayerName が指定されていない場合は,全セルにデフォルトのコスト値が設定 されたグリッドが生成される. ソースグリッド 移動コストグリッドに障害物位置を描画したもの.RgisOperator 内部で処理される. 経路が障害物にぶつからないように,RgisOperator 設定ファイルの rgis:bufferSize で, 障害物の周囲に座標系の単位で緩衝幅(バッファ)を指定できる.バッファが不要な場合 は 0 にする.バッファ領域には,移動コスト 254 が与えられる. ポテンシャルグリッド ソースグリッドの障害物以外の各セルについて,目的地に位置するセルからの累積移動コ ストを計算したもの.createPotentialGrid()の結果として取得できる. in:障害物グリッド データ型 セルの データ型 セル値 注意点 in:移動コストグリッド RGIS::Geo::GridC unsigned char 符号無し 8 ビット整数 0: 背景 1~254: コスト値 255: 障害物 (デフォルトは 1) (0, 255 は設定不可) 縦・横のセル数,セルサイズ,グリッドの位置いずれも同 一であること. out:ポテンシャルグリッド double 倍精度浮動小数点数 0: 目的地 0<x<double の最大値: 累積コスト値 double の最大値: 障害物 セル数などは移動コストグリッドと同一 最小コスト経路探索 • ポテンシャルグリッド内のあるセルから,隣接する値が最も小さいセルを辿っていく と,最小コスト経路が生成される. • ポテンシャルグリッドから求められた最小コスト経路は,折れ線(点列)データと して返される.縦横方向に直進する区間以外はセルの中心ごとに頂点が与えられる ので,斜め方向に進む箇所は頂点が多くなってしまう.そこで,RgisOperator 設定フ ァイルの rgis:routeTolerance に 0 を超える距離を設定すれば,その距離ごとに頂点を 置くように経路を単純化することができる.ただし,あまり大きな値にすると,経 路が単純化されすぎて障害物と重なってしまう恐れがある.セルサイズの 2 倍程度 で試してみること. • グリッドの範囲外や,障害物が存在するセルからは経路探索できない. RgisOperator のポテンシャルグリッド経路探索の利用手順 (1) GIS アプリケーション等で,ロボットの移動領域の空間データを作成する. 障害物フィーチャレイヤ: 障害物や立ち入り禁止区域など,移動できない領域をポリゴンで描画する.このポリゴン に重なるセルは,移動コスト計算から除外される. 移動コストフィーチャレイヤ: ロボットが移動できる領域において,移動コスト別にポリゴンを描画し,属性情報として 1(低)~254(高)の整数でコスト値を設定する. (2) RgisOperator 設定ファイルを準備する. rgis:map に(1)で作成したデータをレイヤとして登録する. rgis:routeService を設定する.(グリッドのセルサイズやセル個数,障害物の周りに設け るバッファの指定など) (3) RgisOperator RTC を利用するクライアント RTC を作成する. RgisOperator RTC の RouteService ポートにサービスコンシューマとして接続する RTC (クライアント RTC)を作成する. (4) クライアント RTC から経路探索サービス(メソッド)を利用する. まず,指定範囲における目的地までのポテンシャルグリッドを createPotentialGrid()で生 成する.(extent の縦または横の距離が 0 になる場合は,RgisOperator 設定ファイルの rgis:map/rgis:extent の設定が適用される. ) 生成したポテンシャルグリッドを用いて,getShortestPathFromGrid ()で,ある地点から の経路を求める. RgisOperator 設定ファイル XML 定義 ※中列の記号:(1)必ず 1 回だけ出現,(?)0 回か 1 回出現,(+)1 回以上出現,(*)0 回以上出 現 rgis:project 要素 rgis:robotInfo rgis:routeService rgis:trackLogService rgis:plottingService rgis:map rgis:crsList rgis:robotInfo(1) rgis:routeService(?) rgis:trackLogService(?) rgis:plottingService(?) rgis:map(1) rgis:crsList(?) ロボットの情報 経路探索サービスの設定 ロボット軌跡記録サービスの設定 対象物位置記録サービスの設定 マップの設定 座標参照系の登録 rgis:robotInfo 属性 rgis:id rgis:name 要素 rgis:bodySize string(1) string(1) ロボットの ID ロボットの名称 float(?) ロボット本体の平面サイズ(直径) rgis:routeService 要素 rgis:obstacleLayerName string(?) rgis:costLayerName string(?) rgis:costFieldName string(?) rgis:bufferSize float(?) rgis:cellSize float(1) rgis:routeTolerance float(?) rgis:withObstacleThickening int(?) 0 or 1 rgis:defaultCostValue int(?) 1<=n<=254 障害物フィーチャレイヤの名称.","で区 切って複数レイヤを指定可能. 移動コストフィーチャレイヤの名称(指 定できるレイヤは 1 つのみ) 移動コスト値を格納している属性フィー ルド名 障害物の周囲に設定する緩衝幅の半径.0 にすると,緩衝帯を生成しません.デフ ォルトは 0 経路探索処理で使うグリッドのセルサイ ズ.縦横同じサイズ. 経路探索結果の折れ線の頂点の間隔.頂 点を間引く際に使用.間引かない場合は 0 を設定.デフォルトは 0 小さい・細い障害物の形状を確実にグリ ッドマップ化するために厚みを持たせる かどうか.0 の場合は何もせず,1 の場合 は厚みを持たせる. デフォルトの移動コスト値.デフォルト は 1. rgis:networkService 要素 rgis:arcLayerName rgis:arcIdFieldName string(1) string(1) rgis:costFieldName string(1) rgis:sourceNodeIdFieldName string(1) rgis:targetNodeIdFieldName string(1) rgis:arcFilter string(1) rgis:nodeLayerName rgis:nodeIdFieldName string(1) string(1) rgis:nodeBufferRadius rgis:routeTolerance float(?) float(?) アークレイヤ名 アーク ID を格納している属性フィールド 名 アークの移動コスト値を格納している属性 フィールド名 アークの始点ノード ID を格納している属 性フィールド名 アークの終点ノード ID を格納している属 性フィールド名 使用するアークを属性検索で抽出する場 合,条件を SQL Where 文で指定. ノードレイヤ名 ノード ID を格納している属性フィールド 名 出発地や目的地の最寄りノードの検索半径 経路探索結果の折れ線の頂点の間隔.頂点 を間引く際に使用.間引かない場合は 0 を 設定.デフォルトは 0 rgis:trackLogService 要素 rgis:layerName rgis:idFieldName rgis:timeStampFieldName rgis:rollFieldName string(1) string(1) string(?) string(?) rgis:pitchFieldName string(?) rgis:yawFieldName string(?) ロボット位置情報を記録するレイヤ名 ロボット ID を記録する属性フィールド名 時間を記録する属性フィールド名 姿勢情報(roll)を記録する属性フィールド 名 姿勢情報(pitch)を記録する属性フィールド 名 姿勢情報(yaw)を記録する属性フィールド名 rgis:plottingService 要素 rgis:layerName rgis:idFieldName rgis:timeStampFieldName rgis:geometryType string(1) string(1) string(?) string(1) 対象物の位置情報を記録するレイヤ名 対象物の ID を記録する属性フィールド名 時間を記録する属性フィールド名 地 物 形 状 の タ イ プ ( 面 :Polygon , 線:LineString,点:Point) string(1) マップの名称 string(?) マップ全体の座標参照系(ワールド座標系) の名称 rgis:crsList に 登 録 し た rgis:crs の rgis:map 属性 rgis:name 要素 rgis:crsName rgis:extent rgis:layers float(minX,minY,minZ,maxX , maxY, maxZ) (?) rgis:layers (?) rgis:name を設定する. マップの範囲をワールド座標系で記述する. グリッド範囲のデフォルト値となる. レイヤの登録 rgis:layers 要素 rgis:layer rgis:layer(*) レイヤ情報 属性 rgis:id rgis:name string(1) string(1) レイヤの ID レイヤの名称. シェープファイルの場合はファイル名から 拡張子(.shp)を除いたものを記述するこ と. PostGIS の場合は,テーブル名を記述する こと. 要素 rgis:layerType string(1) rgis:crsName rgis:attributeFilter rgis:openMode string(?) string(?) string(?) rgis:dataSource rgis:dataSource(1) レ イ ヤ の 種 別 ( 面 : Polygon , 線 : LineString,点:Point,ラスタ:Raster) このレイヤの座標参照系の名称 フィーチャ抽出用の属性フィルタ文字列 レイヤデータへの接続元の設定(サーバか ら接続:Server,クライアントから接続: Client) データソースの設定 rgis:layer rgis:dataSource 属性 rgis:name 要素 rgis:source (1) データソースの名称 string(?) データソースの接続先を GDAL/OGR 形式で 記述 (シェープファイルの場合は.shp への絶 対パス,PostGIS の場合はデータベースへ の接続文字列) データソースの種別を GDAL/OGR のフォー マットコードで記述 (シェープファイル:ESRI Shapefile, PostGIS:PostgreSQL,メモリ:Memory, など) データソース接続時のオプション設定文 字列.設定は OGR に準拠. レイヤが更新可能かどうか(不可:0,可 能:1) ベクタデータソースの設定.(ベクタ形式 の場合のみ) rgis:sourceType string(?) rgis:option string(?) rgis:updatable int(?) rgis:vectorDataSource rgis:vectorDataSource(?) rgis:rasterDataSource rgis:rasterDataSource(?) ラスタデータソースの設定(ラスタ形式 の場合のみ) rgis:vectorDataSource 要素 rgis:geometryType string(1) ベクタ形式の地物の種別(面:Polygon, 線:LineString,点:Point) rgis:crs(*) 座標参照系 属性 rgis:name rgis:srid string(1) int(?) 座標参照系の名称 この座標参照系に該当する EPSG コード(該 当するコードがなければ空欄) 要素 crsParam string(?) 地図投影変換ライブラリ proj4 の形式で記 述された座標参照系パラメータ.(設定例は 別記3を参照) rgis:rasterDataSource 未定義 rgis:crsList 要素 rgis:crs rgis:crs RgisOperator 設定ファイル サンプル <?xml version="1.0" encoding="UTF-8"?> <rgis:project xmlns:rgis="http://www.engisinc.com/R-GIS"> <rgis:robotInfo rgis:id="Robot01" rgis:name="robo"> <rgis:bodySize>0.8</rgis:bodySize> </rgis:robotInfo> <rgis:routeService> <rgis:obstacleLayerName>buildings2</rgis:obstacleLayerName> <rgis:costLayerName>cost</rgis:costLayerName> <rgis:costFieldName>cost</rgis:costFieldName> <rgis:bufferSize>2</rgis:bufferSize> <rgis:cellSize>1</rgis:cellSize> <rgis:routeTolerance>2</rgis:routeTolerance> </rgis:routeService> <rgis:trackLogService> </rgis:trackLogService> <rgis:plottingService> </rgis:plottingService> <rgis:map rgis:name="Map0"> <rgis:crsName>JGD2000_02</rgis:crsName> <rgis:extent>-60761,65517,0,-60468,65851,0</rgis:extent> <rgis:layers> <rgis:layer rgis:id="1" rgis:name="cost"> <rgis:layerType>Polygon</rgis:layerType> <rgis:crsName>JGD2000_02</rgis:crsName> <rgis:attributeFilter></rgis:attributeFilter> <rgis:openMode>Server</rgis:openMode> <rgis:dataSource rgis:name="dsBase"> <rgis:source>D:\share3\R-GIS\simulation\momochi\cost.shp</rgis:source> <rgis:sourceType>ESRI Shapefile</rgis:sourceType> <rgis:option></rgis:option> <rgis:updatable>0</rgis:updatable> <rgis:vectorDataSource> <rgis:geometryType>Polygon</rgis:geometryType> </rgis:vectorDataSource> </rgis:dataSource> </rgis:layer> <rgis:layer rgis:id="2" rgis:name="buildings2"> <rgis:layerType>Polygon</rgis:layerType> <rgis:crsName>JGD2000_02</rgis:crsName> <rgis:attributeFilter></rgis:attributeFilter> <rgis:openMode>Server</rgis:openMode> <rgis:dataSource rgis:name="dsObst"> <rgis:source>D:\share3\R-GIS\simulation\momochi\buildings2.shp</rgis:source> <rgis:sourceType>ESRI Shapefile</rgis:sourceType> <rgis:option></rgis:option> <rgis:updatable>0</rgis:updatable> <rgis:vectorDataSource> <rgis:geometryType>Polygon</rgis:geometryType> </rgis:vectorDataSource> </rgis:dataSource> </rgis:layer> </rgis:layers> </rgis:map> <rgis:crsList> <rgis:crs rgis:name="WGS84" rgis:srid="4326"> <rgis:crsParams>+init=epsg:4326</rgis:crsParams> </rgis:crs> <rgis:crs rgis:name="JGD2000_02" rgis:srid="2444"> <rgis:crsParams>+init=epsg:2444</rgis:crsParams> </rgis:crs> <rgis:crs rgis:name="Momochi"> <rgis:crsParams>+proj=ortho +datum=wgs84 +y_0=0 +towgs84=0,0,0,0,0,0,0 +units=m</rgis:crsParams> </rgis:crs> </rgis:crsList> </rgis:project> +lat_0=33.59323500 +lon_0=130.35599500 +x_0=0 座標参照系(CRS)設定例 名称(任意) WGS84 rgis:crsParam(proj4 形式のパラメータ) +init=epsg:4326 JGD2000_deg +init=epsg:4612 JGD2000_01 +init=epsg:2443 JGD2000_02 +init=epsg:2444 JGD2000_03 +init=epsg:2445 JGD2000_04 JGD2000_05 +init=epsg:2446 +init=epsg:2447 JGD2000_06 +init=epsg:2448 JGD2000_07 +init=epsg:2449 JGD2000_08 +init=epsg:2450 JGD2000_09 +init=epsg:2451 JGD2000_10 +init=epsg:2452 JGD2000_11 +init=epsg:2453 JGD2000_12 +init=epsg:2454 JGD2000_13 +init=epsg:2455 JGD2000_14 +init=epsg:2456 JGD2000_15 JGD2000_16 +init=epsg:2457 +init=epsg:2458 JGD2000_17 +init=epsg:2459 JGD2000_18 +init=epsg:2460 JGD2000_19 sample01 +init=epsg:2461 +proj=tmerc +lat_0=33.59 +lon_0=130.35 +k=0. 999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84= 0,0,0,0,0,0,0 +units=m sample02 +proj=ortho +datum=wgs84 +lat_0=33.59 +lon_0 =130.35 +x_0=1.2 +y_0=3.1 +towgs84=0,0,0,0, 0,0,0 +units=m 備考・適用範囲 GPS などで用いられる一般的な 経緯度座標系 日本の世界測地系による経緯度 座標系.WGS84 と差はほとんど ない. 日本の世界測地系による平面直 角座標系第 1 系.公共測量に使 われる.単位はメートル.長崎 県,鹿児島県の一部. 平面直角座標系第 2 系.第 1 系 以外の九州. 平面直角座標系第 3 系.山口, 島根,広島 平面直角座標系第 4 系.四国 平面直角座標系第 5 系.兵庫, 鳥取,岡山 平面直角座標系第 6 系.京都, 大阪,福井,滋賀,三重,奈 良,和歌山 平面直角座標系第 7 系.石川, 富山,岐阜,愛知 平面直角座標系第 8 系.新潟, 長野,山梨,静岡 平面直角座標系第 9 系.東京, 福島,栃木,茨城,埼玉,千 葉,群馬,神奈川 平面直角座標系第 10 系.青森, 秋田,山形,岩手,宮城 平面直角座標系第 11 系.北海度 西部 平面直角座標系第 12 系.北海道 中部 平面直角座標系第 13 系.北海道 東部 平面直角座標系第 14 系.小笠原 諸島 平面直角座標系第 15 系.沖縄 平面直角座標系第 16 系. 先島 諸島 平面直角座標系第 17 系.南大東 島・北大東島 平面直角座標系第 18 系.沖ノ鳥 島 平面直角座標系第 19 系.南鳥島 任意の経緯度(北緯 33.59,東 経 130.35)を原点にした平面直 角座標系の例.原点から東西 130km までの範囲向け. 任意の経緯度(北緯 33.59,東 経 130.35)から西に 1.2m,南に 3.1m 平行移動したところを原点 にしたメートル単位の座標系の 例.数 km 程度の狭い領域向け. RgisOperator.idl #ifndef _RGIS_RGISOPERATOR_IDL #define _RGIS_RGISOPERATOR_IDL #include "RgisGeo.idl" module RGIS{ module RTComp{ struct RouteServiceInfoC{ //経路サービスの設定情報 sequence<string> obstacleLayerNames; //障害物レイヤ名 string costLayerName; //コスト領域レイヤ名 string costFieldName; //コスト値を格納した属性フィールド名 double bufferSize; //障害物の周りの緩衝域の幅 double routeTolerance; //経路折れ線を単純化する際のノード間許容距離 double cellSize; //セルサイズ boolean withObstacleThickening; //小さな障害物を確実にセル化するかどうか octet defaultCostValue; //デフォルトのコスト値 }; interface MapService{ boolean getMapInfo(out RGIS::Geo::MapInfoC mapInfo); boolean getLayerInfoByName(out RGIS::Geo::LayerInfoC layerInfo, in string layerName); boolean addFeature(in string layerName, in RGIS::Geo::FeatureC feature); boolean getFeature(out RGIS::Geo::FeatureC feature, in string layerName, in long idx); boolean queryFeatures(out RGIS::Geo::FeaturesC features, in string layerName, in string whereClause); boolean getFeaturesAt(out RGIS::Geo::FeaturesC features, in string layerName, in PntC pt, in double tolerance); boolean getGridData(out RGIS::Geo::GridC gridData, in string layerName); boolean createGridFromFeatureLayer(out RGIS::Geo::GridC gridData, in string layerName, in RGIS::Geo::GridInfoC gridInfo, in string fieldName, in double fixedValue, in double bgValue); boolean exportToFile(in string layerName, in string filePath, in string sourceType, in string options); boolean exportToFileWithQuery(in string layerName, in string filePath, in string sourceType, in string options, in string whereClause); boolean projectPoint(out PntC resultPt, in PntC sourcePt, in string crsFrom, in string crsTo); boolean projectPointByName(out PntC resultPt, in PntC sourcePt, in string crsNameFrom, in string crsNameTo); boolean exportGridToTiff(in RGIS::Geo::GridC grid, in string filePath); boolean exportGridToJpeg(in RGIS::Geo::GridC grid, in string filePath, in long quality, in boolean withWorldFile); void setMapExtent(in BoxC ext); }; interface RouteService{ long createCostGrid(out RGIS::Geo::GridC resultGrid, in BoxC extent); long createObstacleGrid(out RGIS::Geo::GridC resultGrid, in BoxC extent); long createPotentialGrid(out RGIS::Geo::GridC resultGrid, in PntC destinationPt, in BoxC extent); long createPotentialGridByGrid(out RGIS::Geo::GridC resultGrid, in RGIS::Geo::GridC costGrid, in RGIS::Geo::GridC obstacleGrid, in PntC destinationPt); long getNetworkRoute(out RGIS::Geo::LineStringC resultNodes, in PntC fromPt, in PntC toPt); long getShortestPathFromGrid(out RGIS::Geo::LineStringC routeOut, in RGIS::Geo::GridC potentialGrid, in PntC fromPt); RGIS::RTComp::RouteServiceInfoC getRouteServiceInfo(); void setRouteServiceInfo(in RGIS::RTComp::RouteServiceInfoC info); }; interface TrackLogService{ boolean saveLocation(in LocationC loc); }; interface PlottingService{ boolean saveObjectLocation(in string layerName, in LocationC loc); }; }; }; #endif RgisGeo.idl #ifndef _RGIS_GEO_IDL #define _RGIS_GEO_IDL #include "RgisCommon.idl" module RGIS{ module Geo{ struct AttributeC{ //属性情報 string name; //属性名 any value; //属性値 ValueTypeC::Code valType; //属性のデータ型 }; interface GeometryTypeC{ //地物形状の種別 enum Code{ rgisGeomUnknown, //不明 rgisGeomPoint, //ポイント(点) rgisGeomLineString, //ライン(線) rgisGeomPolygon, //ポリゴン(面) rgisGeomMultiPoint, //マルチポイント rgisGeomMultiLine, //マルチライン rgisGeomMultiPolygon, //マルチポリゴン rgisGeomGeometryCollection //集合 }; }; typedef PntC PointC; //形状(点) typedef sequence<PointC> LineStringC; //形状(線) typedef sequence<LineStringC> PolygonC; //形状(面) typedef sequence<PointC> MultiPointC; //形状(点群) typedef sequence<LineStringC> MultiLineC; //形状(線群) typedef sequence<PolygonC> MultiPolygonC; //形状(面群) union GeometryDataC switch (GeometryTypeC::Code) { //形状 case GeometryTypeC::rgisGeomPoint: PointC point; case GeometryTypeC::rgisGeomLineString: LineStringC linestring; case GeometryTypeC::rgisGeomPolygon: PolygonC polygon; case GeometryTypeC::rgisGeomMultiPoint: MultiPointC multi_point; case GeometryTypeC::rgisGeomMultiLine: MultiLineC multi_line; case GeometryTypeC::rgisGeomMultiPolygon: MultiPolygonC multi_polygon; }; struct GeometryC{ //空間図形 GeometryDataC geomData; CrsInfoC crsInfo; }; //形状 //空間参照系 struct FeatureC{ //フィーチャ GeometryC geometry; //空間図形 sequence<AttributeC> attrs; //属性情報 }; typedef sequence<FeatureC> FeaturesC; //フィーチャ群 struct GridInfoC{ //グリッド設定情報 long numCellsW; //横方向のセル数 long numCellsH; //縦方向のセル数 long numBands; //バンド数(=1 にしてください) ValueTypeC::Code valType; //セル値の型 double noDataVal; //NoData 値 boolean useNoData; //NoData 値を使うかどうか double valScale; //値のスケール(=1 にしてください) double cellWidth; //セル 1 つの幅 double cellHeight; //セル 1 つの高さ PntC position; //グリッド左上の位置座標 RotationC rotation; //グリッドの回転(=0 にしてください) CrsInfoC crsInfo; //空間参照系 }; struct GridC{ //グリッド GridInfoC info; //グリッド設定情報 sequence<octet> data; //グリッドデータ }; interface SpatialDataTypeC{ //空間データの種類 enum Code{ rgisSpatialDataUnknown, //不明 rgisSpatialDataFeature, //フィーチャデータ rgisSpatialDataRaster //ラスタデータ }; }; struct DataSourceInfoC{ //データソース情報 string name; //名称(DB の場合はテーブル名) string source; //データソースの場所(ファイルパス,DB 接続文字列) string option; //データソース接続時のオプション string sourceType; //データソースの種類(GDAL/OGR のデータフォーマットコード) SpatialDataTypeC::Code spatialDataType; //空間データの種類 boolean updatable; //更新可能かどうか RGIS::DB::FieldInfosC fields; //属性フィールド情報 }; struct FeatureDataSourceInfoC{ //フィーチャデータソース情報 DataSourceInfoC basicInfo; //基本情報 string geometryType; //形状の種類 boolean hasZ; //Z 値を持つかどうか }; struct RasterDataSourceInfoC{ //ラスタデータソース情報 DataSourceInfoC basicInfo; //基本情報 GridInfoC gridInfo; //グリッド設定情報 }; struct LayerInfoC{ //空間レイヤ情報 long index; //レイヤの順番 string name; //名称 long layerType; //レイヤの種類(0:不明,1:ポイント,2:ライン,3:ポリゴン,4:ラスタ) string attributeFilter; //属性情報でフィルタリングする際の文字列 any dataSourceInfo; //データソース情報 CrsInfoC crsInfo; //レイヤの空間参照系 long openMode; //データソースをどこで開くか(0:未定,1:クライアント側,2:サーバ側) }; struct MapInfoC{ //マップ情報 string name; //名称 sequence<LayerInfoC> layerInfos; //空間レイヤ情報群 BoxC extent; //デフォルトのマップ範囲 CrsInfoC crsInfo; //マップの空間参照系 }; struct GeoProjectC{ //プロジェクト情報 MapInfoC mapInfo; //マップ情報 }; }; }; #endif -------------以前の内容 begin --------------GIS の各種処理サービスを提供する RTC です.GIS データからポテンシャルグリッド を生成したり,最小コスト経路を求めたりします.RgisOperator 設定ファイルで,GIS データの格納先や経路探索パラメータを設定します.RTC のコンフィギュレーションで 一時ディレクトリを設定すれば,ポテンシャルグリッド生成の際に作成される障害物グリ ッドやコストグリッドを GeoTIFF ファイルとして保存できます. 表 Functions of RgisOperator RTC 空間情報提供 地図情報ベクトルデータをロボットに提供する機能.地図情報グ リッドデータをロボットに提供する機能 空間情報更新 地図情報ベクトルデータをデータベースに登録する機能.ロボッ トの位置情報をデータベースに登録する機能 空間情報処理 地図情報ベクトルデータから地図情報グリッドデータを生成する 機能.座標変換・換算機能.現在地・目的地間のポテンシャルグ リッドマップを生成する機能.経路ネットワークデータから経路 を求める機能. -----------------end------------------------------- 3.2 R-GIS ミニ RTC 【PositionFromTo】 出発地と目的地の座標を送出するためのサンプル RTC です.座標入力用の GUI を表 示します.出発地の座標を GUI の fromX, fromY に,目的地の座標を toX, toY に入力し てください. [OutPort]fromToPos [型]RTC.TimedDoubleSeq(data = [fromX, fromY, toX, toY]) GUI の OK ボタンを押すと,出発地と目的地の座標を出力します. [InPort]message [型]RTC.TimedString メッセージ文字列を受信し,コンソールに表示します. 【RoutePlannerTest】 出発地・目的地の座標を受信し,ポテンシャルグリッドの生成と最小コスト経路探索サ ービスをテストするためのサンプル RTC です.後述のコンフィグによって,ポテンシャ ルグリッドを GeoTIFF ファイルに,経路座標を CSV ファイルに保存できます. [InPort]fromToPos [型]RTC.TimedDoubleSeq(data = [fromX, fromY, toX, toY]) 出発地(fromX, fromY)と目的地(toX, toY)の座標を受け取ります. [OutPort]message [型]RTC.TimedString 処理結果などを通知します [OutPort]routeGrid [型]RGIS.Geo.GridC 結果として受け取ったポテンシャルグリッドを出力します.また,コンフィギュ レーションで指定した場所に GeoTIFF ファイルとして保存します. [OutPort]routeLine [型]RGIS.Geo.LineStringC 結果として受け取った経路データを出力します.また,コンフィギュレーション で指定した場所に csv ファイルとして保存します. 3.3 実習のための各種設定の変更と実行 RgisOperator 設定ファイルの変更: ¥rtc¥rgis_project.xml で,RgisOperator の経路探索パラメータや GIS データの設定 を行います.このファイルは RgisOperator が Activate されたときに読み込まれます. rgis:routeService の設定: rgis:bufferSize(0<=x) 障害物に近づかないための緩衝帯のサイズを設定します.サンプルファイルのデフォル ト値は 0.4(メートル)です. 0 にすると,緩衝帯を生成しません. rgis:cellSize(0<) グリッド内の1セルの大きさを設定します.縦横同じサイズになります.サンプルファ イルのデフォルト値は 0.2(メートル)です.0 にはしないでください. rgis:routeTolerance(0<=x) 経路点の間隔を,指定した値(メートル)以上になるように広げます.経路の細かいジ グザグが解消されますが,単純化しすぎると経路が障害物にぶつかる恐れもあります.ご 注意下さい.なお,0 の場合は間隔を広げません. rgis: withObstacleThickening(0 or 1) 0:物体の形状をそのままで処理します.グリッド処理時間が短縮されます.セルサイ ズと比べて小さい・細い物体が障害物グリッドに反映されない恐れがあります. 1:セルサイズと比べて小さい・細い物体を確実に障害物グリッドに反映できるように, 物体の形状に少し厚みを持たせます.処理時間が数秒~10 数秒かかるようになります. rgis:layer の設定: rgis:dataSource/rgis:source(GIS データの格納先) 必要に応じてシェープファイル(.shp)のパスを書き換えてください. RTC コンフィグファイルの変更: RgisOperator 設定ファイルの場所や一時データ出力先を RTC のコンフィギュレーシ ョンファイル(コンフィグファイル)に記述しておくと便利です.必要に応じてそれぞれ のパスを書き換えてください. ¥rtc¥RoutePlannerTest¥RoutePlannerTest.conf(パス書式:¥) PotentialGridFilePath ポテンシャルグリッド(.tif ファイル)の出力先の絶対パス 例)C:¥temp¥RoutePlannerTest.tif RouteResultFilePath 経路座標データ(.csv)の出力先の絶対パス 例)C:¥temp¥RoutePlannerTest.csv ¥rtc¥RgisOperator¥RgisOperator.conf(パス書式:¥¥) ProjectFilePath RgisOperator 設定ファイル(.xml)の絶対パス 例)C:¥¥Rgis¥¥rtc¥¥rgis_project.xml TemporalDirectory ポテンシャルグリッド生成の際に障害物グリッドなどの内部 生成データをファイルに出力したい場合は,その格納ディレクトリを指定. 出力したくない場合は none と記述しておきます. 例)C:¥¥temp¥¥ サンプル RTC 群起動ファイル(run.bat)の変更: OpenCV と FWTools の イ ン ス ト ー ル 先 に 応 じ て , FWTOOLS_PATH と OPENCV_PATH のパスを書き換えてください. set FWTOOLS_PATH=C:¥Program Files¥FWTools2.4.3 set OPENCV_PATH=C:¥Program Files¥OpenCV 【RTC 起動手順】 1. ネーミングサービスを起動します.rtc.conf を環境に合わせて設定しておきます. 2. ¥rtc¥run.bat を実行します. 3. RTSystemEditor などで下図のようにポートを接続します. 4. RgisOperator RTC や RoutePlannerTest RTC のコンフィギュレーションセット "sim3" を選択します. 5. 全コンポーネントを Activate します. 6. PositionFromTo のフォームに座標を入力して OK ボタンを押します.(設定によっ ては処理完了まで 5 秒前後かかります) 座標値は,前述のサンプル GIS データ図中 に記載した範囲内にしてください. 7. 経路探索が成功なら[OK],失敗なら[Error]が PositionFromTo RTC のコンソールに 表示されます.ポテンシャルグリッドの GeoTIFF ファイルや経路の csv ファイルが 正しく出力されているか確認してください. 【サンプル RTC 実行例(デフォルト設定で)】 1. 元の GIS データ 2. 障害物グリッド(厚み有) ObstacleGridTest0.tif 3. コストグリッド CostGridTest0.tif 4. ソースグリッド(バッファ有) SourceGridTest0.tif 5. ポテンシャルグリッド AccCostGridTest0.tif RoutePlannerTest.tif 6. 経路探索結果 RoutePlannerTest.csv 7. 経路線元データと重ねてみたもの 8. 拡大図 経路の単純化なし [RouteService 設定] 出発地 (x=16905, y=-34540) 目的地 (x=16913, y=-34581) cellSize = 0.2 bufferSize = 0.4 routeTolerance = 0 withObstacleThickening = 1 第 4 章 R-GIS クライアント 4.0 MapManagement RTC 概要: R-GIS のロボット側クライアントモジュール. 特徴: • R-GIS のサーバモジュールである RgisOperatorRTC とロボットの各モジュールを接 続し,環境情報のやりとりを行う. • ロボットの各モジュールからのリクエストに応じて,RgisOperatorRTC からポテン シャルグリッドマップを取得・提供する. • ロボットの各モジュールからのリクエストに応じて,RgisOperatorRTC からウォー ルグリッドマップを取得・提供する. • ロボットが推定した自己位置姿勢情報を RgisOperatorRTC に提供する. インターフェイス: データポート ポート名 種類 型名 説明 RobotPositionIn IN TimedLocalizationData ロボットが推測した自己位置姿勢情報 サービスポート サービス名 種類 説明 MapManagementService Provider ポテンシャルグリッドマップおよびウォールグリッドマップ の提供 MapService Consumer RgisOperatorRTC からの地図情報の取得(未利用) RouteService Consumer RgisOperatorRTC からの経路情報の取得 TrackLogService Consumer RgisOperatorRTC にロボットの位置姿勢情報を提供 必要システム構成 当該モジュール 図 MapManagement RTC の接続例 動作内容: • ポテンシャルグリッドマップの提供 • ポテンシャルグリッドマップの要求を受理 • RgisOperatorRTC にポテンシャルグリッドマップを要求 • 生成されたポテンシャルグリッドマップを要求元モジュールに提供 • ウォールグリッドマップの提供 • ウォールグリッドマップの要求を受理 • RgisOperatorRTC が 扱 う 最 大 範 囲 の ポ テ ン シ ャ ル グ リ ッ ド マ ッ プ を RgisOperatorRTC に要求 • ポテンシャルグリッドマップからウォールグリッドマップを生成(なお,ここで生成 したウォールグリッドマップを保存しておき,2回目以降の要求にはこれを用いる) • 必要な範囲のウォールグリッドマップを切り出し,要求元モジュールに提供 (注)現時点の RgisOperatorRTC にはウォールグリッドマップを生成する機能が ないため,本モジュールでポテンシャルグリッドマップからウォールグリッドマッ プを生成する • ロボットの位置姿勢情報の提供 • ロボットが推定した位置姿勢情報を受信 • あらかじめ決められた周期で RgisOperatorRTC にロボットの位置姿勢情報を提供 地図管理モジュール MapManagement RTC は,R-GIS クライアントであり,移動ロ ボットが,R-GIS に接続し,処理の要求や結果を受信するためのインタフェースモジュー ルです.主な機能としては,目的地に応じたポテンシャルグリッドマップや各種空間情報 を取得する空間情報受信機能,ロボットの自己位置や位置情報を持つセンサデータを提供 する空間情報送信機能の2種類となっています.実際には,個々の移動ロボットの RTC を含むシステム構成に応じて,個別に再設計することで,R-GIS に接続することができる ようになります. 次節では,この「個別に再設計」という部分も含めて,実際に R-GIS RTC 群を使う方 法について説明していきます. LocalizationData.idl module ISIT { module Localization { struct LocalizationData { string crs; // 座標参照系(epsg code / original code) double x; // x[m] double y; // y[m] double z; // z[m] double pitch; // pitch 角[rad] double roll; // roll 角[rad] double yaw; // yaw 角[rad] }; struct TimedLocalizationData { RTC::Time time; // 位置・姿勢データの時刻 LocalizationData data; }; }; }; コンフィグレーション パラメータ 型 デフォルト 説明 EXTENTION_SIZE double 5 Extension Size for potential grid 4.1 LEGO NXT 移動機能とセンサ機能 4.1.1 RgisNXT LEGO NXT で動かすプログラムです.これは RTC ではありません.モーターコントロ ール、ソニックセンサ、タコセンサの3つのスレッドが NXT で動きます.このプログラ ムは, Bluetooth で通信を行い,RgisLegoManager と通信を行います.サーバであるパ ソコンでコンパイルを行い,LEGO へプログラムを転送します. 付属のコンパイル済みファイルを以下の方法で転送します. nxj LegoNXT 転送後,LEGO 側でプログラムを実行させます.Files -> LegoNXT.nxj を指定 -> Set as Default に 設 定 し ま す . そ の 後 , Run Default で ボ タ ン を 押 す と , 自 動 的 に LegoNXT.nxj が起動します. RTC 群を deactivate した場合,RgisNXT を LEGO 側で再起動する必要があります. NXT 本体のキャンセルボタンを押し,プログラムを終了後,再度,LegoNXT を起動して 下さい.RgisLegoManager と一度,接続をしない限り,プログラムのキャンセルボタン を押しても,プログラムが終了しません.間違ってプログラムを起動した場合は,電池を 抜くか RgisLegoManager を一度,activate を行って,プログラムを終了させて下さい. LEGO 本体のディスプレーには,MotorControler からの指示値(MotorA と MotorC の角速度)が表示されます. 4.1.2 RgisLegoManager LEGO NXT 上で実行をしている RgisNXT と通信を行う RTC です.モータ制御やソニ ックセンサ情報の取得を行うコンポーネントです.入力は,左右車輪の目標累積回転角度, 目標角速度,出力は,左右車輪の累積回転角度,超音波センサ値です. データ入力ポート ポート名 型 説明 rotatoTo TimedLongSeq[4] [0]:MotorA の回転角速度(degree/sec)[0~900] [1]:MotorA の累積回転角度(degree) [2]: MotorC の回転角速度(degree/sec)[0~900] [3]:MotorC の累積回転角度(degree) motorSpeed TimedLongSeq[2] [0]:MotorA の回転角速度(degree/sec) [-900~900] [1]:MotorA の回転角速度(degree/sec) [-900~900] 但し,[0]と[2]の値を同時に「0」に設定するとモータがストップする. データ出力ポート ポート名 型 説明 wheelStatus TimedLongSeq[2] [0] : MotorA の累積回転角度(degree) [1] : MotorC の累積回転角度(degree) sonarDatta TimedLongSeq[1] [0] : 超音波センサ値[cm](255:障害物なし) 4.2 GIS と接続する移動ロボットシステム 4.2.1 ActionPlanning 概要: ロボットの行動管理 特徴: ロボットユーザから指示されたシナリオにしたがって,ロボットの次の行動を決定する. インターフェイス: サービスポート サービス名 種類 説明 ActionRequestService Provider ユーザからの行動指示(現在は移動のみ)の受領 ActionReportService Consumer 指示された行動の終了を通知 GlobalPathPlanningService Consumer ユーザからの移動指示を通知 ArrivalNotificationgService Provider 指示した移動の終了通知を受領 動作内容: • ActionRequestServicePort でロボットの行動に関する指示を受領(現時点では移動の みに対応) • 行動を実現するためのシナリオ(状態遷移グラフとしてあらかじめ作成・保持)にし たがって,GlobalPathPlanningServicePort に移動を指示 • ArrivalNotificationPort で移動の終了を受領 • 2~3 を 繰 り 返 し , 指 示 さ れ た 行 動 が 終 了 ( = 最 終 目 的 地 に 到 着 ) し た ら , ActionReportService に行動終了を通知 4.2.2 GlobalPathPlanning 概要: ロボットの大域的な移動管理. 特徴: 指示された最終目的地に移動するために,適切な中間目的地を設定し,そこへの移動指示 を繰り返す.局所的な移動管理を行う RTC(例えば,LocalPathPlanning RTC など)へ の中間目的地の指令を出すことを目的としており,中間目的地の設定方法は,ユーザに委 ねられる.このため,本 RTC は,現時点では,中間目的地を設定することはできず,い きなり最終目的地への移動指示を出す. データ入力ポート ポート名 型 説明 RobotPosition TimedLocalizationData ロボットが推測した自己位置姿勢情報 サービスポート サービス名 種類 説明 GlobalPathPlanningService Provider ユーザからの移動指示通知を受領 LocalArrivalNotificationService Provider 指示した中間目的地への移動終了通知を 受領 ArrivalNotificationService Consumer 指示された移動の終了を通知 LocalPathPlanningService Consumer 中間目的地への移動を指示 MapManagementService Consumer 中間目的地へのポテンシャルグリッドマ ップを取得 動作内容: • GlobalPathPlanningServicePort でロボットの移動に関する指示(最終目的地)を受 領 • MapManagementService から現在地から最終目的地までのポテンシャルグリッドマ ップを取得 • LocalPathPlanningService にポテンシャルグリッドマップを出力することで,最終 目的地までの移動を指示 • LocalArrivalNotificationService で最終目的地までの移動の終了通知を受領 • ArrivalNotificationService に移動終了を通知 4.2.3 LocalPathPlanning GlobalPathPlanning からポテンシャルグリッドマップを受け取り、ロボットの位置姿勢 情報から、サブゴールを算出します.正面 120 度の範囲にサブゴールがあれば,サブゴ ール座標値をそのまま出力しますが,それ以外の範囲にサブゴールがあった場合, (SUGGOAL_MOVING_RANGE*cellSize, 0)のサブゴール座標値を出力します.cellSize は, RgisOperator の初期設定ファイルである xml に記述されています.また,コンフィグレ ーションのパラメータ SUBGOAL_MOVING_RANGE と SUBGOAL_SEARCH_RANGE は変更する場合は,同じ値にすると良いでしょう. Y (SUBGOAL_MOVING_RANGE*cellSize, SUBGOAL_MOVING_RANGE*cellSize) (SUBGOAL_SEARCH_RANGE*cellSize, SUBGOAL_SEARCH_RANGE*cellSize) 正面120度 サブゴールへ X 0 その場,回転 (-SUBGOAL_MOVING_RANGE*cellSize, -SUBGOAL_MOVING_RANGE*cellSize) (-SUBGOAL_SEARCH_RANGE*cellSize, -SUBGOAL_SEARCH_RANGE*cellSize) コンフィグレーション パラメータ 型 デフォルト 説明 GOAL_IN_DISTANCE_TH double 0.1 ゴールしたと判定する正方形の範 囲(単位:m) GOAL_TIME int 0 デバッグ用で強制的にゴールした と判定を下すまでの時間(単位: 繰り返し数) SUBGOAL_MOVING_RANGE int 20 次のサブゴールを提示する範囲 (単位:セル数) SUBGOAL_SEARCH_RANGE int 20 サブゴールを探す範囲 正方形の1辺のセル数 データ入力ポート ポート名 型 説明 TimedObstacleInfomation TimedDoubleSeq センサが取得した障害物情報 RobotPosition TimedLocalizationData ロボットが推測した自己位置姿 勢情報 データ出力ポート ポート名 型 説明 SubGoal TimedDoulbleSeq [0]:x 座標[m] [1]:y 座標[m] Service Port サービス名 種類 説明 LocalPathPlanningService Provider 中間目的地への移動を指示 LocalArrivalNotificationService Consumer 指示した中間目的地への移動終了通 知を受領 4.2.4 LegoController R-GIS ミニ RTC の PositionFromTo RTC に相当し,LEGO 実験環境で,移動ロボッ トサンプル RTC 群を制御する(スタートさせる)RTC です.初期値と目的地を入力し, [START]ボタンを押すと,レゴが目的地に向かって動きます. [RESET]を押すとレゴが 止まります.座標系は,RgisOperator で指定された平面直角座標を使用し,その座標の 上方向を Z 軸の正とする.Z 軸周りの回転を YAW 角とし,右ネジの方向(反時計回りの 方向)を正としています.初期値に入れる YAW 角は,-180~180 度の範囲で入力をして 下さい. LegoController は,SelfLocalization へ LEGO の初期位置を登録し,ActionPlanning との間で,ゴール座標の設定及びゴール判定を行っています. ServicePort サービス名 種類 説明 ActionRequestService Provider String 型 ・Goto+座標系+ゴール X 座標(double)+ゴール Y 座 標(double)+ゴール Z 座標(double) 例)Goto LEGODEMO 1.40 1.40 0.0 ・Stop 例)Stop ActionReportService Consumer String 型 例)WaitForGoto InitialPositionService Provider TimedLocalizationData 目的地に到達した場合,ActionPlanning から「WatiForGoto」の文字列が送られてくる. データ入力ポート ポート名 型 説明 robot_position TimedLocalizationData ロボットが推測した自己位置姿勢情報 図 レゴコントローラ 4.2.4 MotorControl LocalPathPlanning からサブゴール座標値を貰い,その地点へ向かうようにレゴを制御 します.サブゴールは,レゴローカル座標系になります. 図 レゴローカル座標系 このコンポーネントは,サブゴールを仮想的なターゲットとし、そのターゲットを追尾 する制御を取り入れています. 参照 URL(仮想的なターゲット追尾) http://www.mech.tohokugakuin.ac.jp/rde/contents/course/robotics/wheelrobot.html#BVNX0F0mCHN8fB サブゴールが正面120度の範囲にある場合は,サブゴールに向かって進みます.それ 以外の角度にサブゴールがある場合は,その場回転を行い,正面120度の範囲に入った 時点でサブゴールに向かって進みます.この120度の値は,LocalPathPlanning で指定 されています. Y (SUBGOAL_MOVING_RANGE*cellSize, SUBGOAL_MOVING_RANGE*cellSize) (SUBGOAL_SEARCH_RANGE*cellSize, SUBGOAL_SEARCH_RANGE*cellSize) 正面120度 サブゴールへ 0 その場,回転 (-SUBGOAL_MOVING_RANGE*cellSize, -SUBGOAL_MOVING_RANGE*cellSize) (-SUBGOAL_SEARCH_RANGE*cellSize, -SUBGOAL_SEARCH_RANGE*cellSize) X LT θT VR = V +ΔV VL = V –ΔV V = KV・LT ΔV = KT・θT LT = (ターゲットまでの距離) θT = (ターゲットとの角度) コンフィグレーション パラメータ 型 デフォルト 説明 Kt int 38 回転半径パラメータ Kv int 350 スピードパラメータ MaxSpeed int 150 (degree/sec) 最大直進角速度 RotateSpeed int 60(degree/sec) 回転角速度 データ入力ポート ポート名 型 説明 subgoal TimedLocalizationData ロボットが推測した自己位置姿勢情報 データ出力ポート ポート名 型 説明 motorSpeed TimedLongSeq [0]:MotorA のスピード(degree/sec) [1]:MotorC のスピード(degree/sec) 4.2.5 SelfLocalization 左右の累積回転角度から自己位置を推定します.この処理は,OpenINVENT-4.0.0 の Odometry を参考にして作成されています. コンフィグレーション パラメータ 型 デフォルト 説明 WheelDistance double 0.1134(m) 車輪間隔 WheelDiameter double 0.056(m) タイヤの直径 データ入力ポート ポート名 型 説明 wheelStatus TimedLongSeq [0]:MotorA の累積回転角度(degree) [1]:MotorC の累積回転角度(degree) データ出力ポート ポート名 型 説明 robot_position TimedLocalizationData ロボットが推測した自己位置姿勢情報 Service Port サービス名 種類 説明 InitialPositionService Consumer TimedLocalizationData 4.2.6 ObstacleDetection 未実装 データポート ポート名 型 説明 sonarDatta TimedLongSeq[1] [0] : 超音波センサ値[cm](255:障害物なし) データ出力ポート ポート名 型 DirectionVector TimedDoubleSeq[] 説明 第 5 章 R-GIS 用の地図編集 5.1 フリーの GIS ソフト 本書では,地図データの作成及び編集にフリーの GIS ソフト,Quantum GIS を使用し ま す ( http://www.qgis.org/ ). 使 用 し た バ ー ジ ョ ン は , 1.4.0 Enceladus (Windows Standalone / QGIS-1.4.0-1-No-GrassSetup.exe)です.ホームページからソフトをダウン ロードし,インストールを行って下さい.メニュー類は日本語化されています. 新しく Quantum GIS 1.6.0 が公開されました.1.4.0 ではなく,1.6.0 の Standalone Installer 版をインストールして下さい.基本操作は,1.4.0 と同じです. 図 QUANTUM GIS 1.5 インストール・オプション そ れ で は , 添 付 の “lego.qgs” を 開 い て み ま し ょ う (C:¥Rgis¥RgisOperatorTest20090924¥lego¥lego.qgs).この地図データには,障害物デ ータ(Wall)とコストデータ(Cost)がレイヤに存在します.障害物データは,ロボットが物 理的に通れない壁や物などを指します.コストデータは,ロボットを出来るだけ通行させ たくない場所を指定します.但し,現時点で,コストデータの中身は空です.もし, lego.qgs のファイルが正常に開くことができなかった場合,「レイヤ」→「ベクタレイヤ の追加」でソースタイプ(ファイル) ,エンコーディング(System)で, 「ブラウズ」ボタ ンを押し,C:¥Rgis¥RgisOperatorTest20090924¥lego の Cost.shp と Wall.shp を選択 し,オープンして下さい. 図 leog.qgs 座標系は,本来は公共座標を用いますが,今回は便宜上,1)室内で扱う.2)原点の 座標がサンプル地図上の分かりやすい位置にあると嬉しい3)方位を任意の向きに設定し たい等の理由で,任意の座標系に設定しました.この場合でも,地図データには座標系の 指定は必要ですので,以下の通りに設定しています. 座標系:JGD2000 / Japan Plane Rectangular CS II (EPSG:2444) GIS では東西方向を X 軸,南北方向を Y 軸で表します.サンプル地図に X 軸,Y 軸, 原点などを便宜上書き込んだものが下図です.サンプル地図では,壁の内側の左下の角を 原点(0, 0)とし,右上の角の内側を(4, 3)としました(単位:m) .また,壁で囲まれた内側 に長方形のオブジェを2個,配置しています. 図 LEGO 用サンプル GIS データ 地図のレイヤにある障害物データとコストデータは,シェープファイル(ベクタデー タ)で記述されています.それぞれ,ポリゴン形式のデータになっています.このサンプ ル地図を編集してみましょう. 主に使用するモードは,3つです. 1)新規に Wall や Cost(ポリゴン)を作成する(ポリゴンを入力) 2)Wall や Cost(ポリゴン)を移動する(地物を移動する) 3)Wall や Cost(ポリゴン)の形を修正する(ノードツール) まず,レイヤの Wall を選択し,編集モード変更(鉛筆印,赤枠で表示)をクリックし ます. 図 編集モード 新規に障害物を作成した場合,そのポリゴンに識別子である ID を付けます.重複しな いように正の値の整数で番号を割り振って下さい.編集モードを終了すると,「Wall レイ ヤの変更を保存しますか?」という確認が出ますので,変更を破棄しない限り,必ず「保 存」をして下さい.RgisOperator では,Wall と Cost のシェープファイルのみを使用し ます(lego_project.xml に記載) . 詳しい使い方は,QuantumGIS ホームページからマニュアルをダウンロードして,参照 をして下さい. 5.2 QuantumGIS と R-GIS ミニ RTC を用いた練習 先程のサンプル地図に含まれる2つのシェープファイル(Wall, Cost)を使用し,R-GIS ミニ RTC を用いてテストをしてみましょう.レゴのサイズは小さいため,パラメータを 調整します(bodySize, bufferSize, cellSize). 添付ファイル lego_projext.xml の一部です. <rgis:robotInfo rgis:id="Robot01" rgis:name="robo"> <rgis:bodySize>0.2</rgis:bodySize> </rgis:robotInfo> <rgis:routeService> <rgis:obstacleLayerName>Wall, Cost</rgis:obstacleLayerName> <rgis:costLayerName>Cost</rgis:costLayerName> <rgis:costFieldName>Cost</rgis:costFieldName> <rgis:bufferSize>0.15</rgis:bufferSize> <rgis:cellSize>0.01</rgis:cellSize> <rgis:routeTolerance>0</rgis:routeTolerance> <rgis:withObstacleThickening>0</rgis:withObstacleThickening> </rgis:routeService> PostitionFromTo を用いて,スタート座標(0.3, 0.7)からゴール座標(1.4, 1.8)へ移動す るようにして見ましょう. ・使用する3つのコンポーネント -C:¥Rgis¥RgisOperatorTest20090924¥rtc ¥RoutePlannerTest¥PositionFromToComp.py ¥RoutePlannerTestComp.py ¥run.bat です.まず,ネームサーバー(rtm-namijng.py)を起動し,そして,上記3つのファイルを ダブルクリックで,起動させます.エクリプセを立ち上げ,SystemEditor で配線を行い, activate して下さい. 図 図 コンフィグレーションは,lego を使用する QuantumGIS と R-GIS ミニ RTC を用いた例 デフォルトでは,C:¥Rgis¥RgisOperatorTest20090924¥tempTC に,以下の2つのフ ァイルが出来ます.一つが座標情報や投影法が埋め込まれた GeoTIFF 形式のファイルと ルート座標が書かれた CSV ファイルです. RoutePlannerTest.tif RoutePlannerTest.csv この結果を QuantumGIS に表示させてみましょう.新しくできた GeoTIFF 画像を図のよ うにラスタレイヤの追加で指定します. 図 ラスタレイヤの追加 そして,レイヤに追加された RoutePlannerTest を右クリックまたはダブルクリックで, プロパティを開きます.そして,シンボルの中にあるシングルバンドのプロパティの中に ある「カラーマップ」を“原色”に,「標準偏差を使用」を“0.7”ぐらいの値に設定する と,グリッドマップが表示されます. 図 RoutePlannerTest.tif の結果 次に,RoutePlannerTest.csv を表示させてみましょう.これは,カンマ区切りで,idx (識別子) ,x 座標,y 座標,z 座標(単位:m)で表される経路データの座標値が記述さ れたファイルです.この CSV データを表示させるためには,QuantumGIS に新たにプラ グインを使えるようにする必要があります.そのプラグインは, 「デリミテッドテキスト レイヤを追加する」です.プラグインマネージャで,以下の図の通りに設定を行って下さ い. 図 プラグインの設定 それでは,デリミティッドテキストレイヤの追加で,CSV データを表示させてみましょう. 先程の,RoutePlannerTest.csv を指定し,区切り文字を「,」 ,X フィールドを「x」,Y フィールドを「y」に指定し,最後に「OK」を押して下さい. 図 RoutePlannerTest.csv の読み込み画面 図 RoutePlannerTest.tif の結果 次に,コストレイヤに新たにポリゴンデータを追加してみましょう.このポリゴンデー タは,ロボットをできるだけで通行させたくない場所に設置します.鉛筆印の「編集モー ド」をクリックし,「ポリゴンを入力」をクリックします.マウスの左クリックで,ポリ ゴンを作成し,再生終了後に,右クリックします.そうすると,属性を指定するウィンド ウが表示されますので,ID(正の int 型)と Cost(正の int 型で 1~254 までの値)を指定しま す.Cost の値が大きくなるほど,そのポリゴン範囲は,ロボットが通りにくくなります. ポリゴンの追加が終わったら,最初にクリックした鉛筆印の「編集モード」をクリックし て,編集を終了します.この時,レイヤの変更を保存して下さい. 図 図 コストレイヤの編集 ポリゴンを入力 図 属性の指定 図 地物の削除方法 それでは,新しくコストデータを追加した状態で,もう一度,RgisOperator で経路情報 を作成してみましょう.全てのコンポーネントを deactive し,再度,activate しましょ う.activate 毎に,lego_project.xml がリロードされ,レイヤ情報も更新されます. activate 後に,PositionFromTo の「OK」を押し,新たな経路データを作成します.そし て,RoutePlannerTest.tif と RoutePlannerTest.csv を先程と同様に,レイヤに追加して 下さい.デフォルトでは,レイヤの透過率は,0%です.上手く表示されない場合は,レイ ヤの並び順も確認して下さい. コストレイヤのポリゴンを配置した箇所を避けたルートが表示されました.このように コストレイヤを上手に使うことで,ロボットが通る経路を変更することが可能となります. 図 cost 追加後 また,コストの値は,下図のようにコストレイヤの属性テーブルを開き,編集モード (属性テーブル・ウィンドウにある鉛筆印)にすると,値を変更できます. 図 属性テーブルの開き方 図 属性値の変更方法 第 6 章 レゴを動かしてみよう 6.1 起動方法 図 レゴ結線図 RTC は,Windows Visual C++ と java で作られています.添付のバッチファイルで起動 します. C:¥Rgis¥binary¥runall.bat をダブルクリックして下さい.そして,レゴ結線図を参考に結線をします. 図 結線図 結線が終われば,コンフィグレーションを変更します. RgisOperator config lego MapManagementRTC name value EXTENSION_SIZE 5 LocalPathPlanningRTC name value GOAL_IN_DISTANCE_TH 0.1 GOLA_TIME 0 SUBGOAL_MOVING_RANGE 18 SUBGOAL_SEARCH_RANGE 18 コンフィグレーションを変更後,activate し,問題がなければ,LEGO Contoroller で 初期値と目的地を入力して,[START] ボタンを押してみましょう.無事に動作すること が確認できるでしょう.もし,レゴが暴走などで操作を止める時は,LEGO Controller の 「STOP」を押し,その後, 「RESE」を押すと停止します. 図 レゴコントローラ 第6章 その他 6.1 拡張編 6.1.1 トータルステーションモジュールによる自己位置推定 トータルステーション(Total Station:TS)とは,レーザ測距儀と測角器を備えた測量 機器であり(図 7 左) ,全方位再帰性プリズムまでの距離と位置を計測することができま す.TS RTC 群は,TOPCON 製 TS GPT-9000A シリーズを制御する RTC と,ロボット 位置計算用 RTC からなり,これにより,精密位置計測を実現しています(図 6).主な機 能としては, ロボット作業座標系または公共座標系での移動ロボットの位置計測を行う機能 任意のロボットの位置計測要求に応じ,そのロボットを探索し,位置計測を行う 機能 があります.この位置計測性能は,移動中のロボットの場合,誤差 10 [mm],ロボットが 静止状態であれば,誤差 0.2 ~ 1.0 [mm]で計測可能となっています.また,測定範囲は, 5 ~ 600 [m]です.このような特性から,このモジュールは,屋外環境で GPS を使用せ ずにロボットの自己位置測定を行うことや,将来の測量ロボットでの使用を想定していま す. 6.1.2 車いすロボット 現在,私たちは,実験用ロボットとして,車いす型の二輪駆動自律移動ロボットを使っ ています(図 7 右) .制御システムも RTC 群で構成されており,MapManagement RTC を介して R-GIS を利用することができるようになっています(図 8) .ロボットの位置座 標は,前述の TS モジュールを利用する場合,本体上部にプリズムを設置し,これを TS モジュールで追跡しつつ取得することになります.これとデッドレコニングで得られる情 報を合わせて,ロボットの自己位置・姿勢を推定することができるわけです.この他にも, GPS や電子タグを用いた位置推定やパーティクルフィルタ等によるセンサ情報に基づく位 置推定モジュールも開発しています. 自動操縦と手動操縦の切り替えモードや,TS を用いた自己位置推定モジュールなどの 違いはありますが,第3章,第4章で説明したサンプルモジュールとほぼ同じ構成である ことが分かると思います. 図 7 Wheelchair robot and Total station 図 8 Wheelchair Robot RTCs 6.1.3 実証実験例 R-GIS コンソーシアムでは, 「ロボットタウンの実証的研究」でも用いた福岡市の埋立地 (アイランドシティ)内の中央公園(約 156,000 [m2])を R-GIS 実証実験フィールドと定 め,IC チップを内蔵したインテリジェント基準点[9]の設置や公園内部の詳細な GIS デー タの構築など,環境整備と公開準備を進めています(図 9).この環境では,移動ロボット は,R-GIS が提供する RTC 群および空間情報 DB を利用することで,環境情報を共有・享受 して動作することができるようになっています.ここでは,2009 年 9 月に実施した R-GIS RTC の動作検証実験を紹介しましょう. 図 9 Intelligent control point and map 【座標系の設定とデータ準備】 実験では,R-GIS サーバは,空間情報と地図データを公共座標系で管理し,移動ロボッ トは,ローカル空間の座標系(以下,ワールド座標系)で,動作計画や移動を行うことと しました.この公共座標系とワールド座標系との相互変換は,次のようにして行われます. 公共座標系での座標が既知の点(例えば,図 9 のインテリジェント基準点)とロボット作 業座標系の原点および空間中の任意の 1 点を TS で計測し,それぞれのワールド座標系で の位置と公共座標系での座標を求めます.これにより,公共座標系とワールド座標系の対 応付けが行われ,座標系の変換が可能となります.この変換に関する情報が,R-GIS に座 標の識別子と組にして登録され,座標変換が必要になったときに,随時利用されるわけで す. ロボット向け地図データとしては,進入できない領域を示す「障害物領域データ」や, 通行できるが極力避けて通りたい領域を示した「移動コスト領域データ」を作成しました. 具体的には,園路の外側の植え込み等は障害物ポリゴンとして,園路の端や点字ブロック などのロボットが通行しにくい,または避けた方が望ましい場所は,移動コストを高く設 定した移動コスト領域ポリゴンとして GIS データを作成しています. 【ロボット位置計測】 移動ロボットに設置された全方位再帰性プリズムを TS で追跡します.この情報とデッ ドレコニングの情報を合わせたものを車いすの自己位置・姿勢情報として用いています. なお,前述の準備により,ロボットが用いているワールド座標系での自己位置は,R-GIS サーバ上では,公共座標系で管理されています 【ロボットの移動】 車いすロボットは,図 8 に示す RTC 群の構成により,自律と手動の 2 つの動作モードを 切り替えながら動作させます(図 10).ジョイスティックモジュール(Joystick RTC)は, ジョイスティックの自律手動切替ボタンが押されたことを行動計画モジュール (ActionPlanning RTC)に知らせるものです.この情報に基づき,行動計画モジュールが ロボットの自律と手動の切り替えを行なうわけです.手動モードにおいては,ロボットは, ジョイスティックの入力に応じて動作しますが,一方,自律モードでは,次のような流れ でロボットを自律動作させています. (a)ロボットの呼出し (c)目的地まで自律移動 (b)GUI で目的地設定 (d)手動操作 (e) 任意の地点で乗り捨て (f)次の地点へ自律移動 図 10 R-GIS によるタウンコミュータ実験 Step1: ロボット管理者は,R-GIS サーバに接続されたロボット管理用画面(図 11)上で, 目的地を指定します.指定された目的地の情報は,ユーザリクエスト管理モジュール (UserRequestManager RTC)を経由し,行動計画モジュールに送られます.この際,目的 地の情報は,R-GIS の機能により,公共座標系からワールド座標系(ロボット作業座標 系)に自動的に変換され,ロボットに送られることになります. Step.2: 行動計画モジュールは,送られてきた目的地の情報を大域経路計画モジュール (Global Path Planning RTC)に送ります.大域経路計画モジュールは,経路計画に必要 な地図を地図情報管理モジュール(Map Management RTC)に要求します.地図情報管理モ ジュールはこの要求を受け,R-GIS 機能モジュール(RgisOperator RTC)へ経路計画用グ リッドマップを要求することになります. Step.3: R-GIS 機能モジュールは,この要求に応じて,進入不可領域や傾斜などといった 空間 DB 中の GIS 情報に基づいてコスト計算を行い,図 12 に示すような経路計画用グリッ ドマップ(ポテンシャルグリッドマップ)を生成します.生成されたグリッドマップは, 地図情報管理モジュールを介して,大域経路計画モジュールに送られ,自己位置情報を元 にした移動戦略を立てます. Step.4: 移動戦略が局所経路計画モジュール(Local Path Planning RTC)に送られるこ とで,モータの制御情報に変換され,ロボットが自律動作するわけです.なお,ロボット の自己位置の情報は,地図情報管理モジュールを介して,R-GIS 機能モジュールに送るこ とで,逐次,空間 DB に登録(ロギング)することができるのも一つの特徴になっていま す. 進入不可領域 低コスト領域 ロボット位置 高コスト領域 図 11 GUI 6.2 応用編 6.2.1 NEDO 知能化プロジェクトの他コンソの利用例 6.2.2 つくばチャレンジ 2009 を実例として 人々が生活している空間の中で,ロボットが確実に自律的に動き回って働くための技術 を競う「つくばチャレンジ」という競技会が 2007 年から,つくば市にて毎年開催されて います.2009 年の大会では,つくば市中央公園を周回する 1 [km]強のコースを自律移動 する課題が設定され,日本全国から 72 チームが技術を結集したロボットで参戦しました. R-GIS コンソーシアムは,今回初出場の福岡大学フューチャービジョンチームと連携し, 「試走会に一度も実機で参加することなく,本番で完走する」を目標に,GIS を活用した ロボット移動環境マップの作成や RgisOperator RTC による経路計画などの技術支援を行 いました[10].ロボット本体は,独立2輪駆動,センサは,GPS コンパス,ロータリエン コーダ,LRF の 3 つのみであり,自律ナビゲーションと障害物回避を並列に実行し,移動 するものです(図 13) .本走行では,コースアウトによるリタイアとなったものの,前日 のトライアル走行では,全チーム中9位の好タイムで通過するなど,今後の発展が期待で きる成果を上げたと考えています. 今回のチャレンジでは,ロボット用の地図データ構築には,市販の GIS ソフトを使用し ています.走行コースの平面図をトレースするところから始め,現地にて VRS-GPS を用 いた詳細な測量を行いつつ,地図の修正を繰り返しました(図 14).この地図データを基 に RgisOperator RTC によりグリッドマップを自動生成し,移動ロボットの経路計画に投 入しました.ロボットの動作戦略において,局所的な動作計画と大域的な動作計画とに分 け,GIS の技術を用いて実際のフィールドの地図データの修整を行い,移動ロボットに投 入するという試みは,新しい GIS の利用分野の可能性が感じられるものでした. (a)R-GIS 移動ロボットマッパーマッパー (b)コース図および結果 図 13 つくばチャレンジ 2009 図 14 つくば市中央公園データ 参考文献 [1] 長谷川: 環境プラットフォーム「ロボットタウン」 ",日本ロボット学会誌,vol.26, no.5,pp.23-26,2008. [2] ``地理空間情報活用推進基本法'',http: //www.gsi.go.jp/ kihonhou.html, 2007. [3] 村上, 長谷川, 木室, 千田, 家永, 有田, 倉爪:``情報構造化環境における情報管理の一 手法'',日本ロボット学会誌,vol.26, no.2, pp.192-199, 2008. [4] 木室, 荒屋, 有田, 家永, 村上, 楊:"ロボット地理空間情報システム R-GIS" , 日本ロボ ット学会誌, Vol.27, No.8, pp.868-876, 2009. [5] RT-Middleware: Distributed Component Middleware for RT (Robot Technology)", International Conference on Intelligent Robots and Systems, pp.3555-3560, 2005. [6] "「次世代ロボットビジョン懇談会」報告書", 経済産業省, 2004. [7] "Welcome to the OGC R.Website", http: //www. opengeospatial. org/. [8] ``Robotic Localization Service'', http: //www.omg.org/ docs/robotics/ 08-05-02.pdf, 2008. [9] イ ン テ リ ジ ェ ン ト 基 準 点 仕 様 " , http: //www.mlit.go.jp/ seisakutokatsu/ jiritsu/siyousho/070323/990 J006.pdf,2007. [10] 松岡:"屋外用自律移動ロボットの開発",つくばチャレンジ 2009 開催記念シンポジウム 参加レポート集, pp. 106-107, 2009.