ROS2 Jazzy で、50x50[M] の static map を作って、使う。
最初は、50x50[M] の static map を作るから。
QGIS で、自宅を中心に、周辺の道路を、50x50[M] の Static Map に落としてみた。
今回も、Google Ai に聞きながらの作成ぞね!!
Google Ai に教わった手順ですが、
Step 1: プロジェクト作成と「メートル単位」の設定
まずはQGISを起動し、長さをメートルで扱えるように座標系を設定します。
QGISを開き、「新規プロジェクト」を作成します。
画面右下の 「EPSG:XXXX」(デフォルトはEPSG:3857など)をクリックします。
フィルター欄に 6677 と入力し、JGD2011 / Japan Plane Rectangular CS IX(平面直角座標第Ⅸ系:高知県などをカバー)を選択して「OK」を押します。
※もしお住まいが九州なら 6676、近畿なら 6674、関東なら 6681 など、お住まいの地域に合った平面直角座標系を選択してください。
おんちゃんは、四国なので、6672 を指定しました。
これでQGIS内の単位が完全に「メートル」になります。
Step 2: 自宅周辺の道路データを自動取り込み
手動で壁や道路を描く代わりに、世界中の地図データ(OpenStreetMap)から道路の線データを直接QGISにダウンロードします。
メニューの 「プラグイン」>「プラグインの管理とインストール」 を開きます。
検索窓に QuickOSM と入力し、QuickOSMプラグインをインストールして閉じます。
メニューの 「ベクトル」>「QuickOSM」>「QuickOSM...」 を開きます。
「Quick query」の方。
以下のように設定します:
Key: highway
In: --> Canvas Extent(キャンバス領域) に変更
一度このウィンドウは開いたままにしておきます。
次に、背景地図を表示して自宅周辺に画面を合わせます。
ブラウザパネル(画面左側)にある 「XYZ Tiles」 を展開し、「OpenStreetMap」 をダブルクリックしてキャンバスに表示します。
マウスのホイールを使って、自分の家を中心に「50m × 50m」くらいの範囲までぐっと拡大します(画面の下部にある「縮尺」が 1:500 や 1:1000 くらいになるまで拡大)。
先ほど開いたままにしていた QuickOSM のウィンドウに戻り、右下の 「Run query」 をクリックします。
これで、画面内に見えている道路のセンターライン(ベクトルデータ)がQGISに自動で取り込まれます。
Step 3: ROS 2用の色(白・黒・灰)に変える
ROS 2は、白(走行可能)、黒(障害物)、灰(未知)しか認識しません。OSMから取り込んだ道路データを「白(走行可能)」、それ以外を「黒(壁・障害物)」に設定します。
背景を黒にする:
メニューの 「プロジェクト」>「プロパティ」 を開きます。
「一般情報」タブにある 「背景色」 をクリックし、純黒(R:0, G:0, B:0) に変更して「OK」を押します。
道路を白にして、太さを設定する:
レイヤパネルにある、QuickOSMで読み込んだ highway(ラインデータの方) をダブルクリックしてプロパティを開きます。
「シンボロジー」タブを選択します。
色を 純白(R:255, G:255, B:255) に変更します。
「幅」の単位を「ミリメートル」から 「地図単位」 に変更します。
「幅」の数値を 4.0 などの実寸(メートル) にします(これで道路の幅がリアルな4メートルになります)。「OK」をクリックします。
もともと表示していた背景の OpenStreetMap レイヤのチェックを外して非表示にします。
※画面が「黒い背景に、白い道路の帯が通っている状態」になれば大成功です。
注) ただ、ここの道路白設定は、あまり意味はない。
Step4.
1. 道路レイヤ(highway) を「メートル単位」に変換する(最重要)
QGISの画面左側(または右側)の「レイヤパネル」にある、QuickOSMの道路レイヤ(highway)を右クリックします。
「エクスポート」>「地物の保存...」 を選択します。
以下のように設定します:
形式:GeoPackage または ESRI Shapefile
ファイル名:適当な名前(例: highway_meter.shp)を付けて保存先を指定。
CRS(座標参照系):デフォルトのままでなく、右側の地球儀マークを押し、EPSG:6677(JGD2011 / Japan Plane Rectangular CS IX) を選択します。(★超重要)
注) 自分の地域のEPSG:667X を指定します。
「OK」を押すと、メートル単位に変換された新しい道路レイヤが画面に追加されます。
元の古い highway レイヤは紛らわしいのでチェックを外して非表示にしてください。
Step 5.
1: 道路を「4m幅の面(ポリゴン)」に一発変換する
QGISの上のメニューから 「ベクトル」>「空間データ処理(ジオプロセシング)」>「バッファ(buffer)...」 を選択します。
以下のように設定します:
入力レイヤ:highway_meter
距離:2.0 と入力します(左右に2mずつ広げるので、合計で4m幅になります)。
単位:メートル
溶け込み(ディゾルブ)結果(オプション):チェックを入れます(道路の交差点の重なりが綺麗に融合します)。
一番下の「バッファ」の欄で「ファイルに保存」を選び、~/map/highway_buffer.shp などの名前をつけて 「実行」 を押します。
画面に新しく、本物の4m幅の面積を持った道路レイヤ(highway_buffer) が追加されます。
2: この「バッファレイヤ」をラスタ化する
新しくできた highway_buffer に対して、もう一度ラスタ化を実行します。
「ラスタ」>「変換」>「ラスタ化(ベクトルからラスタ)」 を開きます。
数値を以下のようにセットします:
入力レイヤ:highway_buffer (★これに変更)
固定値(BURN):255.0
出力ラスタサイズの単位:地理単位
水平方向 / 鉛直方向の解像度:0.05
出力領域:先ほどと同じ(キャンバスに描画でドラッグ)
注)ここで、自宅周辺の 50x50[M] の範囲を選択する。
出力ファイル:~/map/my-neiber4.tif
Step 6.
上記 tif ファイルを、gimp で、pgm ファイルに変換します。
yaml ファイルは、自分で作ります。
my-neiber4.yaml 例
originは、Static MAP pgm の原点(x:0 , y:0) が、画像の (左、下)なので、
map(0,0) は、通常、MAP 画像の中央近くに設定するので、
そこからのオフセットを [-xxx.x , -yyy.y , 0.0 ] [M] で指定する。
後書き。
上記で、一応、自宅周辺 50x50[M] の Map ができると思います。
ただし、今回は、道路幅を、実際とは異なる、一律 4[M] にしたので、
これで、実機ロボットをそのまま走行させると、ずっこけます。
実際に使うのでれば、道路幅を、実際の幅にして作らないといかんぞね!!
あと、Map の向きは、
左右が、西 - 東、
上下が、北 - 南 です。
+X は、東を指します。
+Y は、北を指します。
開始ロボット位置が、map(0,0) で、向きが 0 だと、すると、
MAP 上の map(0,0) 位置に 東向きにロボットをおいて、
そこの位置を、 gnss-rtk で実測して、その値を、robot_localization / navsat_transform_node の parameter の yaml ファイルで指定すれば良いと思う
datum: [nn.nnn, nnn.nnn, n.nnn] # pre-set datum if needed, [lat, lon, yaw]