JackMasaki’s blog

掲載した記事ネタや作ったアプリ、参加したイベントレポートなどを掲載します

銀座VR3で展示した"REFLECT-ON"の開発フローとか

こんにちは。

この記事は技術的な内容はあまりなく、展示した作品の話とその開発フローを振り返るポエムな記事になります。

今回、銀座VR3というイベントに出展をさせていただいたREFLECT-ONというコンテンツはこんな感じのものです↓

REFLECT-ONはおよそ1ヵ月で開発し、展示したコンテンツです。

この作品がどうやってできたか。を振り返りながら書いていこうという奴です。


これはこの作品に限った話ではないのですが、私の所属しているMark-onでは概ね次のようなフローで展示しているVRゲームの開発をしています。

  1. 開発する"遊び"の選定
  2. 類似する作品の研究
  3. " 遊び"への要素の追加
  4. ” 遊び”のルールの作成
  5. 要素のバランス調整
  6. 最低限のゲーム内容で"遊び"を確認
  7. 見た目、聞こえ方の調整
  8. 初見プレイの感想からのフィードバック

ざっくりですが、順に解説します。

1. 開発する"遊び"の選定

ゲームを開発するにあたって、私がもっとも重要だと考えているのは、「そのゲームは何を"遊び"の軸に据えているのか」です。

これは今回の作品でいうと「球を跳ね返す」ということになります。"遊び"の軸はシンプルなほど太く、複雑なほど細くなります。

VR技術を使用したコンテンツは、ただでさえ味付けが濃くなりがちです。であればVR技術という濃い味付けに負けない太く強い軸である必要があると考えています。

また、軸自体が面白くないパターンを除き、要素を追加して複雑化したコンテンツであってもぶれにくく、開発中に迷った時の立ち戻れる指標になります。

2. 類似する作品の研究

"遊び"の本質が似ている作品はとことん調査します。そして、なぜこの"遊び"は面白いのか。を研究します。

VR技術を使用したコンテンツであっても、類似する”遊び”を持つ作品が必ずしもVR技術を使用しているとは限りません。

今回の"REFLECT-ON"で"遊び"が近かったものはまずエアホッケー、PONGなどです。元々"遊び"がシンプルなこともあり、また長く愛されている作品も出ていることから今回はやりやすい例だったと思います。

3." 遊び"への要素の追加

”遊び”の本質だけでは見たことがある、やったことがある作品になってしまい、興味を持つ人、手に取る人は限りなく少なくなってしまいます。

ここではアイディアを盛り過ぎても構いませんので、雑談をしながらこんなのどうよ。あんなのあったら素敵とアイディアを出します。お酒を飲みながら、食事をしながら、なんてのもいいかもしれません。

f:id:JackMasaki:20190918033229j:plain

今回は"ゲームをシンプルにしてエフェクトなどに力をいれる"というテーマもあり、アイディアとしてはエフェクトの見せ方などの話が多かった記憶があります。

ゲームに介入した追加要素は”球道予測線”システムという球から予測線が出て、そこさえ守っていれば確実に球を跳ね返せる仕組みでした。

f:id:JackMasaki:20200315000447p:plain

4.” 遊び”のルールの作成

ゲームはルールを制定し、限られたルールの中で競いあうものです。スポーツをイメージすると分かりやすいと思います。

なので"遊び"を"遊び"たらしめるルールを作っていきます。

今回の作品では「球を跳ね返す」、では跳ね返せなかったら?→点を取られる→ミスが少なく点を多く持っていた方が勝ち。というルールです。

5. 要素のバランス調整

ルールができると、上手くいった。失敗した。という行動が生まれます。

これをリスクとリターン(ストレスとリワード)として各要素を分解して分けていきます。不必要になった要素はこの段階で削除していきます。

例えば今回でいうと球がゴール(自分)に迫ってくるのは点を失うリスクになります。しかし、上手く打ち返せると爽快感とともに自分から球が遠ざかっていくというリターンが与えられます。

ここで重要なのはリスクとリターンのバランスです。リスクが大きくリターンが少ないものは選択肢として外れ、リスクが少なくリターンが大きいものはマンネリ化しがちです。

