| |||
第3章 UMLを使ってみよう (LEGO MINDSTORMS(TM)を動かす) |
第2章ではUMLの基礎について勉強しました。 ここでは、UMLを実際のアプリケーション開発に取り入れるためのステップとして、 UMLを利用した分析/設計/実装に取り組んでみましょう。 LEGO MINDSTORMS(TM)が実際に動くので面白いと思いますよ。とても小さいシステムなので、気楽に読んでみて下さい。 LEGO MINDSTORMS(TM)LEGO MINDSTORMS(TM)(レゴ・マインドストーム)は, LEGO 社(デンマーク)とMIT(マサチューセッツ工科大学)が共同開発した, レゴブロックを使ったロボット作成キットです. これを教材にしたロボット作成教室やロボット大会,さらには組み込みオブジェクト指向のトレーニングなども, 近年多く開催されています.(*) 脚注 (*) LEGO MINDSTORMS(TM)に関して詳しくは,
http://mindstorms.lego.com/japan/ などを参照してください. LEGO MINDSTORMS(TM)を制御UML開発の題材として、LEGO MINDSTORMS(TM)で作成した黒線に沿って走行する ロボットを制御するアプリケーションを作成しましょう。ロボットはトレーサーと名付けました。 RCX(LEGOを制御するユニット)上で動くアプリケーションの開発環境としては、 Java言語のleJOSやC++言語のlegOSなどがあります。 今回は、実際にleJOSを使用して、Windows上で開発します。 また、leJOSでは、赤外線通信にシリアルのIRタワーが必要となっていますので、 LEGO MINDSTORMS ROBOTICS INVENTION SYSTEM(TM) 1.5 をターゲットとします。 2.0には、USBのIRタワーが付属しています。 要求仕様RCXには3つの入力ポートと3つの出力ポートが用意されていて、 トレーサーでは1つの入力ポートと2つの出力ポートを使用します。 1つの入力ポートに光センサーが接続されているトレーサーは、光センサーによって黒線を検出し、 2つの出力ポートに接続されたモーターを制御することによって、黒線の左縁に沿って走行します。 ユーザがRUNボタンを押すと動き始め、ポート2に接続した光センサーの値が、黒を示す値であれば左ターン、 黒以外の値であれば右ターンを行い、それらを繰り返すことでガクガクしながら走行します。 モーターは、左タイヤ用をポートAに、右タイヤ用をポートCに接続します。 左ターンは左タイヤの停止と右タイヤの前進で行い、右ターンは逆の操作となります。 停止は、ON/OFFボタンで強制的に行います。 ロボットの製作については、LEGO MINDSTORMS ROBOTICS INVENTION SYSTEM(TM) 1.5に 付属のCONSTRUCTOPEDIAを参照して下さい。初めてでも40分くらいで完成するでしょう。 要求分析ユースケース図を中心に、ユースケース記述と状態図を用いて、要求を分析します。 要求が単純なため今回はこれらで十分でしょう。 ユースケース記述は、例外処理がある場合にはイベントフローで作成すると良いと思いますし、 同期を取る処理がある場合にはアクティビティー図を作成すると分析に役立つでしょう。
図1: ユースケース図
図2: ユースケース記述
┌────────────────────────────┐ │「線の左縁に沿って走る」ユースケース │ ├────────────────────────────┤ │1.黒線の上にいる場合、左ターンしながら黒線の外を目指す│ │2.黒線から外れた場合、右ターンしながら黒線を目指す │ │3.1-2を繰り返す │ │*.2から始まっても良い │ └────────────────────────────┘
システム分析クラス図、状態図、相互作用図を用いて、システムの概要をイメージできるようにブレークダウンします。
この段階では、実装する言語に依存しないので、わかりやすいように日本語で分析しています。
図4のように、ライン監視部クラスと行動制御部クラスでは、activeステレオタイプを付けることで、 それぞれを別スレッドで動かすことを明示していますが、どのようにスレッド化するかについては明示していません。 ライン監視部クラスが行動制御部クラスにライン状態を通知し、通知された状態によって、 行動制御部クラスから駆動制御部クラスに指示を出します。ライン監視部クラス、駆動制御部クラスは、 それぞれのハードウェアを操作するクラスを集約で保持します。単方向で表現できる関連は、 それが明確になった時点で単方向にしてしまいましょう。
図5のように、ライン監視分の状態図は、システム全体の状態図と似たものになります。 しかし、最初のライン状態を通知しないことには、行動制御部では動作することができませんので、 初期状態として、ライン上状態でもライン外状態でもないアイドル状態を作成しましょう。 起動時はアイドル状態となり、最初に検出した状態により、ライン上状態かライン外状態のどちらかに遷移することにします。 その後は、ライン上状態とライン外状態の間で、状態遷移を続けます。ある状態に遷移した時には、 その状態のエントリーを実行します。ライン上状態とライン外状態のエントリーでは、 自分の状態を聞き手(行動制御部)に通知しています。
|
図6: システム分析シーケンス図 |
|
設計クラス図、状態図、シーケンス図、コラボレーション図を、実装レベルにブレークダウンし、
パッケージ分割についても、パッケージ図で明確にします。このフェーズの成果物を見ることで、
誰が実装作業を行っても、全体の構成やインターフェースに違いが生じないレベルで作成しましょう。
図8: 設計パッケージ図
|
図9: 設計クラス図 |
|
図10: 設計LineMonitor状態図 |
|
図11: 設計シーケンス図 |
図12: 設計コラボレーション図 |
実装
設計モデルを見て実装しましょう。
コンパイルの方法やRCXへのソフトの転送は、この後のコラムに書いてありますので、そちらをご覧下さい。
この章のソースコードはこちらからダウンロードできます.→tracer.lzh まとめ今回は対象物が簡単だったこともあり、全ての図を作成していませんが、 実際の開発でも必要な図だけを作成すれば良いでしょう。 また、要求分析→システム分析→設計の3フェーズで開発しましたが、 対象物がより複雑である場合には、システム分析フェーズと設計フェーズの間に、 アーキテクチャ設計フェーズを加えてみると良いでしょう。 反対に、熟知した問題領域である場合には、設計レベルから入っても良いでしょう。 どちらにせよ、まずはUMLを取れ入れてみることが大事だと思います。 参考までに、この記事よりもさらに賢いトレーサーロボットを題材に、 「組込み・リアルタイム向オブジェクト指向 分析・設計トレーニング」が開催されています (*)。 実開発にUMLを取り入れることを考えている方には特に有用かもしれません. この記事が、みなさんが開発にUMLを取り入れる助けになれば嬉しく思います。 脚注(*) http://www.ogis-ri.co.jp/otc/training/kumikomi-start.html 謝辞UMLでの分析/設計についてご教授くださっただけでなく、 この記事を書くにあたってアドバイスをくださった(株)オージス総研の渡辺博之さんに心から感謝します。 leJOSでLEGOを動かそうWindows版を例に、インストールから実行までの手順を説明します。 作業は本当に簡単なので、LEGOを持っている方は、是非試してみることをお薦めします。 まずは、以下のサイトで、leJOS(2001.9.3現在の最新バージョンは1.0.2です)を入手しましょう。 http://lejos.sourceforge.net/ leJOSを任意のディレクトリに解凍したら、以下の設定を行います。
これらの設定が終わったら、leJOSのファームウェアをRCXに転送します。 シリアルポートに接続されたIRタワーの前にRCXを置いて、コマンドを実行しましょう。 % lejosfirmdl -f
続いて、クラスファイルを作成しましょう。 % lejosc */*.java コンパイルが全て通ったら、クラスファイルをRCXに転送しましょう。 転送コマンドの引数には、main関数のあるクラスを指定します。 % lejos Control/Tracer あとは、RCXのRUNボタンを押すと動き始めます。止めるときはOn/Offボタンを押してください
|