UAVMVSとは
Unmanned Auto Vehicle の略。
空路プランニング(Aerial Path Planning)の手法の一つで、趣旨はフォトグラメトリを作成するサンプル画像を撮影しに行く空路の最短経路を割り出す事が目的。
現状のドローンは、産業用でも持って1時間前後。一般用だと40~20分程がせいぜいなため、このバッテリーで一度にどれだけ取れるかということには焦点があたる。また、効率的なフォトグラメトリ用の画像サンプルの収集経路探索も求められる。
次の論文は、そこの探求や解決を目的としたもの。
Aerial Path Planning for Urban Scene Reconstruction:A Continuous Optimization Method and Benchmark
ステップとしては、
- MVEパイプラインを利用して、点群とメッシュ情報を作成する
-
UAVMVSフローを利用して、経路情報を作成する
の2ステップを踏むことで、最終的な撮影経路作成ができる。
MVEとは
Multi-View Environmentの略で、多視点の視差を利用して点群情報を推定するアプリケーション。
UAVMVSでは、まずこのツールを介して点群情報を作成し、クリーンナップして、メッシュ情報に落とし込んでいる。
この部分に関して言えば、Meshroomなどのその他のMulti-View系のフォトグラメトリ点群・メッシュ生成ツールを選択することによって、パラメーターの取り回しなどや速度・精度の面で向上が期待できそう。
MVEサンプルシーン
UAV Pathplanning Dataset & Benchmark
Housing
サンプルPly
サンプルシーンに含まれているPlyファイルの例。
以下のサンプルデータが得られるように手順を踏まなければならない。
gesox-mesh.ply
airspace.ply
MVEの代替
MVEは、かなり重いので、もっと軽量かつ、使い勝手の良いMulti-View系ツールがないかも見ていく。
Meshroom
オープンソースでフリーのツール。
ノードベースのUIが特徴で、それぞれのノードが別ライブラリ管理として独立している。
そのため、自分で拡張したりなんかもノード単位(機能単位)で行える。
Reality Capture
企業でも仕様例がたくさんあるツール。
エラーとなるような、評価の低い画像は自動で計算処理に含めないなどの振り分けを自動でやってくれたりする。
HoudiniのGameDevToolsetでも使えるので、そこで一連のワークフローも作れる。
後で試す予定。
Metashape
これも企業での仕様例がたくさんあるツール。
もともとはPhotoScanという名前で売られていた。
MVEパイプライン
一連のコマンドの流れ。(MVEではこれを順に叩けばいいよというやつ)
makescene -i <image-dir> <scene-dir>
sfmrecon <scene-dir>
dmrecon -s2 <scene-dir>
scene2pset -F2 <scene-dir> <scene-dir>/pset-L2.ply
fssrecon <scene-dir>/pset-L2.ply <scene-dir>/surface-L2.ply
meshclean -t10 <scene-dir>/surface-L2.ply <scene-dir>/surface-L2-clean.ply
PLY化する
デフォルトの値だと、ものすごい数の頂点を生成する。かなり重たいファイルになるので注意。
scene2pset -F2 <scene-dir> <scene-dir>/pset-L2.ply
メッシュ化再構築する
これを通すと大幅に頂点数が削減される。
fssrecon <scene-dir>/pset-L2.ply <scene-dir>/surface-L2.ply
メッシュをクリーンナップする
meshclean -t10 <scene-dir>/surface-L2.ply <scene-dir>/surface-L2-clean.ply
UAVMVSフロー
一連のコマンドの流れ。
# !/bin/bash
set -e
# Focal: 15/17.3=0.867
aspect=0.66 #4000/6000 camera resolution
focal=0.867
maxD=30
maxDR=35
minD=5
alt=15
elev=-15
f=80
s=80
# Prepare Directory Structure ==============================
# Set proper directories for your build!
binaries=/home/work/DHR/uavmvs/build/release
scripts=$(cd ~/projects/traject/uavplanning/scripts; pwd)
mveapps=/home/work/DHR/mve/apps
export PATH=/bin:/usr/bin:$binaries:$scripts
root=$(pwd)
host=$(hostname)
# Create project name of experiment
project=/home/work/DHR/
meshes=$project/meshes
models=$project/models
scenes=$project/scenes
mkdir -p $project
mkdir -p $meshes
mkdir -p $models
mkdir -p $scenes
mkdir -p $scenes/nadir
mkdir -p $scenes/recon
# Setup folder structure
overlap_dir=$scenes/overlap-${f}-${s}
plan_dir=$overlap_dir/plan
nadir_dir=$overlap_dir/nadir
oblique_dir=$overlap_dir/oblique
nadir_opti_dir=$overlap_dir/nadir-opti
oblique_opti_dir=$overlap_dir/oblique-opti
oblique_view=oblique
mkdir -p $overlap_dir
mkdir -p $plan_dir
# ==================================================
# This takes as input the point cloud representing the proxy model
# Note: if you only have a mesh or it has many holes first convert to point cloud using this command:
generate_proxy_cloud gesox-mesh.ply gesox-cloud.ply --samples=25
generate_proxy_mesh $root/$scenes/recon/gesox-cloud.ply $root/$scenes/recon/gesox-mesh.ply
generate_proxy_mesh $root/$scenes/recon/gesox-cloud.ply $root/$scenes/recon/airspace.ply \
--min-distance=5.0
generate-trajectory $root/$scenes/recon/gesox-mesh.ply oblique.traj \
--altitude=$alt --elevation=$elev --angles=0 \
--forward-overlap=$f --side-overlap=$s
optimize_trajectory oblique.traj $root/$scenes/recon/gesox-mesh.ply $root/$scenes/recon/gesox-cloud.ply \
$root/$scenes/recon/airspace.ply oblique-opti.traj \
-m 10000 --max-distance=$maxD --min-distance=$minD
shorten-trajectory oblique-opti.traj oblique-opti.traj
# This will visualize how good the reconstruction is estimated to be
evaluate_trajectory oblique-opti.traj $root/$meshes/mesh.ply $root/$scenes/recon/gesox-cloud.ply \
--max-distance=$maxDR -r recon.ply
# This converts trajectory views to spline trajectory in csv format
interpolate-trajectory oblique-opti.traj oblique_spline.csv
プロキシメッシュを作成する
generate_proxy_mesh $root/$scenes/recon/gesox-cloud.ply $root/$scenes/recon/gesox-mesh.ply
generate_proxy_mesh $root/$scenes/recon/gesox-cloud.ply $root/$scenes/recon/airspace.ply \
--min-distance=5.0
経路生成を行う
generate-trajectory $root/$scenes/recon/gesox-mesh.ply oblique.traj \
--altitude=$alt --elevation=$elev --angles=0 \
--forward-overlap=$f --side-overlap=$s
経路情報の補正を行う
MVEで生成したgesox-mesh.plyと
optimize_trajectory oblique.traj $root/$scenes/recon/gesox-mesh.ply $root/$scenes/recon/gesox-cloud.ply \
$root/$scenes/recon/airspace.ply oblique-opti.traj \
-m 10000 --max-distance=$maxD --min-distance=$minD
最短経路順の割り出し
ここでセールスマン問題を利用して最短経路を割り出している。
撮影ポイント数が増えれば、処理も重くなるか?
shorten-trajectory oblique-opti.traj oblique-opti.traj
経路情報の間の補完
経路情報が記載されたcsvファイルが作成される。
Droneのオートパイロットプログラム(Waypoint系)は、このcsv情報を流し込むことによって実装が完了する。
interpolate-trajectory oblique-opti.traj oblique_spline.csv
評価
まだ前工程がちゃんとかきだされていないため、保留中。
検証
pset-L2.ply => airspace.ply
1億3千万頂点のものから直接arispaceのproxy_meshを作成してみたもの。
$ generate_proxy_mesh Ply/pset-L2.ply Proxy/airspace.ply