• 検索結果がありません。

実験 2 :進化への対応

4.5 評価

4.5.3 実験 2 :進化への対応

1: public void perform() { 2: try {

3: sendResult(new Integer(((CleaningRobot)myAgent).simulator.getBattery()));

4: } catch (PortException e) { 5: e.printStackTrace();

6: }

7: }

4.22.ObserveBatteryLevelコンポーネントのperformメソッド

ンポーネントのperformメソッドの記述を示したものであり,同コンポーネントはCollectタ イプに該当するが,バッテリー残量の情報取得にCollectタイプイディオムを適用した例に該 当する.

さらに,図4.20のログからはバッテリーステーションへの移動の前後で,目標とするごみが 座標(6, 3)の紙くずから座標(4, 2)の紙くずへと変わっていることも確認できる.これは,目 標物への到達に関するControl loopを利用するControl loopが切り替わる際に,DisposeDust

のpassivateメソッドが呼び出されることで適切な退避処理が実行されたことによるものであ

る.図4.23はDisposeDustコンポーネントの passivateメソッドの実装を示したものである

が,本メソッドでは,現在動作しているActタイプコンポーネントをpassivateメソッドにより 待機状態(waiting)に遷移させ(5行目),目標地点であるごみの座標をリセットしている(9 行目)ことがわかる.このように,ComponentBehaviourクラスのpassivateメソッドをオー バーライドすることで,Control loopのゴールを達成途中であっても適切な退避処理が実現可 能であることが確認できた.

以上のように,本研究で導入する各イディオムに従った実装により,各Control loopの実装

と,複数Control loopの並行動作が実現可能であることが確認できた.

1: public void passivate(){

2: super.passivate();

3:

4: if(currentComponent!=null){

5: currentComponent.passivate();

6: currentComponent = null;

7: }

8:

9: nextDust = null;

10: isFirstTime = true;

11:

12: observe.passivate();

13: if(observePort.isArrive()){//clean remained collected data

14: try {

15: targetAppearance = (Appearance)observePort.get();

16: } catch (PortException e) { 17: e.printStackTrace();

18: }

19: }

20: }

4.23.DisposeDustコンポーネントのpassivateメソッド

常終了した.そこで,2.5節で示した進化シナリオに従って,goccの出力情報を利用しなが ら,プログラミングフレームワーク上に構築した清掃ロボットに対して,ごみ積載量管理機能 を追加した.

まず,ごみ積載量管理機能の追加に伴う,進化後のコンフィギュレーションを図4.24に 示す.進化前後のコンフィギュレーションを比較すると,進化後はごみ積載量管理に関する

Control loopとロボットアーム制御に関するControl loopが新たに追加されることとなり,こ

れはgoccが出力する差分検出結果(図4.25中の青字で示された行)からも確認できた.ま た,goccのクラステンプレート生成機能により,以下の7つのコンポーネントテンプレート が生成された.

ごみ積載量管理に関するControl loopを構成するもの – MaintainLoadAmount(Analyze & Decideタイプ)

– ObserveLoadAmount(Collectタイプ)

– ApproachDustBin(Actタイプ)

– UnloadDust(Actタイプ)

ロボットアームに関するControl loopを構成するもの – ControlArm(Analyze & Decideタイプ)

Collect

Maintain Battery

Find

Observe BatteryLevel Charge

Battery

GetPosition DisposeDust

PickUpDust VacuumDust

ObserveDust Appearance

AndResut

Analyze 㻌& Decide

Analyze & Decide Conditional

Act

Act Collect

MoveTo

Analyze& Decide

Collect 䛤䜏Ύᤲ䛻㛵䛩䜛Control loop

Analyyyze& Decide

Approach

Object Act

Maintain

LoadAmount Observe

LoadAmount UnloadDust

Analyze & Decide

Act Collect

䛤䜏✚㍕㔞⟶⌮䛻㛵䛩䜛Control loop

┠ᶆ≀䜈䛾฿㐩䛻 㛵䛩䜛Control loop

Collect

Approach DustBin Approach

Dust

ApproachStation

Act Act

Act

MoveObject GetObject

Position

Analyze & Decide

Collect

ControlArm

Act 䝻䝪䝑䝖䜰䞊䝮䛻㛵䛩䜛Control loop

䝞䝑䝔䝸䞊⟶⌮䛻㛵䛩䜛Control loop

4.24.実験2で用いたコンフィギュレーション

– GetObjectPosition(Collectタイプ)

– MoveObject(Actタイプ)

進化に際して,goccは競合チェックリストとして表4.1のリストを出力した.この競合 チェックリストに関しては,4.2.4節での議論の通り,競合利用するControl loopに対して3

つのControl loopの優先順位を決定し,バッテリー管理機能,積載量管理機能,ごみ清掃機能

の順で動作の優先順位を決定した.

また,本進化に対してgoccは,進化プロセスとして,次のコマンド系列を出力した.

[rmCL -n DisposeDust; addCL -n ControlArm; activateCL -n ControlArm;

addCL -n DisposeDust; activateCL -n DisposeDust;

addCL -n MaintainLoadAmount; activateCL -n MaintainLoadAmount]