6. 最低限のゲーム内容で"遊び"を確認

そもそも面白いのか、要素はどうなのかを確認するために、いままでの内容を踏まえて、見た目や聞こえ方を全く考慮しないゲームを作ります。

f:id:JackMasaki:20200315005333p:plain

ここでのプレイは開発者同士でプレイします。ルールの調整や、要素が足りない、不必要な要素があるなどのゲーム性に関する調整はここでします。

ちなみに、この辺りで内製デバッグ用ツールを作っておくとあとがかなり楽になります。

f:id:JackMasaki:20200315000548p:plain

ゲーム性に関する調整が終わったら一度、音楽や見た目を担当する人にプレイしてもらうと次の世界観作りが伝わりやすいかと思います。

7. 見た目、聞こえ方の調整

ゲームの”遊び”ができたらその”遊び”に合った世界観を作っていきます。

主に画像や音声といったアセットを追加していくフェーズです。

f:id:JackMasaki:20200315000743p:plain

3." 遊び"への要素の追加で出た見た目に関する要素はここでもう一度入れたほうがいいのかを議論しつつ追加していきます。

個人的には、コンテンツに音声を付けるのは最後にした方がいいと思っています。これは音声をつけると途端にコンテンツが完成した気持ちになってしまうためです。「思ったよりできてるじゃん」→「進捗まだまだだった…」を防ぎます。

余談ですが、Mark-onで開発してるゲームのアセット類はイラスト、モデル、音声などもすべて内製です。

どうしても世界観を統一したいとなった時に配布されているアセットだと、世界観がバラバラになるか、ほかの作品とほぼ同じ世界観になってしまうためです。

8. 初見プレイの感想からのフィードバック

見た目、聞こえ方の調整ができたら初見の人にプレイしてもらいます。

この時できればリモートではなく、同じ場所でプレイしてもらうのがベストです。特にVRコンテンツではフィードバックにプレイヤーの動きも含まれるためです。

初見の方にはルールも教えないでプレイしてもらう事が多いです。というのも、このフェーズまでくると開発者はどうしてもゲームに慣れてきて熟達化してしまいます。それが、初見さんのプレイではそんな操作しないだろう、そんな状況は発生しないだろうということが簡単に発生します。

ここでフィードバックをまとめてバランス調整をしていき、展示に向けて準備していきます。


個人勢が趣味でVR技術を使用したゲームの開発、展示などをする際の一助になれば幸いです。

docs.google.com

こちらにチームメンバーが書いてくれた展示するときの工夫に関するスライドもあるので合わせてご覧ください。

続けて展示するような作品であれば、展示した際の感想や質問、アテンド側の気づきなどをまとめて共有しておくと次の展示で活かせたり、ゲームの調整ができたりします。

REFLECT-ONについて

REFLECT-ONですが、当初は銀座VR3でのみ展示の1回きりのコンテンツの予定でしたが、上海で行われたMaker Carnivalで展示させて頂いたり、大変ありがたいことに「もう展示しないんですか?」「ストアには出さないんですか?」と言った声を多くいただいております。

現時点でお答えすることはできませんが、今後も気長に見守ってもらえれば幸いです。

PlayFabでアバター画像のURLを引っ張ってこようとして詰まった話

今回はタイトルにある通り"PlayFabでPlayerのアバター画像のURLを引っ張ってこようとして詰まった話"です。

PlayFabに関してはこちら

jackmasaki.hatenablog.com

そもそもの話、アバター画像のURL(AvaterURL)というのはなんぞやというと、 PlayFabの各Playerごとにもっているアカウント情報の1つになります。

f:id:JackMasaki:20200314223926p:plain

アバター画像のURL(AvaterURL)はStringで保存されていて、ユーザーごとにアイコン画像を設定する際などに使えます。

試しにURLを設定してみると...

f:id:JackMasaki:20200314224537p:plain

こんな感じでプレビューが表示されます。

じゃあこのURLをクライアント側に持ってこよう!となったときにどうするかというと、 アバター画像のURL(AvatarUrl)はGetPlayerProfileResultに含まれているため、GetPlayerProfileRequest()で持ってこれるはずです。

jackmasaki.hatenablog.com

