Web系の会社辞めてホロ転職した話

こんにちは、浅葱( @asagi_00a3af )です。 最近寒さも増してきていよいよ冬本番って感じですね。西や北の方は雪がヤバいって聞きますが大丈夫ですか? 釈迦に説法かもしれませんが、雪はたやすく現金10万円を奪うので気を付けてくださいね。私と同じ轍は踏まないように。

さて、さっそく本題ですが、本記事は退職者アドベントカレンダーhttps://adventar.org/calendars/2158#list-2017-12-07 )の8日目の記事としての公開です。縁起がいい数字もらえて嬉しいです。

私は今年の5月、半年とちょっと前ですね。バイト時代もあわせて2年半ほどお世話になっていた某Webメディア系の会社を辞め、現在の会社に入社いたしました。現在ではHoloLensを中心にxRといわれる界隈のものをいじっております。VRやARそしてMRといったものです。

今回は退職者アドカレなので現職については深く掘り下げませんが、現職についても今度書く機会があればなーと思います。

余談ですが、それにしても四日目の人

icarium.hatenablog.com

といい今回濃すぎですよね。これ以上の読む価値ってやつを提供できる気が全くしないです…。

なぜ転職したのか

転職した理由はいくつかありますが、一番大きいのはHoloLensの日本上陸です。

私はもともとグーグルグラスなどをはじめとした眼鏡型デバイスに大きな関心を持っていて、できるならばこういったブツを扱える仕事がしたいなーとぼんやりながら考えていたのですが、なんにせよHoloLens以前の眼鏡型端末って正直使えなかったんですよね。

特に国内系のはどうだろなーという感じで、それが仕事になるって感じがしなかったんです。

ところが、某Microsoftとかいう会社がそれを全部ひっくり返しちゃいまして……と語ると長くなるので割愛しますが、そんなこんなで世界で初めてといえるだろう、実用的な眼鏡型端末の登場にテンション上がっちゃいまして、その時現職の面接でも言ったのですが

「今始めないと後から何を言っても私は後乗りの人間になってしまう」

と思ったんですね。

要は、いざHoloLensが世間に認知され人気デバイスになったとき、自分はこの製品の初期型をいじってたんだって言いたかったと、ほとんどそれだけです。

退職する不安はあった?

これめっちゃあった!

というか聞いてほしいんですけどね、私の前いた会社超ベンチャー企業で、現場監督=上司=社長だったんですよ。 何言うのも何話すのも何相談するのも社長です。

不満があればそれはたいてい社長にまつわることだし、前職の誰かにお礼を、と言われたらやっぱりその相手は社長なんですよね。

そして誤解のないように言っておくと、ちょいちょい意見の合わないところはあるのですが、基本的に社長はいい人で、いい社長だったんですよね。それ故に、

「転職先が見つかったので会社辞めます」

っていう一言を言うのがとても怖かったです。

殴られると思ったし、あきれられると思ったし、あと直前に社用PC新調してもらったばっかだったのでその申し訳なさもヤバかったです。

でも、結果的にそれは言わなければならないことでしたし、今考えても、いろいろな理由があって前職を続けることには少し限界は来ていたとも思うので、なんとか不安に勝てて良かった…と今では思っています。

転職してよかった?

あまり大きな声では言えませんが、ひたすらただ良かった、とは思ってないです。

それはやっぱり今回の趣旨ではないのでやはり今回は省きますが、かといって転職しなければよかったとも思わない(というか決断に対する後悔をするのは完全に時間の無駄)ので、結果的に悪くはなってないという何となくあいまいなのですがこういう答えを置いておこうかなと思います。

やらずになんちゃらよりやってなんちゃらですね。

あと25分だよ

8日、このブログが公開されるまでの時間です。

今後の目標とか

今後という点でいうと、

  • 給料上げたい(あればあるだけうれしい)
  • 自分の制作したい(これは自分の問題)
  • 痩せたい(びっくりするくらい個人的な問題)