新たなControl loopを構成する上記の7つのコンポーネントをイディオムに従って実装し,

また,ロボットアームを利用するPickUpDustコンポーネントを修正した後,進化プロセスに 従って下記のコマンドを順次投入した.

rmCL -n DisposeDust

1: 1c1

2: < %% #Components: 13 #Connections: 12 #Control loops: 3 3:

---4: > %% #Components: 20 #Connections: 20 #Control loops: 5 5: 3a4,12

6: > addComponent(MaintainLoadAmount, ANALYZE_and_DECIDE) 7: > addPort(MaintainLoadAmount, p0)

8: > addPort(MaintainLoadAmount, r0) 9: > addPort(MaintainLoadAmount, r1) 10: > addPort(MaintainLoadAmount, r2)

11: > addComponent(ControlArm, ANALYZE_and_DECIDE) 12: > addPort(ControlArm, p0)

13: > addPort(ControlArm, r0) 14: > addPort(ControlArm, r1) 15: 18a28,39

16: > addComponent(ObserveLoadAmount, COLLECT) 17: > addPort(ObserveLoadAmount, p0)

18: > addComponent(UnloadDust, COLLECT) 19: > addPort(UnloadDust, p0)

20: > addPort(UnloadDust, r0)

21: > addComponent(ApproachDustBin, ACT) 22: > addPort(ApproachDustBin, p0) 23: > addPort(ApproachDustBin, r0) 24: > addComponent(MoveObject, ACT) 25: > addPort(MoveObject, p0)

26: > addComponent(GetObjectPosition, COLLECT) 27: > addPort(GetObjectPosition, p0)

28: 40a62

29: > addPort(PickUpDust, r0) 30: 42a65,69

31: > connect(MaintainLoadAmount.r0, ObserveLoadAmount.p0) 32: > connect(MaintainLoadAmount.r1, UnloadDust.p0)

33: > connect(MaintainLoadAmount.r2, ApproachDustBin.p0) 34: > connect(ControlArm.r0, MoveObject.p0)

35: > connect(ControlArm.r1, GetObjectPosition.p0) 36: 52a80,81

37: > connect(UnloadDust.r0, ControlArm.p0)

38: > connect(ApproachDustBin.r0, ApproachObject.p0) 39: 54a84

40: > connect(PickUpDust.r0, ControlArm.p0)

4.25.進化1におけるコンフィギュレーション上での差分検出

addCL -n ControlArm

-fqn robot.de.comp.additional.ControlArm activateCL -n ControlArm

addCL -n DisposeDust

-fqn robot.de.comp.additional.DisposeDust -p 5 -conf ApproachObject, ControlArm activateCL -n DisposeDust

addCL -n MaintainLoadAmount

-fqn robot.de.comp.additional.MaintainLoadAmount -p 3 -conf ApproachObject, ControlArm

1: < Assignment(清掃ロボット, 目標物に到達することができる)

2: > Assignment(清掃ロボット, 障害物を避けながら目標物に到達することができる) 3: < Goal(目標物を発見することができる)

4: < Goal(目標物に到達することができる)

5: > Goal(目標物・障害物を発見することができる)

6: > Goal(障害物を避けながら目標物に到達することができる) 7: > Entity(障害物の座標)

8: < Concerns(目標物に到達することができる, フィールド) 9: < Concerns(目標物を発見することができる, 目標物の座標)

10: > Concerns(目標物・障害物を発見することができる, 目標物の座標)

11: > Concerns(障害物を避けながら目標物に到達することができる, フィールド) 12: > Concerns(目標物・障害物を発見することができる, 障害物の座標)

4.26.障害物回避機能追加に対するゴールモデル上での差分検出

activateCL -n MaintainLoadAmount

ここで,addCLのオプションである“-p”に指定されている優先度値は,競合する他のControl

loopとの間での優先度である.今回は,競合利用するControl loopである“ApproachObject”

と“ControlArm”に対して,ごみ積載量管理の方がごみ清掃より優先すべきであるため,ごみ

積載量管理に関するControl loopの方に高い優先度(小さい優先度値)を割り当てる.

上記コマンド群を投入することにより,動作中のロボットに対してごみ積載量管理機能が追 加され,積載量が一定値を越えると,ごみを捨てるためにごみ箱へと向かう動作が実現される ことが確認できた.

進化2(障害物回避機能の追加)

続いて,障害物回避機能の追加に関する進化実験を実施した.まず,進化後のゴールモデル をgoccに入力した際のコンフィギュレーションは図3.34に示す通りであり,ゴールモデル に対する差分検出結果として図4.26が出力された.

オペレーションに対するコンフィギュレーションは,前回の進化時と同様,図4.24の通り であり,オペレーションに対するコンフィギュレーション上での差分は出力されなかった.