というわけでアバター画像のURL(AvaterURL)を設定してGetPlayerProfileRequest()で呼んでみます。

f:id:JackMasaki:20200314225810p:plain

URLは"https://hogehoge"に設定し、わかりやすくするために表示名に"JackMasaki"と入れてみました。

Unityで通常通りPlayFabログインを行い、下記のコードで表示名とアバター画像のURL(AvaterURL)を持ってきてみます。

   private void GetProfile()
    {
        PlayFabClientAPI.GetPlayerProfile(new GetPlayerProfileRequest()
        ,result =>
        {
            var playerProfile = result.PlayerProfile;

            Debug.Log("表示名:" + playerProfile.DisplayName);
            Debug.Log("アバター画像のURL:" + playerProfile.AvatarUrl);

        }, error => Debug.Log(error.GenerateErrorReport()));
    }

結果をUnityのConsoleで確認します。

f:id:JackMasaki:20200314230857p:plain

???

表示名は取得できているようですが、アバター画像のURL(AvaterURL)が空になってます。

Debug.Log(playerProfile.AvatarUrl);で中身を見てみると…

f:id:JackMasaki:20200314231114p:plain

Nullやんけ…

なぜかなーと思いPlayFabのゲームマネージャーを眺めたりしていると…

f:id:JackMasaki:20200314231423p:plain

ゲームマネージャーのタイトルの設定→クライアントプロフィールオプションにアバターURLの項目がありました。 初期値がfalseになっていたので、チェックマークを入れて再度トライ!

f:id:JackMasaki:20200314231114p:plain

Nullやんけ...

docs.microsoft.com

ここを見ても取得できるような記述があります。 仕方がないので、GetPlayerProfileRequest()にProfileConstraintsを記述してリクエストを投げます。

    private void GetProfile()
    {

        var profileConstraints = new PlayerProfileViewConstraints()
        {
            ShowAvatarUrl = true
        };

        PlayFabClientAPI.GetPlayerProfile(new GetPlayerProfileRequest()
        {
            ProfileConstraints = profileConstraints
        }
        ,result =>
        {
            var playerProfile = result.PlayerProfile;

            Debug.Log("表示名:" + playerProfile.DisplayName);
            Debug.Log("アバター画像のURL:" + playerProfile.AvatarUrl);

        }, error => Debug.Log(error.GenerateErrorReport()));
    }

f:id:JackMasaki:20200314232420p:plain

ShowAvatarUrl = true;でURLゲットできました!…と思ったがよく見ると…??

f:id:JackMasaki:20200314232612p:plain

今度は表示名がNullやんけ…

というわけで

        var profileConstraints = new PlayerProfileViewConstraints()
        {
            ShowDisplayName = true,
            ShowAvatarUrl = true
        };

PlayerProfileViewConstraintsに ShowDisplayName = trueを追加してあげました。

f:id:JackMasaki:20200314233158p:plain

これにて一件落着です。

Oculus Questでのコントローラの入力取得

Oculus Questが発売しましたね。

ということでUnityでOculus Questのコントローラのボタンなどの入力を取得する方法の覚え書きです。

ビルドやコントローラの表示メモについてはこちら

jackmasaki.hatenablog.com

Oculus Questの開発をUnityで行うにあたりOculus Integrationを使用します。

assetstore.unity.com

ボタンの取得

基本的にOculus Touchと同じなので、公式ドキュメントを参考にします。

developer.oculus.com

下記のようなコードで各ボタンの入力を取得できます。

if (OVRInput.GetDown(OVRInput.RawButton.A)) {
    //Aボタンを押した際の処理
}
if (OVRInput.GetDown(OVRInput.RawButton.B)) {
    //Bボタンを押した際の処理
}
if(OVRInput.GetDown(OVRInput.RawButton.X)) {
   //Xボタンを押した際の処理
}
if (OVRInput.GetDown(OVRInput.RawButton.Y)) {
  //Yボタンを押した際の処理
}
if (OVRInput.GetDown(OVRInput.RawButton.RIndexTrigger)) {
   //右人差し指トリガーを押した際の処理
}
if (OVRInput.GetDown(OVRInput.RawButton.RHandTrigger)) {
    //右中指トリガーを押した際の処理
}
if (OVRInput.GetDown(OVRInput.RawButton.LIndexTrigger)) {
    //左人差し指トリガーを押した際の処理
}
if (OVRInput.GetDown(OVRInput.RawButton.LHandTrigger)) {
    //左中指トリガーを押した際の処理
}

