UAVMVSを試してみる


# UAVMVSとは

Unmanned Auto Vehicle の略。
空路プランニング(Aerial Path Planning)の手法の一つで、趣旨はフォトグラメトリを作成するサンプル画像を撮影しに行く空路の最短経路を割り出す事が目的。

現状のドローンは、産業用でも持って1時間前後。一般用だと40~20分程がせいぜいなため、このバッテリーで一度にどれだけ取れるかということには焦点があたる。また、効率的なフォトグラメトリ用の画像サンプルの収集経路探索も求められる。
次の論文は、そこの探求や解決を目的としたもの。

[Aerial Path Planning for Urban Scene Reconstruction:A Continuous Optimization Method and Benchmark](https://vccimaging.org/Publications/Smith2018UAVPathPlanning/)


ステップとしては、
1. **MVEパイプライン**を利用して、点群とメッシュ情報を作成する
2. **UAVMVSフロー**を利用して、経路情報を作成する
の2ステップを踏むことで、最終的な撮影経路作成ができる。



# MVEとは

Multi-View Environmentの略で、多視点の視差を利用して点群情報を推定するアプリケーション。
UAVMVSでは、まずこのツールを介して点群情報を作成し、クリーンナップして、メッシュ情報に落とし込んでいる。

この部分に関して言えば、Meshroomなどのその他のMulti-View系のフォトグラメトリ点群・メッシュ生成ツールを選択することによって、パラメーターの取り回しなどや速度・精度の面で向上が期待できそう。

## MVEサンプルシーン

[UAV Pathplanning Dataset & Benchmark](https://repository.kaust.edu.sa/handle/10754/630159?fbclid=IwAR3WrcMx-uMoobBqCwoNih7fhtMQHi8IuzfALA_0ze0wT5drbJjkEreXehI)
Housing

### サンプルPly

サンプルシーンに含まれているPlyファイルの例。
以下のサンプルデータが得られるように手順を踏まなければならない。

#### gesox-mesh.ply

![Screenshot from 2019-02-13 07-14-04.png](https://qiita-image-store.s3.amazonaws.com/0/51857/a320142d-f823-9d21-6aa4-62ed8eb409c0.png)


#### airspace.ply

![Screenshot from 2019-02-13 07-12-42.png](https://qiita-image-store.s3.amazonaws.com/0/51857/0cb21ce7-dec0-0345-f0ca-a86ac19a6580.png)


## MVEの代替

MVEは、かなり重いので、もっと軽量かつ、使い勝手の良いMulti-View系ツールがないかも見ていく。

### [Meshroom](https://alicevision.github.io/)

オープンソースでフリーのツール。
ノードベースのUIが特徴で、それぞれのノードが別ライブラリ管理として独立している。
そのため、自分で拡張したりなんかもノード単位(機能単位)で行える。

![Screenshot from 2019-02-16 06-39-21.png](https://qiita-image-store.s3.amazonaws.com/0/51857/71168c6a-b41e-f97e-deb7-bb30436858a3.png)


### [Reality Capture](https://www.capturingreality.com/)

企業でも仕様例がたくさんあるツール。
エラーとなるような、評価の低い画像は自動で計算処理に含めないなどの振り分けを自動でやってくれたりする。
HoudiniのGameDevToolsetでも使えるので、そこで一連のワークフローも作れる。
後で試す予定。


### [Metashape](https://oakcorp.net/agisoft/)

これも企業での仕様例がたくさんあるツール。
もともとはPhotoScanという名前で売られていた。





# MVEパイプライン

一連のコマンドの流れ。（MVEではこれを順に叩けばいいよというやつ）

```bash:MVE.sh
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化する

デフォルトの値だと、ものすごい数の頂点を生成する。かなり重たいファイルになるので注意。

```bash
scene2pset -F2 <scene-dir> <scene-dir>/pset-L2.ply
```
![Screenshot from 2019-02-13 07-08-01.png](https://qiita-image-store.s3.amazonaws.com/0/51857/df7a4b19-90ff-0c85-928a-7ea95a82ca69.png)


## メッシュ化再構築する

これを通すと大幅に頂点数が削減される。

```bash
fssrecon <scene-dir>/pset-L2.ply <scene-dir>/surface-L2.ply
```

![Screenshot from 2019-02-13 07-11-30.png](https://qiita-image-store.s3.amazonaws.com/0/51857/906c1fd3-81b3-8afa-275b-77b015ba1357.png)


## メッシュをクリーンナップする

```bash
meshclean -t10 <scene-dir>/surface-L2.ply <scene-dir>/surface-L2-clean.ply
```


# UAVMVSフロー

一連のコマンドの流れ。


```bash:UAVMVS.sh
#!/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
```

## プロキシメッシュを作成する

```bash
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
```


## 経路生成を行う

```bash
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と


```bash
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
```

## 最短経路順の割り出し

ここでセールスマン問題を利用して最短経路を割り出している。
撮影ポイント数が増えれば、処理も重くなるか？

```bash
shorten-trajectory oblique-opti.traj oblique-opti.traj
```

## 経路情報の間の補完

経路情報が記載されたcsvファイルが作成される。
Droneのオートパイロットプログラム(Waypoint系)は、このcsv情報を流し込むことによって実装が完了する。

```bash
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
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51857/ac9d5caa-5cc8-8f17-d499-82d68c1d9b5b.png)