気ままにI/O

プログラムとかものづくりのインプット・アウトプットのためのブログ。

Vuforiaでポジショントラッキングする手順とその周辺トピック

アウトプットしなきゃなーと思いつつ、全然ブログ書いてなかった!差し迫らないと書けねぇぇ!

というわけで、はじめてアドベントカレンダーに参加してみました。この記事は AR Advent Calendar 2018 10日目です。

ARアプリを作るためのライブラリにVuforiaというものがあります。マーカータイプのARライブラリとしてご存知の方が多いかと思いますが、実はマーカーレスにも対応しています。

ポジショントラッキングするだけなら非常に簡単なので、Vuforiaでポジショントラッキングを試す方法と、周辺のトピックについて書いてみたいと思います。

 

Vuforiaとは

VuforiaはPTC社が提供するARプラットフォームです。ARに関する製品をVuforiaブランドとしてまとめたようで、それぞれVuforia Engine, Vuforia Studio, Vuforia Chalkという製品/サービス名が付いています。

Vuforiaのライブラリを組み込んで独自のARアプリを作るときは、Vuforia Engineのサービスを使うことになりますが、本記事では簡潔に"Vuforia"と書いています。

VuforiaはiOS/Android/UWPのマルチプラットフォームで動作し、ネイティブまたはUnityを使って実装します。元々は画像ベースのマーカーARを作るライブラリだったのでそのイメージが強いかもしれませんが、2017年末ごろにリリースされたVuforia7ではGroundPlane(平面検出)などのマーカーレスARを実現する機能も追加されています。

また、Unity2017.2からはUnityエディタに統合されてより簡単に使えるようになっています。

 

ポジショントラッキングとは

ポジショントラッキングは、空間における対象の位置・姿勢をトラッキングする機能です。6DoFというやつですね。端末がどれくらい動いてどっちを向いたのかが分かるといったかんじです。

マーカーレスARで、3Dオブジェクトを現実に召喚→まわりこんで観察する、みたいなことをするには、ポジショントラッキングが必要になります。(というか基本的にマーカーレスARにはポジショントラッキングが必須な気がしますね。)

マーカーレスで地面を検出してオブジェクトを表示したりするのにはARKitやARCoreを使うイメージがありますが、前述の通りVuforiaにもマーカーレスARの機能が追加されており、ポジショントラッキングができます。

 

ポジショントラッキングを試す最短手順

Unity2017.2からVuforiaライブラリがUnityに統合されて、PlayerSettingsでポチッと設定するだけで使えるようになりました。画像マーカーを使う場合にはウェブ上でライセンスを取得したりマーカーを登録したりする手順が発生するのですが、ポジショントラッキングを使うだけなら非常に簡単な手順でできるので、その手順を紹介します。

 

環境 

Unityのバージョンは 2018.2.18f1 を使用しています。UnityでVuforiaを使用するには、Unityをインストールする際の追加コンポーネントを選択する画面で、Vuforia Augumented Reality Supportにチェックを入れておく必要があります。

 

f:id:k_nagamine:20181209095006p:plain

対応端末

Vuforia Fusion Supported Devices

  • 上のページの表にある「Ground Plane」対応の端末
  • もしくはページ下部にある「Ground Plane Minimum Requirements」に載っている要件を満たす端末

(GroundPlaneとあるけどポジショントラッキングも同じだと思う、たぶん)

 

手順

Unityを起動して適当なプロジェクトを作成したら、まずはPlayerSettingsを開いてVuforiaを有効にしましょう。

PlayerSettings > XR Settings > Vuforia Augumented Reality

にチェックを入れるだけでOKです。

f:id:k_nagamine:20181209095839p:plain

続いて、Vuforia用のカメラオブジェクトをシーンに作成しましょう。

CreateメニューからVuforia > AR Cameraを選択します。

f:id:k_nagamine:20181209100138p:plain

Vuforia関連のアセットをインポートするか聞かれるので、Importボタンを押してインポートしましょう。

f:id:k_nagamine:20181209100339p:plain

これでARCameraを配置することができました。

もともとあったMain Cameraは必要ないので、削除しておきます。

f:id:k_nagamine:20181209100816p:plain

ここまではVuforiaのどの機能を使用する場合でも共通して必要な手順です。

ここからが本番です。ポジショントラッキングを有効にするための作業をしていきましょう。

ARCameraオブジェクトについているVuforia Behaviourの「Open Vuforia configuration」から、Vuforiaの設定ウィンドウを開きましょう。