あたり考えています。

そのためになら(合法な範囲で)手段は問いません。

なんというか、人の役に立つことがしたいというか、自分が得しつつ他人に利益を提供できることをしたいなーと長々思い続けているのですが、果たしてそれって自分が主体にならずにやっていけるのかとか、でも自分が主体になるためには主に金、主に技術力、主に人徳なんかが足りてないんじゃないかとか思ったりしています。

最近は今まで多くの困難から逃げ続けてきたツケを強く感じる日々を送っています。もしこの投稿を読んでいる私より若い人で、私のように困難から逃げる癖がある人はいれば、老婆心ながら、困難にこそぶち当たるべきなんだと、一言添えておこうと思います。

転職について

最後に転職、というか職探しについてだけ少し書いておきたいのですが、やっぱりもう少し慎重に探すべきだったかな、という後悔があります。というか面接時にもっと質問とか要望とか言うべきなんだと。

具体的には

  • 給与交渉
  • 見込み残業代は含まれるのか?
  • ボーナス等あるのか?
  • 裁量労働なのに定時が存在する…?
  • 作業開始から納期までの平均的な時間は?

以上5点くらいは確認・意見すべきだったなと。

あ、いや、別に現職とは関係ないですよ。ええ、本当に。

そして当然ですが、上記の点は第一面接、人事面接で確認すべきです。

面接の回数が伸びれば伸びるほど疲弊するのは誰でもない自分ですからね。

最後に

最近ブログを更新していなかったのですが、今回をきっかけにまた更新していけるようになればと思っています。 個人製作はしよう。仕事も頑張ろう。冬休み中は毎日走ろう。

また、Twitterなどはじめとして開発者仲間といいますか、募集してますのでいつでも話しかけてください

Twitter麻木浅葱 (@asagi_00a3af) | Twitter

MinecraftのxR鯖も稼働中ですのでご興味のある方はぜひー。

Windows上のVisual Studio Codeからサーバー上のファイルを編集する

こんにちは、mtwandこと #00a3af 浅葱です。 最近よくいろんな人に「あさねぎさん」と呼ばれるのですが「あさぎ」です。てへ。

さて、今までHoloLensとかUnityとかの話を書いていたのですが、今回はちょっと違う話をします。 まあ、個人でUnityアプリとかHoloLensアプリとかやるのであればサーバーサイドを書く機会もあると思うので、一応関係しているということで。

なぜ?

  • とあるアプリを作っている中で、APIサーバーを立てる必要が出てきたため。
  • 今までは某リンゴ社のいいやつを会社から支給されていたのですが、今は会社が変わり返却してしまったので、Windowsからあれこれする必要が出てきた。
  • Vimが苦手(使えないわけじゃないけど、VS使えるならそっちが良いかなと)
  • rmateがなぜか使えなかった(後々になって ~ポート開放のミス説が浮上~ 色々頑張った結果textmateが必要とか、mac版しかないとか、そもそも必要以上のもの入れたくないとか、いろいろあったので。ただその後rmateを使ってないので不明)

前提

  • サーバーはCentOS
  • ホストはWindows
  • サーバーは最低限構築されている
  • サーバーサイドのSSHは構築済み
  • VSCode
  • 個人開発程度の規模を想定
  • yourname, yourServer.addressなどは適宜置き換えてください
  • 個人的な備忘録も兼ねて書いてます。記述の正確さ・信頼性は担保されるものではありません。

WindowsSSHを入れる

Windowsにはデフォルトで使えるSSHソフトウェアがないので、まずはこちら

github.com からDLします。軽量ですね。

DLできたら解凍して、好きな場所に保存。

f:id:mtwand:20170818021638p:plain

上記のような形で保存先をPATHに追加します。

そうするとこんな感じ

f:id:mtwand:20170818021730p:plain

PowerShellコマンドプロンプト上でSSHが使えるようになります。

