インタフェース設計論 授業ページ
12. 実世界インタフェース(2)
今すぐ使うUbicomp
aka IoT
Webと融合
安くて実用的なもの
IoTの現状
by 坂村健
Googleで捜せないもの
自宅の戸締まり
Googleで捜せないもの
自宅の戸締まり
人気の店
Googleで捜せないもの
自宅の戸締まり
人気の店
下北沢で会った人
Googleで捜せないもの
自宅の戸締まり
人気の店
下北沢で会った人
Ubicompなら捜せる!
Ubicompのチャレンジ
Webサービスとの融合
ハードの敷居 ⇒ 消滅
ソフトの敷居 ⇒ 消滅
Webサービスとの融合
週刊モーニングで連載 (2014)
電子工作ブームがキタ?
ハードの敷居の消滅
Phidgets, Arduino, mbed...
XBee, WiPort, ...
Phidgets
USB接続のセンサ
Arduino
USB/Serial + AVR
Processing環境でプログラミング可能
Arduino Micro
Arduino + Bluetooth
LilyPad
Arduinoをウェアラブルにしたもの
LilyPad
mbed
Web上でプログラミング可能なワンボードマイコン
XBee
ZigBee無線モジュール
WiPort
無線LAN+CPU+サーバ
Sun SPOT
無線センサネットワークデバイス
Java
加速度、温度、照度センサーと8個の3色LED
IOIO
Android ADKキット
Android側でボードの操作を行う (c.f. Phidgets)
Harpy
Android ADK+Arduino
Raspberry Pi
ARM搭載ワンボードマイコン
Linuxパソコンとして使える
Intel Galileo
Linux + Arduino
Intel Edison
ソフトのハードル
かなり低くなってきた
JavaScript
Processing
各種ハードやネットライブラリを利用可能
ユビキタス = ユニバーサルデザイン
いつでも/どこでも/誰でも
人間の能力の強化
e.g. 眼鏡
Human enhancement
直感的な操作が可能に
目的と操作を一致させる
直感的なシステム実現の基礎技術
小型コンピュータ
ネットワーク
センサ
操作手法の工夫
直感的にする工夫
なめらかな操作性
可逆的 / 連続的
目的と操作のわかりやすい対応付け
e.g. 自動ドア
富豪的UbiComp
特殊なセンサを沢山利用
ディスプレイを沢山利用
特殊な計算機環境を利用
「Poor Man's UbiComp」 (PMUC)
特殊なセンサを沢山使わない
× カメラ、3次元位置センサ
特殊なディスプレイを使わない
× HMD
入手しやすいロバストな装置を少しだけ使う
◯ GPS携帯、USB傾きセンサ
PMUCの要件
インフラ
インターネット、無線LAN, etc.
情報検索技術
入出力デバイス
各種センサ/アクチュエータ
PMUCの要件
インフラ
インターネット、無線LAN, etc.
情報検索技術
入出力デバイス
各種センサ/アクチュエータ
全部ある!
明らかな問題点
ボタンが多くて機能がわからない
紛失しやすい
明らかな問題点
ボタンが多くて機能がわからない
紛失しやすい
本質的な問題点
操作対象ややりたいことと関係ない方向を向けなければならない
(直感からほど遠い)
正しいアプローチ
具体的な装置のことを考えずにどこでも目的を達成
(例) 居間の壁で映画を観賞する
(例) 台所でも風呂でも音楽を聞く
DVDやネットワークのなどの実際のデバイスは気にしない
長屋コンピューティング
我慢して住めるか?
これならどうか?
Wifi完備
障子がスクリーン
神棚にサーバ
あちこちのセンサでKB入力
自動冷暖房
電子書籍
コンビニで冷蔵庫不要
良いレストランがいくらでも
近所にスーパー銭湯
直感的でない操作
電灯のon/off
スイッチが部屋の入口にある
DVD観賞
プレーヤ/プロジェクタ/アンプ/スクリーン/スピーカ
どれをどのように操作すればいいのか
ビデオ録画
番組を見たいだけなのだが...
ウィンドウの開閉
直感的なCDプレーヤ
「置くだけ」で情報家電制御
CDを置くとその場所で音が鳴る
直感的なデータ転送
CDを挿すとコピーされて別のCDに焼かれる
CD-ROMはセンサ/アクチュエータ!
「障害者用レジ」
数字⇔硬貨 の変換が不要
謎の自動ドア
装置の必要性
機械の使用は絶対条件ではない
機械を使わないにこしたことはない
自動ドアは機械として認識されていない
期待通りの効果があれば何でもよい
理想のユビキタス環境
機械も制御装置も見えないのが本当のユビキタス
「Invisible Computer」
PMUC用入力デバイス
安くてロバスト
誰でも使える
なじみのある操作体系
装置の制約
単純な操作
過酷な環境への対応 (風呂、台所、etc.)
制限された入力手法 (片手、音声、etc.)
小さな画面
実世界GUI
グラフィカルインタフェース(GUI)操作を実世界で実行
ボタン、メニュー、スライダ、ドラッグ/ドロップ、... の操作を壁や机の上で実行
FieldMouse, MouseFieldを使用
実世界コピペ
FieldMouse
ID認識装置 + 動き検出装置
壁や机の上でマウスのように使える
Active絵本
Active Hardcopy (Webページなど)
紙リモコン
Real-World GUI
アクティブ絵本
普通の紙や本をタブレットとして使える
紙リモコン
バーコードを印刷した紙をリモコンとして利用
FieldMouseを使った実世界GUI
メニューやスライダのようなGUI要素を実世界で使う
バーコードを認識した後でデバイスを移動する操作 ==
マウスをクリックした後でドラッグする操作
ビデオ: FieldMouse
MouseField
RFIDリーダと動き検出装置を一体化
MouseFieldの使用方法
「置いて動かす」だけで情報検索/制御
書斎のMouseField
テーブル型MouseField
PlayStand++
PlayStand++の操作
ビデオ: PlayStand
GoldFish
Android用実世界GUIフレームワーク
NFCを読む⇒ブラウザ開く⇒JSが走る⇒センサ利用
動作をJavaScriptのみで記述
プログラムはWeb上
簡単に修正可能
ビデオ: GoldFish
GoldFishのアーキテクチャ
GoldFishクライアント
センサ+表示
GoldFishサーバ
JavaScriptプログラム
URLリダイレクト
GoldFishクライアント
NFCインテントによる自動起動
サーバに登録したURLのページを表示
ダウンロードしたJavaScriptでセンサを利用
GoldFishサーバ
http://ubif.org/(ID) からリダイレクト
TinyURL, Bit.ly的な動作
実行例1: マニュアルの表示
実行例2: 時計の表示
実行例3: 回転インタフェース
デモ: 回転インタフェース
実世界コピペ
Goldfish応用例
汎用に利用可能
家電の制御
机の上から音量調節
Wifi or 赤外線
家電のコントロールパネル
ドア認証
文書の上に置いて文書編集
柵に置いてフォトフレーム
柵に置いて時計
どこでも掲示板
サイネージ連携
家具コンピューティング
普通の家具にGoldfishを埋め込み
家電や証明、エアコンなどを制御
実世界指向プログミング
実世界の事物をプログラム要素として使う
実世界指向インタフェースを作成するには
実世界の事物を使うのが最適
c.f. ビジュアルインタフェースにはビジュアルプログラミングが最適
プログラミングが具体的、例示的
実世界的状況を説明しやすい
「品川駅近辺」
「3時ごろ」
実世界指向プログミングの例
7時になったらベルが鳴る
電話をとるとTVが消える
アメリカに行くと時計のタイムゾーンが切りかわる
夜に駅に行くと終電時刻が表示される
印刷された文書を机に置くとファイルがあらわれる
4時までに宅急便が来れば隣の家に持って行くよう伝える
ビデオの予約
時計を進めて将来の録画実行時間にあわせる
(将来の実行モード = 予約モードに入る)
通常のチャンネル選択ボタンでチャンネルをあわせる
録画ボタンを押して録画開始を指示する
時計を進めて将来の録画終了時間にあわせる
停止ボタンを押して録画停止を指示する
時計を現在時刻に戻す
(通常モードに復帰する)
Phidgets体重計
Phidgetsのプログラミング例
import Phidgets.*;
public class IFKex1 extends _IPhidgetInterfaceKitEventsAdapter
{
public void OnSensorChange(_IPhidgetInterfaceKitEvents_OnSensorChangeEvent ke) {
System.out.println("SensorChange: " + ke.get_SensorValue());
}
public void OnInputChange(_IPhidgetInterfaceKitEvents_OnInputChangeEvent ke) {
System.out.println("InputChange: " + ke.get_Index() + " " + ke.get_NewState());
}
public void OnDetach(_IPhidgetInterfaceKitEvents_OnDetachEvent ke) {
System.out.println("FINISHED!");
}
public static void main(String[] args) {
new IFKex1();
}
public IFKex1()
{
PhidgetInterfaceKit phid = new PhidgetInterfaceKit();
phid.add_IPhidgetInterfaceKitEventsListener(this);
if (phid.Open(false) == false)
{
System.out.println("Could not find a PhidgetInterfaceKit");
return;
}
System.out.println(phid.GetDeviceType());
System.out.println("Serial Number " + phid.GetSerialNumber());
System.out.println("Device Version " + phid.GetDeviceVersion());
phid.SetSensorChangeTrigger(7, 1);
phid.start();
System.out.println("Looping...\n");
for(int i = 0; i < 1000; ++i)
{
phid.SetOutputState(0,true);
}
// Turn the output on, and rudely leave it turned on!
phid.Close();
System.out.println("Closed and exitting...");
}
}
Phidgetsプログラミングの問題点
C, Javaなどの開発環境が必要
言語ごとに異なるライブラリが必要
マイナーな言語から使えない
リモートのPhidgetsを制御できない
Phidgets Server
Phidgetsの入出力をTCP/IPで制御
任意の言語/環境を利用可能
by 塚田浩二@お茶の水女子大
MobiServer
Phidgets, X10, KURO-RS, XBeeを制御
by 塚田浩二@お茶の水女子大
気合いブックマークプログラム in Ruby
require "socket"
require "delicious"
PORT = 4321
HOST = "phidget.server.host"
USER = "masui"
server = TCPSocket.open(HOST,PORT)
while true
s = server.gets
break if s.nil?
a = s.split(/,/)
if a[1] == 'Weight' then
weight = a[2].to_f
if weight > 4.0 then
register(USER)
end
end
end
プレゼンプログラム in Ruby
require "socket"
require "dl/import"
module Win32
extend DL::Importable
typealias "DWORD", "unsigned long"
typealias "BYTE", "unsigned char"
typealias "ULONG", "unsigned long"
KEYEVENTF_KEYUP = 0x02
VK_SHIFT = 0x10
VK_A = 0x41
VK_SPACE = 0x20
VK_BACKSPACE = 0x08
dlload "user32.dll"
extern "void keybd_event(BYTE, BYTE, DWORD, ULONG)"
def send_keybd_event(bVk, dwFlags = 0)
keybd_event(bVk, 0, dwFlags,0)
end
module_function :send_keybd_event
end
serverhost = 'localhost'
port = 4321
socket = TCPSocket.new(serverhost, port)
prevval0 = 0
prevval2 = 0
while line = socket.gets
(io,device,ad,portno,val) = line.chomp.split(/,/)
if io == 'In' && device == 'InterfaceKit' &&
ad = 'Analog' && portno.to_i == 0 then
if val.to_i > 100 && prevval0 < 100 then
Win32.send_keybd_event(Win32::VK_SPACE)
Win32.send_keybd_event(Win32::VK_SPACE,
Win32::KEYEVENTF_KEYUP)
end
prevval0 = val.to_i
end
...
Phidgets Serverプログラミングの問題
サーバのアドレスやポートを意識する必要がある
並列処理が面倒
複数のサーバを同時に扱いにくい
Linda
Linda利用の利点
サーバのアドレスを意識しない
ひとつの共有空間を利用して通信
手軽な並列処理
Phidgets以外のセンサも利用可能
居場所通知
ネット風速計
X10
赤外線リモコン
指紋センサ
パソコン内蔵傾きセンサ
Lindaプログラミングの特徴
非常に簡単にセンサプログラミング
必要なのはPCとネットワークとPhidgetsだけ
日曜プログラミングの復活?
簡単なイベントベースプログラミングを誰でも楽しめるようになる
気合いブックマーク
夜になると電気を消す
7時になるとベルを鳴らす
Rinda
RubyによるLindaの実装
by 関氏
Rubyで簡単にLindaを利用できる
× Ruby以外の言語が使えない
Rindaによるプログラミング
require 'rinda/rinda'
require 'delicious'
TS_URI = 'druby://localhost:12345'
USER = 'masui'
ts = DRbObject.new(nil,TS_URI) # タプル空間に接続
while true
ts.write(['weight',$$,""]) # 体重値タプル取得
val = ts.take(['weight',$$,Float])[2]
register(USER) if val > 4.0
end
Web-Linda
全世界プログラミング
全世界の情報を利用
辻堂の波, 楽天の株価, ...
全世界の機械を制御
情報家電, 自宅の照明, ...
全世界の人間が作成
ホビープログラマ, メディアアーティスト, ...
全世界プログラミングの例 (1)
目覚まし時計
炊飯の予約
風呂の水はり
全世界プログラミングの例 (2)
人がいない部屋のテレビを消す
人がいない部屋では目覚ましを鳴らさない
ビールがなくなると注文フォームを表示する
気合いを入れるとブックマークされる
寝ると照明が消える
夜になると静かになる空気清浄機
汚いと自動的に洗浄してくれるトイレ
全世界プログラミングの例 (3)
遠方の家族の様子を知る
水道が使われていないと通報する
泥棒を検出
波や風の様子を調べる
全世界プログラミングの例 (4)
ブログが炎上すると警報が鳴る
ニューヨークの天気でBGMを変化させる
全世界ピタゴラマシン
....
全世界プログラミングのすすめ
昔はBASICの日曜プログラミングが流行っていた
最近はプログラミングが流行っていない
敷居が高い
値段が高い
日曜プログラミングの復活!
e.g. Processingシステム
実世界指向I/Fの課題
新しいデバイス
IDの管理
状況認識
プライバシ
認証技術
新しいデバイス
ID認識
位置認識
Wearable Computerの入出力装置
ID管理
誰がIDを管理するのか?
足りなくなったらどうするか?
プライバシ問題
現在はあまり誰も気にしていないが...
法的規制
ビジネスの可能性
例示/予測I/Fとの関連
実世界での予測
夜の品川付近で...
Programming by Exampleが可能
メディアアートとAR
KAGE
KAGE
Kobito
まとめ
計算機利用環境はパソコンの外側へ
様々なサービスとの融合が課題
インタフェースのアイデアが重要