Fluo

Fluoとは?

Fluoは、Pharo上に構築されたビジュアルなプログラミング環境です。
Fluo is a visual programming environment built on Pharo.

Fluo - JoystickDemo

Fluoの特徴

Fluoの特徴は以下の3つです。
Fluo has following three features.

  1. ノードをアークで結ぶことによりプログラムを構築する、グラフベースのプログラミング環境である。
    Fluo is a graph based programming system connecting nodes with arcs.
  2. アークでつながれたノード間をデータが流れる、フローに基づいたプログラミングモデルを採用している。
    Fluo is based on flow based programming model, data flows between nodes connected by arcs.
  3. PharoのSmalltalk開発環境との親和性が高い。
    Fluo has high affinity with Smalltalk development tools of Pharo.

グラフベースのプログラミング環境

Fluoにおけるプログラムは、ノードを向きを持ったアークで結ぶことにより作られた(有向)グラフです。
Programs of Fluo are (directed) graph built on nodes connected with arcs.

Fluoには3種類(プロキシ、トピック、ビヘイビア)のノードがあります。
Fluo has three kinds of nodes: proxies, topics and behaviors.

  • プロキシは外部との通信を行うノードです。
    Proxies are nodes that communicate external system.
  • トピックはプロキシとビヘイビアを結ぶもので、プロキシが受信したデータをビヘイビアに伝えたり、プロキシを通じてビヘイビアのデータを送信したりします。
  • ビヘイビアは他のビヘイビアやトピックと接続して、さまざまな処理を行います。

また、アークは2種類(名前付きアークと名前なしアーク)があります。
Also Fluo has two kinds of arcs: named arcs and no-named arcs.

現時点でプロキシとして、ROSとの通信を行うもの、OSC経由でデータ受信するもの、Juliusからのデータを受信するもの、Scratch Remote SensorプロトコルでScratchと通信するもののほか、GainerやScratch Sensor Board(「なのぼーど」で動作確認済)などのハードウェアを直接制御するものや、Fluentd(Nagareを利用)などの外部データロガーと接続するものがあります。

トピックは、ROS(Robot Operating System)のTopicに影響を受けています。トピックはいわば通信チャネルとも言うべきもので、プロキシとともに用いてさまざまな外部システムを抽象化します。ビヘイビアは受け取ったデータから何らかのデータを生成し、他のノードに送るプログラムです。

フローに基づいたプログラミングモデル

FluoはFlow-based Programming(FBP)という概念をもとにしています。データ駆動型のプログラミングモデルと同様、アークを通じて(アークの向きに従って)ノード間をデータが流れていきます。例えば、あるノードに入ってきたデータは、ノード固有の何らかの処理を経た後、アークでつながれた他のノードに(並行的に)送られます。データを受け取ったノードは、それぞれの処理を行い、同じように他のノードへとデータを送ります。このようなデータの流れをフローと呼んでいます。

Fluoでは、データフローとコントロールフローの2種類のフローがあります。データフローは、基本的なデータの流れを表し、ノードで生み出された様々なデータがアークを伝わって他のノードに送られていきます。コントロールフローは、ノードの状態を制御するための流れを表します。例えば、ノードを開始/終了するopen/closeや、時間経過を伝えるtickなどがあります。

Smalltalk開発環境との親和性

Fluoにおけるフローを実現しているのは、Smalltalkのメッセージ送信メカニズムです。

ビヘイビアや一部のトピックは #data: メソッドを備えており、他のノードからのデータを受け取ります。ビヘイビアやトピック内で、何らかの処理が行われた後、接続された他のノード(風下と呼びます)に対して、#data: メッセージを送ります。#data:メッセージの引数となるオブジェクトはノード間を流れるデータを表します。どのようなデータでも引数として送ることができますが、データを受け取ったビヘイビアやトピックが処理できるものに限られます。

これらの処理に用いられるコードはすべてSmalltalkプログラムです。Xという名前のノードに対して、同じXという名のクラス(FluoNodeのサブクラス)があり、そのクラスに#data:メソッドが実装されています。ノードはグラフィカル環境で簡単に作成したり、修正することができます。実際には対応するクラスのブラウザが開くに過ぎません。

例えば、以下は連続して同じデータが来た場合に、重複分を取り除くビヘイビア(RemoveDuplicatesBehavior)の例です。

data: anObject
    lastObject = anObject
        ifTrue: [ ^ self ].
    lastObject := anObject.
    leeward data: anObject

到着したデータanObjectが、インスタンス変数lastObjectに格納されたデータと同じ場合には無視し、そうでなければデータをlastObjectに格納してから、接続されたノードにデータを送信しています。

グラフィカル環境で作成したグラフも、Smalltalkのプログラムになります。グラフの保存時に自動的にグラフ構造を作り出すコードが生成され、直ちにSmalltalkシステムにクラスとして登録されます。例えば、Yという名前でグラフを保存した場合は、Y newというコードによりグラフ構造を作ることができます。作られたグラフはビジュアル環境がなくてもプログラムとして動作させることができます。

FluoではグラフもノードもSmalltalkプログラムそのものなので、ブラウザやデバッガ、インスペクタなど、Smalltalkシステムが提供するさまざまなツールをそのまま利用することができます。

依存している外部ソフトウェアおよびSqueakパッケージ

  • ROSおよびRosBridge。ROS環境との接続にはRosBridgeを用いています。
  • Zinc-WebSocket-Coreパッケージ。RosBridgeとの通信に用います。
  • NeoJSONパッケージ。RosBridgeとの通信に用います。
  • OSCパッケージ。OSCプロトコルメッセージの送受信のために用いています。
  • OSCeleton。OSC経由でKinectと接続する場合に必要となります
  • XML-Parserパッケージ。Juliusとの通信に用います。
  • Nagareパッケージ。Fluentdとの通信に用います。

Fluoのターゲット

Fluoは既存のさまざまなアプリケーションを作成するのには向かないかもしれません。Fluoが想定するターゲットは、連続的にデータが生み出され、それらをうまく(場合によっては適当に)さばく必要があるアプリケーションです。到着する個々のデータを正確に処理するというよりも、データの流れの中から傾向をつかんだり、変化を見いだすといったことを、リアルタイムに試行錯誤したいというニーズに対応します。

例えばロボットの接触センサーから生成されるデータを処理する場合、ある時点でセンサー値がONになったからといって、直ちにセンサーに何かが触れたということを意味しません。振動により接触が生じた場合や、そもそそセンサーが壊れておりONになり続けている可能性もあります。リアルなセンサーデータを処理する場合には、これらの可能性を考慮したコードを作成する必要があります。

Fluoではこのような場面において、データの流れに着目することで、よりシンプルに問題に対処することができると考えています。ロボットにおける応用はFluoの重要なターゲットの一つだと考えていますが、Kinectをはじめとしたさまざまな入力デバイスのデータ処理にも向いていると考えています。