(余談ですがインターネットに繋がっているとはいえローカルPCのユーザー名隠すのって何か意味あるんですかね)

FireWallを設定

今のままだと後々ファイルのやり取りをするときに使うポートが引っかかって正常動作しないので、ssh.exeのファイアウォール経由の通信を許可してもらいます。 コントロール パネル\システムとセキュリティ\Windows ファイアウォール\許可されたアプリ を開き、 別のアプリの許可 から先ほど保存したOpenSSH-Win64内部にあるssh.exeを追加しましょう。 サーバーの設置場所がLAN内ならプライベート、LAN外ならパブリックをクリックすればよいです。

SSHのConfigを作成

C:\Users\you\.ssh\config を作成、編集します。中身は

Host yourServer.address
  RemoteForward 52698 localhost:52698
  User yourname

のように記述します。 ちなみにですが、面倒くさがって echo "Host..." > config のようにやるのはやめた方が良いかもしれません。 私は最初これをやって、謎の \337\336 がファイルの先頭に挿入され小一時間悩みました。何だったんだあれは。

ちなみにこの先公開鍵認証などを利用するのであればIdentityFileの設定もやってしまった方が良いでしょう。 その説明は、今回は割愛します。

configの作成までできたら C:\Users\you をPATHに追加してください。sshが読みに行きます。

上記までできたらsshの実行までテストしましょう。

ssh yourServer.com と入力して yourname でログインしようとするよう動作すればよいと思います。

サーバーにrsubを導入

yum install rsub で入ると思います。 yumって使う前に yum update とかあまりしないんでしょうか。 yum check-update をしてカーネルのupdateがないか確認する、なんて記述も見たのでどうもめんどくさいことになるのかもしれないですね。 すみません、そこらへんは無知です。

ポートの開放

firewall-cmd --zone=public --add-port=52698/tcp --permanent で良いと思います。

VSCodeにRemote VSCodeを導入

これ

marketplace.visualstudio.com

いれて、VSCodeのユーザー設定に

//-------- Remote VSCode configuration --------

    // Port number to use for connection.
    "remote.port": 52698,
    // Launch the server on start up.
    "remote.onstartup": true,
    // Address to listen on.
    "remote.host": "127.0.0.1",
    // If set to true, error for remote.port already in use won't be shown anymore.
    "remote.dontShowPortAlreadyInUseError": false

これを記述します。IP等に関わらずまるっとコピペでOKです。

これを記述するとバックグラウンドでrsubとやり取りするためのサーバーが立ち上がります。

失敗すると「接続に失敗。10秒後にやり直します」みたいなアラートが出るのですが、上記設定で失敗した場合の対処方法が現在わからないので、問題が起きたらお教えいただけると嬉しいです。解決法まで教えてくれると万々歳。

なお "remote.onstartup": true の部分がサーバーの自動起動設定になっています。

こちらをfalseにする場合は F1 キーからの Remote: Start server でサーバーを手動で起動する必要があります。

SSHで接続してrsubを起動

もう後は使うだけです。

VSCode上で Ctrl + @ で統合ターミナルが立ち上がるので、統合ターミナルを立ち上げます。 ターミナル上で ssh -R 52698:127.0.0.1:52698 youname@yourServer.address のように記述。ログイン。 うまくsshできたら rsub -p 52698 /path/to/file/ のようにコマンドを実行するとVSCode上でファイルが編集できるようになります。 あとはいつも通り編集して、保存。サーバー側にも反映されます。

rsubはどうやら実行すると転送だけしたらフォアグラウンドでのプロセスは終了するらしいので、複数のファイルを同時にrsubしたり、VSCode上のターミナルでサーバーを操作したりが可能なはずです。試してないけど。

最後に

こういう、Windowsからうまいことサーバー上のファイルをあれこれする、みたいなのほとんど未経験でここまで来たので割と楽しかったです。 でもやっぱりサーバーサイドはmacみたいな優れたUNIX環境で書き上げちゃうのがストレスもないし一番のように思います。