Device TrackerのTrack Device Pose にチェックを入れると、Tracking modeを選択するドロップダウンが出てくるので、POSITIONALを選択します。

f:id:k_nagamine:20181209103640p:plain

はい、これで準備完了です。たったこれだけで、ポジショントラッキングを使用することができます。簡単ですね!!

ただ、これだけだとちゃんとトラッキングできているのか分からないので、確認用に豆腐(Cube)でも配置してみましょう。

アプリを起動したときの端末の位置が原点(0, 0, 0)になるため、Cubeのポジションを(X,Y, Z) = (0, 0, 2)としてあげると、アプリ起動地点から2メートル先に1辺1メートルの巨大豆腐が出現することになります。

f:id:k_nagamine:20181209103702p:plain

さて、ではビルドして試してみたいと思います。今回はiOSでビルドしてみます。

ここで1点注意が必要なのが、iOSでデバイスのカメラを使用する場合には、PlayerSettingsのOtherSettingsにあるCamera Usage Descriptionの項目にカメラを使用する目的を入力する必要があります。このテキストは初回起動時にユーザーの許可を求めるアラートの文言として使用されます。

どこかのバージョンから自動的にデフォルトのテキストを設定してくれるようになったのですが、たしか以前は自分で設定しないといけなかったような記憶があります。

これを入力しないと起動時にそのままクラッシュして原因不明で泣くことになるので、古いバージョンで試している場合は確認しておきましょう。

f:id:k_nagamine:20181209104141p:plain

ビルドして起動するとこのようになります。

豆腐が現実空間に出現し、デバイスを持って動きまわっても豆腐は同じ場所に留まり続けていますね。ポジショントラッキングが上手くいっていることが確認できました!

f:id:k_nagamine:20181210182628g:plain


 

手順のまとめ

手順をまとめると以下のようになります。

  1. PlayerSettings > XR Settings > Vuforia Augumented Realityを有効にする
  2. ARCameraを配置する(Main Cameraは削除)
  3. Vuforia Configuration > Device Tracker > Track Device Poseを有効に
  4. Vuforia Configuration > Device Tracker > Tracking modeをPOSITIONALに

GroundPlaneとMidAir

今回は確認のためのCubeは単純にシーンに配置しただけでしたが、マーカーレスでオブジェクトを空間に固定して配置するためのオブジェクトして、Ground Plane StageとMid Air Stageというものが用意されています。

Ground Plane Stageは平面に対して、Mid Air Stageは空中に対してオブジェクトを固定します。(使用方法は公式のドキュメントに書いているのでそちらを今回は割愛します。)

単純にシーンにオブジェクトを配置することとの違いはまだしっかり理解できていないのですが、どちらのオブジェクトにもAnchorBehaviourというコンポーネントが付いています。

GroundPlaneの解説 でAnchorについて言及されており、6DoFで追跡されるポイントだというようなことが書いてあるので、カメラ画像やセンサー情報を用いて現実空間からズレが発生しづらいように何かしらの処理が行われるのかもしれません。

また、 VuforiaFusionの解説のRelocalizationの項目にもanchorが出てきているので、このあたりにも関係してきそうです。

 

マーカーとの併用 、ExtendedTracking

通常のマーカータイプのARではマーカーがカメラから見えなくなるとトラッキングできませんが、Vuforiaにはマーカー位置を推測してトラッキングを継続するExtendedTrackingという機能があります。

以前から使えていた機能ではあるのですが、あまり精度は良くない印象でした。しかし、現行バージョンではExtendTrackingにポジショントラッキングの情報が利用されるようになり、使い勝手が良くなりました。

マーカーをAR空間の入り口として設定し、そこから空間全体を使ったコンテンツに展開する、というような使い方ができます。

また、複数人が同一空間で体験するようなマルチプレイARの場合は、各ユーザーに共通した座標系を用意する必要があるので、現実空間に固定したマーカーを認識して座標系の原点とすることで、共通したAR空間を構築することができます。

この方法で、以下のようなマルチプレイARを実現することができました。

序盤で映っているロゴが共通座標系の原点になるマーカーです。

マーカー認識後は共通座標系での位置・姿勢を各ユーザー同士で同期し続けています。

ちなみにツイートにもありますが、このコンテンツはホストPCとも情報を共有しており、床に映っている犬の影はプロジェクターで現実環境に投影しています。

