近年,ロボットやネットワーク家電は値段も安くなり,個人でも入手しやすくなってきた. さらに,それらに公開されたAPIが付属していることも多く,それらを使ったプログラムを書くこと("リアルワールドプログラミング"と呼ぶ)が可能になった.
本ページでは,これらの"リアルワールドプログラミング"に関して,既存システムの問題点を挙げ,その解決案の一つとして三次元仮想空間におけるヴィジュアルプログラミング環境:Programming with Yukariを提案する.
リアルワールドプログラミングには難しい点が複数存在する.例えば
等である.ここでは"変数と実体の結びつき"を中心にその問題,解決について書く. なお,パラメータと実物の動きのギャップを縮める研究として,加藤 淳によるPicodeを挙げておく.
リアルワールドなオブジェクトは,通常プログラム中のオブジェクトとして扱う.例えば
// generate instance by ip addr
light_in_living = new Light("192.168.0.102")
light_in_living.on()
等と書く.ここで問題となることは,"light_in_living"というプログラム中の変数と,リアルワールドに存在する参照先との間に大きなギャップが存在することである.
この問題はプログラミング対象のオブジェクトが増えれば増えるほど問題になってくる. ニックネームを考えるというタスク,似たニックネームを見分けるコストが大きくなるからである.
ここでは,"Programming with Yukari"(以下,本システムと呼ぶ)の解説をする.
ここでは,先の"変数と実体の結びつき"の問題に対する解決案を提示する. 特に,今回は"家の家電を操作する"という状況を想定する.
まず,家と 同じレイアウト の3Dモデルを用意する.(なお,今回これは与えられたものとする) この3Dモデルには,ライト等が現実と同じ場所に設置されている.
Identifierではなく,レイアウトによる変数の解決がまず,本システムのポイントである. これにより,プログラムの世界とリアルワールドの壁が小さくなることが期待される.
モデルの中で使える プログラミング言語を導入する. ここでは,簡単なデータフロープログラミング言語を選択した.
また,このままではライトとプログラミング言語を結合できないので,ライトの近くにライトブロック(スイッチと同じ動作をする)を配置した. このライトブロックに1が入力されると,対応するライトと,現実の同じ場所のライトがオンになる.
通常のプログラミングでは,IDEを使用することで開発効率を大幅に向上することができる. 本システムでは,3D空間にプログラミングを手助けするコンパニオンを配置した.
彼女はAHS社の"結月 ゆかり"というキャラクターである.
今回,ゆかりさんに実装した機能としては
がある. これらにより,自然な形で三次元モデル中にIDEを実現することを目標とした.
TODO:ビデオをここに貼る
モデル等はUnityのAssetに入った状態で提供された. よって,本システム自体のUnity上に実装した.
言語の実装は非常に単純である.
ブロックには色々な種類があるものの,基本的には以下のようなプログラムである.
# update called every frame
def Update():
inputs = get_inputs()
outputs = get_outputs()
next_value = calc_from_input(inputs)
for o in outputs:
write_value(o,next_value)
# implement AND
def calc_from_input(inputs):
# for all i in inputs,i == 1
return sum(inputs) == len(inputs)
データを伝えるワイヤも非常に簡単である.
def Update():
from_node = get_from()
to_node = get_to()
to_node.value = from_node.value
GUI部品と,それを表す変数の間に今回のようなギャップが存在する.これらを解決するために,プログラム中に画像を貼れるようにする研究がある
徳久による,Minecraft用家電MODがある. Minecraftにはレッドストーン回路と呼ばれるプログラミングシステムが存在し,これを利用することで"Programming with Yukari"のシステムを移植することもできるだろう. また,MODの中にはAIを含むものもあり,コンパニオン部分が移植できる可能性もある. Minecraft内に移植することができれば,家と同じレイアウトを簡単に自分で作ることもでき,非常に有用である.
今回の実装では,ワイヤにはbooleanの値のみを割り当てた. しかしながら,データフロープログラミング言語には一般にinteger等他のデータ構造をサポートするものがほとんどである. また,今回の言語は非常にナイーブな実装となってしまったものの,FRPのようにもうすこし高級な実装とし,部品もグラフブロックや,時計ブロック等を増やし,ライブプログラミング形式にすることも考えられるだろう. その点ではHancockによるFLOGO I,II (ビデオはこちら) は参考になりそうである.