ではまた。

HoloLensアプリの基盤になるやつ作ったよ

github.com

これ。

書きたいことは大体READMEに書いたので省略。

目的としては

  • HoloLensアプリ開発の最初の難関であるSharingまでをとりあえずすっ飛ばしたい
  • これあると自分が楽
  • なんとなくやってるんだよ感をアピールしたい

以上の三点が挙げられます。

特に深いことは考えてません。

なんというか、そもそもが自分で作った部分がほとんどないし、色々と汚かったり雑だったり、ベース部分は自分も他人のブログやらなにやら見て真似したものなので、あまり胸を張って自分のプロダクトだとは言えない状況です。

でもとりあえず、公開されば誰か使ってくれるかもしれないし、どうやったら改善できるのか誰か教えてくれるかもしれないし。

恥を忍んで公開しました。

とりあえず目下としてはプログラムできる人に見てもらってダメ出ししてもらうのと、プログラムできない人に使ってもらって感想もらえたらうれしいです。 もちろん、プログラムできる人からのお褒めの言葉も、プログラムできない人からの改善要望も随時受け付けてます。 宜しくお願い致します。

はぁ。でもなんかあれですね、ダメな部分があるとわかっているものを公開するの嫌ですね。 元々コードをきれいに書くって意識が薄いのでコード人に見られるの嫌いなんですが、本当に嫌だ。 人に見せて恥じることのないプログラムをかけるようになりたいですね。 日ペンでやってくんねえかな『美プログラミング講座』

自作HoloLensアプリで文字を入力する

こんにちは、mtwandこと00a3afです。あさぎです。

最近は日差しが強くなってきて、熱中症対策と共に、HoloLensのオーバーヒート問題なんかも気になってきました。 結露を避けつつ本体の温度を下げるのは結構気を使いますね。特にHoloLensはどうにも熱伝導率の低そうな素材が中心のガジェットなので、つい過激な方法で冷やしたくなりますが、「つい頭にきて…」では済まされなさそうなので慎重にやりましょう。いや、マジで。

さて、それはそうと前回書いた

mtholoblog.hatenablog.com

こちらの記事の続きです。

今回は

自作HoloLensアプリで文字を入力する

話をします。

uGUIは使えない

まず、uGUIは使えません。 いや、ボタンとかは使えた気がします。試してないけど…。

とりあえず、InputFieldなどは普通には使えません。 UnityEditor上だと普通に使えるのですが、HoloLensに持っていくと、タップしてもアクティブになりませんし、キーボードが立ち上がることもありません

(キーボードを呼び出す方法はあるようです)

littlewing.hatenablog.com

ただし、uGUI自体が全く動かないわけではなく、uGUIを配置して表示させることなどは普通にできますので、これはこれで利用していきます。

キーボードが出ないなら作ればいいじゃない

2vr.jp

これこれ、これですよ。

詳しくは記事を読んでもらうとして、発想だけ パク 参考にします。 特に今回はIPアドレスを前提としたものだったので、フルキーボードを読んでしまうと役不足になりますし。

今回作ったのはこういうものです

f:id:mtwand:20170729164609p:plain

0-9, ., Del, Enter ボタンをUnityのCubeから作成し、配置。それぞれに自作のKeyManagerをアタッチします。

KeyManager

KeyManagerは今回のために作成したスクリプトです。

BaseKeyManagerというスクリプトを基底クラスとして持ち、 Any KeyManagerのように命名されます。

これを三種類、今回は CharKeyManager , DelKeyManager , EnterKeyManager を作成しました。

BaseKeyManagerは MonoBehaviour を継承するクラスで、 private void OnSelect()virtual void Clicked() を持ちます。 OnSelect()GazeGestureManager で AirTap 時に呼ばれる関数で、これが呼ばれたとき、この関数は Clicked を呼び出します。

