🦁

⑦[Android][Kotlin][Vuforia][AR]Vuforiaで独自VuMarkを作るのが無理ゲーすぎた話。

に公開

第1回 VuforiaでARの初めの一歩
第2回 Vuforiaのサンプルコード(Image Targetのみ)を動かしてみた。
第3回 動画再生を板ポリ上で実行するサンプルコードを作ってみた。
第4回 Vuforiaで動画再生ARを実装してみた。
第5回 Vuforia11.4.4の公式サンプルコードを動かしてみた。
お薦めしません: 第6回 VuforiaのVuMarkを動かしてみた。
お薦めしません: 第7回 Vuforiaで独自VuMarkを作ってみた。←挑戦中 ←無理ゲーすぎた
第8回 Vuforia(Image Target)を独自マーカーで動かしてみた。
第9回 Vuforia(Image Target)を独自マーカーの複数検出させてみた。

VuMarkができたら便利だったのに!

Abstruct

  • VuMarkのマーカテンプレートを作成 → 登録 → データセット取得 → 組み込んでビルド → アプリ起動までが上手くいった話
  • 最終フェーズのマーカ認識ができなかった話
  • Vuforiaのバージョン 11.4.4。

※Vuforiaには3Dモデルを認識するModel Targetと、画像を認識するImage Targetってのがあって、この記事はImage Targetの話になります。

背景

Vuforiaは昔々にFrameMarkerというものがあってですね。それがなかなか手軽で認識精度がよかったんだよなぁ。

↑こんな感じの
中心部分には画像を置いても動作する

今のバージョンなくなってて、VuMarkが継承したんだろうと思って頑張ってたんだけどね。。。

そもそもImage Targetには、一般写真やら画像やらをそのままマーカーにするImage Markerと、カスタムQRコードみたいな見た目を自由にデザインできるって喧伝してるVuMarkというのがある。

Image Markerの場合

Image Markerの方が手軽でいいのだけど、そのまま使うといろいろ運用面で苦労することになる。
具体的には、マーカー画像の追加/削除/変更が発生する度に下記手順を踏む必要がある。

  1. Vuforiaのサイトにアクセス
  2. マーカー画像登録
  3. データセット取得
  4. アプリに組み込んで、ビルド
  5. アップデートリリース ※公開してた場合

これはめんどい。かなりめんどい。
少なくともマーカー画像は動的に差し替えができないと、制約が厳しすぎてビジネスとしては展開できない。

VuMarkの場合

でも、VuMarkならテンプレート作って登録→ビルドを1回するとあとは数百パターンの認識が可能になる。ビルドし直しとかアップデートリリースとかしなくてよくて、これだったらのちのち商用展開とかも可能になる。

というのが開発のモチベーションだったんだけど、無理ゲーだったという話。
とはいえ、データセットを組み込んでビルド → 起動までは出来たので、誰かの役に立つかもという事でこの記事にまとめておきます。

ざっくり手順(この手順まではうまくいった)

  1. VuMarkをデザインしてSVGで出力
  2. 生成したSVGで、Vuforia Portalにログイン → データセット生成
  3. Android プロジェクトに導入 (.xml / .dat)
  4. kotlin/c++で検出処理を書く

準備

  • android端末
  • 開発用PC(Android Studioのインストールは済ませておく。)
  • イラレ(Adobe Illustrator)必須。※途中VuMarkスクリプトの実行必須
  • android端末をつないで、デバッグができる様にしておく。
  • SDKと公式サンプルコードは今回一緒にgithubにコミットしたんで不要。
  • Vuforiaのアカウント作成 前回の説明の準備1をやっておく。
  • Vuforiaのライセンスキー取得 前回の説明の準備2をやって取得しておく。

手順1. VuMarkマーカテンプレートをデザインしてSVG出力

第6回では断念したこの手順こそがオリジナルのVuMarkマーカーにするのに重要。
そもそもデザインするには下記手順が必須。

  • イラレ(Adobe Illustrator)のインストール
  • VuMarkスクリプト(Vuforia VuMark Designer)のインストール
    ※解凍して"C:\Program Files\Adobe\Adobe Illustrator CC\Presets\en_US\Scripts"に配置するだけ。

使い方は操作してると分かってくる。
けどあまりにめんどいので、テキストエディタでSVGファイルを作成する方法を模索したんだけど、"VuMark-Feedback"レイヤだけは自動生成部分なので無理だった。。。

無理ゲーポイント:

  1. テキストエディタではVuMark用のSVGファイルを作れない。
  2. VuMark-BrightElements と VuMark-DarkElements を対で30数個作成する必要があってうざい。慣れてる人はスクリプトとかで一括実行とかできるのだろうけど、VuMark マーカ一1個作りたいだけなのに覚えるのってコスパ悪!
  3. 検証スクリプトがあって、実行するとデザインのまずいところをエラー表示して説明してくれるんだけど、これが全然わからない。

    ※概要は分かるんだけど、具体的に何が悪いのかは勘まかせ。ドツボにハマること多数。。。
  4. レイヤ順はSetupスクリプトのままだと、VuMark-xxxElements系が隠れてしまう。ここでもハマってしまった。

それらを乗り越えて、無事SVGファイルをゲット。

テンプレートだから余計なピンクとかが含まれる(自動生成部分で必要)

手順2. 生成したSVGで、Vuforia Portalにログイン → データセット生成