中指のトリガーを除く各ボタンにはタッチセンサーがあります。ボタンを押し込まなくても触ったかどうかを判定できます。 次のようなコードで取得できます。

if (OVRInput.Get(OVRInput.RawTouch.A))
{
//Aボタンをタッチした際の処理         
}
if (OVRInput.Get(OVRInput.RawTouch.B))
{
//Bボタンをタッチした際の処理         
}
if (OVRInput.Get(OVRInput.RawTouch.X))
{
//Xボタンをタッチした際の処理         
}
if (OVRInput.Get(OVRInput.RawTouch.Y))
{
//Yボタンをタッチした際の処理         
}

アナログスティックの値取得

アナログスティックの値は次のようなコードで取得できます。

//左スティック
 OVRInput.Get(OVRInput.RawAxis2D.LThumbstick)
//右スティック
 OVRInput.Get(OVRInput.RawAxis2D.RThumbstick)

それぞれVectoer2型で返ってきます。

このほかにも取れる値があるので詳しくは公式ドキュメントを参考にしてください。

developer.oculus.com

追記

コントローラのボタンとアナログスティックを取得できる(はず)のQuest向けビルド済みのapkを置いておきます。

drive.google.com

MoguraVRさんで公開しているapkを試していただいたそうです。

www.moguravr.com

Oculus Quest向けのビルドとコントローラの表示メモ

いよいよOculus Questが発売されますね。

ということでUnityでOculus Quest向けのapkファイルをビルドしたりコントローラを表示するところまでの覚え書きです。

Oculus Questの開発をUnityで行うにあたりOculus Integrationを使用します。

assetstore.unity.com

-使用した環境-

  • Unity 2018.3.14f1
  • Oculus integration 1.36
  • Android SDK
  • JDK 1.8.0_152

Oculus Goと同じくベースはAndroidOSなので、Android SDK及びJDKが必要になります。この辺りは記事が多く書かれているので省略。

また、Scripting BackendをIL2CPPにする場合はAndroid NDKも必要になります。

developer.android.com

-Quest向けビルド-

Quest向けにアプリをビルドする際には、Switch PlatformでPlatformをAndroidに切り替えた後、 OVR ManagerのTarget DevicesをQuestに変更する必要があります。

f:id:JackMasaki:20190505130451p:plain

(PlatformをAndroidに切り替えないとTarget Devicesは表示されません)

Assets/Oculus/VR/Prefab/のOVRCameraRigにあらかじめアタッチされているのでPrefabを利用すると楽です。

-コントローラの表示-

Oculus QuestのコントローラはOculus RiftSと共通のものになります。 Oculus QuestのコントローラモデルはOVR Controller Helperの

public GameObject m_modelOculusTouchQuestAndRiftSLeftControllerと、 public GameObject m_modelOculusTouchQuestAndRiftSRightControllerに設定します。

Assets/Oculus/VR/Prefab/には既に設定済みのPrefabであるOVRControllerPrefabが用意されています。

f:id:JackMasaki:20190505130315p:plain

OVRControllerPrefabをOVRCameraRig/TrackingSpace/LeftHandAnchor/LeftControllerAnchor/とOVRCameraRig/TrackingSpace/RightHandAnchor/RightControllerAnchor/直下に配置します。

f:id:JackMasaki:20190508032531p:plain

Edit→Preferences→External ToolsにAndroid SDKのパスとJDKが設定されているか(IL2CPPの場合はNDKも)を確認したらPlayerSettingsからbuildします。

OvrAvaterのビルドに時間がかかるのでお茶をすすります

Oculus Questを開発者モードに変更し、adb installを使ってアプリをインストールします。

詳しくはこちらや他のサイトでも紹介されているので割愛します。

www.moguravr.com

動かして確認できたら完成です!やったー!

入社してちょうど1年経ったので振り返るポエム

132:本当にあった怖い名無し:2019/03/29(金) 22:00:00 id:likepizza