ClickedはBaseKeyManager上では動きが定義されていません。継承先であるCharKeyManager, DelKeyManager, EnterKeyManager でそれぞれ規定されます。

今回は transform.parent.gameObject.SendMessageUpwards("OnClickChar", character); のように書きました。

これでこのボタンを内包するGameObjectでボタンのクリックが検知できるようになります。

Windowを作る

今回は、多少汎用的に作りたいという思いもあり、Windowオブジェクトと、それを管理するWindowManagerを作りました。

ただこれは個人的にまだ改良したい部分があるので詳しくは解説いたしません。

さしあたっては、先程作成したキーを内包するオブジェクトと、そこにアタッチされた private void OnClickChar(string character) などのイベントを処理する関数を持つスクリプトが存在するとお考え下さい。

そして OnClickChar などの関数はそれぞれ後ほど作成するInputField上の文字列を操作する

text = GameObject.Find("InputField").GetComponent<inputField>().text + character;
GameObject.Find("InputField").GetComponent<inputField>().text = text;

のような処理をします。(Del, Enterなどのボタンも同様にそれぞれの処理を作ります)

InputFieldを配置

入力した文字を表示・保持するためのInputFieldを配置します(試してませんが3DTextでも問題はないはずです)。

先ほど作ったWindowの配下にCanvasを、さらにその下にInputFieldを作成します。

Canvasは設定を変え、WorldSpace上、Windowの中に配置されるようにしてください。HeadLockedはMR的ではないという話もありますし。

f:id:mtwand:20170729171032p:plain

↑こんな感じに

あと、uGUI使うときいつも困るのですが、デフォルトの設定どうにかならないんですかね。輪郭ぼけてるし、文字デカイし。 ってことで、これも調整します。

f:id:mtwand:20170729171230p:plain

はい。なんかだいたいこういう感じにしていつも使ってます。正しいのかどうか、私にもわかりません。どなたか最適解があれば教えてください。

起動

さて、こうしてInputFieldまで設置したら、あとはもうほとんどやることはありません。 今まで作ったObjectを正しく配置して、アプリを起動すればといりあえず、IPアドレスを入力できるダイアログが完成です。

あとはこれをPrefabやらなにやら好きなように加工して自作アプリに埋め込んでください。

KeyBoardの配置を考える必要はありますが、やろうと思えばフルキーボードも自作できると思います。アセットもあるしおすすめはしませんが…。

個人的にはこれを少し改造してGoogleGodanキーボードでも作ってみようかなと思っています。変換までやる気はないですが、かな文字だけでも打てたら少しはホロラビリティ(造語)が上がりそうですね。

詳しくは近々UnityのプロジェクトをGithubにでも上げられたらと思うので、記事を読んでもわからないという方、すぐ使いたいという方はそちらをお待ちいただくか、素直にアセット買った方が良いでしょう。

というか、AirTapを必要としない文字入力の手段が欲しいですね、音声以外で。

Sharingの接続先を入力できるようにする

どうも、mtwandこと00a3afです。

本日はSharingアプリケーションを作成する際に、Serverアドレスを実行側で設定する方法について書きます。

完成図はこちらです

ちなみに先駆者、と言いますか、既に同じことをされている方がいらっしゃるのでご紹介しておきます。

HoloLens/チュートリアル240の接続先をアプリ内で変更できるAdd-onを作った。

私はシーンの切り替えなどは恥ずかしながら経験がなく、本項においても同様の手法は使いませんのでご了承ください。

先に結論

基本的な処理の流れは以下のようになります

  1. Sharing関連の処理を全てDisableにする
  2. 接続先を入力し、その情報を SharingStage に渡す
  3. Sharing関連の処理を起動する

難しいことはないですね

Sharing関連の処理をDisableにする

具体的には SharingStage, SharingSessionTracker, CustomNessages, AutoJoinSession, ImportExportAnchorManager などです。