データセット生成の手順はざっくりとは下記の通り。
  1. Vuforia developer portalにログイン
  2. 作成したVuMarkマーカテンプレートを登録
  3. VuMarkを生成 → ダウンロード
  4. データセット(xml / dat)をダウンロード

  1. Vuforia developer portal にログイン

  2. Target Manager → Generate Database 押下

    Database Name: 適当に
    Type: VuMark
    → Generate 押下

  3. aaa 選択

  4. Add Target 押下 → 下記入力 → Add 押下
    File: 手順1で生成したsvgファイル
    width: 5cmとするので0.05
    Name: momo001 ※これも適当に

  5. 待つ。
    1分ぐらい。
    Processingになってるので完了まで待つ。画面下部にRefreshボタンがあるので表示更新はこれを使う。

    ※この手順で Status が Activeになった時はかなりホッとしたょ。。。

  6. VuMarkを生成 → ダウンロード
    Generate VuMark 押下 → 下記入力 → Download
    ID: 111 ※これも適当に
    Graphic Format: PNG

  7. 得られたVuMarkマーカがコレ↓
    動作確認時に、このマーカーをスキャンさせる。

    ピンクっぽい枠線がなくなっている

  8. データセット(xml / dat)をダウンロード
    Android Studio, Xcode or Visual Studio を選ぶ(Androidアプリだからね)

  9. ゲット!!

手順3. Android プロジェクトに導入 (.xml / .dat)

1. 下記に今回のコードをコミットしたのでそれをDL。

https://github.com/aaaa1597/AndKot-VuforiaVuMarkSample

2. Android Studioでプロジェクトを開く。

cloneしたAndKot-VuforiaVideoPlaybackを開く。

3. 認証情報を設定した後、ビルドする。

Vuforiaのライセンス画面を開いて license Key をコピー。

            ↓
Android Studioで、"AppController.cpp"を開き、licenseKeyに、準備2でコピーしたライセンスを貼り付けます。
そして、ビルド。

※もし、この手順を飛ばしたら、アプリ起動時に下記エラーが発生します。

4. 手順2でDLしたvuforiaのデータセット(.xml/.dat)をプロジェクトに組み込む

ゲットした aaa.zip は解凍するとaaa.xml / aaa.datの2ファイルが出来るので、その2つをAndroid プロジェクトに追加する。

app/
└── src/
    └── main/
        └── assets/
            └── VuMark/
                ├── aaa.dat
                └── aaa.xml

手順4. kotlin/c++でVuMark検出処理を書く

ソースコードみて下さい。

AppController.cpp(806-822)
+   if (mTarget == VUMARK_ID) {
+       auto vuMarkConfig = vuVuMarkConfigDefault();
+       vuMarkConfig.databasePath = "VuMark/aaa.xml";
+       vuMarkConfig.templateName = "vumark_aaa999_ok2"; // ← aaa.xmlに記載の内容
+       vuMarkConfig.activate = VU_TRUE;
+
+       VuVuMarkCreationError vuVuMarkCreationError;
+       if (vuEngineCreateVuMarkObserver(mEngine, &mObjectObserver, &vuMarkConfig, &vuVuMarkCreationError) != VU_SUCCESS)
+       {
+           LOG("Error creating VuMark observer: 0x%02x", vuVuMarkCreationError);
+           mErrorMessageCallback("Error creating vumark observer");
+           return false;
+       }
+   }
-   if (mTarget == IMAGE_TARGET_ID)
+   else if (mTarget == IMAGE_TARGET_ID)

で、実行。ここまではうまくいった。
※読込み処理に成功した時もホッとした。

githubはここ↓
https://github.com/aaaa1597/TriedVuMark
※ 失敗情報が役に立つかは疑問だけど。

中身の説明
.gitignore           ... 気にしない
MortonTuxedos.ai     ... Vuforia公式のサンプル
MortonTuxedos.svg    ... Vuforia公式のサンプル
MortonTuxedos_temp.ai... 作業の残骸
README.md            ... 気にしない
Vumark_aaa999_ok2.svg... イラレのVuMarkスクリプトで成功したもの
vumark_aaa999_ok.ai  ... イラレのVuMarkスクリプトで成功したもの
vumark_aaa999_ok2.ai ... これも成功したもの

最終フェーズ マーカ認識ができなかった話

あとは、動作確認するだけ。手順2.8でゲットしたマーカをスキャンさせてみたけど認識せず
ここで心が折れた。。。

無理ゲーポイント:

  1. 生成したマーカーが動作するかどうかって、マーカ作成段階では分からなくって、最後の最後動作確認させるまで分かんない。
    認識しなかったときの心的ダメージはいかほどか。。。

まとめ

VuMarkを使う時の注意点は、VuMarkマーカーのデザインに尽きる。

  • そもそも Adobe Illustratorが必須というね。(けっこうお高いのに!)
  • VuMarkのデザインは相当めんどい。
  • だけど動くかどうかは不明。
  • VuMark作成の有償サービスなし。

結論: VuMarkは手を出さない様がよさげ。
(時間を溶かしてしまったょ orz)

次の挑戦は

Image Markerの方で、Vuforia昔バージョンの FrameMarker的な使い方ができないか検証する。

追記 25.09.22

新アイディアが浮かんだので、新規にVuMarkを作り直したんだけど認識せず。orz
"認識の強いサンプルマーカーの一部を枠にすればイケるんじゃね?"的な発想だったんだけど。。。

↑コレ。枠にサンプルマーカーの一部を追加した。

新アイディア関連ファイル
vumark_aaa999_ok3.ai    ... イラレのVuMarkスクリプトで成功したもの
Vumark_aaa999ok3.svg    ... イラレで出力したSVGファイル

                              「誰かの役に立つと思って」

Discussion