4.5 評価
4.5.2 実験 1 :実現可能性
まず,提案手法に基づいて構築したControl loopの挙動を確認するために,清掃ロボットの 振る舞いを観測した.図4.18の配置パターンに対する実験結果として,清掃ロボットが出力 したログの一部を図4.20に示す.図4.20からは,清掃ロボットがごみのある座標(6, 3)に向 かって移動中(173〜176行目)にバッテリーが低下したため(177行目),座標(4, 3)に存在 するバッテリーステーションへの移動へと動作を切り替えたことが分かる(178〜195行目). その後,バッテリーステーションに到着して充電した後に(196〜199行目),ごみ収集を再開 し(200行目),バッテリーステーションから最も近いごみを見つけて移動(202行目〜)して いることも確認できる.このように,実装した清掃ロボットでは,ごみ清掃に関するControl loopとバッテリー管理に関するControl loopが動作し,バッテリーの残量がある間はごみの清 掃を続け,残量が少なくなるとバッテリーステーションへ移動し充電するという,各Control loopの主要ゴール達成のための動作を実現していることが確認できた.
続いて,提案手法に従って実装したコンポーネントの記述方法を分析した.まず実験結果か ら,清掃ロボットはごみ,あるいはバッテリーステーションを見つけ,その後目標オブジェク トへの移動を開始していることが確認できる.この目標物への到達に関する動作を実現するの は,図4.19のコンフィギュレーションにおけるApproachObjectコンポーネントである.図
図4.17.清掃ロボットに対する初期要求モデル(図3.18のゴールモデルに対してオペレーショ ンを定義したもの)
図4.18.実験で用いたフィールドの例
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
䝞䝑䝔䝸䞊⟶⌮䛻㛵䛩䜛 Control loop
Analyyyze& Decide
Approach
Object Act
┠ᶆ≀䜈䛾฿㐩䛻 㛵䛩䜛Control loop
Collect
Approach Dust
ApproachStation Act
Act
図4.19.実験1で用いたコンフィギュレーション
ډډډٻ
ڌڒڎڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ڟېێۏٻۄێٻہۊېۉڿٻڼۏٻڃڑڇڎڄډٻ ڌڒڏڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڨۊۑۀٻ
ڌڒڐڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻڨۊۑۀڿٻۏۊٻڃڑڇڑڄډٻ
ڌڒڑڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻ ڭۀێۏٻڽڼۏۏۀۍ۔ڕٻڍړٻ ڌڒڒڕٻٻٻٻٻڶۅڼۑڼڸٻڅڅڅٻڭۊڽۊۏٻۉۊۏۄھۀڿٻۏۃۀٻڽڼۏۏۀۍ۔ٻۇۀۑۀۇٻۄێٻۇۊےډٻ ڌڒړڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڜۋۋۍۊڼھۃڮۏڼۏۄۊۉٻ
ڌڒڔڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڜۋۋۍۊڼھۃڪڽۅۀھۏٻ ڌړڋڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڡۄۉڿٻ
ڌړڌڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ۏڼۍۂۀۏگ۔ۋۀڕٻڞۃڼۍۂۀڮۏڼۏۄۊۉٻ ڌړڍڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻ ڭۀێۏٻڽڼۏۏۀۍ۔ڕٻڍړٻ ڌړڎڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ڞۃڼۍۂۀڮۏڼۏۄۊۉٻۄێٻہۊېۉڿٻڼۏٻڃڏڇڎڄډٻ ڌړڏڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڨۊۑۀٻ
ڌړڐڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻڨۊۑۀڿٻۏۊٻڃڐڇڑڄډٻ ٻٻٻٻٻٻٻٻٻٻډډډٻ
ڌڔڎڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻڨۊۑۀڿٻۏۊٻڃڏڇڎڄډٻ
ڌڔڏڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻ ڭۀێۏٻڽڼۏۏۀۍ۔ڕٻړٻ ڌڔڐڕٻٻٻٻٻڶۅڼۑڼڸٻڜۍۍۄۑۀٻڼۏٻڃڏڇڎڄډٻ
ڌڔڑڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڞۃڼۍۂۀڝڼۏۏۀۍ۔ٻ ڌڔڒڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ڡۄۇۇٻڽڼۏۏۀۍ۔ٻډډډٻ
ڌڔړڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻ ڭۀێۏٻڽڼۏۏۀۍ۔ڕٻڌڋڋٻ ڌڔڔڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ڝڼۏۏۀۍ۔ٻۄێٻہېۇۇٻ
ڍڋڋڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڜۋۋۍۊڼھۃڟېێۏٻ ڍڋڌڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڜۋۋۍۊڼھۃڪڽۅۀھۏٻ ڍڋڍڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڡۄۉڿٻ
ڍڋڎڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ۏڼۍۂۀۏگ۔ۋۀڕٻڟېێۏٻ
ڍڋڏڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻ ڭۀێۏٻڽڼۏۏۀۍ۔ڕٻڌڋڋٻ ڍڋڐڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ڟېێۏٻۄێٻہۊېۉڿٻڼۏٻڃڏڇڍڄډٻ ڍڋڑڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڨۊۑۀٻ
ڍڋڒڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻڨۊۑۀڿٻۏۊٻڃڏڇڍڄډٻ ٻٻٻٻٻٻٻٻٻٻډډډٻ
ڍڒڏڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ڟېێۏٻۄێٻہۊېۉڿٻڼۏٻڃڑڇڎڄډٻ ڍڒڐڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڨۊۑۀٻ
ڍڒڑڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻڨۊۑۀڿٻۏۊٻڃڑڇڌڄډٻ
ڍڒڒڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻ ڭۀێۏٻڽڼۏۏۀۍ۔ڕٻڑڏٻ ڍڒړڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻڨۊۑۀڿٻۏۊٻڃڑڇڍڄډٻ
ڍڒڔڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻ ڭۀێۏٻڽڼۏۏۀۍ۔ڕٻڑڋٻ ڍړڋڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻڨۊۑۀڿٻۏۊٻڃڑڇڎڄډٻ
ڍړڌڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻ ڭۀێۏٻڽڼۏۏۀۍ۔ڕٻڐڑٻ ڍړڍڕٻٻٻٻٻڶۅڼۑڼڸٻڜۍۍۄۑۀٻڼۏٻڃڑڇڎڄډٻ
ڍړڎڕٻٻٻٻٻڶۅڼۑڼڸٻڞۃڼۉۂۀٻۏۊٻھۇۀڼۉۄۉۂٻۈۀۏۃۊڿډٻ ڍړڏڕٻٻٻٻٻڶۅڼۑڼڸٻڢۊۏٻڼۋۋۀڼۍڼۉھۀڕٻڧڤگگڠڭٻ
ڍړڐڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ڤڿۀۉۏۄہۄۀڿٻۊڽۅۀھۏٻۏ۔ۋۀٻڕڧڤگگڠڭٻ ڍړڑڕٻٻٻٻٻڶۅڼۑڼڸٻڟۀۏۀۍۈۄۉۀڿٻھۇۀڼۉۄۉۂٻۈۀۏۃۊڿڕٻڮےۀۀۋڟېێۏٻ ڍړڒڕٻٻٻٻٻڶۅڼۑڼڸٻڞۊۈۋۊۉۀۉۏڕٻڮےۀۀۋڟېێۏٻ
ڍړړڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ڮےۀۀۋٻڿېێۏٻڼۏٻڃڑڇڎڄډٻ
ڍړڔڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻ ڭۀێۏٻڽڼۏۏۀۍ۔ڕٻڐڍٻ ڍڔڋڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ڟېێۏٻڼۏٻڃڑڇڎڄٻےڼێٻێےۀۋۏډٻ ڍڔڌڕٻٻٻٻٻڶۅڼۑڼڸٻٻ ٻ ۇۊڼڿٻڼۈۊېۉۏڕٻڍڋڋٻ ڍڔڍڕٻٻٻٻٻڶۅڼۑڼڸٻڱۄۍۏېڼۇڭۊڽۊۏډۅڼۑڼڕٻڪۑۀۍۇۊڼڿڤۏۀۈێڠۍۍۊۍٻ
䛤䜏䛻
ྥ䛛䛳䛶⛣ື
䝞䝑䝔䝸䞊పୗ䜢᳨▱
䝇䝔䞊䝅䝵䞁䛻
ྥ䛛䛳䛶⛣ື
䛤䜏Ύᤲ䜢㛤
㟁
✚㍕㔞䜸䞊䝞䞊
図4.20.清掃ロボットの実行ログ(抜粋)
1: public void perform() { ...
23: if(find.mode == Mode.WAITING){
24: connectPorts(findPort, find.getProvidedPorts().get(0));
25: try {
26: findPort.put((Object)targetType);
27: } catch (PortException e) { 28: e.printStackTrace();
29: }
30: find.activate();
31: }
32: if(find.mode==Mode.ACHIEVED){
33: if(moveTo.mode == Mode.WAITING){
34: targetPoint = null;
35: if(findPort.isArrive()){
36: try {
37: targetPoint = (Point)findPort.get();
38: } catch (PortException e) {
39: e.printStackTrace();
40: }
41: }
42: connectPorts(moveToPort, moveTo.getProvidedPorts().get(0));
43: try {
44: moveToPort.put(targetPoint);
45: } catch (PortException e) { 46: e.printStackTrace();
47: }
48: moveTo.activate();
49: }
...
図4.21.イディオムの適用例(ApproachDustコンポーネントのperformメソッド)
4.21は,ApproachObjectコンポーネントのperformメソッドの一部を示したものである.こ
こでは周囲の物体を探索するActタイプコンポーネントであるFindコンポーネントのmode
値が“WAITING”,つまり待機中である場合には(23行目),Findコンポーネントに,探索
対象となる物体(ごみ,あるいはステーション)を指定し,Findコンポーネントをactivate メソッドを用いて活性化させている(30行目).また,32行目以降は,Findコンポーネント
が“ACHIEVED”となったことを判定して,移動を実現するActタイプコンポーネントである
MoveToコンポーネントをactivateメソッドを用いて活性化させている(48行目).これは,
本研究で導入するAnalysis& Decideタイプイディオムを適用した記述である.
一方,図4.22は,バッテリー管理に関するControl loopを構成するObserveBatteryLevelコ
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の並行動作が実現可能であることが確認できた.