私はそのほかにもAppStateManatger, SpatialMapping, SurfaceMeshesToPlanes, そのほかSpectator View関係の処理をDisableにしています。

これらの処理はSharingStageを中心とするSharing関係の処理に大きく関連しているので、IPアドレスを指定しないまま勝手に動き出すと大変です。

なお、これらの処理ですが、SharingStageOnAwake で走り出す設計になっているので、(対処療法的ではありますが)アタッチされたオブジェクトごとあらかじめDeActiveしておくとよいでしょう。

接続先を入力し、その情報を SharingStage に渡す

今回はTextInputDialogなるものを自作し、その情報を同じく自作した管理クラスに渡し、SharingStageからその情報を参照しました。

ただし、SharingStageスクリプトはHolotoolkitにて提供されているスクリプトで、これを改変するのはあまり推奨されません。

先述のGameObjectごとDeActive化、というのもそもそも乱暴な方法ではありますし、Singleton化されている処理でもあるので、何か普通にもっとうまくやれる気がするので誰か良い方法教えてください。

Sharing関連の処理を起動する

今回はすべてDeActive化されているだけなのでこれを SetActive(true) すればOKです。

最後に

今回の一通りの処理はここ HololensAppBase/HololensSharingWithConfirmApplicationBase.unitypackage at master · M-T-Asagi/HololensAppBase · GitHub にまとまってるので、ご入用の方はどうぞ。 ただ、自分でもわかるほど作りが雑なのと、HoloToolKitが古かったり手加えてあったりと、恐らく普通には使いまわせないと思うので適当に切り出してご利用ください。

また、ダイアログ関連の処理については追って記事を書きます。正直こっちが本命な気もする。

自分のプロジェクトでSpectator Viewをやる方法。

こんにちは、mtwandこと00a3afです。 最近HoloLens Meetup Vol.4に参加してSpectator Viewについてお話ししました。 緊張とか不安とか色々あったけど、とりあえずいうこと言えてよかった。

さて、そのSpectator Viewですが、前回に引き続き、今回はご自身のプロジェクトでSpectator Viewを動かす方法を書きます。 ぶっちゃけ事前準備(前回の記事)ができていたら難しいことは何もないです。

また、MicrosoftさんのAdding Spectator View Support to Your Unity App、そして前回も紹介いたしましたが、中村 薫@かおるん さんの記事を参考に実行しましたので、手順についてはこちらをご参考いただいた方が良いと思います。

機材を用意する

ないとできません。 最低限

  • 開発PC
  • HoloLens
  • カメラ
  • 諸々のコード類

がないとできません。

Calibrationを実行。

Calibrationプロジェクトを自分の環境に合わせ手直しし、実行します。 実行が完了すると User/Documents にキャリビュレーションデータが出力されるので、こちらを確保しておきます。 ちなみにですが、Calibration実行後に再度Calibrationを実行すると、画像データはバックアップされるのですが、 CalibrationData.txtは消されるので、うまくいったデータがあれば忘れる前に別の場所にコピーしておいた方が良いです。

Spectator Viewの実行に必要なデータをコピーする

  • 最新のHoloToolKitをインポート
  • ここ からHolographic Camera Rigをコピーし自分のプロジェクトに貼り付ける

スクリプトの手直し(直ってました)

本項の内容は最新版のスクリプトを使っている場合は無視してください。最新版ではすでに修正されている内容です

  • RemoteSpatialMappingSource.cs を修正
    • 53行目付近を SurfaceObject surface = CreateSurface(mesh, ”RemoteSpatialMapping”, transform); AddSurfaceObject(surface); のように修正

