Programming With Yukari:三次元仮想空間によるリアルワールドプログラミング

2014/12/16

Tweet

Abstract

近年,ロボットやネットワーク家電は値段も安くなり,個人でも入手しやすくなってきた. さらに,それらに公開された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"(以下,本システムと呼ぶ)の解説をする.

How

ここでは,先の"変数と実体の結びつき"の問題に対する解決案を提示する. 特に,今回は"家の家電を操作する"という状況を想定する.

まず,家と 同じレイアウト の3Dモデルを用意する.(なお,今回これは与えられたものとする) この3Dモデルには,ライト等が現実と同じ場所に設置されている.

3Dモデル(都合上本物の写真がない)
3Dモデル(都合上本物の写真がない)

Identifierではなく,レイアウトによる変数の解決がまず,本システムのポイントである. これにより,プログラムの世界とリアルワールドの壁が小さくなることが期待される.

先ほどよりも参照のコストが低下する
先ほどよりも参照のコストが低下する

プログラミング言語

モデルの中で使える プログラミング言語を導入する. ここでは,簡単なデータフロープログラミング言語を選択した.

NANDを実装した例
NANDを実装した例

また,このままではライトとプログラミング言語を結合できないので,ライトの近くにライトブロック(スイッチと同じ動作をする)を配置した. このライトブロックに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 Programming

GUI部品と,それを表す変数の間に今回のようなギャップが存在する.これらを解決するために,プログラム中に画像を貼れるようにする研究がある

三次元仮想空間と家電制御

徳久による,Minecraft用家電MODがある. Minecraftにはレッドストーン回路と呼ばれるプログラミングシステムが存在し,これを利用することで"Programming with Yukari"のシステムを移植することもできるだろう. また,MODの中にはAIを含むものもあり,コンパニオン部分が移植できる可能性もある. Minecraft内に移植することができれば,家と同じレイアウトを簡単に自分で作ることもでき,非常に有用である.

今後

今回の実装では,ワイヤにはbooleanの値のみを割り当てた. しかしながら,データフロープログラミング言語には一般にinteger等他のデータ構造をサポートするものがほとんどである. また,今回の言語は非常にナイーブな実装となってしまったものの,FRPのようにもうすこし高級な実装とし,部品もグラフブロックや,時計ブロック等を増やし,ライブプログラミング形式にすることも考えられるだろう. その点ではHancockによるFLOGO I,II (ビデオはこちら) は参考になりそうである.