二つの3Dスキャンマップを繋ぐ merging two clouds using “align” command on “CloudCompare”
はじめに
本ページは,裸岩露頭のiPhone 12 Proを使った点群撮影 に続くものである。このリンクページでは,iPhone 12 Proとアプリ「メタスキャン」Metascanを使って,LiDARまたは写真を元に見事な3Dマップが得られることを確認することができた。
メタスキャンは他のアプリに比べて,広範囲のスキャンが可能であり,絵作りも非常に優れている。スキャンの際には生理的要因が大きいと思われるが,iPhone 12 Proを縦に持って前方をスキャンする性向があるが,それにメタスキャンは応えている。自分の目線よりも高いものをスキャンする場合もこの機能は大いに役立つと感じている。アップルのLiDARは5mという制限があるが,メタスキャンの仕様書では0.5〜3.0mが適当と謳っていて,他のアプリを使用しても実質3mが限界と考えた方がいいだろう。メタスキャンには,70%オーバーラップ撮影をした多数の写真をメタスキャンのサーバーにアップロードしてpoint Cloudを作成し対応づけるなどの処理をしたあとで,iPhone 12 Proで仕上げ処理をする機能がある。ファイルエキスポートの多様性もいい。OBJまたはFBXを使う。ここでは,迷うところであるが,さし当たりFBXで実験してみたい。
この作業が成功したら,光波測距儀などによる測量結果との対応付けを考えてみたい。手許から3D測量機器を失ったのでさし当たり次善の策を取る。地標a(ラベル設置)の海抜高度と経緯度(iPhone 12 Proのgps機能レベル 誤差5mほど)がわかれば,Z値の変換は容易であり,水平面での方位軸は,クリノメータを使って磁北方向の光軸上の適当な位置(例えば20mほど)に地標b(ラベル設置)を設置すれば,XY軸も決まる。つまり,この2点の地標を設置した上でiPhone 12 Proでスキャンすればいいのである。
以上,Feb. 19, 2022記。
1 マージ用の二つの3DスキャンFBXファイルを用意
マージしたい二つのクラウドを図1に表示している。LiDARスキャン2セットには,4枚のラベルを設置した重複場所がある。各セットの絵作りは同じ右手座標系である三次元ユークリッド空間で初期値が動くことなく実施されるので,投影すると重なってしまう。この図1では二枚が分離しているように見えるがそうではない。高度(Z値)幅に違いがあるためにこのような表示になっている。図1の左窓の上枠には,二つのクラウドのファイル名と,それぞれのメッシュ名が現れている。FBX(Film BoXの略)は,メッシュ系ファイル形式である。

CloudCompareのマニュアルはよく整備されていて,CloudCompare Wiki (このサイト内検索は最低,Googleで検索した方が良い)がある。このalign コマンドを使う。もちろん,ぼくには初めての実行である。macの横にmouseマシーンでCloudCompareを実行しながら,このページを書いている。このalignページのノートに,バージョン2.6から,メッシュに対応したようだから,ありがたい。現在のバージョン2.11につながる技術であったようだ。
2 alignment 実行
実行手順に沿って記述してゆく。
1 Role assignment,そして,alignment
Reference(基準クラウド,つまりこのクラウドは動かさない)とaligned cloud(位置合わせしたいクラウド。レファランスの座標系に動したいクラウド)を決める。ここでは,調査地域で始めに実施した低い方の1642ファイルをレファランスとし,高い方の1653ファイルを位置合わせクラウドとする。図1でいうと,下方のクラウドに上方のクラウドを合わせることにする。

メーンメニューの左に示したアイコンか, ‘Tools > Registration > Align (point pairs picking)’ menu,を実行する。

図2では,繋ぎたいmeshを指定している。二つのcloudにはそれぞれ3meshがある。cloudを超えて,meshだけの指定はできず,シフトキーを押してcloudとともに全meshを選択することになるので,繋ぎたいcloud(mesh)は図2のように隣接させる必要がある。
そして,上記のアイコン,aligns two clouds をクリックすると,図3のように,Entry selector,が現れる。