Prefabなどを配置

  • 先ほどインポートした Addons/HolographicCameraRig の中に SpectatorViewManager.prefab というPrefabがあるのでシーンに配置
  • SpectatorViewManagerのSpectator View IP(カメラに接続されるHoloLensのIPアドレス), Sharing Service IP(HoloLensなどが接続しに行くSharingService.exeが実行されているマシンのIPアドレス)を入力、Anchor(ImportExportManagerなどがアタッチされているオブジェクト), Sharingオブジェクトを指定(シーン上に配置されているアンカー、Sharingオブジェクトをドラッグアンドドロップでアタッチ)。
  • SV_***.cs , SceneManager.csをAnchorに, RemoteSpatialMappingをCustomSpatialMappingに配置(CustomSpatialMappingという名前にする必要があるかどうか、未検証です)

CopyDLL.cmd を実行

https://github.com/Microsoft/HoloLensCompanionKit/blob/master/SpectatorView/CopyDLL.cmd を実行 この時これを普通にダブルクリックしてもダメなので、 HoloLensCompanionKit/blob/master/SpectatorViewShift+右クリックコマンドウィンドウをここで開く を実行するか、管理者権限でコマンドプロンプト、もしくはPowerShellを起動し、 HoloLensCompanionKit/blob/master/SpectatorView まで移動。 CopyDLL.cmd /path/to/your/project/Assets のように、プロジェクトのAssetsフォルダをオプションに指定し実行。

動かす

  1. まず、プロジェクトをビルドし、HoloLensに配置
  2. SharingService.exe を実行
  3. HoloLens上でプロジェクトを実行
  4. Unity Editorを実行
  5. Unity Editor側のSpectator ViewメニューからCompositorを起動
  6. Compositor Window上にカメラの映像が表示されることを確認
  7. Spatial Mappingボタンを押す
  8. 接続が成功していればSpatial Mappingが実行される
  9. Spectator Viewを楽しむ
  10. うまくいかない場合は両側プログラムを停止し、2からやり直し

トラブルシューティング

ここ らへんも参考にしてもらいつつ

  • HoloLens, Cameraの動作状態を確認する
  • キャプチャボードの動作・出力解像度などを確認する
  • 各種ケーブルの接続状態を確認する
  • Sharingの実行状態を確認する
  • Calibrationの結果を見直す
    • ここ らへんを参考にしつつ、値が正常か確認

大切なこと

あきらめない気持ち

最後に

弊社ではSpectator Viewの実験、試走などのお手伝いを受け入れています。 Spectator Viewをしたいが設備・道具がない、HoloLensが複数台ない、などの方は @asagi_00a3af までご連絡ください。 プログラムの実装など含め、ご相談をお受けします。 (あんまり大規模なものや、公序良俗に反する内容・団体からの依頼など、場合によってはお受けきれない場合がありますので、ご了承ください。最初はあくまで相談ということで、宜しくお願い致します)

Spectator Viewやった

この前仕事でHoloLensのSpectator Viewやりました。 今更か……という感じもしますが、調べてみると結構やってみた系の記事なかった気がするので、自分のハマりポイント書くついでにつらつら書いていこうと思います。

参考元

SpectatorViewの公式リポジトリ github.com

中村 薫@かおるん さんの記事。Spectator Viewの基本的な部分を全編日本語で書いてくださっている。必見。 www.naturalsoftware.jp

ANDREASJAKL.COM の記事。キャリビュレーションがうまくいかなかったときに参考にした。 www.andreasjakl.com

使えるキャプチャボードが実質限られている

これはハマりポイントというかSpectator View試すのが遅くなった理由なんですが、今日現在

github.com

Software

ということで、BlackMagicとElgato製のキャプチャボード以外使えません。 多分自分でSDK引っ張ってきて手持ちのキャプチャボード使えるようにプログラム書けばいけると思うのですが、そのあたり全く触ったことないうえ、たまたま会社に合ったキャプチャーボードのSDKがこれまた使いづらく、全然自分でやれる気配がなかったのであきらめました。

Blackmagic Intensity Shuttle USB 3.0の相性問題

