Makey Makeyで遊んでみた
ちょっと簡単に物体へのタッチをPCで検出したいなというお仕事があって実現方法を考えるのにMakey Makeyを参考に貸してもらいました。
ちょっと余裕が出てきたので(今年は既に気分はお正月)詳しく遊んでみました!
Makey Makeyは端子で通電を検知するとPCにキーやマウスクリックを送るもので、PCからは入力デバイスとして見えるようです。
アプリ側は単純にキーやマウスの入力に反応するようなアプリを作ればなんでもできるというわけです。
多機能なMakey Makey Classicと、よりシンプルな Makey Makey Goが発売されています。
端子の先を触れば(Classicはアースが必要なので2点、Goはアース不要なので1点)通電して音が鳴ったりいろいろできて楽しいです。
身近にコインしか使えるものがなかったのですが、野菜とかお肉とかお魚とかごはんとかなんでも楽器にできる!
結婚指輪はアースとしてもとても役立ちます。
サンプルアプリで色々演奏してみました。
楽しいし、ちょっとしたセンシングにも使えそうなのでよかったらぜひ!
Intel JOULEにWindows IoTをセットアップしてみた
一月ほど前になってしまったのですがIntelの新しい小型ボード「Joule」を貸して頂きました。
なかなか触る時間がなかったのですが少し余裕が出てきたのでOSインストールを行いました。
JouleはRaspberryPiほどのサイズでありながら、高速なプロセッサと拡張性を持ち、4K動画を扱ったりRealSense 3Dカメラを使うこともできるといいます。
Jouleで利用できるOSはLinux, Ubuntu, Windows10 IoT Coreなどがあり、恐らくUbuntuを選択する方が多いような気がするので、敢えてWindows10 IoT Coreをセットアップしてみたいと思います。
セットアップに必要なもの
キットに入っているものだけではセットアップをすることができません。
ぼくは下記のものを追加で購入しました。
- 電源アダプタ
- MicroHDMIケーブル
そのほかにも下記が必要です。
色々と必要なのでこれらを揃えるのに手間取るかもしれません。
はやる気持ちを抑えて、準備しましょう。
OSセットアップ
ここから先、WindowsIoTのセットアップについては少しハマったところもあったのですが、下記の素晴らしい記事をみつけその通りに行ったところうまくいきましたのでご参照ください。
Lチカしよう
Windows IoTのセットアップが終わり、ネットワーク接続設定も終われば下記手順でPC上のVisual Studioからプログラムをデプロイしたり、デバッグすることができます。
1.Windows 10 IoT Core Dashboardをセットアップ
ネットワーク上のIoTデバイスを検出したり管理するツールです。
下記よりダウンロードし、セットアップします。
https://developer.microsoft.com/ja-jp/windows/iot/Downloads
2.デバイスのIPアドレスを確認
IoT Dashboardを起動すると、ネットワーク内のIoTデバイスが自動検出されリスト表示されます。
デバイスのIPアドレスも確認することができます。IPアドレスは後ほどプログラムをデプロイする際に利用しました。
なお、リスト内のデバイスを右クリックし、デバイスの詳細設定などが可能なDevice Portalを開くこともできます。
(HoloLensで初めてDevice Portalを使ったのですが、IoTデバイスでもWindows PhoneでもDevice Portalを開けば色々なんとかなるというインターフェイスは統一されていていいな、と思いました。
3.VisualStudioでデバイス用プログラムを開発
開発環境の構築についてはこちらのガイドの通りに進めました。
Step3 および Step4を実施します。
Step 3 of 4 - Set up Visual Studio | Windows IoT
サンプルプロジェクトは下記よりダウンロードします。
https://github.com/ms-iot/samples/archive/develop.zip
また、ガイドの中にありますが、GPIOのピン番号は1とします。
4.デバイスへデプロイそして実行
このようにしてVisualStudioからx64指定、Device Portalで調べたIPアドレスのRemoteMachineへ向けて実行します。
これで成功するとめでたくLチカ完成です。
ちなみにVisual Studio側でブレークポイントを付ければきちんと止まってデバッグもできるのでとても開発しやすそうです。
さて、続いて本当にやりたかったこと、RealSenseの接続をしてみたいのですが、具体的な情報はComming Soonのようなので少し様子を見てみます。
何かご存知の方、ぜひ教えてください!
沖縄にセンサー&デバイスコミュニティが誕生しました
2016年11月11日から14日まで南の島沖縄に行ってきました!
全国各地にあるTMCNの兄弟コミュニティに新しい仲間、Okinawa MotionControl Network(OMCN)が誕生することになったのでキックオフイベントに参加するためです。
あとせっかくなので家族旅行も兼ねています(笑)
というか大半は家族旅行モードでした。
まずは沖縄の素晴らしい写真たちをご覧ください。
いかがでしょう。
気分は沖縄になりましたか?
それでは本題に入ってゆきましょう。
OMCN vol.01 Kickoff は琉球大学で教室を貸していただき開催となりました。
東京からやってきたメンバーもセッションをもちましたが、やはり地元沖縄の方の話がとても興味深かったですね!
「30日間毎朝1時間VRをやってみたら」
バッカム株式会社 黒川正裕 さん
30日VRをやってみたことで自らの身に起こった新しい進化を軽快に綴ったドキュメンタリー、納得感と最後の爆笑な結末!
「IGDA琉球大学のあり方とやりたい事をすぐにVRでやってみた!」
琉球大学情報工学科 武田和馬さん
内地からこの沖縄の大学にやってきた武田さん、そこで作ってきた素晴らしいVRコンテンツを披露してくれました。
今度東京に来るようなのでまた会えますね!
飛び入り登壇!
CGCG STUDIO INC. 山添 武さん
実は沖縄にあるアジア最大規模のモーションキャプチャースタジオのお話。
美少女キャラの振り付けなんかも山添さんがされているというなんとも言えないお話もw
これまで沖縄のVR事情ってどんな感じなんだろうと思っていたのですが、こうやってイベントでお会いしてみるとギークやコアな方たちがたくさんいるんですね。
本当に来て良かったです。
これがきっかけでまた新しいものが生まれてくるのでしょうね。
そしてイベントの後は観光客は絶対知らなそうな隠れ家的なお店でビールと泡盛を!
沖縄の皆さん、楽しいひと時をありがとうございました。
また呼んでくださいね!
最後にリンクやセッション資料などを。
OMCN - OkinawaMCN (公開Facebookグループ)
女子美祭アートに活かせるテクノロジー講座
2016年10月30日は杉並の女子美術大学の女子美祭に行ってきました。
遊びに行ったわけではなく最新テクノロジーに関心ある生徒さんたちに体験講義をさせて頂けることになりました。
まあとはいっても女子大という聖域に足を踏み入れられるという事実だけですでにテンションは振り切りレッドゾーンですw
講座としては「Unity講座」というタイトルになっています。
ルーム内ではvvvvを使ってカッコイイVJを作る方法だったり、スマホVRのコンテンツ体験、簡単に電子工作が学べる littleBits など最新かつ身近に始められるアートに活かせるテクノロジーが紹介されました。
ぼくは廊下にUnityで開発している「きゃらみらー」体験ゾーンを作らせてもらいました。
実際にUnity+KINECTで作品制作を行いたいという生徒さんもいらっしゃって、熱心に質問をされていました。
うまくできるといいなあ。
通りがかりの子どもたちも狂ったように遊んでいましたねw
学園祭のその他の部分や生徒さんたちの作品もゆっくり見て回ることができました。
思ったよりセンサーなどのテクノロジーを使ったものが多く、インタラクティブ作品制作に簡単に使えるセンサーがあればアートスクールの学生さんは喜ぶだろうなと思いました。
あとMacで動かせるって大事w
あとこういうポスターも面白いですねw
もっと大胆に焼きそば自体を美少年に擬人化したものもありました。
そんなわけで楽しい講義&お祭りでした。
また来年もぜひ。
CEATEC JAPAN 2016 "LAVIE Smart Mirror" 展示
今年の初め、Intel RealSenseハッカソンで「Magical Mirror」という作品を作り、最優秀賞を頂くことができました。
MagicalMirrorは家族の日々のライフログを自然につくってゆく魔法の鏡をイメージした作品です。
このMagicalMirror、ハッカソンの後もNECレノボさんそしてチームメンバーで話し合いを持ちつつ開発を進め、CEATEC JAPAN 2016 レノボブースに「LAVIE Smart Mirror」というコンセプトモデルとして展示を行うことになりました!
こんな立派なブースです!
CEATEC JAPAN 2016 Lenovoブース レポート | レノボジャパン公式
PCのディスプレイを鏡に見立てていたMagicalMirrorは本当のミラーディスプレイを得て(プロトではディスプレイにハーフミラーをDIYで貼って作りました)本当のミラーになりました。
人がこのミラーの前に立つと、インターネットから取得した天気予報、その日のニュース(読み上げ機能付き)、顔認証で特定されるその人のスケジュール、ヘルスケア情報などが表示されます。(デモ用に一部ダミー化はされています)
ジェスチャーでコントロールできる機能も用意しています。
例えば、忙しい朝に歯磨きをしている時間にこれらの情報を確認できれば時間の有効活用ができますよね。
洗面台などでは手が濡れていますからタッチではなくジェスチャーで操作できると便利なシーンもあることでしょう。
システム的には、Windows10が動作するLAVIEとIntel RealSense 3Dカメラをミラーの裏側に。アプリケーションはUnityで構築し、バックエンドはMicrosoft Azureで構築。
このMicrosoft AzureのシステムはLAVIEプリンストールソフト「InfoBoard」のバックエンドサービスと連携して天気やニュースの情報を取得します。
この LAVIE Smart Mirror、今調べてみてびっくりしたのですが国内はもちろんグローバルにかなりたくさんの記事が書かれているようです!
ここに挙げた以外にもたくさんの記事が見つかりました。
お問い合わせも来ているようなので今後さらに進化させてゆきたいですね。
その他にも今回のCEATECにはお友達が出展していたり、アワードで賞をとっていたり、いろいろと面白かったです。
家電メーカーのビジネス展示会という側面と、メイカーのお祭り的要素も出てきているなと思いました。
HoloLensをオフラインでコントロールする
状況は変わりつつありますが、諸事情でHoloLensアプリをUSB接続のみでコントロールしたいというニーズがあります。
ただHoloLensのUSBはDevicePortalへのアクセスと充電程度にしか使うことができず、通信用途には使えません。
しかし、DevicePortalのFileExprolerにはファイル転送機能があるので、この機能を工夫すればUSBでアクションを送れるのではないかと考えました。
つまりファイルをUSB経由でアップロードし、HoloLens側はファイルのアップロードを検知して何らかのアクションを実行します。
ファイル内にコマンドを書いておいて、それを解釈するようにすればなんでもできるというわけです。
ファイルの変更検知
HoloLensというかUWPアプリではファイルの変更検知を行うことができます。
下記コードで検知をおこなえます。
Controller.cs : メインスクリプト
using UnityEngine; #if NETFX_CORE using System.Threading; using System.Threading.Tasks; #endif public class Controller : MonoBehaviour { public bool isChanged = true; public GameObject cube; #if NETFX_CORE private CommandReceiver CommandReveicer { get; set; } #endif void Start() { #if NETFX_CORE this.CommandReveicer = new CommandReceiver(); this.CommandReveicer.OnCommandReceived += (s, o) => { Debug.Log(string.Format("RECEIVE: {0}", o.Command)); this.isChanged = !this.isChanged; }; this.CommandReveicer.Start(); #endif } void Update() { this.cube.SetActive(this.isChanged); } }
HoloLens実機で動作するときのみCommandReceiverクラスのインスタンスを生成し、実行します。
ファイル検知があった場合、Cubeの表示をオンオフして、それを知らせるようにしています。
CommandReceiverは下記のとおりです。
#if NETFX_CORE using System; using System.Collections.Generic; using System.IO; using System.Diagnostics; using System.Threading.Tasks; using Windows.Storage; using Windows.Storage.Search; public class CommandReceiver { public delegate void CommandReceivedEventHandler(object sender, CommandReceivedEventArgs e); public event CommandReceivedEventHandler OnCommandReceived; private StorageFileQueryResult FileQuery { get; set; } public void Start() { List<string> fileTypeFilter = new List<string>() { ".txt", }; var options = new QueryOptions(CommonFileQuery.OrderByName, fileTypeFilter); this.FileQuery = ApplicationData.Current.LocalFolder.CreateFileQueryWithOptions(options); this.FileQuery.ContentsChanged += this.Query_ContentsChanged; Task.Run(() => { var files = this.FileQuery.GetFilesAsync(); }); } public void Stop() { this.FileQuery.ContentsChanged -= this.Query_ContentsChanged; } private async void Query_ContentsChanged(IStorageQueryResultBase sender, object args) { try { var file = await sender.Folder.GetFileAsync("command.txt"); var json = await FileIO.ReadTextAsync(file); this.OnCommandReceived?.Invoke(this, new CommandReceivedEventArgs(json)); } catch (FileNotFoundException e) { Debug.WriteLine(e.ToString()); } } } #endif
command.txtというファイルの変更を検出するとイベントを発生させます。
CommandReceivedEventArgsクラスは下記のようなシンプルなものです。
public class CommandReceivedEventArgs { public string Command { get; private set; } public CommandReceivedEventArgs(string command) { this.Command = command; } }
このアプリをUSB接続したHoloLensで起動し、DevicePortalのFileExplorerからcommand.txtをアップロードするとCubeの表示がオンオフされ、USB経由でアクションが伝わっていることが確認できます。
HoloLensのREST API
HoloLensのDevicePortal機能はREST APIで公開されています。
https://developer.microsoft.com/ja-jp/windows/holographic/device_portal_api_reference
しかしこの中にはFileExplorerの機能は明記されていません。
ではちょっとChromeであればF12キーでNetworkの様子を調べてみましょう。
これはファイルリストを取得したもの
こちらはファイルをアップロードしたもの
それぞれ下記のようなAPIとなっていました。
フォルダ名、アプリパッケージ名、フォルダからのパスを指定します。
ファイルアップロードはMultipart形式でファイルを添付してPOSTリクエストを行えばOKです。
なおDevicePortalはBASIC認証がかかっているので、リクエストする際にはBASIC認証のヘッダをつける必要があります。
using RestSharp; using RestSharp.Authenticators; using System; using UnityEngine; using UnityEngine.UI; public class Controller : MonoBehaviour { public InputField idText; public InputField passwordText; public InputField baseUrlText; public InputField knownFolderIdText; public InputField packageFullNameText; public InputField pathText; public Text logText; void Start () { } void Update () { } public void GetFiles() { var url = this.baseUrlText.text; Debug.Log("GET URL=" + url); var client = new RestClient(); client.BaseUrl = new Uri(url); client.Authenticator = new HttpBasicAuthenticator(this.idText.text, this.passwordText.text); var request = new RestRequest("api/filesystem/apps/files", Method.GET); request.AddParameter("knownfolderid", this.knownFolderIdText.text); request.AddParameter("packagefullname", this.packageFullNameText.text); request.AddParameter("path", this.pathText.text); var response = client.Execute(request); var log = string.Empty; if (response.ErrorException != null) { log = "ERROR: " + response.StatusCode + " " + response.ErrorException.ToString(); } else { log = "RESPONSE: " + response.StatusCode + " " + response.Content; } this.logText.text = log; Debug.Log(log); } public void PostFile() { var url = this.baseUrlText.text; Debug.Log("POST URL=" + url); var client = new RestClient(); client.BaseUrl = new Uri(url); client.Authenticator = new HttpBasicAuthenticator(this.idText.text, this.passwordText.text); var resource = "api/filesystem/apps/file" + string.Format("?knownfolderid={0}&packagefullname={1}&path={2}", this.knownFolderIdText.text, this.packageFullNameText.text, WWW.EscapeURL(this.pathText.text)); var request = new RestRequest(resource, Method.POST) { AlwaysMultipartFormData = true }; request.AddHeader("Content-Type", "multipart/form-data"); var filePath = Application.streamingAssetsPath + "/command.txt"; Debug.Log("FILE PATH=" + filePath); request.AddFile("file", filePath); var response = client.Execute(request); var log = string.Empty; if (response.ErrorException != null) { log = "ERROR: " + response.StatusCode + " " + response.ErrorException.ToString(); } else { log = "RESPONSE: " + response.StatusCode + " " + response.Content; } this.logText.text = log; Debug.Log(log); } }
画面にはIDやパスワードなどの入力項目を設け、入力値を上記クラスから参照するかたちです。
上記を実装すれば、PCのプログラムからUSB接続のHoloLensアプリを自在にコントロールできるようになります。
わかりにくい動画ですが、PCでボタンを押すとホログラムのCUBEの表示がオンオフします。
日本でのHoloLens展開が発表されました
今、お台場で開催中のMicrosoft Tech Summit 2016に来ています。
キーノートセッションでは、クラウド、システム管理といった業務寄りの話からSurface Hubを用いたInkのデモなどを見ることができました。
でも最後にエキサイティングな発表があるとアナウンスがなされ、HoloLensのPVが流れ始めました。
こ、、この流れはまさか。。。
そう!なんと突然日本でのHoloLens公式展開が発表されたのです!
あの素晴らしいデバイス、到底生きているうちにこんな体験ができるとは思ってなかったレベルの体験をぼくたちに与えてくれるあのHoloLensがここ日本でも普通に体験でき、アプリを作れる。
そんな世界が今日突然やって来たのです。
本当に嬉しいことです。
こちらは日本マイクロソフトさんからの公式アナウンスです。
会場内では厳重なケース入りでしたが実機の展示も行われています。
今年中にプレオーダー受付開始となり、デリバリーまではまだ少しありますがそれまでの間HoloLensアプリ開発の準備をしておくことをお勧めします。
3Dホログラフィクスを含む「それなりの」HoloLensアプリを開発するには下記の知見が必要です。
- Unityが使えること
- 3次元空間についてわかること
- UWP(Universal Windows Platform)アプリが書けること
簡単なものなら1と2でOKですが、少し凝ったものを作り始めるとUnityを使っていても3が必要になる場面に遭遇します。
この辺りの技を磨いておいて、日本のホログラフィック・コンピューティングを盛り上げましょう。