記念カキコ…ども…

俺みたいな新卒でHoloLensをメインに扱っている会社に就職野郎、他に、いますかっていねーか、はは

今日の会社の会話 あの流行りの自作キーボードかっこいい とか あのアセットほしい とか ま、それが普通ですわな

かたや俺は電子の砂漠でUnityを見て、呟くんすわ it’a true wolrd.狂ってる?それ、誉め言葉ね。

好きな音楽 ゲームソング 尊敬する人間 会社の人達(自己過小評価行為はNO)

なんつってる間に1年っすよ(笑) あ~あ、社会人の辛いとこね、これ

...

..

.

入社してちょうど1年経ったので振り返りをしてみるポエム記事です。退職記事ではないよ!

社長に記事を書いていいか聞いたところ「むしろ書いて」と言われたので真面目に書きます。

私がエンジニアとして就職した株式会社ホロラボはMicrosoftから提供されているMRヘッドセットデバイスHoloLensを主に使用し、様々な問題解決や提案をする会社です。

基本的にリモートワーク推奨や服装自由など、充実した福利厚生により、恐らく私はこの会社から転職すると生きていけない身体になってしまいました。(ありがたい…)

就職した経緯としては、大学院2年の際にHoloLensを自腹で購入し参加したHoloLensのコミュニティイベントにて、アルバイトとして拾っていただいたところから就職しています。

アルバイトからの継続であったこともあり、入社日である4月2日には入社オリエンテーションの後、週間ミーティングでは3月の残務や現在の業務の報告を通常通り行うなど、いわゆる"キラキラピカピカとした眩しい新卒像"はありませんでした。しかし、もともとHoloLensコミュニティのメンバーで構成されているような会社だったので、人見知りな僕でも会社にはすぐ馴染めました。確か入社日の段階で知らない社員の人はいなかった気がします。

業務とか

この1年で経験した業務に使ったデバイスはHoloLens以外も多く、Kinect、Zedmini、iOS用Web、Androidスマホ、RealSenseなどです。使った言語はJavaScriptC#C++などでした。

元々大学などで画像処理を専攻していたこともあってか、画像処理の部分に関する実装が多かった…のかな?興味のある分野での仕事しかしていない(他社での業務経験がない)ので比較はできませんが、楽しく仕事をしています。

謎のスキルとしてQRコードが直で読めるようになったりしましたが、趣味関係がほとんど業務で扱うということもあってか最近アウトプットの回数が減ってしまったなーという自覚はあるので、出せるところは出していきたい気持ちです。

ただし、プログラミングに関しては完全に独学(本も読まずggr&コンパイル&エラーだけ)でやってきたので、チーム開発などでいろいろと力及ばずな所はあり、この1年で少しずつ勉強できたかなと思ってます。

わからないときに聞ける心理的安全性の高い会社最高。

進捗に詰まった時に突発北海道旅行で進捗を出すなど色々と試行錯誤中で、俺の考えた最高の進捗を出す方法はこれだ!というのは自分の中でもまだ模索中です。

開発チームが一緒になったメンバーとは、そのプロジェクトで実際に開発する前にどれだけ業務以外の雑談で言葉を交わしたかが大事だと思っているので、日々雑談野郎になっている気もします。

実際、よくしゃべるメンバーとの開発では(僕が一方的に思っているだけかもしれないが)心地よく、かなりスムーズに開発が進行したので、これは続けていきたい…

お気持ち

表に出にくいのですが、いわゆる社会人と呼ばれるものに自分がなれているか。とか、会社と一緒に成長するために今必要なことはなんだろう。とか、わからんなんも…って感じでいろいろ悩んだりしてます。

周りがつよつよなエンジニアばかりなので、焦る気持ちがないと言えばウソになりますが、ここで焦ってもろくなことにならなそうなので、自分のペースで少しずつ成長していけたらなと思います。

英語とか…ね…

まだまだわからないことだらけのピュアピュアひよっこ現代若者って感じなので、いろいろと迷惑をかけるとおもいますが、頑張っていきます。

Surface+RealSense T265で6DoFARっぽい奴を作ってみる