正確に言えば相性問題ではなく、PCに搭載されているUSB3.0ボードの信号帯域の問題らしいのですが、要は家電量販店で買ってきたPCそのままでは動かない可能性が高い、ということらしいです。 弊社のPCは運良くというか、必要な信号帯域の確保がされていたらしく、セットアップしたら普通に使えました。 もしかしたら最新のPC(USBポート全部3.0になってるようなやつ。弊社PCはこれでした)なら問題なく使えるのかもしれません。

相性問題…?

BlackMagic使っていて、個人的に最大の問題だったのはBlackMagicの相性問題そのものではなく、BlackMagicが問題をしっかり克服して使えているのか偶然起動しただけなのかがわかってないせいで、後々キャリビュレーションなどの工程に入ったときそれが設定のミスなのか、プログラムのバグなのか、BlackMagicの相性問題なのか分からなかったところです。

具体的にはCalibration.slnをビルドして実行したとき、ウィンドウにパステルブルーっぽい画面が表示されるばっかりで、どうもキャリビュレーションが始まらない。 これは結局下記ぺー時で参照できるような

www.andreasjakl.com

BlackmagicのOutputの解像度とプログラム上で受け取ろうとしている解像度が一致しないことによる問題だった(私の環境では両方と1080p30に合わせることで成功している)のですが、前述のとおりBlackmagicの相性問題を疑ってしまい全然作業が進まなくなりました。

Blackmagicには専用のキャプチャアプリがあるのでこちらで動作を先に確認しておきましょう。 こちらで一度映ったのが確認できれば相性問題の心配はほぼいらないと思います。

そして何より、機械の声(Debugログ)をちゃんと聞こう。

キャリビュレーションAppは動いているが、HoloLens側の写真が排出されない

いざいろいろと難関を乗り越えキャリビュレーションAppが動いても、HoloLensサイドの画像(xx_holo.jpg)が排出されないことがあるかもしれません。 これはおそらく

  • HoloLensのデバイスポータルが無効になっている
  • バイスポータルのログインID・PASSが間違っている
  • HoloLensがスリープ状態、もしくは電源が切れている。

上記三点を確認すれば直ると思います。 一応キャリビュレーションは最初からやり直した方が良いです。

キャリビュレーションが終わらない?

キャリビュレーションAppは自動で終了したり、終了時に自動でCalibrationData.txtを生成したりはしません。 ある程度写真が取れて(10-20枚程度?)そろそろ良いだろうというときにはキャリビュレーションAppのウィンドウをアクティブにして、自分でEnterキーを押すことで処理を完結させる必要があります。 そうすろと30-60秒程したした後にCalibrationData.txtが生成されるので、あとは普通にプログラムを終了してOK

HoloLensの映像、切り替わりませんが…。

これは私の勘違い話なのですが、Spectator ViewはHoloLensのカメラを接続したカメラの映像で置き換えるというようなものではありません。 ので、DevicePortalなどから見るMixed Reality Captureはいつも通りのHoloLensのカメラを通してみた世界の映像になっています。 中村薫さんが紹介されいるようにサンプルプロジェクトをUnityで起動するとUnityEditorを通してSpectatorViewの世界を楽しめる(録画や撮影も可)ので、現在はそちらから、ということらしいです。

最後、これから

ここまでで私の躓きポイントを紹介しましたが、これがこれからSpectator Viewを始めようという皆さんの助けになれば幸いです。

個人的な今後最大の課題は実際に客前や出張でSpectator Viewを使うときサーバーになるPCはどうしようかな、とかそういうところですが、ほかにも現実映像とVirtual映像の合成処理を担当しているのはPCなのかHoloLensなのかとか、もし処理自体はPCでやっているのだとしたらMSの最初のプレゼンの時に見たような解像度高めのバーチャル映像をMixedにできるのかなとか、いろいろ考えています。

何より、SpectatorViewをうまく使ったアプリケーションの開発が一番大事ですね。