##################################
# 地図管理コンポーネントの使い方 #
#                                #
# Tsuyoshi Suenaga, NAIST        #
# tsuyo-s@is.naist.jp            #
#                                #
# 2010/05/20                     #
##################################

1.概要
　本プログラムは地図管理コンポーネントです．
　占有格子地図データを内部に保持し，必要に応じてデータを送受信します．

2.依存ライブラリ
　OpenCV 1.0以上

3.コンパイル
　cd src/
　make -f Makefile.MapManagement

4.実行
　./MapManagementComp

5.設定
　5.1 地図サイズの大きなデータ(2MB以上)を扱う場合，
　　rtc.conf 内の下記の値を大きく設定すること．（初期設定 6MB）
　　この値は送信側RTC，受信側RTCの双方で設定する必要がある．
　　corba.args: -ORBgiopMaxMsgSize 6291456

　5.2 コンフィギュレーションセットを設定する
　　- map_format
　　　地図データのフォーマットを指定．
　　　現在は，OCCUPANCY_GRID_MAPのみサポートされる．

　　- map_filename
　　　地図データファイルへのパスを指定する．

　　- resolution_m
　　　地図の解像度を指定する．
　　　地図データのフォーマットにOCCUPANCY_GRID_MAPを指定した場合，無視される．

6.入出力仕様
　6.1 サービスポート（Provider）
　　- Map（MapInfo.idl）
　　-- setFullGridMap(...)    : 地図全体の登録
　　--- mapdata                * 地図データ
　　--- origin_coord_x         * 地図始点x座標 [grid]
　　--- origin_coord_y         * 地図始点y座標 [grid]
　　--- width                  * 地図幅（y軸の長さ）   [grid]
　　--- height                 * 地図高さ（x軸の長さ） [grid]
　　--- resolution             * 地図解像度 [m/grid]
　　-- getFullGridMap(...)    : 地図全体の取得
　　--- mapdata                * 地図データ
　　--- origin_coord_x         * 地図始点x座標 [grid]
　　--- origin_coord_y         * 地図始点y座標 [grid]
　　--- width                  * 地図幅（y軸の長さ）   [grid]
　　--- height                 * 地図高さ（x軸の長さ） [grid]
　　--- resolution             * 地図解像度 [m/grid]
　　-- getPartialGridMap(...) : 地図一部の取得（未実装）

7.開発環境
　- 保守環境
　-- ubuntu 10.04
　-- OpenRTM 1.0
　-- omniORB 4.1.2-1
　-- G++コンパイラ 4.4.3
　-- GTK+ toolkit 2.20.0
　-- OpenCV 2.0
　- 初期開発（雛形生成時）
　-- ubuntu 8.04
　-- OpenRTM 0.4.2-1
　-- ACE 5.4.7-13
　-- omniORB 4.1.1-2
　-- PatternWeaver 2.3
　-- G++コンパイラ 4.2.4
　-- GTK+ toolkit 2.12
　-- OpenCV 1.0

8.ディレクトリ構成
　- pw_model：Pattern Weaverで作成したモデルデータ群
　- src：Pattern Weaverで生成したひな形に実処理を実装したソースコード

9.ChangeLog
　- 2010.05.20
　　OpenRTM-aist-1.0にて動作確認．ドキュメント更新．
　　バージョン0.2.2 リリース

　- 2009.11.08
　　地図管理RTCでActivate/Deactivateを地図データを変えて行うと異常終了するバグを修正．
　　コンフィギュレーションセットのデフォルトファイルの読み込み機能を追加．
　　バージョン0.2.1 リリース

　- 2009.11.04
　　地図管理コンポーネントの仮バージョン作成．
　　占有グリッドマップのみサポート．
　　バージョン0.2.0 リリース

10.利用手順例
　地図管理RTCを自己位置推定に対して利用した接続例をexample1.png，example2.pngに示す．
　10.1 位置推定への利用（example1.png）
　　（1）コンフィギュレーションにより，地図データを設定．
　　（2）地図管理RTCをActivateする．
　　（3）自己位置推定RTCをActivateし，地図を利用する．
　10.2 他フォーマット地図での利用（example2.png）
　　（1）地図管理RTCをActivateする．
　　（2）他で作成された地図をsetFullGridMap()関数を利用することで地図データを上書きする．
　　（3）自己位置推定RTCをActivateし，上書きされた地図を利用する．

11.地図フォーマット
　本プログラムではOCCUPANCY_GRID_MAPのみの地図フォーマットが使用可能である。
　- OCCUPANCY_GRID_MAP
　　2D地図をグリッドで区切り，各グリッド内の障害物の有無を0〜255の値で表現した地図であり，バイナリPGM画像形式の地図ファイルとなる．
　　"0"が壁（走行不可能領域），"127"が未計測範囲（未知領域），"255"が通路（走行可能領域）である．
　　画像ヘッダのコメント部には，グリッドサイズ（resolution）と原点補正位置（origin）が記述される．
　　グリッドサイズ（resolution）は，m単位で記述され，1グリッドのサイズを規定する．
　　原点補正位置（origin）は，ピクセル単位で原点位置に対するずれ量を指定する．(0, 0)の時は画像左下が原点となる．

　　=== 地図の例 ===
　　+      +
　　|      |
　　|      +----+
　　|    
　　|    
　　|    
　　+-----------+

　　=== 座標の例 ===
　　(0, 3.0)
　　+      + (2.0, 3.0)
　　|      |
　　|      +----+ (3.5, 2.0)
　　|  (2.0, 2.0)
　　|    
　　|    
　　+-----------+ (3.5, 0)
　　(0, 0)

　　=== 占有格子地図記述例 ===
　　P5
　　#resolution 0.5
　　#origin 0 0
　　8 7
　　255
　　以降，画像データ（バイナリ形式で保存すること）
　　0 255 255 255   0 127 127 127
　　0 255 255 255   0 127 127 127
　　0 255 255 255   0   0   0   0
　　0 255 255 255 255 255 255 255
　　0 255 255 255 255 255 255 255
　　0 255 255 255 255 255 255 255
　　0   0   0   0   0   0   0   0