続いて,ゴールモデル上での差分検出結果をもとに,目標物への到達に関するControl loop を構成するコンポーネントの実装を変更した.具体的には,障害物を検知するためにCollect タイプであるFindコンポーネントを変更し,また,障害物の座標を管理し,障害物を避けた 移動を実現するようAnalyze & DecideタイプであるApproachObjectコンポーネントの実装 を変更した.

本進化に対してgoccは,進化プロセスとして以下のコマンド系列を出力した.

[rmCL -n ApproachObject; addCL -n ApproachObject;]

競合チェックリストは前回の進化時と同様のリストであったが,既に優先順位の設定により競

合への対応は実装されているため,今回の進化では,新たな対応は不要と判断した.

コンポーネントの変更が完了した後,進化プロセスに従って下記のコマンドを順次投入した.

rmCL -n ApproachObject addCL -n ApproachObject

-path ../EvolExperiment/bin

-fqn robot.de.comp.ApproachObject activateCL -n ApproachObject

これらのコマンドを投入することにより,動作中のロボットに対して,障害物を回避する機 能が追加され,障害物を新たにフィールド上に設置しても,回避した移動が実現されることが 確認できた.なお,移動中のロボットに対してコマンドを投入した場合は,rmCLコマンドを 投入してから,activateCLコマンドを投入するまでの間は,目標物への到達,つまり移動

に関するControl loopが停止するため,ロボットが移動を停止することが確認された.

4.5.4 要件に対する考察

清掃ロボット構築実験の実験結果をもとに,4.3.1節で定義した要件に対して,本章で導入 した開発支援ツール,プログラミングフレームワークを評価する.

Control loopの実現容易性

実験1の結果から,本研究で導入するプログラミングフレームワークは,Control loopを構 成する各コンポーネントのスーパークラスとコンポーネントの制御メカニズムを提供するこ

とで,Control loopの実装を支援していることが確認できる.また,実験1,実験2の結果か

ら,コンフィギュレーションをはじめ,goccにより出力された各種情報と,プログラミング フレームワークが提供するControl loop実現のための拡張クラスおよびイディオムを利用する

ことで,Control loopの実装が可能であり,Control loopの系統的な実装支援が一定のレベル

で実現できたと言える.

さらに,実験2の結果より,差分として検出されるControl loopを追加実装あるいは変更す ることで,ソフトウェア進化が実現可能であることが確認できた.ただし,イディオムによる 支援はあるが,システムの動的な振舞いについては更なる支援の余地があると考えられる.ま た,差分検出についても,検出結果からある程度の範囲での変更箇所の絞り込みは可能である が,ゴールモデルへの情報追加による,更なる精度向上も進化時の影響範囲同定に有益である と考えられる.

Control loopの並行実行

本研究で導入したプログラミングフレームワークでは,実行基盤としたJADEに,ビヘイ ビアとして実装したコンポーネントを制御するためのメソッドとライフサイクルを追加拡張 することで,コンポーネントの並行実行を実現している.2種類の実験結果からも,複数の

Control loopにより構成されるシステムにおいても,Control loopが並行に動作することで,

期待する動作が実現できることが確認できた.ただし,Control loopを並行実行させる場合,

Control loop間での競合に留意する必要がある.本プログラミングフレームワークにおいて

は,Control loopに優先順位を付与し,この優先順位とactivate, passivateメソッドを利用する

ことで,Control loop間の競合回避制御を実装可能であるが,状況によって優先させるControl

loopが異なる場合などは,競合回避手順の実装が複雑になる可能性がある.本研究において は,利用される側のControl loopが競合回避の責務を持つため,競合回避手順は該当Control

loopのAnalyze & Decideタイプコンポーネントに記述されることとなる.提案手法において

は,goccが競合が発生する可能性のある状況を競合チェックリストとして出力するが,厳密 な競合発生状態については,開発者による特定・分析が必要となる.

一方で,提案手法ではシステムの構成要素をControl loopの単位で同定するが,本プログラ ミングフレームワークを利用することにより,実行中のシステムに対するControl loopの追 加,削除が可能であることが確認できた.本研究では,Control loop制御の責務をAnalyze &

Decideタイプコンポーネントに割り当てているが,実験2の進化1,進化2において投入し

たデプロイコマンドは同コンポーネントに対する制御により実現したものである.実験結果か

ら,Control loopに対する制御についても,本研究で導入したコンポーネント実装のactivate,

passivateメソッドにより,実現されていることが確認できた.

4.5.5 コンフィギュレーションに対する考察

最後に,実験結果をもとに,goccにより生成されるコンフィギュレーションをKruchten の4+1アーキテクチャビュー[51],すなわち, 論理的側面(logical view),プロセス的側面

process view),開発的側面(development view),物理的側面(physical view) およびシナリ オ(scenarios)の観点から評価する.

まず,クラス図などで表現されるクラス間の関係に着目する論理的側面(logical view)と しては,提案手法ではゴールモデル上に記述されたゴールとゴール間の関係により,コンポー ネントとその接続形態,つまりコンフィギュレーションを決定する.このようなコンフィギュ レーション生成法のもとでは,ゴールが詳細に分析(分解・洗練化)されているゴールモデル