この表のうち,アライメントする方のクラウド(山側)のメッシュすべてをシフトキーを使って選び,OK。

図4でOKすると,次の図5のように,Cloudそれぞれに対応する地標をpicking (摘み取り)することになる。図5では4点の地標のピッキングが完了している(表だけでなくマップ上にもA0〜A3のラベルが認められる)。地球の座標系を繋ぐためには,光波測量などを実施して,Cloudと地球座標系との関係を求めなければならない。その役割を担うのが地標であるが,設置しなくても,特徴的な木々の根のコブや岩の稜角などを使って,cloudを繋ぐことは可能ではある。

レファランスの方(平野側)のcloudは,アライメントする方(山側)のcloudに隠されている。そこで,この右上の表の最上部の赤く塗られた Show ‘to align’ entriesの左の☑️を外せば,アライメントする方(山側)のcloudが見えなくなって,レファランスの方(平野側)のcloudだけが見えるようになる。図6のように,レファランスcloudの全貌が自動で表示される。

で,アライメントする方(山側)のcloudと同様に,レファランスの方(平野側)のcloudについても地標をピッキングした結果が次の図7である。

レファランスの方(平野側)のcloudについても,地標4点のピッキングが終了して,右上の表の最上部の赤く塗られた Show ‘to align’ entriesの左の□に☑️すると,図8のように両cloudでピッキングした8点がすべて表示される。

そして,この表の下段にある,align キーをクリックして,更に,下段の☑️で確定すると,図9が現れて,トランスフォーメーションマトリックスと誤差情報が現れる。CloudCompareの例よりも低い誤差となっていて,ラベル設置の効果は大きいと思われた。

2 マージ merge
アライメント作業が終了しても,一つのcloudに合体はしていない。マージという作業が必要である。

CloudCompareのコマンド Merge を使う。このサイトに示されているように,cloud対象とmesh対象で微妙に違うのであるが。
図10ではシフトキーを使って,二つのcloudと三つずつのmeshを選んだ様子を示している。

次の図11はマージした結果である。左ペーン上段枠でわかるように,マージ前の二つのcloudの下方には,新たに作成されたMerged meshが見える。この新たなcloudだけを選んで表示しているのが図11の画像である。

図12には,4つの地標を設置したオーバーラップ領域付近を改めて拡大表示しているが,完全にアラインそしてマージされているのが見えるだろう。

なお,保存を忘れないようにしないといけない。CloudCompareのbinファイルとして,このマージされたマップは保存できるのである。
おわりに
これでさし当たり,したいことはほぼ終了した。これだけで何ができるのか。海岸地形の3D記録ができて,その微地形の分布から,旧汀線高度の空間分布を理解する一つの手がかりになると思われる。微地形の座標値を得ることができるので,3D地形を手許で観察し,微地形の水平分布の傾向を捉えることができるだろうと思っている。他の指標による研究も進めているので,この3Dモデルを取得できる意義は大きいと感じている。
さて,CloudCompareも多少は使えるようになったので,もう少し,小さな作業を進めようかと思う。
1 スキャンした際に周辺の不要な木々などが取り込まれているので,コマンド segmentを使って,掃除したい。3Dで見ている時に,衝立のように邪魔になる部分もある。
参照:CloudCompareで不要なポイント群または面群の削除
2 座標系の垂直移動をする。得られたCloudの座標Z値を海抜高度に変更する,例えば,この例での地標1と4の上を北極軸が通っていると考えて,XY平面を地標1を中心に回転するという操作である。
参照:座標系の平行移動と回転 Mar. 1, 2022追記
3 例えば,海食崖沿いの微地形の垂直断面図も得たい。その手法もこのcloudを使って作成したいと思っている。垂直断面図は,Cross Section を見ることになる。そういえば,こういった操作って高校二年生にやっていたなあ。
以上,Feb. 20, 2022記。