共通座標系で正しく位置・姿勢を正確に同期できていると、端末でレンダリングしている犬とプロジェクターで投影している影の位置がぴったり合います。

この動画はかなり良い状態で撮れましたが、実際は環境や状況によってズレてくるので、コンテンツのフローとしてマーカー認識を挟むことで位置を補正しています。

 

Vuforia FusionとARKit/ARCore

GroundPlaneの項目でさらっとVuforia Fusionという言葉が出てきました。

これは特定の機能というわけではなくて、Vuforiaの各機能のベースとなる仕組みの話です。

カメラ・センサーの能力やARKit/ARCoreといったフレームワークの対応状況など、デバイスごとに異なる様々な要素をVuforiaEngineが検知して組み合わせることで、そのデバイスが発揮しうる最適なAR体験を実現してくれるよ、みたいなことだと理解しています。

ポジショントラッキングに関して言えば、ARKit対応デバイスであれば内部的にARKitを使うし、非対応であれば独自のトラッキング処理を使う、ということになります。ARCoreについても同様です。

ただし、VuforiaFusion自体も対応端末が決まっているため、すべての端末で動作するというわけではないようです。(対応端末の一覧

理想としては、Vuforiaを使えばARKit/ARCoreを意識しなくても内部的にイイかんじに使ってくれて最適なAR体験ができます、マルチプラットフォームで!というところを目指しているのかもしれません。

今のところは、光源の推定や環境の映り込みなどはVuforiaではできないので、こういった機能が必要な場合はそれぞれのフレームワークを使って実装する必要がありそうです。

 

ライセンスキーについて

前述のポジショントラッキングの手順の説明で、おや?と思った方がいるかもしれませんが、通常、Vuforiaを使用するためはライセンスキーを取得してVuforiaConfigurationに設定する必要があります。

試用や開発中に利用するDevelopment License Keyは無料で取得でき、リリースする場合は形態や企業規模に応じてClassic, Cloud, Proの有料ライセンスを購入します。

ところが、今回の記事を書くにあたりドキュメントをいろいろ眺めていたところ、Pricing and Licensing Options  の「Can I create an app at no charge?」の項目に、

You can also deploy Unity apps that take advantage of our Ground Plane, Device Tracker and Stereo Rendering features for free without a License Key.

と載っているのを見つけました。 

なんと、Unityでマーカーレスの機能を使う場合はライセンスキーはいらないとのこと。

ホンマかいなと思ってライセンスキーを入力せずに試してみたのが前述の手順なのですが、特に問題なく動かすことができました。

Unityだけで完結するので、試す分には非常にお手軽ですね。

その下に

Once you intend to commercialize your app, you should review the available licensing options. 

と書いてあるので、商用としてアプリをリリースする場合はやはりライセンスを購入する必要がありそうです。

ライセンスに関してはアプリの形態や使用する機能によっても異なるので、リリースする場合には一度公式に問い合わせるのが良いかなと思います。

 

最後に

ARKit/ARCoreの名前をよく聞く昨今ですが、何かARのアイデアを思いついたとき、 パッとデモを作ってみる分にはVuforiaもお手軽なのでおすすめです。

Nianticneonがやりたいけど行けなかったから作ってみたデモもVuforiaでマーカーとポジショントラッキングを組み合わせています。

 

他にも作ってみたデモなどをモーメントにまとめているので、よかったら見てみてください。(AR関係ないのもあるけど)

twitter.com

HoloLensアプリのリリース日設定を間違って購入できなくなってた

起きたこと

先日、はじめてのHoloLensアプリをストアで公開しました。

kzonag.hatenablog.com

 

有料で7日間の無料試用版が使える設定にしてリリースしたところ、上記事にチラッと書いた通り試用版をDLした後に有料版購入の導線がありませんでした。

試用期限が終わったときにストアに誘導されるのかなーと思って数日放置していたところ、

 

ということになり、一度試用期限が切れると購入も再DLもできない状態になってしまいました。

 

 原因

サポートに問い合わせてみたところ、リリース日の設定が未来に設定されているためだという回答を頂きました。

HoloLensアプリを申請する際いくつか日程を設定できるのですが、今回は下記の項目を設定していました。(画像は現在の正しい設定)

 

f:id:k_nagamine:20180514125910p:plain

 

 

f:id:k_nagamine:20180514130633p:plain

 

f:id:k_nagamine:20180514130731p:plain

 

このうち、「スケジュール」というのがストアで購入可能になる日程の設定のようで、ここに間違って未来の日程を入れてしまっていました。

「申請を送信して公開する」ですぐに公開する設定にしていても、「スケジュール」で日程が指定されているとそちらが優先されるようです。

さらに今回わかりづらかったのは、「無料試用版」を「できるだけ早く公開」にしており、試用版のDLだけはできるようになっていたことです。

これにより、問題なくリリースされたと勘違いしてしまいました。

 

解決方法

「スケジュール」のリリース設定を「できるだけ早く」に変更してもう一度申請したところ、購入できるようになりました。

無料試用版をインストールした状態でストアを見ると下画像のようになっています。

また、検索可能になるのもリリース日設定が使われるようで、今回の問題を解決したと同時に検索でも出てくるようになりました。

 

f:id:k_nagamine:20180514132804j:plain

 

参考ページなど

日程等の設定についてはこのあたりに書いてます。

アプリの価格と使用可能状況の設定 - UWP app developer | Microsoft Docs

 

無料試用版の挙動についてはここに書いてました。

アプリの試用版の実装 - UWP app developer | Microsoft Docs

 

試用期限が切れた場合は

ユーザーがアプリを起動する前に試用ライセンスが期限切れになった場合、アプリは起動しません。 ユーザーには、ストアからそのアプリを購入できることを伝えるダイアログ ボックスが表示されます。

とあります。今回の場合はアプリが起動しないだけで、ダイアログは出ませんでした。 

正しくリリースされて購入できる状態になっているとダイアログが出るのかなと予想しています。

 

まとめ

購入できない状態になっていた原因と解決策でした。

先行して申請しておいて良きタイミングで手動で公開する、みたいなことはモバイルアプリでもやったりするんですが、Windowストアアプリは項目が多いので設定漏れがないように注意する必要がありそうです。

試用期間が切れてアプリが起動しない&ストア誘導も無しだと、そのままアプリ削除&「起動しません」でレビューされそうで、かなり怖いなと思いました。

今後は気をつけます!

 

 

HoloLensアプリ『Boxello』 をリリースしました

※購入できない状態になっていた件について追記しました(2018/5/14)

はじめてのHoloLensアプリをリリースしました!

www.microsoft.com

5/2の時点では検索で出てこないので、リンクから飛んでみてください。

200円の有料アプリにしていますが、7日間の試用期間を設けてみたので、とりあえず試してみて気に入ったら購入してもらえると嬉しいです。(Vuforiaの有料ライセンスを使っているのでその費用が回収できると嬉しい)

ちなみに自分でも試用期間ということでDLしてみたんですが、そのあと購入ボタンが出るとかじゃないんですね。試用期間が終わった状態でアプリ開くとストアに飛ばされるとかなんでしょうか?

 

(追記)

リリース設定に不備があり購入できない状態になっていました。修正して現在は試用版インストールしてそのまま購入もできます。

詳しくは下記事にて。

HoloLensアプリのリリース日設定を間違って購入できなくなってた - 気ままにI/O

 

動画

youtu.be

このアプリはMicrosoft HoloLens アプリケーションコンテストに向けて制作したアプリです。コンテストに概要紹介動画が必要だったのでPV風に作ってみました。

 

アプリ概要

オセロの盤面を立体にしたゲームです。相手を挟んで自分の色にするのはオセロと一緒です。

ポイントは、立方体をマスに分割した構造になっていて、辺・角のマスが複数の面に属している点です。これにより面をまたいで相手を挟むことができ、グルっと一周挟んで裏返すようなこともできます。

盤面のサイズは4・6・8・10の4段階で選択できます。10にするとマジで終わらないので初めは4からプレイすることをお勧めします。

プレイ人数も2~4人まで設定できます。アタック25のパネルのイメージに近いですかね。

そしてココが肝ですが、ローカルなWi-Fi通信でのマルチプレイに対応しており最大4人対戦できます!実装的にはUNETでコマンドとRpcあたりを使って状態を同期しています。

実は3人以上でプレイするときの問題が申請後に発覚し、公開前に一度アップデートをかけています。そのためバージョンが1.0.1.0。アプリコンテストのほうは修正前の状態になってしまったので無念です、、、

ここまでは動画で説明してるポイントですが、動画に入ってないところも紹介しておきます。

日本語・英語の2ヵ国語対応

f:id:k_nagamine:20180502121043p:plain

GoogleスプレッドシートでIDと日本語・英語を入力してUnityのエディタ拡張でアクセスしてScriptableObjectを作るようなことをしてます。インスペクターでIDを設定すれば対応するテキストが言語設定に応じてセットされるような仕組みにしてます。

マーカー・ジェスチャーでのボックスの配置

アプリを起動すると最初にボックスを配置するフローが始まります。

その際の配置方法としてARマーカーを使う方法と、ジェスチャー操作で配置する方法の2通りを用意しました。

1人でプレイする分にはジェスチャーで適当に配置すれば良いですが、マルチプレイの場合にはボックスの位置と向きを合わせる必要があります。(この位置がアンカーになるため)

このときにARマーカーがあれば簡単に位置を揃えることができます。

ちなみにマーカーはここからDLできます。 A4サイズで印刷して使ってください。

https://drive.google.com/open?id=15rOsP_qIxzHm-caf0JvgKQI0sdFhAa2b 

f:id:k_nagamine:20180502122321p:plain

ジェスチャーの場合はナビゲーション操作で回転させる

 

制作の意図・経緯

ARが一般的になった世界で遊ばれるカジュアルゲームをイメージして作っています。

元々はモバイルのARKitやARCore向けのアプリとして考えて作り始めました。というかだいたい遊べるところまではモバイル向けに作ってました。

もちろんHoloLens版も想定していたので、この時点でマルチプラットフォームで動かせるVuforia、UNETを使って作っています。

ベースができたところでHoloLensのアプリコンテストが近づいてきたので、先にHoloLens版から作ることにしたかんじです。

 

今後の展開

というわけで、モバイル版も公開したいなと思っています。モバイル版はできるだけたくさんの人にARに触れてもらうべく、基本無料にしたい。

機能的にもまだ入れられていないものがあるので、HoloLens版もアップデートする予定です。

 

 

Mixed Reality 250の動かし方メモ

追記(2017/9/14)

Unity2017.2.0b11がリリースされ、HoloLensで動作しない問題が解消されているみたいなので、これから試す人はb11をゲットするのが良さそうです。

 

 

 

はじめに

AcerWindows Mixed Reality Headset が届いたのでHoloLensとの組み合わせを試してみようとチュートリアルをやってみました。

開発環境もベータ版で動かすのにいろいろ苦労したので、最終的な環境や手順について書いておきます。

 

f:id:k_nagamine:20170905152136j:plain

注意

2017/9/5の時点で書いています。

今後のアップデートによってはこの記事の手順では動作しない可能性があります。

また、いろいろ試してみた結果なので、これ以外のバージョンでも動作する、この手順は実は不要だ、などなどあるかもしれません。

 

試してみたチュートリアル

Mixed Reality 250

HoloLensとImmersiveヘッドセット間のシェアリングコンテンツのチュートリアル

デコ氏さんが翻訳記事を書いてくれています。(5章まであります)

dhero.hatenablog.com

 

 

開発環境

PCはRazer Blade(ラップトップ)で、OSはWindows10のInsider Previewにアップデートしました。

Insider Previewにする際、どのバージョン?を取得するかの選択では「次のバージョンのWindows」「ファースト」を選択しています。

 

f:id:k_nagamine:20170905145533p:plain

 

VisualStudioのバージョンは15.2です。

Immersiveヘッドセットの開発にはUnity2017.2が必要で、現在ベータ版として提供されています。

ベータ版は現時点で2017.2.0b10までリリースされているのですが、b7以降ではHoloLensでの実機実行ができない問題があります。

そのため、b5とb8をインストールして、HoloLens向けにはb5、Immersive向けにはb8でビルドするようにしました。

ひとつのプロジェクトを複数バージョンで何度も切り替えるのが怖かったことと、後述するバージョン間でのコード修正のしやすさを考えて、それぞれプロジェクトを用意してGitで管理しています。

 

プロジェクトの準備

チュートリアルのはじめにプロジェクトファイル(.zip)を取得するためのリンクがあります。

チュートリアルはこのプロジェクトをベースに、シーンを作成してプレハブを配置していくことで進む形式となっています。

ただ、現在取得できるプロジェクトはb8向けにコードが修正されたバージョンであり、b5で開くとコンパイルエラーが発生します。

そのため、zipをダウンロードするのではなく、GitHubからプロジェクトをクローンすることにしました。

github.com

 

コミットログを見てみると「update to 2017.2b8」というログのコミットがあるので、ここでb8対応がされたことが分かります。

その直前の[485857f~]のハッシュのコミットまでプロジェクトを戻すと、b5で開いてもエラーが出ずHoloLens向けにビルドできるようになります。

ただ、コミットログをよく見るとb8対応のあとに「Fix null reference on HoloLens
」というコミットがあります。

これはHoloLens向けの修正っぽいので、b5向けに戻した[485857f~]のコミットから作成したブランチに対して、チェリーピックで修正を適用しました。

画像のようなツリーになります。

 

f:id:k_nagamine:20170905124528p:plain

 

ここまでがプロジェクトの準備です。

HoloLens向けにはb5用ブランチから、Immersive向けにはmasterブランチから、それぞれチュートリアルの内容を進めていきます。

両方で同じ作業したくないので、b5用ブランチで進めてコミットし、それをmaster側にマージして進めました。(正確にはmaster直接ではなく、masterから作成したb8用ブランチに)

 

チュートリアルを動かすための修正

プロジェクトの準備ができたらそれぞれビルドして実機で起動することができます。

しかし、チュートリアルを最後まで進めただけでは正しくコンテンツが動作しなかったため、いくつか修正した点があります。

 

CapabilitiesのInternetClientの追加

チュートリアルの準備のところに書いてありますが、UNETが使われているためUDP通信ができる状態にする必要があります。

はじめ試したときに接続がうまくいかず、UDPでの接続実験などいろいろ試して、翌日にCapabilitiesにInternetClientを追加したら接続成功しました。

ただ、これは本来必要なさそうな気がするので、たまたまそのタイミングでうまくいっただけで、自分のネットワーク環境によるものかもしれません。

 

f:id:k_nagamine:20170905145350p:plain

 

カメラのNear/FarClip設定

Immersiveで起動すると、遠景が切れたような不自然な表示になっていました。

CameraのClip設定が効かない不具合があるようで、それが原因だと思います。

以下の記事で回避方法が紹介されていたので、参考にさせていただきました。

XVI Inc. | Immersiveヘッドセット向けアプリ開発落とし穴集 (Unity 2017.2.0b10)

※現在はb10向けに記事が更新されていていました。b10ではFarClipのほうは修正されているようですね。

 

LevelControlコンポーネントの設定

実はチュートリアルのプロジェクトには各章ごとのシーンも含まれていて、完成版のシーンを確認することができます。(AppPrefabs/Support/ChapterScenes/Chapter5_Collaboration_Finale.unity)

チュートリアルに沿って自分で作成したシーンと完成版のシーンを比べると、UslandオブジェクトのLevelControlコンポーネントの設定が異なっていることに気づきました。

完成版に合わせて以下の変更をしました。

・"Parent Object"がNoneになっているのでUslandの子であるMixedRealityLandを設定

・"GiantAvatar"がPlayerAvatarになっているのをGiantCloudsプレハブに変更

 

f:id:k_nagamine:20170905145228p:plain

 

完成

以上の対応をしたところ、実機で正しく動作しているであろうところまで確認。HoloLens x 2、Immersive x 1の計3台でのシェアリングに成功し、コンテンツも最後までプレイして最初に戻り再プレイができました。

ここまで対応したリポジトリを以下に公開してます。"2017.2b5"ブランチがHoloLens向け、"2017.2b8"ブランチがImmersive向けです。

github.com

 

おわりに

InsiderPreviewの正式リリースやUnityベータのアップデートにより状況は刻々と変わっていくと思いますが、今このタイミングで試そうとしている人にとって、少しでも参考になれば幸いです。

 

「GoogleがTangoブランドをリタイアする」という記事を見て考えたARのことアレコレ

タイトルの記事はコレ。

Google retires the Tango brand as its smartphone AR ambitions move wider | TechCrunch

 

記事を見て考えたことをツイートしようと思ったけど長くなりそうだから久しぶりにブログに残しておこうと思って書く。

取り留めもなく書いたもので脈絡が無かったり推測や妄想が多分に含まれているので、読んでくれている方はご注意くださいませ。

 

さて、まずは前述の記事。

英語力が足りず正確には理解できないんだけど、Tangoは特別なハードウェアが必要でなかなか本格的な普及には至らず、AppleのARKitに追随して現状のハードウェアで使えて多くのユーザーをターゲットにできるARCoreにシフトした、みたいなことなのかなーと思って、Tangoの立ち位置がどうなるかよく分からんなーとモヤモヤ。

どうなるのかなーと思って読み返して、別の記事へのリンクがあるのに気づきそれも読んで見る。

Google shows off ARCore, its answer to Apple’s ARKit | TechCrunch

 

注目したのがココで、

“We’ve architected ARCore to be able to perceive a wide variety of sensors,” Google AR/VR head Clay Bavor told TechCrunch. “We foresee, in the future, many more phones having depth-sensing capabilities and as those come into mainstream phones, that’s great, ARCore will work seamlessly with those and benefit from the additional sensing capabilities.”

いずれはより多くの端末がデプスセンシングできるようになって、それが主流になると思ってるから、ARCoreは追加されてくるセンシング能力をうまく取り入れて使えるように設計されてるよ、みたいなことをGoogleのAR/VR部門の偉い人が言ってるぽい。

 

2つの記事を読んだまとめとしては、いずれTango的なものが主流になると思うけど、まだなかなか普及させるのは難しいから一旦Tangoを前面に出して推すのは置いといて、今のハードウェアで多くのユーザーにリーチできるARCoreという枠で進めていきますよ、Tango的なものもその枠でいずれやっていきますよ、というかんじなのかなと思った。

 

次に、そもそもARKitとARCoreでどんなことができるんだっけーというところで、どっちも試せてない上に簡単に調べた程度なのでアレだが、どちらも平面検出、光源推定、端末自身のトラッキング、あたりが主な機能なのかなという印象。

前述のARCoreの記事に載ってる写真が分かりやすくて、キャラクターの3Dモデルが現実世界の床に建っていて、現実世界と同様に影が落ちてる。

んで、これを見てパッと思ったのが、インスタ映えしそうだなーということ。

誰でも簡単に写真・動画を撮って、綺麗に加工して、投稿して、いろんな人に見てもらったり、友だちと内輪で楽しんだり、そういう楽しみ方が日常になった今の世界で活かすのに必要十分なAR、というのが、初期のARKit / ARCoreが見ているところなのかなーと勝手に納得した。(僕はそういった楽しみ方をよく分かっていないのであまりピンと来てないけど)

 

続いて技術的なところで、単純なカメラでどうやって平面推定とかしてるんだろうという疑問。これはよく分かってないけど、画像から特徴点出してそれを連続した画像間でトラッキングすることで点の空間上の位置を推定して、平面とか出してるかんじかな。デプス画像ができてるわけでは無さそうだし。あとは加速度やジャイロのデータも使ってるのかな。

iPhone7plusとかにはデュアルカメラがあってデプス画像的なものが取れるらしいんだけど、以下の記事によると、「デプスが取れる端末なら併用して精度上げる」みたいなことはしてないとの回答があったみたい。

【iOS 11】ARKitについてWWDCのラボで聞いてきたことのメモ - Over&Out その後

とはいえ、ARCoreがTango的な未来を見据えてるように、ARKitもそのうちデプス情報を使えばオクルージョンの処理とかも簡単にできるよーなところを考えてるだろうなーと予想(というか期待)している。是非なってほしい。

 

あと、これ関連の野生の男さんの下記ツイート見て、

 そういえばKudanもカメラ画像からのSLAMやってたよなーと思ってKudanのサイト見てみたら、「Kudan SLAM」なるもののリリースが出てた。

 

【リリース発表の件】空間・物体認識ソフトウェア技術「SLAM」を実用化へ AR/VRに加え自動運転、ドローン、ロボット分野へ独自技術を提供開始 -高精度(1mm-1cm)・高速/低消費(CPU5%以下)・ロバスト性に強み- | Kudan株式会社 | Kudan Inc.

 

この動画とかすごい。特徴点を空間にマッピングして点群を生成しつつ自身の位置も空間上でトラッキング。IMU使わずにカメラ画像だけでやってると。リアルタイムでできてるのかな。すごい。

 

www.youtube.com

 

画像の特徴点をマッピングしてできる点群ってどれくらいの粗さなんだろうか。

精度が上がっていったら、デプスセンサを使うのと同等の点群ができるのかな?その点群からメッシュ作ったり、オクルージョン処理することもできる?

 

というのも、AR的な世界が進むと、現実の世界にデジタル的なものが違和感なく溶け込んでいるようになる。MicrosoftのMixedRealityが見据えているのはそういう世界なんだろうなーと思っていて、HoloLensを使ってるとその第一歩が垣間見れるかんじで非常にワクワクする。

そのHoloLensの体験で衝撃なのが、高精度のトラッキングと、現実空間のメッシュ化とそれを利用したオクルージョンの処理。「そこにある/いる」感。

なので、ARKitやARCoreやKudanでも、特別センサーが付くとかデプス画像が取れるかというのはさておき、点群が取れてオクルージョンなどの処理ができるようになるとしたら、未来の世界に近づくなーと期待してしまうわけです。

 

と、いうところで、本当に取り留めのない内容になってしまったけど、特にまとめとかはないです。最後まで読んでくれた皆さんありがとうございます。

Tangoのこと書いたけど、ここ3日くらいはHoloLensとImmersiveヘッドセットのシェアリングのサンプルと格闘してます。明日には動きますように。

あと、もう少ししたらいろいろ落ち着くので、こういう話を肴にお酒飲んだりする会をしたい。@ふくおか

 

では。

 

 

JoyConをUnityで使うときのインプット設定

Nintendo SwitchのJoyConはBluetoothでPCに接続するとジョイパッドとして認識される。

JoyCon(L)とJoyCon(R)はそれぞれ別ものとして認識される。

つまり両方接続すると2つのジョイパッドが接続された状態になる。

 

Unityではジョイパッドを入力として扱うことができる。

一般的なスティック・ボタンはデフォルトで設定されてるので接続するだけで使える。

ただしデフォルトの設定では複数のジョイパッドからそれぞれの入力をとることはできない。

デフォルト以外のボタンや複数のジョイパットの入力を別々に扱いたい場合はEdit > Project Settings > Input で設定する必要がある。 

JoyConを左右それぞれ手に持って同時に使う場合はこれに該当する。

そのための設定を調べてみたのでメモしておく。

 

自分の環境ではJoyCon(L)はUnity上でのJoystick 1、JoyCon(R)はUnity上でのJoystick 2になっていたのでその場合での設定。

JoyNumはJoystick1かJoystick2を指定。

ボタン系は "joystick 1 button 0" のようにジョイパッドとボタンの番号を指定。

各ボタンとスティック軸の番号は以下。

 

入力種別 軸/番号 その他
左スティック(左右) 10th  
左スティック(上下) 9th Invert
左スティックボタン 10  
2  
1  
3  
0  
L 14  
ZL 15  
SL(左) 4  
SR(左) 5  
8  
キャプチャー 13  
     
右スティック(左右) 10th Invert
右スティック(上下) 9th  
右スティックボタン 11  
A 0  
B 2  
X 1  
Y 3  
R 14  
ZR 15  
SL(右) 4  
SR(右) 5  
9  
ホーム 12  

HoloToolkit-Unityを一発でダウンロード&インポートするエディタ拡張

HoloLensアプリケーションをUnityで開発するときに便利なのが、MicrosoftGitHubで公開しているHoloToolkit-Unityというツールキットです。

利用するためにはクローンするかZIPをダウンロード&解凍した後、HoloToolkitプロジェクト全体をUnityPackageとしてエクスポートし、自分のプロジェクトでインポートする必要があります。

一度パッケージ化しとけば使いまわせはしますが、HoloToolkitの更新があった場合には再度、取得→パッケージ化→インポートする手間が発生します。

そこで以前、

kzonag.hatenablog.com

という記事を書きました。

これは、HoloToolkit-Unityを自分のリポジトリにサブモジュールとして追加し、エディタ拡張でパッケージ化→インポートを自動化してみた、という話でした。

本格的に開発する場合はHoloToolkitのソースも欲しいのでこれで良いかな、と思っているのですが、テスト用のプロジェクトを作って軽く試したいときにその都度サブモジュール追加して〜というのは正直メンドくさい。。。

 

というわけで、もっと簡単にHoloToolkitを導入するためのエディタ拡張を実装してみました。

このスクリプトを任意のEditorフォルダに入れると、メニューに"Assets/Import HoloToolkit"という項目が追加されるので、それを実行するだけです。

するとGitHubからZIPをダウンロードし、ZIP解凍、Unityパッケージ化、インポート、が自動で行われます。とっても簡単ですね!

 

注意点としては、ZIP解凍のためにWindowsPowerShell v5のコマンドを利用しているので、基本的にはWindows10でしか動かないと思います。(未確認ですが 

まあ、HoloLens開発自体がWindows10じゃないとできないので問題ないはず・・・!

 

あと、ダウンロード、解凍、パッケージ化は非同期で処理が走っていて、一応プログレスバーは表示していますが、普通に操作できる状態になってしまってます。

アセットのインポート時のように操作を受け付けない状態にしたいのですが、その方法はまだ分かっていません、、、

 

gist.github.com