沼津高専 電子制御工学科
|
MIRS0104ソフトウェア詳細設計書
|
MIRS0104-SOFT-0001
|
|
改訂記録 |
版数 |
作成日 |
作成者 |
承認 |
改訂内容 |
A01 |
2002.5.21 |
前原 |
森元
|
初版 |
A02 |
2002.6.4 |
前原 |
森元
|
例外、関数名、試験について追記 |
ソフトウェア詳細設計書
目次
- 概要
- OS(RT-Linux)の概要
- 開発言語(C++)の概要
- 行動モードの詳細
- クラスの構成
- 各クラスの詳細
- 試験、調整
本ドキュメントは、MIRS0104基本設計書(MIRS0104-DSGN-1004)に規定されたシステムの動作規定、状態遷移を実現する各タスクの開発(コーディング、試験等)に必要な事項を述べる。
MIRS0104 ソフトウェアは、RT-Linux 上で動作するプログラム群で構成される。プログラムは、C++を用いて開発され、MIRS本体、赤外線センサ等の幾つかのクラスとヘッダ、そしてRTタスクドライバによって構成される。
本 MIRS0104 では、行動モードは MIRSクラス のメンバ変数による状態遷移により表現する。具体的なモードは、下で述べる。
超音波測定と、駆動系の制御は RT タスクとして駆動させ、赤外線センサ信号入力探知とLCD出力はデバイスドライバを用いて行う。白線センサもデバイスドライバを用いて行う予定である。デバイスドライバは標準 API のデバイスドライバを使用する。
主な内容は、本MIRS0104のMIRS0104-TECH-0012に記載する。
RT-Linuxは、標準のLinux環境でのプログラムの開発ができ、フラッシュメモリ上に収めることができるため、MIRSの開発に適したOSといえる。
概要にも書いたように、本 MIRS0104 は、C++を用いて開発する。C++は、機能的には C を拡張したものであり、その位置付けとしてはオブジェクト指向言語(OOPL)である。
MIRSにおいては、制御する対象は MIRS、超音波センサ等の具体的なものであり、それらをクラスに分割することが容易である。そして、そのほうが効率がよいと考えたため、C++を採用することにした。
本MIRSでは、モードを関数として分割する、という考え方で開発をすることはない。
- 待機モード
- 開始されるまで待機するモード。
- スイッチが押されると、開始直後に行うポスト探索モードに移行する。
- 開始直後に行うポスト探索モード
- 180度回転し、最短距離にあるポストの位置を取得するモード。
- 最短ポストが判明すると、そのポストに対して、ポストへ移動するモードに移行する。
- ポストへ移動するモード
- 移動すべきポストへ移動するモード。移動中は常に超音波を使って距離と角度を調整する。
- 適当な距離(*1)まで接近した時点で、ポストを周回するモードに移行する。
- ポストを周回するモード
- ポストから一定距離(*1)を保ちつつ、ポストが発信している赤外線を時計周りに探査するモード。
- 同時に、そのポストから最短距離にあるポストを探索するモードでもある。
- そのポストが取るべきならば、ポストを取得するモードに移る。そうでなければポストへ移動するモードに移行する。
- ポストを取得するモード
- 周回モードで取るべきだと判断されたポストを取得する。
- 取得後、ポストへ移動するモードへ移る。
例外
各種例外はそのモード内で対処する。
- 開始直後に行うポスト探索モード
- 初期視界にポストが見つからない。
- 原因: ポストの偏った配置のため。
- 対処: 超音波センサがコースの端に届く程度の距離(*2)まで前進し、再び開始直後の探索モードに入る。
- ポストへ移動するモード
- 予期せぬポストに衝突した。
- 原因: センサや駆動系の誤動作。
- 対処: 現在の座標と照会し、そのポストが何なのかということを確認する。
- ポストを周回するモード
- 周回しても赤外線を感知できなかった。
- 原因: 過去とっていたものを未取得と判断していた。 別のポストと勘違いし、このモードに入った。
- 対処: 正常状態に復帰することは不可能。少しでもポストを取得するために、次のポストに移動する。
- 周回中に別のポストに衝突した。
- 原因: 調整不足。
- 対処: 不可能。調整を綿密に行う。
- 次に移動すべきポストが見つからなかった
- 原因: ポストの偏った配置のため。
- 対処: 超音波センサがコースの端に届く程度の距離まで移動し、開始直後の探索モードに入る。
- 白線を踏んだ
- 原因: ポストとの距離が遠すぎる。調整不足。
- 対処: 内側に寄る。調節を綿密に行う
- ポストを取得するモード
- 取得としたはずのポストの赤外線が出つづけている。
- 原因: 角度がずれており、しっかりと押せなかった。
- 対処: 再び、ポストを周回するモード に移行する。
*1, *2: 調整段階にて、適正な値を探す。
従来はモジュールの構成を示す個所だが、MIRS0104ではC++を用いて、オブジェクト指向開発をするため、モジュール構成のかわりにクラス構成について解説する。ここではクラス構成を、UML図を用いて表す。
図において、◇は関連を表している。MIRS本体と各種センサの関連は MIRS 本体が各種センサを包含する、ということである。
- class MIRS
- MIRS本体クラス
- メンバ変数
- MIRS本体クラスは各種センサクラスを包含する。
- double m_x;
- MIRSのX座標を保持する変数。開始点は 0 とする。
- double m_y;
- MIRSのY座標を保持する変数。開始点を 0 とする。
- double m_direction;
- MIRSの方向を保持する変数。開始点から正面を 0 とする。左を角度:正として、右を角度:負として扱う。
- int m_state;
- MIRSのモードを保持する。現在は詳細に記した5つのモードに対応するように、0 - 4までの値を想定しているが、開発/設計段階で、まだ増える可能性はある。
- IRS irs_forward;
- IRS irs_right;
- 超音波センサクラスを包含する。
- TS ts;
- タッチセンサクラスを包含する。
- USS uss_left;
- USS uss_right;
- USS uss_forward_center;
- USS uss_forward_left;
- USS uss_forward_right;
- 超音波センサクラスを包含する。
- ENC enc_left;
- ENC enc_right;
- ロータリエンコーダクラスを包含する。
- WLS wls_forward_left;
- WLS wls_forward_right;
- WLS wls_behind_left;
- WLS wls_behind_right;
- 白線センサクラスを包含する。
- メンバ関数
- double get_xpos(void);
- double get_ypos(void);
- double get_direction(void);
- MIRSのx座標、y座標、方向を取得する。
- void do(void);
- 現在のモードに対応する動作を行う。
- class ENC
- ロータリエンコーダクラス)
- メンバ変数
- double m_speed;
- 車輪の回転速度を表す。
- double m_direction
- 車輪の回転方向を表す。
- メンバ関数
- void set_speed(double speed);
- 車輪の回転速度を設定する。
- void set_direction(double direction);
- 車輪回転方向を設定する。
- double get_speed(void);
- 車輪の回転速度を設定する。
- double get_direction(void);
- 車輪回転方向を設定する。
- void wheel(void);
- 車輪を回転させる。
- void stop(void);
- 車輪を停止させる。
- class IRS
- 赤外線センサクラス
- メンバ関数
- int get_irs(void);
- 現在入っている赤外線の番号を調べる。入っていない場合は IRS_NODATA(他のデータと被らない定数) を返す。
- class TS
- タッチセンサ
- メンバ関数
- int get_ts(void);
- 現在タッチセンサが押されているか調べる。
- class USS
- 超音波センサ
- メンバ関数
- double get_uss(void);
- 超音波を送信し、帰ってくるまでにかかった時間を返す。
- class WLS
- 白線センサ
- 今後の状況により、決定する。
- class Post
- ポスト
- メンバ変数
- int m_state;
- 取得/未取得の状態を保持する。
- int m_id
- ポストの識別番号を保持する。
- double m_x
- ポストのX座標を保持する。
- double m_y
- ポストのY座標を保持する。
- メンバ関数
- void push_switch(void);
- MIRSがポストを取得する際に呼ぶ。
- void reset(void);
- 取得された状態になっているポストを、未取得状態に戻す
- double get_xpos(void);
- double get_ypos(void);
- ポストのx座標、y座標を取得する。
以下に、ソフトウェアの面から見た必要な試験や調整について列挙する。開発が進む間に不安点や疑問点が出てきた場合、それについても試験、調整を行う。
- 各クラスが正常に動作していることの試験。
- 全体として正常に動作していることの試験。
- 回転しながら超音波を発信したとき、どれくらいの精度で距離を感知できるかの試験。この試験の結果が宜しくない場合、ポスト取得の手順が変更される可能性がある。
- 既定に基づいたポスト間距離最小の状態のポストを旋回できる距離を見つける調整。
- "ポストが奧に偏っている"例外発生時、どれくらい前進すればよいのかを見つける調整。
- 実際に動かし、どのようなトラブルが発生するか調べる試験。