Unity上でSurfaceのリアカメラとRealSense T265を組み合わせてARっぽい表示をしてみるデモを作ってみる記事です。

f:id:JackMasaki:20190308203256p:plain

まずRealSense T265をUnityで使うにあたりdllが必要になります。 しかし、その辺の面倒なビルドなどを全部含めてかつサンプルも含めた素晴らしいunitypackageが公開されているので使わせていただきましょう。

下記のGitHubIのreleasesページからIntel.RealSense.unitypackageをダウンロードします。

github.com

Unityで新規プロジェクトを作成し、ダウンロードしたIntel.RealSense.unitypackageからインポートします。

Build SettingsからPlayer Settingsを開き、ResolutionをWidthを1920,Heightを1080に設定します。

f:id:JackMasaki:20190308193604p:plain

Assets/RealSenseSDK2.0/PrefabsからRsDeviceをヒエラルキーに持ってきます。

続いてRsDeviceのComponentのRsDeviceスクリプトを設定します。

ProfilesのSizeを1に設定しElement 0のStreeamをPose、FormatをSixDOFに設定します。

f:id:JackMasaki:20190308194145p:plain

ヒエラルキーで空のGameObjectを作成します。名前は何でもいいです(今回はPoseにしました)

作成した空のGameObjectにRs Pose Stream TransformをAdd Componentします。

Rs Pose Stream TransformのSourceにはヒエラルキー上のRsDeviceを設定します。

f:id:JackMasaki:20190308194710p:plain

ここまでで一度動作確認をしましょう。Pose直下にCubeを置いてプレイしてみます。

T265を動かしてみて、自己位置推定の結果が反映されてCubeが動いていればT265のPoseを取得できています。

確認できたらCubeは削除します。

続いてMain Cameraの動作とT265の動作を反映させるため、Pose直下にMain Cameraを移動します。

Main CameraのTransform Positionを(0,0,0)、Field of Viewを16、Clipping PlanesのNearを0.1に設定します。

f:id:JackMasaki:20190308195435p:plain

ここまでで、Main CameraはT265の自己位置推定の結果が反映されているかと思います。

最後にWebCamTextureを使ってSurfaceのリアカメラの表示を行います。

以下のようなRearCameraTexture.csというスクリプトを記述します。

using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class RearCameraTexture : MonoBehaviour {

    [SerializeField]
    private int width = 1920;
    [SerializeField]
    private int height = 1080;
    [SerializeField]
    private RawImage rawImage = null;

    private WebCamTexture webCamTexture = null;

    private IEnumerator Start()
    {
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);

        if (!Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            yield break;
        }

        webCamTexture = new WebCamTexture("Microsoft Camera Rear", width, height);

        rawImage.texture = webCamTexture;
        
        webCamTexture.Play();
    }
}

通常、WebCamTextureを使う場合はデバイスをすべて取得し、そのデバイス番号などで使用するカメラを指定したりするのですが、今回はSurface限定ということでカメラ名を"Microsoft Camera Rear"で固定しています。

ヒエラルキーにRawImageを追加し、Widthを1920、Heightを1080に設定します。

続いてCanvasの設定を行います。

Render ModeをScreen Space - Cameraに変更しRender CameraにMain Cameraを設定します。

RearCameraTexture.csをCanvasにAdd Componentし、RawImageには先ほど作成したRawImageを設定してあげれば大丈夫です。

f:id:JackMasaki:20190308200459p:plain

以上でARっぽい6DoFななにかが完成します。

このままだと分かりづらいので何らかのGameObjectを置いてあげると確認しやすいです。(ただし、当然ですがT265の移動距離は現実空間の移動距離と同じになるので、GameObjectのSizeやPositionには気を付けましょう(1敗))

T265をSurfaceのリアカメラの下あたりに固定して動かしてみるとそれっぽく動いていると思います。

メッシュ生成とか点群とか何も触ってないのでオクルージョンとかはなんもないです。

D435iと組み合わせたりするといい感じにオクルージョンもできそうですね!!

Vuforiaとかと組み合わせれば原点合わせもできると思うので、いろいろなデバイスと空間共有できそうです。

RealSense T265が届いたので動かしてみた【SLAM.unityについて追記更新】

RealSense T265が届いたので動かしてみたポエムです。

RealSense T265はIntelから発売されているインサイドアウト方式のトラッキングがついているデバイスです。

ただし、T265にはカラー画像の取得などがないため、基本的にはロボットなどに搭載して使用するか同じくIntelから発売されているRealSense D435iなどと組み合わせて使用します。

引用:

newsroom.intel.com

The Intel RealSense Tracking Camera T265 uses inside-out tracking, which means the device does not rely on any external sensors to understand the environment. Unlike other inside-out tracking solutions, the T265 delivers 6-degrees-of-freedom (6DoF) inside-out tracking by gathering inputs from two onboard fish-eye cameras, each with an approximate 170-degree range of view. The V-SLAM systems construct and continually update maps of unknown environments and the location of a device within that environment. Since all position calculations are performed directly on the device, tracking with the T265 is platform independent and allows the T265 to run on very low-compute devices.

The T265 complements Intel’s RealSense D400 series cameras, and the data from both devices can be combined for advanced applications like occupancy mapping, improved 3D scanning and advanced navigation and collision avoidance in GPS-restricted environments. The only hardware requirements are sufficient non-volatile memory to boot the device and a USB 2.0 or 3.0 connection that provides 1.5 watts of power.

単純に使用するだけであればいつも通りIntelGitHubIntel RealSense Viewerが更新されT265に対応し、Pre-releasesとして出ているため、ダウンロードしてインストールすれば確認できます。

Intel® RealSense™ SDK 2.0 (build 2.18.1) URL:https://github.com/IntelRealSense/librealsense/releases

正式リリースはIntel® RealSense™ SDK 2.0 (build 2.17.0)が最新版になります。

XY軸だけでなくZ軸の推定も早くそれなりに高精度です。

f:id:JackMasaki:20190304165852p:plain

高速で振るなどするとロストしてしまいますが、通常使用であればそこまでロストすることはないと思われます。

ちなみに配布されているUnityPackageに関してはScenes/Samplesに更新はありませんでしたが、 build 2.18.1のComparing changesのFiles changedを見てみるとSLAM.unityなるものが追加されています。

【2019/03/06追記】Intel® RealSense™ SDK 2.0 (build 2.19.0)がリリースされ、こちらではunitypackageが更新されているとのことでSLAMシーンも最初から内包されているとのことです

リポジトリのdevelopmentブランチをクローンしてみると、wrappers/unity/Assets/RealSenseSDK2.0/Scenes/Samplesの中にSLAM.unityがあります。

https://github.com/IntelRealSense/librealsense/tree/development/wrappers/unity/Assets/RealSenseSDK2.0/Scenes/Samples

開くと怒られが大量に発生していますが、DLLがないのが原因のようなのでUnityPackageの方から持ってきたりすると動きそうです。(まだ動かしてないです。)

UnityPackageに入っているDLLはPoseなどのクラスが含まれておらず、怒られが発生します。

なので、下記のURLを参考に自前でdevelopmentブランチをビルドします。

t.co

具体的には

  1. buildフォルダをrootに作成する。
  2. buildフォルダ内でcmake .. -DBUILD_CSHARP_BINDINGS=ON -DBUILD_UNITY_BINDINGS=ON -DBUILD_SHARED_LIBS=ON -DDOTNET_VERSION_LIBRARY=3.5 -DCMAKE_GENERATOR_PLATFORM=x64をするかGUIでConfigure&Generateする。
  3. realsense2.vcxprojをVSで開いてIntel.RealSenseをビルド
  4. dll完成!

という流れです。

が、私はUnityの初期インストール位置にUnity.exeがないと怒られが発生しました(該当フォルダにUnity Hubしかなかった)そのため、C:\Program Files\Unity\にUnity Editorをインストールしたところ無事CMakeが通り解決しました。

無事dllができたらいつも通り、Untiy側のAssets/Plugins/にIntel.RealSense.dllとrealsense2.dllを入れてあげればOKです。

SLAM.unityを動かすと下記の動画のようなIntel RealSense Viewerに近い動作を確認することができます。

小ネタ

T265とD400シリーズを接続するリグを作る必要がありそうですね。

と思ったらすでに作られてました。